ZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0Ly5jbGFzc3BhdGggYi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTFjOGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC8ucHJvamVjdCBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzhhOGEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+aWUud29tYmF0LmpiZGlmZi50ZXN0PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3OGY5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jVHVlIERlYyAxOCAxMTo0NDoxNiBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjNTA4MmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVGh1IE5vdiAwMSAxNDoyNjowMiBDRVQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzAyZmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogSkJEaWZmIFRlc3QgUGx1Zy1pbgotQnVuZGxlLVN5bWJvbGljTmFtZTogaWUud29tYmF0LmpiZGlmZi50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogMC4xLjAuMQotQnVuZGxlLUFjdGl2YXRvcjogaWUud29tYmF0LmpiZGlmZi50ZXN0LkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMSwKLSBKMlNFLTEuNAotUmVxdWlyZS1CdW5kbGU6IG9yZy5qdW5pdCwKLSBpZS53b21iYXQuamJkaWZmCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRkMmU0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3NyYy9pZS93b21iYXQvamJkaWZmL3Rlc3QvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC9zcmMvaWUvd29tYmF0L2piZGlmZi90ZXN0L0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDBiYjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3NyYy9pZS93b21iYXQvamJkaWZmL3Rlc3QvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGllLndvbWJhdC5qYmRpZmYudGVzdDsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBjb250ZXh0Ci0JICovCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3Qvc3JjL2llL3dvbWJhdC9qYmRpZmYvdGVzdC9EaWZmUGF0Y2hUZXN0LmphdmEgYi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC9zcmMvaWUvd29tYmF0L2piZGlmZi90ZXN0L0RpZmZQYXRjaFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY1ZTdkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC9zcmMvaWUvd29tYmF0L2piZGlmZi90ZXN0L0RpZmZQYXRjaFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIGllLndvbWJhdC5qYmRpZmYudGVzdDsKLQotaW1wb3J0IGllLndvbWJhdC5qYmRpZmYuSkJEaWZmOwotaW1wb3J0IGllLndvbWJhdC5qYmRpZmYuSkJQYXRjaDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIERpZmZQYXRjaFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYmVuY2goIm51bGwuZGF0YSIsICJudWxsLmRhdGEiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotCQliZW5jaCgib25lLmRhdGEiLCAib25lLmRhdGEiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lSHVuZHJlZERhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYmVuY2goIm9uZWh1bmRyZWQuZGF0YSIsICJvbmVodW5kcmVkLmRhdGEiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T25lSHVuZHJlZFhEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJlbmNoKCJvbmVodW5kcmVkLmRhdGEiLCAib25laHVuZHJlZFguZGF0YSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmVYSHVuZHJlZFhEYXRhKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJlbmNoKCJvbmVodW5kcmVkLmRhdGEiLCAib25lWGh1bmRyZWRYLmRhdGEiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGRlQ29yZUphcigpIHRocm93cyBFeGNlcHRpb24gewotCQliZW5jaCgib3JnLmVjbGlwc2UucGRlLmNvcmVfMy4yLmphciIsICJvcmcuZWNsaXBzZS5wZGUuY29yZV8zLjMuamFyIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVjbGlwc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYmVuY2goImVjbGlwc2UtMy4yLmV4ZSIsICJlY2xpcHNlLTMuMy5leGUiKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmVuY2goU3RyaW5nIHJlc291cmNlMSwgU3RyaW5nIHJlc291cmNlMikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0KLQkJYnl0ZVtdIG9sZERhdGEgPSBnZXRUZXN0RGF0YShyZXNvdXJjZTEpOwotCQlieXRlW10gbmV3RGF0YSA9IGdldFRlc3REYXRhKHJlc291cmNlMik7Ci0KLQkJU3lzdGVtLm91dC5wcmludGxuKHJlc291cmNlMSArICIoIiArIChvbGREYXRhLmxlbmd0aCAvIDEwMjQpCi0JCQkJKyAiIGtiKSAtPiAiICsgcmVzb3VyY2UyICsgIigiICsgKG5ld0RhdGEubGVuZ3RoIC8gMTAyNCkKLQkJCQkrICIga2IpIik7Ci0KLQkJZGlmZkFuZFBhdGNoSkJEaWZmKG9sZERhdGEsIG5ld0RhdGEpOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc291cmNlMQotCSAqIEBwYXJhbSByZXNvdXJjZTIKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRpZmZBbmRQYXRjaEpCRGlmZihieXRlW10gb2xkRGF0YSwgYnl0ZVtdIG5ld0RhdGEpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCXRyeSB7Ci0KLQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQkJYnl0ZVtdIGRpZmYgPSBKQkRpZmYuYnNkaWZmKG9sZERhdGEsIG9sZERhdGEubGVuZ3RoLCBuZXdEYXRhLAotCQkJCQluZXdEYXRhLmxlbmd0aCk7Ci0KLQkJCWxvbmcgZGlmZkVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCQlieXRlW10gcGF0Y2ggPSBKQlBhdGNoLmJzcGF0Y2gob2xkRGF0YSwgb2xkRGF0YS5sZW5ndGgsIGRpZmYpOwotCi0JCQlsb25nIHBhdGNoRW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSkJEaWZmOiBTaXplPSAiICsgZGlmZi5sZW5ndGggKyAiIGIgKCIKLQkJCQkJKyBkaWZmLmxlbmd0aCAvIDEwMjQgKyAiIGtiKSwgRGlmZmluZyAiICsgKGRpZmZFbmQgLSBzdGFydCkKLQkJCQkJKyAiIG1zLCBQYXRjaGluZzogIiArIChwYXRjaEVuZCAtIGRpZmZFbmQpICsgIiBtcyIpOwotCi0JCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3RGF0YSwgcGF0Y2gpKTsKLQotCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIHJlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkpCRGlmZjogZXJyb3I6ICIgKyByZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGdldFRlc3REYXRhKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKEFjdGl2YXRvci5nZXRDb250ZXh0KCkKLQkJCQkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoInRlc3REYXRhLyIgKyBuYW1lKS5vcGVuU3RyZWFtKCkpOwotCQlpbnQgcjsKLQkJd2hpbGUgKChyID0gaW5wdXQucmVhZCgpKSAhPSAtMSkgewotCQkJb3V0LndyaXRlKHIpOwotCQl9Ci0JCWlucHV0LmNsb3NlKCk7Ci0JCW91dC5jbG9zZSgpOwotCQlyZXR1cm4gb3V0LnRvQnl0ZUFycmF5KCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL2VjbGlwc2UtMy4yLmV4ZSBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL2VjbGlwc2UtMy4yLmV4ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyNmQxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9lY2xpcHNlLTMuMi5leGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9lY2xpcHNlLTMuMy5leGUgYi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9lY2xpcHNlLTMuMy5leGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1Y2Q4ZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvZWNsaXBzZS0zLjMuZXhlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvbnVsbC5kYXRhIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvbnVsbC5kYXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL251bGwuZGF0YQorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9vbmUuZGF0YSBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29uZS5kYXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmE2MDUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29uZS5kYXRhCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotMQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29uZVhodW5kcmVkWC5kYXRhIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb25lWGh1bmRyZWRYLmRhdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMTA3N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb25lWGh1bmRyZWRYLmRhdGEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0wMTIzNDU2Nzg5WDAxMjM0NTY3ODlYMDEyMzQ1Njc4OVgwMTIzNDU2Nzg5WDAxMjM0NTY3ODlYMDEyMzQ1Njc4OVgwMTIzNDU2Nzg5WDAxMjM0NTY3ODlYMDEyMzQ1Njc4OVgwMTIzNDU2Nzg5WApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29uZWh1bmRyZWQuZGF0YSBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29uZWh1bmRyZWQuZGF0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkNGU5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9vbmVodW5kcmVkLmRhdGEKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0wMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb25laHVuZHJlZFguZGF0YSBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29uZWh1bmRyZWRYLmRhdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOTZiZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb25laHVuZHJlZFguZGF0YQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MFgyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9vcmcuZWNsaXBzZS5wZGUuY29yZV8zLjIuamFyIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb3JnLmVjbGlwc2UucGRlLmNvcmVfMy4yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc3MmY4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYudGVzdC90ZXN0RGF0YS9vcmcuZWNsaXBzZS5wZGUuY29yZV8zLjIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb3JnLmVjbGlwc2UucGRlLmNvcmVfMy4zLmphciBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0L3Rlc3REYXRhL29yZy5lY2xpcHNlLnBkZS5jb3JlXzMuMy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OGVhNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QvdGVzdERhdGEvb3JnLmVjbGlwc2UucGRlLmNvcmVfMy4zLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MWM4ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvLnByb2plY3QgYi9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZDQ0NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+aWUud29tYmF0LmpiZGlmZjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ2MjMzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jV2VkIE5vdiAxNCAxMjo0OToxNiBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5ZDI3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotI1R1ZSBEZWMgMTggMTE6NDM6MTcgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MGUxOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1RodSBOb3YgMDEgMTQ6MDA6NTMgQ0VUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Yzc4OTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IEpiZGlmZiBQbHVnLWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBpZS53b21iYXQuamJkaWZmCi1CdW5kbGUtVmVyc2lvbjogMC4xLjAuMQotSW1wb3J0LVBhY2thZ2U6IG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogaWUud29tYmF0LmpiZGlmZgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjEvRm91bmRhdGlvbi0xLjEsCi0gSjJTRS0xLjQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9hYm91dC5odG1sIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMDljMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLQotICAKLSAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KLQotICAKLSAgPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLQotCi08Ym9keSBsYW5nPSJFTi1VUyI+Ci0KLTxoMz5BYm91dCBUaGlzIENvbnRlbnQ8L2gzPgotCi08cD5KdW5lIDUsIDIwMDY8L3A+Ci0KLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgiQ29udGVudCIpLiAgCi0JCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi0JCWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi0JCWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotCQlhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvciZyc3F1bztzIGxpY2Vuc2UgCi0JCXRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotCQlpbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotCQlhbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotCi08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgCi0JCWRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIAotCQlmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJnJzcXVvO3MgbGljZW5zZSBmb3IgCi0JCXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxlbT4KLTxoND5pZS53b21iYXQuamJkaWZmJm5ic3A7PC9oND4KLQotPHA+VGhpcyBsaWJyYXJ5IHZlcnNpb24gaXMgYmFzZWQgb24gSkJEaWZmICg8YSBocmVmPSJodHRwOi8vd3d3LndvbWJhdC5pZS9zb2Z0d2FyZS9qYmRpZmYvZG93bmxvYWRzLyI+aHR0cDovL3d3dy53b21iYXQuaWUvc29mdHdhcmUvamJkaWZmL2Rvd25sb2Fkcy88L2E+KSB3aGljaCBpcyBhbHNvIGF2YWlsYWJsZSB1bmRlciB0aGUgT1NJIEFwcHJvdmVkIDo6IEJTRCBMaWNlbnNlIChvcmlnaW5hbCkgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLmh0bWw8L2E+PGJyIC8+Ci0KLTwvcD4KLQotPC9lbT4KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZDJlNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL0pCRGlmZi5qYXZhIGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL0pCRGlmZi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzBjNjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9zcmMvaWUvd29tYmF0L2piZGlmZi9KQkRpZmYuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCBKb2UgRGVzYm9ubmV0LCAoamRlc2Jvbm5ldEBnbWFpbC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSA8b3JnYW5pemF0aW9uPiBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSA8Y29weXJpZ2h0IGhvbGRlcj4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxjb3B5cmlnaHQgaG9sZGVyPiBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotcGFja2FnZSBpZS53b21iYXQuamJkaWZmOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogSmF2YSBCaW5hcnkgRGlmZiB1dGlsaXR5LiBCYXNlZCBvbiBic2RpZmYgKHY0LjIpIGJ5IENvbGluIFBlcmNpdmFsIChzZWUKLSAqIGh0dHA6Ly93d3cuZGFlbW9ub2xvZ3kubmV0L2JzZGlmZi8gKSBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgQlNEIGxpY2Vuc2UuCi0gKiAKLSAqIDxwPgotICogUnVubmluZyB0aGlzIG9uIGxhcmdlIGZpbGVzIHdpbGwgcHJvYmFibHkgcmVxdWlyZSBhbiBpbmNyZWFzZSBvZiB0aGUgZGVmYXVsdAotICogbWF4aW11bSBoZWFwIHNpemUgKHVzZSBqYXZhIC1YbXgyMDBtKQotICogPC9wPgotICogCi0gKiBAYXV0aG9yIEpvZSBEZXNib25uZXQsIGpvZUBnYWx3YXkubmV0Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEpCRGlmZiB7Ci0KLQkvLyBKQkRpZmYgZXh0ZW5zaW9ucyBieSBTdGVmYW4uTGllYmlnQGNvbXBlb3BsZS5kZToKLQkvLwotCS8vIC0gdXNlcyBHWklQIGNvbXByZXNzb3IgdG8gY29tcHJlc3MgQUxMIG9mIHRoZSBibG9ja3MgKGN0cmwsZGlmZixleHRyYSkuCi0JLy8gLSBhZGRlZCBpbnRlcmZhY2VzIHRoYXQgYWxsb3dzIHVzaW5nIG9mIEpCRGlmZiB3aXRoIHN0cmVhbXMgYW5kIGJ5dGUKLQkvLyBhcnJheXMuCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICJqYmRpZmYtMC4xLjAuMSI7Ci0KLQkvLyBUaGlzIGlzILRqYmRpZmY0MLQuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIE1BR0lDX0JZVEVTID0gbmV3IGJ5dGVbXSB7IDB4NmEsIDB4NjIsIDB4NjQsCi0JCQkweDY5LCAweDY2LCAweDY2LCAweDM0LCAweDMwIH07Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyB2b2lkIHNwbGl0KGludFtdIEksIGludFtdIFYsIGludCBzdGFydCwgaW50IGxlbiwgaW50IGgpIHsKLQotCQlpbnQgaSwgaiwgaywgeCwgdG1wLCBqaiwga2s7Ci0KLQkJaWYgKGxlbiA8IDE2KSB7Ci0JCQlmb3IgKGsgPSBzdGFydDsgayA8IHN0YXJ0ICsgbGVuOyBrICs9IGopIHsKLQkJCQlqID0gMTsKLQkJCQl4ID0gVltJW2tdICsgaF07Ci0JCQkJZm9yIChpID0gMTsgayArIGkgPCBzdGFydCArIGxlbjsgaSsrKSB7Ci0JCQkJCWlmIChWW0lbayArIGldICsgaF0gPCB4KSB7Ci0JCQkJCQl4ID0gVltJW2sgKyBpXSArIGhdOwotCQkJCQkJaiA9IDA7Ci0JCQkJCX0KLQotCQkJCQlpZiAoVltJW2sgKyBpXSArIGhdID09IHgpIHsKLQkJCQkJCXRtcCA9IElbayArIGpdOwotCQkJCQkJSVtrICsgal0gPSBJW2sgKyBpXTsKLQkJCQkJCUlbayArIGldID0gdG1wOwotCQkJCQkJaisrOwotCQkJCQl9Ci0KLQkJCQl9Ci0KLQkJCQlmb3IgKGkgPSAwOyBpIDwgajsgaSsrKSB7Ci0JCQkJCVZbSVtrICsgaV1dID0gayArIGogLSAxOwotCQkJCX0KLQkJCQlpZiAoaiA9PSAxKSB7Ci0JCQkJCUlba10gPSAtMTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybjsKLQkJfQotCi0JCXggPSBWW0lbc3RhcnQgKyBsZW4gLyAyXSArIGhdOwotCQlqaiA9IDA7Ci0JCWtrID0gMDsKLQkJZm9yIChpID0gc3RhcnQ7IGkgPCBzdGFydCArIGxlbjsgaSsrKSB7Ci0JCQlpZiAoVltJW2ldICsgaF0gPCB4KSB7Ci0JCQkJamorKzsKLQkJCX0KLQkJCWlmIChWW0lbaV0gKyBoXSA9PSB4KSB7Ci0JCQkJa2srKzsKLQkJCX0KLQkJfQotCi0JCWpqICs9IHN0YXJ0OwotCQlrayArPSBqajsKLQotCQlpID0gc3RhcnQ7Ci0JCWogPSAwOwotCQlrID0gMDsKLQkJd2hpbGUgKGkgPCBqaikgewotCQkJaWYgKFZbSVtpXSArIGhdIDwgeCkgewotCQkJCWkrKzsKLQkJCX0gZWxzZSBpZiAoVltJW2ldICsgaF0gPT0geCkgewotCQkJCXRtcCA9IElbaV07Ci0JCQkJSVtpXSA9IElbamogKyBqXTsKLQkJCQlJW2pqICsgal0gPSB0bXA7Ci0JCQkJaisrOwotCQkJfSBlbHNlIHsKLQkJCQl0bXAgPSBJW2ldOwotCQkJCUlbaV0gPSBJW2trICsga107Ci0JCQkJSVtrayArIGtdID0gdG1wOwotCQkJCWsrKzsKLQkJCX0KLQotCQl9Ci0KLQkJd2hpbGUgKGpqICsgaiA8IGtrKSB7Ci0JCQlpZiAoVltJW2pqICsgal0gKyBoXSA9PSB4KSB7Ci0JCQkJaisrOwotCQkJfSBlbHNlIHsKLQkJCQl0bXAgPSBJW2pqICsgal07Ci0JCQkJSVtqaiArIGpdID0gSVtrayArIGtdOwotCQkJCUlba2sgKyBrXSA9IHRtcDsKLQkJCQlrKys7Ci0JCQl9Ci0KLQkJfQotCi0JCWlmIChqaiA+IHN0YXJ0KSB7Ci0JCQlzcGxpdChJLCBWLCBzdGFydCwgamogLSBzdGFydCwgaCk7Ci0JCX0KLQotCQlmb3IgKGkgPSAwOyBpIDwga2sgLSBqajsgaSsrKSB7Ci0JCQlWW0lbamogKyBpXV0gPSBrayAtIDE7Ci0JCX0KLQotCQlpZiAoamogPT0ga2sgLSAxKSB7Ci0JCQlJW2pqXSA9IC0xOwotCQl9Ci0KLQkJaWYgKHN0YXJ0ICsgbGVuID4ga2spIHsKLQkJCXNwbGl0KEksIFYsIGtrLCBzdGFydCArIGxlbiAtIGtrLCBoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogRmFzdCBzdWZmaXggc3BvcnRpbmcuIExhcnNzb24gYW5kIFNhZGFrYW5lJ3MgcXN1ZnNvcnQgYWxnb3JpdGhtLiBTZWUKLQkgKiBodHRwOi8vd3d3LmNzLmx0aC5zZS9SZXNlYXJjaC9BbGdvcml0aG1zL1BhcGVycy9qZXNwZXI1LnBzCi0JICogCi0JICogQHBhcmFtIEkKLQkgKiBAcGFyYW0gVgotCSAqIEBwYXJhbSBvbGRCdWYKLQkgKiBAcGFyYW0gb2xkc2l6ZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgcXN1ZnNvcnQoaW50W10gSSwgaW50W10gViwgYnl0ZVtdIG9sZEJ1ZiwgaW50IG9sZHNpemUpIHsKLQotCQkvLyBpbnQgb2xkc2l6ZSA9IG9sZEJ1Zi5sZW5ndGg7Ci0JCWludFtdIGJ1Y2tldHMgPSBuZXcgaW50WzI1Nl07Ci0KLQkJLy8gTm8gbmVlZCB0byBkbyB0aGF0IGluIEphdmEuCi0JCS8vIGZvciAoIGludCBpID0gMDsgaSA8IDI1NjsgaSsrICkgewotCQkvLyBidWNrZXRzW2ldID0gMDsKLQkJLy8gfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkc2l6ZTsgaSsrKSB7Ci0JCQlidWNrZXRzW29sZEJ1ZltpXSAmIDB4ZmZdKys7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMTsgaSA8IDI1NjsgaSsrKSB7Ci0JCQlidWNrZXRzW2ldICs9IGJ1Y2tldHNbaSAtIDFdOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDI1NTsgaSA+IDA7IGktLSkgewotCQkJYnVja2V0c1tpXSA9IGJ1Y2tldHNbaSAtIDFdOwotCQl9Ci0KLQkJYnVja2V0c1swXSA9IDA7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRzaXplOyBpKyspIHsKLQkJCUlbKytidWNrZXRzW29sZEJ1ZltpXSAmIDB4ZmZdXSA9IGk7Ci0JCX0KLQotCQlJWzBdID0gb2xkc2l6ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRzaXplOyBpKyspIHsKLQkJCVZbaV0gPSBidWNrZXRzW29sZEJ1ZltpXSAmIDB4ZmZdOwotCQl9Ci0JCVZbb2xkc2l6ZV0gPSAwOwotCi0JCWZvciAoaW50IGkgPSAxOyBpIDwgMjU2OyBpKyspIHsKLQkJCWlmIChidWNrZXRzW2ldID09IGJ1Y2tldHNbaSAtIDFdICsgMSkgewotCQkJCUlbYnVja2V0c1tpXV0gPSAtMTsKLQkJCX0KLQkJfQotCi0JCUlbMF0gPSAtMTsKLQotCQlmb3IgKGludCBoID0gMTsgSVswXSAhPSAtKG9sZHNpemUgKyAxKTsgaCArPSBoKSB7Ci0JCQlpbnQgbGVuID0gMDsKLQkJCWludCBpOwotCQkJZm9yIChpID0gMDsgaSA8IG9sZHNpemUgKyAxOykgewotCQkJCWlmIChJW2ldIDwgMCkgewotCQkJCQlsZW4gLT0gSVtpXTsKLQkJCQkJaSAtPSBJW2ldOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGlmKGxlbikgSVtpLWxlbl09LWxlbjsKLQkJCQkJaWYgKGxlbiAhPSAwKSB7Ci0JCQkJCQlJW2kgLSBsZW5dID0gLWxlbjsKLQkJCQkJfQotCQkJCQlsZW4gPSBWW0lbaV1dICsgMSAtIGk7Ci0JCQkJCXNwbGl0KEksIFYsIGksIGxlbiwgaCk7Ci0JCQkJCWkgKz0gbGVuOwotCQkJCQlsZW4gPSAwOwotCQkJCX0KLQotCQkJfQotCi0JCQlpZiAobGVuICE9IDApIHsKLQkJCQlJW2kgLSBsZW5dID0gLWxlbjsKLQkJCX0KLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkc2l6ZSArIDE7IGkrKykgewotCQkJSVtWW2ldXSA9IGk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbWF0Y2ggaW4gb2xkQnVmIChzdGFydGluZyBhdCBvZmZzZXQKLQkgKiBvbGRPZmZzZXQpIGFuZCBuZXdCdWYgKHN0YXJ0aW5nIGF0IG9mZnNldCBuZXdPZmZzZXQpLgotCSAqIAotCSAqIEBwYXJhbSBvbGRCdWYKLQkgKiBAcGFyYW0gb2xkT2Zmc2V0Ci0JICogQHBhcmFtIG5ld0J1ZgotCSAqIEBwYXJhbSBuZXdPZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IG1hdGNobGVuKGJ5dGVbXSBvbGRCdWYsIGludCBvbGRTaXplLAotCQkJaW50IG9sZE9mZnNldCwgYnl0ZVtdIG5ld0J1ZiwgaW50IG5ld1NpemUsIGludCBuZXdPZmZzZXQpIHsKLQkJLy8gaW50IGVuZCA9IE1hdGgKLQkJLy8gLm1pbihvbGRCdWYubGVuZ3RoIC0gb2xkT2Zmc2V0LCBuZXdCdWYubGVuZ3RoIC0gbmV3T2Zmc2V0KTsKLQkJaW50IGVuZCA9IE1hdGgubWluKG9sZFNpemUgLSBvbGRPZmZzZXQsIG5ld1NpemUgLSBuZXdPZmZzZXQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpZiAob2xkQnVmW29sZE9mZnNldCArIGldICE9IG5ld0J1ZltuZXdPZmZzZXQgKyBpXSkgewotCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IHNlYXJjaChpbnRbXSBJLCBieXRlW10gb2xkQnVmLCBpbnQgb2xkU2l6ZSwKLQkJCWJ5dGVbXSBuZXdCdWYsIGludCBuZXdTaXplLCBpbnQgbmV3QnVmT2Zmc2V0LCBpbnQgc3RhcnQsIGludCBlbmQsCi0JCQlJbnRCeVJlZiBwb3MpIHsKLQotCQlpZiAoZW5kIC0gc3RhcnQgPCAyKSB7Ci0JCQlpbnQgeCA9IG1hdGNobGVuKG9sZEJ1Ziwgb2xkU2l6ZSwgSVtzdGFydF0sIG5ld0J1ZiwgbmV3U2l6ZSwKLQkJCQkJbmV3QnVmT2Zmc2V0KTsKLQkJCWludCB5ID0gbWF0Y2hsZW4ob2xkQnVmLCBvbGRTaXplLCBJW2VuZF0sIG5ld0J1ZiwgbmV3U2l6ZSwKLQkJCQkJbmV3QnVmT2Zmc2V0KTsKLQotCQkJaWYgKHggPiB5KSB7Ci0JCQkJcG9zLnZhbHVlID0gSVtzdGFydF07Ci0JCQkJcmV0dXJuIHg7Ci0JCQl9IGVsc2UgewotCQkJCXBvcy52YWx1ZSA9IElbZW5kXTsKLQkJCQlyZXR1cm4geTsKLQkJCX0KLQkJfQotCi0JCWludCB4ID0gc3RhcnQgKyAoZW5kIC0gc3RhcnQpIC8gMjsKLQkJaWYgKFV0aWwubWVtY21wKG9sZEJ1Ziwgb2xkU2l6ZSwgSVt4XSwgbmV3QnVmLCBuZXdTaXplLCBuZXdCdWZPZmZzZXQpIDwgMCkgewotCQkJcmV0dXJuIHNlYXJjaChJLCBvbGRCdWYsIG9sZFNpemUsIG5ld0J1ZiwgbmV3U2l6ZSwgbmV3QnVmT2Zmc2V0LCB4LAotCQkJCQllbmQsIHBvcyk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gc2VhcmNoKEksIG9sZEJ1Ziwgb2xkU2l6ZSwgbmV3QnVmLCBuZXdTaXplLCBuZXdCdWZPZmZzZXQsCi0JCQkJCXN0YXJ0LCB4LCBwb3MpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkRmlsZQotCSAqIEBwYXJhbSBuZXdGaWxlCi0JICogQHBhcmFtIGRpZmZGaWxlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBic2RpZmYoRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUsIEZpbGUgZGlmZkZpbGUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBvbGRJbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0ob2xkRmlsZSkpOwotCQlJbnB1dFN0cmVhbSBuZXdJbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0obmV3RmlsZSkpOwotCQlPdXRwdXRTdHJlYW0gZGlmZk91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRpZmZGaWxlKTsKLQotCQlieXRlW10gZGlmZkJ5dGVzID0gYnNkaWZmKG9sZElucHV0U3RyZWFtLCAoaW50KSBvbGRGaWxlLmxlbmd0aCgpLAotCQkJCW5ld0lucHV0U3RyZWFtLCAoaW50KSBuZXdGaWxlLmxlbmd0aCgpKTsKLQotCQlkaWZmT3V0cHV0U3RyZWFtLndyaXRlKGRpZmZCeXRlcyk7Ci0JCWRpZmZPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkSW5wdXRTdHJlYW0KLQkgKiBAcGFyYW0gb2xkc2l6ZQotCSAqIEBwYXJhbSBuZXdJbnB1dFN0cmVhbQotCSAqIEBwYXJhbSBuZXdzaXplCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBic2RpZmYoSW5wdXRTdHJlYW0gb2xkSW5wdXRTdHJlYW0sIGludCBvbGRzaXplLAotCQkJSW5wdXRTdHJlYW0gbmV3SW5wdXRTdHJlYW0sIGludCBuZXdzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWJ5dGVbXSBvbGRCdWYgPSBuZXcgYnl0ZVtvbGRzaXplXTsKLQotCQlVdGlsLnJlYWRGcm9tU3RyZWFtKG9sZElucHV0U3RyZWFtLCBvbGRCdWYsIDAsIG9sZHNpemUpOwotCQlvbGRJbnB1dFN0cmVhbS5jbG9zZSgpOwotCi0JCWJ5dGVbXSBuZXdCdWYgPSBuZXcgYnl0ZVtuZXdzaXplXTsKLQkJVXRpbC5yZWFkRnJvbVN0cmVhbShuZXdJbnB1dFN0cmVhbSwgbmV3QnVmLCAwLCBuZXdzaXplKTsKLQkJbmV3SW5wdXRTdHJlYW0uY2xvc2UoKTsKLQotCQlyZXR1cm4gYnNkaWZmKG9sZEJ1Ziwgb2xkc2l6ZSwgbmV3QnVmLCBuZXdzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkQnVmCi0JICogQHBhcmFtIG9sZHNpemUKLQkgKiBAcGFyYW0gbmV3QnVmCi0JICogQHBhcmFtIG5ld3NpemUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGJzZGlmZihieXRlW10gb2xkQnVmLCBpbnQgb2xkc2l6ZSwgYnl0ZVtdIG5ld0J1ZiwKLQkJCWludCBuZXdzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWludFtdIEkgPSBuZXcgaW50W29sZHNpemUgKyAxXTsKLQkJcXN1ZnNvcnQoSSwgbmV3IGludFtvbGRzaXplICsgMV0sIG9sZEJ1Ziwgb2xkc2l6ZSk7Ci0KLQkJLy8gZGlmZiBibG9jawotCQlpbnQgZGJsZW4gPSAwOwotCQlieXRlW10gZGIgPSBuZXcgYnl0ZVtuZXdzaXplXTsKLQotCQkvLyBleHRyYSBibG9jawotCQlpbnQgZWJsZW4gPSAwOwotCQlieXRlW10gZWIgPSBuZXcgYnl0ZVtuZXdzaXplXTsKLQotCQkvKgotCQkgKiBEaWZmIGZpbGUgaXMgY29tcG9zZWQgYXMgZm9sbG93czoKLQkJICogCi0JCSAqIEhlYWRlciAoMzIgYnl0ZXMpIERhdGEgKGZyb20gb2Zmc2V0IDMyIHRvIGVuZCBvZiBmaWxlKQotCQkgKiAKLQkJICogSGVhZGVyOiBPZmZzZXQgMCwgbGVuZ3RoIDggYnl0ZXM6IGZpbGUgbWFnaWMgImpiZGlmZjQwIiBPZmZzZXQgOCwKLQkJICogbGVuZ3RoIDggYnl0ZXM6IGxlbmd0aCBvZiBjb21wcmVzc2VkIGN0cmwgYmxvY2sgT2Zmc2V0IDE2LCBsZW5ndGggOAotCQkgKiBieXRlczogbGVuZ3RoIG9mIGNvbXByZXNzZWQgZGlmZiBibG9jayBPZmZzZXQgMjQsIGxlbmd0aCA4IGJ5dGVzOgotCQkgKiBsZW5ndGggb2YgbmV3IGZpbGUKLQkJICogCi0JCSAqIERhdGE6IDMyIChsZW5ndGggY3RybEJsb2NrTGVuKTogY3RybEJsb2NrIChiemlwMikgMzIrY3RybEJsb2NrTGVuCi0JCSAqIChsZW5ndGggZGlmZkJsb2NrTGVuKTogZGlmZkJsb2NrIChiemlwMikgMzIrY3RybEJsb2NrTGVuK2RpZmZCbG9ja0xlbgotCQkgKiAodG8gZW5kIG9mIGZpbGUpOiBleHRyYUJsb2NrIChiemlwMikKLQkJICogCi0JCSAqIGN0cmxCbG9jayBjb21wcmlzZXMgYSBzZXQgb2YgcmVjb3JkcywgZWFjaCByZWNvcmQgMTIgYnl0ZXMuIEEgcmVjb3JkCi0JCSAqIGNvbXByaXNlcyAzIHggMzIgYml0IGludGVnZXJzLiBUaGUgY3RybEJsb2NrIGlzIG5vdCBjb21wcmVzc2VkLgotCQkgKi8KLQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZU91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRGF0YU91dHB1dFN0cmVhbSBkaWZmT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYnl0ZU91dCk7Ci0KLQkJLyoKLQkJICogV3JpdGUgYXMgbXVjaCBvZiBoZWFkZXIgYXMgd2UgaGF2ZSBub3cuIFNpemUgb2YgY3RybEJsb2NrIGFuZAotCQkgKiBkaWZmQmxvY2sgbXVzdCBiZSBmaWxsZWQgaW4gbGF0ZXIuCi0JCSAqLwotCQlkaWZmT3V0LndyaXRlKE1BR0lDX0JZVEVTKTsKLQkJZGlmZk91dC53cml0ZUxvbmcoLTEpOyAvLyBwbGFjZSBob2xkZXIgZm9yIGN0cmxCbG9ja0xlbgotCQlkaWZmT3V0LndyaXRlTG9uZygtMSk7IC8vIHBsYWNlIGhvbGRlciBmb3IgZGlmZkJsb2NrTGVuCi0JCWRpZmZPdXQud3JpdGVMb25nKG5ld3NpemUpOwotCQlkaWZmT3V0LmZsdXNoKCk7Ci0KLQkJR1pJUE91dHB1dFN0cmVhbSBiemlwMk91dCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKGRpZmZPdXQpOwotCQlEYXRhT3V0cHV0U3RyZWFtIGRhdGFPdXQgPSBuZXcgRGF0YU91dHB1dFN0cmVhbShiemlwMk91dCk7Ci0KLQkJaW50IG9sZHNjb3JlLCBzY3NjOwotCi0JCWludCBvdmVybGFwLCBTcywgbGVuczsKLQkJaW50IGk7Ci0JCWludCBzY2FuID0gMDsKLQkJaW50IGxlbiA9IDA7Ci0JCWludCBsYXN0c2NhbiA9IDA7Ci0JCWludCBsYXN0cG9zID0gMDsKLQkJaW50IGxhc3RvZmZzZXQgPSAwOwotCi0JCUludEJ5UmVmIHBvcyA9IG5ldyBJbnRCeVJlZigpOwotCQkvLyBpbnQgY3RybEJsb2NrTGVuID0gMDsKLQotCQl3aGlsZSAoc2NhbiA8IG5ld3NpemUpIHsKLQkJCW9sZHNjb3JlID0gMDsKLQotCQkJZm9yIChzY3NjID0gc2NhbiArPSBsZW47IHNjYW4gPCBuZXdzaXplOyBzY2FuKyspIHsKLQotCQkJCWxlbiA9IHNlYXJjaChJLCBvbGRCdWYsIG9sZHNpemUsIG5ld0J1ZiwgbmV3c2l6ZSwgc2NhbiwgMCwKLQkJCQkJCW9sZHNpemUsIHBvcyk7Ci0KLQkJCQlmb3IgKDsgc2NzYyA8IHNjYW4gKyBsZW47IHNjc2MrKykgewotCQkJCQlpZiAoKHNjc2MgKyBsYXN0b2Zmc2V0IDwgb2xkc2l6ZSkKLQkJCQkJCQkmJiAob2xkQnVmW3Njc2MgKyBsYXN0b2Zmc2V0XSA9PSBuZXdCdWZbc2NzY10pKSB7Ci0JCQkJCQlvbGRzY29yZSsrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCgobGVuID09IG9sZHNjb3JlKSAmJiAobGVuICE9IDApKSB8fCAobGVuID4gb2xkc2NvcmUgKyA4KSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAoKHNjYW4gKyBsYXN0b2Zmc2V0IDwgb2xkc2l6ZSkKLQkJCQkJCSYmIChvbGRCdWZbc2NhbiArIGxhc3RvZmZzZXRdID09IG5ld0J1ZltzY2FuXSkpIHsKLQkJCQkJb2xkc2NvcmUtLTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICgobGVuICE9IG9sZHNjb3JlKSB8fCAoc2NhbiA9PSBuZXdzaXplKSkgewotCQkJCWludCBzID0gMDsKLQkJCQlpbnQgU2YgPSAwOwotCQkJCWludCBsZW5mID0gMDsKLQkJCQlmb3IgKGkgPSAwOyAobGFzdHNjYW4gKyBpIDwgc2NhbikgJiYgKGxhc3Rwb3MgKyBpIDwgb2xkc2l6ZSk7KSB7Ci0JCQkJCWlmIChvbGRCdWZbbGFzdHBvcyArIGldID09IG5ld0J1ZltsYXN0c2NhbiArIGldKQotCQkJCQkJcysrOwotCQkJCQlpKys7Ci0JCQkJCWlmIChzICogMiAtIGkgPiBTZiAqIDIgLSBsZW5mKSB7Ci0JCQkJCQlTZiA9IHM7Ci0JCQkJCQlsZW5mID0gaTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWludCBsZW5iID0gMDsKLQkJCQlpZiAoc2NhbiA8IG5ld3NpemUpIHsKLQkJCQkJcyA9IDA7Ci0JCQkJCWludCBTYiA9IDA7Ci0JCQkJCWZvciAoaSA9IDE7IChzY2FuID49IGxhc3RzY2FuICsgaSkgJiYgKHBvcy52YWx1ZSA+PSBpKTsgaSsrKSB7Ci0JCQkJCQlpZiAob2xkQnVmW3Bvcy52YWx1ZSAtIGldID09IG5ld0J1ZltzY2FuIC0gaV0pCi0JCQkJCQkJcysrOwotCQkJCQkJaWYgKHMgKiAyIC0gaSA+IFNiICogMiAtIGxlbmIpIHsKLQkJCQkJCQlTYiA9IHM7Ci0JCQkJCQkJbGVuYiA9IGk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAobGFzdHNjYW4gKyBsZW5mID4gc2NhbiAtIGxlbmIpIHsKLQkJCQkJb3ZlcmxhcCA9IChsYXN0c2NhbiArIGxlbmYpIC0gKHNjYW4gLSBsZW5iKTsKLQkJCQkJcyA9IDA7Ci0JCQkJCVNzID0gMDsKLQkJCQkJbGVucyA9IDA7Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCBvdmVybGFwOyBpKyspIHsKLQkJCQkJCWlmIChuZXdCdWZbbGFzdHNjYW4gKyBsZW5mIC0gb3ZlcmxhcCArIGldID09IG9sZEJ1ZltsYXN0cG9zCi0JCQkJCQkJCSsgbGVuZiAtIG92ZXJsYXAgKyBpXSkgewotCQkJCQkJCXMrKzsKLQkJCQkJCX0KLQkJCQkJCWlmIChuZXdCdWZbc2NhbiAtIGxlbmIgKyBpXSA9PSBvbGRCdWZbcG9zLnZhbHVlIC0gbGVuYgotCQkJCQkJCQkrIGldKSB7Ci0JCQkJCQkJcy0tOwotCQkJCQkJfQotCQkJCQkJaWYgKHMgPiBTcykgewotCQkJCQkJCVNzID0gczsKLQkJCQkJCQlsZW5zID0gaSArIDE7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlsZW5mICs9IGxlbnMgLSBvdmVybGFwOwotCQkJCQlsZW5iIC09IGxlbnM7Ci0JCQkJfQotCi0JCQkJLy8gPyBieXRlIGNhc3RpbmcgaW50cm9kdWNlZCBoZXJlIC0tIG1pZ2h0IGFmZmVjdCB0aGluZ3MKLQkJCQlmb3IgKGkgPSAwOyBpIDwgbGVuZjsgaSsrKSB7Ci0JCQkJCWRiW2RibGVuICsgaV0gPSAoYnl0ZSkgKG5ld0J1ZltsYXN0c2NhbiArIGldIC0gb2xkQnVmW2xhc3Rwb3MKLQkJCQkJCQkrIGldKTsKLQkJCQl9Ci0KLQkJCQlmb3IgKGkgPSAwOyBpIDwgKHNjYW4gLSBsZW5iKSAtIChsYXN0c2NhbiArIGxlbmYpOyBpKyspIHsKLQkJCQkJZWJbZWJsZW4gKyBpXSA9IG5ld0J1ZltsYXN0c2NhbiArIGxlbmYgKyBpXTsKLQkJCQl9Ci0KLQkJCQlkYmxlbiArPSBsZW5mOwotCQkJCWVibGVuICs9IChzY2FuIC0gbGVuYikgLSAobGFzdHNjYW4gKyBsZW5mKTsKLQotCQkJCS8qCi0JCQkJICogV3JpdGUgY29udHJvbCBibG9jayBlbnRyeSAoMyB4IGludCkKLQkJCQkgKi8KLQkJCQkvLyBkaWZmT3V0LndyaXRlSW50KCBsZW5mICk7Ci0JCQkJLy8gZGlmZk91dC53cml0ZUludCggKCBzY2FuIC0gbGVuYiApIC0gKCBsYXN0c2NhbiArIGxlbmYgKSApOwotCQkJCS8vIGRpZmZPdXQud3JpdGVJbnQoICggcG9zWzBdIC0gbGVuYiApIC0gKCBsYXN0cG9zICsgbGVuZiApICk7Ci0JCQkJLy8gY3RybEJsb2NrTGVuICs9IDEyOwotCQkJCWRhdGFPdXQud3JpdGVJbnQobGVuZik7Ci0JCQkJZGF0YU91dC53cml0ZUludCgoc2NhbiAtIGxlbmIpIC0gKGxhc3RzY2FuICsgbGVuZikpOwotCQkJCWRhdGFPdXQud3JpdGVJbnQoKHBvcy52YWx1ZSAtIGxlbmIpIC0gKGxhc3Rwb3MgKyBsZW5mKSk7Ci0KLQkJCQlsYXN0c2NhbiA9IHNjYW4gLSBsZW5iOwotCQkJCWxhc3Rwb3MgPSBwb3MudmFsdWUgLSBsZW5iOwotCQkJCWxhc3RvZmZzZXQgPSBwb3MudmFsdWUgLSBzY2FuOwotCQkJfSAvLyBlbmQgaWYKLQkJfSAvLyBlbmQgd2hpbGUgbG9vcAotCi0JCWRhdGFPdXQuZmx1c2goKTsKLQkJYnppcDJPdXQuZmluaXNoKCk7Ci0KLQkJLy8gbm93IGNvbXByZXNzZWQgY3RybEJsb2NrTGVuCi0JCWludCBjdHJsQmxvY2tMZW4gPSBkaWZmT3V0LnNpemUoKSAtIFV0aWwuSEVBREVSX1NJWkU7Ci0JCS8vIFN5c3RlbS5lcnIucHJpbnRsbiggIkRpZmY6IGN0cmxCbG9ja0xlbj0iICsgY3RybEJsb2NrTGVuICk7Ci0KLQkJLy8gR1pJUE91dHB1dFN0cmVhbSBnek91dDsKLQotCQkvKgotCQkgKiBXcml0ZSBkaWZmIGJsb2NrCi0JCSAqLwotCQkvLyBnek91dCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKCBkaWZmT3V0ICk7Ci0JCWJ6aXAyT3V0ID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0oZGlmZk91dCk7Ci0JCWJ6aXAyT3V0LndyaXRlKGRiLCAwLCBkYmxlbik7Ci0JCWJ6aXAyT3V0LmZpbmlzaCgpOwotCQliemlwMk91dC5mbHVzaCgpOwotCQlpbnQgZGlmZkJsb2NrTGVuID0gZGlmZk91dC5zaXplKCkgLSBjdHJsQmxvY2tMZW4gLSBVdGlsLkhFQURFUl9TSVpFOwotCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oICJEaWZmOiBkaWZmQmxvY2tMZW49IiArIGRpZmZCbG9ja0xlbiApOwotCi0JCS8qCi0JCSAqIFdyaXRlIGV4dHJhIGJsb2NrCi0JCSAqLwotCQkvLyBnek91dCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKCBkaWZmT3V0ICk7Ci0JCWJ6aXAyT3V0ID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0oZGlmZk91dCk7Ci0JCWJ6aXAyT3V0LndyaXRlKGViLCAwLCBlYmxlbik7Ci0JCWJ6aXAyT3V0LmZpbmlzaCgpOwotCQliemlwMk91dC5mbHVzaCgpOwotCQkvLyBsb25nIGV4dHJhQmxvY2tMZW4gPSBkaWZmT3V0LnNpemUoKSAtIGRpZmZCbG9ja0xlbiAtIGN0cmxCbG9ja0xlbiAtCi0JCS8vIEhFQURFUl9TSVpFOwotCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oICJEaWZmOiBleHRyYUJsb2NrTGVuPSIgKyBleHRyYUJsb2NrTGVuICk7Ci0KLQkJZGlmZk91dC5jbG9zZSgpOwotCi0JCS8qCi0JCSAqIFdyaXRlIG1pc3NpbmcgaGVhZGVyIGluZm8uCi0JCSAqLwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUhlYWRlck91dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oCi0JCQkJVXRpbC5IRUFERVJfU0laRSk7Ci0JCURhdGFPdXRwdXRTdHJlYW0gaGVhZGVyT3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYnl0ZUhlYWRlck91dCk7Ci0JCWhlYWRlck91dC53cml0ZShNQUdJQ19CWVRFUyk7Ci0JCWhlYWRlck91dC53cml0ZUxvbmcoY3RybEJsb2NrTGVuKTsgLy8gcGxhY2UgaG9sZGVyIGZvciBjdHJsQmxvY2tMZW4KLQkJaGVhZGVyT3V0LndyaXRlTG9uZyhkaWZmQmxvY2tMZW4pOyAvLyBwbGFjZSBob2xkZXIgZm9yIGRpZmZCbG9ja0xlbgotCQloZWFkZXJPdXQud3JpdGVMb25nKG5ld3NpemUpOwotCQloZWFkZXJPdXQuY2xvc2UoKTsKLQotCQkvLyBDb3B5IGhlYWRlciBpbmZvcm1hdGlvbiBpbnRvIHRoZSBkaWZmCi0JCWJ5dGVbXSBkaWZmQnl0ZXMgPSBieXRlT3V0LnRvQnl0ZUFycmF5KCk7Ci0JCWJ5dGVbXSBoZWFkZXJCeXRlcyA9IGJ5dGVIZWFkZXJPdXQudG9CeXRlQXJyYXkoKTsKLQotCQlTeXN0ZW0uYXJyYXljb3B5KGhlYWRlckJ5dGVzLCAwLCBkaWZmQnl0ZXMsIDAsIGhlYWRlckJ5dGVzLmxlbmd0aCk7Ci0KLQkJcmV0dXJuIGRpZmZCeXRlczsKLQkJLy8gLyoKLQkJLy8gKiBXcml0ZSBtaXNzaW5nIGhlYWRlciBpbmZvLiBOZWVkIHRvIHJlb3BlbiB0aGUgZmlsZSB3aXRoCi0JCS8vIFJhbmRvbUFjY2Vzc0ZpbGUKLQkJLy8gKiBmb3IgdGhpcy4KLQkJLy8gKi8KLQkJLy8gUmFuZG9tQWNjZXNzRmlsZSBkaWZmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoIGRpZmZGaWxlLCAicnciICk7Ci0JCS8vIGRpZmYuc2VlayggOCApOwotCQkvLyBkaWZmLndyaXRlTG9uZyggY3RybEJsb2NrTGVuICk7IC8vIGN0cmxCbG9ja0xlbiAoY29tcHJlc3NlZCkgQG9mZnNldAotCQkvLyA4Ci0JCS8vIGRpZmYud3JpdGVMb25nKCBkaWZmQmxvY2tMZW4gKTsgLy8gZGlmZkJsb2NrTGVuIChjb21wcmVzc2VkKSBAb2Zmc2V0Ci0JCS8vIDE2Ci0JCS8vIGRpZmYuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBSdW4gSkJEaWZmIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gUGFyYW1zOiBvbGRmaWxlIG5ld2ZpbGUgZGlmZmZpbGUuIGRpZmYKLQkgKiBmaWxlIHdpbGwgYmUgY3JlYXRlZC4KLQkgKiAKLQkgKiBAcGFyYW0gYXJnCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlpZiAoYXJnLmxlbmd0aCAhPSAzKSB7Ci0JCQlTeXN0ZW0uZXJyCi0JCQkJCS5wcmludGxuKCJ1c2FnZSBleGFtcGxlOiBqYXZhIC1YbXgyMDBtIGllLndvbWJhdC5qYmRpZmYuSkJEaWZmIG9sZGZpbGUgbmV3ZmlsZSBwYXRjaGZpbGVcbiIpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJRmlsZSBvbGRGaWxlID0gbmV3IEZpbGUoYXJnWzBdKTsKLQkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUoYXJnWzFdKTsKLQkJRmlsZSBkaWZmRmlsZSA9IG5ldyBGaWxlKGFyZ1syXSk7Ci0KLQkJYnNkaWZmKG9sZEZpbGUsIG5ld0ZpbGUsIGRpZmZGaWxlKTsKLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIEludEJ5UmVmIHsKLQkJcHJpdmF0ZSBpbnQgdmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL0pCUGF0Y2guamF2YSBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9zcmMvaWUvd29tYmF0L2piZGlmZi9KQlBhdGNoLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTdhNzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL0pCUGF0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCBKb2UgRGVzYm9ubmV0LCAoamRlc2Jvbm5ldEBnbWFpbC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSA8b3JnYW5pemF0aW9uPiBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSA8Y29weXJpZ2h0IGhvbGRlcj4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxjb3B5cmlnaHQgaG9sZGVyPiBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqL3BhY2thZ2UgaWUud29tYmF0LmpiZGlmZjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOwotCi0vKioKLSAqIEphdmEgQmluYXJ5IHBhdGNoZXIgKGJhc2VkIG9uIGJzcGF0Y2ggYnkgQ29saW4gUGVyY2l2YWwpCi0gKiAKLSAqIEBhdXRob3IgSm9lIERlc2Jvbm5ldCwgam9lQGdhbHdheS5uZXQKLSAqLwotcHVibGljIGNsYXNzIEpCUGF0Y2ggewotCi0JLy8gSkJQYXRjaCBleHRlbnNpb25zIGJ5IFN0ZWZhbi5MaWViaWdAY29tcGVvcGxlLmRlOgotCS8vCi0JLy8gLSB1c2VzIEdaSVAgY29tcHJlc3NvciB0byBjb21wcmVzcyBBTEwgb2YgdGhlIGJsb2NrcyAoY3RybCxkaWZmLGV4dHJhKS4KLQkvLyAtIGFkZGVkIGFuIGludGVyZmFjZSB0aGF0IGFsbG93cyB1c2luZyBvZiBKQlBhdGNoIHdpdGggc3RyZWFtcyBhbmQgYnl0ZQotCS8vIGFycmF5cwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiamJkaWZmLTAuMS4wIjsKLQotCS8qKgotCSAqIFJ1biBKQlBhdGNoIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gUGFyYW1zOiBvbGRmaWxlIG5ld2ZpbGUgcGF0Y2hmaWxlLgotCSAqIG5ld2ZpbGUgd2lsbCBiZSBjcmVhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBhcmcKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJnKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWlmIChhcmcubGVuZ3RoICE9IDMpIHsKLQkJCVN5c3RlbS5lcnIKLQkJCQkJLnByaW50bG4oInVzYWdlIGV4YW1wbGU6IGphdmEgLVhteDIwMG0gaWUud29tYmF0LmpiZGlmZi5KQlBhdGNoIG9sZGZpbGUgbmV3ZmlsZSBwYXRjaGZpbGUiKTsKLQkJfQotCi0JCUZpbGUgb2xkRmlsZSA9IG5ldyBGaWxlKGFyZ1swXSk7Ci0JCUZpbGUgbmV3RmlsZSA9IG5ldyBGaWxlKGFyZ1sxXSk7Ci0JCUZpbGUgZGlmZkZpbGUgPSBuZXcgRmlsZShhcmdbMl0pOwotCi0JCWJzcGF0Y2gob2xkRmlsZSwgbmV3RmlsZSwgZGlmZkZpbGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvbGRGaWxlCi0JICogQHBhcmFtIG5ld0ZpbGUKLQkgKiBAcGFyYW0gZGlmZkZpbGUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGJzcGF0Y2goRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUsIEZpbGUgZGlmZkZpbGUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBvbGRJbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0ob2xkRmlsZSkpOwotCQlieXRlW10gZGlmZkJ5dGVzID0gbmV3IGJ5dGVbKGludCkgZGlmZkZpbGUubGVuZ3RoKCldOwotCQlJbnB1dFN0cmVhbSBkaWZmSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGRpZmZGaWxlKTsKLQkJVXRpbC5yZWFkRnJvbVN0cmVhbShkaWZmSW5wdXRTdHJlYW0sIGRpZmZCeXRlcywgMCwgZGlmZkJ5dGVzLmxlbmd0aCk7Ci0KLQkJYnl0ZVtdIG5ld0J5dGVzID0gYnNwYXRjaChvbGRJbnB1dFN0cmVhbSwgKGludCkgb2xkRmlsZS5sZW5ndGgoKSwKLQkJCQlkaWZmQnl0ZXMpOwotCi0JCU91dHB1dFN0cmVhbSBuZXdPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShuZXdGaWxlKTsKLQkJbmV3T3V0cHV0U3RyZWFtLndyaXRlKG5ld0J5dGVzKTsKLQkJbmV3T3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9sZElucHV0U3RyZWFtCi0JICogQHBhcmFtIGRpZmZJbnB1dFN0cmVhbQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBic3BhdGNoKElucHV0U3RyZWFtIG9sZElucHV0U3RyZWFtLCBpbnQgb2xkc2l6ZSwKLQkJCWJ5dGVbXSBkaWZmQnl0ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8qCi0JCSAqIFJlYWQgaW4gb2xkIGZpbGUgKGZpbGUgdG8gYmUgcGF0Y2hlZCkgdG8gb2xkQnVmCi0JCSAqLwotCQkvLyBpbnQgb2xkc2l6ZSA9IChpbnQpIG9sZEZpbGUubGVuZ3RoKCk7Ci0JCS8vIGJ5dGVbXSBvbGRCdWYgPSBuZXcgYnl0ZVtvbGRzaXplICsgMV07Ci0JCWJ5dGVbXSBvbGRCdWYgPSBuZXcgYnl0ZVtvbGRzaXplXTsKLQkJLy8gSW5wdXRTdHJlYW0gb2xkSW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKCBvbGRGaWxlICk7Ci0JCVV0aWwucmVhZEZyb21TdHJlYW0ob2xkSW5wdXRTdHJlYW0sIG9sZEJ1ZiwgMCwgb2xkc2l6ZSk7Ci0JCW9sZElucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCS8vIG9sZEluLmNsb3NlKCk7Ci0KLQkJcmV0dXJuIEpCUGF0Y2guYnNwYXRjaChvbGRCdWYsIG9sZHNpemUsIGRpZmZCeXRlcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG9sZEJ1ZgotCSAqIEBwYXJhbSBvbGRzaXplCi0JICogQHBhcmFtIGRpZmZCeXRlcwotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gYnNwYXRjaChieXRlW10gb2xkQnVmLCBpbnQgb2xkc2l6ZSwgYnl0ZVtdIGRpZmZCeXRlcykKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBic3BhdGNoKG9sZEJ1Ziwgb2xkc2l6ZSwgZGlmZkJ5dGVzLCBkaWZmQnl0ZXMubGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb2xkQnVmCi0JICogQHBhcmFtIG9sZHNpemUKLQkgKiBAcGFyYW0gZGlmZkJ1ZgotCSAqIEBwYXJhbSBkaWZmU2l6ZQotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBieXRlW10gYnNwYXRjaChieXRlW10gb2xkQnVmLCBpbnQgb2xkc2l6ZSwgYnl0ZVtdIGRpZmZCdWYsCi0JCQlpbnQgZGlmZlNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJRGF0YUlucHV0U3RyZWFtIGRpZmZJbiA9IG5ldyBEYXRhSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotCQkJCWRpZmZCdWYsIDAsIGRpZmZTaXplKSk7Ci0KLQkJLy8gc2tpcCBoZWFkZXJNYWdpYyBhdCBoZWFkZXIgb2Zmc2V0IDAgKGxlbmd0aCA4IGJ5dGVzKQotCQlkaWZmSW4uc2tpcCg4KTsKLQotCQkvLyBjdHJsQmxvY2tMZW4gYWZ0ZXIgYnppcDIgY29tcHJlc3Npb24gYXQgaGVhdGVyIG9mZnNldCA4IChsZW5ndGggOAotCQkvLyBieXRlcykKLQkJbG9uZyBjdHJsQmxvY2tMZW4gPSBkaWZmSW4ucmVhZExvbmcoKTsKLQotCQkvLyBkaWZmQmxvY2tMZW4gYWZ0ZXIgYnppcDIgY29tcHJlc3Npb24gYXQgaGVhZGVyIG9mZnNldCAxNiAobGVuZ3RoIDgKLQkJLy8gYnl0ZXMpCi0JCWxvbmcgZGlmZkJsb2NrTGVuID0gZGlmZkluLnJlYWRMb25nKCk7Ci0KLQkJLy8gc2l6ZSBvZiBuZXcgZmlsZSBhdCBoZWFkZXIgb2Zmc2V0IDI0IChsZW5ndGggOCBieXRlcykKLQkJaW50IG5ld3NpemUgPSAoaW50KSBkaWZmSW4ucmVhZExvbmcoKTsKLQotCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4oICJuZXdzaXplPSIgKyBuZXdzaXplICk7Ci0JCS8vIFN5c3RlbS5lcnIucHJpbnRsbiggImN0cmxCbG9ja0xlbj0iICsgY3RybEJsb2NrTGVuICk7Ci0JCS8vIFN5c3RlbS5lcnIucHJpbnRsbiggImRpZmZCbG9ja0xlbj0iICsgZGlmZkJsb2NrTGVuICk7Ci0JCS8vIFN5c3RlbS5lcnIucHJpbnRsbiggIm5ld3NpemU9IiArIG5ld3NpemUgKTsKLQotCQlJbnB1dFN0cmVhbSBpbjsKLQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGlmZkJ1ZiwgMCwgZGlmZlNpemUpOwotCQlpbi5za2lwKFV0aWwuSEVBREVSX1NJWkUpOwotCQlEYXRhSW5wdXRTdHJlYW0gY3RybEJsb2NrSW4gPSBuZXcgRGF0YUlucHV0U3RyZWFtKG5ldyBHWklQSW5wdXRTdHJlYW0oCi0JCQkJaW4pKTsKLQotCQlpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkaWZmQnVmLCAwLCBkaWZmU2l6ZSk7Ci0JCWluLnNraXAoY3RybEJsb2NrTGVuICsgVXRpbC5IRUFERVJfU0laRSk7Ci0JCUlucHV0U3RyZWFtIGRpZmZCbG9ja0luID0gbmV3IEdaSVBJbnB1dFN0cmVhbShpbik7Ci0KLQkJaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGlmZkJ1ZiwgMCwgZGlmZlNpemUpOwotCQlpbi5za2lwKGRpZmZCbG9ja0xlbiArIGN0cmxCbG9ja0xlbiArIFV0aWwuSEVBREVSX1NJWkUpOwotCQlJbnB1dFN0cmVhbSBleHRyYUJsb2NrSW4gPSBuZXcgR1pJUElucHV0U3RyZWFtKGluKTsKLQotCQkvLyBieXRlW10gbmV3QnVmID0gbmV3IGJ5dGVbbmV3c2l6ZSArIDFdOwotCQlieXRlW10gbmV3QnVmID0gbmV3IGJ5dGVbbmV3c2l6ZV07Ci0KLQkJaW50IG9sZHBvcyA9IDA7Ci0JCWludCBuZXdwb3MgPSAwOwotCQlpbnRbXSBjdHJsID0gbmV3IGludFszXTsKLQkJLy8gaW50IG5ieXRlczsKLQkJd2hpbGUgKG5ld3BvcyA8IG5ld3NpemUpIHsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gMjsgaSsrKSB7Ci0JCQkJLy8gY3RybFtpXSA9IGRpZmZJbi5yZWFkSW50KCk7Ci0JCQkJY3RybFtpXSA9IGN0cmxCbG9ja0luLnJlYWRJbnQoKTsKLQkJCQkvLyBTeXN0ZW0uZXJyLnByaW50bG4gKCIgY3RybFsiICsgaSArICJdPSIgKyBjdHJsW2ldKTsKLQkJCX0KLQotCQkJaWYgKG5ld3BvcyArIGN0cmxbMF0gPiBuZXdzaXplKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3JydXB0IHBhdGNoLiIpOwotCQkJfQotCi0JCQkvKgotCQkJICogUmVhZCBjdHJsWzBdIGJ5dGVzIGZyb20gZGlmZkJsb2NrIHN0cmVhbQotCQkJICovCi0KLQkJCVV0aWwucmVhZEZyb21TdHJlYW0oZGlmZkJsb2NrSW4sIG5ld0J1ZiwgbmV3cG9zLCBjdHJsWzBdKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdHJsWzBdOyBpKyspIHsKLQkJCQlpZiAoKG9sZHBvcyArIGkgPj0gMCkgJiYgKG9sZHBvcyArIGkgPCBvbGRzaXplKSkgewotCQkJCQluZXdCdWZbbmV3cG9zICsgaV0gKz0gb2xkQnVmW29sZHBvcyArIGldOwotCQkJCX0KLQkJCX0KLQotCQkJbmV3cG9zICs9IGN0cmxbMF07Ci0JCQlvbGRwb3MgKz0gY3RybFswXTsKLQotCQkJaWYgKG5ld3BvcyArIGN0cmxbMV0gPiBuZXdzaXplKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJDb3JydXB0IHBhdGNoLiIpOwotCQkJfQotCi0JCQlVdGlsLnJlYWRGcm9tU3RyZWFtKGV4dHJhQmxvY2tJbiwgbmV3QnVmLCBuZXdwb3MsIGN0cmxbMV0pOwotCi0JCQluZXdwb3MgKz0gY3RybFsxXTsKLQkJCW9sZHBvcyArPSBjdHJsWzJdOwotCQl9Ci0KLQkJLy8gVE9ETzogQ2hlY2sgaWYgYXQgZW5kIG9mIGN0cmxJbgotCQkvLyBUT0RPOiBDaGVjayBpZiBhdCB0aGUgZW5kIG9mIGRpZmZJbgotCQkvLyBUT0RPOiBDaGVjayBpZiBhdCB0aGUgZW5kIG9mIGV4dHJhSW4KLQotCQkvLyBUaGlzIGNoZWNrIGlzIG5vdCBuZWVkZWQgc2luY2UgdGhlIGJ5dGUgYXJyYXkgaGFzIGJlZW4gYWxsb2NhdGVkIHdpdGgKLQkJLy8gdGhpcyBjb25zdHJhaW50IQotCQkvLyBpZiAoIG5ld0J1Zi5sZW5ndGggLSAxICE9IG5ld3NpemUgKSB7Ci0JCS8vIHRocm93IG5ldyBJT0V4Y2VwdGlvbiggIkNvcnJ1cHQgcGF0Y2guIiApOwotCQkvLyB9Ci0KLQkJY3RybEJsb2NrSW4uY2xvc2UoKTsKLQkJZGlmZkJsb2NrSW4uY2xvc2UoKTsKLQkJZXh0cmFCbG9ja0luLmNsb3NlKCk7Ci0JCWRpZmZJbi5jbG9zZSgpOwotCi0JCXJldHVybiBuZXdCdWY7Ci0JCS8vIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSggbmV3RmlsZSApOwotCQkvLyBvdXQud3JpdGUoIG5ld0J1ZiwgMCwgbmV3QnVmLmxlbmd0aCAtIDEgKTsKLQkJLy8gb3V0LmNsb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL0xJQ0VOU0UudHh0IGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhiNGQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9zcmMvaWUvd29tYmF0L2piZGlmZi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qIENvcHlyaWdodCAoYykgMjAwNSwgSm9lIERlc2Jvbm5ldCAoamRlc2Jvbm5ldEBnbWFpbC5jb20pLgotKiBCYXNlZCBvbiBhIGRpcmVjdCB0cmFuc2xhdGlvbiBvZiBic2RpZmYgdXRpbGl0eSBieSBDb2xpbiBQZXJjaXZhbCAKLSogYW5kIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmRhZW1vbm9sb2d5Lm5ldC9ic2RpZmYvIHVuZGVyIHRoZSAKLSogc2FtZSBsaWNlbnNlLgotCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0qCi0qIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotKiAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0qICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0qICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIDxvcmdhbml6YXRpb24+IG5vciB0aGUKLSogICAgICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKLSogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0qCi0qIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgPGNvcHlyaWdodCBob2xkZXI+IGBgQVMgSVMnJyBBTkQgQU5ZCi0qIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCA8Y29weXJpZ2h0IGhvbGRlcj4gQkUgTElBQkxFIEZPUiBBTlkKLSogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKLSogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0qLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9zcmMvaWUvd29tYmF0L2piZGlmZi9SRUFETUUudHh0IGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyMzU2NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi1SRUFETUUgZmlsZSBmb3IgSkJEaWZmIChKYXZhIEJpbmFyeSBEaWZmKSAKLVZlcnNpb246IDAuMS4xCi1SZWxlYXNlIGRhdGU6IDEgT2N0IDIwMDcKLQotSkJEaWZmIChKYXZhIEJpbmFyeSBEaWZmKSB1dGlsaXR5IGlzIGEgSmF2YSB0cmFuc2xhdGlvbiBvZiB0aGUgYnNkaWZmICh2NC4yKSB1dGlsaXR5IAotYnkgQ29saW4gUGVyY2l2YWwuIFNlZSBodHRwOi8vd3d3LmRhZW1vbm9sb2d5Lm5ldC9ic2RpZmYvCi0KLVRoZSBmaWxlIGZvcm1hdCBpcyBzaW1pbGFyIHRvLCBidXQgY3VycmVudGx5IG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIGJzZGlmZiB1dGlsaXR5LiAKLVRoaXMgaXMgYmVjYXVzZSBic2RpZmYgdXNlcyBiemlwMiBmb3IgY29tcHJlc3Npb24gd2hpY2ggaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgCi1zdGFuZGFyZCBKYXZhIGxpYnJhcmllcy4gSW5zdGVhZCBJIHVzZSBnemlwIChqYXZhLnV0aWwuemlwLiopCi0KLVRoZSBkaWZmIHV0aWxpdHkgaXMgdmVyeSBtZW1vcnkgaHVuZ3J5LiBBdHRlbXB0aW5nIHRvIGRpZmYgdmVyeSBsYXJnZSBmaWxlcyB3aXRoIAotaW5zdWZmaWNpZW50IFJBTSBtYXkgY2F1c2UgeW91ciBjb21wdXRlciB0byAndHJhc2gnIChpZSBiZWNvbWUgdW51c2FibHkgc2xvdyBhbmQgbWF5Ci1yZXF1aXJlIGEgcmVzZXQgdG8gcmVjb3ZlcikuIENvbXBhcmluZyB0d28gMjBNQiBmaWxlcyB3aWxsIHRha2UgYXBwcm94IDgwIHNlY29uZHMgCi1vbiBhIDJHSHogUGVudGl1bSA0IGFuZCB3aWxsIHJlcXVpcmUgYSBtYXhpbXVtIGhlYXAgc2l6ZSBvZiBhdCBsZWFzdCAyMjAgTUJ5dGVzLiBUaGUKLW1heGltdW0gaGVhcCBzaXplIGNhbiBiZSBzcGVjaWZpZWQgdXNpbmcgdGhlIC1YbXggc3dpdGNoIHRvIHRoZSBKYXZhIFZNIChzZWUgZXhhbXBsZXMKLWJlbG93KS4gVGhlIHBhdGNoIHV0aWxpdHkgaGFzIG1vcmUgbW9kZXN0IHJlc291cmNlIHJlcXVpcmVtZW50cy4KLQotRVhBTVBMRVM6Ci0KLVRvIGNvbXBhcmUgb2xkLmJpbiB3aXRoIG5ldy5iaW4gYW5kIHByb2R1Y2UgZGlmZiBmaWxlIG5ldy1vbGQuZGlmZjoKLQotamF2YSAtWG14MjAwbSAtY2xhc3NwYXRoIGpiZGlmZi5qYXIgaWUud29tYmF0LmpiZGlmZi5KQkRpZmYgb2xkLmJpbiBuZXcuYmluIG5ldy1vbGQuZGlmZgotCi1UbyBwYXRjaCBvbGQuYmluIHdpdGggbmV3LW9sZC5kaWZmIHRvIHByb2R1Y2UgbmV3LmJpbjoKLQotamF2YSAtWG14MjAwbSAtY2xhc3NwYXRoIGpiZGlmZi5qYXIgaWUud29tYmF0LmpiZGlmZi5KQlBhdGNoIG9sZC5iaW4gbmV3LmJpbiBuZXctb2xkLmRpZmYKLQotVE9ETzoKLQotVGhpcyBmaXJzdCByZWxlYXNlIGlzIGEgcmF0aGVyIGJsaW5kIHBvcnQgb2YgdGhlIGJzZGlmZiB1dGlsaXR5LiBBIHZhc3QgYnVsayBvZgotdGhlIGNvZGUgcG9ydGVkIHRvIEphdmEgd2l0aG91dCBhbnkgbW9kaWZpY2F0aW9uLiBUaGVyZSBpcyBzY29wZSAKLWZvciBvcHRpbWl6YXRpb24gKHRoZSBDIGJzZGlmZiBydW5zIGluIGFwcHJveCA1MCUgZmFzdGVyIHRoYW4gSkJEaWZmKS4KLQotQWxzbyBpdCB3b3VsZCBiZSBuaWNlIHRvIGJlIGFibGUgdG8gcHJvZHVjZSBvdXRwdXQgdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggYnNkaWZmLgotSSBuZWVkIGEgYnppcDIgbGlicmFyeSBmb3IgdGhhdC4KLQotQW55IHN1Z2dlc3Rpb25zLCBmZWVkYmFjayBhbmQgYnVncyB3aWxsIGJlIG11Y2ggYXBwcmVjaWF0ZWQuIFBsZWFzZSBlbWFpbAotdG8gam9lQGdhbHdheS5uZXQKLQotTElDRU5TRToKLQotTm93IGF2YWlsYWJsZSB1bmRlciBCU0QgbGljZW5zZSAocHJldmlvdXNseSBHUEwpLgotCi1DSEFOR0VTIFNJTkNFIDAuMS4wIFJFTEVBU0U6Ci0KLUNoYW5nZSBvZiBsaWNlbnNlIGZyb20gR1BMIHYyIHRvIEJTRCBsaWNlbnNlLgotCi1Kb2UgRGVzYm9ubmV0Ci1qZGVzYm9ubmV0QGdtYWlsLmNvbQotMSBPY3QgMjAwNwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL1V0aWwuamF2YSBiL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi9zcmMvaWUvd29tYmF0L2piZGlmZi9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZDVlYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCBKb2UgRGVzYm9ubmV0LCAoamRlc2Jvbm5ldEBnbWFpbC5jb20pCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6Ci0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSA8b3JnYW5pemF0aW9uPiBub3IgdGhlCi0gKiAgICAgICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cwotICogICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSA8Y29weXJpZ2h0IGhvbGRlcj4gYGBBUyBJUycnIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIDxjb3B5cmlnaHQgaG9sZGVyPiBCRSBMSUFCTEUgRk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotcGFja2FnZSBpZS53b21iYXQuamJkaWZmOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKioKLSAqIEBhdXRob3IKLSAqIEBhdXRob3IgSm9lIERlc2Jvbm5ldCwgam9lQGdhbHdheS5uZXQKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgVXRpbCB7Ci0KLQkvLyBKQkRpZmYgZXh0ZW5zaW9ucyBieSBTdGVmYW4uTGllYmlnQGNvbXBlb3BsZS5kZToKLQkvLwotCS8vIC0gaW50cm9kdWNlZCBhIEhFQURFUl9TSVpFIGNvbnN0YW50IGhlcmUKLQotCS8qKgotCSAqIExlbmd0aCBvZiB0aGUgZGlmZiBmaWxlIGhlYWRlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBIRUFERVJfU0laRSA9IDMyOwotCi0JLyoqCi0JICogRXF1aXYgb2YgQyBsaWJyYXJ5IG1lbWNtcCgpLgotCSAqIAotCSAqIEBwYXJhbSBzMQotCSAqIEBwYXJhbSBzMW9mZnNldAotCSAqIEBwYXJhbSBzMgotCSAqIEBwYXJhbSBuCi0JICogQHJldHVybgotCSAqLwotCS8qCi0JICogcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgbWVtY21wKGJ5dGVbXSBzMSwgaW50IHMxb2Zmc2V0LCBieXRlW10gczIsIGludAotCSAqIHMyb2Zmc2V0LCBpbnQgbikgewotCSAqIAotCSAqIGlmICgoczFvZmZzZXQgKyBuKSA+IHMxLmxlbmd0aCkgeyBuID0gczEubGVuZ3RoIC0gczFvZmZzZXQ7IH0gaWYKLQkgKiAoKHMyb2Zmc2V0ICsgbikgPiBzMi5sZW5ndGgpIHsgbiA9IHMyLmxlbmd0aCAtIHMyb2Zmc2V0OyB9IGZvciAoaW50IGkgPQotCSAqIDA7IGkgPCBuOyBpKyspIHsgaWYgKHMxW2kgKyBzMW9mZnNldF0gIT0gczJbaSArIHMyb2Zmc2V0XSkgeyByZXR1cm4gczFbaSArCi0JICogczFvZmZzZXRdIDwgczJbaSArIHMyb2Zmc2V0XSA/IC0xIDogMTsgfSB9Ci0JICogCi0JICogcmV0dXJuIDA7IH0KLQkgKi8KLQotCS8qKgotCSAqIEVxdWl2IG9mIEMgbGlicmFyeSBtZW1jbXAoKS4KLQkgKiAKLQkgKiBAcGFyYW0gczEKLQkgKiBAcGFyYW0gczFvZmZzZXQKLQkgKiBAcGFyYW0gczIKLQkgKiBAcGFyYW0gbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBtZW1jbXAoYnl0ZVtdIHMxLCBpbnQgczFTaXplLCBpbnQgczFvZmZzZXQsCi0JCQlieXRlW10gczIsIGludCBzMlNpemUsIGludCBzMm9mZnNldCkgewotCi0JCWludCBuID0gczFTaXplIC0gczFvZmZzZXQ7Ci0KLQkJaWYgKG4gPiAoczJTaXplIC0gczJvZmZzZXQpKSB7Ci0JCQluID0gczJTaXplIC0gczJvZmZzZXQ7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCWlmIChzMVtpICsgczFvZmZzZXRdICE9IHMyW2kgKyBzMm9mZnNldF0pIHsKLQkJCQlyZXR1cm4gczFbaSArIHMxb2Zmc2V0XSA8IHMyW2kgKyBzMm9mZnNldF0gPyAtMSA6IDE7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gMDsKLQkJLy8gaW50IG4gPSBzMS5sZW5ndGggLSBzMW9mZnNldDsKLQkJLy8KLQkJLy8gaWYgKG4gPiAoczIubGVuZ3RoIC0gczJvZmZzZXQpKSB7Ci0JCS8vIG4gPSBzMi5sZW5ndGggLSBzMm9mZnNldDsKLQkJLy8gfQotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkvLyBpZiAoczFbaSArIHMxb2Zmc2V0XSAhPSBzMltpICsgczJvZmZzZXRdKSB7Ci0JCS8vIHJldHVybiBzMVtpICsgczFvZmZzZXRdIDwgczJbaSArIHMyb2Zmc2V0XSA/IC0xIDogMTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCS8vIHJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIFJlYWQgZnJvbSBpbnB1dCBzdHJlYW0gYW5kIGZpbGwgdGhlIGdpdmVuIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiBvZmZzZXQgdXAKLQkgKiB0byBsZW5ndGggbGVuLgotCSAqIAotCSAqIEBwYXJhbSBpbgotCSAqIEBwYXJhbSBidWYKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHBhcmFtIGxlbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgcmVhZEZyb21TdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGJ5dGVbXSBidWYsCi0JCQlpbnQgb2Zmc2V0LCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWludCB0b3RhbEJ5dGVzUmVhZCA9IDA7Ci0JCXdoaWxlICh0b3RhbEJ5dGVzUmVhZCA8IGxlbikgewotCQkJaW50IGJ5dGVzUmVhZCA9IGluLnJlYWQoYnVmLCBvZmZzZXQgKyB0b3RhbEJ5dGVzUmVhZCwgbGVuCi0JCQkJCS0gdG90YWxCeXRlc1JlYWQpOwotCQkJaWYgKGJ5dGVzUmVhZCA8IDApIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oCi0JCQkJCQkiQ291bGQgbm90IHJlYWQgZXhwZWN0ZWQgbnVtYmVyIG9mIGJ5dGVzLiIpOwotCQkJfQotCQkJdG90YWxCeXRlc1JlYWQgKz0gYnl0ZXNSZWFkOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvc3JjL2llL3dvbWJhdC9qYmRpZmYvcmVhZG1lLW1vcmUudHh0IGIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmL3NyYy9pZS93b21iYXQvamJkaWZmL3JlYWRtZS1tb3JlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ2NWJlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL2llLndvbWJhdC5qYmRpZmYvc3JjL2llL3dvbWJhdC9qYmRpZmYvcmVhZG1lLW1vcmUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1UaGlzIGxpYnJhcnkgdmVyc2lvbiBpcyBiYXNlZCBvbiBKQkRpZmYgKGh0dHA6Ly93d3cud29tYmF0LmllL3NvZnR3YXJlL2piZGlmZi9kb3dubG9hZHMvamJkaWZmLTAuMS4xLnRhci5neikKLXdoaWNoIGlzIGFsc28gYXZhaWxhYmxlIHVuZGVyIHRoZSBPU0kgQXBwcm92ZWQgOjogQlNEIExpY2Vuc2UgKG9yaWdpbmFsKQotaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5odG1sCi0KLVZlcnNpb24gMC4xLjAuMQotIC0gRXh0ZW5kZWQgaW50ZXJmYWNlIHNvIHRoYXQgaXQgaXMgbm90IG9ubHkgZmlsZSBiYXNlZCBhbmQgdXNlcyBHWklQIGNvbXByZXNzb3IgZm9yIGFsbCBkYXRhIHN0cnVjdHVyZXMuCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTBjN2E1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvQ0RDLTEuMCVGb3VuZGF0aW9uLTEuMCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjI1ZTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0NzE2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotI1dlZCBKYW4gMjMgMTA6MDA6NDEgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDliNmRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1NzozMyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFhMzM1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUdWUgTm92IDIxIDAwOjI5OjA1IEVTVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5lcXVpbm94PWZhbHNlCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MjI5YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94O3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LkFjdGl2YXRvcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3IsCi0gb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmludGVybmFsLmFkYXB0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlscywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4sCi0gb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuYWRhcHRvcjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5kZWJ1ZztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5jb3JlLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb247dmVyc2lvbj0iMS4wLjAiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudDt2ZXJzaW9uPSIxLjAuMCI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMS4wIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5vc2dpLnN0b3JhZ2VtYW5hZ2VyO3ZlcnNpb249IjEuMC4wIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gb3JnLm9zZ2kuc2VydmljZS5sb2c7dmVyc2lvbj0iMS4zLjAiLAotIG9yZy5vc2dpLnNlcnZpY2Uuc3RhcnRsZXZlbDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLm9zZ2kudXRpbC50cmFja2VyO3ZlcnNpb249IjEuMy4yIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veDt4LWZyaWVuZHM6PW9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veC51dGlsczt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLAotIEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzc3YjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMzNzc4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBGcmFtZXdvcmsgQWRtaW4gZm9yIEVxdWlub3gKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEzZWM4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veDsKLQotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5GcmFtZXdvcmtBZG1pbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLk1hbmlwdWxhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi0vKioKLSAqIFRoaXMgYnVuZGxlIHByb3ZpZGVzIHRoZSB7QGxpbmsgRnJhbWV3b3JrQWRtaW59IGltcGxlbWVudGF0aW9uIGZvciBGZWxpeC4KLSAqIAotICogVGhpcyBidW5kbGUgcmVnaXN0ZXJzIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0IHdpdGggdGhlc2Ugc2VydmljZSBwcm9wZXJ0eSB2YWx1ZXMuCi0gKiAgCi0gKiAgRldfTkFNRSA9ICJFcXVpbm94IjsKLSAqIAlGV19WRVJTSU9OID0gIjMuMyI7Ci0gKglMQVVDTkhFUl9OQU1FID0gIkVjbGlwc2UuZXhlIjsKLSAqICBMQVVOQ0hFUl9WRVJTSU9OID0gIjMuMiI7Ci0gKiAKLSAqIFRoZSBsYXVuY2hpbmcgYnkgdGhlIGVjbGlwc2UgbGF1bmNoZXIgaXMgc3VwcG9ydGVkLgotICogCi0gKiBIYW5kbGluZyBwbHVnaW5zIGluIG5vbiBKYXIgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQuCi0gKiAKLSAqIEZ3QnVuZGxlU3RhdGUgc3VwcG9ydHMgcmV0cmlldmluZyBmdyBwZXJzaXN0ZW50IGRhdGEKLSAqICBhbmQgIHJlc29sdmluZyBidW5kbGVzIGlmIHJ1bm5pbmcgb24gZXF1aW5veC4KLSAqIEZ3QnVuZGxlU3RhdGUgRG9lcyBOT1Qgc3VwcG9ydCByZXRyaWV2aW5nIHN0YXJ0IExldmVscyBmcm9tIGZ3IHBlcnNpc3RlbnQgZGF0YSBsb2NhdGlvbi8KLSAqICAgCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uRkE7Ci0JRXF1aW5veEZ3QWRtaW5JbXBsIGZ3QWRtaW4gPSBudWxsOwotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyRndBZG1pbigpIHsKLQkJRGljdGlvbmFyeSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX1ZFTkRPUiwgIkVjbGlwc2Uub3JnIik7Ci0KLQkJcHJvcHMucHV0KEZyYW1ld29ya0FkbWluLlNFUlZJQ0VfUFJPUF9LRVlfRldfTkFNRSwgRXF1aW5veENvbnN0YW50cy5GV19OQU1FKTsKLQkJcHJvcHMucHV0KEZyYW1ld29ya0FkbWluLlNFUlZJQ0VfUFJPUF9LRVlfRldfVkVSU0lPTiwgRXF1aW5veENvbnN0YW50cy5GV19WRVJTSU9OKTsKLQkJcHJvcHMucHV0KEZyYW1ld29ya0FkbWluLlNFUlZJQ0VfUFJPUF9LRVlfTEFVTkNIRVJfTkFNRSwgRXF1aW5veENvbnN0YW50cy5MQVVOQ0hFUl9OQU1FKTsKLQkJcHJvcHMucHV0KEZyYW1ld29ya0FkbWluLlNFUlZJQ0VfUFJPUF9LRVlfTEFVTkNIRVJfVkVSU0lPTiwgRXF1aW5veENvbnN0YW50cy5MQVVOQ0hFUl9WRVJTSU9OKTsKLQotCQlpZiAoRXF1aW5veEZ3QWRtaW5JbXBsLmlzUnVubmluZ0Z3KGNvbnRleHQpKSB7Ci0JCQlwcm9wcy5wdXQoRnJhbWV3b3JrQWRtaW4uU0VSVklDRV9QUk9QX0tFWV9SVU5OSU5HX1NZU1RFTV9GTEFHLCAidHJ1ZSIpOwotCQkJZndBZG1pbiA9IG5ldyBFcXVpbm94RndBZG1pbkltcGwoY29udGV4dCwgdHJ1ZSk7Ci0JCX0gZWxzZQotCQkJZndBZG1pbiA9IG5ldyBFcXVpbm94RndBZG1pbkltcGwoY29udGV4dCk7Ci0KLQkJcmVnaXN0cmF0aW9uRkEgPSBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShGcmFtZXdvcmtBZG1pbi5jbGFzcy5nZXROYW1lKCksIGZ3QWRtaW4sIHByb3BzKTsKLQl9Ci0KLQkvKioKLQkgKiBUT0RPOiBUaGVzZSBzZXJ2aWNlcyBhcmUgbmV2ZXIgZGlzcG9zZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgYWNxdWlyZVNlcnZpY2UoU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0JCS8vYmUgdG9sZXJhbnQgb2YgY29uY3VycmVudCBzaHV0ZG93bgotCQlCdW5kbGVDb250ZXh0IHRoZUNvbnRleHQgPSBjb250ZXh0OwotCQlpZiAodGhlQ29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gdGhlQ29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKHNlcnZpY2VOYW1lKTsKLQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0aGVDb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBidW5kbGVDb250ZXh0OwotCQlMb2cuaW5pdChidW5kbGVDb250ZXh0KTsKLQkJcmVnaXN0ZXJGd0FkbWluKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBY3RpdmF0b3IuY29udGV4dCA9IG51bGw7Ci0JCWlmIChyZWdpc3RyYXRpb25GQSAhPSBudWxsKQotCQkJcmVnaXN0cmF0aW9uRkEudW5yZWdpc3RlcigpOwotCQlpZiAoZndBZG1pbiAhPSBudWxsKQotCQkJZndBZG1pbi5kZWFjdGl2YXRlKCk7Ci0JCUxvZy5kaXNwb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FY2xpcHNlTGF1bmNoZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VjbGlwc2VMYXVuY2hlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1YThiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VjbGlwc2VMYXVuY2hlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLnV0aWxzLlNpbXBsZUJ1bmRsZXNTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLnV0aWxzLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmxvZy5Mb2dTZXJ2aWNlOwotCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxhdW5jaGVySW1wbCB7Ci0Jc3RhdGljIFN0cmluZyBnZXRTdHJpbmdPZkNtZChTdHJpbmdbXSBjbWRhcnJheSkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY21kYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCXNiLmFwcGVuZChjbWRhcnJheVtpXSk7Ci0JCQlzYi5hcHBlbmQoIiAiKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLwlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBudWxsOwotCi0JRXF1aW5veEZ3QWRtaW5JbXBsIGZ3QWRtaW4gPSBudWxsOwotCi0JRWNsaXBzZUxhdW5jaGVySW1wbChFcXVpbm94RndBZG1pbkltcGwgZndBZG1pbikgewotCQkvL0VjbGlwc2VMYXVuY2hlckltcGwoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBFcXVpbm94RndBZG1pbkltcGwgZndBZG1pbikgewotCQkvLwkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy5md0FkbWluID0gZndBZG1pbjsKLQl9Ci0KLQlwdWJsaWMgUHJvY2VzcyBsYXVuY2goTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IsIEZpbGUgY3dkKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJU2ltcGxlQnVuZGxlc1N0YXRlLmNoZWNrQXZhaWxhYmlsaXR5KGZ3QWRtaW4pOwotCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0RFQlVHLCB0aGlzLCAibGF1bmNoKE1hbmlwdWxhdG9yICwgRmlsZSApIiwgIiIpOwotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWlmIChsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGxhdW5jaEluTWVtb3J5KG1hbmlwdWxhdG9yLCBjd2QpOwotCQlyZXR1cm4gbGF1bmNoQnlMYXVuY2hlcihtYW5pcHVsYXRvciwgY3dkKTsKLQl9Ci0KLQlwcml2YXRlIFByb2Nlc3MgbGF1bmNoQnlMYXVuY2hlcihNYW5pcHVsYXRvciBtYW5pcHVsYXRvciwgRmlsZSBjd2QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUxhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEgPSBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKTsKLQotCQlpZiAobGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpIG11c3QgYmUgc2V0LiIpOwotCQlTdHJpbmdbXSBjbWRhcnJheSA9IG5ldyBTdHJpbmdbXSB7bGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCkuZ2V0QWJzb2x1dGVQYXRoKCl9OwotCQkvLwkJdHJ5IHsKLQkJaWYgKGN3ZCA9PSBudWxsKQotCQkJY3dkID0gbGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCkuZ2V0UGFyZW50RmlsZSgpOwotCQlQcm9jZXNzIHByb2Nlc3MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNtZGFycmF5LCBudWxsLCBjd2QpOwotCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0RFQlVHLCAiXHQiICsgZ2V0U3RyaW5nT2ZDbWQoY21kYXJyYXkpKTsKLQkJcmV0dXJuIHByb2Nlc3M7Ci0JfQotCi0JcHJpdmF0ZSBQcm9jZXNzIGxhdW5jaEluTWVtb3J5KE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yLCBGaWxlIGN3ZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlVdGlscy5jaGVja0Fic29sdXRlRmlsZShsYXVuY2hlckRhdGEuZ2V0RndKYXIoKSwgImZ3SmFyIik7Ci0JCS8vCQl0aGlzLmxhdW5jaGVyQ0luZm8uZndKYXIgPSBmd0phcjsKLQkJLy8JCWlmIChjd2QgPT0gbnVsbCkKLQkJLy8JCQljd2QgPSBmd0phci47Ci0JCVV0aWxzLmNoZWNrQWJzb2x1dGVEaXIoY3dkLCAiY3dkIik7Ci0KLQkJTGlzdCBjbWRMaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJaWYgKGxhdW5jaGVyRGF0YS5nZXRKdm0oKSAhPSBudWxsKQotCQkJY21kTGlzdC5hZGQobGF1bmNoZXJEYXRhLmdldEp2bSgpLmdldEFic29sdXRlUGF0aCgpKTsKLQkJZWxzZQotCQkJY21kTGlzdC5hZGQoImphdmEiKTsKLQotCQlpZiAobGF1bmNoZXJEYXRhLmdldEp2bUFyZ3MoKSAhPSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsYXVuY2hlckRhdGEuZ2V0SnZtQXJncygpLmxlbmd0aDsgaSsrKQotCQkJCWNtZExpc3QuYWRkKGxhdW5jaGVyRGF0YS5nZXRKdm1BcmdzKClbaV0pOwotCi0JCWNtZExpc3QuYWRkKCItamFyIik7Ci0JCWNtZExpc3QuYWRkKFV0aWxzLmdldFJlbGF0aXZlUGF0aChsYXVuY2hlckRhdGEuZ2V0RndKYXIoKSwgY3dkKSk7Ci0KLQkJRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5jaGVja0NvbnNpc3RlbmN5T2ZGd0NvbmZpZ0xvY0FuZEZ3UGVyc2lzdGVudERhdGFMb2MobGF1bmNoZXJEYXRhKTsvL2NoZWNrQ29uc2lzdGVuY3kodGhpcy5sYXVuY2hlckNJbmZvLmZ3Q29uZmlnRmlsZSwgdGhpcy5sYXVuY2hlckNJbmZvLmZ3SW5zdGFuY2VQcml2YXRlQXJlYSk7Ci0JCWNtZExpc3QuYWRkKEVxdWlub3hDb25zdGFudHMuT1BUSU9OX0NPTkZJR1VSQVRJT04pOwotCQljbWRMaXN0LmFkZChVdGlscy5nZXRSZWxhdGl2ZVBhdGgobGF1bmNoZXJEYXRhLmdldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbigpLCBjd2QpKTsKLQotCQlpZiAobGF1bmNoZXJEYXRhLmlzQ2xlYW4oKSkKLQkJCWNtZExpc3QuYWRkKEVxdWlub3hDb25zdGFudHMuT1BUSU9OX0NMRUFOKTsKLQotCQlTdHJpbmdbXSBjbWRhcnJheSA9IG5ldyBTdHJpbmdbY21kTGlzdC5zaXplKCldOwotCQljbWRMaXN0LnRvQXJyYXkoY21kYXJyYXkpOwotCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0RFQlVHLCAiSW4gQ1dEID0gIiArIGN3ZCArICJcblx0IiArIGdldFN0cmluZ09mQ21kKGNtZGFycmF5KSk7Ci0JCVByb2Nlc3MgcHJvY2VzcyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY21kYXJyYXksIG51bGwsIGN3ZCk7Ci0JCXJldHVybiBwcm9jZXNzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRWNsaXBzZUxhdW5jaGVyUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VjbGlwc2VMYXVuY2hlclBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTgxMmU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRWNsaXBzZUxhdW5jaGVyUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3gudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4udXRpbHMuVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5MYXVuY2hlckRhdGE7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5sb2cuTG9nU2VydmljZTsKLQotcHVibGljIGNsYXNzIEVjbGlwc2VMYXVuY2hlclBhcnNlciB7Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldENvbmZpZ0ZpbGVMaW5lcyhMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhLCBGaWxlIG91dHB1dEZpbGUsIGJvb2xlYW4gcmVsYXRpdmUpIHsKLQkJTGlzdCBsaW5lcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLQkJYm9vbGVhbiBzdGFydFVwRmxhZyA9IGZhbHNlOwotCQlmaW5hbCBTdHJpbmdbXSBwcm9ncmFtQXJncyA9IGxhdW5jaGVyRGF0YS5nZXRQcm9ncmFtQXJncygpOwotCQlpZiAocHJvZ3JhbUFyZ3MgIT0gbnVsbCAmJiBwcm9ncmFtQXJncy5sZW5ndGggIT0gMCkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvZ3JhbUFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocHJvZ3JhbUFyZ3NbaV0uZXF1YWxzKEVxdWlub3hDb25zdGFudHMuT1BUSU9OX1NUQVJUVVApICYmIChwcm9ncmFtQXJnc1tpICsgMV0gIT0gbnVsbCB8fCBwcm9ncmFtQXJnc1tpICsgMV0ubGVuZ3RoKCkgIT0gMCkpIHsKLQkJCQkJbGluZXMuYWRkKHByb2dyYW1BcmdzW2ldKTsKLQkJCQkJbGluZXMuYWRkKHByb2dyYW1BcmdzWysraV0pOwotCQkJCQlzdGFydFVwRmxhZyA9IHRydWU7Ci0JCQkJfSBlbHNlCi0JCQkJCWxpbmVzLmFkZChwcm9ncmFtQXJnc1tpXSk7Ci0JCQl9Ci0JCWlmIChsYXVuY2hlckRhdGEuaXNDbGVhbigpKQotCQkJbGluZXMuYWRkKEVxdWlub3hDb25zdGFudHMuT1BUSU9OX0NMRUFOKTsKLQkJRmlsZSBmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24gPSBsYXVuY2hlckRhdGEuZ2V0RndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKCk7Ci0JCUZpbGUgZndDb25maWdMb2NhdGlvbiA9IGxhdW5jaGVyRGF0YS5nZXRGd0NvbmZpZ0xvY2F0aW9uKCk7Ci0JCWlmIChmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24gIT0gbnVsbCkgewotCQkJaWYgKGZ3Q29uZmlnTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCWlmICghZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uLmVxdWFscyhmd0NvbmZpZ0xvY2F0aW9uKSkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCQkJfQotCQkJbGF1bmNoZXJEYXRhLnNldEZ3Q29uZmlnTG9jYXRpb24oZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKTsKLQkJfSBlbHNlIGlmIChmd0NvbmZpZ0xvY2F0aW9uICE9IG51bGwpCi0JCQlsYXVuY2hlckRhdGEuc2V0RndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKGZ3Q29uZmlnTG9jYXRpb24sIGxhdW5jaGVyRGF0YS5pc0NsZWFuKCkpOwotCi0JCWlmIChsYXVuY2hlckRhdGEuZ2V0RndDb25maWdMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCWxpbmVzLmFkZChFcXVpbm94Q29uc3RhbnRzLk9QVElPTl9DT05GSUdVUkFUSU9OKTsKLQkJCWxpbmVzLmFkZChsYXVuY2hlckRhdGEuZ2V0RndDb25maWdMb2NhdGlvbigpLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCi0JCWlmICghc3RhcnRVcEZsYWcpCi0JCQlpZiAobGF1bmNoZXJEYXRhLmdldEZ3SmFyKCkgIT0gbnVsbCkgewotCQkJCWxpbmVzLmFkZChFcXVpbm94Q29uc3RhbnRzLk9QVElPTl9GVyk7Ci0JCQkJU3RyaW5nIHBhdGggPSAiIjsKLQkJCQkvL2lmIChyZWxhdGl2ZSkKLQkJCQkvLwlwYXRoID0gVXRpbHMuZ2V0UmVsYXRpdmVQYXRoKGxhdW5jaGVyRGF0YS5nZXRGd0phcigpLCBvdXRwdXRGaWxlLmdldFBhcmVudEZpbGUoKSk7Ci0JCQkJLy9lbHNlCi0JCQkJcGF0aCA9IGxhdW5jaGVyRGF0YS5nZXRGd0phcigpLmdldEFic29sdXRlUGF0aCgpOwotCQkJCWxpbmVzLmFkZChwYXRoKTsKLQkJCX0KLQotCQlpZiAobGF1bmNoZXJEYXRhLmdldEp2bSgpICE9IG51bGwpIHsKLQkJCWxpbmVzLmFkZChFcXVpbm94Q29uc3RhbnRzLk9QVElPTl9WTSk7Ci0JCQlsaW5lcy5hZGQobGF1bmNoZXJEYXRhLmdldEp2bSgpLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQlmaW5hbCBTdHJpbmdbXSBqdm1BcmdzID0gbGF1bmNoZXJEYXRhLmdldEp2bUFyZ3MoKTsKLQkJaWYgKGp2bUFyZ3MgIT0gbnVsbCAmJiBqdm1BcmdzLmxlbmd0aCAhPSAwKSB7Ci0JCQlsaW5lcy5hZGQoRXF1aW5veENvbnN0YW50cy5PUFRJT05fVk1BUkdTKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwganZtQXJncy5sZW5ndGg7IGkrKykKLQkJCQlsaW5lcy5hZGQoanZtQXJnc1tpXSk7Ci0JCX0KLQkJU3RyaW5nW10gcmV0ID0gbmV3IFN0cmluZ1tsaW5lcy5zaXplKCldOwotCQlsaW5lcy50b0FycmF5KHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlQ21kTGluZShMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhLCBTdHJpbmdbXSBsaW5lcykgewotCQkvL0xvZy5sb2coTG9nU2VydmljZS5MT0dfREVCVUcsICJpbnB1dEZpbGU9IiArIGlucHV0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCS8vCQlmaW5hbCBGaWxlIGxhdW5jaGVyRmlsZSA9IGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpOwotCQlmaW5hbCBGaWxlIGxhdW5jaGVyQ29uZmlnRmlsZSA9IEVxdWlub3hNYW5pcHVsYXRvckltcGwuZ2V0TGF1bmNoZXJDb25maWdMb2NhdGlvbihsYXVuY2hlckRhdGEpOwotCi0JCWJvb2xlYW4gY2xlYW4gPSBsYXVuY2hlckRhdGEuaXNDbGVhbigpOwotCQlib29sZWFuIG5lZWRUb1VwZGF0ZSA9IGZhbHNlOwotCQlGaWxlIGZ3UGVyc2lzdGVudERhdGFMb2MgPSBsYXVuY2hlckRhdGEuZ2V0RndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKCk7Ci0JCUZpbGUgZndDb25maWdMb2NhdGlvbiA9IGxhdW5jaGVyRGF0YS5nZXRGd0NvbmZpZ0xvY2F0aW9uKCk7Ci0JCWlmIChmd1BlcnNpc3RlbnREYXRhTG9jID09IG51bGwpIHsKLQkJCWlmIChmd0NvbmZpZ0xvY2F0aW9uID09IG51bGwpIHsKLQkJCQlmd1BlcnNpc3RlbnREYXRhTG9jID0gbmV3IEZpbGUobGF1bmNoZXJDb25maWdGaWxlLmdldFBhcmVudCgpLCBFcXVpbm94Q29uc3RhbnRzLkRFRkFVTFRfQ09ORklHVVJBVElPTik7Ci0JCQkJZndDb25maWdMb2NhdGlvbiA9IGZ3UGVyc2lzdGVudERhdGFMb2M7Ci0JCQkJbmVlZFRvVXBkYXRlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZndQZXJzaXN0ZW50RGF0YUxvYyA9IGZ3Q29uZmlnTG9jYXRpb247Ci0JCQkJbmVlZFRvVXBkYXRlID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChmd0NvbmZpZ0xvY2F0aW9uID09IG51bGwpIHsKLQkJCQlmd0NvbmZpZ0xvY2F0aW9uID0gZndQZXJzaXN0ZW50RGF0YUxvYzsKLQkJCQluZWVkVG9VcGRhdGUgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJRmlsZSBmd0phciA9IGxhdW5jaGVyRGF0YS5nZXRGd0phcigpOwotCQlpZiAoZndKYXIgPT0gbnVsbCkgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gRmlsZVV0aWxzLmdldEVjbGlwc2VQbHVnaW5GdWxsTG9jYXRpb24oRXF1aW5veENvbnN0YW50cy5GV19TWU1CT0xJQ19OQU1FLCBuZXcgRmlsZShsYXVuY2hlckNvbmZpZ0ZpbGUuZ2V0UGFyZW50KCksIEVxdWlub3hDb25zdGFudHMuUExVR0lOU19ESVIpKTsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWZ3SmFyID0gbmV3IEZpbGUobmV3IFVSTChsb2NhdGlvbikuZ2V0RmlsZSgpKTsKLQkJCQkJbGF1bmNoZXJEYXRhLnNldEZ3SmFyKGZ3SmFyKTsKLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQl9Ci0JCS8vIGxhdW5jaGVyRGF0YS5pbml0aWFsaXplKCk7IC8vIHJlc2V0IGV4Y2VwdCBsYXVuY2hlckZpbGUuCi0KLQkJLy8JCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlcihsYXVuY2hlckZpbGUpOwotCQlib29sZWFuIHZtQXJnc0ZsYWcgPSBmYWxzZTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmaW5hbCBTdHJpbmcgbGluZSA9IGxpbmVzW2ldLnRyaW0oKTsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpbmUsICIgIik7Ci0JCQlpZiAobGluZS5zdGFydHNXaXRoKCIjIikpCi0JCQkJY29udGludWU7Ci0JCQlpZiAobGluZS5sZW5ndGgoKSA9PSAwKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKHRva2VuaXplci5jb3VudFRva2VucygpICE9IDEpIHsKLQkJCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX1dBUk5JTkcsIHRoaXMsICJwYXJzZUNtZExpbmUoU3RyaW5nW10gbGluZXMsIEZpbGUgaW5wdXRGaWxlKSIsICJJbGxlZ2FsIEZvcm1hdDpsaW5lPSIgKyBsaW5lICsgInRva2VuaXplci5jb3VudFRva2VucygpPSIgKyB0b2tlbml6ZXIuY291bnRUb2tlbnMoKSk7Ci0JCQkJLy90aHJvdyBuZXcgSU9FeGNlcHRpb24oIklsbGVnYWwgRm9ybWF0OmxpbmU9IiArIGxpbmUgKyAidG9rZW5pemVyLmNvdW50VG9rZW5zKCk9IiArIHRva2VuaXplci5jb3VudFRva2VucygpKTsKLQkJCX0KLQkJCWlmICh2bUFyZ3NGbGFnKSB7Ci0JCQkJbGF1bmNoZXJEYXRhLmFkZEp2bUFyZyhsaW5lKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChsaW5lLmVxdWFsc0lnbm9yZUNhc2UoRXF1aW5veENvbnN0YW50cy5PUFRJT05fVk1BUkdTKSkgewotCQkJCXZtQXJnc0ZsYWcgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGxpbmUuZXF1YWxzSWdub3JlQ2FzZShFcXVpbm94Q29uc3RhbnRzLk9QVElPTl9DT05GSUdVUkFUSU9OKSkgewotCQkJCWZpbmFsIFN0cmluZyBuZXh0TGluZSA9IGxpbmVzWysraV0udHJpbSgpOwotCQkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKG5leHRMaW5lKTsKLQkJCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKQotCQkJCQlmaWxlID0gbmV3IEZpbGUobGF1bmNoZXJDb25maWdGaWxlLmdldFBhcmVudCgpICsgRmlsZS5zZXBhcmF0b3IgKyBuZXh0TGluZSk7Ci0JCQkJZndQZXJzaXN0ZW50RGF0YUxvYyA9IGZpbGU7Ci0JCQkJbmVlZFRvVXBkYXRlID0gdHJ1ZTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHNJZ25vcmVDYXNlKEVxdWlub3hDb25zdGFudHMuT1BUSU9OX0NMRUFOKSkgewotCQkJCWNsZWFuID0gdHJ1ZTsKLQkJCQluZWVkVG9VcGRhdGUgPSB0cnVlOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFsc0lnbm9yZUNhc2UoRXF1aW5veENvbnN0YW50cy5PUFRJT05fVk0pKSB7Ci0JCQkJZmluYWwgU3RyaW5nIG5leHRMaW5lID0gbGluZXNbKytpXS50cmltKCk7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobmV4dExpbmUpOwotCQkJCWlmICghZmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCQkJZmlsZSA9IG5ldyBGaWxlKGxhdW5jaGVyQ29uZmlnRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgbmV4dExpbmUpOwotCQkJCX0KLQkJCQlsYXVuY2hlckRhdGEuc2V0SnZtKGZpbGUpOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFsc0lnbm9yZUNhc2UoRXF1aW5veENvbnN0YW50cy5PUFRJT05fRlcpKSB7Ci0JCQkJZmluYWwgU3RyaW5nIG5leHRMaW5lID0gbGluZXNbKytpXS50cmltKCk7Ci0JCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobmV4dExpbmUpOwotCQkJCWlmICghZmlsZS5pc0Fic29sdXRlKCkpIHsKLQkJCQkJZmlsZSA9IG5ldyBGaWxlKGxhdW5jaGVyQ29uZmlnRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yICsgbmV4dExpbmUpOwotCQkJCX0KLQkJCQlsYXVuY2hlckRhdGEuc2V0RndKYXIoZmlsZSk7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgewotCQkJCWxhdW5jaGVyRGF0YS5hZGRQcm9ncmFtQXJnKGxpbmVzW2ldKTsKLQkJCQkvLwkJCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX1dBUk5JTkcsIHRoaXMsICJwYXJzZUNtZExpbmUoU3RyaW5nW10gbGluZXMsIEZpbGUgaW5wdXRGaWxlKSIsICJVbnN1cHBvcnRlZCBieSBjdXJyZW50IGltcGw6bGluZT0iICsgbGluZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5lZWRUb1VwZGF0ZSkgewotCQkJbGF1bmNoZXJEYXRhLnNldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbihmd1BlcnNpc3RlbnREYXRhTG9jLCBjbGVhbik7Ci0JCQlsYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihmd1BlcnNpc3RlbnREYXRhTG9jKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlYWQoTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgRmlsZSBsYXVuY2hlckNvbmZpZ0ZpbGUgPSBFcXVpbm94TWFuaXB1bGF0b3JJbXBsLmdldExhdW5jaGVyQ29uZmlnTG9jYXRpb24obGF1bmNoZXJEYXRhKTsKLQkJaWYgKGxhdW5jaGVyQ29uZmlnRmlsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibGF1bmNoZXJEYXRhLmdldExhdW5jaGVyQ29uZmlnRmlsZSgpIHNob3VsZCBiZSBzZXQgaW4gYWR2YW5jZS4iKTsKLQkJaWYgKCFsYXVuY2hlckNvbmZpZ0ZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0KLQkJQnVmZmVyZWRSZWFkZXIgYnIgPSBudWxsOwotCQl0cnkgewotCQkJYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIobGF1bmNoZXJDb25maWdGaWxlKSk7Ci0KLQkJCVN0cmluZyBsaW5lOwotCQkJTGlzdCBsaXN0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQlsaXN0LmFkZChsaW5lKTsKLQkJCX0KLQkJCVN0cmluZ1tdIGxpbmVzID0gKFN0cmluZ1tdKSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pOwotCQkJU3RyaW5nIG9zZ2lJbnN0YWxsQXJlYSA9IGdldExhdW5jaGVyKGxpbmVzKSAhPSBudWxsID8gRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5tYWtlQWJzb2x1dGUoZ2V0TGF1bmNoZXIobGluZXMpLmdldFBhdGgoKSwgbGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCkuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpKSA6IG51bGw7Ci0KLQkJCVN0cmluZyByZXNvbHZlTmV4dExpbmUgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChyZXNvbHZlTmV4dExpbmUgIT0gbnVsbCkgewotCQkJCQlsaW5lc1tpXSA9IEVxdWlub3hNYW5pcHVsYXRvckltcGwubWFrZUFic29sdXRlKGxpbmVzW2ldLCByZXNvbHZlTmV4dExpbmUpOwotCQkJCQlyZXNvbHZlTmV4dExpbmUgPSBudWxsOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc29sdmVOZXh0TGluZSA9IG5lZWRzUGF0aFJlc29sdXRpb24obGluZXNbaV0sIG9zZ2lJbnN0YWxsQXJlYSwgbGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCkuZ2V0UGFyZW50RmlsZSgpLmdldEFic29sdXRlUGF0aCgpICsgRmlsZS5zZXBhcmF0b3IpOwotCQkJCX0KLQkJCX0KLQkJCXRoaXMucGFyc2VDbWRMaW5lKGxhdW5jaGVyRGF0YSwgbGluZXMpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGJyICE9IG51bGwpCi0JCQkJYnIuY2xvc2UoKTsKLQkJfQotCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0lORk8sICJMYXVuY2hlciBDb25maWcgZmlsZSgiICsgbGF1bmNoZXJDb25maWdGaWxlLmdldEFic29sdXRlUGF0aCgpICsgIikgaXMgcmVhZCBzdWNjZXNzZnVsbHkuIik7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGdldExhdW5jaGVyKFN0cmluZ1tdIGFyZ3MpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJnc1tpXS5lcXVhbHMoRXF1aW5veENvbnN0YW50cy5PUFRJT05fU1RBUlRVUCkgJiYgaSArIDEgPCBhcmdzLmxlbmd0aCAmJiBhcmdzW2kgKyAxXS5jaGFyQXQoMSkgIT0gJy0nKSB7Ci0JCQkJSVBhdGggcGFyZW50Rm9sZGVyID0gbmV3IFBhdGgoYXJnc1tpICsgMV0pLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJCQlpZiAocGFyZW50Rm9sZGVyLmxhc3RTZWdtZW50KCkuZXF1YWxzKCJwbHVnaW5zIikpCi0JCQkJCXJldHVybiBwYXJlbnRGb2xkZXIucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLnRvRmlsZSgpOwotCQkJCXJldHVybiBwYXJlbnRGb2xkZXIudG9GaWxlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy9SZXR1cm4gdGhlIGJhc2UgYWdhaW5zdCB3aGljaCB0aGUgcGF0aCBuZWVkcyB0byBiZSByZXNvbHZlZCwgaWYgcmVzb2x1dGlvbiBpcyBuZWVkZWQuCi0JcHJpdmF0ZSBTdHJpbmcgbmVlZHNQYXRoUmVzb2x1dGlvbihTdHJpbmcgZW50cnksIFN0cmluZyBvc2dpSW5zdGFsbEFyZWEsIFN0cmluZyBsYXVuY2hlckZvbGRlcikgewotCQlpZiAoRXF1aW5veENvbnN0YW50cy5PUFRJT05fQ09ORklHVVJBVElPTi5lcXVhbHNJZ25vcmVDYXNlKGVudHJ5KSkKLQkJCXJldHVybiBvc2dpSW5zdGFsbEFyZWE7Ci0JCWlmICgiLS1sYXVuY2hlci5saWJyYXJ5Ii5lcXVhbHNJZ25vcmVDYXNlKGVudHJ5KSkKLQkJCXJldHVybiBsYXVuY2hlckZvbGRlcjsKLQkJaWYgKEVxdWlub3hDb25zdGFudHMuT1BUSU9OX1NUQVJUVVAuZXF1YWxzSWdub3JlQ2FzZShlbnRyeSkpCi0JCQlyZXR1cm4gbGF1bmNoZXJGb2xkZXI7Ci0JCWlmIChFcXVpbm94Q29uc3RhbnRzLk9QVElPTl9GVy5lcXVhbHNJZ25vcmVDYXNlKGVudHJ5KSkKLQkJCXJldHVybiBvc2dpSW5zdGFsbEFyZWEgIT0gbnVsbCA/IG9zZ2lJbnN0YWxsQXJlYSA6IGxhdW5jaGVyRm9sZGVyOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKEVxdWlub3hMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhLCBib29sZWFuIHJlbGF0aXZlLCBib29sZWFuIGJhY2t1cCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBsYXVuY2hlckNvbmZpZ0ZpbGUgPSBFcXVpbm94TWFuaXB1bGF0b3JJbXBsLmdldExhdW5jaGVyQ29uZmlnTG9jYXRpb24obGF1bmNoZXJEYXRhKTsKLQotCQlpZiAobGF1bmNoZXJDb25maWdGaWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJsYXVuY2hlckNvbmZpZ0ZpbGUgY2Fubm90IGJlIHNldC4gbGF1bmNoZXIgZmlsZSBzaG91bGQgYmUgc2V0IGluIGFkdmFuY2UuIik7Ci0JCVV0aWxzLmNyZWF0ZVBhcmVudERpcihsYXVuY2hlckNvbmZpZ0ZpbGUpOwotCQkvLyBiYWNrdXAgZmlsZSBpZiBleGlzdHMuCQkKLQkJaWYgKGJhY2t1cCkKLQkJCWlmIChsYXVuY2hlckNvbmZpZ0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQlGaWxlIGRlc3QgPSBVdGlscy5nZXRTaW1wbGVEYXRhRm9ybWF0dGVkRmlsZShsYXVuY2hlckNvbmZpZ0ZpbGUpOwotCQkJCWlmICghbGF1bmNoZXJDb25maWdGaWxlLnJlbmFtZVRvKGRlc3QpKQotCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWwgdG8gcmVuYW1lIGZyb20gKCIgKyBsYXVuY2hlckNvbmZpZ0ZpbGUgKyAiKSB0byAoIiArIGRlc3QgKyAiKSIpOwotCQkJCUxvZy5sb2coTG9nU2VydmljZS5MT0dfSU5GTywgdGhpcywgInNhdmVDb25maWdzKCkiLCAiU3VjY2VlZCB0byByZW5hbWUgZnJvbSAoIiArIGxhdW5jaGVyQ29uZmlnRmlsZSArICIpIHRvICgiICsgZGVzdCArICIpIik7Ci0JCQl9Ci0KLQkJQnVmZmVyZWRXcml0ZXIgYncgPSBudWxsOwotCQl0cnkgewotCQkJYncgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIobGF1bmNoZXJDb25maWdGaWxlKSk7Ci0KLQkJCVN0cmluZ1tdIGxpbmVzID0gdGhpcy5nZXRDb25maWdGaWxlTGluZXMobGF1bmNoZXJEYXRhLCBsYXVuY2hlckNvbmZpZ0ZpbGUsIHJlbGF0aXZlKTsKLQkJCVN0cmluZyBvc2dpSW5zdGFsbEFyZWEgPSBnZXRMYXVuY2hlcihsaW5lcykgIT0gbnVsbCA/IEVxdWlub3hNYW5pcHVsYXRvckltcGwubWFrZUFic29sdXRlKGdldExhdW5jaGVyKGxpbmVzKS5nZXRQYXRoKCksIGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSkgOiBsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXIoKS5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlTdHJpbmcgcmVzb2x2ZU5leHRMaW5lID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocmVzb2x2ZU5leHRMaW5lICE9IG51bGwpIHsKLQkJCQkJbGluZXNbaV0gPSBFcXVpbm94TWFuaXB1bGF0b3JJbXBsLm1ha2VSZWxhdGl2ZShsaW5lc1tpXSwgcmVzb2x2ZU5leHRMaW5lKTsKLQkJCQkJcmVzb2x2ZU5leHRMaW5lID0gbnVsbDsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXNvbHZlTmV4dExpbmUgPSBuZWVkc1BhdGhSZXNvbHV0aW9uKGxpbmVzW2ldLCBvc2dpSW5zdGFsbEFyZWEsIGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSArIEZpbGUuc2VwYXJhdG9yKTsKLQkJCQkJLy9XZSBkb24ndCB3cml0ZSAtY29uZmlndXJhdGlvbiB3aGVuIGl0IGlzIHRoZSBkZWZhdWx0IHZhbHVlCi0JCQkJCWlmIChFcXVpbm94Q29uc3RhbnRzLk9QVElPTl9DT05GSUdVUkFUSU9OLmVxdWFsc0lnbm9yZUNhc2UobGluZXNbaV0pKSB7Ci0JCQkJCQlyZXNvbHZlTmV4dExpbmUgPSBudWxsOwotCQkJCQkJaWYgKG5ldyBQYXRoKGxpbmVzW2kgKyAxXSkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmVxdWFscyhuZXcgUGF0aChvc2dpSW5zdGFsbEFyZWEpKSkgewotCQkJCQkJCWkrKzsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCVBhdGggY29uZmlnTG9jYXRpb24gPSBuZXcgUGF0aChsaW5lc1tpICsgMV0pOwotCQkJCQkJUGF0aCBvc2dpUGF0aCA9IG5ldyBQYXRoKG9zZ2lJbnN0YWxsQXJlYSk7Ci0JCQkJCQlpbnQgY29tbW9uU2VnbWVudHMgPSBvc2dpUGF0aC5tYXRjaGluZ0ZpcnN0U2VnbWVudHMoY29uZmlnTG9jYXRpb24ucmVtb3ZlTGFzdFNlZ21lbnRzKDEpKTsKLQkJCQkJCWlmIChjb21tb25TZWdtZW50cyA9PSBjb25maWdMb2NhdGlvbi5zZWdtZW50Q291bnQoKSAtIDEpIHsKLQkJCQkJCQlTdHJpbmcgcGF0aCA9ICIiOwotCQkJCQkJCWZvciAoaW50IGogPSBvc2dpUGF0aC5zZWdtZW50Q291bnQoKSAtIGNvbW1vblNlZ21lbnRzOyBqICE9IDA7IGotLSkgewotCQkJCQkJCQlwYXRoICs9ICIuLi8iOwotCQkJCQkJCX0KLQkJCQkJCQlwYXRoICs9ICJjb25maWd1cmF0aW9uIjsKLQkJCQkJCQlsaW5lc1tpICsgMV0gPSBwYXRoOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWJ3LndyaXRlKGxpbmVzW2ldKTsKLQkJCQlidy5uZXdMaW5lKCk7Ci0JCQl9Ci0JCQlidy5mbHVzaCgpOwotCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19JTkZPLCAiTGF1bmNoZXIgQ29uZmlnIGZpbGUgaXMgc2F2ZWQgc3VjY2Vzc2Z1bGx5IGludG86IiArIGxhdW5jaGVyQ29uZmlnRmlsZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYncgIT0gbnVsbCkKLQkJCQlidy5jbG9zZSgpOwotCQkJaWYgKGxhdW5jaGVyRGF0YS5nZXRQcmV2aW91c0xhdW5jaGVySW5pKCkgIT0gbnVsbCkKLQkJCQlsYXVuY2hlckRhdGEuZ2V0UHJldmlvdXNMYXVuY2hlckluaSgpLmRlbGV0ZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94QnVuZGxlc1N0YXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hCdW5kbGVzU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjZGU1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hCdW5kbGVzU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuaW50ZXJuYWwuYWRhcHRvci5FY2xpcHNlRW52aXJvbm1lbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veC51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlscy5TaW1wbGVCdW5kbGVzU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlscy5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWwuY29yZS5GcmFtZXdvcmtQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UubG9nLkxvZ1NlcnZpY2U7Ci0KLXB1YmxpYyBjbGFzcyBFcXVpbm94QnVuZGxlc1N0YXRlIGltcGxlbWVudHMgQnVuZGxlc1N0YXRlIHsKLQlzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1RJTUVTVEFNUCA9IDBMOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQkvLyBXaGlsZSB3ZSByZWNvZ25pemUgdGhlIGFtZDY0IGFyY2hpdGVjdHVyZSwgd2UgY2hhbmdlCi0JLy8gdGhpcyBpbnRlcm5hbGx5IHRvIGJlIHg4Nl82NC4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URVJOQUxfQU1ENjQgPSAiYW1kNjQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMX0FSQ0hfSTM4NiA9ICJpMzg2IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJPUFMgPSB7Im9zZ2kub3MiLCAib3NnaS53cyIsICJvc2dpLm5sIiwgIm9zZ2kuYXJjaCIsIENvbnN0YW50cy5GUkFNRVdPUktfU1lTVEVNUEFDS0FHRVMsICJvc2dpLnJlc29sdmVyTW9kZSIsIENvbnN0YW50cy5GUkFNRVdPUktfRVhFQ1VUSU9ORU5WSVJPTk1FTlQsICJvc2dpLnJlc29sdmVPcHRpb25hbCIsICJvc2dpLmdlbmVyaWNBbGlhc2VzIn07Ci0KLQlzdGF0aWMgYm9vbGVhbiBjaGVja0Z1bGx5U3VwcG9ydGVkKCkgewotCQkvL1RPRE8gLSBUaGlzIHdhcyBwcmV2aW91c2x5IGRvaW5nIGEgYm9ndXMgY2hlY2sgYnkgYXR0ZW1wdGluZyB0byBpbnN0YW50aWF0ZSBhIHBhcnRpY3VsYXIgY2xhc3MgLSBpdCdzIG5vdCBjbGVhciB3aGF0IHRoaXMgaXMgdHJ5aW5nIHRvIGRvCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIGVjbGlwc2UuZXhlIHdpbGwgbGF1bmNoIGEgZncgd2hlcmUgcGx1Z2lucy9vcmcuZWNsaXBzZS5vc2dpXyouKi4qLiouamFyCi0JICogaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgZncuCi0JICogCi0JICogQHBhcmFtIGxhdW5jaGVyRGF0YQotCSAqIEBwYXJhbSBjb25maWdEYXRhCi0JICogQHJldHVybiBGaWxlIG9mIGZ3SmFyIHRvIGJlIHVzZWQuCi0JICovCi0Jc3RhdGljIEZpbGUgZ2V0RndKYXIoTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSwgQ29uZmlnRGF0YSBjb25maWdEYXRhKSB7Ci0JCXJldHVybiBnZXRGd0phcihsYXVuY2hlckRhdGEsIGNvbmZpZ0RhdGEsIHRydWUpOwotCQkvLwotCQkvLyAvLyBFY2xpcHNlTGF1bmNoZXJQYXJzZXIgbGF1bmNoZXJQYXJzZXIgPSBuZXcKLQkJLy8gRWNsaXBzZUxhdW5jaGVyUGFyc2VyKGxhdW5jaGVyRGF0YSk7Ci0JCS8vIC8vIGxhdW5jaGVyUGFyc2VyLnJlYWQoKTsKLQkJLy8gaWYgKGxhdW5jaGVyRGF0YS5nZXRGd0phcigpICE9IG51bGwpCi0JCS8vIHJldHVybiBsYXVuY2hlckRhdGEuZ2V0RndKYXIoKTsKLQkJLy8KLQkJLy8gLy8gY2hlY2sgLUQgYXJndW1lbnRzIG9mIGp2bUFyZ3MgPwotCQkvLyBTdHJpbmdbXSBqdm1BcmdzID0gbGF1bmNoZXJEYXRhLmdldEp2bUFyZ3MoKTsKLQkJLy8gU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBqdm1BcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCS8vIGlmIChqdm1BcmdzW2ldLmVuZHNXaXRoKCItRCIgKyAib3NnaS5mcmFtZXdvcms9IikpIHsKLQkJLy8gbG9jYXRpb24gPSBqdm1BcmdzW2ldLnN1YnN0cmluZygoIi1EIiArICJvc2dpLmZyYW1ld29yaz0iKS5sZW5ndGgoKSk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyBpZiAobG9jYXRpb24gIT0gbnVsbCkKLQkJLy8gcmV0dXJuIG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkJLy8KLQkJLy8gRmlsZSByZXQgPSBnZXRTeXN0ZW1CdW5kbGVGcm9tQnVuZGxlSW5mb3MobGF1bmNoZXJEYXRhLCBjb25maWdEYXRhKTsKLQkJLy8gaWYgKHJldCAhPSBudWxsKQotCQkvLyByZXR1cm4gcmV0OwotCQkvLyByZXR1cm4gZ2V0U3lzdGVtQnVuZGxlQnlTZWFyY2hpbmcobGF1bmNoZXJEYXRhKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlIGdldEZ3SmFyKExhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEsIENvbmZpZ0RhdGEgY29uZmlnRGF0YSwgYm9vbGVhbiBjaGVja0J1bmRsZUluZm9zKSB7Ci0JCS8vIEVjbGlwc2VMYXVuY2hlclBhcnNlciBsYXVuY2hlclBhcnNlciA9IG5ldwotCQkvLyBFY2xpcHNlTGF1bmNoZXJQYXJzZXIobGF1bmNoZXJEYXRhKTsKLQkJLy8gbGF1bmNoZXJQYXJzZXIucmVhZCgpOwotCQlpZiAobGF1bmNoZXJEYXRhLmdldEZ3SmFyKCkgIT0gbnVsbCkgewotCQkJcmV0dXJuIGxhdW5jaGVyRGF0YS5nZXRGd0phcigpOwotCQl9Ci0KLQkJLy8gY2hlY2sgLUQgYXJndW1lbnRzIG9mIGp2bUFyZ3MgPwotCQlTdHJpbmdbXSBqdm1BcmdzID0gbGF1bmNoZXJEYXRhLmdldEp2bUFyZ3MoKTsKLQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqdm1BcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoanZtQXJnc1tpXS5lbmRzV2l0aCgiLUQiICsgIm9zZ2kuZnJhbWV3b3JrPSIpKSB7Ci0JCQkJbG9jYXRpb24gPSBqdm1BcmdzW2ldLnN1YnN0cmluZygoIi1EIiArICJvc2dpLmZyYW1ld29yaz0iKS5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBuZXcgRmlsZShsb2NhdGlvbik7Ci0JCX0KLQotCQlpZiAoY2hlY2tCdW5kbGVJbmZvcykgewotCQkJRmlsZSByZXQgPSBnZXRTeXN0ZW1CdW5kbGVGcm9tQnVuZGxlSW5mb3MoY29uZmlnRGF0YSk7Ci0JCQlpZiAocmV0ICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCQkvLwkJcmV0dXJuIGdldFN5c3RlbUJ1bmRsZUJ5U2VhcmNoaW5nKGxhdW5jaGVyRGF0YSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgbG9uZyBnZXRNYXhJZChTdGF0ZSBzdGF0ZSkgewotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGJ1bmRsZURlc2NyaXB0aW9ucyA9IHN0YXRlLmdldEJ1bmRsZXMoKTsKLQkJbG9uZyBtYXhJZCA9IERFRkFVTFRfVElNRVNUQU1QOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZURlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykKLQkJCWlmIChtYXhJZCA8IGJ1bmRsZURlc2NyaXB0aW9uc1tpXS5nZXRCdW5kbGVJZCgpKSB7Ci0JCQkJbWF4SWQgPSBidW5kbGVEZXNjcmlwdGlvbnNbaV0uZ2V0QnVuZGxlSWQoKTsKLQkJCX0KLQkJcmV0dXJuIG1heElkOwotCX0KLQotCS8vCXByaXZhdGUgc3RhdGljIEZpbGUgZ2V0U3lzdGVtQnVuZGxlQnlTZWFyY2hpbmcoTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSkgewotCS8vCQlGaWxlIHBsdWdpbnNEaXI7Ci0JLy8JCWlmIChsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXIoKSA9PSBudWxsKSB7Ci0JLy8JCQlpZiAobGF1bmNoZXJEYXRhLmdldEhvbWUoKSA9PSBudWxsKQotCS8vCQkJCXJldHVybiBudWxsOwotCS8vCQkJcGx1Z2luc0RpciA9IG5ldyBGaWxlKGxhdW5jaGVyRGF0YS5nZXRIb21lKCksICJwbHVnaW5zIik7Ci0JLy8JCX0gZWxzZSB7Ci0JLy8JCQlwbHVnaW5zRGlyID0gbmV3IEZpbGUobGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCkuZ2V0UGFyZW50RmlsZSgpLCAicGx1Z2lucyIpOwotCS8vCQl9Ci0JLy8KLQkvLwkJU3RyaW5nIGZ1bGxMb2NhdGlvbiA9IEZpbGVVdGlscy5nZXRFY2xpcHNlUGx1Z2luRnVsbExvY2F0aW9uKEVxdWlub3hDb25zdGFudHMuRldfU1lNQk9MSUNfTkFNRSwgcGx1Z2luc0Rpcik7Ci0JLy8JCWlmIChmdWxsTG9jYXRpb24gPT0gbnVsbCkKLQkvLwkJCXJldHVybiBudWxsOwotCS8vCQlVUkwgdXJsID0gbnVsbDsKLQkvLwkJdHJ5IHsKLQkvLwkJCXVybCA9IG5ldyBVUkwoZnVsbExvY2F0aW9uKTsKLQkvLwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkvLwkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkvLwkJCUxvZy5sb2coTG9nU2VydmljZS5MT0dfV0FSTklORywgImZ1bGxMb2NhdGlvbiBpcyBub3QgaW4gcHJvcGVyIGZvcm1hdDoiICsgZnVsbExvY2F0aW9uKTsKLQkvLwkJfQotCS8vCQlyZXR1cm4gdXJsID09IG51bGwgPyBudWxsIDogbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JLy8JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRTeXN0ZW1CdW5kbGVGcm9tQnVuZGxlSW5mb3MoQnVuZGxlSW5mb1tdIGJ1bmRsZUluZm9zKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlSW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgbWF0Y2ggPSBpc1N5c3RlbUJ1bmRsZShidW5kbGVJbmZvc1tpXSk7Ci0JCQlpZiAobWF0Y2ggIT0gbnVsbCkKLQkJCQlyZXR1cm4gbWF0Y2g7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRTeXN0ZW1CdW5kbGVGcm9tQnVuZGxlSW5mb3MoQ29uZmlnRGF0YSBjb25maWdEYXRhKSB7Ci0JCUJ1bmRsZUluZm9bXSBidW5kbGVJbmZvcyA9IGNvbmZpZ0RhdGEuZ2V0QnVuZGxlcygpOwotCQlyZXR1cm4gZ2V0U3lzdGVtQnVuZGxlRnJvbUJ1bmRsZUluZm9zKGJ1bmRsZUluZm9zKTsKLQl9Ci0KLQlzdGF0aWMgbG9uZyBnZXRUaW1lU3RhbXAoRmlsZSBmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24pIHsKLQkJaWYgKGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIERFRkFVTFRfVElNRVNUQU1QOwotCi0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiwgRXF1aW5veENvbnN0YW50cy5QRVJTSVNURU5UX0RJUl9OQU1FKTsKLQkJaWYgKCFmaWxlLmV4aXN0cygpIHx8ICFmaWxlLmlzRGlyZWN0b3J5KCkpCi0JCQlyZXR1cm4gREVGQVVMVF9USU1FU1RBTVA7Ci0JCWxvbmcgcmV0ID0gZmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJRmlsZVtdIGxpc3RzID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJaWYgKGxpc3RzID09IG51bGwpCi0JCQlyZXR1cm4gcmV0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RzLmxlbmd0aDsgaSsrKQotCQkJaWYgKHJldCA8IGxpc3RzW2ldLmxhc3RNb2RpZmllZCgpKQotCQkJCXJldCA9IGxpc3RzW2ldLmxhc3RNb2RpZmllZCgpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBpc1N5c3RlbUJ1bmRsZShCdW5kbGVJbmZvIGJ1bmRsZUluZm8pIHsKLQkJaWYgKGJ1bmRsZUluZm8gPT0gbnVsbCB8fCBidW5kbGVJbmZvLmdldExvY2F0aW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgYnVuZGxlTG9jYXRpb24gPSBidW5kbGVJbmZvLmdldExvY2F0aW9uKCk7Ci0JCWlmIChidW5kbGVMb2NhdGlvbi5zdGFydHNXaXRoKEVxdWlub3hDb25zdGFudHMuUkVGRVJFTkNFKSkKLQkJCWJ1bmRsZUxvY2F0aW9uID0gYnVuZGxlTG9jYXRpb24uc3Vic3RyaW5nKEVxdWlub3hDb25zdGFudHMuUkVGRVJFTkNFLmxlbmd0aCgpKTsKLQkJaWYgKGJ1bmRsZUxvY2F0aW9uLnN0YXJ0c1dpdGgoImZpbGU6IikpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nW10gY2xhdXNlcyA9IFV0aWxzLmdldENsYXVzZXNNYW5pZmVzdE1haW5BdHRyaWJ1dGVzKGJ1bmRsZUxvY2F0aW9uLCBDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSk7Ci0JCQkJaWYgKGJ1bmRsZUxvY2F0aW9uLmluZGV4T2YoRXF1aW5veENvbnN0YW50cy5GV19TWU1CT0xJQ19OQU1FKSA+IDApCi0JCQkJCWlmIChFcXVpbm94Q29uc3RhbnRzLlBFUlNJU1RFTlRfRElSX05BTUUuZXF1YWxzKFV0aWxzLmdldFBhdGhGcm9tQ2xhdXNlKGNsYXVzZXNbMF0pKSkKLQkJCQkJCXJldHVybiBuZXcgRmlsZShidW5kbGVMb2NhdGlvbi5zdWJzdHJpbmcoImZpbGU6Ii5sZW5ndGgoKSkpOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8vICJvc2dpLm9zIiwgIm9zZ2kud3MiLCAib3NnaS5ubCIsICJvc2dpLmFyY2giLAotCS8vIENvbnN0YW50cy5GUkFNRVdPUktfU1lTVEVNUEFDS0FHRVMsICJvc2dpLnJlc29sdmVyTW9kZSIsCi0JLy8gQ29uc3RhbnRzLkZSQU1FV09SS19FWEVDVVRJT05FTlZJUk9OTUVOVCwgIm9zZ2kucmVzb2x2ZU9wdGlvbmFsIgotCXN0YXRpYyBQcm9wZXJ0aWVzIHNldERlZmF1bHRQbGF0Zm9ybVByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcGxhdGZvcm1Qcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJLy8gc2V0IGRlZmF1bHQgdmFsdWUKLQotCQlTdHJpbmcgbmwgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpLnRvU3RyaW5nKCk7Ci0JCXBsYXRmb3JtUHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3NnaS5ubCIsIG5sKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFRPRE8gcmVtb3ZlIEVjbGlwc2VFbnZpcm9ubWVudElub2YKLQkJU3RyaW5nIG9zID0gRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc09TKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpKTsvLyROT04tTkxTLTEkKTsKLQkJcGxhdGZvcm1Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJvc2dpLm9zIiwgb3MpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHdzID0gRWNsaXBzZUVudmlyb25tZW50SW5mby5ndWVzc1dTKG9zKTsKLQkJcGxhdGZvcm1Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJvc2dpLndzIiwgd3MpOwotCi0JCS8vIGlmIHRoZSB1c2VyIGRpZG4ndCBzZXQgdGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgd2l0aCBhIGNvbW1hbmQgbGluZQotCQkvLyBhcmd1bWVudCB0aGVuIHVzZSB0aGUgZGVmYXVsdC4KLQkJU3RyaW5nIGFyY2ggPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9IEZyYW1ld29ya1Byb3BlcnRpZXMuZ2V0UHJvcGVydHkoIm9zLmFyY2giKTsvLyROT04tTkxTLTEkCi0JCS8vIE1hcCBpMzg2IGFyY2hpdGVjdHVyZSB0byB4ODYKLQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShJTlRFUk5BTF9BUkNIX0kzODYpKQotCQkJYXJjaCA9IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHMuQVJDSF9YODY7Ci0JCS8vIE1hcCBhbWQ2NCBhcmNoaXRlY3R1cmUgdG8geDg2XzY0Ci0JCWVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShJTlRFUk5BTF9BTUQ2NCkpCi0JCQlhcmNoID0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5BUkNIX1g4Nl82NDsKLQkJZWxzZQotCQkJYXJjaCA9IG5hbWU7Ci0JCXBsYXRmb3JtUHJvcGVydGllcy5zZXRQcm9wZXJ0eSgib3NnaS5hcmNoIiwgYXJjaCk7IC8vJE5PTi1OTFMtMSQJCQkKLQotCQlwbGF0Zm9ybVByb3BlcnRpZXMuc2V0UHJvcGVydHkoQ29uc3RhbnRzLkZSQU1FV09SS19TWVNURU1QQUNLQUdFUywgRnJhbWV3b3JrUHJvcGVydGllcy5nZXRQcm9wZXJ0eShDb25zdGFudHMuRlJBTUVXT1JLX1NZU1RFTVBBQ0tBR0VTKSk7Ci0JCXBsYXRmb3JtUHJvcGVydGllcy5zZXRQcm9wZXJ0eShDb25zdGFudHMuRlJBTUVXT1JLX0VYRUNVVElPTkVOVklST05NRU5ULCBGcmFtZXdvcmtQcm9wZXJ0aWVzLmdldFByb3BlcnR5KENvbnN0YW50cy5GUkFNRVdPUktfRVhFQ1VUSU9ORU5WSVJPTk1FTlQpKTsKLQkJcGxhdGZvcm1Qcm9wZXJ0aWVzLnNldFByb3BlcnR5KCJvc2dpLnJlc29sdmVPcHRpb25hbCIsICIiICsgInRydWUiLmVxdWFscyhGcmFtZXdvcmtQcm9wZXJ0aWVzLmdldFByb3BlcnR5KCJvc2dpLnJlc29sdmVPcHRpb25hbCIpKSk7Ci0JCXJldHVybiBwbGF0Zm9ybVByb3BlcnRpZXM7Ci0JfQotCi0JRXF1aW5veEZ3QWRtaW5JbXBsIGZ3QWRtaW4gPSBudWxsOwotCi0JQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0JTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSBudWxsOwotCVByb3BlcnRpZXMgcGxhdGZyb21Qcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotCWxvbmcgbWF4SWQgPSBERUZBVUxUX1RJTUVTVEFNUDsKLQotCVN0YXRlT2JqZWN0RmFjdG9yeSBzb0ZhY3RvcnkgPSBudWxsOwotCi0JU3RhdGUgc3RhdGUgPSBudWxsOwotCi0JLyoqCi0JICogSWYgdXNlRndQZXJzaXN0ZW50RGF0YSBmbGFnIGVxdWFscyBmYWxzZSwgdGhpcyBjb25zdHJ1Y3RvciB3aWxsIG5vdCB0YWtlCi0JICogYSBmcmFtZXdvcmsgcGVyc2lzdGVudCBkYXRhIGludG8gYWNjb3VudC4gT3RoZXJ3aXNlLCBpdCB3aWxsLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHBhcmFtIGZ3QWRtaW4KLQkgKiBAcGFyYW0gbWFuaXB1bGF0b3IKLQkgKiBAcGFyYW0gdXNlRndQZXJzaXN0ZW50RGF0YQotCSAqLwotCUVxdWlub3hCdW5kbGVzU3RhdGUoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBFcXVpbm94RndBZG1pbkltcGwgZndBZG1pbiwgTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IsIGJvb2xlYW4gdXNlRndQZXJzaXN0ZW50RGF0YSkgewotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLmZ3QWRtaW4gPSBmd0FkbWluOwotCQkvLyBjb3B5IG1hbmlwdWxhdG9yIG9iamVjdCBmb3IgYXZvaWRpbmcgbW9kaWZ5aW5nIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZQotCQkvLyBtYW5pcHVsYXRvci4KLQkJdGhpcy5tYW5pcHVsYXRvciA9IGZ3QWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQkJdGhpcy5tYW5pcHVsYXRvci5zZXRDb25maWdEYXRhKG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKSk7Ci0JCXRoaXMubWFuaXB1bGF0b3Iuc2V0TGF1bmNoZXJEYXRhKG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpKTsKLQkJaW5pdGlhbGl6ZSh1c2VGd1BlcnNpc3RlbnREYXRhKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGRvZXMgTk9UIHRha2UgYSBmcmFtZXdvcmsgcGVyc2lzdGVudCBkYXRhIGludG8gYWNjb3VudC4KLQkgKiBJdCB3aWxsIGNyZWF0ZSBTdGF0ZSBvYmplY3QgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBwbGF0Zm9ybVByb3BlcnRpZXMuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcGFyYW0gZndBZG1pbgotCSAqIEBwYXJhbSBtYW5pcHVsYXRvcgotCSAqIEBwYXJhbSBwbGF0Zm9ybVByb3BlcnRpZXMKLQkgKi8KLQlFcXVpbm94QnVuZGxlc1N0YXRlKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgRXF1aW5veEZ3QWRtaW5JbXBsIGZ3QWRtaW4sIE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yLCBQcm9wZXJ0aWVzIHBsYXRmb3JtUHJvcGVydGllcykgewotCQlzdXBlcigpOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLmZ3QWRtaW4gPSBmd0FkbWluOwotCQkvLyBjb3B5IG1hbmlwdWxhdG9yIG9iamVjdCBmb3IgYXZvaWRpbmcgbW9kaWZ5aW5nIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZQotCQkvLyBtYW5pcHVsYXRvci4KLQkJdGhpcy5tYW5pcHVsYXRvciA9IGZ3QWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQkJdGhpcy5tYW5pcHVsYXRvci5zZXRDb25maWdEYXRhKG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKSk7Ci0JCXRoaXMubWFuaXB1bGF0b3Iuc2V0TGF1bmNoZXJEYXRhKG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpKTsKLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlDb25maWdEYXRhIGNvbmZpZ0RhdGEgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCk7Ci0JCUJ1bmRsZUluZm9bXSBiSW5mb3MgPSBjb25maWdEYXRhLmdldEJ1bmRsZXMoKTsKLQkJdGhpcy5jb21wb3NlTmV3U3RhdGUobGF1bmNoZXJEYXRhLCBjb25maWdEYXRhLCBwbGF0Zm9ybVByb3BlcnRpZXMsIGJJbmZvcyk7Ci0JfQotCi0JLyoqCi0JICogY29tcG9zZSBuZXcgc3RhdGUgd2l0aG91dCByZWFkaW5nIGZyYW1ld29yayBwZXJzaXN0ZW50IGRhdGEuIFRoZQotCSAqIGNvbmZpZ0RhdGEuZ2V0RndEZXBlbmRlbnRQcm9wcygpIGlzIHVzZWQgZm9yIHRoZSBjb21wb3NpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoZXJEYXRhCi0JICogQHBhcmFtIGNvbmZpZ0RhdGEKLQkgKiBAcGFyYW0gYkluZm9zCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbXBvc2VOZXdTdGF0ZShMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhLCBDb25maWdEYXRhIGNvbmZpZ0RhdGEsIEJ1bmRsZUluZm9bXSBiSW5mb3MpIHsKLQkJdGhpcy5jb21wb3NlTmV3U3RhdGUobGF1bmNoZXJEYXRhLCBjb25maWdEYXRhLCBjb25maWdEYXRhLmdldEZ3RGVwZW5kZW50UHJvcHMoKSwgYkluZm9zKTsKLQl9Ci0KLQkvKioKLQkgKiBjb21wb3NlIG5ldyBzdGF0ZSB3aXRob3V0IHJlYWRpbmcgZnJhbWV3b3JrIHBlcnNpc3RlbnQgZGF0YS4gVGhlIGdpdmVuCi0JICogcHJvcGVydGllcyBpcyB1c2VkIGZvciB0aGUgY29tcG9zaXRpb24uIElmIHN5c3RlbSBidW5kbGUgaXMgbm90IGluY2x1ZGVkCi0JICogaW4gdGhlIGdpdmVuIGJJbmZvcywgdGhlIGZ3IGphciBsYXVuY2hlckRhdGEgY29udGFpbnMgd2lsbCBiZSB1c2VkLgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2hlckRhdGEKLQkgKiBAcGFyYW0gY29uZmlnRGF0YQotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzCi0JICogQHBhcmFtIGJJbmZvcwotCSAqLwotCXByaXZhdGUgdm9pZCBjb21wb3NlTmV3U3RhdGUoTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSwgQ29uZmlnRGF0YSBjb25maWdEYXRhLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIEJ1bmRsZUluZm9bXSBiSW5mb3MpIHsKLQkJLy9Ob3RlLCB0aGVyZSB1c2UgdG8gYmUgYSBsb3QgbW9yZSBjb2RlIGluIHRoaXMgbWV0aG9kCi0JCUZpbGUgZndKYXIgPSBnZXRTeXN0ZW1CdW5kbGVGcm9tQnVuZGxlSW5mb3MoY29uZmlnRGF0YSk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRGd0phcihmd0phcik7Ci0JCXRoaXMuc2V0RndKYXIoZndKYXIpOwotCQljb21wb3NlU3RhdGUoY29uZmlnRGF0YS5nZXRCdW5kbGVzKCksIHByb3BlcnRpZXMsIG51bGwpOwotCQlyZXNvbHZlKHRydWUpOwotCX0KLQotCS8qKgotCSAqIGNvbXBvc2Ugc3RhdGUuIElmIGl0IGNhbm5vdCBjb21wb3NlIGl0IGJ5IHNvbWVob3csIGZhbHNlIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBiSW5mb3MKLQkgKiBAcGFyYW0gcHJvcHMKLQkgKiBAcGFyYW0gZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uCi0JICogQHJldHVybiBpZiBpdCBjYW5ub3QgY29tcG9zZSBpdCBieSBzb21laG93LCBmYWxzZSBpcyByZXR1cm5lZC4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNvbXBvc2VTdGF0ZShCdW5kbGVJbmZvW10gYkluZm9zLCBEaWN0aW9uYXJ5IHByb3BzLCBGaWxlIGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJQnVuZGxlSW5mb1tdIGluZm9zID0gbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJdGhpcy5tYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuc2V0QnVuZGxlcyhudWxsKTsKLQkJU2ltcGxlQnVuZGxlc1N0YXRlLmNoZWNrQXZhaWxhYmlsaXR5KGZ3QWRtaW4pOwotCQl0aGlzLnNldFN0YXRlT2JqZWN0RmFjdG9yeSgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGNhY2hlZEluc3RhbGxlZEJ1bmRsZXMgPSBudWxsOwotCQlzdGF0ZSA9IG51bGw7Ci0JCWJvb2xlYW4gZmxhZ05ld1N0YXRlID0gZmFsc2U7Ci0JCWlmIChmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24gIT0gbnVsbCkgewotCQkJLy9OT1RFIEhlcmUgdGhlcmUgd2FzIGEgYmlnIGNodW5rIG9mIGNvZGUgcmVhZGluZyB0aGUgZnJhbWV3b3JrIHN0YXRlIHBlcnNpc3RlZCBvbiBkaXNrCi0JCQkvLyBhbmQgSSByZW1vdmVkIGl0IGJlY2F1c2UgaXQgd2FzIGNhdXNpbmcgdmFyaW91cyBwcm9ibGVtcy4gU2VlIGluIHByZXZpb3VzIHJldmlzaW9uCi0JCQl0aGlzLm1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5zZXRCdW5kbGVzKGluZm9zKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlzdGF0ZSA9IHNvRmFjdG9yeS5jcmVhdGVTdGF0ZSh0cnVlKTsKLQkJZmxhZ05ld1N0YXRlID0gdHJ1ZTsKLQkJY2FjaGVkSW5zdGFsbGVkQnVuZGxlcyA9IG5ldyBCdW5kbGVEZXNjcmlwdGlvblswXTsKLQkJaWYgKHByb3BzID09IG51bGwpIHsKLQkJCXRoaXMubWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnNldEJ1bmRsZXMoaW5mb3MpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXNldFBsYXRmb3JtUHJvcGVydGllc1RvU3RhdGUocHJvcHMpOwotCQlzZXRQbGF0Zm9ybVByb3BlcnRpZXMoc3RhdGUpOwotCi0JCS8vIHJlbW92ZSBpbml0aWFsIGJ1bmRsZSB3aGljaCB3ZXJlIGluc3RhbGxlZCBidXQgbm90IGxpc3RlZCBpbgotCQkvLyBmd0NvbmZpZ0ZpbGVCSW5mb3MuCi0JCS8vIGJ1bmRsZUxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QoY2FjaGVkSW5zdGFsbGVkQnVuZGxlcykpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlZEluc3RhbGxlZEJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjYWNoZWRJbnN0YWxsZWRCdW5kbGVzW2ldLmdldExvY2F0aW9uKCkuc3RhcnRzV2l0aCgiaW5pdGlhbEAiKSkgewotCQkJCVN0cmluZyBsb2NhdGlvbiA9IEZpbGVVdGlscy5nZXRSZWFsTG9jYXRpb24obWFuaXB1bGF0b3IsIGNhY2hlZEluc3RhbGxlZEJ1bmRsZXNbaV0uZ2V0TG9jYXRpb24oKSwgdHJ1ZSk7Ci0JCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYkluZm9zLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmIChiSW5mb3Nbal0uZ2V0TG9jYXRpb24oKS5lcXVhbHMobG9jYXRpb24pKSB7Ci0JCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIWZvdW5kKQotCQkJCQlzdGF0ZS5yZW1vdmVCdW5kbGUoY2FjaGVkSW5zdGFsbGVkQnVuZGxlc1tpXS5nZXRCdW5kbGVJZCgpKTsKLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQltYXhJZCA9IHN0YXRlLmdldEhpZ2hlc3RCdW5kbGVJZCgpOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBlKSB7Ci0JCQltYXhJZCA9IGdldE1heElkKHN0YXRlKTsKLQkJfQotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIik7Ci0JCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0RFQlVHLCB0aGlzLCAiY29tcG9zZUV4cGVjdGVkU3RhdGUoKSIsICJpbnN0YWxsQnVuZGxlKCk6Iik7Ci0JCX0KLQkJaWYgKGZsYWdOZXdTdGF0ZSkgewotCQkJaW50IGluZGV4U3lzdGVtQnVuZGxlID0gLTE7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGJJbmZvcy5sZW5ndGg7IGorKykKLQkJCQlpZiAoaXNTeXN0ZW1CdW5kbGUoYkluZm9zW2pdKSAhPSBudWxsKSB7Ci0JCQkJCWluZGV4U3lzdGVtQnVuZGxlID0gajsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQlpZiAoaW5kZXhTeXN0ZW1CdW5kbGUgPiAwKSB7Ci0JCQkJQnVuZGxlSW5mb1tdIG5ld0J1bmRsZUluZm9zID0gbmV3IEJ1bmRsZUluZm9bYkluZm9zLmxlbmd0aF07Ci0JCQkJbmV3QnVuZGxlSW5mb3NbMF0gPSBiSW5mb3NbaW5kZXhTeXN0ZW1CdW5kbGVdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoYkluZm9zLCAwLCBuZXdCdW5kbGVJbmZvcywgMSwgaW5kZXhTeXN0ZW1CdW5kbGUpOwotCQkJCWlmIChpbmRleFN5c3RlbUJ1bmRsZSA8IGJJbmZvcy5sZW5ndGggLSAxKQotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGJJbmZvcywgaW5kZXhTeXN0ZW1CdW5kbGUgKyAxLCBuZXdCdW5kbGVJbmZvcywgaW5kZXhTeXN0ZW1CdW5kbGUgKyAxLCBiSW5mb3MubGVuZ3RoIC0gaW5kZXhTeXN0ZW1CdW5kbGUgLSAxKTsKLQkJCQliSW5mb3MgPSBuZXdCdW5kbGVJbmZvczsKLQkJCX0KLQkJfQotCQlmb3IgKGludCBqID0gMDsgaiA8IGJJbmZvcy5sZW5ndGg7IGorKykgewotCQkJaWYgKERFQlVHKQotCQkJCUxvZy5sb2coTG9nU2VydmljZS5MT0dfREVCVUcsIHRoaXMsICJjb21wb3NlRXhwZWN0ZWRTdGF0ZSgpIiwgImJJbmZvc1siICsgaiArICJdPSIgKyBiSW5mb3Nbal0pOwotCQkJdHJ5IHsKLQkJCQl0aGlzLmluc3RhbGxCdW5kbGUoYkluZm9zW2pdKTsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImluc3RhbGwgYkluZm9zWyIgKyBqICsgIl09IiArIGJJbmZvc1tqXSk7Ci0JCQl9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCQkvL2NhdGNoIHRoZSBleGNlcHRpb24gYW5kIGNvbnRpbnVlCi0JCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19FUlJPUiwgdGhpcywgImNvbXBvc2VFeHBlY3RlZFN0YXRlKCkiLCAiQnVuZGxlSW5mbzoiICsgYkluZm9zW2pdLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mbyBjb252ZXJ0KEJ1bmRsZURlc2NyaXB0aW9uIHRvQ29udmVydCkgewotCQlib29sZWFuIG1hcmtlZEFzU3RhcnRlZCA9IGZhbHNlOwotCQlpbnQgc2wgPSBCdW5kbGVJbmZvLk5PX0xFVkVMOwotCi0JCVN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0JCS8vIFRoaXMgYWxnb3JpdGhtIGlzIG5vdCBzb3BoaXN0aWNhdGVkLgotCQlpZiAodG9Db252ZXJ0LmdldEJ1bmRsZUlkKCkgPT0gMCAmJiBFcXVpbm94Q29uc3RhbnRzLkZXX1NZTUJPTElDX05BTUUuZXF1YWxzKHRvQ29udmVydC5nZXRTeW1ib2xpY05hbWUoKSkpIHsKLQkJCS8vIENvbnZlcnRpbmcgdGhlIFN5c3RlbSBCdW5kbGUKLQkJCVN0cmluZyBzeW1ib2xpY05hbWVUYXJnZXQgPSB0b0NvbnZlcnQuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JCQlWZXJzaW9uIHZlcnNpb25UYXJnZXQgPSB0b0NvbnZlcnQuZ2V0VmVyc2lvbigpOwotCQkJdHJ5IHsKLQkJCQlGaWxlIGZ3SmFyID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkuZ2V0RndKYXIoKTsKLQkJCQlpZiAoZndKYXIgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZndKYXJMb2NhdGlvbiA9IGZ3SmFyLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCQkJU3RyaW5nW10gY2xhdXNlcyA9IFV0aWxzLmdldENsYXVzZXNNYW5pZmVzdE1haW5BdHRyaWJ1dGVzKGZ3SmFyTG9jYXRpb24sIENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJCQkJU3RyaW5nIGZ3SmFyU3ltYm9saWNOYW1lID0gVXRpbHMuZ2V0UGF0aEZyb21DbGF1c2UoY2xhdXNlc1swXSk7Ci0JCQkJCVN0cmluZyBmd0phclZlcnNpb25TdCA9IFV0aWxzLmdldE1hbmlmZXN0TWFpbkF0dHJpYnV0ZXMoZndKYXJMb2NhdGlvbiwgQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKTsKLQkJCQkJaWYgKGZ3SmFyU3ltYm9saWNOYW1lLmVxdWFscyhzeW1ib2xpY05hbWVUYXJnZXQpICYmIGZ3SmFyVmVyc2lvblN0LmVxdWFscyh2ZXJzaW9uVGFyZ2V0LnRvU3RyaW5nKCkpKSB7Ci0JCQkJCQlsb2NhdGlvbiA9IGZ3SmFyTG9jYXRpb247Ci0JCQkJCQltYXJrZWRBc1N0YXJ0ZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBjYXRjaCAoRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIGUxKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJbG9jYXRpb24gPSBGaWxlVXRpbHMuZ2V0RWNsaXBzZVJlYWxMb2NhdGlvbihtYW5pcHVsYXRvciwgdG9Db252ZXJ0LmdldExvY2F0aW9uKCkpOwotCQkJQnVuZGxlSW5mb1tdIG9yaWdpbmFsQkluZm9zID0gbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJCS8vIGlmIChERUJVRykKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidG9Db252ZXJ0PSIgKyBsb2NhdGlvbik7Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9yaWdpbmFsQkluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJLy8gaWYgKERFQlVHKQotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigib3JpZ2luYWxCSW5mb3NbIiArIGkgKyAiXT0iICsKLQkJCQkvLyBvcmlnaW5hbEJJbmZvc1tpXS5nZXRMb2NhdGlvbigpKTsKLQkJCQlpZiAob3JpZ2luYWxCSW5mb3NbaV0uZ2V0TG9jYXRpb24oKS5lcXVhbHMobG9jYXRpb24pKSB7Ci0JCQkJCW1hcmtlZEFzU3RhcnRlZCA9IG9yaWdpbmFsQkluZm9zW2ldLmlzTWFya2VkQXNTdGFydGVkKCk7Ci0JCQkJCXNsID0gZ2V0U3RhcnRMZXZlbChvcmlnaW5hbEJJbmZvc1tpXS5nZXRTdGFydExldmVsKCkpOwotCQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZm91bmQpIHsKLQkJCQkvLyBUT0RPIGN1cnJlbnQgZXF1aW5veCBpbXBsIGhhcyBubyB3YXkgdG8gZ2V0IHRoZSBzdGFydCBsZXZlbAotCQkJCS8vIGluZm8gcGVyc2lzdGVudGx5IHN0b3JlZC4KLQkJCQltYXJrZWRBc1N0YXJ0ZWQgPSBmYWxzZTsKLQkJCQlzbCA9IEJ1bmRsZUluZm8uTk9fTEVWRUw7Ci0JCQl9Ci0JCX0KLQkJQnVuZGxlSW5mbyByZXN1bHQgPSBuZXcgQnVuZGxlSW5mbygpOwotCQlyZXN1bHQuc2V0U3ltYm9saWNOYW1lKHRvQ29udmVydC5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCXJlc3VsdC5zZXRWZXJzaW9uKHRvQ29udmVydC5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5zZXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCXJlc3VsdC5zZXRSZXNvbHZlZCh0b0NvbnZlcnQuaXNSZXNvbHZlZCgpKTsKLQkJcmVzdWx0LnNldE1hcmtlZEFzU3RhcnRlZChtYXJrZWRBc1N0YXJ0ZWQpOwotCQlyZXN1bHQuc2V0U3RhcnRMZXZlbChzbCk7Ci0JCXJlc3VsdC5zZXRCdW5kbGVJZCh0b0NvbnZlcnQuZ2V0QnVuZGxlSWQoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEJ1bmRsZUluZm9bXSBjb252ZXJ0U3RhdGUoQnVuZGxlRGVzY3JpcHRpb25bXSBidW5kbGVzKSB7Ci0JCUJ1bmRsZUluZm9bXSByZXN1bHQgPSBuZXcgQnVuZGxlSW5mb1tidW5kbGVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gY29udmVydChidW5kbGVzW2ldKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvW10gZ2V0RXhwZWN0ZWRTdGF0ZSgpIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQlTaW1wbGVCdW5kbGVzU3RhdGUuY2hlY2tBdmFpbGFiaWxpdHkoZndBZG1pbik7Ci0JCXJldHVybiBjb252ZXJ0U3RhdGUoc3RhdGUuZ2V0QnVuZGxlcygpKTsKLQl9Ci0KLQlQcm9wZXJ0aWVzIGdldFBsYXRmb3JtUHJvcGVydGllcygpIHsKLQkJcmV0dXJuIHBsYXRmcm9tUHJvcGVydGllczsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mb1tdIGdldFByZXJlcXVpc3RlQnVuZGxlcyhCdW5kbGVJbmZvIGJJbmZvKSB7Ci0JCVNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGUgPSBzdGF0ZS5nZXRCdW5kbGVCeUxvY2F0aW9uKGJJbmZvLmdldExvY2F0aW9uKCkpOwotCQlJbXBvcnRQYWNrYWdlU3BlY2lmaWNhdGlvbltdIGltcG9ydHMgPSBidW5kbGUuZ2V0SW1wb3J0UGFja2FnZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbXBvcnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlCYXNlRGVzY3JpcHRpb24gc3VwcGxpZXIgPSBpbXBvcnRzW2ldLmdldFN1cHBsaWVyKCk7Ci0JCQlpZiAoc3VwcGxpZXIgPT0gbnVsbCkgewotCQkJCWlmICghaW1wb3J0c1tpXS5nZXREaXJlY3RpdmUoQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFKS5lcXVhbHMoSW1wb3J0UGFja2FnZVNwZWNpZmljYXRpb24uUkVTT0xVVElPTl9PUFRJT05BTCkpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludGVybmFsIGVycm9yOiBpbXBvcnQgc3VwcGxpZXIgc2hvdWxkIG5vdCBiZSBudWxsIik7Ci0JCQl9IGVsc2UKLQkJCQlzZXQuYWRkKHN1cHBsaWVyLmdldFN1cHBsaWVyKCkpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHN1cHBsaWVyLmdldFN1cHBsaWVyKCkpOwotCQl9Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gcmVxdWlyZXMgPSBidW5kbGUuZ2V0UmVzb2x2ZWRSZXF1aXJlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXVpcmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzZXQuYWRkKHJlcXVpcmVzW2ldKTsKLQkJfQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGJ1bmRsZXMgPSBuZXcgQnVuZGxlRGVzY3JpcHRpb25bc2V0LnNpemUoKV07Ci0JCXNldC50b0FycmF5KGJ1bmRsZXMpOwotCQlyZXR1cm4gY29udmVydFN0YXRlKGJ1bmRsZXMpOwotCX0KLQotCXByaXZhdGUgaW50IGdldFN0YXJ0TGV2ZWwoaW50IHN0YXJ0TGV2ZWwpIHsKLQkJcmV0dXJuIChzdGFydExldmVsID09IEJ1bmRsZUluZm8uTk9fTEVWRUwgPyBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0SW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwoKSA6IHN0YXJ0TGV2ZWwpOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvIGdldFN5c3RlbUJ1bmRsZSgpIHsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gdGhpcy5nZXRTeXN0ZW1CdW5kbGVEZXNjcmlwdGlvbigpOwotCQlyZXR1cm4gKGJ1bmRsZSAhPSBudWxsID8gY29udmVydChidW5kbGUpIDogbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBCdW5kbGVEZXNjcmlwdGlvbiBnZXRTeXN0ZW1CdW5kbGVEZXNjcmlwdGlvbigpIHsKLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlID0gc3RhdGUuZ2V0QnVuZGxlKDApOwotCQlpZiAoYnVuZGxlID09IG51bGwgfHwgYnVuZGxlLmdldEhvc3QoKSAhPSBudWxsKSB7IC8vIG51bGwgb3IgYQotCQkJLy8gZnJhZ21lbnQgYnVuZGxlLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJLy8gaWYgKERFQlVHKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRXF1aW5veENvbnN0YW50cy5GV19TWU1CT0xJQ19OQU1FPSIgKwotCQkvLyBFcXVpbm94Q29uc3RhbnRzLkZXX1NZTUJPTElDX05BTUUpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKT0iICsKLQkJLy8gYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJLy8gfQotCQlyZXR1cm4gKEVxdWlub3hDb25zdGFudHMuRldfU1lNQk9MSUNfTkFNRS5lcXVhbHMoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKSA/IGJ1bmRsZSA6IG51bGwpOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvW10gZ2V0U3lzdGVtRnJhZ21lbnRlZEJ1bmRsZXMoKSB7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZSA9IHRoaXMuZ2V0U3lzdGVtQnVuZGxlRGVzY3JpcHRpb24oKTsKLQkJaWYgKGJ1bmRsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBjb252ZXJ0U3RhdGUoYnVuZGxlLmdldEZyYWdtZW50cygpKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VW5zYXRpc2ZpZWRDb25zdHJhaW50cyhCdW5kbGVJbmZvIGJJbmZvKSB7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gc3RhdGUuZ2V0QnVuZGxlQnlMb2NhdGlvbihiSW5mby5nZXRMb2NhdGlvbigpKTsKLQkJUGxhdGZvcm1BZG1pbiBwbGF0Zm9ybUFkbWluID0gKFBsYXRmb3JtQWRtaW4pIEFjdGl2YXRvci5hY3F1aXJlU2VydmljZShQbGF0Zm9ybUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCVN0YXRlSGVscGVyIGhlbHBlciA9IHBsYXRmb3JtQWRtaW4uZ2V0U3RhdGVIZWxwZXIoKTsKLQkJVmVyc2lvbkNvbnN0cmFpbnRbXSBjb25zdHJhaW50cyA9IGhlbHBlci5nZXRVbnNhdGlzZmllZENvbnN0cmFpbnRzKGRlc2NyaXB0aW9uKTsKLQkJU3RyaW5nW10gcmV0ID0gbmV3IFN0cmluZ1tjb25zdHJhaW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnN0cmFpbnRzLmxlbmd0aDsgaSsrKQotCQkJcmV0W2ldID0gY29uc3RyYWludHNbaV0udG9TdHJpbmcoKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZShib29sZWFuIHVzZUZ3UGVyc2lzdGVudERhdGEpIHsKLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlDb25maWdEYXRhIGNvbmZpZ0RhdGEgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCk7Ci0JCUJ1bmRsZUluZm9bXSBiSW5mb3MgPSBjb25maWdEYXRhLmdldEJ1bmRsZXMoKTsKLQotCQlpZiAoIXVzZUZ3UGVyc2lzdGVudERhdGEpIHsKLQkJCWNvbXBvc2VOZXdTdGF0ZShsYXVuY2hlckRhdGEsIGNvbmZpZ0RhdGEsIGJJbmZvcyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFcXVpbm94TWFuaXB1bGF0b3JJbXBsLmNoZWNrQ29uc2lzdGVuY3lPZkZ3Q29uZmlnTG9jQW5kRndQZXJzaXN0ZW50RGF0YUxvYyhsYXVuY2hlckRhdGEpOwotCQlpZiAobGF1bmNoZXJEYXRhLmlzQ2xlYW4oKSkgewotCQkJY29tcG9zZU5ld1N0YXRlKGxhdW5jaGVyRGF0YSwgY29uZmlnRGF0YSwgYkluZm9zKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKS5nZXRGd1BlcnNpc3RlbnREYXRhTG9jYXRpb24oKSA9PSBudWxsKSB7Ci0JCQkJLy8gVE9ETyBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSBzZXQgbW9yZSBwcmVjaXNlbHkuCi0JCQkJRmlsZSBpbnN0YWxsQXJlYSA9IG51bGw7Ci0JCQkJU3RyaW5nIGluc3RhbGxBcmVhU3QgPSBjb25maWdEYXRhLmdldEZ3RGVwZW5kZW50UHJvcChFcXVpbm94Q29uc3RhbnRzLlBST1BfSU5TVEFMTCk7Ci0JCQkJaWYgKGluc3RhbGxBcmVhU3QgPT0gbnVsbCkgewotCQkJCQlpZiAobWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkuZ2V0TGF1bmNoZXIoKSA9PSBudWxsKSB7Ci0JCQkJCQkvLyBUT0RPIGltcGxlbWVudAotCQkJCQl9IGVsc2UgewotCQkJCQkJaW5zdGFsbEFyZWEgPSBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKS5nZXRMYXVuY2hlcigpLmdldFBhcmVudEZpbGUoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChpbnN0YWxsQXJlYVN0LnN0YXJ0c1dpdGgoImZpbGU6IikpCi0JCQkJCQlpbnN0YWxsQXJlYSA9IG5ldyBGaWxlKGluc3RhbGxBcmVhU3Quc3Vic3RyaW5nKCJmaWxlOiIubGVuZ3RoKCkpKTsKLQkJCQkJZWxzZQotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBhc3N1bWUgdGhhdCBwcm9wZXJ0eSB2YWx1ZSBrZXllZCBieSAiICsgRXF1aW5veENvbnN0YW50cy5QUk9QX0lOU1RBTEwgKyAiIG11c3Qgc3RhcnQgd2l0aCBcImZpbGU6XCIuIEJ1dCBpdCB3YXMgbm90OiIgKyBpbnN0YWxsQXJlYVN0KTsKLQkJCQl9Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0RFQlVHLCB0aGlzLCAiaW5pdGlhbGl6ZSh1c2VGd1BlcnNpc3RlbnREYXQpIiwgImluc3RhbGxBcmVhPSIgKyBpbnN0YWxsQXJlYSk7Ci0JCQkJRmlsZSBmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24gPSBuZXcgRmlsZShpbnN0YWxsQXJlYSwgImNvbmZpZ3VyYXRpb24iKTsKLQkJCQltYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKS5zZXRGd1BlcnNpc3RlbnREYXRhTG9jYXRpb24oZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uLCBmYWxzZSk7Ci0JCQl9Ci0JCQlpZiAoIWNvbXBvc2VTdGF0ZShiSW5mb3MsIG51bGwsIG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLmdldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbigpKSkKLQkJCQljb21wb3NlTmV3U3RhdGUobGF1bmNoZXJEYXRhLCBjb25maWdEYXRhLCBiSW5mb3MpOwotCQkJcmVzb2x2ZSh0cnVlKTsKLQkJCS8vIGlmKHRoaXMuZ2V0U3lzdGVtQnVuZGxlKCk9PW51bGwpCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnN0YWxsQnVuZGxlKEJ1bmRsZUluZm8gYkluZm8pIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQlTaW1wbGVCdW5kbGVzU3RhdGUuY2hlY2tBdmFpbGFiaWxpdHkoZndBZG1pbik7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGN1cnJlbnRJbnN0YWxsZWRCdW5kbGVzID0gc3RhdGUuZ2V0QnVuZGxlcygpOwotCQlTdHJpbmcgbmV3TG9jYXRpb24gPSBGaWxlVXRpbHMuZ2V0UmVhbExvY2F0aW9uKG1hbmlwdWxhdG9yLCBiSW5mby5nZXRMb2NhdGlvbigpLCB0cnVlKTsKLQkJRGljdGlvbmFyeSBtYW5pZmVzdCA9IFV0aWxzLmdldE9TR2lNYW5pZmVzdChuZXdMb2NhdGlvbik7Ci0JCWlmIChtYW5pZmVzdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBuZXdTeW1ib2xpY05hbWUgPSAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpOwotCQlpbnQgcG9zaXRpb24gPSBuZXdTeW1ib2xpY05hbWUuaW5kZXhPZigiOyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwb3NpdGlvbiA+PSAwKQotCQkJbmV3U3ltYm9saWNOYW1lID0gbmV3U3ltYm9saWNOYW1lLnN1YnN0cmluZygwLCBwb3NpdGlvbikudHJpbSgpOwotCQlTdHJpbmcgbmV3VmVyc2lvbiA9IChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRJbnN0YWxsZWRCdW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBGaWxlVXRpbHMuZ2V0UmVhbExvY2F0aW9uKG1hbmlwdWxhdG9yLCBjdXJyZW50SW5zdGFsbGVkQnVuZGxlc1tpXS5nZXRMb2NhdGlvbigpLCB0cnVlKTsKLQkJCWlmIChuZXdMb2NhdGlvbi5lcXVhbHMobG9jYXRpb24pKSB7Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IGN1cnJlbnRJbnN0YWxsZWRCdW5kbGVzW2ldLmdldFN5bWJvbGljTmFtZSgpOwotCQkJaWYgKG5ld1N5bWJvbGljTmFtZS5lcXVhbHMoc3ltYm9saWNOYW1lKSkgewotCQkJCVN0cmluZyB2ZXJzaW9uID0gY3VycmVudEluc3RhbGxlZEJ1bmRsZXNbaV0uZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKG5ld1ZlcnNpb24uZXF1YWxzKHZlcnNpb24pKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFmb3VuZCkgewotCQkJQnVuZGxlRGVzY3JpcHRpb24gbmV3QnVuZGxlRGVzY3JpcHRpb24gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQliSW5mby5zZXRCdW5kbGVJZCgrK21heElkKTsKLQkJCQluZXdCdW5kbGVEZXNjcmlwdGlvbiA9IHNvRmFjdG9yeS5jcmVhdGVCdW5kbGVEZXNjcmlwdGlvbihzdGF0ZSwgbWFuaWZlc3QsIG5ld0xvY2F0aW9uLCBiSW5mby5nZXRCdW5kbGVJZCgpKTsKLQkJCQlzdGF0ZS5hZGRCdW5kbGUobmV3QnVuZGxlRGVzY3JpcHRpb24pOwotCQkJCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUoYkluZm8pOwotCQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX1dBUk5JTkcsIHRoaXMsICJpbnN0YWxsQnVuZGxlKEJ1bmRsZUluZm8pIiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0Z1bGx5U3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgewotCQlyZXR1cm4gc3RhdGUuaXNSZXNvbHZlZCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoQnVuZGxlSW5mbyBiSW5mbykgewotCQlCdW5kbGVEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IHN0YXRlLmdldEJ1bmRsZUJ5TG9jYXRpb24oYkluZm8uZ2V0TG9jYXRpb24oKSk7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZGVzY3JpcHRpb24uaXNSZXNvbHZlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmUoYm9vbGVhbiBpbmNyZW1lbnQpIHsKLQkJc3RhdGUucmVzb2x2ZShpbmNyZW1lbnQpOwotCX0KLQotCXZvaWQgc2V0RndKYXIoRmlsZSBmd0phcikgewotCQltYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKS5zZXRGd0phcihmd0phcik7Ci0JfQotCi0JLyoqCi0JICogZ2V0IHBsYXRmb3JtZSBwcm9wZXJ0aWVzIGZyb20gdGhlIGdpdmVuIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0ZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRQbGF0Zm9ybVByb3BlcnRpZXMoU3RhdGUgc3RhdGUpIHsKLQkJRGljdGlvbmFyeSBwbGF0Zm9ybVByb3BlcnRpZXMgPSBzdGF0ZS5nZXRQbGF0Zm9ybVByb3BlcnRpZXMoKVswXTsKLQkJcGxhdGZyb21Qcm9wZXJ0aWVzLmNsZWFyKCk7Ci0JCWlmIChwbGF0Zm9ybVByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IHBsYXRmb3JtUHJvcGVydGllcy5rZXlzKCk7IGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotCQkJCU9iamVjdCB2YWx1ZSA9IHBsYXRmb3JtUHJvcGVydGllcy5nZXQoa2V5KTsKLQkJCQlwbGF0ZnJvbVByb3BlcnRpZXMuc2V0UHJvcGVydHkoa2V5LCAoU3RyaW5nKSB2YWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKERFQlVHKQotCQkJVXRpbHMucHJpbnRvdXRQcm9wZXJ0aWVzKFN5c3RlbS5vdXQsICJQbGF0Zm9ybVByb3BlcnRpZXNbMF0iLCBwbGF0ZnJvbVByb3BlcnRpZXMpOwotCX0KLQotCS8qKgotCSAqIHNldCBwbGF0ZnJvbVByb3BlcnRpZXMgcmVxdWlyZWQgdG8gY29tcG9zZSBzdGF0ZSBvYmplY3QgaW50bwotCSAqIHBsYXRmb3JtUHJvcGVydGllcyBvZiB0aGlzIHN0YXRlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wcwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRQbGF0Zm9ybVByb3BlcnRpZXNUb1N0YXRlKERpY3Rpb25hcnkgcHJvcHMpIHsKLQkJUHJvcGVydGllcyBwbGF0Zm9ybVByb3BlcnRpZXMgPSBzZXREZWZhdWx0UGxhdGZvcm1Qcm9wZXJ0aWVzKCk7Ci0KLQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IHByb3BzLmtleXMoKTsgZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgUFJPUFMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoa2V5LmVxdWFscyhQUk9QU1tpXSkpIHsKLQkJCQkJcGxhdGZvcm1Qcm9wZXJ0aWVzLnB1dChrZXksIHByb3BzLmdldChrZXkpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXN0YXRlLnNldFBsYXRmb3JtUHJvcGVydGllcyhwbGF0Zm9ybVByb3BlcnRpZXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTdGF0ZU9iamVjdEZhY3RvcnkoKSB7Ci0JCWlmIChzb0ZhY3RvcnkgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJUGxhdGZvcm1BZG1pbiBwbGF0Zm9ybUFkbWluID0gKFBsYXRmb3JtQWRtaW4pIEFjdGl2YXRvci5hY3F1aXJlU2VydmljZShQbGF0Zm9ybUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCS8vIFBsYXRmb3JtQWRtaW4gcGxhdGZvcm1BZG1pbiA9IChQbGF0Zm9ybUFkbWluKQotCQkvLyBoZUJ1bmRsZUhlbHBlci5nZXREZWZhdWx0KCkuYWNxdWlyZVNlcnZpY2UoUGxhdGZvcm1BZG1pbi5jbGFzcy5nZXROYW1lKCkpOwotCQlzb0ZhY3RvcnkgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoc3RhdGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gYnVuZGxlRGVzY3JpcHRpb25zID0gc3RhdGUuZ2V0QnVuZGxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZURlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJc2IuYXBwZW5kKGJ1bmRsZURlc2NyaXB0aW9uc1tpXS5nZXRCdW5kbGVJZCgpICsgIjoiKTsKLQkJCXNiLmFwcGVuZChidW5kbGVEZXNjcmlwdGlvbnNbaV0udG9TdHJpbmcoKSArICIoIik7Ci0JCQlzYi5hcHBlbmQoYnVuZGxlRGVzY3JpcHRpb25zW2ldLmlzUmVzb2x2ZWQoKSArICIpIik7Ci0JCQlTdHJpbmdbXSBlZXMgPSBidW5kbGVEZXNjcmlwdGlvbnNbaV0uZ2V0RXhlY3V0aW9uRW52aXJvbm1lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGVlcy5sZW5ndGg7IGorKykKLQkJCQlzYi5hcHBlbmQoZWVzW2pdICsgIiAiKTsKLQkJCXNiLmFwcGVuZCgiXG4iKTsKLQkJfQotCQlzYi5hcHBlbmQoIlBsYXRmb3JtUHJvcGVydGllczpcbiIpOwotCQlEaWN0aW9uYXJ5W10gZGljcyA9IHN0YXRlLmdldFBsYXRmb3JtUHJvcGVydGllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRpY3MubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBkaWNzW2ldLmtleXMoKTsgZW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZGljc1tpXS5nZXQoa2V5KTsKLQkJCQlzYi5hcHBlbmQoIiAoIiArIGtleSArICIsIiArIHZhbHVlICsgIilcbiIpOwotCQkJfQotCQl9Ci0JCXNiLmFwcGVuZCgiXG4iKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsQnVuZGxlKEJ1bmRsZUluZm8gYkluZm8pIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQlTaW1wbGVCdW5kbGVzU3RhdGUuY2hlY2tBdmFpbGFiaWxpdHkoZndBZG1pbik7Ci0JCWxvbmcgaWQgPSBERUZBVUxUX1RJTUVTVEFNUDsKLQkJU3RyaW5nIHRhcmdldExvY2F0aW9uID0gYkluZm8uZ2V0TG9jYXRpb24oKTsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBjdXJyZW50SW5zdGFsbGVkQnVuZGxlcyA9IHN0YXRlLmdldEJ1bmRsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjdXJyZW50SW5zdGFsbGVkQnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gY3VycmVudEluc3RhbGxlZEJ1bmRsZXNbaV0uZ2V0TG9jYXRpb24oKTsKLQkJCS8vIFRPRE8gSXMgaGFuZGxpbmcgInJlZmVyZW5jZToiIG5lZWRlZCA/Ci0JCQkvLyBpZihsb2NhdGlvbi5zdGFydHNXaXRoKCJyZWZlcmVuY2U6IikpCi0JCQkvLyBsb2NhdGlvbiA9IGxvY2F0aW9uLnN1YnN0cmluZygicmVmZXJlbmNlOiIubGVuZ3RoKCkpOwotCQkJaWYgKHRhcmdldExvY2F0aW9uLmVxdWFscyhsb2NhdGlvbikpIHsKLQkJCQlpZCA9IGN1cnJlbnRJbnN0YWxsZWRCdW5kbGVzW2ldLmdldEJ1bmRsZUlkKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGlkICE9IERFRkFVTFRfVElNRVNUQU1QKSB7Ci0KLQkJCXRyeSB7Ci0JCQkJRGljdGlvbmFyeSBtYW5pZmVzdCA9IFV0aWxzLmdldE9TR2lNYW5pZmVzdChiSW5mby5nZXRMb2NhdGlvbigpKTsKLQkJCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkgewotCQkJCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX1dBUk5JTkcsIHRoaXMsICJ1bmluc3RhbGxCdW5kbGUoQnVuZGxlSW5mbykiLCAiVW5hYmxlIHRvIGdldCBidW5kbGUgbWFuaWZlc3QgZm9yOiAiICsgYkluZm8uZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlRGVzY3JpcHRpb24gPSBzb0ZhY3RvcnkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oc3RhdGUsIG1hbmlmZXN0LCBiSW5mby5nZXRMb2NhdGlvbigpLCBpZCk7Ci0JCQkJc3RhdGUucmVtb3ZlQnVuZGxlKGJ1bmRsZURlc2NyaXB0aW9uKTsKLQkJCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkucmVtb3ZlQnVuZGxlKGJJbmZvKTsKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19XQVJOSU5HLCB0aGlzLCAidW5pbnN0YWxsQnVuZGxlKEJ1bmRsZUluZm8pIiwgZSk7Ci0JCQkJLy8gdGhyb3cgbmV3IE1hbmlwdWxhdG9yRXhjZXB0aW9uKCJGYWlsIHRvCi0JCQkJLy8gY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24gb2YgYkluZm86IiArIGJJbmZvLnRvU3RyaW5nKCksIGUsCi0JCQkJLy8gTWFuaXB1bGF0b3JFeGNlcHRpb24uT1RIRVJTKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94Q29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAyYjg2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3g7Ci0KLXB1YmxpYyBjbGFzcyBFcXVpbm94Q29uc3RhbnRzIHsKLQotCS8qKgotCSAqIElmIEJ1bmRsZUNvbnRleHQjZ2V0UHJvcGVydHkoUFJPUF9LRVlfVVNFX1JFRkVSRU5DRSkgZG9lcyBub3QgZXF1YWwgImZhbHNlIiwgCi0JICogTWFuaXB1bGF0b3Ijc2F2ZSgpIHdpbGwgYWRkICJyZWZlcmVuY2U6IiB0byBhbnkgYnVuZGxlIGxvY2F0aW9uIHNwZWNpZmllZCBvc2dpLmJ1bmRsZXMgaW4gb3JkZXIgdG8gYXZvaWQKLQkgKiBjYWNoaW5nIGl0cyBidW5kbGUgamFyLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGFkZCBub3RoaW5nIHRvIGFueSBidW5kbGUgbG9jYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9LRVlfVVNFX1JFRkVSRU5DRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gudXNlUmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOU19ESVIgPSAicGx1Z2lucyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGV19TWU1CT0xJQ19OQU1FID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DT05GSUdVUkFUSU9OID0gImNvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX0lOSSA9ICJjb25maWcuaW5pIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRldfVkVSU0lPTiA9ICIzLjMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRldfTkFNRSA9ICJFcXVpbm94IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExBVU5DSEVSX1ZFUlNJT04gPSAiMy4yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIExBVU5DSEVSX05BTUUgPSAiRWNsaXBzZS5leGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fQ09ORklHVVJBVElPTiA9ICItY29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fRlcgPSAiLWZyYW1ld29yayI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fVk0gPSAiLXZtIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9WTUFSR1MgPSAiLXZtYXJncyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fQ0xFQU4gPSAiLWNsZWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9TVEFSVFVQID0gIi1zdGFydHVwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9TSE9XU1BMQVNIID0gIi1zaG93c3BsYXNoIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gU3lzdGVtIHByb3BlcnRpZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0JVTkRMRVMgPSAib3NnaS5idW5kbGVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQlVORExFU19TVEFSVExFVkVMID0gIm9zZ2kuYnVuZGxlcy5kZWZhdWx0U3RhcnRMZXZlbCI7IC8vJE5PTi1OTFMtMSQgLy9UaGUgc3RhcnQgbGV2ZWwgdXNlZCB0byBpbnN0YWxsIHRoZSBidW5kbGVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JTklUSUFMX1NUQVJUTEVWRUwgPSAib3NnaS5zdGFydExldmVsIjsgLy8kTk9OLU5MUy0xJCAvL1RoZSBzdGFydCBsZXZlbCB3aGVuIHRoZSBmd2wgc3RhcnQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lOU1RBTEwgPSAib3NnaS5pbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRUNMSVBTRV9DT01NQU5EUyA9ICJlY2xpcHNlLmNvbW1hbmRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfT1NHSV9GVyA9ICJvc2dpLmZyYW1ld29yayI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0xBVU5DSEVSX1BBVEggPSAib3NnaS5sYXVuY2hlclBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9MQVVOQ0hFUl9OQU1FID0gIm9zZ2kubGF1bmNoZXJJbmkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TSEFSRURfQ09ORklHVVJBVElPTl9BUkVBID0gIm9zZ2kuc2hhcmVkQ29uZmlndXJhdGlvbi5hcmVhIjsgLy8kTk9OLU5MUy0xJAkKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOSV9FWFRFTlNJT04gPSAiLmluaSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWEVfRVhURU5TSU9OID0gIi5leGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0VRVUlOT1hfREVQRU5ERU5UX1BSRUZJWCA9ICJvc2dpLiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRSA9ICJyZWZlcmVuY2U6IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUlNJU1RFTlRfRElSX05BTUUgPSAib3JnLmVjbGlwc2Uub3NnaSI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94RnJhbWV3b3JrQWRtaW5GYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94RnJhbWV3b3JrQWRtaW5GYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk4OTA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRXF1aW5veEZyYW1ld29ya0FkbWluRmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yLkNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkZyYW1ld29ya0FkbWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uRnJhbWV3b3JrQWRtaW5GYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRXF1aW5veEZyYW1ld29ya0FkbWluRmFjdG9yeUltcGwgZXh0ZW5kcyBGcmFtZXdvcmtBZG1pbkZhY3RvcnkgewotCXB1YmxpYyBGcmFtZXdvcmtBZG1pbiBjcmVhdGVGcmFtZXdvcmtBZG1pbigpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNsYXNzTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShDb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnkuU1lTVEVNX1BST1BFUlRZX0tFWSk7Ci0JCWlmIChjbGFzc05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgRXF1aW5veEZ3QWRtaW5JbXBsKCk7Ci0JCXJldHVybiBuZXcgRXF1aW5veEZ3QWRtaW5JbXBsKGNsYXNzTmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94RndBZG1pbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvRXF1aW5veEZ3QWRtaW5JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MjM2M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94RndBZG1pbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LnV0aWxzLkVjbGlwc2VWZXJzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9ybWFuaXB1bGF0b3IuQ29uZmlndXJhdG9yTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5jb25maWd1cmF0b3JtYW5pcHVsYXRvci5Db25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBFcXVpbm94RndBZG1pbkltcGwgaW1wbGVtZW50cyBGcmFtZXdvcmtBZG1pbiB7Ci0KLQkvKioKLQkgKiBJZiBib3RoIHRoZSB2ZW5kb3IgYW5kIHRoZSBCdW5kbGUtVmVyc2lvbiBpbiB0aGUgbWFuaWZlc3QgbWF0Y2gsIAotCSAqIHJldHVybiB0cnVlLiBPdGhlcndpc2UgZmFsc2UuCi0JICogIAotCSAqIEByZXR1cm4gZmxhZyB0cnVlIGlmIHRoZSBNYW5pcHVsYXRvckFkbWluIG9iamVjdCBjYW4gaGFuZGxlIGN1cnJlbnRseSBydW5uaW5nIGZ3IGxhdW5jaC4gCi0JICovCi0Jc3RhdGljIGJvb2xlYW4gaXNSdW5uaW5nRncoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vVE9ETyBpbXBsZW1lbnRhdGlvbiBmb3IgRWNsaXBzZS5leGUgYW5kIGZvciBFcXVpbm94Ci0JCVN0cmluZyBmd1ZlbmRvciA9IGNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZSQU1FV09SS19WRU5ET1IpOwotCQlpZiAoISJFY2xpcHNlIi5lcXVhbHMoZndWZW5kb3IpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvL1RPRE8gZGVjaWRlIGlmIHRoaXMgdmVyc2lvbiBjYW4gYmUgc3VwcG9ydGVkIGJ5IHRoaXMgYnVuZGxlLgotCQlEaWN0aW9uYXJ5IGhlYWRlciA9IGNvbnRleHQuZ2V0QnVuZGxlKDApLmdldEhlYWRlcnMoKTsKLQkJU3RyaW5nIHZlcnNpb25TdCA9IChTdHJpbmcpIGhlYWRlci5nZXQoIkJ1bmRsZS1WZXJzaW9uIik7Ci0JCUVjbGlwc2VWZXJzaW9uIHZlcnNpb24gPSBuZXcgRWNsaXBzZVZlcnNpb24odmVyc2lvblN0KTsKLQkJaW50IHZhbHVlID0gdmVyc2lvbi5jb21wYXJlVG8obmV3IEVjbGlwc2VWZXJzaW9uKEVxdWlub3hDb25zdGFudHMuRldfVkVSU0lPTikpOwotCQlpZiAodmFsdWUgPiAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkvLyBUT0RPIG5lZWQgdG8gaWRlbnRpZnkgdGhlIHZlcnNpb24gb2YgZWNsaXBzZS5leGUgdXNlZCBmb3IgdGhpcyBsYXVuY2gsIGlmIHVzZWQuIAotCi0JCS8vCQlTdHJpbmcgZWNsaXBzZUNvbW1hbmRzU3QgPSBjb250ZXh0LmdldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9FQ0xJUFNFX0NPTU1BTkRTKTsKLQkJLy8JU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZWNsaXBzZUNvbW1hbmRzU3QsIlxuIik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBudWxsOwotCi0JYm9vbGVhbiBhY3RpdmUgPSBmYWxzZTsKLQotCXByaXZhdGUgYm9vbGVhbiBydW5uaW5nRncgPSBmYWxzZTsKLQlwcml2YXRlIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yIGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yID0gbnVsbDsKLQotCS8vCXByaXZhdGUgU3RyaW5nIGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeU5hbWUgPSBudWxsOwotCi0JRXF1aW5veEZ3QWRtaW5JbXBsKCkgewotCQl0aGlzKG51bGwsIGZhbHNlKTsKLQl9Ci0KLQlFcXVpbm94RndBZG1pbkltcGwoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXRoaXMoY29udGV4dCwgZmFsc2UpOwotCX0KLQotCUVxdWlub3hGd0FkbWluSW1wbChTdHJpbmcgY29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5TmFtZSkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQl0aGlzLmNvbnRleHQgPSBudWxsOwotCQl0aGlzLmFjdGl2ZSA9IHRydWU7Ci0JCXRoaXMucnVubmluZ0Z3ID0gZmFsc2U7Ci0JCS8vCQl0aGlzLmNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeU5hbWUgPSBjb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnlOYW1lOwotCQlsb2FkQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IoY29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRDb25maWd1cmF0b3JNYW5pcHVsYXRvcihTdHJpbmcgY29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5TmFtZSkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQlpZiAoY29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5TmFtZSA9PSBudWxsKQotCQkJdGhpcy5jb25maWd1cmF0b3JNYW5pcHVsYXRvciA9IG51bGw7Ci0JCWVsc2UKLQkJCXRoaXMuY29uZmlndXJhdG9yTWFuaXB1bGF0b3IgPSBDb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnkuZ2V0SW5zdGFuY2UoY29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5TmFtZSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlFcXVpbm94RndBZG1pbkltcGwoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBib29sZWFuIHJ1bm5pbmdGdykgewotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLmFjdGl2ZSA9IHRydWU7Ci0JCXRoaXMucnVubmluZ0Z3ID0gcnVubmluZ0Z3OwotCX0KLQotCXZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJYWN0aXZlID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIE1hbmlwdWxhdG9yIGdldE1hbmlwdWxhdG9yKCkgewotCQlyZXR1cm4gbmV3IEVxdWlub3hNYW5pcHVsYXRvckltcGwoY29udGV4dCwgdGhpcyk7Ci0JfQotCi0JcHVibGljIE1hbmlwdWxhdG9yIGdldFJ1bm5pbmdNYW5pcHVsYXRvcigpIHsKLQkJaWYgKHRoaXMucnVubmluZ0Z3KQotCQkJcmV0dXJuIG5ldyBFcXVpbm94TWFuaXB1bGF0b3JJbXBsKGNvbnRleHQsIHRoaXMsIHRydWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKLQkJcmV0dXJuIGFjdGl2ZTsKLQl9Ci0KLQlwdWJsaWMgUHJvY2VzcyBsYXVuY2goTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IsIEZpbGUgY3dkKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJLy9yZXR1cm4gbmV3IEVjbGlwc2VMYXVuY2hlckltcGwoY29udGV4dCwgdGhpcykubGF1bmNoKG1hbmlwdWxhdG9yLCBjd2QpOwotCQlyZXR1cm4gbmV3IEVjbGlwc2VMYXVuY2hlckltcGwodGhpcykubGF1bmNoKG1hbmlwdWxhdG9yLCBjd2QpOwotCX0KLQotCXB1YmxpYyBDb25maWd1cmF0b3JNYW5pcHVsYXRvciBnZXRDb25maWd1cmF0b3JNYW5pcHVsYXRvcigpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94RndDb25maWdGaWxlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjYzA2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3gudXRpbHMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4udXRpbHMuVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5sb2cuTG9nU2VydmljZTsKLQotcHVibGljIGNsYXNzIEVxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRElSID0gIkBjb25maWcuZGlyLyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VDTElQU0VfUFJPVl9DQUNIRSA9ICJlY2xpcHNlLnAyLmNhY2hlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRUNMSVBTRV9QUk9WX0RBVEFfQVJFQSA9ICJlY2xpcHNlLnAyLmRhdGEuYXJlYSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX09SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SX0NPTkZJR1VSTCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5jb25maWdVcmwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PU0dJX0JVTkRMRVMgPSAib3NnaS5idW5kbGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfT1NHSV9GUkFNRVdPUksgPSAib3NnaS5mcmFtZXdvcmsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9PU0dJX0xBVU5DSEVSX1BBVEggPSAib3NnaS5sYXVuY2hlclBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEFUSFMgPSBuZXcgU3RyaW5nW10ge0tFWV9PU0dJX0xBVU5DSEVSX1BBVEgsIEtFWV9FQ0xJUFNFX1BST1ZfQ0FDSEV9OwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBVU0VfUkVGRVJFTkNFX1NUUklORyA9IG51bGw7Ci0KLQlwdWJsaWMgRXF1aW5veEZ3Q29uZmlnRmlsZVBhcnNlcihCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkKLQkJCVVTRV9SRUZFUkVOQ0VfU1RSSU5HID0gY29udGV4dC5nZXRQcm9wZXJ0eShFcXVpbm94Q29uc3RhbnRzLlBST1BfS0VZX1VTRV9SRUZFUkVOQ0UpOwotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldENvbW1hbmRMaW5lKEJ1bmRsZUluZm8gYnVuZGxlSW5mbywgZmluYWwgVVJMIGJhc2VVcmwpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gYnVuZGxlSW5mby5nZXRMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlib29sZWFuIHVzZVJlZmVyZW5jZSA9IHRydWU7Ci0JCWlmIChsb2NhdGlvbi5zdGFydHNXaXRoKCJmaWxlOiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChVU0VfUkVGRVJFTkNFX1NUUklORyAhPSBudWxsICYmIFVTRV9SRUZFUkVOQ0VfU1RSSU5HLmVxdWFscygiZmFsc2UiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXVzZVJlZmVyZW5jZSA9IGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCW5ldyBVUkwobG9jYXRpb24pOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19FUlJPUiwgIkVxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIuZ2V0Q29tbWFuZExpbmUoKTpidW5kbGVJbmZvPSIgKyBidW5kbGVJbmZvLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8JCQlOZXZlciBoYXBwZW4uIGlnbm9yZS4KLQkJfQotCQlpZiAodXNlUmVmZXJlbmNlKQotCQkJaWYgKCFsb2NhdGlvbi5zdGFydHNXaXRoKCJyZWZlcmVuY2U6IikpIC8vJE5PTi1OTFMtMSQKLQkJCQlsb2NhdGlvbiA9ICJyZWZlcmVuY2U6IiArIGxvY2F0aW9uOyAvLyROT04tTkxTLTEkCi0KLQkJaW50IHN0YXJ0TGV2ZWwgPSBidW5kbGVJbmZvLmdldFN0YXJ0TGV2ZWwoKTsKLQkJYm9vbGVhbiB0b0JlU3RhcnRlZCA9IGJ1bmRsZUluZm8uaXNNYXJrZWRBc1N0YXJ0ZWQoKTsKLQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vCQlpZiAoYmFzZVVybCAhPSBudWxsICYmIGJ1bmRsZVVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKSB7Ci0JCS8vCQkJU3RyaW5nIGJ1bmRsZVBhdGggPSBidW5kbGVVcmwudG9TdHJpbmcoKTsKLQkJLy8JCQlidW5kbGVQYXRoID0gVXRpbHMuZ2V0UmVsYXRpdmVQYXRoKGJ1bmRsZVVybCwgYmFzZVVybCk7Ci0JCS8vCQkJc2IuYXBwZW5kKGJ1bmRsZVBhdGgpOwotCQkvLwkJfSBlbHNlCi0JCXNiLmFwcGVuZChsb2NhdGlvbik7Ci0JCWlmIChzdGFydExldmVsID09IEJ1bmRsZUluZm8uTk9fTEVWRUwgJiYgIXRvQmVTdGFydGVkKQotCQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JCXNiLmFwcGVuZCgnQCcpOwotCQlpZiAoc3RhcnRMZXZlbCAhPSBCdW5kbGVJbmZvLk5PX0xFVkVMKQotCQkJc2IuYXBwZW5kKHN0YXJ0TGV2ZWwpOwotCQlpZiAodG9CZVN0YXJ0ZWQpCi0JCQlzYi5hcHBlbmQoIjpzdGFydCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgZ2V0Q29uZmlnUHJvcHMoQnVuZGxlSW5mb1tdIGJJbmZvcywgQ29uZmlnRGF0YSBjb25maWdEYXRhLCBMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhLCBib29sZWFuIHJlbGF0aXZlLCBGaWxlIGZ3SmFyKSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCi0JCWlmIChjb25maWdEYXRhLmdldEluaXRpYWxCdW5kbGVTdGFydExldmVsKCkgIT0gQnVuZGxlSW5mby5OT19MRVZFTCkKLQkJCXByb3BzLnNldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9CVU5ETEVTX1NUQVJUTEVWRUwsIEludGVnZXIudG9TdHJpbmcoY29uZmlnRGF0YS5nZXRJbml0aWFsQnVuZGxlU3RhcnRMZXZlbCgpKSk7Ci0JCWlmIChjb25maWdEYXRhLmdldEJlZ2luaW5nRndTdGFydExldmVsKCkgIT0gQnVuZGxlSW5mby5OT19MRVZFTCkKLQkJCXByb3BzLnNldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9JTklUSUFMX1NUQVJUTEVWRUwsIEludGVnZXIudG9TdHJpbmcoY29uZmlnRGF0YS5nZXRCZWdpbmluZ0Z3U3RhcnRMZXZlbCgpKSk7Ci0KLQkJZmluYWwgRmlsZSBsYXVuY2hlciA9IGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpOwotCQlpZiAobGF1bmNoZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxhdW5jaGVyTmFtZSA9IGxhdW5jaGVyLmdldE5hbWUoKTsKLQkJCWlmIChsYXVuY2hlck5hbWUuZW5kc1dpdGgoRXF1aW5veENvbnN0YW50cy5FWEVfRVhURU5TSU9OKSkgewotCQkJCXByb3BzLnNldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9MQVVOQ0hFUl9OQU1FLCBsYXVuY2hlck5hbWUuc3Vic3RyaW5nKDAsIGxhdW5jaGVyTmFtZS5sYXN0SW5kZXhPZihFcXVpbm94Q29uc3RhbnRzLkVYRV9FWFRFTlNJT04pKSk7Ci0JCQkJcHJvcHMuc2V0UHJvcGVydHkoRXF1aW5veENvbnN0YW50cy5QUk9QX0xBVU5DSEVSX1BBVEgsIGxhdW5jaGVyLmdldFBhcmVudEZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgZndKYXJTdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZndKYXIgIT0gbnVsbCkgewotCQkJCWZ3SmFyU3QgPSBmd0phci50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBOZXZlciBoYXBwZW5zCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJaWYgKGJJbmZvcyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJJbmZvcy5sZW5ndGg7IGkrKykgewotCQkJCW5vcm1hbGl6ZUxvY2F0aW9uKGJJbmZvc1tpXSk7Ci0JCQkJaWYgKGZ3SmFyU3QgIT0gbnVsbCAmJiBmd0phclN0LmVxdWFscyhiSW5mb3NbaV0uZ2V0TG9jYXRpb24oKSkpCi0JCQkJCWNvbnRpbnVlOyAvL2ZyYW1ld29yayBqYXIgc2hvdWxkIG5vdCBhcHBlYXIgaW4gdGhlIGJ1bmRsZXMgbGlzdAotCQkJCXNiLmFwcGVuZChnZXRDb21tYW5kTGluZShiSW5mb3NbaV0sIG51bGwpKTsKLQkJCQlpZiAoaSArIDEgPCBiSW5mb3MubGVuZ3RoKQotCQkJCQlzYi5hcHBlbmQoJywnKTsKLQkJCX0KLQkJCXByb3BzLnNldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9CVU5ETEVTLCBzYi50b1N0cmluZygpKTsKLQotCQl9Ci0JCS8vVE9ETyBUaGUgZm9sbG93aW5nIG1lcmdpbmcgb3BlcmF0aW9ucyBhcmUgc3VzcGljaW91cy4KLQkJcHJvcHMgPSBVdGlscy5hcHBlbmRQcm9wZXJ0aWVzKHByb3BzLCBjb25maWdEYXRhLmdldEZ3SW5kZXBlbmRlbnRQcm9wcygpKTsKLQotCQlwcm9wcyA9IFV0aWxzLmFwcGVuZFByb3BlcnRpZXMocHJvcHMsIGNvbmZpZ0RhdGEuZ2V0RndEZXBlbmRlbnRQcm9wcygpKTsKLQotCQkvL0RlYWwgd2l0aCB0aGUgZncgamFyIGFuZCBlbnN1cmUgaXQgaXMgbm90IHNldC4gCi0JCS8vVE9ETyBUaGlzIGNhbid0IGJlIGRvbmUgYmVmb3JlIGJlY2F1c2Ugb2YgdGhlIHByZXZpb3VzIGNhbGxzIHRvIGFwcGVuZFByb3BlcnRpZXMgCi0JCWlmIChmd0phclN0ICE9IG51bGwpCi0JCQlwcm9wcy5zZXRQcm9wZXJ0eShFcXVpbm94Q29uc3RhbnRzLlBST1BfT1NHSV9GVywgZndKYXJTdCAvKiBmd0phci5nZXRBYnNvbHV0ZVBhdGgoKSAqLyk7Ci0JCWVsc2UKLQkJCXByb3BzLnJlbW92ZShFcXVpbm94Q29uc3RhbnRzLlBST1BfT1NHSV9GVyk7Ci0KLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZ2V0TWFya2VkQXNTdGFydGVkRm9ybWF0KFN0cmluZyBtc2csIFN0cmluZyBvcmlnaW5hbCkgewotCQlpZiAobXNnID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCW1zZyA9IG1zZy50cmltKCk7Ci0JCWludCBjb2xvbiA9IG1zZy5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbG9uID4gLTEpIHsKLQkJCXJldHVybiBtc2cuc3Vic3RyaW5nKGNvbG9uICsgMSkuZXF1YWxzKCJzdGFydCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG1zZy5lcXVhbHMoInN0YXJ0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0U3RhcnRMZXZlbChTdHJpbmcgbXNnLCBTdHJpbmcgb3JpZ2luYWwpIHsKLQkJaWYgKG1zZyA9PSBudWxsKQotCQkJcmV0dXJuIEJ1bmRsZUluZm8uTk9fTEVWRUw7Ci0JCW1zZyA9IG1zZy50cmltKCk7Ci0JCWludCBjb2xvbiA9IG1zZy5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbG9uID4gMCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludChtc2cuc3Vic3RyaW5nKDAsIGNvbG9uKSk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBCdW5kbGVJbmZvLk5PX0xFVkVMOwotCQkJfQotCQl9Ci0JCXJldHVybiBCdW5kbGVJbmZvLk5PX0xFVkVMOwotCX0KLQotCXN0YXRpYyBib29sZWFuIGlzRndEZXBlbmRlbnQoU3RyaW5nIGtleSkgewotCQkvLyBUT0RPIFRoaXMgYWxnb3JpdGhtIGlzIHRlbXBvcmFsLiAKLQkJaWYgKGtleS5zdGFydHNXaXRoKEVxdWlub3hDb25zdGFudHMuUFJPUF9FUVVJTk9YX0RFUEVOREVOVF9QUkVGSVgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIG5vcm1hbGl6ZUxvY2F0aW9uKEJ1bmRsZUluZm8gYkluZm8pIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gYkluZm8uZ2V0TG9jYXRpb24oKTsKLQkJdHJ5IHsKLQkJCWlmIChsb2NhdGlvbi5zdGFydHNXaXRoKCJmaWxlOiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQliSW5mby5zZXRMb2NhdGlvbihuZXcgVVJMKGxvY2F0aW9uKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYkluZm8uc2V0TG9jYXRpb24obmV3IEZpbGUobG9jYXRpb24pLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCS8vCQkJbG9jYXRpb24gPSBsb2NhdGlvbi5zdWJzdHJpbmcoImZpbGU6Ii5sZW5ndGgoKSk7Ci0JCS8vCQkJaWYgKCFsb2NhdGlvbi5zdGFydHNXaXRoKCIvIikpCi0JCS8vCQkJCWxvY2F0aW9uID0gIi8iICsgbG9jYXRpb247Ci0JCS8vCQkJLy8JCWlmIChmd0phclN0ICE9IG51bGwpCi0JCS8vCQkJLy8JCQlpZiAoZndKYXJTdC5lcXVhbHMobG9jYXRpb24pKQotCQkvLwkJCS8vCQkJCWNvbnRpbnVlOwotCQkvLwkJCWxvY2F0aW9uID0gVXRpbHMucmVwbGFjZUFsbChsb2NhdGlvbiwgRmlsZS5zZXBhcmF0b3IsICIvIik7Ci0JCS8vCQkJLy9TdHJpbmcgamFyTmFtZSA9IGxvY2F0aW9uLnN1YnN0cmluZyhsb2NhdGlvbi5sYXN0SW5kZXhPZigiLyIpICsgMSk7Ci0JCS8vCQkJLy8JCWlmIChqYXJOYW1lLnN0YXJ0c1dpdGgoRXF1aW5veENvbnN0YW50cy5GV19KQVJfUExVR0lOX05BTUUpKQotCQkvLwkJCS8vCQkJY29udGludWU7Ci0JCS8vCQkJYkluZm8uc2V0TG9jYXRpb24oImZpbGU6IiArIGxvY2F0aW9uKTsKLQkJLy8JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldEluc3RhbGxpbmdCdW5kbGVzKE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yLCBTdHJpbmcgdmFsdWUpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotCQlDb25maWdEYXRhIGNvbmZpZ0RhdGEgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBiSW5mb1N0cmluZ3MgPSBVdGlscy5nZXRUb2tlbnModmFsdWUsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYkluZm9TdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHRva2VuID0gYkluZm9TdHJpbmdzW2ldLnRyaW0oKTsKLQkJCQl0b2tlbiA9IEZpbGVVdGlscy5nZXRSZWFsTG9jYXRpb24obWFuaXB1bGF0b3IsIHRva2VuLCBmYWxzZSkudHJpbSgpOwotCi0JCQkJaW50IGluZGV4SSA9IHRva2VuLmluZGV4T2YoIkAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBsb2NhdGlvbiA9IChpbmRleEkgPT0gLTEpID8gdG9rZW4gOiB0b2tlbi5zdWJzdHJpbmcoMCwgaW5kZXhJKTsKLQkJCQlTdHJpbmcgcmVhbExvY2F0aW9uID0gRmlsZVV0aWxzLmdldEVjbGlwc2VSZWFsTG9jYXRpb24obWFuaXB1bGF0b3IsIGxvY2F0aW9uKTsKLQkJCQlTdHJpbmcgc2xBbmRGbGFnID0gKGluZGV4SSA+IC0xKSA/IHRva2VuLnN1YnN0cmluZyhpbmRleEkgKyAxKSA6IG51bGw7Ci0KLQkJCQlib29sZWFuIG1hcmtlZEFzU3RhcnRlZCA9IGdldE1hcmtlZEFzU3RhcnRlZEZvcm1hdChzbEFuZEZsYWcsIHRva2VuKTsKLQkJCQlpbnQgc3RhcnRMZXZlbCA9IGdldFN0YXJ0TGV2ZWwoc2xBbmRGbGFnLCB0b2tlbik7Ci0KLQkJCQlpZiAocmVhbExvY2F0aW9uICE9IG51bGwpCi0JCQkJCWNvbmZpZ0RhdGEuYWRkQnVuZGxlKG5ldyBCdW5kbGVJbmZvKHJlYWxMb2NhdGlvbiwgc3RhcnRMZXZlbCwgbWFya2VkQXNTdGFydGVkKSk7Ci0JCQkJZWxzZQotCQkJCQljb25maWdEYXRhLmFkZEJ1bmRsZShuZXcgQnVuZGxlSW5mbyhsb2NhdGlvbiwgbnVsbCwgbnVsbCwgc3RhcnRMZXZlbCwgbWFya2VkQXNTdGFydGVkKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBpbnB1dEZpbGUgbXVzdCBiZSBub3QgYSBkaXJlY3RvcnkgYnV0IGEgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFuaXB1bGF0b3IKLQkgKiBAcGFyYW0gaW5wdXRGaWxlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlYWRGd0NvbmZpZyhNYW5pcHVsYXRvciBtYW5pcHVsYXRvciwgRmlsZSBpbnB1dEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dEZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZXhjZXB0aW9uX2lucHV0RmlsZUlzRGlyZWN0b3J5LCBpbnB1dEZpbGUpKTsKLQotCQkvL0luaXRpYWxpemUgZGF0YSBzdHJ1Y3R1cmVzCi0JCUNvbmZpZ0RhdGEgY29uZmlnRGF0YSA9IG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKTsKLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQljb25maWdEYXRhLmluaXRpYWxpemUoKTsKLQotCQkvLyBsb2FkIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcwotCQlQcm9wZXJ0aWVzIHByb3BzID0gbG9hZFByb3BlcnRpZXMoaW5wdXRGaWxlKTsKLQotCQkvL1N0YXJ0IGZpZ3VyaW5nIG91dCBzdHVmZnMgCi0JCVVSTCByb290VVJMID0gbGF1bmNoZXJEYXRhLmdldExhdW5jaGVyKCkgIT0gbnVsbCA/IGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpLmdldFBhcmVudEZpbGUoKS50b1VSTCgpIDogbnVsbDsKLQotCQlQcm9wZXJ0aWVzIHNoYXJlZENvbmZpZ1Byb3BlcnRpZXMgPSBnZXRTaGFyZWRDb25maWd1cmF0aW9uKHByb3BzLmdldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9TSEFSRURfQ09ORklHVVJBVElPTl9BUkVBKSwgZ2V0T1NHaUluc3RhbGxBcmVhKG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpKSk7Ci0JCWlmIChzaGFyZWRDb25maWdQcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCXNoYXJlZENvbmZpZ1Byb3BlcnRpZXMucHV0QWxsKHByb3BzKTsKLQkJCXByb3BzID0gc2hhcmVkQ29uZmlnUHJvcGVydGllczsKLQkJfQotCi0JCS8vRXh0cmFjdGluZyBmd2tKYXIgbG9jYXRpb24gbmVlZHMgdG8gYmUgZG9uZSBmaXJzdCAKLQkJU3RyaW5nIGxhdW5jaGVyTmFtZSA9IG51bGw7Ci0JCVN0cmluZyBsYXVuY2hlclBhdGggPSBudWxsOwotCQljb25maWdEYXRhLnNldEJ1bmRsZXMobnVsbCk7Ci0KLQkJRmlsZSBmd0phciA9IG51bGw7Ci0JCWlmIChwcm9wcy5nZXRQcm9wZXJ0eShFcXVpbm94Q29uc3RhbnRzLlBST1BfT1NHSV9GVykgIT0gbnVsbCkgewotCQkJcHJvcHMuc2V0UHJvcGVydHkoS0VZX09TR0lfRlJBTUVXT1JLLCBFcXVpbm94TWFuaXB1bGF0b3JJbXBsLm1ha2VBYnNvbHV0ZShwcm9wcy5nZXRQcm9wZXJ0eShFcXVpbm94Q29uc3RhbnRzLlBST1BfT1NHSV9GVyksIGdldE9TR2lJbnN0YWxsQXJlYShsYXVuY2hlckRhdGEpLnRvVVJMKCkpKTsKLQkJCVN0cmluZyBmd0phclN0cmluZyA9IHByb3BzLmdldFByb3BlcnR5KEtFWV9PU0dJX0ZSQU1FV09SSyk7Ci0JCQlpZiAoZndKYXJTdHJpbmcgIT0gbnVsbCkgewotCQkJCWZ3SmFyID0gbmV3IEZpbGUobmV3IFVSTChmd0phclN0cmluZykuZ2V0RmlsZSgpKTsKLQkJCQlsYXVuY2hlckRhdGEuc2V0RndKYXIoZndKYXIpOwotCQkJCWNvbmZpZ0RhdGEuYWRkQnVuZGxlKG5ldyBCdW5kbGVJbmZvKGZ3SmFyU3RyaW5nKSk7Ci0JCQl9Ci0JCX0KLQotCQlwcm9wcyA9IG1ha2VBYnNvbHV0ZShwcm9wcywgcm9vdFVSTCwgZndKYXIsIGlucHV0RmlsZS5nZXRQYXJlbnRGaWxlKCksIGdldE9TR2lJbnN0YWxsQXJlYShtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKSkpOwotCQlmb3IgKEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcHJvcHMua2V5cygpOyBlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotCQkJU3RyaW5nIHZhbHVlID0gcHJvcHMuZ2V0UHJvcGVydHkoa2V5KTsKLQkJCWlmIChrZXkuZXF1YWxzKEVxdWlub3hDb25zdGFudHMuUFJPUF9CVU5ETEVTX1NUQVJUTEVWRUwpKQotCQkJCWNvbmZpZ0RhdGEuc2V0SW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwoSW50ZWdlci5wYXJzZUludCh2YWx1ZSkpOwotCQkJZWxzZSBpZiAoa2V5LmVxdWFscyhFcXVpbm94Q29uc3RhbnRzLlBST1BfSU5JVElBTF9TVEFSVExFVkVMKSkgewotCQkJCWNvbmZpZ0RhdGEuc2V0QmVnaW5uaW5nRndTdGFydExldmVsKEludGVnZXIucGFyc2VJbnQodmFsdWUpKTsKLQkJCX0gZWxzZSBpZiAoa2V5LmVxdWFscyhFcXVpbm94Q29uc3RhbnRzLlBST1BfQlVORExFUykpIHsKLQkJCQlzZXRJbnN0YWxsaW5nQnVuZGxlcyhtYW5pcHVsYXRvciwgdmFsdWUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoaXNGd0RlcGVuZGVudChrZXkpKSB7Ci0JCQkJCWNvbmZpZ0RhdGEuc2V0RndEZXBlbmRlbnRQcm9wKGtleSwgdmFsdWUpOwotCQkJCX0gZWxzZQotCQkJCQljb25maWdEYXRhLnNldEZ3SW5kZXBlbmRlbnRQcm9wKGtleSwgdmFsdWUpOwotCQkJCWlmIChrZXkuZXF1YWxzKEVxdWlub3hDb25zdGFudHMuUFJPUF9MQVVOQ0hFUl9OQU1FKSkKLQkJCQkJaWYgKGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpID09IG51bGwpCi0JCQkJCQlsYXVuY2hlck5hbWUgPSB2YWx1ZTsKLQkJCQlpZiAoa2V5LmVxdWFscyhFcXVpbm94Q29uc3RhbnRzLlBST1BfTEFVTkNIRVJfUEFUSCkpCi0JCQkJCWlmIChsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXIoKSA9PSBudWxsKQotCQkJCQkJbGF1bmNoZXJQYXRoID0gdmFsdWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxhdW5jaGVyTmFtZSAhPSBudWxsICYmIGxhdW5jaGVyUGF0aCAhPSBudWxsKSB7Ci0JCQlsYXVuY2hlckRhdGEuc2V0TGF1bmNoZXIobmV3IEZpbGUobGF1bmNoZXJQYXRoLCBsYXVuY2hlck5hbWUgKyBFcXVpbm94Q29uc3RhbnRzLkVYRV9FWFRFTlNJT04pKTsKLQkJfQotCi0JCUxvZy5sb2coTG9nU2VydmljZS5MT0dfSU5GTywgTkxTLmJpbmQoTWVzc2FnZXMubG9nX2NvbmZpZ0ZpbGUsIGlucHV0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgbG9hZFByb3BlcnRpZXMoRmlsZSBpbnB1dEZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dEZpbGUpOwotCQkJcHJvcHMubG9hZChpcyk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlzLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19XQVJOSU5HLCBOTFMuYmluZChNZXNzYWdlcy5sb2dfZmFpbGVkX3JlYWRpbmdfcHJvcGVydGllcywgaW5wdXRGaWxlKSk7Ci0JCQl9Ci0JCQlpcyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCXByaXZhdGUgRmlsZSBmaW5kU2hhcmVkQ29uZmlnSW5pRmlsZShVUkwgcm9vdFVSTCwgU3RyaW5nIHNoYXJlZENvbmZpZ3VyYXRpb25BcmVhKSB7Ci0JCVVSTCBzaGFyZWRDb25maWd1cmF0aW9uVVJMID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNoYXJlZENvbmZpZ3VyYXRpb25VUkwgPSBuZXcgVVJMKHNoYXJlZENvbmZpZ3VyYXRpb25BcmVhKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHVuZXhwZWN0ZWQgc2luY2UgdGhpcyB3YXMgd3JpdHRlbiBieSB0aGUgZnJhbWV3b3JrCi0JCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX1dBUk5JTkcsIE5MUy5iaW5kKE1lc3NhZ2VzLmxvZ19zaGFyZWRfY29uZmlnX3VybCwgc2hhcmVkQ29uZmlndXJhdGlvbkFyZWEpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gY2hlY2sgZm9yIGEgcmVsYXRpdmUgVVJMCi0JCWlmICghc2hhcmVkQ29uZmlndXJhdGlvblVSTC5nZXRQYXRoKCkuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghcm9vdFVSTC5nZXRQcm90b2NvbCgpLmVxdWFscyhzaGFyZWRDb25maWd1cmF0aW9uVVJMLmdldFByb3RvY29sKCkpKSB7Ci0JCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19XQVJOSU5HLCBOTFMuYmluZChNZXNzYWdlcy5sb2dfc2hhcmVkX2NvbmZpZ19yZWxhdGl2ZV91cmwsIHJvb3RVUkwudG9FeHRlcm5hbEZvcm0oKSwgc2hhcmVkQ29uZmlndXJhdGlvbkFyZWEpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJc2hhcmVkQ29uZmlndXJhdGlvblVSTCA9IG5ldyBVUkwocm9vdFVSTCwgc2hhcmVkQ29uZmlndXJhdGlvbkFyZWEpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB1bmV4cGVjdGVkIHNpbmNlIHRoaXMgd2FzIHdyaXR0ZW4gYnkgdGhlIGZyYW1ld29yawotCQkJCUxvZy5sb2coTG9nU2VydmljZS5MT0dfV0FSTklORywgTkxTLmJpbmQoTWVzc2FnZXMubG9nX3NoYXJlZF9jb25maWdfcmVsYXRpdmVfdXJsLCByb290VVJMLnRvRXh0ZXJuYWxGb3JtKCksIHNoYXJlZENvbmZpZ3VyYXRpb25BcmVhKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJRmlsZSBzaGFyZWRDb25maWd1cmF0aW9uRm9sZGVyID0gbmV3IEZpbGUoc2hhcmVkQ29uZmlndXJhdGlvblVSTC5nZXRQYXRoKCkpOwotCQlpZiAoIXNoYXJlZENvbmZpZ3VyYXRpb25Gb2xkZXIuaXNEaXJlY3RvcnkoKSkgewotCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19XQVJOSU5HLCBOTFMuYmluZChNZXNzYWdlcy5sb2dfc2hhcmVkX2NvbmZpZ19maWxlX21pc3NpbmcsIHNoYXJlZENvbmZpZ3VyYXRpb25Gb2xkZXIpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRmlsZSBzaGFyZWRDb25maWdJbmkgPSBuZXcgRmlsZShzaGFyZWRDb25maWd1cmF0aW9uRm9sZGVyLCBFcXVpbm94Q29uc3RhbnRzLkNPTkZJR19JTkkpOwotCQlpZiAoIXNoYXJlZENvbmZpZ0luaS5leGlzdHMoKSkgewotCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19XQVJOSU5HLCBOTFMuYmluZChNZXNzYWdlcy5sb2dfc2hhcmVkX2NvbmZpZ19maWxlX21pc3NpbmcsIHNoYXJlZENvbmZpZ0luaSkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gc2hhcmVkQ29uZmlnSW5pOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgbWFrZVJlbGF0aXZlKFByb3BlcnRpZXMgcHJvcHMsIFVSTCByb290VVJMLCBGaWxlIGZ3SmFyLCBGaWxlIGNvbmZpZ0FyZWEsIEZpbGUgb3NnaUluc3RhbGxBcmVhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IFBBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IHByb3BzLmdldFByb3BlcnR5KFBBVEhTW2ldKTsKLQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJcHJvcHMucHV0KFBBVEhTW2ldLCBFcXVpbm94TWFuaXB1bGF0b3JJbXBsLm1ha2VSZWxhdGl2ZShwYXRoLCByb290VVJMLmdldEZpbGUoKSkpOwotCQl9Ci0KLQkJaWYgKHByb3BzLmdldFByb3BlcnR5KEtFWV9PU0dJX0ZSQU1FV09SSykgIT0gbnVsbCAmJiBvc2dpSW5zdGFsbEFyZWEgIT0gbnVsbCkgewotCQkJcHJvcHMucHV0KEtFWV9PU0dJX0ZSQU1FV09SSywgRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5tYWtlUmVsYXRpdmUocHJvcHMuZ2V0UHJvcGVydHkoS0VZX09TR0lfRlJBTUVXT1JLKSwgb3NnaUluc3RhbGxBcmVhLnRvVVJMKCkpKTsKLQkJfQotCi0JCWlmIChwcm9wcy5nZXRQcm9wZXJ0eShLRVlfT1JHX0VDTElQU0VfRVFVSU5PWF9TSU1QTEVDT05GSUdVUkFUT1JfQ09ORklHVVJMKSAhPSBudWxsKSB7Ci0JCQlwcm9wcy5wdXQoS0VZX09SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SX0NPTkZJR1VSTCwgRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5tYWtlUmVsYXRpdmUocHJvcHMuZ2V0UHJvcGVydHkoS0VZX09SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SX0NPTkZJR1VSTCksIGNvbmZpZ0FyZWEudG9VUkwoKSkpOwotCQl9Ci0KLQkJaWYgKHByb3BzLmdldFByb3BlcnR5KEtFWV9FQ0xJUFNFX1BST1ZfREFUQV9BUkVBKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdXJsID0gcHJvcHMuZ2V0UHJvcGVydHkoS0VZX0VDTElQU0VfUFJPVl9EQVRBX0FSRUEpOwotCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHJlc3VsdCA9IEVxdWlub3hNYW5pcHVsYXRvckltcGwubWFrZVJlbGF0aXZlKHVybCwgY29uZmlnQXJlYS50b1VSTCgpKTsKLQkJCQkvL1dlIG9ubHkgcmVsYXRpdml6ZSB1cCB0byB0aGUgbGV2ZWwgd2hlcmUgdGhlIHAyIGFuZCBjb25maWcgZm9sZGVyIGFyZSBzaWJsaW5ncyAoZS5nLiBmb28vcDIgYW5kIGZvby9jb25maWcpCi0JCQkJaWYgKHJlc3VsdC5zdGFydHNXaXRoKCJmaWxlOi4uLy4uIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmVzdWx0ID0gdXJsOwotCQkJCWVsc2UgaWYgKCFyZXN1bHQuZXF1YWxzKHVybCkgJiYgcmVzdWx0LnN0YXJ0c1dpdGgoImZpbGU6IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmVzdWx0ID0gQ09ORklHX0RJUiArIHJlc3VsdC5zdWJzdHJpbmcoNSk7Ci0JCQkJcHJvcHMucHV0KEtFWV9FQ0xJUFNFX1BST1ZfREFUQV9BUkVBLCByZXN1bHQpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIHZhbHVlID0gcHJvcHMuZ2V0UHJvcGVydHkoS0VZX09TR0lfQlVORExFUyk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIGZ3SmFyICE9IG51bGwpIHsKLQkJCUZpbGUgcGFyZW50ID0gZndKYXIuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKQotCQkJCXByb3BzLnNldFByb3BlcnR5KEtFWV9PU0dJX0JVTkRMRVMsIEVxdWlub3hNYW5pcHVsYXRvckltcGwubWFrZUFycmF5UmVsYXRpdmUodmFsdWUsIHBhcmVudC50b1VSTCgpKSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgbWFrZUFic29sdXRlKFByb3BlcnRpZXMgcHJvcHMsIFVSTCByb290VVJMLCBGaWxlIGZ3SmFyLCBGaWxlIGNvbmZpZ0FyZWEsIEZpbGUgb3NnaUluc3RhbGxBcmVhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKGludCBpID0gMDsgaSA8IFBBVEhTLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgcGF0aCA9IHByb3BzLmdldFByb3BlcnR5KFBBVEhTW2ldKTsKLQkJCWlmIChwYXRoICE9IG51bGwpCi0JCQkJcHJvcHMuc2V0UHJvcGVydHkoUEFUSFNbaV0sIEVxdWlub3hNYW5pcHVsYXRvckltcGwubWFrZUFic29sdXRlKHBhdGgsIHJvb3RVUkwuZ2V0RmlsZSgpKSk7Ci0JCX0KLQotCQlpZiAocHJvcHMuZ2V0UHJvcGVydHkoS0VZX09SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SX0NPTkZJR1VSTCkgIT0gbnVsbCkgewotCQkJcHJvcHMucHV0KEtFWV9PUkdfRUNMSVBTRV9FUVVJTk9YX1NJTVBMRUNPTkZJR1VSQVRPUl9DT05GSUdVUkwsIEVxdWlub3hNYW5pcHVsYXRvckltcGwubWFrZUFic29sdXRlKHByb3BzLmdldFByb3BlcnR5KEtFWV9PUkdfRUNMSVBTRV9FUVVJTk9YX1NJTVBMRUNPTkZJR1VSQVRPUl9DT05GSUdVUkwpLCBjb25maWdBcmVhLnRvVVJMKCkpKTsKLQkJfQotCi0JCWlmIChwcm9wcy5nZXRQcm9wZXJ0eShLRVlfRUNMSVBTRV9QUk9WX0RBVEFfQVJFQSkgIT0gbnVsbCkgewotCQkJU3RyaW5nIHVybCA9IHByb3BzLmdldFByb3BlcnR5KEtFWV9FQ0xJUFNFX1BST1ZfREFUQV9BUkVBKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkgewotCQkJCWlmICh1cmwuc3RhcnRzV2l0aChDT05GSUdfRElSKSkKLQkJCQkJdXJsID0gImZpbGU6IiArIHVybC5zdWJzdHJpbmcoQ09ORklHX0RJUi5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcm9wcy5wdXQoS0VZX0VDTElQU0VfUFJPVl9EQVRBX0FSRUEsIEVxdWlub3hNYW5pcHVsYXRvckltcGwubWFrZUFic29sdXRlKHVybCwgY29uZmlnQXJlYS50b1VSTCgpKSk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShLRVlfT1NHSV9CVU5ETEVTKTsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgZndKYXIgIT0gbnVsbCkgewotCQkJRmlsZSBwYXJlbnQgPSBmd0phci5nZXRQYXJlbnRGaWxlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpCi0JCQkJcHJvcHMuc2V0UHJvcGVydHkoS0VZX09TR0lfQlVORExFUywgRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5tYWtlQXJyYXlBYnNvbHV0ZSh2YWx1ZSwgcGFyZW50LnRvVVJMKCkpKTsKLQkJfQotCQlyZXR1cm4gcHJvcHM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldE9TR2lJbnN0YWxsQXJlYShMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhKSB7Ci0JCWlmIChsYXVuY2hlckRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdbXSBhcmdzID0gbGF1bmNoZXJEYXRhLmdldFByb2dyYW1BcmdzKCk7Ci0JCWlmIChhcmdzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJnc1tpXS5lcXVhbHMoIi1zdGFydHVwIikgJiYgaSArIDEgPCBhcmdzLmxlbmd0aCAmJiBhcmdzW2kgKyAxXS5jaGFyQXQoMSkgIT0gJy0nKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZnJvbU9TR2lKYXJUb09TR2lJbnN0YWxsQXJlYShhcmdzW2kgKyAxXSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGxhdW5jaGVyRGF0YS5nZXRGd0phcigpICE9IG51bGwpCi0JCQlyZXR1cm4gZnJvbU9TR2lKYXJUb09TR2lJbnN0YWxsQXJlYShsYXVuY2hlckRhdGEuZ2V0RndKYXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWlmIChsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXIoKSAhPSBudWxsKQotCQkJcmV0dXJuIGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpLmdldFBhcmVudEZpbGUoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBmcm9tT1NHaUphclRvT1NHaUluc3RhbGxBcmVhKFN0cmluZyBwYXRoKSB7Ci0JCUlQYXRoIHBhcmVudEZvbGRlciA9IG5ldyBQYXRoKHBhdGgpLnJlbW92ZUxhc3RTZWdtZW50cygxKTsKLQkJaWYgKHBhcmVudEZvbGRlci5sYXN0U2VnbWVudCgpLmVxdWFscygicGx1Z2lucyIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcGFyZW50Rm9sZGVyLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b0ZpbGUoKTsKLQkJcmV0dXJuIHBhcmVudEZvbGRlci50b0ZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlRndDb25maWcoQnVuZGxlSW5mb1tdIGJJbmZvcywgTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IsIGJvb2xlYW4gYmFja3VwLCBib29sZWFuIHJlbGF0aXZlKSB0aHJvd3MgSU9FeGNlcHRpb24gey8vewotCQlDb25maWdEYXRhIGNvbmZpZ0RhdGEgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCk7Ci0JCUxhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEgPSBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKTsKLQkJRmlsZSBmd0phciA9IEVxdWlub3hCdW5kbGVzU3RhdGUuZ2V0RndKYXIobGF1bmNoZXJEYXRhLCBjb25maWdEYXRhKTsKLQkJbGF1bmNoZXJEYXRhLnNldEZ3SmFyKGZ3SmFyKTsKLQkJRmlsZSBvdXRwdXRGaWxlID0gbGF1bmNoZXJEYXRhLmdldEZ3Q29uZmlnTG9jYXRpb24oKTsKLQkJaWYgKG91dHB1dEZpbGUuZXhpc3RzKCkpIHsKLQkJCWlmIChvdXRwdXRGaWxlLmlzRmlsZSgpKSB7Ci0JCQkJaWYgKCFvdXRwdXRGaWxlLmdldE5hbWUoKS5lcXVhbHMoRXF1aW5veENvbnN0YW50cy5DT05GSUdfSU5JKSkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fZndDb25maWdMb2NhdGlvbk5hbWUsIG91dHB1dEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIEVxdWlub3hDb25zdGFudHMuQ09ORklHX0lOSSkpOwotCQkJfSBlbHNlIHsgLy8gRGlyZWN0b3J5Ci0JCQkJb3V0cHV0RmlsZSA9IG5ldyBGaWxlKG91dHB1dEZpbGUsIEVxdWlub3hDb25zdGFudHMuQ09ORklHX0lOSSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoIW91dHB1dEZpbGUuZ2V0TmFtZSgpLmVxdWFscyhFcXVpbm94Q29uc3RhbnRzLkNPTkZJR19JTkkpKSB7Ci0JCQkJaWYgKCFvdXRwdXRGaWxlLm1rZGlyKCkpCi0JCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fZmFpbGVkVG9DcmVhdGVEaXIsIG91dHB1dEZpbGUpKTsKLQkJCQlvdXRwdXRGaWxlID0gbmV3IEZpbGUob3V0cHV0RmlsZSwgRXF1aW5veENvbnN0YW50cy5DT05GSUdfSU5JKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgaGVhZGVyID0gIlRoaXMgY29uZmlndXJhdGlvbiBmaWxlIHdhcyB3cml0dGVuIGJ5OiAiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCi0JCVByb3BlcnRpZXMgY29uZmlnUHJvcHMgPSBnZXRDb25maWdQcm9wcyhiSW5mb3MsIGNvbmZpZ0RhdGEsIGxhdW5jaGVyRGF0YSwgcmVsYXRpdmUsIGZ3SmFyKTsKLQkJaWYgKGNvbmZpZ1Byb3BzID09IG51bGwgfHwgY29uZmlnUHJvcHMuc2l6ZSgpID09IDApIHsKLQkJCUxvZy5sb2coTG9nU2VydmljZS5MT0dfV0FSTklORywgdGhpcywgInNhdmVGd0NvbmZpZygpICIsIE1lc3NhZ2VzLmxvZ19jb25maWdQcm9wcyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlVdGlscy5jcmVhdGVQYXJlbnREaXIob3V0cHV0RmlsZSk7Ci0KLQkJaWYgKERFQlVHKQotCQkJVXRpbHMucHJpbnRvdXRQcm9wZXJ0aWVzKFN5c3RlbS5vdXQsICJjb25maWdQcm9wcyIsIGNvbmZpZ1Byb3BzKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChiYWNrdXApCi0JCQlpZiAob3V0cHV0RmlsZS5leGlzdHMoKSkgewotCQkJCUZpbGUgZGVzdCA9IFV0aWxzLmdldFNpbXBsZURhdGFGb3JtYXR0ZWRGaWxlKG91dHB1dEZpbGUpOwotCQkJCWlmICghb3V0cHV0RmlsZS5yZW5hbWVUbyhkZXN0KSkKLQkJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmV4Y2VwdGlvbl9mYWlsZWRUb1JlbmFtZSwgb3V0cHV0RmlsZSwgZGVzdCkpOwotCQkJCUxvZy5sb2coTG9nU2VydmljZS5MT0dfSU5GTywgdGhpcywgInNhdmVGd0NvbmZpZygpIiwgTkxTLmJpbmQoTWVzc2FnZXMubG9nX3JlbmFtZVN1Y2Nlc3NmdWwsIG91dHB1dEZpbGUsIGRlc3QpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCUZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dEZpbGUpOwotCQkJY29uZmlnUHJvcHMgPSBtYWtlUmVsYXRpdmUoY29uZmlnUHJvcHMsIGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpLmdldFBhcmVudEZpbGUoKS50b1VSTCgpLCBmd0phciwgb3V0cHV0RmlsZS5nZXRQYXJlbnRGaWxlKCksIGdldE9TR2lJbnN0YWxsQXJlYShtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKSkpOwotCQkJZmlsdGVyUHJvcGVydGllc0Zyb21TaGFyZWRBcmVhKGNvbmZpZ1Byb3BzLCBsYXVuY2hlckRhdGEpOwotCQkJY29uZmlnUHJvcHMuc3RvcmUob3V0LCBoZWFkZXIpOwotCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19JTkZPLCBOTFMuYmluZChNZXNzYWdlcy5sb2dfZndDb25maWdTYXZlLCBvdXRwdXRGaWxlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCW91dC5mbHVzaCgpOwotCQkJCW91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlvdXQgPSBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbHRlclByb3BlcnRpZXNGcm9tU2hhcmVkQXJlYShQcm9wZXJ0aWVzIGNvbmZpZ1Byb3BzLCBMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhKSB7Ci0JCS8vUmVtb3ZlIGZyb20gdGhlIGNvbmZpZyBmaWxlIHRoYXQgd2UgYXJlIGFib3V0IHRvIHdyaXRlIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHVuY2hhbmdlZCBjb21wYXJlZCB0byB3aGF0IGlzIGluIHRoZSBiYXNlIAotCQlQcm9wZXJ0aWVzIHNoYXJlZENvbmZpZ1Byb3BlcnRpZXMgPSBnZXRTaGFyZWRDb25maWd1cmF0aW9uKGNvbmZpZ1Byb3BzLmdldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9TSEFSRURfQ09ORklHVVJBVElPTl9BUkVBKSwgZ2V0T1NHaUluc3RhbGxBcmVhKGxhdW5jaGVyRGF0YSkpOwotCQlpZiAoc2hhcmVkQ29uZmlnUHJvcGVydGllcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlFbnVtZXJhdGlvbiBrZXlzID0gY29uZmlnUHJvcHMucHJvcGVydHlOYW1lcygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCVN0cmluZyBzaGFyZWRWYWx1ZSA9IHNoYXJlZENvbmZpZ1Byb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKLQkJCWlmIChzaGFyZWRWYWx1ZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGVxdWFsc0lnbm9yaW5nU2VwYXJhdG9ycyhzaGFyZWRWYWx1ZSwgY29uZmlnUHJvcHMuZ2V0UHJvcGVydHkoa2V5KSkpCi0JCQkJY29uZmlnUHJvcHMucmVtb3ZlKGtleSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXF1YWxzSWdub3JpbmdTZXBhcmF0b3JzKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7Ci0JCWlmIChzMSA9PSBudWxsICYmIHMyID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHMxID09IG51bGwgfHwgczIgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nQnVmZmVyIHNiMSA9IG5ldyBTdHJpbmdCdWZmZXIoczEpOwotCQlTdHJpbmdCdWZmZXIgc2IyID0gbmV3IFN0cmluZ0J1ZmZlcihzMik7Ci0JCWNhbm9uaWNhbGl6ZVBhdGhzRm9yQ29tcGFyaXNvbihzYjEpOwotCQljYW5vbmljYWxpemVQYXRoc0ZvckNvbXBhcmlzb24oc2IyKTsKLQkJcmV0dXJuIHNiMS50b1N0cmluZygpLmVxdWFscyhzYjIudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNhbm9uaWNhbGl6ZVBhdGhzRm9yQ29tcGFyaXNvbihTdHJpbmdCdWZmZXIgcykgewotCQlmaW5hbCBTdHJpbmdbXSB0b2tlbnMgPSBuZXcgU3RyaW5nW10geyJcXFxcIiwgIlxcIiwgIi8vIiwgIi8ifTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy00JAotCQlmb3IgKGludCB0ID0gMDsgdCA8IHRva2Vucy5sZW5ndGg7IHQrKykgewotCQkJaW50IGlkeCA9IHMubGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gcy5sZW5ndGgoKTsgaSAhPSAwICYmIGlkeCAhPSAtMTsgaS0tKSB7Ci0JCQkJaWR4ID0gcy50b1N0cmluZygpLmxhc3RJbmRleE9mKHRva2Vuc1t0XSwgaWR4KTsKLQkJCQlpZiAoaWR4ICE9IC0xKQotCQkJCQlzLnJlcGxhY2UoaWR4LCBpZHggKyB0b2tlbnNbdF0ubGVuZ3RoKCksICJeIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgUHJvcGVydGllcyBnZXRTaGFyZWRDb25maWd1cmF0aW9uKFN0cmluZyBzaGFyZWRDb25maWd1cmF0aW9uQXJlYSwgRmlsZSBiYXNlRmlsZSkgewotCQlpZiAoc2hhcmVkQ29uZmlndXJhdGlvbkFyZWEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlGaWxlIHNoYXJlZENvbmZpZ0luaTsKLQkJdHJ5IHsKLQkJCXNoYXJlZENvbmZpZ0luaSA9IGZpbmRTaGFyZWRDb25maWdJbmlGaWxlKGJhc2VGaWxlLnRvVVJMKCksIHNoYXJlZENvbmZpZ3VyYXRpb25BcmVhKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChzaGFyZWRDb25maWdJbmkgIT0gbnVsbCAmJiBzaGFyZWRDb25maWdJbmkuZXhpc3RzKCkpCi0JCQl0cnkgewotCQkJCXJldHVybiBsb2FkUHJvcGVydGllcyhzaGFyZWRDb25maWdJbmkpOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94TGF1bmNoZXJEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hMYXVuY2hlckRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY5MTE1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hMYXVuY2hlckRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3g7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5MYXVuY2hlckRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBFcXVpbm94TGF1bmNoZXJEYXRhIGV4dGVuZHMgTGF1bmNoZXJEYXRhIHsKLQlGaWxlIHByZXZpb3VzTGF1bmNoZXIgPSBudWxsOwotCi0JcHVibGljIEVxdWlub3hMYXVuY2hlckRhdGEoU3RyaW5nIGZ3TmFtZSwgU3RyaW5nIGZ3VmVyc2lvbiwgU3RyaW5nIGxhdW5jaGVyTmFtZSwgU3RyaW5nIGxhdW5jaGVyVmVyc2lvbikgewotCQlzdXBlcihmd05hbWUsIGZ3VmVyc2lvbiwgbGF1bmNoZXJOYW1lLCBsYXVuY2hlclZlcnNpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhdW5jaGVyKEZpbGUgbGF1bmNoZXJGaWxlKSB7Ci0JCWlmIChwcmV2aW91c0xhdW5jaGVyID09IG51bGwgJiYgbGF1bmNoZXJGaWxlICE9IG51bGwgJiYgIWxhdW5jaGVyRmlsZS5lcXVhbHMoZ2V0TGF1bmNoZXIoKSkpCi0JCQlwcmV2aW91c0xhdW5jaGVyID0gRXF1aW5veE1hbmlwdWxhdG9ySW1wbC5nZXRMYXVuY2hlckNvbmZpZ0xvY2F0aW9uKHRoaXMpOwotCQlzdXBlci5zZXRMYXVuY2hlcihsYXVuY2hlckZpbGUpOwotCX0KLQotCUZpbGUgZ2V0UHJldmlvdXNMYXVuY2hlckluaSgpIHsKLQkJcmV0dXJuIHByZXZpb3VzTGF1bmNoZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9FcXVpbm94TWFuaXB1bGF0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hNYW5pcHVsYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1MDUzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0VxdWlub3hNYW5pcHVsYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veC51dGlscy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlscy5TaW1wbGVCdW5kbGVzU3RhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlscy5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yLkNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UubG9nLkxvZ1NlcnZpY2U7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5zdGFydGxldmVsLlN0YXJ0TGV2ZWw7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi1wdWJsaWMgY2xhc3MgRXF1aW5veE1hbmlwdWxhdG9ySW1wbCBpbXBsZW1lbnRzIE1hbmlwdWxhdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIERFRkFVTFRfTEFTVE1PRElGSUVEID0gMEw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBMT0dfSUxMRUdBTFNUQVRFRVhDRVBUSU9OID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BID0gIiwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZToiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJZiB0aGUgZndDb25maWdMb2NhdGlvbiBpcyBhIGZpbGUgYW5kIGl0cyBuYW1lIGRvZXMgbm90IGVxdWFsICJjb25maWcuaW5pIiwKLQkgKiB0aHJvdyBhbiBJbGxlZ2FTdGF0ZUV4Y2VwdGlvbi4gCi0JICogSWYgdGhlIGZ3Q29uZmlnTG9jYXRpb24gaXMgYSBmaWxlIGFuZCBpdHMgbmFtZSBlcXVhbHMgImNvbmZpZy5pbmkiLAotCSAqIGZ3Q29uZmlnTG9jYXRpb24gd2lsbCBiZSB1cGRhdGVkIGJ5IGl0cyBwYXJlbnQgZGlyZWN0b3J5LgotCSAqIAotCSAqIFRoZW4sIHJlc2V0IGZ3Q29uZmlnTG9jYXRpb24gYW5kIGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiB0byBiZSBtYXRjaGVkLgotCSAqIAotCSAqIEBwYXJhbSBsYXVuY2hlckRhdGEKLQkgKi8KLQlzdGF0aWMgdm9pZCBjaGVja0NvbnNpc3RlbmN5T2ZGd0NvbmZpZ0xvY0FuZEZ3UGVyc2lzdGVudERhdGFMb2MoTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSkgewotCQlGaWxlIGZ3Q29uZmlnTG9jYXRpb24gPSBsYXVuY2hlckRhdGEuZ2V0RndDb25maWdMb2NhdGlvbigpOwotCQlGaWxlIGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiA9IGxhdW5jaGVyRGF0YS5nZXRGd1BlcnNpc3RlbnREYXRhTG9jYXRpb24oKTsKLQotCQlpZiAoZndDb25maWdMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAoZndDb25maWdMb2NhdGlvbi5pc0ZpbGUoKSkgewotCQkJCWlmIChmd0NvbmZpZ0xvY2F0aW9uLmdldE5hbWUoKS5lcXVhbHMoRXF1aW5veENvbnN0YW50cy5DT05GSUdfSU5JKSkKLQkJCQkJZndDb25maWdMb2NhdGlvbiA9IGZ3Q29uZmlnTG9jYXRpb24uZ2V0UGFyZW50RmlsZSgpOwotCQkJCWVsc2UKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZndDb25maWdMb2NhdGlvbiBpcyBub3QgYSBkaXJlY3RvcnkgYnV0IGl0cyBuYW1lIGRvZXMgTk9UIGVxdWFsIFwiIiArIEVxdWlub3hDb25zdGFudHMuQ09ORklHX0lOSSArICJcIiFcbiIgKyAiXHRmd0NvbmZpZ0xvY2F0aW9uPSIgKyBmd0NvbmZpZ0xvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpICsgIlxuXHQsZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uPSIgKyBmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKGZ3Q29uZmlnTG9jYXRpb24pOwotCQkJfQotCQkJaWYgKGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJLy8JCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19ERUJVRywgImZ3Q29uZmlnTG9jYXRpb249IiArIGZ3Q29uZmlnTG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLFxuXHRmd0luc3RhbmNlUHJpdmF0ZUFyZWE9IiArIGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJLy9pZiAoIWZ3Q29uZmlnTG9jYXRpb24uZ2V0UGFyZW50RmlsZSgpLmVxdWFscyhmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24pKQotCQkJCS8vdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiIWNvbmZpZ0ZpbGUuZ2V0UGFyZW50RmlsZSgpLmVxdWFscyhmd0luc3RhbmNlUHJpdmF0ZUFyZWEpXG4iICsgIlx0Y29uZmlnRmlsZT0iICsgZndDb25maWdMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSArICJcblx0LGZ3SW5zdGFuY2VQcml2YXRlQXJlYT0iICsgZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQlpZiAoIWZ3Q29uZmlnTG9jYXRpb24uZXF1YWxzKGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbikpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIiFmd0NvbmZpZ0xvY2F0aW9uLmVxdWFscyhmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24pXG4iICsgIlx0IWZ3Q29uZmlnTG9jYXRpb249IiArIGZ3Q29uZmlnTG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkgKyAiXG5cdCxmd1BlcnNpc3RlbnREYXRhTG9jYXRpb249IiArIGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQl9IGVsc2UKLQkJCQlsYXVuY2hlckRhdGEuc2V0RndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKGZ3Q29uZmlnTG9jYXRpb24sIGxhdW5jaGVyRGF0YS5pc0NsZWFuKCkpOwotCQkJLy9sYXVuY2hlckRhdGEuc2V0RndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKGZ3Q29uZmlnTG9jYXRpb24uZ2V0UGFyZW50RmlsZSgpLCBsYXVuY2hlckRhdGEuaXNDbGVhbigpKTsKLQkJfSBlbHNlIHsKLQkJCWlmIChmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbik7Ci0JCQkJLy9sYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihuZXcgRmlsZShmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24sIEVxdWlub3hDb25zdGFudHMuQ09ORklHX0lOSSkpOwotCQkJfSBlbHNlIHsKLQkJCQlGaWxlIGhvbWUgPSBsYXVuY2hlckRhdGEuZ2V0SG9tZSgpOwotCQkJCWlmIChob21lID09IG51bGwpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFsbCBvZiBmd0NvbmZpZ0xvY2F0aW9uLCBmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24sIGFuZCBob21lIGFyZSBub3Qgc2V0Iik7Ci0JCQkJZndDb25maWdMb2NhdGlvbiA9IG5ldyBGaWxlKGhvbWUsICJjb25maWd1cmF0aW9uIik7Ci0JCQkJbGF1bmNoZXJEYXRhLnNldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbihmd0NvbmZpZ0xvY2F0aW9uLCBsYXVuY2hlckRhdGEuaXNDbGVhbigpKTsKLQkJCQlsYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihmd0NvbmZpZ0xvY2F0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXN0YXRpYyBGaWxlIGdldExhdW5jaGVyQ29uZmlnTG9jYXRpb24oTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSkgewotCQlGaWxlIGxhdW5jaGVyQ29uZmlnTG9jYXRpb24gPSBsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXJDb25maWdMb2NhdGlvbigpOwotCQlpZiAobGF1bmNoZXJDb25maWdMb2NhdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIGxhdW5jaGVyQ29uZmlnTG9jYXRpb247Ci0KLQkJRmlsZSBsYXVuY2hlciA9IGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpOwotCQlpZiAobGF1bmNoZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbGF1bmNoZXJOYW1lID0gbGF1bmNoZXIuZ2V0TmFtZSgpOwotCQlpbnQgZG90TG9jYXRpb24gPSBsYXVuY2hlck5hbWUubGFzdEluZGV4T2YoIi4iKTsKLQkJaWYgKGRvdExvY2F0aW9uICE9IC0xKQotCQkJbGF1bmNoZXJOYW1lID0gbGF1bmNoZXJOYW1lLnN1YnN0cmluZygwLCBkb3RMb2NhdGlvbik7Ci0JCUZpbGUgcmVzdWx0ID0gbmV3IEZpbGUobGF1bmNoZXIuZ2V0UGFyZW50KCkgKyBGaWxlLnNlcGFyYXRvciArIGxhdW5jaGVyTmFtZSArIEVxdWlub3hDb25zdGFudHMuSU5JX0VYVEVOU0lPTik7Ci0JCS8vCQlsYXVuY2hlckRhdGEuc2V0TGF1bmNoZXJDb25maWdMb2NhdGlvbihyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUNvbmZpZ0RhdGEgY29uZmlnRGF0YSA9IG5ldyBDb25maWdEYXRhKEVxdWlub3hDb25zdGFudHMuRldfTkFNRSwgRXF1aW5veENvbnN0YW50cy5GV19WRVJTSU9OLCBFcXVpbm94Q29uc3RhbnRzLkxBVU5DSEVSX05BTUUsIEVxdWlub3hDb25zdGFudHMuTEFVTkNIRVJfVkVSU0lPTik7Ci0JRXF1aW5veExhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEgPSBuZXcgRXF1aW5veExhdW5jaGVyRGF0YShFcXVpbm94Q29uc3RhbnRzLkZXX05BTUUsIEVxdWlub3hDb25zdGFudHMuRldfVkVSU0lPTiwgRXF1aW5veENvbnN0YW50cy5MQVVOQ0hFUl9OQU1FLCBFcXVpbm94Q29uc3RhbnRzLkxBVU5DSEVSX1ZFUlNJT04pOwotCi0JQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIFByb3BlcnRpZXMgcGxhdGZvcm1Qcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotCVNlcnZpY2VUcmFja2VyIGNtVHJhY2tlcjsKLQlpbnQgdHJhY2tpbmdDb3VudCA9IC0xOwotCi0JLy8JcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJ1bnRpbWU7Ci0KLQlDb25maWd1cmF0b3JNYW5pcHVsYXRvciBjb25maWd1cmF0b3JNYW5pcHVsYXRvcjsKLQotCUVxdWlub3hGd0FkbWluSW1wbCBmd0FkbWluID0gbnVsbDsKLQotCUVxdWlub3hNYW5pcHVsYXRvckltcGwoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBFcXVpbm94RndBZG1pbkltcGwgZndBZG1pbikgewotCQl0aGlzKGNvbnRleHQsIGZ3QWRtaW4sIGZhbHNlKTsKLQl9Ci0KLQlFcXVpbm94TWFuaXB1bGF0b3JJbXBsKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgRXF1aW5veEZ3QWRtaW5JbXBsIGZ3QWRtaW4sIGJvb2xlYW4gcnVudGltZSkgewotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLmZ3QWRtaW4gPSBmd0FkbWluOwotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQljbVRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoY29udGV4dCwgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLQkJCWNtVHJhY2tlci5vcGVuKCk7Ci0JCX0KLQkJLy8JCXRoaXMucnVudGltZSA9IHJ1bnRpbWU7Ci0JCWlmIChydW50aW1lKQotCQkJaW5pdGlhbGl6ZVJ1bnRpbWUoKTsKLQkJLy8gWFhYIEZvciBFcXVpbm94LCBkZWZhdWx0IHZhbHVlIG9mIEluaXRpYWwgQnVuZGxlIFN0YXJ0IExldmVsIGlzIDQuCi0JCS8vIFByZWNpc2VseSBzcGVha2luZywgaXQncyBub3QgY29ycmVjdC4gCi0JCS8vIEVxdWlub3ggZG9lc24ndCBzdXBwb3J0IHNldHRpbmcgaW5pdGlhbCBidW5kbGUgc3RhcnQgbGV2ZWwgYXMgYW4gT1NHaSB0ZXJtaW5vbG9neS4KLQkJLy8gT25seSBidW5kbGVzIGluc3RhbGxlZCBieSBjb25maWcuaW5pIGFuZCB1cGRhdGVjb25maWd1cmF0b3Igd2lsbCBoYXZlIHRoYXQgc3RhcnQgbGV2ZWwoNCkuCi0JCS8vIE90aGVycyBoYXMgYSBzdGFydCBsZXZlbCBvZiAxLgotCQljb25maWdEYXRhLnNldEluaXRpYWxCdW5kbGVTdGFydExldmVsKDQpOwotCX0KLQotCXB1YmxpYyBCdW5kbGVzU3RhdGUgZ2V0QnVuZGxlc1N0YXRlKCkgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFNpbXBsZUJ1bmRsZXNTdGF0ZShmd0FkbWluLCB0aGlzLCBFcXVpbm94Q29uc3RhbnRzLkZXX1NZTUJPTElDX05BTUUpOwotCi0JCWlmICghRXF1aW5veEJ1bmRsZXNTdGF0ZS5jaGVja0Z1bGx5U3VwcG9ydGVkKCkpCi0JCQlyZXR1cm4gbmV3IFNpbXBsZUJ1bmRsZXNTdGF0ZShmd0FkbWluLCB0aGlzLCBFcXVpbm94Q29uc3RhbnRzLkZXX1NZTUJPTElDX05BTUUpOwotCi0JCWlmIChwbGF0Zm9ybVByb3BlcnRpZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG5ldyBFcXVpbm94QnVuZGxlc1N0YXRlKGNvbnRleHQsIGZ3QWRtaW4sIHRoaXMsIGZhbHNlKTsKLQkJLy8gWFhYIGNoZWNraW5nIGlmIGZ3RGVwZW5kZW50IG9yIGZ3SW5kZXBlbmRlbnQgcGxhdGZvcm1Qcm9wZXJ0aWVzIGFyZSB1cGRhdGVkIGFmdGVyIHRoZSBwbGF0Zm9ybVByb3BlcnRpZXMgd2FzIGNyZWF0ZWQgbWlnaHQgYmUgcmVxdWlyZWQgZm9yIGJldHRlciBpbXBsZW1lbnRhdGlvbi4JCQotCQlyZXR1cm4gbmV3IEVxdWlub3hCdW5kbGVzU3RhdGUoY29udGV4dCwgZndBZG1pbiwgdGhpcywgcGxhdGZvcm1Qcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlnRGF0YSBnZXRDb25maWdEYXRhKCkgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBjb25maWdEYXRhOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvW10gZ2V0RXhwZWN0ZWRTdGF0ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCS8vTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19ERUJVRywgdGhpcywgImdldEV4cGVjdGVkU3RhdGUoKSIsICJCRUdJTiIpOwotCQlTaW1wbGVCdW5kbGVzU3RhdGUuY2hlY2tBdmFpbGFiaWxpdHkoZndBZG1pbik7Ci0KLQkJQnVuZGxlc1N0YXRlIGJ1bmRsZVN0YXRlID0gdGhpcy5nZXRCdW5kbGVzU3RhdGUoKTsKLQkJaWYgKGJ1bmRsZVN0YXRlIGluc3RhbmNlb2YgU2ltcGxlQnVuZGxlc1N0YXRlKQotCQkJcmV0dXJuIG5ldyBCdW5kbGVJbmZvWzBdOwotCQlidW5kbGVTdGF0ZS5yZXNvbHZlKHRydWUpOwotCi0JCXJldHVybiBidW5kbGVTdGF0ZS5nZXRFeHBlY3RlZFN0YXRlKCk7Ci0JfQotCi0JcHVibGljIExhdW5jaGVyRGF0YSBnZXRMYXVuY2hlckRhdGEoKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGxhdW5jaGVyRGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gbG9jYXRpb24uCi0JICogCi0JICogQHNlZSBMb2NhdGlvbgotCSAqLwotCXByaXZhdGUgRmlsZSBnZXRSdW5uaW5nQ29uZmlndXJhdGlvbkxvY2F0aW9uKCkgewotCQlTZXJ2aWNlVHJhY2tlciB0cmFja2VyID0gbnVsbDsKLQkJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaWx0ZXIgPSBjb250ZXh0LmNyZWF0ZUZpbHRlcihMb2NhdGlvbi5DT05GSUdVUkFUSU9OX0ZJTFRFUik7Ci0JCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlIHRoaXMuIEl0IHNob3VsZCBuZXZlciBoYXBwZW4gYXMgd2UgaGF2ZSB0ZXN0ZWQgdGhlIGFib3ZlIGZvcm1hdC4KLQkJfQotCQl0cmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIGZpbHRlciwgbnVsbCk7Ci0JCXRyYWNrZXIub3BlbigpOwotCQlMb2NhdGlvbiBsb2NhdGlvbiA9IChMb2NhdGlvbikgdHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0JCVVSTCB1cmwgPSBsb2NhdGlvbi5nZXRVUkwoKTsKLQkJaWYgKCF1cmwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IEZpbGUodXJsLmdldEZpbGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGdldFJ1bm5pbmdMYXVuY2hlckZpbGUoKSB7Ci0JCUZpbGUgbGF1bmNoZXJGaWxlID0gbnVsbDsKLQkJU3RyaW5nIGVjbGlwc2VDb21tYW5kc1N0ID0gY29udGV4dC5nZXRQcm9wZXJ0eShFcXVpbm94Q29uc3RhbnRzLlBST1BfRUNMSVBTRV9DT01NQU5EUyk7Ci0JCWlmIChlY2xpcHNlQ29tbWFuZHNTdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZWNsaXBzZUNvbW1hbmRzU3QsICJcbiIpOwotCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCVN0cmluZyBsYXVuY2hlclN0ID0gbnVsbDsKLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWlmIChmb3VuZCkgewotCQkJCWxhdW5jaGVyU3QgPSB0b2tlbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICh0b2tlbi5lcXVhbHMoIi1sYXVuY2hlciIpKQotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJfQotCQlpZiAobGF1bmNoZXJTdCAhPSBudWxsKQotCQkJbGF1bmNoZXJGaWxlID0gbmV3IEZpbGUobGF1bmNoZXJTdCk7Ci0JCXJldHVybiBsYXVuY2hlckZpbGU7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGdldFJ1bm5pbmdQbGF0Zm9ybVByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IEVxdWlub3hCdW5kbGVzU3RhdGUuUFJPUFMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB2YWx1ZSA9IGNvbnRleHQuZ2V0UHJvcGVydHkoRXF1aW5veEJ1bmRsZXNTdGF0ZS5QUk9QU1tpXSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQlwcm9wcy5zZXRQcm9wZXJ0eShFcXVpbm94QnVuZGxlc1N0YXRlLlBST1BTW2ldLCB2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIHByb3BzOwotCX0KLQotCXB1YmxpYyBsb25nIGdldFRpbWVTdGFtcCgpIHsKLQkJbG9uZyByZXQgPSB0aGlzLmdldFRpbWVTdGFtcFdpdGhvdXRGd1BlcnNpc3RlbnREYXRhKCk7Ci0JCWlmICh0aGlzLmxhdW5jaGVyRGF0YS5pc0NsZWFuKCkpCi0JCQlyZXR1cm4gcmV0OwotCQlsb25nIGxhc3RNb2RpZmllZEZ3UGVyc2lzdGVudCA9IEVxdWlub3hCdW5kbGVzU3RhdGUuZ2V0VGltZVN0YW1wKGxhdW5jaGVyRGF0YS5nZXRGd1BlcnNpc3RlbnREYXRhTG9jYXRpb24oKSk7Ci0JCXJldHVybiBNYXRoLm1heChyZXQsIGxhc3RNb2RpZmllZEZ3UGVyc2lzdGVudCk7Ci0JfQotCi0JcHJpdmF0ZSBsb25nIGdldFRpbWVTdGFtcFdpdGhvdXRGd1BlcnNpc3RlbnREYXRhKCkgewotCQlTaW1wbGVCdW5kbGVzU3RhdGUuY2hlY2tBdmFpbGFiaWxpdHkoZndBZG1pbik7Ci0JCUZpbGUgbGF1bmNoZXJDb25maWdGaWxlID0gZ2V0TGF1bmNoZXJDb25maWdMb2NhdGlvbihsYXVuY2hlckRhdGEpOwotCQlsb25nIGxhc3RNb2RpZmllZExhdW5jaGVyQ29uZmlnRmlsZSA9IERFRkFVTFRfTEFTVE1PRElGSUVEOwotCQlsb25nIGxhc3RNb2RpZmllZEZ3Q29uZmlnRmlsZSA9IERFRkFVTFRfTEFTVE1PRElGSUVEOwotCQlpZiAobGF1bmNoZXJDb25maWdGaWxlICE9IG51bGwpIHsKLQkJCS8vIHVzZSBsYXVuY2hlci4gLS0gPiBsb2FkIGZyb20gTGF1Y25oZXJDb25maWcgZmlsZS4KLQkJCWxhc3RNb2RpZmllZExhdW5jaGVyQ29uZmlnRmlsZSA9IGxhdW5jaGVyQ29uZmlnRmlsZS5sYXN0TW9kaWZpZWQoKTsKLQkJfQotCQljaGVja0NvbnNpc3RlbmN5T2ZGd0NvbmZpZ0xvY0FuZEZ3UGVyc2lzdGVudERhdGFMb2MobGF1bmNoZXJEYXRhKTsKLQotCQlpZiAobGF1bmNoZXJEYXRhLmdldEZ3Q29uZmlnTG9jYXRpb24oKSAhPSBudWxsKSB7Ci0JCQlGaWxlIGZ3Q29uZmlnRmlsZSA9IG5ldyBGaWxlKGxhdW5jaGVyRGF0YS5nZXRGd0NvbmZpZ0xvY2F0aW9uKCksIEVxdWlub3hDb25zdGFudHMuQ09ORklHX0lOSSk7Ci0JCQlsYXN0TW9kaWZpZWRGd0NvbmZpZ0ZpbGUgPSBmd0NvbmZpZ0ZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCX0KLQkJbG9uZyByZXQgPSBNYXRoLm1heChsYXN0TW9kaWZpZWRMYXVuY2hlckNvbmZpZ0ZpbGUsIGxhc3RNb2RpZmllZEZ3Q29uZmlnRmlsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLy8JLy8gCi0JLy8JcHVibGljIHZvaWQgbG9hZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCS8vCQl0aGlzLmxvYWQodHJ1ZSk7Ci0JLy8JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19ERUJVRywgdGhpcywgImluaXRpYWxpemUoKSIsICJCRUdJTiIpOwotCQljb25maWdEYXRhLmluaXRpYWxpemUoKTsKLQkJbGF1bmNoZXJEYXRhLmluaXRpYWxpemUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVJ1bnRpbWUoKSB7Ci0JCS8vVE9ETyByZWZpbmUgdGhlIGltcGxlbWVudGF0aW9uLiB1c2luZyBzb21lIE1BR0lDIGRlcGVuZGVudCBvbiBFY2xpcHNlLmV4ZSBhbmQgRXF1aW5veCBpbXBsZW1lbnRhdGlvbiwKLQkJLy8gc2V0IHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHJ1bm5pbmcgZncuCi0KLQkJLy8gMS4gcmV0cmlldmUgbG9jYXRpb24gZGF0YSBmcm9tIExvY2F0aW9uIHNlcnZpY2VzIHJlZ2lzdGVyZWQgYnkgZXF1aW5veCBmdy4KLQkJU3RyaW5nIGZ3SmFyTG9jYXRpb24gPSBjb250ZXh0LmdldFByb3BlcnR5KEVxdWlub3hDb25zdGFudHMuUFJPUF9PU0dJX0ZXKTsKLQkJaWYgKCFmd0phckxvY2F0aW9uLnN0YXJ0c1dpdGgoImZpbGU6IikpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDdXJyZW50IGltcGxlbWVudGF0aW9uIGFzc3VtZSB0aGF0IHByb3BlcnR5IHZhbHVlIGtleWVkIGJ5ICIgKyBFcXVpbm94Q29uc3RhbnRzLlBST1BfT1NHSV9GVyArICIgbXVzdCBzdGFydCB3aXRoIFwiZmlsZTpcIi4gQnV0IGl0IHdhcyBub3Q6IiArIGZ3SmFyTG9jYXRpb24pOwotCQlGaWxlIGZ3SmFyID0gbmV3IEZpbGUoZndKYXJMb2NhdGlvbi5zdWJzdHJpbmcoImZpbGU6Ii5sZW5ndGgoKSkpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZndKYXI9IiArIGZ3SmFyKTsKLQkJRmlsZSBmd0NvbmZpZ0xvY2F0aW9uID0gZ2V0UnVubmluZ0NvbmZpZ3VyYXRpb25Mb2NhdGlvbigpOwotCQlGaWxlIGxhdW5jaGVyRmlsZSA9IGdldFJ1bm5pbmdMYXVuY2hlckZpbGUoKTsKLQkJbGF1bmNoZXJEYXRhLnNldEZ3SmFyKGZ3SmFyKTsKLQkJbGF1bmNoZXJEYXRhLnNldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbihmd0NvbmZpZ0xvY2F0aW9uLCBmYWxzZSk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlcihsYXVuY2hlckZpbGUpOwotCQl0cnkgewotCQkJdGhpcy5sb2FkV2l0aG91dEZ3UGVyc2lzdGVudERhdGEoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUxLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJLy8gMi4gQ3JlYXRlIGEgTWFuaXB1bGF0b3Igb2JqZWN0IGZ1bGx5IGluaXRpYWxpemVkIHRvIHRoZSBjdXJyZW50IHJ1bm5pbmcgZncuCi0KLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoU3RhcnRMZXZlbC5jbGFzcy5nZXROYW1lKCkpOwotCQlTdGFydExldmVsIHN0YXJ0TGV2ZWwgPSAoU3RhcnRMZXZlbCkgY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCUJ1bmRsZVtdIGJ1bmRsZXMgPSBjb250ZXh0LmdldEJ1bmRsZXMoKTsKLQkJQnVuZGxlSW5mb1tdIGJJbmZvcyA9IG5ldyBCdW5kbGVJbmZvW2J1bmRsZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigiYnVuZGxlc1siICsgaSArICJdPSIgKyBidW5kbGVzW2ldKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGJ1bmRsZXNbaV0uZ2V0QnVuZGxlSWQoKSA9PSAwKSAvLyBTeXN0ZW1CdW5kbGUKLQkJCQkJYkluZm9zW2ldID0gbmV3IEJ1bmRsZUluZm8oYnVuZGxlc1tpXS5nZXRTeW1ib2xpY05hbWUoKSwgKFN0cmluZykgYnVuZGxlc1tpXS5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIEZpbGVMb2NhdG9yLmdldEJ1bmRsZUZpbGUoYnVuZGxlc1tpXSkuZ2V0QWJzb2x1dGVQYXRoKCksIC0xLCB0cnVlKTsKLQkJCQllbHNlIHsKLQkJCQkJYkluZm9zW2ldID0gbmV3IEJ1bmRsZUluZm8oYnVuZGxlc1tpXS5nZXRTeW1ib2xpY05hbWUoKSwgKFN0cmluZykgYnVuZGxlc1tpXS5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTiksIEZpbGVMb2NhdG9yLmdldEJ1bmRsZUZpbGUoYnVuZGxlc1tpXSkuZ2V0QWJzb2x1dGVQYXRoKCksIHN0YXJ0TGV2ZWwuZ2V0QnVuZGxlU3RhcnRMZXZlbChidW5kbGVzW2ldKSwgc3RhcnRMZXZlbC5pc0J1bmRsZVBlcnNpc3RlbnRseVN0YXJ0ZWQoYnVuZGxlc1tpXSkpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCWNvbmZpZ0RhdGEuc2V0QnVuZGxlcyhiSW5mb3MpOwotCQlwbGF0Zm9ybVByb3BlcnRpZXMgPSB0aGlzLmdldFJ1bm5pbmdQbGF0Zm9ybVByb3BlcnRpZXMoKTsKLQotCQkvLyBjb3B5IHN5c3RlbSBwcm9wZXJ0aWVzIHRvIENvbmZpZ0RhdGEKLQkJUHJvcGVydGllcyBwcm9wcyA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWZvciAoRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBwcm9wcy5rZXlzKCk7IGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSBwcm9wcy5nZXRQcm9wZXJ0eShrZXkpOwotCQkJaWYgKHRvQmVFbGltaW5hdGVkKGtleSkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoRXF1aW5veEZ3Q29uZmlnRmlsZVBhcnNlci5pc0Z3RGVwZW5kZW50KGtleSkpCi0JCQkJY29uZmlnRGF0YS5zZXRGd0RlcGVuZGVudFByb3Aoa2V5LCB2YWx1ZSk7Ci0JCQllbHNlCi0JCQkJY29uZmlnRGF0YS5zZXRGd0luZGVwZW5kZW50UHJvcChrZXksIHZhbHVlKTsKLQkJfQotCi0JCS8vIHVwZGF0ZSBpbml0aWFsQnVuZGxlU3RhcnRMZXZlbAotCQlTdGFydExldmVsIHNsQWRtaW4gPSAoU3RhcnRMZXZlbCkgQWN0aXZhdG9yLmFjcXVpcmVTZXJ2aWNlKFN0YXJ0TGV2ZWwuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaW50IGluaXRpYWxCU0wgPSBjb25maWdEYXRhLmdldEluaXRpYWxCdW5kbGVTdGFydExldmVsKCk7Ci0JCWlmIChpbml0aWFsQlNMICE9IHNsQWRtaW4uZ2V0SW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwoKSkKLQkJCWNvbmZpZ0RhdGEuc2V0SW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwoc2xBZG1pbi5nZXRJbml0aWFsQnVuZGxlU3RhcnRMZXZlbCgpKTsKLQotCQkvLwkJZm9yIChpbnQgaiA9IDA7IGogPCBiSW5mb3MubGVuZ3RoOyBqKyspCi0JCS8vCQkJY29uZmlnRGF0YS5hZGRCdW5kbGUoYkluZm9zW2pdKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLk1hbmlwdWxhdG9yI2xvYWQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19ERUJVRywgdGhpcywgImxvYWQoKSIsICJCRUdJTiIpOwotCQlsb2FkV2l0aG91dEZ3UGVyc2lzdGVudERhdGEoKTsKLQotCQlCdW5kbGVzU3RhdGUgYnVuZGxlc1N0YXRlID0gbnVsbDsKLQkJaWYgKEVxdWlub3hCdW5kbGVzU3RhdGUuY2hlY2tGdWxseVN1cHBvcnRlZCgpKSB7Ci0JCQkvLwlidW5kbGVzU3RhdGUgPSBuZXcgRXF1aW5veEJ1bmRsZXNTdGF0ZShjb250ZXh0LCBmd0FkbWluLCB0aGlzLCB0cnVlLCBydW50aW1lKTsKLQkJCWJ1bmRsZXNTdGF0ZSA9IG5ldyBFcXVpbm94QnVuZGxlc1N0YXRlKGNvbnRleHQsIGZ3QWRtaW4sIHRoaXMsICFsYXVuY2hlckRhdGEuaXNDbGVhbigpKTsKLQkJCXBsYXRmb3JtUHJvcGVydGllcyA9ICgoRXF1aW5veEJ1bmRsZXNTdGF0ZSkgYnVuZGxlc1N0YXRlKS5nZXRQbGF0Zm9ybVByb3BlcnRpZXMoKTsKLQotCQl9IGVsc2UgewotCQkJYnVuZGxlc1N0YXRlID0gbmV3IFNpbXBsZUJ1bmRsZXNTdGF0ZShmd0FkbWluLCB0aGlzLCBFcXVpbm94Q29uc3RhbnRzLkZXX1NZTUJPTElDX05BTUUpOwotCQkJcGxhdGZvcm1Qcm9wZXJ0aWVzLmNsZWFyKCk7Ci0JCX0KLQkJdXBkYXRlQWNjb3JkaW5nVG9FeHBlY3RlZFN0YXRlKGJ1bmRsZXNTdGF0ZSk7Ci0JCS8vCQlpZiAoIXVzZUNvbmZpZ3VyYXRvcikKLQkJLy8JCQlyZXR1cm47Ci0JCXNldENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yKCk7Ci0JCWlmICh0aGlzLmNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yLnVwZGF0ZUJ1bmRsZXModGhpcyk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZFdpdGhvdXRGd1BlcnNpc3RlbnREYXRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU2ltcGxlQnVuZGxlc1N0YXRlLmNoZWNrQXZhaWxhYmlsaXR5KGZ3QWRtaW4pOwotCQlGaWxlIGxhdW5jaGVyQ29uZmlnRmlsZSA9IGdldExhdW5jaGVyQ29uZmlnTG9jYXRpb24obGF1bmNoZXJEYXRhKTsKLQkJaWYgKGxhdW5jaGVyQ29uZmlnRmlsZSAhPSBudWxsKSB7Ci0JCQkvLyB1c2UgbGF1bmNoZXIuIC0tID4gbG9hZCBmcm9tIExhdWNuaGVyQ29uZmlnIGZpbGUuCi0JCQkvLyB0aGUgcGFyYW1ldGVycyBpbiBtZW1vcnkgd2lsbCBiZSB1cGRhdGVkLgotCQkJRWNsaXBzZUxhdW5jaGVyUGFyc2VyIHBhcnNlciA9IG5ldyBFY2xpcHNlTGF1bmNoZXJQYXJzZXIoKTsKLQkJCXBhcnNlci5yZWFkKGxhdW5jaGVyRGF0YSk7Ci0JCX0KLQkJY2hlY2tDb25zaXN0ZW5jeU9mRndDb25maWdMb2NBbmRGd1BlcnNpc3RlbnREYXRhTG9jKGxhdW5jaGVyRGF0YSk7Ci0KLQkJRmlsZSBmd0NvbmZpZ0ZpbGUgPSBuZXcgRmlsZShsYXVuY2hlckRhdGEuZ2V0RndDb25maWdMb2NhdGlvbigpLCBFcXVpbm94Q29uc3RhbnRzLkNPTkZJR19JTkkpOwotCQlFcXVpbm94RndDb25maWdGaWxlUGFyc2VyIHBhcnNlciA9IG5ldyBFcXVpbm94RndDb25maWdGaWxlUGFyc2VyKGNvbnRleHQpOwotCQlpZiAoZndDb25maWdGaWxlLmV4aXN0cygpKQotCQkJcGFyc2VyLnJlYWRGd0NvbmZpZyh0aGlzLCBmd0NvbmZpZ0ZpbGUpOwotCi0JfQotCi0JLy8gU2F2ZSBhbGwgcGFyYW1ldGVyIGluIG1lbW9yeSBpbnRvIHByb3BlciBjb25maWcgZmlsZXMuCi0JcHVibGljIHZvaWQgc2F2ZShib29sZWFuIGJhY2t1cCkgdGhyb3dzIElPRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX0RFQlVHLCB0aGlzLCAic2F2ZSgpIiwgIkJFR0lOIik7Ci0JCVNpbXBsZUJ1bmRsZXNTdGF0ZS5jaGVja0F2YWlsYWJpbGl0eShmd0FkbWluKTsKLQotCQl0cnkgewotCQkJdXBkYXRlQWNjb3JkaW5nVG9FeHBlY3RlZFN0YXRlKHRoaXMuZ2V0QnVuZGxlc1N0YXRlKCkpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlLgotCQl9Ci0JCS8vCQlGaWxlIGZ3SmFyID0gRXF1aW5veEJ1bmRsZXNTdGF0ZS5nZXRGd0phcihsYXVuY2hlckRhdGEsIGNvbmZpZ0RhdGEpOwotCQkvLwkJaWYgKGZ3SmFyICE9IG51bGwpCi0JCS8vCQkJbGF1bmNoZXJEYXRhLnNldEZ3SmFyKGZ3SmFyKTsKLQotCQkvL2lmIChjb250ZXh0ICE9IG51bGwpCi0JCUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yIHByZXZpb3VzQ29uZmlndXJhdG9yID0gc2V0Q29uZmlndXJhdG9yTWFuaXB1bGF0b3IoKTsKLQkJaWYgKHByZXZpb3VzQ29uZmlndXJhdG9yICE9IG51bGwpCi0JCQlwcmV2aW91c0NvbmZpZ3VyYXRvci5jbGVhbnVwKHRoaXMpOwotCi0JCUJ1bmRsZUluZm9bXSBuZXdCSW5mb3MgPSBudWxsOwotCQlpZiAoY29uZmlndXJhdG9yTWFuaXB1bGF0b3IgIT0gbnVsbCkgeyAvLyBPcHRpbWl6ZSBCdW5kbGVJbmZvW10gCi0JCQl0cnkgewotCQkJCW5ld0JJbmZvcyA9IGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yLnNhdmUodGhpcywgYmFja3VwKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWlmIChMT0dfSUxMRUdBTFNUQVRFRVhDRVBUSU9OKQotCQkJCQlMb2cubG9nKExvZ1NlcnZpY2UuTE9HX1dBUk5JTkcsIHRoaXMsICJzYXZlKCkiLCBlKTsKLQkJCQluZXdCSW5mb3MgPSBjb25maWdEYXRhLmdldEJ1bmRsZXMoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCW5ld0JJbmZvcyA9IGNvbmZpZ0RhdGEuZ2V0QnVuZGxlcygpOwotCQl9Ci0KLQkJYm9vbGVhbiBzdGF0ZUlzRW1wdHkgPSBjb25maWdEYXRhLmdldEJ1bmRsZXMoKS5sZW5ndGggPT0gMDsKLQotCQlGaWxlIGxhdW5jaGVyQ29uZmlnRmlsZSA9IGdldExhdW5jaGVyQ29uZmlnTG9jYXRpb24obGF1bmNoZXJEYXRhKTsKLQkJaWYgKGxhdW5jaGVyQ29uZmlnRmlsZSAhPSBudWxsKSB7Ci0JCQlpZiAoIXN0YXRlSXNFbXB0eSkgewotCQkJCS8vIFVzZSBsYXVuY2hlci4gLS0gPiBzYXZlIExhdW5jaGVyQ29uZmlnIGZpbGUuCi0JCQkJRWNsaXBzZUxhdW5jaGVyUGFyc2VyIGxhdW5jaGVyUGFyc2VyID0gbmV3IEVjbGlwc2VMYXVuY2hlclBhcnNlcigpOwotCQkJCWxhdW5jaGVyUGFyc2VyLnNhdmUobGF1bmNoZXJEYXRhLCB0cnVlLCBiYWNrdXApOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBObyBidW5kbGVzIGluIGNvbmZpZ3VyYXRpb24sIHNvIGRlbGV0ZSB0aGUgbGF1bmNoZXIgY29uZmlnIGZpbGUKLQkJCQlsYXVuY2hlckNvbmZpZ0ZpbGUuZGVsZXRlKCk7Ci0JCQl9Ci0JCX0KLQotCQljaGVja0NvbnNpc3RlbmN5T2ZGd0NvbmZpZ0xvY0FuZEZ3UGVyc2lzdGVudERhdGFMb2MobGF1bmNoZXJEYXRhKTsKLQotCQkvLwkJLy9pZiAoY29udGV4dCAhPSBudWxsKQotCQkvLwkJc2V0Q29uZmlndXJhdG9yTWFuaXB1bGF0b3IoKTsKLQkJLy8KLQkJLy8JCUJ1bmRsZUluZm9bXSBuZXdCSW5mb3MgPSBudWxsOwotCQkvLwkJaWYgKGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yICE9IG51bGwpIHsgLy8gT3B0aW1pemUgQnVuZGxlSW5mb1tdIAotCQkvLwkJCXRyeSB7Ci0JCS8vCQkJCW5ld0JJbmZvcyA9IGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yLnNhdmUodGhpcywgYmFja3VwKTsKLQkJLy8JCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkvLwkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCS8vCQkJCWlmIChMT0dfSUxMRUdBTFNUQVRFRVhDRVBUSU9OKQotCQkvLwkJCQkJTG9nLmxvZyhMb2dTZXJ2aWNlLkxPR19XQVJOSU5HLCB0aGlzLCAic2F2ZSgpIiwgZSk7Ci0JCS8vCQkJCW5ld0JJbmZvcyA9IGNvbmZpZ0RhdGEuZ2V0QnVuZGxlcygpOwotCQkvLwkJCX0KLQkJLy8JCX0gZWxzZSB7Ci0JCS8vCQkJbmV3QkluZm9zID0gY29uZmlnRGF0YS5nZXRCdW5kbGVzKCk7Ci0JCS8vCQl9Ci0KLQkJaWYgKCFzdGF0ZUlzRW1wdHkpIHsKLQkJCS8vIFNhdmUgRndDb25maWdGaWxlCi0JCQlFcXVpbm94RndDb25maWdGaWxlUGFyc2VyIHBhcnNlciA9IG5ldyBFcXVpbm94RndDb25maWdGaWxlUGFyc2VyKGNvbnRleHQpOwotCQkJcGFyc2VyLnNhdmVGd0NvbmZpZyhuZXdCSW5mb3MubGVuZ3RoICE9IDAgPyBuZXdCSW5mb3MgOiBnZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpLCB0aGlzLCBiYWNrdXAsIGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCUZpbGUgY29uZmlnRGlyID0gbGF1bmNoZXJEYXRhLmdldEZ3Q29uZmlnTG9jYXRpb24oKTsKLQkJCUZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKGNvbmZpZ0RpciwgRXF1aW5veENvbnN0YW50cy5DT05GSUdfSU5JKTsKLQkJCWlmIChvdXRwdXRGaWxlICE9IG51bGwgJiYgb3V0cHV0RmlsZS5leGlzdHMoKSkgewotCQkJCW91dHB1dEZpbGUuZGVsZXRlKCk7Ci0JCQl9Ci0JCQlpZiAoY29uZmlnRGlyICE9IG51bGwgJiYgY29uZmlnRGlyLmV4aXN0cygpKSB7Ci0JCQkJY29uZmlnRGlyLmRlbGV0ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29uZmlnRGF0YShDb25maWdEYXRhIGNvbmZpZ0RhdGEpIHsKLQkJdGhpcy5jb25maWdEYXRhLmluaXRpYWxpemUoKTsKLQkJdGhpcy5jb25maWdEYXRhLnNldEluaXRpYWxCdW5kbGVTdGFydExldmVsKGNvbmZpZ0RhdGEuZ2V0SW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwoKSk7Ci0JCXRoaXMuY29uZmlnRGF0YS5zZXRCZWdpbm5pbmdGd1N0YXJ0TGV2ZWwoY29uZmlnRGF0YS5nZXRCZWdpbmluZ0Z3U3RhcnRMZXZlbCgpKTsKLQkJQnVuZGxlSW5mb1tdIGJJbmZvcyA9IGNvbmZpZ0RhdGEuZ2V0QnVuZGxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJJbmZvcy5sZW5ndGg7IGkrKykKLQkJCXRoaXMuY29uZmlnRGF0YS5hZGRCdW5kbGUoYkluZm9zW2ldKTsKLQkJdGhpcy5jb25maWdEYXRhLnNldEZ3SW5kZXBlbmRlbnRQcm9wcyhjb25maWdEYXRhLmdldEZ3SW5kZXBlbmRlbnRQcm9wcygpKTsKLQkJaWYgKHRoaXMuY29uZmlnRGF0YS5nZXRGd05hbWUoKS5lcXVhbHMoY29uZmlnRGF0YS5nZXRGd05hbWUoKSkpCi0JCQlpZiAodGhpcy5jb25maWdEYXRhLmdldEZ3VmVyc2lvbigpLmVxdWFscyhjb25maWdEYXRhLmdldEZ3VmVyc2lvbigpKSkgewotCQkJCS8vIFRPRE8gcmVmaW5lIHRoZSBhbGdvcml0aG0gdG8gY29weWluZyBmdyBkZXBlbmRlbnQgcHJvcHMuCi0JCQkJLy8gIGNvbmZpZ0RhdGEuZ2V0RndOYW1lKCkvZ2V0RndWZXJzaW9uKCkvCi0JCQkJLy8JZ2V0TGF1bmNoZXJOYW1lKCkvZ2V0TGF1bmNoZXJWZXJzaW9uKCkgbWlnaHQgYmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uLiAKLQkJCQl0aGlzLmNvbmZpZ0RhdGEuc2V0RndEZXBlbmRlbnRQcm9wcyhjb25maWdEYXRhLmdldEZ3RGVwZW5kZW50UHJvcHMoKSk7Ci0JCQl9Ci0JfQotCi0JLyoqCi0JICogMS4gZ2V0IGFsbCBTZXJ2aWNlUmVmZXJlbmNlcyBvZiBDb25maWd1cmF0b3JNYW5pcHVsYXRvci4gICAKLQkgKiAyLiBDaGVjayBpZiB0aGVyZSBhbnkgQ29uZmlndXJhdG9yQnVuZGxlIGluIHRoZSBCdW5kbGVzIGxpc3QgdGhhdCBjYW4gYmUgbWFuaXB1bGF0ZWQgYnkgCi0JICogCXRoZSBhdmFpbGFibGUgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JzLgotCSAqIDMuIENob29zZSB0aGUgb25lIHRoYXQgd2lsbCBiZSBmaXJzdGx5IHN0YXJ0ZWQgYW1vbmcgdGhlbS4KLQkgKiA0LiBzZXQgdGhlIG9iamVjdCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjaG9zZW4gQ29uZmlndXJhdG9yQnVuZGxlLiAgCi0JICogCi0JICovCi0JcHJpdmF0ZSBDb25maWd1cmF0b3JNYW5pcHVsYXRvciBzZXRDb25maWd1cmF0b3JNYW5pcHVsYXRvcigpIHsKLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkgewotCQkJdGhpcy5jb25maWd1cmF0b3JNYW5pcHVsYXRvciA9IHRoaXMuZndBZG1pbi5nZXRDb25maWd1cmF0b3JNYW5pcHVsYXRvcigpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU2VydmljZVJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBjbVRyYWNrZXIuZ2V0U2VydmljZVJlZmVyZW5jZXMoKTsKLQkJaWYgKHJlZmVyZW5jZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vCQlpbnQgY291bnQgPSBjbVRyYWNrZXIuZ2V0VHJhY2tpbmdDb3VudCgpOwotCQkvLwkJaWYgKGNvdW50ID09IHRoaXMudHJhY2tpbmdDb3VudCkKLQkJLy8JCQlyZXR1cm47Ci0JCS8vCQl0aGlzLnRyYWNraW5nQ291bnQgPSBjb3VudDsKLQotCQlCdW5kbGVJbmZvW10gYkluZm9zID0gY29uZmlnRGF0YS5nZXRCdW5kbGVzKCk7Ci0JCWludCBpbml0aWFsQlNMID0gY29uZmlnRGF0YS5nZXRJbml0aWFsQnVuZGxlU3RhcnRMZXZlbCgpOwotCQliSW5mb3MgPSBVdGlscy5zb3J0QnVuZGxlSW5mb3MoYkluZm9zLCBpbml0aWFsQlNMKTsKLQkJLy9pbnQgaW5kZXggPSAtMTsJCi0JCUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yIHByZXZpb3VzQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IgPSBjb25maWd1cmF0b3JNYW5pcHVsYXRvcjsKLQkJY29uZmlndXJhdG9yTWFuaXB1bGF0b3IgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJJbmZvcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gYkluZm9zW2ldLmdldExvY2F0aW9uKCk7Ci0JCQlsb2NhdGlvbiA9IEZpbGVVdGlscy5nZXRSZWFsTG9jYXRpb24odGhpcywgbG9jYXRpb24sIHRydWUpOwotCQkJaWYgKCFiSW5mb3NbaV0uaXNNYXJrZWRBc1N0YXJ0ZWQoKSkKLQkJCQljb250aW51ZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVmZXJlbmNlcy5sZW5ndGg7IGorKykKLQkJCQlpZiAocmVmZXJlbmNlc1tqXS5nZXRQcm9wZXJ0eShDb25maWd1cmF0b3JNYW5pcHVsYXRvci5TRVJWSUNFX1BST1BfS0VZX0NPTkZJR1VSQVRPUl9CVU5ETEVTWU1CT0xJQ05BTUUpLmVxdWFscyhVdGlscy5nZXRQYXRoRnJvbUNsYXVzZShVdGlscy5nZXRNYW5pZmVzdE1haW5BdHRyaWJ1dGVzKGxvY2F0aW9uLCBDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkpKSkgewotCQkJCQljb25maWd1cmF0b3JNYW5pcHVsYXRvciA9IChDb25maWd1cmF0b3JNYW5pcHVsYXRvcikgY21UcmFja2VyLmdldFNlcnZpY2UocmVmZXJlbmNlc1tqXSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCWlmIChjb25maWd1cmF0b3JNYW5pcHVsYXRvciAhPSBudWxsKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChjb25maWd1cmF0b3JNYW5pcHVsYXRvciAhPSBwcmV2aW91c0NvbmZpZ3VyYXRvck1hbmlwdWxhdG9yKQotCQkJcmV0dXJuIHByZXZpb3VzQ29uZmlndXJhdG9yTWFuaXB1bGF0b3I7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhdW5jaGVyRGF0YShMYXVuY2hlckRhdGEgdmFsdWUpIHsKLQkJbGF1bmNoZXJEYXRhLmluaXRpYWxpemUoKTsKLQkJbGF1bmNoZXJEYXRhLnNldEZ3Q29uZmlnTG9jYXRpb24odmFsdWUuZ2V0RndDb25maWdMb2NhdGlvbigpKTsKLQkJbGF1bmNoZXJEYXRhLnNldEZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbih2YWx1ZS5nZXRGd1BlcnNpc3RlbnREYXRhTG9jYXRpb24oKSwgdmFsdWUuaXNDbGVhbigpKTsKLQkJbGF1bmNoZXJEYXRhLnNldEp2bSh2YWx1ZS5nZXRKdm0oKSk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRKdm1BcmdzKHZhbHVlLmdldEp2bUFyZ3MoKSk7Ci0JCWlmIChsYXVuY2hlckRhdGEuZ2V0RndOYW1lKCkuZXF1YWxzKHZhbHVlLmdldEZ3TmFtZSgpKSkKLQkJCWlmIChsYXVuY2hlckRhdGEuZ2V0RndWZXJzaW9uKCkuZXF1YWxzKHZhbHVlLmdldEZ3VmVyc2lvbigpKSkgewotCQkJCS8vIFRPRE8gbGF1bmNoZXJEYXRhLmdldEZ3TmFtZSgpL2dldEZ3VmVyc2lvbigpLwotCQkJCS8vCWdldExhdW5jaGVyTmFtZSgpL2dldExhdW5jaGVyVmVyc2lvbigpIG1pZ2h0IGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbgotCQkJCS8vICBmb3IgY29weWluZyAuIAotCQkJCWxhdW5jaGVyRGF0YS5zZXRGd0phcih2YWx1ZS5nZXRGd0phcigpKTsKLQkJCQlsYXVuY2hlckRhdGEuc2V0SG9tZSh2YWx1ZS5nZXRIb21lKCkpOwotCQkJCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlcih2YWx1ZS5nZXRMYXVuY2hlcigpKTsKLQkJCQlsYXVuY2hlckRhdGEuc2V0TGF1bmNoZXJDb25maWdMb2NhdGlvbih2YWx1ZS5nZXRMYXVuY2hlckNvbmZpZ0xvY2F0aW9uKCkpOwotCQkJfQotCX0KLQotCS8qKgotCSAqIFRlbXBvcmFsIGltcGxlbWVudGF0aW9uLgotCSAqIAotCSAqIElmIGEgcHJvcGVydHkgb2YgdGhlIGdpdmVuIGtleSBzaG91bGQgYmUgZWxpbWluYXRlZAotCSAqICBmcm9tIEZ3RGVwZW5kZW50UHJvcGVydGllcyBhbmQgRndJbmRlcGVuZGVudFByb3BlcnRpZXMsCi0JICogIHJldHVybiB0cnVlLiBPdGhlcndpc2UgZmFsc2UuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBzaG91bGQgYmUgZWxpbWluZXRlZCBmcm9tIEZ3RGVwZW5kZW50UHJvcGVydGllcyBhbmQgRndJbmRlcGVuZGVudFByb3BlcnRpZXMsCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHRvQmVFbGltaW5hdGVkKFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleS5zdGFydHNXaXRoKCJqYXZhLiIpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgiKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrXG4iICsgIkNsYXNzOiIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlxuIik7Ci0JCXNiLmFwcGVuZCgiLS0tLS0tLS0tLS0tLSBMYXVuY2hlckRhdGEgLS0tLS0tLS0tLS1cbiIpOwotCQlzYi5hcHBlbmQobGF1bmNoZXJEYXRhLnRvU3RyaW5nKCkpOwotCQlzYi5hcHBlbmQoIi0tLS0tLS0tLS0tLS0gQ29uZmlnRGF0YSAtLS0tLS0tLS0tLVxuIik7Ci0JCXNiLmFwcGVuZChjb25maWdEYXRhLnRvU3RyaW5nKCkpOwotCQlzYi5hcHBlbmQoIlxuIiArIFV0aWxzLnRvU3RyaW5nUHJvcGVydGllcygicGxhdGZvcm1Qcm9wZXJ0aWVzIiwgdGhpcy5wbGF0Zm9ybVByb3BlcnRpZXMpKTsKLQkJc2IuYXBwZW5kKCIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKytcbiIpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlQWNjb3JkaW5nVG9FeHBlY3RlZFN0YXRlKEJ1bmRsZXNTdGF0ZSBidW5kbGVzU3RhdGUpIHsKLQkJLy8JCUZpbGUgbmV3RndKYXIgPSBFcXVpbm94QnVuZGxlc1N0YXRlLmdldEZ3SmFyKGxhdW5jaGVyRGF0YSwgY29uZmlnRGF0YSk7Ci0JCS8vCQlpZiAoYnVuZGxlc1N0YXRlIGluc3RhbmNlb2YgRXF1aW5veEJ1bmRsZXNTdGF0ZSkKLQkJLy8JCQkoKEVxdWlub3hCdW5kbGVzU3RhdGUpIGJ1bmRsZXNTdGF0ZSkuc2V0RndKYXIobmV3RndKYXIpOwotCQkvLwotCQkvLwkJaWYgKGxhdW5jaGVyRGF0YS5nZXRGd0phcigpID09IG51bGwgJiYgbmV3RndKYXIgIT0gbnVsbCkKLQkJLy8JCQlsYXVuY2hlckRhdGEuc2V0RndKYXIobmV3RndKYXIpOwotCQlCdW5kbGVJbmZvW10gbmV3QnVuZGxlSW5mb3MgPSBidW5kbGVzU3RhdGUuZ2V0RXhwZWN0ZWRTdGF0ZSgpOwotCQljb25maWdEYXRhLnNldEJ1bmRsZXMobmV3QnVuZGxlSW5mb3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VSZWxhdGl2ZShTdHJpbmcgb3JpZ2luYWwsIFN0cmluZyByb290UGF0aCkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgob3JpZ2luYWwpOwotCQkvLyBlbnN1cmUgd2UgaGF2ZSBhbiBhYnNvbHV0ZSBwYXRoIHRvIHN0YXJ0IHdpdGgKLQkJaWYgKCFwYXRoLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiBvcmlnaW5hbDsKLQotCQkvL1JldHVybnMgdGhlIG9yaWdpbmFsIHN0cmluZyBpZiBubyByZWxhdGl2aXphdGlvbiBoYXMgYmVlbiBkb25lCi0JCVN0cmluZyByZXN1bHQgPSBtYWtlUmVsYXRpdmUocGF0aCwgbmV3IFBhdGgocm9vdFBhdGgpKTsKLQkJcmV0dXJuIHBhdGgudG9PU1N0cmluZygpLmVxdWFscyhyZXN1bHQpID8gb3JpZ2luYWwgOiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBNYWtlIHRoZSBnaXZlbiBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzcGVjaWZpZWQgcm9vdCwgaWYgYXBwbGljYWJsZS4gSWYgbm90LCB0aGVuCi0JICogcmV0dXJuIHRoZSBwYXRoIGFzLWlzLgotCSAqIAotCSAqIE1ldGhvZCBzaW1pbGFyIHRvIG9uZSBmcm9tIFNpbXBsZUNvbmZpZ3VyYXRpb25NYW5pcHVsYXRvckltcGwuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VSZWxhdGl2ZShJUGF0aCB0b1JlbCwgSVBhdGggYmFzZSkgewotCQlpbnQgaSA9IGJhc2UubWF0Y2hpbmdGaXJzdFNlZ21lbnRzKHRvUmVsKTsKLQkJaWYgKGkgPT0gMCkgewotCQkJcmV0dXJuIHRvUmVsLnRvT1NTdHJpbmcoKTsKLQkJfQotCQlTdHJpbmcgcmVzdWx0ID0gIiI7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgKGJhc2Uuc2VnbWVudENvdW50KCkgLSBpKTsgaisrKSB7Ci0JCQlyZXN1bHQgKz0gIi4uIiArIFBhdGguU0VQQVJBVE9SOwotCQl9Ci0JCWlmIChpID09IHRvUmVsLnNlZ21lbnRDb3VudCgpKQotCQkJcmV0dXJuICIuIjsKLQkJcmVzdWx0ICs9IHRvUmVsLnNldERldmljZShudWxsKS5yZW1vdmVGaXJzdFNlZ21lbnRzKGkpLnRvT1NTdHJpbmcoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlUmVsYXRpdmUoU3RyaW5nIHVybFN0cmluZywgVVJMIHJvb3RVUkwpIHsKLQkJLy8gd2Ugb25seSB0cmFmZmljIGluIGZpbGU6IFVSTHMKLQkJaW50IGluZGV4ID0gdXJsU3RyaW5nLmluZGV4T2YoRklMRV9QUk9UT0NPTCk7Ci0JCWlmIChpbmRleCA9PSAtMSkKLQkJCXJldHVybiB1cmxTdHJpbmc7Ci0JCWluZGV4ID0gaW5kZXggKyA1OwotCi0JCS8vIGVuc3VyZSB3ZSBoYXZlIGFuIGFic29sdXRlIHBhdGggdG8gc3RhcnQgd2l0aAotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCVN0cmluZyBmaWxlID0gdXJsU3RyaW5nOwotCQl3aGlsZSAoIWRvbmUpIHsKLQkJCXRyeSB7Ci0JCQkJdXJsID0gbmV3IFVSTChmaWxlKTsKLQkJCQlmaWxlID0gdXJsLmdldEZpbGUoKTsKLQkJCX0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZG9uZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKHVybCA9PSBudWxsIHx8ICFuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5pc0Fic29sdXRlKCkpCi0JCQlyZXR1cm4gdXJsU3RyaW5nOwotCi0JCVN0cmluZyByb290U3RyaW5nID0gcm9vdFVSTC50b0V4dGVybmFsRm9ybSgpOwotCQlyZXR1cm4gdXJsU3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkgKyBtYWtlUmVsYXRpdmUodXJsU3RyaW5nLnN1YnN0cmluZyhpbmRleCksIHJvb3RTdHJpbmcuc3Vic3RyaW5nKHJvb3RTdHJpbmcuaW5kZXhPZihGSUxFX1BST1RPQ09MKSArIDUpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlQXJyYXlSZWxhdGl2ZShTdHJpbmcgYXJyYXksIFVSTCByb290VVJMKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXJyYXksIENPTU1BKTsgdG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKTspIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCVN0cmluZyBhYnNvbHV0ZSA9IG1ha2VSZWxhdGl2ZSh0b2tlbiwgcm9vdFVSTCk7Ci0JCQlidWZmZXIuYXBwZW5kKGFic29sdXRlKTsKLQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotCQkJCWJ1ZmZlci5hcHBlbmQoJywnKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZUFycmF5QWJzb2x1dGUoU3RyaW5nIGFycmF5LCBVUkwgcm9vdFVSTCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGFycmF5LCBDT01NQSk7IHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCk7KSB7Ci0JCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlTdHJpbmcgYWJzb2x1dGUgPSBtYWtlQWJzb2x1dGUodG9rZW4sIHJvb3RVUkwpOwotCQkJYnVmZmVyLmFwcGVuZChhYnNvbHV0ZSk7Ci0JCQlpZiAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkKLQkJCQlidWZmZXIuYXBwZW5kKCcsJyk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogTWFrZSB0aGUgZ2l2ZW4gcGF0aCBhYnNvbHV0ZSB0byB0aGUgc3BlY2lmaWVkIHJvb3QsIGlmIGFwcGxpY2FibGUuIElmIG5vdCwgdGhlbgotCSAqIHJldHVybiB0aGUgcGF0aCBhcy1pcy4KLQkgKiAKLQkgKiBNZXRob2Qgc2ltaWxhciB0byBvbmUgZnJvbSBTaW1wbGVDb25maWd1cmF0aW9uTWFuaXB1bGF0b3JJbXBsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VBYnNvbHV0ZShTdHJpbmcgb3JpZ2luYWwsIFN0cmluZyByb290UGF0aCkgewotCQlJUGF0aCBwYXRoID0gbmV3IFBhdGgob3JpZ2luYWwpOwotCQkvLyBlbnN1cmUgd2UgaGF2ZSBhIHJlbGF0aXZlIHBhdGggdG8gc3RhcnQgd2l0aAotCQlpZiAocGF0aC5pc0Fic29sdXRlKCkpCi0JCQlyZXR1cm4gb3JpZ2luYWw7Ci0JCUlQYXRoIHJvb3QgPSBuZXcgUGF0aChyb290UGF0aCk7Ci0JCXJldHVybiByb290LmFkZFRyYWlsaW5nU2VwYXJhdG9yKCkuYXBwZW5kKG9yaWdpbmFsLnJlcGxhY2UoJzonLCAnfScpKS50b09TU3RyaW5nKCkucmVwbGFjZSgnfScsICc6Jyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZUFic29sdXRlKFN0cmluZyB1cmxTdHJpbmcsIFVSTCByb290VVJMKSB7Ci0JCS8vIHdlIG9ubHkgdHJhZmZpYyBpbiBmaWxlOiBVUkxzCi0JCWludCBpbmRleCA9IHVybFN0cmluZy5pbmRleE9mKEZJTEVfUFJPVE9DT0wpOwotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gdXJsU3RyaW5nOwotCQlpbmRleCA9IGluZGV4ICsgNTsKLQotCQkvLyBlbnN1cmUgd2UgaGF2ZSBhIHJlbGF0aXZlIHBhdGggdG8gc3RhcnQgd2l0aAotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCVN0cmluZyBmaWxlID0gdXJsU3RyaW5nOwotCQl3aGlsZSAoIWRvbmUpIHsKLQkJCXRyeSB7Ci0JCQkJdXJsID0gbmV3IFVSTChmaWxlKTsKLQkJCQlmaWxlID0gdXJsLmdldEZpbGUoKTsKLQkJCX0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZG9uZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKHVybCA9PSBudWxsIHx8IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiB1cmxTdHJpbmc7Ci0KLQkJcmV0dXJuIHVybFN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXggLSA1KSArIG1ha2VBYnNvbHV0ZSh1cmxTdHJpbmcuc3Vic3RyaW5nKGluZGV4KSwgcm9vdFVSTC50b0V4dGVybmFsRm9ybSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0xvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9Mb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTgzYjkyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L0xvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi5lcXVpbm94OwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5sb2cuTG9nU2VydmljZTsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB3aXRoIHN0YXRpYyBtZXRob2RzIGZvciBsb2dnaW5nIHRvIExvZ1NlcnZpY2UsIGlmIGF2YWlsYWJsZSAKLSAqLwotcHVibGljIGNsYXNzIExvZyB7Ci0Jc3RhdGljIHByaXZhdGUgU2VydmljZVRyYWNrZXIgbG9nVHJhY2tlcjsKLQlzdGF0aWMgcHJpdmF0ZSBib29sZWFuIHVzZUxvZyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChsb2dUcmFja2VyICE9IG51bGwpIHsKLQkJCWxvZ1RyYWNrZXIuY2xvc2UoKTsKLQkJfQotCQlsb2dUcmFja2VyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5pdChCdW5kbGVDb250ZXh0IGJjKSB7Ci0JCWxvZ1RyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoYmMsIExvZ1NlcnZpY2UuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLQkJbG9nVHJhY2tlci5vcGVuKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIE9iamVjdCBvYmosIFN0cmluZyBtZXRob2QsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWxvZyhsZXZlbCwgb2JqLCBtZXRob2QsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBPYmplY3Qgb2JqLCBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGUpIHsKLQkJTG9nU2VydmljZSBsb2dTZXJ2aWNlID0gbnVsbDsKLQkJU3RyaW5nIG1zZyA9ICIiOwotCQlpZiAobWV0aG9kID09IG51bGwpIHsKLQkJCWlmIChvYmogIT0gbnVsbCkKLQkJCQltc2cgPSAiKCIgKyBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKSI7Ci0JCX0gZWxzZSBpZiAob2JqID09IG51bGwpCi0JCQltc2cgPSAiWyIgKyBtZXRob2QgKyAiXSIgKyBtZXNzYWdlOwotCQllbHNlCi0JCQltc2cgPSAiWyIgKyBtZXRob2QgKyAiXSgiICsgb2JqLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIikiOwotCQltc2cgKz0gbWVzc2FnZTsKLQkJaWYgKGxvZ1RyYWNrZXIgIT0gbnVsbCkKLQkJCWxvZ1NlcnZpY2UgPSAoTG9nU2VydmljZSkgbG9nVHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0KLQkJaWYgKGxvZ1NlcnZpY2UgIT0gbnVsbCkgewotCQkJbG9nU2VydmljZS5sb2cobGV2ZWwsIG1zZywgZSk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgbGV2ZWxTdCA9IG51bGw7Ci0JCQlpZiAobGV2ZWwgPT0gTG9nU2VydmljZS5MT0dfREVCVUcpCi0JCQkJbGV2ZWxTdCA9ICJERUJVRyI7Ci0JCQllbHNlIGlmIChsZXZlbCA9PSBMb2dTZXJ2aWNlLkxPR19JTkZPKQotCQkJCWxldmVsU3QgPSAiSU5GTyI7Ci0JCQllbHNlIGlmIChsZXZlbCA9PSBMb2dTZXJ2aWNlLkxPR19XQVJOSU5HKQotCQkJCWxldmVsU3QgPSAiV0FSTklORyI7Ci0JCQllbHNlIGlmIChsZXZlbCA9PSBMb2dTZXJ2aWNlLkxPR19FUlJPUikgewotCQkJCWxldmVsU3QgPSAiRVJST1IiOwotCQkJCXVzZUxvZyA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAodXNlTG9nKSB7Ci0JCQkJU3lzdGVtLmVyci5wcmludGxuKCJbIiArIGxldmVsU3QgKyAiXSIgKyBtc2cpOwotCQkJCWlmIChlICE9IG51bGwpCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgT2JqZWN0IG9iaiwgU3RyaW5nIG1ldGhvZCwgVGhyb3dhYmxlIGUpIHsKLQkJbG9nKGxldmVsLCBvYmosIG1ldGhvZCwgbnVsbCwgZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWxvZyhsZXZlbCwgbnVsbCwgbnVsbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotCQlsb2cobGV2ZWwsIG51bGwsIG51bGwsIG1lc3NhZ2UsIGUpOwotCX0KLQotCXByaXZhdGUgTG9nKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGJkNWMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL2VxdWlub3gvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veC5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX2lucHV0RmlsZUlzRGlyZWN0b3J5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9md0NvbmZpZ0xvY2F0aW9uTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fZmFpbGVkVG9DcmVhdGVEaXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX2ZhaWxlZFRvUmVuYW1lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9nX2NvbmZpZ0ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9nX2NvbmZpZ1Byb3BzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvZ19yZW5hbWVTdWNjZXNzZnVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvZ19md0NvbmZpZ1NhdmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9nX3NoYXJlZF9jb25maWdfdXJsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvZ19zaGFyZWRfY29uZmlnX3JlbGF0aXZlX3VybDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2dfc2hhcmVkX2NvbmZpZ19maWxlX21pc3Npbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9nX2ZhaWxlZF9yZWFkaW5nX3Byb3BlcnRpZXM7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNWFjMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotZXhjZXB0aW9uX2lucHV0RmlsZUlzRGlyZWN0b3J5PSBJbGxlZ2FsIEFyZ3VtZW50OiBpbnB1dEZpbGUgezB9IG11c3Qgbm90IGJlIGEgZGlyZWN0b3J5LgotZXhjZXB0aW9uX2Z3Q29uZmlnTG9jYXRpb25OYW1lID0gSWxsZWdhbCBTdGF0ZTogRnJhbWV3b3JrIENvbmZpZ3VyYXRpb24gbG9jYXRpb24gInswfSIgZG9lcyBub3QgbWF0Y2ggezF9LgotZXhjZXB0aW9uX2ZhaWxlZFRvQ3JlYXRlRGlyID0gRmFpbGVkIHRvIGNyZWF0ZSBkaXJlY3RvcnkgezB9LgotZXhjZXB0aW9uX2ZhaWxlZFRvUmVuYW1lPUZhaWxlZCB0byByZW5hbWUgezB9IHRvIHsxfS4KLQotbG9nX2NvbmZpZ0ZpbGU9IENvbmZpZ3VyYXRpb24gZmlsZSAoezB9KSBoYXMgYmVlbiByZWFkIHN1Y2Nlc3NmdWxseS4KLWxvZ19jb25maWdQcm9wcz0gQ29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGlzIGVtcHR5LgotbG9nX3JlbmFtZVN1Y2Nlc3NmdWw9IFN1Y2Nlc3NmdWxseSByZW5hbWVkIHswfSB0byB7MX0uCi1sb2dfZndDb25maWdTYXZlPSBGcmFtZXdvcmsgQ29uZmlndXJhdGlvbiB3YXMgc2F2ZWQgc3VjY2Vzc2Z1bGx5IGluIHswfS4KLWxvZ19zaGFyZWRfY29uZmlnX3VybD1GYWlsZWQgY3JlYXRpbmcgc2hhcmVkIGNvbmZpZ3VyYXRpb24gdXJsIGZvciB7MH0uCi1sb2dfc2hhcmVkX2NvbmZpZ19yZWxhdGl2ZV91cmw9RmFpbGVkIGNyZWF0aW5nIHNoYXJlZCBjb25maWd1cmF0aW9uIHVybCBmb3Igcm9vdDogezB9IGFuZCBzaGFyZWRDb25maWd1cmF0aW9uOiB7MX0uCi1sb2dfc2hhcmVkX2NvbmZpZ19maWxlX21pc3Npbmc9RmFpbGVkIGNyZWF0aW5nIHNoYXJlZCBjb25maWd1cmF0aW9uLiBGaWxlIG1pc3Npbmc6IHswfS4KLWxvZ19mYWlsZWRfcmVhZGluZ19wcm9wZXJ0aWVzPUZhaWxlZCByZWFkaW5nIHByb3BlcnRpZXMgZnJvbSBmaWxlOiB7MH0uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L3V0aWxzL0VjbGlwc2VWZXJzaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L3V0aWxzL0VjbGlwc2VWZXJzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZTRiNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC91dGlscy9FY2xpcHNlVmVyc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veC51dGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlVmVyc2lvbiBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCWludCBtYWpvciA9IDA7Ci0JaW50IG1pbm9yID0gMDsKLQlpbnQgc2VydmljZSA9IDA7Ci0JU3RyaW5nIHF1YWxpZmllciA9IG51bGw7Ci0KLQlwdWJsaWMgRWNsaXBzZVZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmVyc2lvbiwgIi4iKTsKLQkJaWYgKCF0b2suaGFzTW9yZVRva2VucygpKQotCQkJcmV0dXJuOwotCQl0aGlzLm1ham9yID0gSW50ZWdlci5wYXJzZUludCh0b2submV4dFRva2VuKCkpOwotCQlpZiAoIXRvay5oYXNNb3JlVG9rZW5zKCkpCi0JCQlyZXR1cm47Ci0JCXRoaXMubWlub3IgPSBJbnRlZ2VyLnBhcnNlSW50KHRvay5uZXh0VG9rZW4oKSk7Ci0JCWlmICghdG9rLmhhc01vcmVUb2tlbnMoKSkKLQkJCXJldHVybjsKLQkJdGhpcy5zZXJ2aWNlID0gSW50ZWdlci5wYXJzZUludCh0b2submV4dFRva2VuKCkpOwotCQlpZiAoIXRvay5oYXNNb3JlVG9rZW5zKCkpCi0JCQlyZXR1cm47Ci0JCXRoaXMucXVhbGlmaWVyID0gdG9rLm5leHRUb2tlbigpOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBvYmopIHsKLQkJRWNsaXBzZVZlcnNpb24gdGFyZ2V0ID0gKEVjbGlwc2VWZXJzaW9uKSBvYmo7Ci0JCWlmICh0YXJnZXQubWFqb3IgPiB0aGlzLm1ham9yKQotCQkJcmV0dXJuIC0xOwotCQlpZiAodGFyZ2V0Lm1ham9yIDwgdGhpcy5tYWpvcikKLQkJCXJldHVybiAxOwotCQlpZiAodGFyZ2V0Lm1pbm9yID4gdGhpcy5taW5vcikKLQkJCXJldHVybiAtMTsKLQkJaWYgKHRhcmdldC5taW5vciA8IHRoaXMubWlub3IpCi0JCQlyZXR1cm4gMTsKLQkJaWYgKHRhcmdldC5zZXJ2aWNlID4gdGhpcy5zZXJ2aWNlKQotCQkJcmV0dXJuIC0xOwotCQlpZiAodGFyZ2V0LnNlcnZpY2UgPCB0aGlzLnNlcnZpY2UpCi0JCQlyZXR1cm4gMTsKLQkJcmV0dXJuIDA7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L3V0aWxzL0ZpbGVVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vZXF1aW5veC91dGlscy9GaWxlVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkMTAxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi9lcXVpbm94L3V0aWxzL0ZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3gudXRpbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3guRXF1aW5veENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkxhdW5jaGVyRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLk1hbmlwdWxhdG9yOwotCi1wdWJsaWMgY2xhc3MgRmlsZVV0aWxzIHsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVjbGlwc2VSZWFsTG9jYXRpb24oZmluYWwgTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IsIGZpbmFsIFN0cmluZyBsb2NhdGlvbikgewotCQl0cnkgewotCQkJbmV3IFVSTChsb2NhdGlvbik7Ci0JCQlyZXR1cm4gbG9jYXRpb247Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IGlnbm9yZS4KLQkJfQotCQlpZiAobG9jYXRpb24uaW5kZXhPZigiOiIpID49IDApCi0JCQlyZXR1cm4gbG9jYXRpb247Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlGaWxlIGhvbWUgPSBsYXVuY2hlckRhdGEuZ2V0SG9tZSgpOwotCQlGaWxlIHBsdWdpbnNEaXIgPSBudWxsOwotCQlpZiAoaG9tZSAhPSBudWxsKQotCQkJcGx1Z2luc0RpciA9IG5ldyBGaWxlKGhvbWUsIEVxdWlub3hDb25zdGFudHMuUExVR0lOU19ESVIpOwotCQllbHNlIGlmIChsYXVuY2hlckRhdGEuZ2V0TGF1bmNoZXIoKSAhPSBudWxsKQotCQkJcGx1Z2luc0RpciA9IG5ldyBGaWxlKGxhdW5jaGVyRGF0YS5nZXRMYXVuY2hlcigpLmdldFBhcmVudEZpbGUoKSwgRXF1aW5veENvbnN0YW50cy5QTFVHSU5TX0RJUik7Ci0JCWVsc2UgaWYgKGxhdW5jaGVyRGF0YS5nZXRGd0phcigpICE9IG51bGwpCi0JCQlwbHVnaW5zRGlyID0gbGF1bmNoZXJEYXRhLmdldEZ3SmFyKCkuZ2V0UGFyZW50RmlsZSgpOwotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGdldFBsdWdpbk5hbWUobG9jYXRpb24pOwotCQlTdHJpbmcgcmV0ID0gZ2V0RWNsaXBzZVBsdWdpbkZ1bGxMb2NhdGlvbihwbHVnaW5OYW1lLCBwbHVnaW5zRGlyKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UGx1Z2luTmFtZShmaW5hbCBTdHJpbmcgbG9jYXRpb24pIHsKLQkJaW50IHBvc2l0aW9uID0gbG9jYXRpb24uaW5kZXhPZigiXyIpOwotCQlTdHJpbmcgcGx1Z2luTmFtZSA9IGxvY2F0aW9uOwotCQlpZiAocG9zaXRpb24gPj0gMCkKLQkJCXBsdWdpbk5hbWUgPSBsb2NhdGlvbi5zdWJzdHJpbmcoMCwgcG9zaXRpb24pOwotCQlyZXR1cm4gcGx1Z2luTmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWFsTG9jYXRpb24oTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IsIGZpbmFsIFN0cmluZyBsb2NhdGlvbiwgYm9vbGVhbiB1c2VFY2xpcHNlKSB7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyByZXQgPSBsb2NhdGlvbjsKLQkJaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoInJlZmVyZW5jZToiKSkgewotCQkJcmV0ID0gbG9jYXRpb24uc3Vic3RyaW5nKCJyZWZlcmVuY2U6Ii5sZW5ndGgoKSk7Ci0JCQlpZiAocmV0LmVuZHNXaXRoKCIuamFyLyIpKSB7Ci0JCQkJcmV0ID0gcmV0LnN1YnN0cmluZygwLCByZXQubGVuZ3RoKCkgLSAiLyIubGVuZ3RoKCkpOwotCQkJCWlmIChyZXQuc3RhcnRzV2l0aCgiZmlsZToiKSkKLQkJCQkJcmV0ID0gcmV0LnN1YnN0cmluZygiZmlsZToiLmxlbmd0aCgpKTsKLQkJCX0KLQkJfQotCQlpZiAobG9jYXRpb24uc3RhcnRzV2l0aCgiaW5pdGlhbEAiKSkKLQkJCXJldCA9IGxvY2F0aW9uLnN1YnN0cmluZygiaW5pdGlhbEAiLmxlbmd0aCgpKTsKLQotCQlpZiAocmV0ID09IGxvY2F0aW9uKQotCQkJcmV0dXJuIHVzZUVjbGlwc2UgPyBGaWxlVXRpbHMuZ2V0RWNsaXBzZVJlYWxMb2NhdGlvbihtYW5pcHVsYXRvciwgbG9jYXRpb24pIDogbG9jYXRpb247Ci0JCXJldHVybiBnZXRSZWFsTG9jYXRpb24obWFuaXB1bGF0b3IsIHJldCwgdXNlRWNsaXBzZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2VBbGwoU3RyaW5nIHN0LCBTdHJpbmcgb2xkU3QsIFN0cmluZyBuZXdTdCkgewotCQlpZiAob2xkU3QuZXF1YWxzKG5ld1N0KSkKLQkJCXJldHVybiBzdDsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCXdoaWxlICgoaW5kZXggPSBzdC5pbmRleE9mKG9sZFN0KSkgIT0gLTEpIHsKLQkJCXN0ID0gc3Quc3Vic3RyaW5nKDAsIGluZGV4KSArIG5ld1N0ICsgc3Quc3Vic3RyaW5nKGluZGV4ICsgb2xkU3QubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBzdDsKLQl9Ci0KLQkvKioKLQkgKiBJZiBhIGJ1bmRsZSBvZiB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGlzIGluIHRoZSBFY2xpcHNlIHBsdWdpbiBmb3JtYXQgKGVpdGhlciBwbHVnaW4tbmFtZV92ZXJzaW9uLmphciAKLQkgKiBvciBhcyBhIGZvbGRlciBuYW1lZCBwbHVnaW4tbmFtZV92ZXJzaW9uICksIHJldHVybiB2ZXJzaW9uIHN0cmluZy5PdGhlcndpc2UsIHJldHVybiBudWxsOwotCSAqIAotCSAqIEBwYXJhbSB1cmwKLQkgKiBAcGFyYW0gcGx1Z2luTmFtZQotCSAqIEByZXR1cm4gdmVyc2lvbiBzdHJpbmcuIElmIGludmFsaWQgZm9ybWF0LCByZXR1cm4gbnVsbC4gCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEVjbGlwc2VOYW1pbmdWZXJzaW9uKFVSTCB1cmwsIGZpbmFsIFN0cmluZyBwbHVnaW5OYW1lLCBib29sZWFuIGlzRmlsZSkgewotCQlTdHJpbmcgbG9jYXRpb24gPSB1cmwuZ2V0RmlsZSgpOwotCQlsb2NhdGlvbiA9IHJlcGxhY2VBbGwobG9jYXRpb24sIEZpbGUuc2VwYXJhdG9yLCAiLyIpOwotCQlTdHJpbmcgZmlsZW5hbWUgPSBudWxsOwotCQlpZiAobG9jYXRpb24uaW5kZXhPZigiOiIpID09IC0xKQotCQkJZmlsZW5hbWUgPSBsb2NhdGlvbjsKLQkJZWxzZQotCQkJZmlsZW5hbWUgPSBsb2NhdGlvbi5zdWJzdHJpbmcobG9jYXRpb24ubGFzdEluZGV4T2YoIjoiKSArIDEpOwotCi0JCS8vIGZpbGVuYW1lIG11c3QgYmUgImphck5hbWUiXyJ2ZXJzaW9uIi5qYXIKLQkJaWYgKGlzRmlsZSkgewotCQkJaWYgKCFmaWxlbmFtZS5lbmRzV2l0aCgiLmphciIpKQotCQkJCXJldHVybiBudWxsOwotCQkJZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgZmlsZW5hbWUubGFzdEluZGV4T2YoIi5qYXIiKSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBkaXJlY3RvcnkgLSByZW1vdmUgdHJhaWxpbmcgc2xhc2gKLQkJCWZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGZpbGVuYW1lLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQotCQlpZiAoZmlsZW5hbWUuaW5kZXhPZigiLyIpICE9IC0xKQotCQkJZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoZmlsZW5hbWUubGFzdEluZGV4T2YoIi8iKSArIDEpOwotCi0JCWlmICghZmlsZW5hbWUuc3RhcnRzV2l0aChwbHVnaW5OYW1lKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBwbHVnaW5uYW1lTGVuZ3RoID0gcGx1Z2luTmFtZS5sZW5ndGgoKTsKLQkJaWYgKGZpbGVuYW1lLmxlbmd0aCgpIDw9IHBsdWdpbm5hbWVMZW5ndGggfHwgZmlsZW5hbWUuY2hhckF0KHBsdWdpbk5hbWUubGVuZ3RoKCkpICE9ICdfJykKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBmaWxlbmFtZS5zdWJzdHJpbmcocGx1Z2lubmFtZUxlbmd0aCArIDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVjbGlwc2VQbHVnaW5GdWxsTG9jYXRpb24oU3RyaW5nIHBsdWdpbk5hbWUsIEZpbGUgYnVuZGxlc0RpcikgewotCQlGaWxlW10gbGlzdHMgPSBidW5kbGVzRGlyLmxpc3RGaWxlcygpOwotCQlVUkwgcmV0ID0gbnVsbDsKLQkJRWNsaXBzZVZlcnNpb24gbWF4VmVyc2lvbiA9IG51bGw7Ci0JCWlmIChsaXN0cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlVUkwgdXJsID0gbGlzdHNbaV0udG9VUkwoKTsKLQkJCQlTdHJpbmcgdmVyc2lvbiA9IGdldEVjbGlwc2VOYW1pbmdWZXJzaW9uKHVybCwgcGx1Z2luTmFtZSwgbGlzdHNbaV0uaXNGaWxlKCkpOwotCQkJCWlmICh2ZXJzaW9uICE9IG51bGwpIHsKLQkJCQkJRWNsaXBzZVZlcnNpb24gZWNsaXBzZVZlcnNpb24gPSBuZXcgRWNsaXBzZVZlcnNpb24odmVyc2lvbik7Ci0JCQkJCWlmIChtYXhWZXJzaW9uID09IG51bGwgfHwgZWNsaXBzZVZlcnNpb24uY29tcGFyZVRvKG1heFZlcnNpb24pID4gMCkgewotCQkJCQkJcmV0ID0gdXJsOwotCQkJCQkJbWF4VmVyc2lvbiA9IGVjbGlwc2VWZXJzaW9uOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKHJldCA9PSBudWxsID8gbnVsbCA6IHJldC50b0V4dGVybmFsRm9ybSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzYjQ4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjElRm91bmRhdGlvbi0xLjEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y4ODY1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZDkwYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLSNGcmkgRmViIDIyIDExOjA4OjA0IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMGZkOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotI1dlZCBPY3QgMjQgMTA6MTQ6MDIgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjMxZjRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1dlZCBPY3QgMjQgMTA6MTE6MTkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvRnJhbWV3b3JrIEFkbWluIFRlc3QubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvRnJhbWV3b3JrIEFkbWluIFRlc3QubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTJlZWJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L0ZyYW1ld29yayBBZG1pbiBUZXN0LmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkp1bml0TGF1bmNoQ29uZmlnIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYXBwbGljYXRpb24iIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUuanVuaXQucnVudGltZS5jb3JldGVzdGFwcGxpY2F0aW9uIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFza2NsZWFyIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljQWRkIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3cyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3c2xvZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9wZGUtanVuaXQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iZGVzZWxlY3RlZF93b3Jrc3BhY2VfcGx1Z2lucyIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci5hcHAsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWksb3JnLmVjbGlwc2UuZWNmLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZXBvc2l0b3J5b3B0aW1pemVyLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Isb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAsaWUud29tYmF0LmpiZGlmZixpZS53b21iYXQuamJkaWZmLnRlc3Qsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50YXJnZXQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZG93bmxvYWQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci50ZXN0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEsb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSxvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci50ZXN0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycyxvcmcuZWNsaXBzZS50ZXN0LnBlcmZvcm1hbmNlLHp6VGVzdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLG9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcCxvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyLG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2VsZmhvc3Rpbmcsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJsb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLi4vanVuaXQtd29ya3NwYWNlIi8+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1BBVEhTIj4KLTxsaXN0RW50cnkgdmFsdWU9Ii9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iNCIvPgotPC9saXN0QXR0cmlidXRlPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5DT05UQUlORVIiIHZhbHVlPSI9b3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5LRUVQUlVOTklOR19BVFRSIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVE5BTUUiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVF9LSU5EIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LmxvYWRlci5qdW5pdDMiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLk1BSU5fVFlQRSIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItb3MgJHt0YXJnZXQub3N9IC13cyAke3RhcmdldC53c30gLWFyY2ggJHt0YXJnZXQuYXJjaH0gLW5sICR7dGFyZ2V0Lm5sfSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InBkZS52ZXJzaW9uIiB2YWx1ZT0iMy4zIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icHJvZHVjdCIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLnByb2R1Y3QiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJzZWxlY3RlZF90YXJnZXRfcGx1Z2lucyIgdmFsdWU9ImNvbS5pYm0uaWN1LGphdmF4LnNlcnZsZXQsb3JnLmVjbGlwc2UuYW50LmNvcmUsb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyxvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlLG9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcsb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyxvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0sb3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLndpbjMyLng4NixvcmcuZWNsaXBzZS5jb3JlLmpvYnMsb3JnLmVjbGlwc2UuY29yZS5uZXQsb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMsb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29tcGF0aWJpbGl0eSxvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy53aW4zMixvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeSxvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcyxvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbixvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzLG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnksb3JnLmVjbGlwc2UuaGVscCxvcmcuZWNsaXBzZS5qZmFjZSxvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZyxvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LG9yZy5lY2xpcHNlLm9zZ2ksb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyxvcmcuZWNsaXBzZS5zd3Qsb3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4NixvcmcuZWNsaXBzZS50ZXh0LG9yZy5lY2xpcHNlLnVpLG9yZy5lY2xpcHNlLnVpLmZvcm1zLG9yZy5lY2xpcHNlLnVpLmlkZSxvcmcuZWNsaXBzZS51aS52aWV3cyxvcmcuZWNsaXBzZS51aS53aW4zMixvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gsb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIsb3JnLmVjbGlwc2UudXBkYXRlLnVpIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InNob3dfc2VsZWN0ZWRfb25seSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idGVtcGxhdGVDb25maWciIHZhbHVlPSIke3RhcmdldF9ob21lfVxjb25maWd1cmF0aW9uXGNvbmZpZy5pbmkiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlTmFtZWRKUkUiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZVByb2R1Y3QiIHZhbHVlPSJmYWxzZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA1OWI5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6IFRlc3QgUGx1Zy1pbiBmb3IgRnJhbWV3b3JrIEFkbWluCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249IjMuOC4wIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0cy5BY3RpdmF0b3IKLUltcG9ydC1QYWNrYWdlOiBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS40LjAiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjEvRm91bmRhdGlvbi0xLjEsCi0gSjJTRS0xLjQKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZkODY5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGRhdGFGaWxlLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvZGF0YUZpbGUvYnVuZGxlXzEvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9idW5kbGVfMS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E1MzViNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9idW5kbGVfMS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogQnVuZGxlIDEKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGJ1bmRsZV8xCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2MzFkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9vcmcuZWNsaXBzZS5vc2dpLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL29yZy5lY2xpcHNlLm9zZ2kuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGNhMjY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL29yZy5lY2xpcHNlLm9zZ2kuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QvZGF0YUZpbGUvb3JnLmVjbGlwc2Uub3NnaV8zLjQuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9vcmcuZWNsaXBzZS5vc2dpXzMuNC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzYWQ3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9vcmcuZWNsaXBzZS5vc2dpXzMuNC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL3NoYXJlZGNvbmZpZ3VyYXRpb24vY29uZmlnLmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL3NoYXJlZGNvbmZpZ3VyYXRpb24vY29uZmlnLmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4ZjNmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9zaGFyZWRjb25maWd1cmF0aW9uL2NvbmZpZy5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWNvbmZpZy5zaGFyZWQ9ZmFsc2UKLWZyb20ucGFyZW50PXRydWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9zaGFyZWRjb25maWd1cmF0aW9uL3VzZXItY29uZmlnLmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL3NoYXJlZGNvbmZpZ3VyYXRpb24vdXNlci1jb25maWcuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDZlNzI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL3NoYXJlZGNvbmZpZ3VyYXRpb24vdXNlci1jb25maWcuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1vc2dpLnNoYXJlZENvbmZpZ3VyYXRpb24uYXJlYT1maWxlXDpjb25maWd1cmF0aW9uLwotY29uZmlnLnNoYXJlZD10cnVlCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL3NoYXJlZGNvbmZpZ3VyYXRpb24vdXNlci1ub3NoYXJlLWNvbmZpZy5pbmkgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9kYXRhRmlsZS9zaGFyZWRjb25maWd1cmF0aW9uL3VzZXItbm9zaGFyZS1jb25maWcuaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDE0OThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L2RhdGFGaWxlL3NoYXJlZGNvbmZpZ3VyYXRpb24vdXNlci1ub3NoYXJlLWNvbmZpZy5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWNvbmZpZy5zaGFyZWQ9ZmFsc2UKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvQWJzdHJhY3RGd2tBZG1pblRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL0Fic3RyYWN0RndrQWRtaW5UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYzBhOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvQWJzdHJhY3RGd2tBZG1pblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uRnJhbWV3b3JrQWRtaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RGd2tBZG1pblRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciBmd0FkbWluVHJhY2tlcjsKLQotCXB1YmxpYyBBYnN0cmFjdEZ3a0FkbWluVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3B5IGFuIGlucHV0IHN0cmVhbSB0byBhbiBvdXRwdXQgc3RyZWFtLgotCSAqIE9wdGlvbmFsbHkgY2xvc2UgdGhlIHN0cmVhbXMgd2hlbiBkb25lLgotCSAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29weVN0cmVhbShJbnB1dFN0cmVhbSBpbiwgYm9vbGVhbiBjbG9zZUluLCBPdXRwdXRTdHJlYW0gb3V0LCBib29sZWFuIGNsb3NlT3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJaW50IHdyaXR0ZW4gPSAwOwotCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzE2ICogMTAyNF07Ci0JCQlpbnQgbGVuOwotCQkJd2hpbGUgKChsZW4gPSBpbi5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7Ci0JCQkJb3V0LndyaXRlKGJ1ZmZlciwgMCwgbGVuKTsKLQkJCQl3cml0dGVuICs9IGxlbjsKLQkJCX0KLQkJCXJldHVybiB3cml0dGVuOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoY2xvc2VJbikgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGNsb3NlT3V0KSB7Ci0JCQkJCW91dC5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBGcmFtZXdvcmtBZG1pbiBnZXRFcXVpbm94RnJhbWV3b3JrQWRtaW4oKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJZmluYWwgU3RyaW5nIEZJTFRFUl9PQkpFQ1RDTEFTUyA9ICIoIiArIENvbnN0YW50cy5PQkpFQ1RDTEFTUyArICI9IiArIEZyYW1ld29ya0FkbWluLmNsYXNzLmdldE5hbWUoKSArICIpIjsKLQkJZmluYWwgU3RyaW5nIGZpbHRlckZ3TmFtZSA9ICIoIiArIEZyYW1ld29ya0FkbWluLlNFUlZJQ0VfUFJPUF9LRVlfRldfTkFNRSArICI9RXF1aW5veCkiOwotCQlmaW5hbCBTdHJpbmcgZmlsdGVyTGF1bmNoZXJOYW1lID0gIigiICsgRnJhbWV3b3JrQWRtaW4uU0VSVklDRV9QUk9QX0tFWV9MQVVOQ0hFUl9OQU1FICsgIj1FY2xpcHNlLmV4ZSkiOwotCQlmaW5hbCBTdHJpbmcgZmlsdGVyRndBZG1pbiA9ICIoJiIgKyBGSUxURVJfT0JKRUNUQ0xBU1MgKyBmaWx0ZXJGd05hbWUgKyBmaWx0ZXJMYXVuY2hlck5hbWUgKyAiKSI7Ci0KLQkJU3RyaW5nIEZXS19BRE1JTl9FUSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3giOwotCQlCdW5kbGUgYiA9IFBsYXRmb3JtLmdldEJ1bmRsZShGV0tfQURNSU5fRVEpOwotCQlpZiAoYiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQnVuZGxlOiAiICsgRldLX0FETUlOX0VRICsgIiBpcyByZXF1aXJlZCBmb3IgdGhpcyB0ZXN0Iik7Ci0JCWIuc3RhcnQoKTsKLQotCQlpZiAoZndBZG1pblRyYWNrZXIgPT0gbnVsbCkgewotCQkJRmlsdGVyIGZpbHRlcjsKLQkJCXRyeSB7Ci0JCQkJZmlsdGVyID0gQWN0aXZhdG9yLmdldENvbnRleHQoKS5jcmVhdGVGaWx0ZXIoZmlsdGVyRndBZG1pbik7Ci0JCQkJZndBZG1pblRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgZmlsdGVyLCBudWxsKTsKLQkJCQlmd0FkbWluVHJhY2tlci5vcGVuKCk7Ci0JCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBuZXZlciBoYXBwZW5zCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKEZyYW1ld29ya0FkbWluKSBmd0FkbWluVHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJaWYgKGZ3QWRtaW5UcmFja2VyICE9IG51bGwpIHsKLQkJCWZ3QWRtaW5UcmFja2VyLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhc3NlcnRJc0ZpbGUoRmlsZSBmaWxlKSB7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCWZhaWwoIkZpbGU6ICIgKyBmaWxlLnRvU3RyaW5nKCkgKyAiIGNhbid0IGJlIGZvdW5kLiIpOwotCQlpZiAoIWZpbGUuaXNGaWxlKCkpCi0JCQlmYWlsKCJGaWxlOiAiICsgZmlsZS50b1N0cmluZygpICsgIiBpcyBleHBlY3RlZCB0byBiZSBhIGZpbGUuIik7Ci0JfQotCi0JcHVibGljIHZvaWQgYXNzZXJ0SXNEaXJlY3RvcnkoRmlsZSBmaWxlKSB7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCWZhaWwoIkRpcmVjdG9yeTogIiArIGZpbGUudG9TdHJpbmcoKSArICIgY2FuJ3QgYmUgZm91bmQuIik7Ci0JCWlmICghZmlsZS5pc0RpcmVjdG9yeSgpKQotCQkJZmFpbCgiRGlyZWN0b3J5OiAiICsgZmlsZS50b1N0cmluZygpICsgIiBpcyBleHBlY3RlZCB0byBiZSBhIGRpcmVjdG9yeS4iKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhc3NlcnROb3RoaW5nKEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCWZhaWwoIk5vIGZpbGUgb3IgZGlyZWN0b3J5IHNob3VsZCBiZSB0aGVyZTogIiArIGZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFzc2VydE5vdENvbnRlbnQoRmlsZSBmaWxlLCBTdHJpbmcgc2VhcmNoKSB7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCWZhaWwoIkZpbGU6ICIgKyBmaWxlLnRvU3RyaW5nKCkgKyAiIGNhbid0IGJlIGZvdW5kLiIpOwotCQl0cnkgewotCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKLQkJCQl3aGlsZSAocmVhZGVyLnJlYWR5KCkpIHsKLQkJCQkJU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJaWYgKGxpbmUuaW5kZXhPZihzZWFyY2gpID49IDApCi0JCQkJCQlmYWlsKCJUaGUgc3RyaW5nOiAiICsgc2VhcmNoICsgIiB3YXMgbm90IGV4cGVjdGVkIGluIHRoaXMgZmlsZTogIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHJlYWRlciAhPSBudWxsKQotCQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vaWdub3JlLCBjYXVnaHQgYmVmb3JlCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlN0cmluZzogIiArIHNlYXJjaCArICIgbm90IGZvdW5kIGluICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFzc2VydENvbnRlbnQoRmlsZSBmaWxlLCBTdHJpbmcgc2VhcmNoKSB7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCWZhaWwoIkZpbGU6ICIgKyBmaWxlLnRvU3RyaW5nKCkgKyAiIGNhbid0IGJlIGZvdW5kLiIpOwotCQl0cnkgewotCQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZpbGUpKTsKLQkJCQl3aGlsZSAocmVhZGVyLnJlYWR5KCkpIHsKLQkJCQkJU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCQkJaWYgKGxpbmUuaW5kZXhPZihzZWFyY2gpID49IDApCi0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAocmVhZGVyICE9IG51bGwpCi0JCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy9pZ25vcmUsIGNhdWdodCBiZWZvcmUKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiU3RyaW5nOiAiICsgc2VhcmNoICsgIiBub3QgZm91bmQgaW4gIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9Ci0JCWZhaWwoIlN0cmluZzoiICsgc2VhcmNoICsgIiBub3QgZm91bmQiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydFNpbXBsZUNvbmZpZ3VyYXRvcm1NYW5pcHVsYXRvcigpIHsKLQkJZmluYWwgU3RyaW5nIFNJTVBMRUNPTkZJR1VSQVRPUl9NQU5JUFVMQVRPUiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciI7Ci0JCUJ1bmRsZSBtYW5pcHVsYXRvckJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShTSU1QTEVDT05GSUdVUkFUT1JfTUFOSVBVTEFUT1IpOwotCQlpZiAobWFuaXB1bGF0b3JCdW5kbGUgPT0gbnVsbCkKLQkJCWZhaWwoIkJ1bmRsZTogIiArIFNJTVBMRUNPTkZJR1VSQVRPUl9NQU5JUFVMQVRPUiArICIgaXMgcmVxdWlyZWQgZm9yIHRoaXMgdGVzdCIpOwotCQl0cnkgewotCQkJbWFuaXB1bGF0b3JCdW5kbGUuc3RhcnQoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiB3aGlsZSBzdGFydGluZyB1cCAiICsgU0lNUExFQ09ORklHVVJBVE9SX01BTklQVUxBVE9SICsgJyAnICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcFNpbXBsZUNvbmZpZ3VyYXRvcm1NYW5pcHVsYXRvcigpIHsKLQkJZmluYWwgU3RyaW5nIFNJTVBMRUNPTkZJR1VSQVRPUl9NQU5JUFVMQVRPUiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciI7Ci0JCUJ1bmRsZSBtYW5pcHVsYXRvckJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShTSU1QTEVDT05GSUdVUkFUT1JfTUFOSVBVTEFUT1IpOwotCQlpZiAobWFuaXB1bGF0b3JCdW5kbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCW1hbmlwdWxhdG9yQnVuZGxlLnN0b3AoKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkV4Y2VwdGlvbiB3aGlsZSBzdGFydGluZyB1cCAiICsgU0lNUExFQ09ORklHVVJBVE9SX01BTklQVUxBVE9SICsgJyAnICsgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCQotCS8qCi0JICogQ29weQotCSAqIC0gaWYgd2UgaGF2ZSBhIGZpbGUsIHRoZW4gY29weSB0aGUgZmlsZQotCSAqIC0gaWYgd2UgaGF2ZSBhIGRpcmVjdG9yeSB0aGVuIG1lcmdlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNvcHkoU3RyaW5nIG1lc3NhZ2UsIEZpbGUgc291cmNlLCBGaWxlIHRhcmdldCkgewotCQlpZiAoIXNvdXJjZS5leGlzdHMoKSkKLQkJCXJldHVybjsKLQkJaWYgKHNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlpZiAodGFyZ2V0LmV4aXN0cygpICYmIHRhcmdldC5pc0ZpbGUoKSkKLQkJCQl0YXJnZXQuZGVsZXRlKCk7Ci0JCQlpZiAoIXRhcmdldC5leGlzdHMoKSkKLQkJCQl0YXJnZXQubWtkaXJzKCk7Ci0JCQlGaWxlW10gY2hpbGRyZW4gPSBzb3VyY2UubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkJCWNvcHkobWVzc2FnZSwgY2hpbGRyZW5baV0sIG5ldyBGaWxlKHRhcmdldCwgY2hpbGRyZW5baV0uZ2V0TmFtZSgpKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlucHV0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpKTsKLQkJCW91dHB1dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXQpKTsKLQotCQkJYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOwotCQkJaW50IGJ5dGVzUmVhZCA9IDA7Ci0JCQl3aGlsZSAoKGJ5dGVzUmVhZCA9IGlucHV0LnJlYWQoYnVmZmVyKSkgIT0gLTEpCi0JCQkJb3V0cHV0LndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbChtZXNzYWdlICsgIjogIiArIGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJFeGNlcHRpb24gd2hpbGUgdHJ5aW5nIHRvIGNsb3NlIGlucHV0IHN0cmVhbSBvbjogIiArIHNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkV4Y2VwdGlvbiB3aGlsZSB0cnlpbmcgdG8gY2xvc2Ugb3V0cHV0IHN0cmVhbSBvbjogIiArIHRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCS8qCi0JICogTG9vayB1cCBhbmQgcmV0dXJuIGEgZmlsZSBoYW5kbGUgdG8gdGhlIGdpdmVuIGVudHJ5IGluIHRoZSBidW5kbGUuCi0JICovCi0JcHJvdGVjdGVkIEZpbGUgZ2V0VGVzdERhdGEoU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyBlbnRyeSkgewotCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCWZhaWwobWVzc2FnZSArICIgZW50cnkgaXMgbnVsbC4iKTsKLQkJVVJMIGJhc2UgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KGVudHJ5KTsKLQkJaWYgKGJhc2UgPT0gbnVsbCkKLQkJCWZhaWwobWVzc2FnZSArICIgZW50cnkgbm90IGZvdW5kIGluIGJ1bmRsZTogIiArIGVudHJ5KTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBvc1BhdGggPSBuZXcgUGF0aChGaWxlTG9jYXRvci50b0ZpbGVVUkwoYmFzZSkuZ2V0UGF0aCgpKS50b09TU3RyaW5nKCk7Ci0JCQlGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKG9zUGF0aCk7Ci0JCQlpZiAoIXJlc3VsdC5nZXRDYW5vbmljYWxQYXRoKCkuZXF1YWxzKHJlc3VsdC5nZXRQYXRoKCkpKQotCQkJCWZhaWwobWVzc2FnZSArICIgcmVzdWx0IHBhdGg6ICIgKyByZXN1bHQuZ2V0UGF0aCgpICsgIiBkb2VzIG5vdCBtYXRjaCBjYW5vbmljYWwgcGF0aDogIiArIHJlc3VsdC5nZXRDYW5vbmljYWxGaWxlKCkuZ2V0UGF0aCgpKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwobWVzc2FnZSArICI6ICIgKyBlKTsKLQkJfQotCQkvLyBhdm9pZCBjb21waWxlIGVycm9yLi4uIHNob3VsZCBuZXZlciByZWFjaCB0aGlzIGNvZGUKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmNDQ5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBjdHg7Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQljdHggPSBjb250ZXh0OyAKLQotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY3R4ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGN0eDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9CdWcxOTY1MjUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL0J1ZzE5NjUyNS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjBmNTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL0J1ZzE5NjUyNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBCdWcxOTY1MjUgZXh0ZW5kcyBBYnN0cmFjdEZ3a0FkbWluVGVzdCB7Ci0JcHJpdmF0ZSBGaWxlIGluc3RhbGxGb2xkZXIgPSBudWxsOwotCXByaXZhdGUgRmlsZSBjb25maWd1cmF0aW9uRm9sZGVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBsYXVuY2hlck5hbWUgPSAiZWNsaXBzZSI7Ci0JcHJpdmF0ZSBGaWxlIGJ1bmRsZVRYVDsKLQlwcml2YXRlIEZpbGUgY29uZmlnSU5JOwotCi0JcHVibGljIEJ1ZzE5NjUyNShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdGFydFNpbXBsZUNvbmZpZ3VyYXRvcm1NYW5pcHVsYXRvcigpOwotCQkvL2NyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gd2l0aCBvc2dpIGFuZCBzaW1wbGVjb25maWd1cmF0b3IgaW4gaXQKLQotCQlGcmFtZXdvcmtBZG1pbiBmd2tBZG1pbiA9IGdldEVxdWlub3hGcmFtZXdvcmtBZG1pbigpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IGZ3a0FkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0KLQkJaW5zdGFsbEZvbGRlciA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoQnVnMTk2NTI1LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWNvbmZpZ3VyYXRpb25Gb2xkZXIgPSBuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiY29uZmlndXJhdGlvbiIpOwotCi0JCWJ1bmRsZVRYVCA9IG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25Gb2xkZXIsICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9idW5kbGVzLmluZm8iKTsKLQkJY29uZmlnSU5JID0gbmV3IEZpbGUoY29uZmlndXJhdGlvbkZvbGRlciwgImNvbmZpZy5pbmkiKTsKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKGNvbmZpZ3VyYXRpb25Gb2xkZXIpOwotCQlsYXVuY2hlckRhdGEuc2V0TGF1bmNoZXIobmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgbGF1bmNoZXJOYW1lKSk7Ci0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQotCQlCdW5kbGVJbmZvIG9zZ2lCaSA9IG5ldyBCdW5kbGVJbmZvKCJvcmcuZWNsaXBzZS5vc2dpIiwgIjMuMy4xIiwgRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9vcmcuZWNsaXBzZS5vc2dpLmphciIpKS50b0V4dGVybmFsRm9ybSgpLCAwLCB0cnVlKTsKLQkJQnVuZGxlSW5mbyBjb25maWd1cmF0b3JCaSA9IG5ldyBCdW5kbGVJbmZvKCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIsICIxLjAuMCIsIEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IuamFyIikpLnRvRXh0ZXJuYWxGb3JtKCksIDEsIHRydWUpOwotCi0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUob3NnaUJpKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShjb25maWd1cmF0b3JCaSk7Ci0KLQkJbWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmZpZ0NvbnRlbnQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlGcmFtZXdvcmtBZG1pbiBmd2tBZG1pbiA9IGdldEVxdWlub3hGcmFtZXdvcmtBZG1pbigpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IGZ3a0FkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0KLQkJRmlsZSBpbnN0YWxsRm9sZGVyID0gQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZShCdWcxOTY1MjUuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJRmlsZSBjb25maWd1cmF0aW9uRm9sZGVyID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgImNvbmZpZ3VyYXRpb24iKTsKLQkJU3RyaW5nIGxhdW5jaGVyTmFtZSA9ICJlY2xpcHNlIjsKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKGNvbmZpZ3VyYXRpb25Gb2xkZXIpOwotCQlsYXVuY2hlckRhdGEuc2V0TGF1bmNoZXIobmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgbGF1bmNoZXJOYW1lKSk7Ci0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQotCQlCdW5kbGVJbmZvIGJ1bmRsZTFCaSA9IG5ldyBCdW5kbGVJbmZvKCJidW5kbGVfMSIsICIxLjAuMCIsIEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvYnVuZGxlXzEiKSkudG9FeHRlcm5hbEZvcm0oKSwgMiwgdHJ1ZSk7Ci0KLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShidW5kbGUxQmkpOwotCi0JCW1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCi0JCWFzc2VydENvbnRlbnQoYnVuZGxlVFhULCAib3JnLmVjbGlwc2Uub3NnaSIpOwotCQlhc3NlcnRDb250ZW50KGNvbmZpZ0lOSSwgIm9yZy5lY2xpcHNlLm9zZ2kiKTsKLQkJYXNzZXJ0Q29udGVudChidW5kbGVUWFQsICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIpOwotCQlhc3NlcnRDb250ZW50KGNvbmZpZ0lOSSwgIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIik7Ci0JCWFzc2VydENvbnRlbnQoYnVuZGxlVFhULCAiYnVuZGxlXzEiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvQ2xlYW51cFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL0NsZWFudXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYWM2MTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvQ2xlYW51cFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLQotcHVibGljIGNsYXNzIENsZWFudXBUZXN0IGV4dGVuZHMgRndrQWRtaW5BbmRTaW1wbGVDb25maWd1cmF0b3JUZXN0IHsKLQotCXB1YmxpYyBDbGVhbnVwVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlNYW5pcHVsYXRvciBtID0gbnVsbDsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCW0gPSBjcmVhdGVNaW5pbWFsQ29uZmlndXJhdGlvbihDbGVhbnVwVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVDb25maWd1cmF0b3JSZW1vdmFsKCkgewotCQlCdW5kbGVJbmZvW10gYmlzID0gbS5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJpcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGJpc1tpXS5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIikpCi0JCQkJbS5nZXRDb25maWdEYXRhKCkucmVtb3ZlQnVuZGxlKGJpc1tpXSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCW0uc2F2ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkVycm9yIHdoaWxlIHNhdmluZyIpOwotCQl9Ci0JCWFzc2VydE5vdGhpbmcobmV3IEZpbGUoZ2V0Q29uZmlndXJhdGlvbkZvbGRlcigpLCAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiKSk7Ci0JCWFzc2VydElzRGlyZWN0b3J5KGdldENvbmZpZ3VyYXRpb25Gb2xkZXIoKSk7Ci0KLQkJLy9Ob3cgcmVtb3ZlIG9zZ2kKLQkJYmlzID0gbS5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJpcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGJpc1tpXS5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLm9zZ2kiKSkKLQkJCQltLmdldENvbmZpZ0RhdGEoKS5yZW1vdmVCdW5kbGUoYmlzW2ldKTsKLQkJfQotCQl0cnkgewotCQkJbS5zYXZlKGZhbHNlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXJyb3Igd2hpbGUgc2F2aW5nIik7Ci0JCX0KLQkJYXNzZXJ0Tm90aGluZyhnZXRDb25maWd1cmF0aW9uRm9sZGVyKCkpOwotCQlhc3NlcnROb3RoaW5nKG5ldyBGaWxlKGdldEluc3RhbGxGb2xkZXIoKSwgZ2V0TGF1bmNoZXJOYW1lKCkgKyAiLmluaSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0T1NHaVJlbW92YWwoKSB7Ci0JCUJ1bmRsZUluZm9bXSBiaXMgPSBtLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYmlzW2ldLmdldFN5bWJvbGljTmFtZSgpLmVxdWFscygib3JnLmVjbGlwc2Uub3NnaSIpKQotCQkJCW0uZ2V0Q29uZmlnRGF0YSgpLnJlbW92ZUJ1bmRsZShiaXNbaV0pOwotCQl9Ci0JCXRyeSB7Ci0JCQltLnNhdmUoZmFsc2UpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFcnJvciB3aGlsZSBzYXZpbmciKTsKLQkJfQotCQlhc3NlcnRJc0RpcmVjdG9yeShuZXcgRmlsZShnZXRDb25maWd1cmF0aW9uRm9sZGVyKCksICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIpKTsKLQkJYXNzZXJ0SXNEaXJlY3RvcnkoZ2V0Q29uZmlndXJhdGlvbkZvbGRlcigpKTsKLQkJYXNzZXJ0Tm90Q29udGVudChuZXcgRmlsZShnZXRDb25maWd1cmF0aW9uRm9sZGVyKCksICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9idW5kbGVzLmluZm8iKSwgIm9yZy5lY2xpcHNlLm9zZ2kiKTsKLQotCQliaXMgPSBtLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYmlzW2ldLmdldFN5bWJvbGljTmFtZSgpLmVxdWFscygib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiKSkKLQkJCQltLmdldENvbmZpZ0RhdGEoKS5yZW1vdmVCdW5kbGUoYmlzW2ldKTsKLQkJfQotCQl0cnkgewotCQkJbS5zYXZlKGZhbHNlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiRXJyb3Igd2hpbGUgc2F2aW5nIik7Ci0JCX0KLQkJYXNzZXJ0Tm90aGluZyhnZXRDb25maWd1cmF0aW9uRm9sZGVyKCkpOwotCQlhc3NlcnROb3RoaW5nKG5ldyBGaWxlKGdldEluc3RhbGxGb2xkZXIoKSwgZ2V0TGF1bmNoZXJOYW1lKCkgKyAiLmluaSIpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2l0aE11dGlwbGVCdW5kbGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQnVuZGxlSW5mbyBiaSA9IG5ldyBCdW5kbGVJbmZvKEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvYnVuZGxlXzEiKSkudG9FeHRlcm5hbEZvcm0oKSwgMik7Ci0JCW0uZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShiaSk7Ci0JCW0uc2F2ZShmYWxzZSk7Ci0KLQkJQnVuZGxlSW5mb1tdIGJpcyA9IG0uZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiaXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChiaXNbaV0uZ2V0U3ltYm9saWNOYW1lKCkuZXF1YWxzKCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIpKQotCQkJCW0uZ2V0Q29uZmlnRGF0YSgpLnJlbW92ZUJ1bmRsZShiaXNbaV0pOwotCQl9Ci0JCW0uc2F2ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0Tm90aGluZyhnZXRCdW5kbGVUeHQoKSk7Ci0JCWFzc2VydENvbnRlbnQoZ2V0Q29uZmlnSW5pKCksICJidW5kbGVfMSIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL0Z3a0FkbWluQW5kU2ltcGxlQ29uZmlndXJhdG9yVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvRndrQWRtaW5BbmRTaW1wbGVDb25maWd1cmF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1Y2U0YzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvRndrQWRtaW5BbmRTaW1wbGVDb25maWd1cmF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGd2tBZG1pbkFuZFNpbXBsZUNvbmZpZ3VyYXRvclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEZ3a0FkbWluVGVzdCB7Ci0JcHJpdmF0ZSBGaWxlIGluc3RhbGxGb2xkZXI7Ci0JcHJpdmF0ZSBGaWxlIGNvbmZpZ3VyYXRpb25Gb2xkZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZXJOYW1lOwotCi0JcHVibGljIEZ3a0FkbWluQW5kU2ltcGxlQ29uZmlndXJhdG9yVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlzdGFydFNpbXBsZUNvbmZpZ3VyYXRvcm1NYW5pcHVsYXRvcigpOwotCX0KLQotCXByb3RlY3RlZCBNYW5pcHVsYXRvciBnZXROZXdNYW5pcHVsYXRvcihTdHJpbmcgd29ya0FyZWEpIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlGcmFtZXdvcmtBZG1pbiBmd2tBZG1pbiA9IGdldEVxdWlub3hGcmFtZXdvcmtBZG1pbigpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IGZ3a0FkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0KLQkJaW5zdGFsbEZvbGRlciA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUod29ya0FyZWEpOwotCQljb25maWd1cmF0aW9uRm9sZGVyID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgImNvbmZpZ3VyYXRpb24iKTsKLQkJbGF1bmNoZXJOYW1lID0gImVjbGlwc2UiOwotCi0JCUxhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEgPSBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKTsKLQkJbGF1bmNoZXJEYXRhLnNldEZ3Q29uZmlnTG9jYXRpb24oY29uZmlndXJhdGlvbkZvbGRlcik7Ci0JCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlcihuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCBsYXVuY2hlck5hbWUpKTsKLQkJdHJ5IHsKLQkJCW1hbmlwdWxhdG9yLmxvYWQoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vVE9ETyBXZSBpZ25vcmUgdGhlIGZyYW1ld29yayBKQVIgbG9jYXRpb24gbm90IHNldCBleGNlcHRpb24KLQkJfQotCQlyZXR1cm4gbWFuaXB1bGF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIE1hbmlwdWxhdG9yIGNyZWF0ZU1pbmltYWxDb25maWd1cmF0aW9uKFN0cmluZyB3b3JrQXJlYSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gZ2V0TmV3TWFuaXB1bGF0b3Iod29ya0FyZWEpOwotCi0JCUJ1bmRsZUluZm8gb3NnaUJpID0gbmV3IEJ1bmRsZUluZm8oIm9yZy5lY2xpcHNlLm9zZ2kiLCAiMy4zLjEiLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL29yZy5lY2xpcHNlLm9zZ2kuamFyIikpLnRvRXh0ZXJuYWxGb3JtKCksIDAsIHRydWUpOwotCQlCdW5kbGVJbmZvIGNvbmZpZ3VyYXRvckJpID0gbmV3IEJ1bmRsZUluZm8oIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIiwgIjEuMC4wIiwgRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIiKSkudG9FeHRlcm5hbEZvcm0oKSwgMSwgdHJ1ZSk7Ci0KLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShvc2dpQmkpOwotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKGNvbmZpZ3VyYXRvckJpKTsKLQotCQl0cnkgewotCQkJbWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkVycm9yIHdoaWxlIHBlcnNpc3RpbmciKTsKLQkJfSBjYXRjaCAoRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIkVycm9yIHdoaWxlIHBlcnNpc3RpbmciKTsKLQkJfQotCQlyZXR1cm4gbWFuaXB1bGF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJaWYgKGluc3RhbGxGb2xkZXIgIT0gbnVsbCkKLQkJCWRlbGV0ZShpbnN0YWxsRm9sZGVyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsZXRlKEZpbGUgdG9EZWxldGUpIHsKLQkJaWYgKHRvRGVsZXRlLmlzRmlsZSgpKSB7Ci0JCQl0b0RlbGV0ZS5kZWxldGUoKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodG9EZWxldGUuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGNoaWxkcmVuID0gdG9EZWxldGUubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZGVsZXRlKGNoaWxkcmVuW2ldKTsKLQkJCX0KLQkJCXRvRGVsZXRlLmRlbGV0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0SW5zdGFsbEZvbGRlcigpIHsKLQkJcmV0dXJuIGluc3RhbGxGb2xkZXI7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0Q29uZmlndXJhdGlvbkZvbGRlcigpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25Gb2xkZXI7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0QnVuZGxlVHh0KCkgewotCQlyZXR1cm4gbmV3IEZpbGUoY29uZmlndXJhdGlvbkZvbGRlciwgIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2J1bmRsZXMuaW5mbyIpOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldENvbmZpZ0luaSgpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25Gb2xkZXIsICJjb25maWcuaW5pIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXVuY2hlck5hbWUoKSB7Ci0JCXJldHVybiBsYXVuY2hlck5hbWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvTGF1bmNoZXJDb25maWdMb2NhdGlvblRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL0xhdW5jaGVyQ29uZmlnTG9jYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMDc0NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvTGF1bmNoZXJDb25maWdMb2NhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgTGF1bmNoZXJDb25maWdMb2NhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEZ3a0FkbWluVGVzdCB7Ci0KLQlwdWJsaWMgTGF1bmNoZXJDb25maWdMb2NhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQkKLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tTGF1bmNoZXJDb25maWcoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlzdGFydFNpbXBsZUNvbmZpZ3VyYXRvcm1NYW5pcHVsYXRvcigpOwotCQlGcmFtZXdvcmtBZG1pbiBmd2tBZG1pbiA9IGdldEVxdWlub3hGcmFtZXdvcmtBZG1pbigpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IGZ3a0FkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0KLQkJRmlsZSBpbnN0YWxsRm9sZGVyID0gQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZShMYXVuY2hlckNvbmZpZ0xvY2F0aW9uVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCQlGaWxlIGNvbmZpZ3VyYXRpb25Gb2xkZXIgPSBuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiY29uZmlndXJhdGlvbiIpOwotCQlTdHJpbmcgbGF1bmNoZXJOYW1lID0gImZvbyI7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihjb25maWd1cmF0aW9uRm9sZGVyKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSkpOwotCQkKLQkJRmlsZSBkZWZhdWx0bGF1bmNoQ29uZmlnID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgbGF1bmNoZXJOYW1lICsgIi5pbmkiKTsKLQkJYXNzZXJ0RXF1YWxzKGRlZmF1bHRsYXVuY2hDb25maWcuZXhpc3RzKCksIGZhbHNlKTsKLQkJRmlsZSBsYXVuY2hDb25maWcgPSBuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAibXlsYXVuY2guaW5pIik7Ci0JCWFzc2VydEVxdWFscyhsYXVuY2hDb25maWcuZXhpc3RzKCksIGZhbHNlKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyQ29uZmlnTG9jYXRpb24obGF1bmNoQ29uZmlnKTsKLQkJdHJ5IHsKLQkJCW1hbmlwdWxhdG9yLmxvYWQoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vVE9ETyBXZSBpZ25vcmUgdGhlIGZyYW1ld29yayBKQVIgbG9jYXRpb24gbm90IHNldCBleGNlcHRpb24KLQkJfQotCQkKLQkJQnVuZGxlSW5mbyBvc2dpQmkgPSBuZXcgQnVuZGxlSW5mbygib3JnLmVjbGlwc2Uub3NnaSIsICIzLjMuMSIsIEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvb3JnLmVjbGlwc2Uub3NnaS5qYXIiKSkudG9FeHRlcm5hbEZvcm0oKSwgMCwgdHJ1ZSk7Ci0JCUJ1bmRsZUluZm8gY29uZmlndXJhdG9yQmkgPSBuZXcgQnVuZGxlSW5mbygib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiLCAiMS4wLjAiLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphciIpKS50b0V4dGVybmFsRm9ybSgpLCAxLCB0cnVlKTsKLQotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKG9zZ2lCaSk7Ci0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUoY29uZmlndXJhdG9yQmkpOwotCi0JCW1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCi0JCWFzc2VydEVxdWFscyhsYXVuY2hDb25maWcuZXhpc3RzKCksIHRydWUpOwotCQlhc3NlcnRFcXVhbHMoZGVmYXVsdGxhdW5jaENvbmZpZy5leGlzdHMoKSwgZmFsc2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL05vQ29uZmlndXJhdGlvblZhbHVlSW5FY2xpcHNlSW5pLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9Ob0NvbmZpZ3VyYXRpb25WYWx1ZUluRWNsaXBzZUluaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGY1M2M0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL05vQ29uZmlndXJhdGlvblZhbHVlSW5FY2xpcHNlSW5pLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIE5vQ29uZmlndXJhdGlvblZhbHVlSW5FY2xpcHNlSW5pIGV4dGVuZHMgRndrQWRtaW5BbmRTaW1wbGVDb25maWd1cmF0b3JUZXN0IHsKLQotCXB1YmxpYyBOb0NvbmZpZ3VyYXRpb25WYWx1ZUluRWNsaXBzZUluaShTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWJzZW5jZU9mQ29uZmlndXJhdGlvbkluRWNsaXBzZUlOSSgpIHRocm93cyBFeGNlcHRpb24gewotCQljcmVhdGVNaW5pbWFsQ29uZmlndXJhdGlvbihOb0NvbmZpZ3VyYXRpb25WYWx1ZUluRWNsaXBzZUluaS5jbGFzcy5nZXROYW1lKCkpOwotCQlGaWxlIGxhdW5jaGVySW5pID0gbmV3IEZpbGUoZ2V0SW5zdGFsbEZvbGRlcigpLCBnZXRMYXVuY2hlck5hbWUoKSArICIuaW5pIik7Ci0JCWFzc2VydE5vdENvbnRlbnQobGF1bmNoZXJJbmksICItY29uZmlndXJhdGlvbiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQcmVzZW5jZU9mQ29uZmlndXJhdGlvbkluRWNsaXBzZUlOSSgpIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlGcmFtZXdvcmtBZG1pbiBmd2tBZG1pbiA9IGdldEVxdWlub3hGcmFtZXdvcmtBZG1pbigpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IGZ3a0FkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0KLQkJRmlsZSBpbnN0YWxsRm9sZGVyID0gQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZSgiYmlzIiArIE5vQ29uZmlndXJhdGlvblZhbHVlSW5FY2xpcHNlSW5pLmNsYXNzLmdldE5hbWUoKSk7Ci0JCUZpbGUgY29uZmlndXJhdGlvbkZvbGRlciA9IG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsICJjb25maWcyIik7Ci0JCVN0cmluZyBsYXVuY2hlck5hbWUgPSAiZWNsaXBzZSI7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihjb25maWd1cmF0aW9uRm9sZGVyKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSkpOwotCi0JCUJ1bmRsZUluZm8gb3NnaUJpID0gbmV3IEJ1bmRsZUluZm8oIm9yZy5lY2xpcHNlLm9zZ2kiLCAiMy4zLjEiLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL29yZy5lY2xpcHNlLm9zZ2kuamFyIikpLnRvRXh0ZXJuYWxGb3JtKCksIDAsIHRydWUpOwotCQlCdW5kbGVJbmZvIGNvbmZpZ3VyYXRvckJpID0gbmV3IEJ1bmRsZUluZm8oIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIiwgIjEuMC4wIiwgRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIiKSkudG9FeHRlcm5hbEZvcm0oKSwgMSwgdHJ1ZSk7Ci0KLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShvc2dpQmkpOwotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKGNvbmZpZ3VyYXRvckJpKTsKLQotCQl0cnkgewotCQkJbWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQkJRmlsZSBsYXVuY2hlckluaSA9IG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSArICIuaW5pIik7Ci0JCWFzc2VydENvbnRlbnQobGF1bmNoZXJJbmksICItY29uZmlndXJhdGlvbiIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL05vUmVuYW1pbmdMYXVuY2hlckluaS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvTm9SZW5hbWluZ0xhdW5jaGVySW5pLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDAyNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvTm9SZW5hbWluZ0xhdW5jaGVySW5pLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIE5vUmVuYW1pbmdMYXVuY2hlckluaSBleHRlbmRzIEFic3RyYWN0RndrQWRtaW5UZXN0IHsKLQotCXB1YmxpYyBOb1JlbmFtaW5nTGF1bmNoZXJJbmkoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbmZpZ0ZpbGVzKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQnVuZGxlRXhjZXB0aW9uIHsKLQkJc3RhcnRTaW1wbGVDb25maWd1cmF0b3JtTWFuaXB1bGF0b3IoKTsKLQkJRnJhbWV3b3JrQWRtaW4gZndrQWRtaW4gPSBnZXRFcXVpbm94RnJhbWV3b3JrQWRtaW4oKTsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSBmd2tBZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCi0JCUZpbGUgaW5zdGFsbEZvbGRlciA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0RGF0YUZpbGUoTm9SZW5hbWluZ0xhdW5jaGVySW5pLmNsYXNzLmdldE5hbWUoKSk7Ci0JCUZpbGUgY29uZmlndXJhdGlvbkZvbGRlciA9IG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsICJjb25maWd1cmF0aW9uIik7Ci0JCVN0cmluZyBsYXVuY2hlck5hbWUgPSAiZm9vIjsKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKGNvbmZpZ3VyYXRpb25Gb2xkZXIpOwotCQlsYXVuY2hlckRhdGEuc2V0TGF1bmNoZXIobmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgbGF1bmNoZXJOYW1lKSk7Ci0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQotCQlCdW5kbGVJbmZvIG9zZ2lCaSA9IG5ldyBCdW5kbGVJbmZvKCJvcmcuZWNsaXBzZS5vc2dpIiwgIjMuMy4xIiwgRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9vcmcuZWNsaXBzZS5vc2dpLmphciIpKS50b0V4dGVybmFsRm9ybSgpLCAwLCB0cnVlKTsKLQkJQnVuZGxlSW5mbyBjb25maWd1cmF0b3JCaSA9IG5ldyBCdW5kbGVJbmZvKCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIsICIxLjAuMCIsIEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IuamFyIikpLnRvRXh0ZXJuYWxGb3JtKCksIDEsIHRydWUpOwotCi0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUob3NnaUJpKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShjb25maWd1cmF0b3JCaSk7Ci0KLQkJbWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0KLQkJRmlsZSBmb29JTkkgPSBuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiZm9vLmluaSIpOwotCQlhc3NlcnRFcXVhbHMoZm9vSU5JLmV4aXN0cygpLCB0cnVlKTsKLQotCQlNYW5pcHVsYXRvciBtMiA9IGZ3a0FkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YTIgPSBtMi5nZXRMYXVuY2hlckRhdGEoKTsKLQkJbGF1bmNoZXJEYXRhMi5zZXRGd0NvbmZpZ0xvY2F0aW9uKGNvbmZpZ3VyYXRpb25Gb2xkZXIpOwotCQlsYXVuY2hlckRhdGEyLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSkpOwotCi0JCXRyeSB7Ci0JCQltMi5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQkJbGF1bmNoZXJEYXRhMi5zZXRMYXVuY2hlcihuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiYmFyIikpOwotCQltMi5zYXZlKGZhbHNlKTsKLQotCQlhc3NlcnRFcXVhbHMoZm9vSU5JLmV4aXN0cygpLCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiYmFyLmluaSIpLmV4aXN0cygpLCB0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9PU0dpVmVyc2lvbkNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvT1NHaVZlcnNpb25DaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZkZjhhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9PU0dpVmVyc2lvbkNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBPU0dpVmVyc2lvbkNoYW5nZSBleHRlbmRzIEZ3a0FkbWluQW5kU2ltcGxlQ29uZmlndXJhdG9yVGVzdCB7Ci0JcHJpdmF0ZSBNYW5pcHVsYXRvciBkZWZhdWx0TWFuaXB1bGF0b3IgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHdvcmtBcmVhID0gT1NHaVZlcnNpb25DaGFuZ2UuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIE9TR2lWZXJzaW9uQ2hhbmdlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWRlZmF1bHRNYW5pcHVsYXRvciA9IGNyZWF0ZU1pbmltYWxDb25maWd1cmF0aW9uKHdvcmtBcmVhKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZhbFVzaW5nU2FtZU1hbmlwdWxhdG9yKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQnVuZGxlRXhjZXB0aW9uIHsKLQkJQnVuZGxlSW5mb1tdIGluZm9zID0gZGVmYXVsdE1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JCUJ1bmRsZUluZm8gb3NnaSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgib3JnLmVjbGlwc2Uub3NnaSIuZXF1YWxzKGluZm9zW2ldLmdldFN5bWJvbGljTmFtZSgpKSkgewotCQkJCW9zZ2kgPSBpbmZvc1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlkZWZhdWx0TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnJlbW92ZUJ1bmRsZShvc2dpKTsKLQkJZGVmYXVsdE1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCQlhc3NlcnROb3RDb250ZW50KGdldEJ1bmRsZVR4dCgpLCAib3JnLmVjbGlwc2Uub3NnaSIpOwotCQlhc3NlcnROb3RDb250ZW50KGdldENvbmZpZ0luaSgpLCAib3JnLmVjbGlwc2Uub3NnaSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmFsVXNpbmdPdGhlck1hbmlwdWxhdG9yKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQnVuZGxlRXhjZXB0aW9uIHsKLQkJTWFuaXB1bGF0b3IgbmV3TWFuaXB1bGF0b3IgPSBnZXROZXdNYW5pcHVsYXRvcih3b3JrQXJlYSk7Ci0JCUJ1bmRsZUluZm9bXSBpbmZvcyA9IG5ld01hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JCUJ1bmRsZUluZm8gb3NnaSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgib3JnLmVjbGlwc2Uub3NnaSIuZXF1YWxzKGluZm9zW2ldLmdldFN5bWJvbGljTmFtZSgpKSkgewotCQkJCW9zZ2kgPSBpbmZvc1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQluZXdNYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkucmVtb3ZlQnVuZGxlKG9zZ2kpOwotCQluZXdNYW5pcHVsYXRvci5zYXZlKGZhbHNlKTsKLQkJYXNzZXJ0Tm90Q29udGVudChnZXRCdW5kbGVUeHQoKSwgIm9yZy5lY2xpcHNlLm9zZ2kiKTsKLQkJYXNzZXJ0Tm90Q29udGVudChnZXRDb25maWdJbmkoKSwgIm9yZy5lY2xpcHNlLm9zZ2kiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWRkaXRpb25Vc2luZ090aGVyTWFuaXB1bGF0b3IoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGVJbmZvW10gaW5mb3MgPSBkZWZhdWx0TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJQnVuZGxlSW5mbyBvc2dpID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCJvcmcuZWNsaXBzZS5vc2dpIi5lcXVhbHMoaW5mb3NbaV0uZ2V0U3ltYm9saWNOYW1lKCkpKSB7Ci0JCQkJb3NnaSA9IGluZm9zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWRlZmF1bHRNYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkucmVtb3ZlQnVuZGxlKG9zZ2kpOwotCQlkZWZhdWx0TWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0KLQkJTWFuaXB1bGF0b3IgbmV3TWFuaXB1bGF0b3IgPSBnZXROZXdNYW5pcHVsYXRvcih3b3JrQXJlYSk7Ci0KLQkJbmV3TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShvc2dpKTsKLQkJbmV3TWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0JCWFzc2VydENvbnRlbnQoZ2V0QnVuZGxlVHh0KCksICJvcmcuZWNsaXBzZS5vc2dpIik7Ci0JCWFzc2VydENvbnRlbnQoZ2V0Q29uZmlnSW5pKCksICJvcmcuZWNsaXBzZS5vc2dpIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZVZlcnNpb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGVJbmZvW10gaW5mb3MgPSBkZWZhdWx0TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJQnVuZGxlSW5mbyBvc2dpID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCJvcmcuZWNsaXBzZS5vc2dpIi5lcXVhbHMoaW5mb3NbaV0uZ2V0U3ltYm9saWNOYW1lKCkpKSB7Ci0JCQkJb3NnaSA9IGluZm9zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWRlZmF1bHRNYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkucmVtb3ZlQnVuZGxlKG9zZ2kpOwotCQlkZWZhdWx0TWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0KLQkJLy9UaGVzZSB0d28gY29uc3RhbnRzIGRlc2NyaWJlIHRoZSBkYXRhIGZpbGUgdXNlZCBpbiB0aGUgdGVzdAotCQlmaW5hbCBTdHJpbmcgRklMRU5BTUUgPSAib3JnLmVjbGlwc2Uub3NnaV8zLjQuMC5qYXIiOwotCQlmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIzLjQuMC52MjAwNzExMDUiOwotCQlCdW5kbGVJbmZvIG5ld09TR2kgPSBuZXcgQnVuZGxlSW5mbygib3JnLmVjbGlwc2Uub3NnaSIsICIzLjQuMC52MjAwNzExMDUiLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlLyIgKyBGSUxFTkFNRSkpLnRvRXh0ZXJuYWxGb3JtKCksIDAsIHRydWUpOwotCQlkZWZhdWx0TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShuZXdPU0dpKTsKLQkJZGVmYXVsdE1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCQlhc3NlcnRDb250ZW50KGdldEJ1bmRsZVR4dCgpLCBWRVJTSU9OKTsKLQkJYXNzZXJ0Q29udGVudChnZXRDb25maWdJbmkoKSwgRklMRU5BTUUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZWFkQ29uZmlnV2l0aG91dE9TR2koKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQkvL0ZpcnN0IENyZWF0ZSBhIGNvbmZpZ3VyYXRpb24gdGhhdCBkb2VzIG5vdCBjb250YWluIE9TR2kKLQkJQnVuZGxlSW5mb1tdIGluZm9zID0gZGVmYXVsdE1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JCUJ1bmRsZUluZm8gb3NnaSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgib3JnLmVjbGlwc2Uub3NnaSIuZXF1YWxzKGluZm9zW2ldLmdldFN5bWJvbGljTmFtZSgpKSkgewotCQkJCW9zZ2kgPSBpbmZvc1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlkZWZhdWx0TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnJlbW92ZUJ1bmRsZShvc2dpKTsKLQkJZGVmYXVsdE1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCQlhc3NlcnROb3RDb250ZW50KGdldEJ1bmRsZVR4dCgpLCAib3JnLmVjbGlwc2Uub3NnaSIpOwotCQlhc3NlcnROb3RDb250ZW50KGdldENvbmZpZ0luaSgpLCAib3JnLmVjbGlwc2Uub3NnaSIpOwotCi0JCU1hbmlwdWxhdG9yIG5ld01hbmlwdWxhdG9yID0gZ2V0TmV3TWFuaXB1bGF0b3Iod29ya0FyZWEpOwotCQlhc3NlcnRFcXVhbHMobmV3TWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKS5sZW5ndGgsIDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1JlbGF0aXZlUGF0aFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1JlbGF0aXZlUGF0aFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2MmI2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9SZWxhdGl2ZVBhdGhUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotCi1wdWJsaWMgY2xhc3MgUmVsYXRpdmVQYXRoVGVzdCBleHRlbmRzIEZ3a0FkbWluQW5kU2ltcGxlQ29uZmlndXJhdG9yVGVzdCB7Ci0JcHVibGljIFJlbGF0aXZlUGF0aFRlc3QoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdmVQYXRocygpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIGluc3RhbGxGb2xkZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKFJlbGF0aXZlUGF0aFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCQkvL0ZpcnN0IHdlIGNvcHkgc29tZSBqYXJzIGludG8gYSB3ZWxsCi0JCUZpbGUgb3NnaUphciA9IG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsICJwbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2kuamFyIik7Ci0JCW9zZ2lKYXIuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQlGaWxlIHNjSmFyID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgInBsdWdpbnMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IuamFyIik7Ci0KLQkJY29weVN0cmVhbShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9vcmcuZWNsaXBzZS5vc2dpLmphciIpLm9wZW5TdHJlYW0oKSwgdHJ1ZSwgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3NnaUphciksIHRydWUpOwotCQljb3B5U3RyZWFtKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphciIpLm9wZW5TdHJlYW0oKSwgdHJ1ZSwgbmV3IEZpbGVPdXRwdXRTdHJlYW0oc2NKYXIpLCB0cnVlKTsKLQotCQlGcmFtZXdvcmtBZG1pbiBmd2tBZG1pbiA9IGdldEVxdWlub3hGcmFtZXdvcmtBZG1pbigpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IGZ3a0FkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0KLQkJRmlsZSBjb25maWd1cmF0aW9uRm9sZGVyID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgImNvbmZpZ3VyYXRpb24iKTsKLQkJU3RyaW5nIGxhdW5jaGVyTmFtZSA9ICJlY2xpcHNlIjsKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKGNvbmZpZ3VyYXRpb25Gb2xkZXIpOwotCQlsYXVuY2hlckRhdGEuc2V0TGF1bmNoZXIobmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgbGF1bmNoZXJOYW1lKSk7Ci0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQotCQlCdW5kbGVJbmZvIG9zZ2lCaSA9IG5ldyBCdW5kbGVJbmZvKCJvcmcuZWNsaXBzZS5vc2dpIiwgIjMuMy4xIiwgb3NnaUphci50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCksIDAsIHRydWUpOwotCQlCdW5kbGVJbmZvIGNvbmZpZ3VyYXRvckJpID0gbmV3IEJ1bmRsZUluZm8oIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIiwgIjEuMC4wIiwgc2NKYXIudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpLCAxLCB0cnVlKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShvc2dpQmkpOwotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKGNvbmZpZ3VyYXRvckJpKTsKLQkJdHJ5IHsKLQkJCW1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFcnJvciB3aGlsZSBwZXJzaXN0aW5nIik7Ci0JCX0gY2F0Y2ggKEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCJFcnJvciB3aGlsZSBwZXJzaXN0aW5nIik7Ci0JCX0KLQotCQkvLyI6cGF0aC5qYXIiIGlzIGEgIHBvb3IgbWFuIGFwcHJvYWNoIHRvIHRlc3QgcmVsYXRpdmUgcGF0aHMgCi0JCWFzc2VydE5vdENvbnRlbnQobmV3IEZpbGUoY29uZmlndXJhdGlvbkZvbGRlciwgImNvbmZpZy5pbmkiKSwgaW5zdGFsbEZvbGRlci5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWFzc2VydE5vdENvbnRlbnQobmV3IEZpbGUoY29uZmlndXJhdGlvbkZvbGRlciwgIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2J1bmRsZXMuaW5mbyIpLCBpbnN0YWxsRm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJYXNzZXJ0Q29udGVudChuZXcgRmlsZShjb25maWd1cmF0aW9uRm9sZGVyLCAiY29uZmlnLmluaSIpLCAiOm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphciIpOwotCQlhc3NlcnRDb250ZW50KG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25Gb2xkZXIsICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9idW5kbGVzLmluZm8iKSwgIjpwbHVnaW5zXFxvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIiKTsKLQkJYXNzZXJ0Q29udGVudChuZXcgRmlsZShjb25maWd1cmF0aW9uRm9sZGVyLCAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvYnVuZGxlcy5pbmZvIiksICI6cGx1Z2luc1xcb3JnLmVjbGlwc2Uub3NnaS5qYXIiKTsKLQotCQlCdW5kbGVJbmZvIGJpID0gbmV3IEJ1bmRsZUluZm8oRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9idW5kbGVfMSIpKS50b0V4dGVybmFsRm9ybSgpLCAyKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShiaSk7Ci0JCW1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotLy8JCWFzc2VydENvbnRlbnQobmV3IEZpbGUoY29uZmlndXJhdGlvbkZvbGRlciwgIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2J1bmRsZXMuaW5mbyIpLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL2J1bmRsZV8xIikpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCi0JCU1hbmlwdWxhdG9yIG5ld01hbmlwdWxhdG9yID0gZndrQWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQkJTGF1bmNoZXJEYXRhIG5ld0xhdW5jaGVyRGF0YSA9IG5ld01hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQluZXdMYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihjb25maWd1cmF0aW9uRm9sZGVyKTsKLQkJbmV3TGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSkpOwotCQl0cnkgewotCQkJbWFuaXB1bGF0b3IubG9hZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy9UT0RPIFdlIGlnbm9yZSB0aGUgZnJhbWV3b3JrIEpBUiBsb2NhdGlvbiBub3Qgc2V0IGV4Y2VwdGlvbgotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9SZW1vdmluZ0FsbEJ1bmRsZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1JlbW92aW5nQWxsQnVuZGxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDE3NTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1JlbW92aW5nQWxsQnVuZGxlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmluZ0FsbEJ1bmRsZXMgZXh0ZW5kcyBBYnN0cmFjdEZ3a0FkbWluVGVzdCB7Ci0KLQlwdWJsaWMgUmVtb3ZpbmdBbGxCdW5kbGVzKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25maWdGaWxlcygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCXN0YXJ0U2ltcGxlQ29uZmlndXJhdG9ybU1hbmlwdWxhdG9yKCk7Ci0JCUZyYW1ld29ya0FkbWluIGZ3a0FkbWluID0gZ2V0RXF1aW5veEZyYW1ld29ya0FkbWluKCk7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gZndrQWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQotCQlGaWxlIGluc3RhbGxGb2xkZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKFJlbW92aW5nQWxsQnVuZGxlcy5jbGFzcy5nZXROYW1lKCkpOwotCQlGaWxlIGNvbmZpZ3VyYXRpb25Gb2xkZXIgPSBuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiY29uZmlndXJhdGlvbiIpOwotCQlTdHJpbmcgbGF1bmNoZXJOYW1lID0gImZvbyI7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihjb25maWd1cmF0aW9uRm9sZGVyKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSkpOwotCQl0cnkgewotCQkJbWFuaXB1bGF0b3IubG9hZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy9UT0RPIFdlIGlnbm9yZSB0aGUgZnJhbWV3b3JrIEpBUiBsb2NhdGlvbiBub3Qgc2V0IGV4Y2VwdGlvbgotCQl9Ci0KLQkJQnVuZGxlSW5mbyBvc2dpQmkgPSBuZXcgQnVuZGxlSW5mbygib3JnLmVjbGlwc2Uub3NnaSIsICIzLjMuMSIsIEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvb3JnLmVjbGlwc2Uub3NnaS5qYXIiKSkudG9FeHRlcm5hbEZvcm0oKSwgMCwgdHJ1ZSk7Ci0JCUJ1bmRsZUluZm8gY29uZmlndXJhdG9yQmkgPSBuZXcgQnVuZGxlSW5mbygib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiLCAiMS4wLjAiLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmphciIpKS50b0V4dGVybmFsRm9ybSgpLCAxLCB0cnVlKTsKLQotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKG9zZ2lCaSk7Ci0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUoY29uZmlndXJhdG9yQmkpOwotCi0JCW1hbmlwdWxhdG9yLnNhdmUoZmFsc2UpOwotCi0JCUZpbGUgZm9vSU5JID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgImZvby5pbmkiKTsKLQkJYXNzZXJ0RXF1YWxzKGZvb0lOSS5leGlzdHMoKSwgdHJ1ZSk7Ci0KLQkJTWFuaXB1bGF0b3IgbTIgPSBmd2tBZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCi0JCUxhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEyID0gbTIuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YTIuc2V0RndDb25maWdMb2NhdGlvbihjb25maWd1cmF0aW9uRm9sZGVyKTsKLQkJbGF1bmNoZXJEYXRhMi5zZXRMYXVuY2hlcihuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCBsYXVuY2hlck5hbWUpKTsKLQotCQl0cnkgewotCQkJbTIubG9hZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy9UT0RPIFdlIGlnbm9yZSB0aGUgZnJhbWV3b3JrIEpBUiBsb2NhdGlvbiBub3Qgc2V0IGV4Y2VwdGlvbgotCQl9Ci0KLQkJQnVuZGxlSW5mb1tdIGluZm9zID0gbTIuZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotCQkJbTIuZ2V0Q29uZmlnRGF0YSgpLnJlbW92ZUJ1bmRsZShpbmZvc1tpXSk7Ci0JCX0KLQkJbTIuc2F2ZShmYWxzZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25Gb2xkZXIgKyAiL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIiwgImJ1bmRsZXMuaW5mbyIpLmV4aXN0cygpLCBmYWxzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvUmVuYW1pbmdMYXVuY2hlckluaS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvUmVuYW1pbmdMYXVuY2hlckluaS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDJmMjViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1JlbmFtaW5nTGF1bmNoZXJJbmkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgUmVuYW1pbmdMYXVuY2hlckluaSBleHRlbmRzIEFic3RyYWN0RndrQWRtaW5UZXN0IHsKLQotCXB1YmxpYyBSZW5hbWluZ0xhdW5jaGVySW5pKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25maWdGaWxlcygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCXN0YXJ0U2ltcGxlQ29uZmlndXJhdG9ybU1hbmlwdWxhdG9yKCk7Ci0JCUZyYW1ld29ya0FkbWluIGZ3a0FkbWluID0gZ2V0RXF1aW5veEZyYW1ld29ya0FkbWluKCk7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gZndrQWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQotCQlGaWxlIGluc3RhbGxGb2xkZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKFJlbmFtaW5nTGF1bmNoZXJJbmkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJRmlsZSBjb25maWd1cmF0aW9uRm9sZGVyID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgImNvbmZpZ3VyYXRpb24iKTsKLQkJU3RyaW5nIGxhdW5jaGVyTmFtZSA9ICJmb28iOwotCi0JCUxhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEgPSBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKTsKLQkJbGF1bmNoZXJEYXRhLnNldEZ3Q29uZmlnTG9jYXRpb24oY29uZmlndXJhdGlvbkZvbGRlcik7Ci0JCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlcihuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCBsYXVuY2hlck5hbWUpKTsKLQkJdHJ5IHsKLQkJCW1hbmlwdWxhdG9yLmxvYWQoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vVE9ETyBXZSBpZ25vcmUgdGhlIGZyYW1ld29yayBKQVIgbG9jYXRpb24gbm90IHNldCBleGNlcHRpb24KLQkJfQotCi0JCUJ1bmRsZUluZm8gb3NnaUJpID0gbmV3IEJ1bmRsZUluZm8oIm9yZy5lY2xpcHNlLm9zZ2kiLCAiMy4zLjEiLCBGaWxlTG9jYXRvci5yZXNvbHZlKEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoImRhdGFGaWxlL29yZy5lY2xpcHNlLm9zZ2kuamFyIikpLnRvRXh0ZXJuYWxGb3JtKCksIDAsIHRydWUpOwotCQlCdW5kbGVJbmZvIGNvbmZpZ3VyYXRvckJpID0gbmV3IEJ1bmRsZUluZm8oIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIiwgIjEuMC4wIiwgRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIiKSkudG9FeHRlcm5hbEZvcm0oKSwgMSwgdHJ1ZSk7Ci0KLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShvc2dpQmkpOwotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKGNvbmZpZ3VyYXRvckJpKTsKLQotCQltYW5pcHVsYXRvci5zYXZlKGZhbHNlKTsKLQotCQlGaWxlIGZvb0lOSSA9IG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsICJmb28uaW5pIik7Ci0JCWFzc2VydEVxdWFscyhmb29JTkkuZXhpc3RzKCksIHRydWUpOwotCi0JCU1hbmlwdWxhdG9yIG0yID0gZndrQWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhMiA9IG0yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEyLnNldEZ3Q29uZmlnTG9jYXRpb24oY29uZmlndXJhdGlvbkZvbGRlcik7Ci0JCWxhdW5jaGVyRGF0YTIuc2V0TGF1bmNoZXIobmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgbGF1bmNoZXJOYW1lKSk7Ci0KLQkJdHJ5IHsKLQkJCW0yLmxvYWQoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vVE9ETyBXZSBpZ25vcmUgdGhlIGZyYW1ld29yayBKQVIgbG9jYXRpb24gbm90IHNldCBleGNlcHRpb24KLQkJfQotCQlsYXVuY2hlckRhdGEyLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsICJmb28iKSk7Ci0JCW0yLnNhdmUoZmFsc2UpOwotCi0JCWFzc2VydEVxdWFscyhuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiZm9vLmluaSIpLmV4aXN0cygpLCB0cnVlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9TaGFyZWRDb25maWd1cmF0aW9uVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvU2hhcmVkQ29uZmlndXJhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FmYmE4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9TaGFyZWRDb25maWd1cmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2hhcmVkQ29uZmlndXJhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdEZ3a0FkbWluVGVzdCB7Ci0KLQlwdWJsaWMgU2hhcmVkQ29uZmlndXJhdGlvblRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Q29uZmlndXJhdGlvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCXN0YXJ0U2ltcGxlQ29uZmlndXJhdG9ybU1hbmlwdWxhdG9yKCk7Ci0JCUZyYW1ld29ya0FkbWluIGZ3a0FkbWluID0gZ2V0RXF1aW5veEZyYW1ld29ya0FkbWluKCk7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gZndrQWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQotCQlGaWxlIGluc3RhbGxGb2xkZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKFNoYXJlZENvbmZpZ3VyYXRpb25UZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0JCUZpbGUgZGVmYXVsdENvbmZpZ3VyYXRpb25Gb2xkZXIgPSBuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiY29uZmlndXJhdGlvbiIpOwotCQlkZWZhdWx0Q29uZmlndXJhdGlvbkZvbGRlci5ta2RpcnMoKTsKLQkJY29weSgiY3JlYXRpbmcgc2hhcmVkIGNvbmZpZy5pbmkiLCBnZXRUZXN0RGF0YSgiIiwgImRhdGFGaWxlL3NoYXJlZGNvbmZpZ3VyYXRpb24vY29uZmlnLmluaSIpLCBuZXcgRmlsZShkZWZhdWx0Q29uZmlndXJhdGlvbkZvbGRlciwgImNvbmZpZy5pbmkiKSk7Ci0JCQotCQlTdHJpbmcgbGF1bmNoZXJOYW1lID0gImZvbyI7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbihkZWZhdWx0Q29uZmlndXJhdGlvbkZvbGRlcik7Ci0JCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlcihuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCBsYXVuY2hlck5hbWUpKTsKLQkJCi0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQkJCi0JCWFzc2VydEVxdWFscygiZmFsc2UiLCBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0RndJbmRlcGVuZGVudFByb3AoImNvbmZpZy5zaGFyZWQiKSk7Ci0JCWFzc2VydEVxdWFscygidHJ1ZSIsIG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRGd0luZGVwZW5kZW50UHJvcCgiZnJvbS5wYXJlbnQiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNoYXJlZENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlzdGFydFNpbXBsZUNvbmZpZ3VyYXRvcm1NYW5pcHVsYXRvcigpOwotCQlGcmFtZXdvcmtBZG1pbiBmd2tBZG1pbiA9IGdldEVxdWlub3hGcmFtZXdvcmtBZG1pbigpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IGZ3a0FkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0KLQkJRmlsZSBpbnN0YWxsRm9sZGVyID0gQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZShTaGFyZWRDb25maWd1cmF0aW9uVGVzdC5jbGFzcy5nZXROYW1lKCkpOwotCQlGaWxlIGRlZmF1bHRDb25maWd1cmF0aW9uRm9sZGVyID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgImNvbmZpZ3VyYXRpb24iKTsKLQkJZGVmYXVsdENvbmZpZ3VyYXRpb25Gb2xkZXIubWtkaXJzKCk7Ci0JCWNvcHkoImNyZWF0aW5nIHNoYXJlZCBjb25maWcuaW5pIiwgZ2V0VGVzdERhdGEoIiIsICJkYXRhRmlsZS9zaGFyZWRjb25maWd1cmF0aW9uL2NvbmZpZy5pbmkiKSwgbmV3IEZpbGUoZGVmYXVsdENvbmZpZ3VyYXRpb25Gb2xkZXIsICJjb25maWcuaW5pIikpOwotCQlGaWxlIHVzZXJDb25maWd1cmF0aW9uRm9sZGVyID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgInVzZXIvY29uZmlndXJhdGlvbiIpOwotCQl1c2VyQ29uZmlndXJhdGlvbkZvbGRlci5ta2RpcnMoKTsKLQkJY29weSgiY3JlYXRpbmcgc2hhcmVkIGNvbmZpZy5pbmkiLCBnZXRUZXN0RGF0YSgiIiwgImRhdGFGaWxlL3NoYXJlZGNvbmZpZ3VyYXRpb24vdXNlci1jb25maWcuaW5pIiksIG5ldyBGaWxlKHVzZXJDb25maWd1cmF0aW9uRm9sZGVyLCAiY29uZmlnLmluaSIpKTsKLQkJCi0JCVN0cmluZyBsYXVuY2hlck5hbWUgPSAiZm9vIjsKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKHVzZXJDb25maWd1cmF0aW9uRm9sZGVyKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKG5ldyBGaWxlKGluc3RhbGxGb2xkZXIsIGxhdW5jaGVyTmFtZSkpOwotCQkKLQkJdHJ5IHsKLQkJCW1hbmlwdWxhdG9yLmxvYWQoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vVE9ETyBXZSBpZ25vcmUgdGhlIGZyYW1ld29yayBKQVIgbG9jYXRpb24gbm90IHNldCBleGNlcHRpb24KLQkJfQotCQkKLQkJYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmdldEZ3SW5kZXBlbmRlbnRQcm9wKCJjb25maWcuc2hhcmVkIikpOwotCQlhc3NlcnRFcXVhbHMoInRydWUiLCBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0RndJbmRlcGVuZGVudFByb3AoImZyb20ucGFyZW50IikpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCB0ZXN0Tm90U2hhcmVkQ29uZmlndXJhdGlvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCXN0YXJ0U2ltcGxlQ29uZmlndXJhdG9ybU1hbmlwdWxhdG9yKCk7Ci0JCUZyYW1ld29ya0FkbWluIGZ3a0FkbWluID0gZ2V0RXF1aW5veEZyYW1ld29ya0FkbWluKCk7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gZndrQWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQotCQlGaWxlIGluc3RhbGxGb2xkZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKFNoYXJlZENvbmZpZ3VyYXRpb25UZXN0LmNsYXNzLmdldE5hbWUoKSk7Ci0JCUZpbGUgZGVmYXVsdENvbmZpZ3VyYXRpb25Gb2xkZXIgPSBuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAiY29uZmlndXJhdGlvbiIpOwotCQlkZWZhdWx0Q29uZmlndXJhdGlvbkZvbGRlci5ta2RpcnMoKTsKLQkJY29weSgiY3JlYXRpbmcgc2hhcmVkIGNvbmZpZy5pbmkiLCBnZXRUZXN0RGF0YSgiIiwgImRhdGFGaWxlL3NoYXJlZGNvbmZpZ3VyYXRpb24vY29uZmlnLmluaSIpLCBuZXcgRmlsZShkZWZhdWx0Q29uZmlndXJhdGlvbkZvbGRlciwgImNvbmZpZy5pbmkiKSk7Ci0JCUZpbGUgdXNlckNvbmZpZ3VyYXRpb25Gb2xkZXIgPSBuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCAidXNlci9jb25maWd1cmF0aW9uIik7Ci0JCXVzZXJDb25maWd1cmF0aW9uRm9sZGVyLm1rZGlycygpOwotCQljb3B5KCJjcmVhdGluZyBzaGFyZWQgY29uZmlnLmluaSIsIGdldFRlc3REYXRhKCIiLCAiZGF0YUZpbGUvc2hhcmVkY29uZmlndXJhdGlvbi91c2VyLW5vc2hhcmUtY29uZmlnLmluaSIpLCBuZXcgRmlsZSh1c2VyQ29uZmlndXJhdGlvbkZvbGRlciwgImNvbmZpZy5pbmkiKSk7Ci0JCQotCQlTdHJpbmcgbGF1bmNoZXJOYW1lID0gImZvbyI7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndDb25maWdMb2NhdGlvbih1c2VyQ29uZmlndXJhdGlvbkZvbGRlcik7Ci0JCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlcihuZXcgRmlsZShpbnN0YWxsRm9sZGVyLCBsYXVuY2hlck5hbWUpKTsKLQkJCi0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQkJCi0JCWFzc2VydEVxdWFscygiZmFsc2UiLCBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0RndJbmRlcGVuZGVudFByb3AoImNvbmZpZy5zaGFyZWQiKSk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0RndJbmRlcGVuZGVudFByb3AoImZyb20ucGFyZW50IikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1NpbXBsZUNvbmZpZ3VyYXRvckNvbWluZ0FuZEdvaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9TaW1wbGVDb25maWd1cmF0b3JDb21pbmdBbmRHb2luZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTgzMWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1NpbXBsZUNvbmZpZ3VyYXRvckNvbWluZ0FuZEdvaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZUNvbmZpZ3VyYXRvckNvbWluZ0FuZEdvaW5nIGV4dGVuZHMgRndrQWRtaW5BbmRTaW1wbGVDb25maWd1cmF0b3JUZXN0IHsKLQlNYW5pcHVsYXRvciBtID0gbnVsbDsKLQotCXB1YmxpYyBTaW1wbGVDb25maWd1cmF0b3JDb21pbmdBbmRHb2luZyhTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQltID0gY3JlYXRlTWluaW1hbENvbmZpZ3VyYXRpb24oU2ltcGxlQ29uZmlndXJhdG9yQ29taW5nQW5kR29pbmcuY2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2l0aE11dGlwbGVCdW5kbGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGVJbmZvIGJpID0gbmV3IEJ1bmRsZUluZm8oRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9idW5kbGVfMSIpKS50b0V4dGVybmFsRm9ybSgpLCAyKTsKLQkJbS5nZXRDb25maWdEYXRhKCkuYWRkQnVuZGxlKGJpKTsKLQkJbS5zYXZlKGZhbHNlKTsKLQotCQlCdW5kbGVJbmZvW10gYmlzID0gbS5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJpcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGJpc1tpXS5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMoIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIikpCi0JCQkJbS5nZXRDb25maWdEYXRhKCkucmVtb3ZlQnVuZGxlKGJpc1tpXSk7Ci0JCX0KLQkJbS5zYXZlKGZhbHNlKTsKLQotCQlhc3NlcnROb3RoaW5nKGdldEJ1bmRsZVR4dCgpKTsKLQkJYXNzZXJ0Q29udGVudChnZXRDb25maWdJbmkoKSwgImJ1bmRsZV8xIik7Ci0JCWFzc2VydENvbnRlbnQoZ2V0Q29uZmlnSW5pKCksICJvcmcuZWNsaXBzZS5vc2dpIik7Ci0KLQkJRnJhbWV3b3JrQWRtaW4gZndrQWRtaW4gPSBnZXRFcXVpbm94RnJhbWV3b3JrQWRtaW4oKTsKLQkJTWFuaXB1bGF0b3IgbmV3TWFuaXB1bGF0b3IgPSBmd2tBZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCi0JCUxhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEgPSBuZXdNYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKTsKLQkJbGF1bmNoZXJEYXRhLnNldEZ3Q29uZmlnTG9jYXRpb24oZ2V0Q29uZmlndXJhdGlvbkZvbGRlcigpKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKG5ldyBGaWxlKGdldEluc3RhbGxGb2xkZXIoKSwgZ2V0TGF1bmNoZXJOYW1lKCkpKTsKLQkJdHJ5IHsKLQkJCW5ld01hbmlwdWxhdG9yLmxvYWQoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCS8vVE9ETyBXZSBpZ25vcmUgdGhlIGZyYW1ld29yayBKQVIgbG9jYXRpb24gbm90IHNldCBleGNlcHRpb24KLQkJfQotCi0JCW5ld01hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUobmV3IEJ1bmRsZUluZm8oRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIiKSkudG9FeHRlcm5hbEZvcm0oKSwgMSwgdHJ1ZSkpOwotCQluZXdNYW5pcHVsYXRvci5zYXZlKGZhbHNlKTsKLQotCQlhc3NlcnRDb250ZW50KGdldEJ1bmRsZVR4dCgpLCAib3JnLmVjbGlwc2Uub3NnaSIpOwotCQlhc3NlcnRDb250ZW50KGdldEJ1bmRsZVR4dCgpLCAiYnVuZGxlXzEiKTsKLQkJYXNzZXJ0Q29udGVudChnZXRCdW5kbGVUeHQoKSwgIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvU2ltcGxlQ29uZmlndXJhdG9yVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvU2ltcGxlQ29uZmlndXJhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDNkMDU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1NpbXBsZUNvbmZpZ3VyYXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkZpbGVMb2NhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29uZmlndXJhdG9yVGVzdCBleHRlbmRzIEFic3RyYWN0RndrQWRtaW5UZXN0IHsKLQotCXB1YmxpYyBTaW1wbGVDb25maWd1cmF0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25maWdGaWxlcygpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCXN0YXJ0U2ltcGxlQ29uZmlndXJhdG9ybU1hbmlwdWxhdG9yKCk7Ci0JCUZyYW1ld29ya0FkbWluIGZ3a0FkbWluID0gZ2V0RXF1aW5veEZyYW1ld29ya0FkbWluKCk7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gZndrQWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQotCQlGaWxlIGluc3RhbGxGb2xkZXIgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKFNpbXBsZUNvbmZpZ3VyYXRvclRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJRmlsZSBjb25maWd1cmF0aW9uRm9sZGVyID0gbmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgImNvbmZpZ3VyYXRpb24iKTsKLQkJU3RyaW5nIGxhdW5jaGVyTmFtZSA9ICJlY2xpcHNlIjsKLQotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRGd0NvbmZpZ0xvY2F0aW9uKGNvbmZpZ3VyYXRpb25Gb2xkZXIpOwotCQlsYXVuY2hlckRhdGEuc2V0TGF1bmNoZXIobmV3IEZpbGUoaW5zdGFsbEZvbGRlciwgbGF1bmNoZXJOYW1lKSk7Ci0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5sb2FkKCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1RPRE8gV2UgaWdub3JlIHRoZSBmcmFtZXdvcmsgSkFSIGxvY2F0aW9uIG5vdCBzZXQgZXhjZXB0aW9uCi0JCX0KLQotCQlCdW5kbGVJbmZvIG9zZ2lCaSA9IG5ldyBCdW5kbGVJbmZvKCJvcmcuZWNsaXBzZS5vc2dpIiwgIjMuMy4xIiwgRmlsZUxvY2F0b3IucmVzb2x2ZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCJkYXRhRmlsZS9vcmcuZWNsaXBzZS5vc2dpLmphciIpKS50b0V4dGVybmFsRm9ybSgpLCAwLCB0cnVlKTsKLQkJQnVuZGxlSW5mbyBjb25maWd1cmF0b3JCaSA9IG5ldyBCdW5kbGVJbmZvKCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIsICIxLjAuMCIsIEZpbGVMb2NhdG9yLnJlc29sdmUoQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiZGF0YUZpbGUvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IuamFyIikpLnRvRXh0ZXJuYWxGb3JtKCksIDEsIHRydWUpOwotCi0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUob3NnaUJpKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmFkZEJ1bmRsZShjb25maWd1cmF0b3JCaSk7Ci0KLQkJbWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0KLQkJRmlsZSBidW5kbGVUWFQgPSBuZXcgRmlsZShjb25maWd1cmF0aW9uRm9sZGVyLCAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvYnVuZGxlcy5pbmZvIik7Ci0JCUZpbGUgY29uZmlnSU5JID0gbmV3IEZpbGUoY29uZmlndXJhdGlvbkZvbGRlciwgImNvbmZpZy5pbmkiKTsKLQkJYXNzZXJ0Q29udGVudChidW5kbGVUWFQsICJvcmcuZWNsaXBzZS5vc2dpIik7Ci0JCWFzc2VydENvbnRlbnQoY29uZmlnSU5JLCAib3JnLmVjbGlwc2Uub3NnaSIpOwotCQlhc3NlcnRDb250ZW50KGJ1bmRsZVRYVCwgIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIik7Ci0JCWFzc2VydENvbnRlbnQoY29uZmlnSU5JLCAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9UZXN0RWNsaXBzZURhdGFBcmVhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9UZXN0RWNsaXBzZURhdGFBcmVhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYjc3NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvZnJhbWV3b3JrYWRtaW4vdGVzdHMvVGVzdEVjbGlwc2VEYXRhQXJlYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLk1hbmlwdWxhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RWNsaXBzZURhdGFBcmVhIGV4dGVuZHMgRndrQWRtaW5BbmRTaW1wbGVDb25maWd1cmF0b3JUZXN0IHsKLQlNYW5pcHVsYXRvciBtID0gbnVsbDsKLQotCXB1YmxpYyBUZXN0RWNsaXBzZURhdGFBcmVhKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCW0gPSBjcmVhdGVNaW5pbWFsQ29uZmlndXJhdGlvbihUZXN0RWNsaXBzZURhdGFBcmVhLmNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdHAyRGF0YUFyZWEoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEJ1bmRsZUV4Y2VwdGlvbiB7Ci0JCW0uZ2V0Q29uZmlnRGF0YSgpLnNldEZ3RGVwZW5kZW50UHJvcCgiZWNsaXBzZS5wMi5kYXRhLmFyZWEiLCAiQGNvbmZpZy5kaXIvLi4vcDIiKTsKLQkJbS5zYXZlKGZhbHNlKTsKLQkJYXNzZXJ0Q29udGVudChnZXRDb25maWdJbmkoKSwgIkBjb25maWcuZGlyLy4uL3AyIik7Ci0JCW0ubG9hZCgpOwotCQltLnNhdmUoZmFsc2UpOwotCQlhc3NlcnRDb250ZW50KGdldENvbmZpZ0luaSgpLCAiQGNvbmZpZy5kaXIvLi4vcDIiKTsKLQotCQltLmdldENvbmZpZ0RhdGEoKS5zZXRGd0RlcGVuZGVudFByb3AoImVjbGlwc2UucDIuZGF0YS5hcmVhIiwgbmV3IEZpbGUoZ2V0Q29uZmlndXJhdGlvbkZvbGRlcigpLCAicDIiKS5nZXRBYnNvbHV0ZUZpbGUoKS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQltLnNhdmUoZmFsc2UpOwotCQlhc3NlcnRDb250ZW50KGdldENvbmZpZ0luaSgpLCAiQGNvbmZpZy5kaXIvcDIiKTsKLQkJbS5sb2FkKCk7Ci0JCW0uc2F2ZShmYWxzZSk7Ci0JCWFzc2VydENvbnRlbnQoZ2V0Q29uZmlnSW5pKCksICJAY29uZmlnLmRpci9wMiIpOwotCi0JCW0uZ2V0Q29uZmlnRGF0YSgpLnNldEZ3RGVwZW5kZW50UHJvcCgiZWNsaXBzZS5wMi5kYXRhLmFyZWEiLCBuZXcgRmlsZShnZXRDb25maWd1cmF0aW9uRm9sZGVyKCksICIuLi9wMiIpLmdldEFic29sdXRlRmlsZSgpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCW0uc2F2ZShmYWxzZSk7Ci0JCWFzc2VydENvbnRlbnQoZ2V0Q29uZmlnSW5pKCksICJAY29uZmlnLmRpci8uLi9wMiIpOwotCQltLmxvYWQoKTsKLQkJbS5zYXZlKGZhbHNlKTsKLQkJYXNzZXJ0Q29udGVudChnZXRDb25maWdJbmkoKSwgIkBjb25maWcuZGlyLy4uL3AyIik7Ci0KLQkJbS5nZXRDb25maWdEYXRhKCkuc2V0RndEZXBlbmRlbnRQcm9wKCJlY2xpcHNlLnAyLmRhdGEuYXJlYSIsICJmaWxlOmQ6L3RtcC9mb28vYmFyL3AyIik7Ci0JCW0uc2F2ZShmYWxzZSk7Ci0JCWFzc2VydENvbnRlbnQoZ2V0Q29uZmlnSW5pKCksICIvdG1wL2Zvby9iYXIvcDIiKTsKLQkJbS5sb2FkKCk7Ci0JCW0uc2F2ZShmYWxzZSk7Ci0JCWFzc2VydENvbnRlbnQoZ2V0Q29uZmlnSW5pKCksICIvdG1wL2Zvby9iYXIvcDIiKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1Rlc3RSdW5uaW5nSW5zdGFuY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1Rlc3RSdW5uaW5nSW5zdGFuY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0NzYyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9UZXN0UnVubmluZ0luc3RhbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBUZXN0UnVubmluZ0luc3RhbmNlIGV4dGVuZHMgQWJzdHJhY3RGd2tBZG1pblRlc3QgewotCi0JcHVibGljIFRlc3RSdW5uaW5nSW5zdGFuY2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJ1bm5pbmdJbnN0YW5jZSgpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlGcmFtZXdvcmtBZG1pbiBmd2tBZG1pbiA9IGdldEVxdWlub3hGcmFtZXdvcmtBZG1pbigpOwotCQlNYW5pcHVsYXRvciBtID0gZndrQWRtaW4uZ2V0UnVubmluZ01hbmlwdWxhdG9yKCk7Ci0JCUJ1bmRsZUluZm9bXSBpbmZvcyA9IG0uZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGluZm9zW2ldKTsKLQkJfQotCQkKLQkJQnVuZGxlW10gYnVuZGxlcyA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlcygpOwotCQkKLQkJYXNzZXJ0RXF1YWxzKGJ1bmRsZXMubGVuZ3RoLCBpbmZvcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW5mb3MubGVuZ3RoICYmIGZvdW5kID09IGZhbHNlOyBqKyspIHsKLQkJCQlmb3VuZCA9IHNhbWUoaW5mb3Nbal0sIGJ1bmRsZXNbaV0pOwotCQkJfQotCQkJaWYgKGZvdW5kID09IGZhbHNlKSB7Ci0JCQkJZmFpbCgiQ2FuJ3QgZmluZDogIiArIGJ1bmRsZXNbaV0pOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBzYW1lKEJ1bmRsZUluZm8gaW5mbywgQnVuZGxlIGJ1bmRsZSkgewotCQlpZiAoaW5mby5nZXRTeW1ib2xpY05hbWUoKS5lcXVhbHMoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpKSkgewotCQkJaWYgKG5ldyBWZXJzaW9uKChTdHJpbmcpIGJ1bmRsZS5nZXRIZWFkZXJzKCkuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTikpLmVxdWFscyhuZXcgVmVyc2lvbihpbmZvLmdldFZlcnNpb24oKSkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9mcmFtZXdvcmthZG1pbi90ZXN0cy9VdGlsc1Rlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1V0aWxzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTAwMmRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ZyYW1ld29ya2FkbWluL3Rlc3RzL1V0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0czsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLy8vKioKLS8vICogCi0vLyAqLwotLy9wYWNrYWdlIG9yZy5lY2xpcHNlLmluY3ViYXRvci5jb25maWd1cmF0b3IudXRpbDsKLS8vCi0vL2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0vL2ltcG9ydCBqYXZhLm5ldC5VUkw7Ci0vLwotLy9pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0vLwotLy9pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlscy4qOwotLy8KLS8vLyoqCi0vLyAqIEBhdXRob3IgaXlhbWFzYWsKLS8vICoKLS8vICovCi0vL3B1YmxpYyBjbGFzcyBVdGlsc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0vLwotLy8JLyoqCi0vLwkgKiBAcGFyYW0gbmFtZQotLy8JICovCi0vLwlwdWJsaWMgVXRpbHNUZXN0KFN0cmluZyBuYW1lKSB7Ci0vLwkJc3VwZXIobmFtZSk7Ci0vLwl9Ci0vLwotLy8JLyogKG5vbi1KYXZhZG9jKQotLy8JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2Ujc2V0VXAoKQotLy8JICovCi0vLwlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXN1cGVyLnNldFVwKCk7Ci0vLwl9Ci0vLwotLy8JLyogKG5vbi1KYXZhZG9jKQotLy8JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotLy8JICovCi0vLwlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotLy8JCXN1cGVyLnRlYXJEb3duKCk7Ci0vLwl9Ci0vLwotLy8JLy8JLyoqCi0vLwkvLwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLmNvbmZpZ01hbi5pbnRlcm5hbC51dGlsLlV0aWxzI2dldFVybChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKX0uCi0vLwkvLwkgKi8KLS8vCS8vCXB1YmxpYyB2b2lkIHRlc3RHZXRVcmwoKSB7Ci0vLwkvLwkJZmFpbCgiTm90IHlldCBpbXBsZW1lbnRlZCIpOwotLy8JLy8JfQotLy8KLS8vCS8qKgotLy8JICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBVdGlscyNnZXRSZWxhdGl2ZVBhdGgoamF2YS5uZXQuVVJMLCBqYXZhLm5ldC5VUkwpfS4KLS8vCSAqLwotLy8JcHVibGljIHZvaWQgdGVzdEdldFJlbGF0aXZlUGF0aCgpIHsKLS8vCQkvL1VSTCB0YXJnZXQ7Ci0vLwkJLy9VUkwgZnJvbTsKLS8vCQl0cnkgewotLy8JCQlVUkwgdGFyZ2V0ID0gbmV3IFVSTCgiaHR0cCIsICJ3d3cubnR0LmNvLmpwIiwgImRpcjEvZGlyMi90YXJnZXQuaHRtbCIpOwotLy8JCQlVUkwgZnJvbSA9IG5ldyBVUkwoImh0dHAiLCAid3d3Lm50dC5jby5qcCIsICJkaXIxL2RpcjMvZGlyNC9mcm9tLmh0bWwiKTsKLS8vCQkJU3RyaW5nIGV4cGVjdGVkID0gIi4uLy4uLy4uL2RpcjIvdGFyZ2V0Lmh0bWwiOwotLy8JCQlTdHJpbmcgcmV0ID0gVXRpbHMuZ2V0UmVsYXRpdmVQYXRoKHRhcmdldCwgZnJvbSk7Ci0vLwkJCWFzc2VydEVxdWFscyhleHBlY3RlZCwgcmV0KTsKLS8vCi0vLwkJCWV4cGVjdGVkID0gIi4uLy4uL2RpcjMvZGlyNC9mcm9tLmh0bWwiOwotLy8JCQlyZXQgPSBVdGlscy5nZXRSZWxhdGl2ZVBhdGgoZnJvbSwgdGFyZ2V0KTsKLS8vCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXQpOwotLy8KLS8vCQkJdHJ5IHsKLS8vCQkJCXRhcmdldCA9IG5ldyBVUkwoImh0dHAiLCAid3d3Lm50dC5jby5qcCIsICJkaXIxL2RpcjIvdGFyZ2V0Lmh0bWwiKTsKLS8vCQkJCWZyb20gPSBuZXcgVVJMKCJodHRwIiwgInd3dy5pYm0uY29tIiwgImRpcjEvZGlyMy9kaXI0L2Zyb20uaHRtbCIpOwotLy8JCQkJcmV0ID0gVXRpbHMuZ2V0UmVsYXRpdmVQYXRoKHRhcmdldCwgZnJvbSk7Ci0vLwkJCQlmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbXVzdCBiZSB0aHJvd24iKTsKLS8vCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLS8vCi0vLwkJCX0KLS8vCQkJdHJ5IHsKLS8vCQkJCXRhcmdldCA9IG5ldyBVUkwoImZpbGUiLCBudWxsLCAiZGlyMi90YXJnZXQuaHRtbCIpOwotLy8JCQkJZnJvbSA9IG5ldyBVUkwoImh0dHAiLCAid3d3Lm50dC5jby5qcCIsICJkaXIxL2RpcjMvZGlyNC9mcm9tLmh0bWwiKTsKLS8vCQkJCXJldCA9IFV0aWxzLmdldFJlbGF0aXZlUGF0aCh0YXJnZXQsIGZyb20pOwotLy8JCQkJZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIG11c3QgYmUgdGhyb3duIik7Ci0vLwkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0vLwotLy8JCQl9Ci0vLwkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLS8vCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCi0vLwkJfQotLy8KLS8vCX0KLS8vCi0vLwkvKioKLS8vCSAqIFRlc3QgbWV0aG9kIGZvciB7QGxpbmsgVXRpbHMjcmVwbGFjZUFsbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKX0uCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlQWxsKCkgewotLy8JCVN0cmluZyBzdCA9ICJ0ZXJlL2VlcmVyZS8vdHkvZCI7Ci0vLwkJU3RyaW5nIGV4cGVjdGVkID0gInRlcmVcXGVlcmVyZVxcXFx0eVxcZCI7Ci0vLwkJU3RyaW5nIG9sZFN0ID0gIi8iOwotLy8JCVN0cmluZyBuZXdTdCA9ICJcXCI7Ci0vLwkJU3RyaW5nIHJldCA9IFV0aWxzLnJlcGxhY2VBbGwoc3QsIG9sZFN0LCBuZXdTdCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXQpOwotLy8JfQotLy8KLS8vCS8qKgotLy8JICogVGVzdCBtZXRob2QgZm9yIHtAbGluayBVdGlscyNnZXRUb2tlbnMoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZyl9LgotLy8JICovCi0vLwlwdWJsaWMgdm9pZCB0ZXN0R2V0VG9rZW5zKCkgewotLy8JCVN0cmluZyBzdCA9ICIvQUFBQS9CQi8vQ0MvRC8iOwotLy8JCVN0cmluZ1tdIGV4cGVjdGVkID0geyJBQUFBIiwgIkJCIiwgIkNDIiwgIkQifTsKLS8vCQlTdHJpbmcgZGVsaW0gPSAiLyI7Ci0vLwkJU3RyaW5nW10gcmV0ID0gVXRpbHMuZ2V0VG9rZW5zKHN0LCBkZWxpbSk7Ci0vLwkJYXNzZXJ0RXF1YWxzKCJsZW5ndGhzIG11c3QgZXF1YWwuIiwgcmV0Lmxlbmd0aCwgZXhwZWN0ZWQubGVuZ3RoKTsKLS8vCQlmb3IgKGludCBpID0gMDsgaSA8IHJldC5sZW5ndGg7IGkrKykKLS8vCQkJYXNzZXJ0RXF1YWxzKCJlYWNoIGVsZW1lbnRzIG11c3QgZXF1YWwuIiwgZXhwZWN0ZWRbaV0sIHJldFtpXSk7Ci0vLwl9Ci0vLwotLy8JLyoqCi0vLwkgKiBUZXN0IG1ldGhvZCBmb3Ige0BsaW5rIFV0aWxzI3JlbW92ZUxhc3RDaChTdHJpbmcgdGFyZ2V0LCBjaGFyIGNoKX0uCi0vLwkgKi8KLS8vCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVMYXN0Q2goKSB7Ci0vLwkJU3RyaW5nIHRhcmdldCA9ICJkZGRkYWFhYWFhYWEiOwotLy8JCVN0cmluZyBleHBlY3RlZCA9ICJkZGRkIjsKLS8vCQljaGFyIGNoID0gJ2EnOwotLy8JCVN0cmluZyByZXQgPSBVdGlscy5yZW1vdmVMYXN0Q2godGFyZ2V0LCBjaCk7Ci0vLwkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByZXQpOwotLy8JfQotLy99CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2RlYjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjElRm91bmRhdGlvbi0xLjEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDg3MjExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW48L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NzM1MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0jTW9uIE9jdCAyMiAxMzoxNzoyOCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgzYjk1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNTdW4gU2VwIDIzIDExOjU3OjI2IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcy8+Ci1zcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLXNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzdhYTg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnBsdWdpbmNvbnZlcnNpb247dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gb3JnLm9zZ2kuc2VydmljZS5zdGFydGxldmVsO3ZlcnNpb249IjEuMC4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4udXRpbHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94IiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5wZGUucDIudWksb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQsCi0gQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLnV0aWxzLkFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzc3YjljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA5N2RkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggRnJhbWV3b3JrIEFkbWluCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL3V0aWxzL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL3V0aWxzL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzNiZGNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi91dGlscy9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4udXRpbHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucGx1Z2luY29udmVyc2lvbi5QbHVnaW5Db252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVuZGxlQ29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVuZGxlQ29udGV4dCA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBBY3F1aXJlIHRoZSBwbHVnLWluIGNvbnZlcnNpb24gc2VydmljZSBvciByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYgaXQgaXMgbm90IGF2YWlsYWJsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFBsdWdpbkNvbnZlcnRlciBhY3F1aXJlUGx1Z2luQ29udmVydGVyKCkgewotCQlpZiAoYnVuZGxlQ29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gYnVuZGxlQ29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKFBsdWdpbkNvbnZlcnRlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAocmVmZXJlbmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJUGx1Z2luQ29udmVydGVyIHJlc3VsdCA9IChQbHVnaW5Db252ZXJ0ZXIpIGJ1bmRsZUNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQlidW5kbGVDb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL3V0aWxzL1NpbXBsZUJ1bmRsZXNTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL2ZyYW1ld29ya2FkbWluL3V0aWxzL1NpbXBsZUJ1bmRsZXNTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGY0ZjQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi91dGlscy9TaW1wbGVCdW5kbGVzU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7Ci0KLS8qKgotICogVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBCdW5kbGVzU3RhdGUgZG9lc24ndCBzdXBwb3J0IGFueSBvZgotICogLSByZXNvbHZpbmcgYnVuZGxlcywKLSAqIC0gcmV0cmlldmluZyBmdyBwZXJzaXN0ZW50IGRhdGEuIAotICogCi0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGNhbiBiZSB1c2VkIGZvciB0aG9zZSBjYXNlcy4KLSAqCi0gKi8KLQotcHVibGljIGNsYXNzIFNpbXBsZUJ1bmRsZXNTdGF0ZSBpbXBsZW1lbnRzIEJ1bmRsZXNTdGF0ZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBCdW5kbGVJbmZvW10gTlVMTF9CVU5ETEVJTkZPUyA9IG5ldyBCdW5kbGVJbmZvWzBdOwotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBGcmFtZXdvcmtBZG1pbiBpcyBhdmFpbGFibGUuCi0JICogCi0JICogQHBhcmFtIGZ3QWRtaW4KLQkgKiBAdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0F2YWlsYWJpbGl0eShGcmFtZXdvcmtBZG1pbiBmd0FkbWluKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJaWYgKCFmd0FkbWluLmlzQWN0aXZlKCkpCi0JCQl0aHJvdyBuZXcgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uKCJGcmFtZXdvcmtBZG1pbiBjcmVhdGVzIHRoaXMgb2JqZWN0IGlzIG5vIG1vcmUgYXZhaWxhYmxlLiIsIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbi5GUkFNRVdPUktBRE1JTl9VTkFWQUlMQUJMRSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqIEBwYXJhbSBsYXVuY2hlckRhdGEKLQkgKiBAcmV0dXJuIEZpbGUgb2YgZndKYXIgdG8gYmUgdXNlZC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIAotCSAqLwotCXN0YXRpYyBGaWxlIGdldEZ3SmFyKExhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEpIHsKLQkJaWYgKGxhdW5jaGVyRGF0YS5nZXRGd0phcigpICE9IG51bGwpCi0JCQlyZXR1cm4gbGF1bmNoZXJEYXRhLmdldEZ3SmFyKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHN5c3RlbUJ1bmRsZVN5bWJvbGljTmFtZTsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHN5c3RlbUJ1bmRsZU5hbWU7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzeXN0ZW1CdW5kbGVWZW5kb3I7Ci0JTGlzdCBidW5kbGVJbmZvc0xpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0JRnJhbWV3b3JrQWRtaW4gZndBZG1pbiA9IG51bGw7Ci0KLQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IG51bGw7Ci0KLQkvKioKLQkgKiBJZiB0aGUgbWFuaWZlc3Qgb2YgdGhlIHRhcmdldCBmdyBpbXBsZW1lbnRhdGlvbiBoYXMgQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUgaGVhZGVyLAotCSAqIHRoaXMgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQuIAotCSAqIAotCSAqIEBwYXJhbSBNYW5pcHVsYXRvckFkbWluCi0JICogQHBhcmFtIE1hbmlwdWxhdG9yCi0JICogQHBhcmFtIHN5c3RlbUJ1bmRsZVN5bWJvbGljTmFtZQotCSAqLwotCXB1YmxpYyBTaW1wbGVCdW5kbGVzU3RhdGUoRnJhbWV3b3JrQWRtaW4gTWFuaXB1bGF0b3JBZG1pbiwgTWFuaXB1bGF0b3IgTWFuaXB1bGF0b3IsIFN0cmluZyBzeXN0ZW1CdW5kbGVTeW1ib2xpY05hbWUpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5md0FkbWluID0gTWFuaXB1bGF0b3JBZG1pbjsKLQkJLy8JCSBjb3B5IE1hbmlwdWxhdG9yIG9iamVjdCBmb3IgYXZvaWRpbmcgbW9kaWZ5aW5nIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBNYW5pcHVsYXRvci4KLQkJdGhpcy5tYW5pcHVsYXRvciA9IE1hbmlwdWxhdG9yQWRtaW4uZ2V0TWFuaXB1bGF0b3IoKTsKLQkJdGhpcy5tYW5pcHVsYXRvci5zZXRDb25maWdEYXRhKE1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKSk7Ci0JCXRoaXMubWFuaXB1bGF0b3Iuc2V0TGF1bmNoZXJEYXRhKE1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpKTsKLQkJdGhpcy5zeXN0ZW1CdW5kbGVTeW1ib2xpY05hbWUgPSBzeXN0ZW1CdW5kbGVTeW1ib2xpY05hbWU7Ci0JCXRoaXMuc3lzdGVtQnVuZGxlTmFtZSA9IG51bGw7Ci0JCXRoaXMuc3lzdGVtQnVuZGxlVmVuZG9yID0gbnVsbDsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBtYW5pZmVzdCBvZiB0aGUgdGFyZ2V0IGZ3IGltcGxlbWVudGF0aW9uIGhhcyBub3QgQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUgaGVhZGVyCi0JICogYnV0ICwgQ29uc3RhbnRzLkJVTkRMRV9OQU1FIGFuZCBCVU5ETEVfVkVSU0lPTiwgCi0JICogdGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZC4gCi0JICogCi0JICogQHBhcmFtIE1hbmlwdWxhdG9yQWRtaW4KLQkgKiBAcGFyYW0gTWFuaXB1bGF0b3IKLQkgKiBAcGFyYW0gc3lzdGVtQnVuZGxlTmFtZQotCSAqIEBwYXJhbSBzeXN0ZW1CdW5kbGVWZW5kZXIKLQkgKi8KLQlwdWJsaWMgU2ltcGxlQnVuZGxlc1N0YXRlKEZyYW1ld29ya0FkbWluIE1hbmlwdWxhdG9yQWRtaW4sIE1hbmlwdWxhdG9yIE1hbmlwdWxhdG9yLCBTdHJpbmcgc3lzdGVtQnVuZGxlTmFtZSwgU3RyaW5nIHN5c3RlbUJ1bmRsZVZlbmRlcikgewotCQlzdXBlcigpOwotCQl0aGlzLmZ3QWRtaW4gPSBNYW5pcHVsYXRvckFkbWluOwotCQkvLwkJIGNvcHkgTWFuaXB1bGF0b3Igb2JqZWN0IGZvciBhdm9pZGluZyBtb2RpZnlpbmcgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIE1hbmlwdWxhdG9yLgotCQl0aGlzLm1hbmlwdWxhdG9yID0gTWFuaXB1bGF0b3JBZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCQl0aGlzLm1hbmlwdWxhdG9yLnNldENvbmZpZ0RhdGEoTWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpKTsKLQkJdGhpcy5tYW5pcHVsYXRvci5zZXRMYXVuY2hlckRhdGEoTWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkpOwotCQl0aGlzLnN5c3RlbUJ1bmRsZVN5bWJvbGljTmFtZSA9IG51bGw7Ci0JCXRoaXMuc3lzdGVtQnVuZGxlTmFtZSA9IHN5c3RlbUJ1bmRsZU5hbWU7Ci0JCXRoaXMuc3lzdGVtQnVuZGxlVmVuZG9yID0gc3lzdGVtQnVuZGxlVmVuZGVyOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIEJ1bmRsZUluZm9bXSBnZXRFeHBlY3RlZFN0YXRlKCkgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCWlmICghZndBZG1pbi5pc0FjdGl2ZSgpKQotCQkJdGhyb3cgbmV3IEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbigiRnJhbWV3b3JrQWRtaW4gY3JlYXRlcyB0aGlzIG9iamVjdCBpcyBubyBtb3JlIGF2YWlsYWJsZS4iLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24uRlJBTUVXT1JLQURNSU5fVU5BVkFJTEFCTEUpOwotCQlyZXR1cm4gVXRpbHMuZ2V0QnVuZGxlSW5mb3NGcm9tTGlzdCh0aGlzLmJ1bmRsZUluZm9zTGlzdCk7Ci0JfQotCi0JLyogCi0JICogSnVzdCByZXR1cm4gcmVxdWlyZWQgYnVuZGxlcy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uQnVuZGxlc1N0YXRlI2dldFByZXJlcXVpc3RlQnVuZGxlcyhvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm8pCi0JICovCi0JcHVibGljIEJ1bmRsZUluZm9bXSBnZXRQcmVyZXF1aXN0ZUJ1bmRsZXMoQnVuZGxlSW5mbyBiSW5mbykgewotCQlTdHJpbmcgbG9jYXRpb24gPSBiSW5mby5nZXRMb2NhdGlvbigpOwotCQlmaW5hbCBTdHJpbmcgcmVxdWlyZWRCdW5kbGVzID0gVXRpbHMuZ2V0TWFuaWZlc3RNYWluQXR0cmlidXRlcyhsb2NhdGlvbiwgQ29uc3RhbnRzLlJFUVVJUkVfQlVORExFKTsKLQkJaWYgKHJlcXVpcmVkQnVuZGxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBCdW5kbGVJbmZvW10ge3RoaXMuZ2V0U3lzdGVtQnVuZGxlKCl9OwotCi0JCVN0cmluZ1tdIGNsYXVzZXMgPSBVdGlscy5nZXRDbGF1c2VzKHJlcXVpcmVkQnVuZGxlcyk7Ci0JCUxpc3QgbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2xhdXNlcy5sZW5ndGg7IGkrKykKLQkJCWxpc3QuYWRkKFV0aWxzLmdldFBhdGhGcm9tQ2xhdXNlKGNsYXVzZXNbaV0pKTsKLQotCQlMaXN0IHJldCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCXJldC5hZGQodGhpcy5nZXRTeXN0ZW1CdW5kbGUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlID0gdGhpcy5idW5kbGVJbmZvc0xpc3QuaXRlcmF0b3IoKTsgaXRlLmhhc05leHQoKTspIHsKLQkJCUJ1bmRsZUluZm8gY3VycmVudEJJbmZvID0gKEJ1bmRsZUluZm8pIGl0ZS5uZXh0KCk7Ci0JCQlTdHJpbmcgY3VycmVudExvY2F0aW9uID0gY3VycmVudEJJbmZvLmdldExvY2F0aW9uKCk7Ci0JCQlTdHJpbmcgY3VycmVudFN5bWJvbGljTmFtZSA9IFV0aWxzLmdldE1hbmlmZXN0TWFpbkF0dHJpYnV0ZXMoY3VycmVudExvY2F0aW9uLCBDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSk7Ci0JCQlpZiAoY3VycmVudFN5bWJvbGljTmFtZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJY3VycmVudFN5bWJvbGljTmFtZSA9IFV0aWxzLmdldFBhdGhGcm9tQ2xhdXNlKGN1cnJlbnRTeW1ib2xpY05hbWUpOwotCQkJZm9yIChJdGVyYXRvciBpdGUyID0gbGlzdC5pdGVyYXRvcigpOyBpdGUyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gKFN0cmluZykgaXRlMi5uZXh0KCk7Ci0JCQkJaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoY3VycmVudFN5bWJvbGljTmFtZSkpIHsKLQkJCQkJcmV0LmFkZChjdXJyZW50QkluZm8pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFV0aWxzLmdldEJ1bmRsZUluZm9zRnJvbUxpc3QocmV0KTsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mbyBnZXRTeXN0ZW1CdW5kbGUoKSB7Ci0JCWlmICh0aGlzLnN5c3RlbUJ1bmRsZVN5bWJvbGljTmFtZSA9PSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZSA9IHRoaXMuYnVuZGxlSW5mb3NMaXN0Lml0ZXJhdG9yKCk7IGl0ZS5oYXNOZXh0KCk7KSB7Ci0JCQkJQnVuZGxlSW5mbyBiSW5mbyA9IChCdW5kbGVJbmZvKSBpdGUubmV4dCgpOwotCQkJCS8vCQkJaWYgKGJJbmZvLmdldFN0YXJ0TGV2ZWwoKSAhPSAxKQotCQkJCS8vCQkJCXJldHVybiBudWxsOzsKLQkJCQlTdHJpbmcgbG9jYXRpb24gPSBiSW5mby5nZXRMb2NhdGlvbigpOwotCQkJCVN0cmluZyBidW5kbGVOYW1lID0gVXRpbHMuZ2V0TWFuaWZlc3RNYWluQXR0cmlidXRlcyhsb2NhdGlvbiwgQ29uc3RhbnRzLkJVTkRMRV9OQU1FKTsKLQkJCQlpZiAoc3lzdGVtQnVuZGxlTmFtZS5lcXVhbHMoYnVuZGxlTmFtZSkpIHsKLQkJCQkJU3RyaW5nIGJ1bmRsZVZlbmRvciA9IFV0aWxzLmdldE1hbmlmZXN0TWFpbkF0dHJpYnV0ZXMobG9jYXRpb24sIENvbnN0YW50cy5CVU5ETEVfVkVORE9SKTsKLQkJCQkJaWYgKHN5c3RlbUJ1bmRsZVZlbmRvci5lcXVhbHMoYnVuZGxlVmVuZG9yKSkKLQkJCQkJCXJldHVybiBiSW5mbzsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZSA9IHRoaXMuYnVuZGxlSW5mb3NMaXN0Lml0ZXJhdG9yKCk7IGl0ZS5oYXNOZXh0KCk7KSB7Ci0JCQlCdW5kbGVJbmZvIGJJbmZvID0gKEJ1bmRsZUluZm8pIGl0ZS5uZXh0KCk7Ci0JCQlTdHJpbmcgbG9jYXRpb24gPSBiSW5mby5nZXRMb2NhdGlvbigpOwotCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IFV0aWxzLmdldE1hbmlmZXN0TWFpbkF0dHJpYnV0ZXMobG9jYXRpb24sIENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKTsKLQkJCXN5bWJvbGljTmFtZSA9IFV0aWxzLmdldFBhdGhGcm9tQ2xhdXNlKHN5bWJvbGljTmFtZSk7Ci0JCQlpZiAodGhpcy5zeXN0ZW1CdW5kbGVTeW1ib2xpY05hbWUuZXF1YWxzKHN5bWJvbGljTmFtZSkpCi0JCQkJcmV0dXJuIGJJbmZvOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvW10gZ2V0U3lzdGVtRnJhZ21lbnRlZEJ1bmRsZXMoKSB7Ci0JCUJ1bmRsZUluZm8gc3lzdGVtQkluZm8gPSB0aGlzLmdldFN5c3RlbUJ1bmRsZSgpOwotCQlpZiAoc3lzdGVtQkluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBOVUxMX0JVTkRMRUlORk9TOwotCi0JCUxpc3QgbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlID0gdGhpcy5idW5kbGVJbmZvc0xpc3QuaXRlcmF0b3IoKTsgaXRlLmhhc05leHQoKTspIHsKLQkJCUJ1bmRsZUluZm8gYkluZm8gPSAoQnVuZGxlSW5mbykgaXRlLm5leHQoKTsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGJJbmZvLmdldExvY2F0aW9uKCk7Ci0JCQlTdHJpbmcgbWFuaWZlc3RWZXJzaW9uID0gVXRpbHMuZ2V0TWFuaWZlc3RNYWluQXR0cmlidXRlcyhsb2NhdGlvbiwgQ29uc3RhbnRzLkJVTkRMRV9NQU5JRkVTVFZFUlNJT04pOwotCQkJaWYgKG1hbmlmZXN0VmVyc2lvbiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKG1hbmlmZXN0VmVyc2lvbi5lcXVhbHMoIjEiKSB8fCBtYW5pZmVzdFZlcnNpb24uZXF1YWxzKCIxLjAiKSkKLQkJCQljb250aW51ZTsKLQotCQkJU3RyaW5nIGZyYWdtZW50SG9zdCA9IFV0aWxzLmdldE1hbmlmZXN0TWFpbkF0dHJpYnV0ZXMobG9jYXRpb24sIENvbnN0YW50cy5GUkFHTUVOVF9IT1NUKTsKLQkJCWlmIChmcmFnbWVudEhvc3QgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWludCBpbmRleCA9IGZyYWdtZW50SG9zdC5pbmRleE9mKCI7Iik7Ci0JCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gZnJhZ21lbnRIb3N0LnN1YnN0cmluZygwLCBpbmRleCkudHJpbSgpOwotCQkJU3RyaW5nIHBhcmFtZXRlciA9IGZyYWdtZW50SG9zdC5zdWJzdHJpbmcoaW5kZXggKyAxKS50cmltKCk7Ci0JCQkvLyBUT0RPIFdoYXQgdG8gZG8gLGluIGNhc2Ugb2YgYWxpYXMgbmFtZSBvZiBzeXN0ZW0gYnVuZGxlIGlzIG5vdCB1c2VkID8KLQkJCWlmIChzeW1ib2xpY05hbWUuZXF1YWxzKENvbnN0YW50cy5TWVNURU1fQlVORExFX1NZTUJPTElDTkFNRSkpCi0JCQkJaWYgKHBhcmFtZXRlci5lcXVhbHMoQ29uc3RhbnRzLkVYVEVOU0lPTl9ESVJFQ1RJVkUgKyAiOj0iICsgQ29uc3RhbnRzLkVYVEVOU0lPTl9GUkFNRVdPUkspKSB7Ci0JCQkJCWxpc3QuYWRkKGxvY2F0aW9uKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBVdGlscy5nZXRCdW5kbGVJbmZvc0Zyb21MaXN0KGxpc3QpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRVbnNhdGlzZmllZENvbnN0cmFpbnRzKEJ1bmRsZUluZm8gYkluZm8pIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uKCJnZXRVbnNhdGlzZmllZENvbnN0cmFpbnRzKEJ1bmRsZUluZm8gYkluZm8pIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiIsIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbi5VTlNVUFBPUlRFRF9PUEVSQVRJT04pOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLmJ1bmRsZUluZm9zTGlzdC5jbGVhcigpOwotCQlMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCk7Ci0JCUNvbmZpZ0RhdGEgY29uZmlnRGF0YSA9IG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKTsKLQkJRmlsZSBmd0phciA9IGdldEZ3SmFyKGxhdW5jaGVyRGF0YSk7OwotCi0JCWlmIChmd0phciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibGF1bmNoZXJEYXRhLmdldExhdW5jaGVyQ29uZmlnRmlsZSgpID09IG51bGwgJiYgZndKYXIgaXMgbm90IHNldC4iKTsKLQkJLy8gTm8gZncgcGVyc2lzdGVudCBkYXRhIGxvY2F0aW9uIGlzIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4KLQotCQlCdW5kbGVJbmZvW10gYkluZm9zID0gY29uZmlnRGF0YS5nZXRCdW5kbGVzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgYkluZm9zLmxlbmd0aDsgaisrKQotCQkJdGhpcy5pbnN0YWxsQnVuZGxlKGJJbmZvc1tqXSk7Ci0KLQkJaWYgKGdldFN5c3RlbUJ1bmRsZSgpID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJQnVuZGxlSW5mbyBzeXNCSW5mbyA9IG5ldyBCdW5kbGVJbmZvKGxhdW5jaGVyRGF0YS5nZXRGd0phcigpLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSwgMCwgdHJ1ZSwgMCk7Ci0JCQkJdGhpcy5pbnN0YWxsQnVuZGxlKHN5c0JJbmZvKTsKLQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBOb3RoaWduIHRvIGRvIGJlY2F1c2UgbmV2ZXIgaGFwcGVucy4KLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zdGFsbEJ1bmRsZShCdW5kbGVJbmZvIGJJbmZvKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQotCQlTdHJpbmcgbmV3TG9jYXRpb24gPSBiSW5mby5nZXRMb2NhdGlvbigpOwotCQlEaWN0aW9uYXJ5IG5ld01hbmlmZXN0ID0gVXRpbHMuZ2V0T1NHaU1hbmlmZXN0KG5ld0xvY2F0aW9uKTsKLQkJaWYgKG5ld01hbmlmZXN0ID09IG51bGwpIHsKLQkJCS8vIFRPRE8gbG9nIHNvbWV0aGluZyBoZXJlCi0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIG5ld1N5bWJvbGljTmFtZSA9IChTdHJpbmcpIG5ld01hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSk7Ci0JCVN0cmluZyBuZXdWZXJzaW9uID0gKFN0cmluZykgbmV3TWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTik7Ci0JCS8vU3lzdGVtLm91dC5wcmludGxuKCI+IGN1cnJlbnRJbnN0YWxsZWRCdW5kbGVzLmxlbmd0aD0iICsgY3VycmVudEluc3RhbGxlZEJ1bmRsZXMubGVuZ3RoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZSA9IHRoaXMuYnVuZGxlSW5mb3NMaXN0Lml0ZXJhdG9yKCk7IGl0ZS5oYXNOZXh0KCk7KSB7Ci0JCQlCdW5kbGVJbmZvIGN1cnJlbnRCSW5mbyA9IChCdW5kbGVJbmZvKSBpdGUubmV4dCgpOwotCQkJU3RyaW5nIGxvY2F0aW9uID0gY3VycmVudEJJbmZvLmdldExvY2F0aW9uKCk7Ci0JCQlpZiAobmV3TG9jYXRpb24uZXF1YWxzKGxvY2F0aW9uKSkgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCURpY3Rpb25hcnkgbWFuaWZlc3QgPSBVdGlscy5nZXRPU0dpTWFuaWZlc3QobG9jYXRpb24pOwotCQkJU3RyaW5nIHN5bWJvbGljTmFtZSA9IChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSk7Ci0JCQlTdHJpbmcgdmVyc2lvbiA9IChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pOwotCQkJaWYgKG5ld1N5bWJvbGljTmFtZSAhPSBudWxsICYmIG5ld1ZlcnNpb24gIT0gbnVsbCkKLQkJCQlpZiAobmV3U3ltYm9saWNOYW1lLmVxdWFscyhzeW1ib2xpY05hbWUpICYmIG5ld1ZlcnNpb24uZXF1YWxzKHZlcnNpb24pKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQl9Ci0JCWlmICghZm91bmQpIHsKLQkJCXRoaXMuYnVuZGxlSW5mb3NMaXN0LmFkZChiSW5mbyk7Ci0JCX0KLQl9Ci0KLQkvLwlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCS8vCQlpZiAoc3RhdGUgPT0gbnVsbCkKLQkvLwkJCXJldHVybiBudWxsOwotCS8vCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8JCUJ1bmRsZURlc2NyaXB0aW9uW10gYnVuZGxlRGVzY3JpcHRpb25zID0gc3RhdGUuZ2V0QnVuZGxlcygpOwotCS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZURlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykgewotCS8vCQkJc2IuYXBwZW5kKGJ1bmRsZURlc2NyaXB0aW9uc1tpXS5nZXRCdW5kbGVJZCgpICsgIjoiKTsKLQkvLwkJCXNiLmFwcGVuZChidW5kbGVEZXNjcmlwdGlvbnNbaV0udG9TdHJpbmcoKSArICIoIik7Ci0JLy8JCQlzYi5hcHBlbmQoYnVuZGxlRGVzY3JpcHRpb25zW2ldLmlzUmVzb2x2ZWQoKSArICIpIik7Ci0JLy8JCQlTdHJpbmdbXSBlZXMgPSBidW5kbGVEZXNjcmlwdGlvbnNbaV0uZ2V0RXhlY3V0aW9uRW52aXJvbm1lbnRzKCk7Ci0JLy8JCQlmb3IgKGludCBqID0gMDsgaiA8IGVlcy5sZW5ndGg7IGorKykKLQkvLwkJCQlzYi5hcHBlbmQoZWVzW2pdICsgIiAiKTsKLQkvLwkJCXNiLmFwcGVuZCgiXG4iKTsKLQkvLwkJfQotCS8vCQlzYi5hcHBlbmQoIlBsYXRmb3JtUHJvcGVydGllczpcbiIpOwotCS8vCQlEaWN0aW9uYXJ5W10gZGljcyA9IHN0YXRlLmdldFBsYXRmb3JtUHJvcGVydGllcygpOwotCS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGRpY3MubGVuZ3RoOyBpKyspIHsKLQkvLwkJCWZvciAoRW51bWVyYXRpb24gZW51bSA9IGRpY3NbaV0ua2V5cygpOyBlbnVtLmhhc01vcmVFbGVtZW50cygpOykgewotCS8vCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtLm5leHRFbGVtZW50KCk7Ci0JLy8JCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZGljc1tpXS5nZXQoa2V5KTsKLQkvLwkJCQlzYi5hcHBlbmQoIiAoIiArIGtleSArICIsIiArIHZhbHVlICsgIilcbiIpOwotCS8vCQkJfQotCS8vCQl9Ci0JLy8JCXNiLmFwcGVuZCgiXG4iKTsKLQkvLwkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JLy8JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGdWxseVN1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbigiaXNSZXNvbHZlZCgpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiIsIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbi5VTlNVUFBPUlRFRF9PUEVSQVRJT04pOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoQnVuZGxlSW5mbyBiSW5mbykgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24oImlzUmVzb2x2ZWQoQnVuZGxlSW5mbyBiSW5mbykgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGltcGxlbWVudGF0aW9uIiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLlVOU1VQUE9SVEVEX09QRVJBVElPTik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZShib29sZWFuIGluY3JlbWVudCkgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24oInJlc29sdmUoYm9vbGVhbiBpbmNyZW1lbnQpIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiIsIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbi5VTlNVUFBPUlRFRF9PUEVSQVRJT04pOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbEJ1bmRsZShCdW5kbGVJbmZvIGJJbmZvKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRhcmdldExvY2F0aW9uID0gYkluZm8uZ2V0TG9jYXRpb24oKTsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvciAoSXRlcmF0b3IgaXRlID0gdGhpcy5idW5kbGVJbmZvc0xpc3QuaXRlcmF0b3IoKTsgaXRlLmhhc05leHQoKTspIHsKLQkJCWluZGV4Kys7Ci0JCQlCdW5kbGVJbmZvIGN1cnJlbnRCSW5mbyA9IChCdW5kbGVJbmZvKSBpdGUubmV4dCgpOwotCQkJU3RyaW5nIGxvY2F0aW9uID0gY3VycmVudEJJbmZvLmdldExvY2F0aW9uKCk7Ci0JCQlpZiAodGFyZ2V0TG9jYXRpb24uZXF1YWxzKGxvY2F0aW9uKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChpbmRleCAhPSAtMSkKLQkJCXRoaXMuYnVuZGxlSW5mb3NMaXN0LnJlbW92ZShpbmRleCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvZnJhbWV3b3JrYWRtaW4vdXRpbHMvVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi91dGlscy9VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWU4MzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9mcmFtZXdvcmthZG1pbi91dGlscy9VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5CdW5kbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5wbHVnaW5jb252ZXJzaW9uLlBsdWdpbkNvbnZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnBsdWdpbmNvbnZlcnNpb24uUGx1Z2luQ29udmVydGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBVdGlscyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEhfU0VQID0gIi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFlfU1RSSU5HX0FSUkFZID0gbmV3IFN0cmluZ1tdIHt9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGU6IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX01BTklGRVNUID0gImZlYXR1cmUueG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVF9NQU5JRkVTVCA9ICJmcmFnbWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9NQU5JRkVTVCA9ICJwbHVnaW4ueG1sIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogT3ZlcndyaXRlIGFsbCBwcm9wZXJ0aWVzIG9mIGZyb20gdG8gdGhlIHByb3BlcnRpZXMgb2YgdG8uIFJldHVybiB0aGUgcmVzdWx0IG9mIHRvLgotCSAqIAotCSAqIEBwYXJhbSB0byBQcm9wZXJ0aWVzIHdob3NlIGtleXMgYW5kIHZhbHVlcyBvZiBvdGhlciBQcm9wZXJ0aWVzIHdpbGwgYmUgYXBwZW5kZWQgdG8uCi0JICogQHBhcmFtIGZyb20gUHJvcGVydGllcyB3aG9zZSBrZXlzIGFuZCB2YWx1ZXMgd2lsbCBiZSBzZXQgdG8gdGhlIG90aGVyIHByb3BlcnRpZXMuCi0JICogQHJldHVybiBQcm9wZXJ0aWVzIGFzIGEgcmVzdWx0IG9mIHRoaXMgbWV0aG9kLiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BlcnRpZXMgYXBwZW5kUHJvcGVydGllcyhQcm9wZXJ0aWVzIHRvLCBQcm9wZXJ0aWVzIGZyb20pIHsKLQkJaWYgKGZyb20gIT0gbnVsbCkgewotCQkJaWYgKHRvID09IG51bGwpCi0JCQkJdG8gPSBuZXcgUHJvcGVydGllcygpOwotCQkJLy8JCQlwcmludG91dFByb3BlcnRpZXMoU3lzdGVtLm91dCwgInRvIiwgdG8pOwotCQkJLy8JCQlwcmludG91dFByb3BlcnRpZXMoU3lzdGVtLm91dCwgImZyb20iLCBmcm9tKTsKLQotCQkJZm9yIChFbnVtZXJhdGlvbiBlbnVtZXJhdGlvbiA9IGZyb20ua2V5cygpOyBlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKLQkJCQl0by5zZXRQcm9wZXJ0eShrZXksIGZyb20uZ2V0UHJvcGVydHkoa2V5KSk7Ci0JCQl9Ci0JCX0KLQkJLy8JCXByaW50b3V0UHJvcGVydGllcyhTeXN0ZW0ub3V0LCAidG8iLCB0byk7Ci0JCXJldHVybiB0bzsKLQl9Ci0KLQkvL1JldHVybiBhIGRpY3Rpb25hcnkgcmVwcmVzZW50aW5nIGEgbWFuaWZlc3QuIFRoZSBkYXRhIG1heSByZXN1bHQgZnJvbSBwbHVnaW4ueG1sIGNvbnZlcnNpb24gIAotCXByaXZhdGUgc3RhdGljIERpY3Rpb25hcnkgYmFzaWNMb2FkTWFuaWZlc3QoRmlsZSBidW5kbGVMb2NhdGlvbikgewotCQlJbnB1dFN0cmVhbSBtYW5pZmVzdFN0cmVhbSA9IG51bGw7Ci0JCVppcEZpbGUgamFyRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBmaWxlRXh0ZW50aW9uID0gYnVuZGxlTG9jYXRpb24uZ2V0TmFtZSgpOwotCQkJCWZpbGVFeHRlbnRpb24gPSBmaWxlRXh0ZW50aW9uLnN1YnN0cmluZyhmaWxlRXh0ZW50aW9uLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJCQkvLyBIYW5kbGUgYSBKQVInZCBidW5kbGUKLQkJCQlpZiAoImphciIuZXF1YWxzSWdub3JlQ2FzZShmaWxlRXh0ZW50aW9uKSAmJiBidW5kbGVMb2NhdGlvbi5pc0ZpbGUoKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWphckZpbGUgPSBuZXcgWmlwRmlsZShidW5kbGVMb2NhdGlvbiwgWmlwRmlsZS5PUEVOX1JFQUQpOwotCQkJCQlaaXBFbnRyeSBtYW5pZmVzdEVudHJ5ID0gamFyRmlsZS5nZXRFbnRyeShKYXJGaWxlLk1BTklGRVNUX05BTUUpOwotCQkJCQlpZiAobWFuaWZlc3RFbnRyeSAhPSBudWxsKSB7Ci0JCQkJCQltYW5pZmVzdFN0cmVhbSA9IGphckZpbGUuZ2V0SW5wdXRTdHJlYW0obWFuaWZlc3RFbnRyeSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQkvLyB3ZSBoYXZlIGEgZGlyZWN0b3J5LWJhc2VkIGJ1bmRsZQotCQkJCQlGaWxlIGJ1bmRsZU1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBKYXJGaWxlLk1BTklGRVNUX05BTUUpOwotCQkJCQlpZiAoYnVuZGxlTWFuaWZlc3RGaWxlLmV4aXN0cygpKQotCQkJCQkJbWFuaWZlc3RTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBKYXJGaWxlLk1BTklGRVNUX05BTUUpKSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlCi0JCQl9Ci0JCQkvLyB3ZSB3ZXJlIHVuYWJsZSB0byBnZXQgYW4gT1NHaSBtYW5pZmVzdCBmaWxlIHNvIHRyeSBhbmQgY29udmVydCBhbiBvbGQtc3R5bGUgbWFuaWZlc3QKLQkJCWlmIChtYW5pZmVzdFN0cmVhbSA9PSBudWxsKQotCQkJCXJldHVybiBjb252ZXJ0UGx1Z2luTWFuaWZlc3QoYnVuZGxlTG9jYXRpb24sIHRydWUpOwotCi0JCQkvLyBJdCBpcyBub3QgYSBtYW5pZmVzdCwgYnV0IGEgcGx1Z2luIG9yIGEgZnJhZ21lbnQKLQkJCXRyeSB7Ci0JCQkJTWFuaWZlc3QgbSA9IG5ldyBNYW5pZmVzdChtYW5pZmVzdFN0cmVhbSk7Ci0JCQkJRGljdGlvbmFyeSBtYW5pZmVzdCA9IG1hbmlmZXN0VG9Qcm9wZXJ0aWVzKG0uZ2V0TWFpbkF0dHJpYnV0ZXMoKSk7Ci0JCQkJLy8gYWRkIHRoaXMgY2hlY2sgdG8gaGFuZGxlIHRoZSBjYXNlIHdlcmUgd2UgcmVhZCBhIG5vbi1PU0dpIG1hbmlmZXN0Ci0JCQkJaWYgKG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGNvbnZlcnRQbHVnaW5NYW5pZmVzdChidW5kbGVMb2NhdGlvbiwgdHJ1ZSk7Ci0JCQkJcmV0dXJuIG1hbmlmZXN0OwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChtYW5pZmVzdFN0cmVhbSAhPSBudWxsKQotCQkJCQltYW5pZmVzdFN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkvL0lnbm9yZQotCQkJfQotCQkJdHJ5IHsKLQkJCQlpZiAoamFyRmlsZSAhPSBudWxsKQotCQkJCQlqYXJGaWxlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMikgewotCQkJCS8vSWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tBYnNvbHV0ZURpcihGaWxlIGZpbGUsIFN0cmluZyBkaXJOYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZGlyTmFtZSArICIgaXMgbnVsbCIpOwotCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihkaXJOYW1lICsgIiBpcyBub3QgYWJzb2x1dGUgcGF0aC4gZmlsZT0iICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWlmICghZmlsZS5pc0RpcmVjdG9yeSgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihkaXJOYW1lICsgIiBpcyBub3QgZGlyZWN0b3J5LiBmaWxlPSIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tBYnNvbHV0ZUZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgZGlyTmFtZSkgey8vdGhyb3dzIE1hbmlwdWxhdG9yRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZGlyTmFtZSArICIgaXMgbnVsbCIpOwotCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihkaXJOYW1lICsgIiBpcyBub3QgYWJzb2x1dGUgcGF0aC4gZmlsZT0iICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGRpck5hbWUgKyAiIGlzIG5vdCBmaWxlIGJ1dCBkaXJlY3RvcnkiKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSTCBjaGVja0Z1bGxVcmwoVVJMIHVybCwgU3RyaW5nIHVybE5hbWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gey8vdGhyb3dzIE1hbmlwdWxhdG9yRXhjZXB0aW9uIHsKLQkJaWYgKHVybCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih1cmxOYW1lICsgIiBpcyBudWxsIik7Ci0JCWlmICghdXJsLmdldFByb3RvY29sKCkuZW5kc1dpdGgoImZpbGUiKSkKLQkJCXJldHVybiB1cmw7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih1cmxOYW1lICsgIigiICsgdXJsICsgIikgZG9lcyBub3QgaGF2ZSBhYnNvbHV0ZSBwYXRoIik7Ci0JCWlmIChmaWxlLmdldEFic29sdXRlUGF0aCgpLnN0YXJ0c1dpdGgoUEFUSF9TRVApKQotCQkJcmV0dXJuIHVybDsKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRVcmwoImZpbGUiLCBudWxsLCBQQVRIX1NFUCArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih1cmxOYW1lICsgIigiICsgImZpbGU6IiArIFBBVEhfU0VQICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIpIGlzIG5vdCBmdWxseSBxdWFsbGlmaWVkIik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUGFyZW50RGlyKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBwYXJlbnQgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlwYXJlbnQubWtkaXJzKCk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyB0aGUgZ2l2ZW4gZmlsZSByZWN1cnNpdmVseSwgYWRkaW5nIGZhaWx1cmUgaW5mbyB0bwotCSAqIHRoZSBwcm92aWRlZCBzdGF0dXMgb2JqZWN0LiAgVGhlIGZpbGVQYXRoIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlcgotCSAqIHRvIG9wdGltaXplIGphdmEuaW8uRmlsZSBvYmplY3QgY3JlYXRpb24uCi0JICovCi0JLy8gSW1wbGVtZW50YXRpb24gdGFrZW4gZnJvbSB0aGUgRWNsaXBzZSBGaWxlIHN5dGVtIGJ1bmRsZSBjbGFzcyBMb2NhbEZpbGUuCi0JLy8gIFRPRE8gY29uc2lkZXIgcHV0dGluZyBiYWNrIHRoZSBwcm9ncmVzcyBhbmQgY2FuY2VsYXRpb24gc3VwcG9ydC4KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGludGVybmFsRGVsZXRlKEZpbGUgdGFyZ2V0LCBTdHJpbmcgcGF0aFRvRGVsZXRlKSB7Ci0JCS8vZmlyc3QgdHJ5IHRvIGRlbGV0ZSAtIHRoaXMgc2hvdWxkIHN1Y2NlZWQgZm9yIGZpbGVzIGFuZCBzeW1ib2xpYyBsaW5rcyB0byBkaXJlY3RvcmllcwotCQlpZiAodGFyZ2V0LmRlbGV0ZSgpIHx8ICF0YXJnZXQuZXhpc3RzKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHRhcmdldC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlTdHJpbmdbXSBsaXN0ID0gdGFyZ2V0Lmxpc3QoKTsKLQkJCWlmIChsaXN0ID09IG51bGwpCi0JCQkJbGlzdCA9IEVNUFRZX1NUUklOR19BUlJBWTsKLQkJCWludCBwYXJlbnRMZW5ndGggPSBwYXRoVG9EZWxldGUubGVuZ3RoKCk7Ci0JCQlib29sZWFuIGZhaWxlZFJlY3Vyc2l2ZSA9IGZhbHNlOwotCQkJZm9yIChpbnQgaSA9IDAsIGltYXggPSBsaXN0Lmxlbmd0aDsgaSA8IGltYXg7IGkrKykgewotCQkJCS8vb3B0aW1pemVkIGNyZWF0aW9uIG9mIGNoaWxkIHBhdGggb2JqZWN0Ci0JCQkJU3RyaW5nQnVmZmVyIGNoaWxkQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihwYXJlbnRMZW5ndGggKyBsaXN0W2ldLmxlbmd0aCgpICsgMSk7Ci0JCQkJY2hpbGRCdWZmZXIuYXBwZW5kKHBhdGhUb0RlbGV0ZSk7Ci0JCQkJY2hpbGRCdWZmZXIuYXBwZW5kKEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0JCQkJY2hpbGRCdWZmZXIuYXBwZW5kKGxpc3RbaV0pOwotCQkJCVN0cmluZyBjaGlsZE5hbWUgPSBjaGlsZEJ1ZmZlci50b1N0cmluZygpOwotCQkJCS8vIHRyeSBiZXN0IGVmZm9ydCBvbiBhbGwgY2hpbGRyZW4gc28gcHV0IGxvZ2ljYWwgT1IgYXQgZW5kCi0JCQkJZmFpbGVkUmVjdXJzaXZlID0gIWludGVybmFsRGVsZXRlKG5ldyBqYXZhLmlvLkZpbGUoY2hpbGROYW1lKSwgY2hpbGROYW1lKSB8fCBmYWlsZWRSZWN1cnNpdmU7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCS8vIGRvbid0IHRyeSB0byBkZWxldGUgdGhlIHJvb3QgaWYgb25lIG9mIHRoZSBjaGlsZHJlbiBmYWlsZWQKLQkJCQlpZiAoIWZhaWxlZFJlY3Vyc2l2ZSAmJiB0YXJnZXQuZGVsZXRlKCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB3ZSBjYXVnaHQgYSBydW50aW1lIGV4Y2VwdGlvbiBzbyBsb2cgaXQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLy8JCW1lc3NhZ2UgPSBOTFMuYmluZChNZXNzYWdlcy5jb3VsZG5vdERlbGV0ZSwgdGFyZ2V0LmdldEFic29sdXRlUGF0aCgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVEaXIoRmlsZSB0YXJnZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludGVybmFsRGVsZXRlKHRhcmdldCwgdGFyZ2V0LmdldEFic29sdXRlUGF0aCgpKTsKLQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsIHRvIGRlbGV0ZSBEaXIoIiArIHRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSArICIpIik7Ci0JfQotCi0JLyoqCi0JICogRmlyc3QsIGl0IHJlcGxhY2VzIEZpbGUuc2VwZXJhdG9yIG9mIHJlbGF0aXZlUGF0aCB0byAiLyIuCi0JICogSWYgcmVsYXRpdmVQYXRoIGlzIGluIFVSTCBmb3JtYXQsIHJldHVybiBpdHMgVVJMLgotCSAqIE90aGVyd2lzZSwgY3JlYXRlIGFic29sdXRlIFVSTCBiYXNlZCBvbiB0aGUgYmFzZVVybC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVsYXRpdmVQYXRoCi0JICogQHBhcmFtIGJhc2VVcmwKLQkgKiBAcmV0dXJuIFVSTCAKLQkgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJMIGZvcm1hdFVybChTdHJpbmcgcmVsYXRpdmVQYXRoLCBVUkwgYmFzZVVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ly90aHJvd3MgTWFuaXB1bGF0b3JFeGNlcHRpb24gewotCQlyZWxhdGl2ZVBhdGggPSBVdGlscy5yZXBsYWNlQWxsKHJlbGF0aXZlUGF0aCwgRmlsZS5zZXBhcmF0b3IsICIvIik7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTChyZWxhdGl2ZVBhdGgpOwotCQkJaWYgKHVybC5nZXRQcm90b2NvbCgpLmVxdWFscygiZmlsZSIpKQotCQkJCWlmICghKG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpKS5pc0Fic29sdXRlKCkpCi0JCQkJCXVybCA9IGdldFVybEluRnVsbChyZWxhdGl2ZVBhdGgsIGJhc2VVcmwpOwotCQkJcmV0dXJuIHVybDsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBnZXRVcmxJbkZ1bGwocmVsYXRpdmVQYXRoLCBiYXNlVXJsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlSW5mb1tdIGdldEJ1bmRsZUluZm9zRnJvbUxpc3QoTGlzdCBsaXN0KSB7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEJ1bmRsZUluZm9bMF07Ci0JCUJ1bmRsZUluZm9bXSByZXQgPSBuZXcgQnVuZGxlSW5mb1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q2xhdXNlcyhTdHJpbmcgaGVhZGVyKSB7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbiA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaGVhZGVyLCAiLCIpOwotCQlMaXN0IGxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQl3aGlsZSAodG9rZW4uaGFzTW9yZVRva2VucygpKSB7Ci0JCQlsaXN0LmFkZCh0b2tlbi5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJU3RyaW5nW10gcmV0ID0gbmV3IFN0cmluZ1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q2xhdXNlc01hbmlmZXN0TWFpbkF0dHJpYnV0ZXMoU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0Q2xhdXNlcyhnZXRNYW5pZmVzdE1haW5BdHRyaWJ1dGVzKGxvY2F0aW9uLCBuYW1lKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWFuaWZlc3RNYWluQXR0cmlidXRlcyhTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBuYW1lKSB7Ci0JCURpY3Rpb25hcnkgbWFuaWZlc3QgPSBVdGlscy5nZXRPU0dpTWFuaWZlc3QobG9jYXRpb24pOwotCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gbG9jYXRlIGJ1bmRsZSBtYW5pZmVzdDogIiArIGxvY2F0aW9uKTsKLQkJcmV0dXJuIChTdHJpbmcpIG1hbmlmZXN0LmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERpY3Rpb25hcnkgZ2V0T1NHaU1hbmlmZXN0KFN0cmluZyBsb2NhdGlvbikgewotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBpZiB3ZSBoYXZlIGEgZmlsZS1iYXNlZCBVUkwgdGhhdCBkb2Vzbid0IGVuZCBpbiAiLmphciIgdGhlbi4uLgotCQlpZiAobG9jYXRpb24uc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MKSAmJiAhbG9jYXRpb24uZW5kc1dpdGgoIi5qYXIiKSkKLQkJCXJldHVybiBiYXNpY0xvYWRNYW5pZmVzdChuZXcgRmlsZShsb2NhdGlvbi5zdWJzdHJpbmcoRklMRV9QUk9UT0NPTC5sZW5ndGgoKSkpKTsKLQotCQl0cnkgewotCQkJSmFyRmlsZSBqYXIgPSBudWxsOwotCQkJRmlsZSBmaWxlID0gbnVsbDsKLQkJCWlmIChsb2NhdGlvbi5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0wpKSB7Ci0JCQkJZmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uLnN1YnN0cmluZyhGSUxFX1BST1RPQ09MLmxlbmd0aCgpKSk7Ci0JCQkJamFyID0gbmV3IEphckZpbGUoZmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKCJqYXI6IiArIGxvY2F0aW9uICsgIiEvIik7Ci0JCQkJSmFyVVJMQ29ubmVjdGlvbiBqYXJDb25uZWN0aW9uID0gKEphclVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCWphciA9IGphckNvbm5lY3Rpb24uZ2V0SmFyRmlsZSgpOwotCQkJCS8vIHRvZG8gc2hvdWxkIHNldCB0aGlzIHZhciBpZiBwb3NzaWJsZQotCQkJCS8vIGZpbGUgPSA7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCU1hbmlmZXN0IG1hbmlmZXN0ID0gamFyLmdldE1hbmlmZXN0KCk7Ci0JCQkJLy8gd2UgbWlnaHQgaGF2ZSBhbiBvbGQtc3R5bGUgcGx1Zy1pbiBzbyBsb29rIGZvciBhbiBvbGQgcGx1Zy1pbiBtYW5pZmVzdAotCQkJCWlmIChtYW5pZmVzdCA9PSBudWxsKSB7Ci0JCQkJCWlmIChmaWxlID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJLy8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIHRvIGNvbnZlcnQKLQkJCQkJSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoUExVR0lOX01BTklGRVNUKTsKLQkJCQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQkJCQllbnRyeSA9IGphci5nZXRKYXJFbnRyeShGUkFHTUVOVF9NQU5JRkVTVCk7Ci0JCQkJCWlmIChlbnRyeSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCXJldHVybiBjb252ZXJ0UGx1Z2luTWFuaWZlc3QoZmlsZSwgdHJ1ZSk7Ci0JCQkJfQotCQkJCUF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCk7Ci0JCQkJLy8gaWYgd2UgaGF2ZSBhIEpBUidkIGJ1bmRsZSB0aGF0IGhhcyBhIG5vbi1PU0dpIG1hbmlmZXN0IGZpbGUgKGxpa2UKLQkJCQkvLyB0aGUgb25lcyBwcm9kdWNlZCBieSBBbnQsIHRoZW4gdHJ5IGFuZCBjb252ZXJ0IHRoZSBwbHVnaW4ueG1sCi0JCQkJaWYgKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpID09IG51bGwpIHsKLQkJCQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQlyZXR1cm4gY29udmVydFBsdWdpbk1hbmlmZXN0KGZpbGUsIHRydWUpOwotCQkJCX0KLQkJCQlEaWN0aW9uYXJ5IHJlc3VsdCA9IG5ldyBIYXNodGFibGUoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlTdHJpbmcga2V5ID0gaXRlci5uZXh0KCkudG9TdHJpbmcoKTsKLQkJCQkJcmVzdWx0LnB1dChrZXksIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoa2V5KSk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWphci5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvc2dpLmRlYnVnIikgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5lcnIucHJpbnRsbigibG9jYXRpb249IiArIGxvY2F0aW9uKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQ29waWVkIGZyb20gQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5IGluIHRoZSBtZXRhZGF0YSBnZW5lcmF0b3IuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRGljdGlvbmFyeSBjb252ZXJ0UGx1Z2luTWFuaWZlc3QoRmlsZSBidW5kbGVMb2NhdGlvbiwgYm9vbGVhbiBsb2dDb252ZXJzaW9uRXhjZXB0aW9uKSB7Ci0JCVBsdWdpbkNvbnZlcnRlciBjb252ZXJ0ZXI7Ci0JCXRyeSB7Ci0JCQljb252ZXJ0ZXIgPSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLnV0aWxzLkFjdGl2YXRvci5hY3F1aXJlUGx1Z2luQ29udmVydGVyKCk7Ci0JCQlpZiAoY29udmVydGVyID09IG51bGwpIHsKLQkJCQluZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGFxdWlyZSBQbHVnaW5Db252ZXJ0ZXIgc2VydmljZSBkdXJpbmcgZ2VuZXJhdGlvbiBmb3I6ICIgKyBidW5kbGVMb2NhdGlvbikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBjb252ZXJ0ZXIuY29udmVydE1hbmlmZXN0KGJ1bmRsZUxvY2F0aW9uLCBmYWxzZSwgbnVsbCwgdHJ1ZSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKFBsdWdpbkNvbnZlcnNpb25FeGNlcHRpb24gY29udmVydEV4Y2VwdGlvbikgewotCQkJLy8gb25seSBsb2cgdGhlIGV4Y2VwdGlvbiBpZiB3ZSBoYWQgYSBwbHVnaW4ueG1sIG9yIGZyYWdtZW50LnhtbCBhbmQgd2UgZmFpbGVkIGNvbnZlcnNpb24KLQkJCWlmIChidW5kbGVMb2NhdGlvbi5nZXROYW1lKCkuZXF1YWxzKEZFQVRVUkVfTUFOSUZFU1QpKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKCFuZXcgRmlsZShidW5kbGVMb2NhdGlvbiwgUExVR0lOX01BTklGRVNUKS5leGlzdHMoKSAmJiAhbmV3IEZpbGUoYnVuZGxlTG9jYXRpb24sIEZSQUdNRU5UX01BTklGRVNUKS5leGlzdHMoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChsb2dDb252ZXJzaW9uRXhjZXB0aW9uKSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgIm9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4iLCAwLCAiRXJyb3IgY29udmVydGluZyBidW5kbGUgbWFuaWZlc3QuIiwgY29udmVydEV4Y2VwdGlvbik7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHN0YXR1cyk7Ci0JCQkJLy9UT0RPIE5lZWQgdG8gZmluZCBhIHdheSB0byBnZXQgYSBsb2dnaW5nIHNlcnZpY2UgdG8gbG9nCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFBhdGhGcm9tQ2xhdXNlKFN0cmluZyBjbGF1c2UpIHsKLQkJaWYgKGNsYXVzZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChjbGF1c2UuaW5kZXhPZigiOyIpICE9IC0xKQotCQkJY2xhdXNlID0gY2xhdXNlLnN1YnN0cmluZygwLCBjbGF1c2UuaW5kZXhPZigiOyIpKTsKLQkJcmV0dXJuIGNsYXVzZS50cmltKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKEZpbGUgdGFyZ2V0LCBGaWxlIGZyb20pIHsKLQotCQlTdHJpbmcgdGFyZ2V0UGF0aCA9IFV0aWxzLnJlcGxhY2VBbGwodGFyZ2V0LmdldEFic29sdXRlUGF0aCgpLCBGaWxlLnNlcGFyYXRvciwgUEFUSF9TRVApOwotCQlTdHJpbmcgZnJvbVBhdGggPSBVdGlscy5yZXBsYWNlQWxsKGZyb20uZ2V0QWJzb2x1dGVQYXRoKCksIEZpbGUuc2VwYXJhdG9yLCBQQVRIX1NFUCk7Ci0KLQkJU3RyaW5nW10gdGFyZ2V0VG9rZW5zID0gVXRpbHMuZ2V0VG9rZW5zKHRhcmdldFBhdGgsIFBBVEhfU0VQKTsKLQkJU3RyaW5nW10gZnJvbVRva2VucyA9IFV0aWxzLmdldFRva2Vucyhmcm9tUGF0aCwgUEFUSF9TRVApOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcm9tVG9rZW5zLmxlbmd0aDsgaSsrKQotCQkJaWYgKGZyb21Ub2tlbnNbaV0uZXF1YWxzKHRhcmdldFRva2Vuc1tpXSkpCi0JCQkJaW5kZXggPSBpOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCi0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IGluZGV4ICsgMTsgaSA8IGZyb21Ub2tlbnMubGVuZ3RoOyBpKyspCi0JCQlzYi5hcHBlbmQoIi4uIiArIFBBVEhfU0VQKTsKLQotCQlmb3IgKGludCBpID0gaW5kZXggKyAxOyBpIDwgdGFyZ2V0VG9rZW5zLmxlbmd0aDsgaSsrKQotCQkJaWYgKGkgIT0gdGFyZ2V0VG9rZW5zLmxlbmd0aCAtIDEpCi0JCQkJc2IuYXBwZW5kKHRhcmdldFRva2Vuc1tpXSArIFBBVEhfU0VQKTsKLQkJCWVsc2UKLQkJCQlzYi5hcHBlbmQodGFyZ2V0VG9rZW5zW2ldKTsKLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoKFVSTCB0YXJnZXQsIFVSTCBmcm9tKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQotCQlpZiAoIXRhcmdldC5nZXRQcm90b2NvbCgpLmVxdWFscyhmcm9tLmdldFByb3RvY29sKCkpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvdG9jb2xzIG9mIHRhcmdldCg9IiArIHRhcmdldCArICIpIGFuZCBmcm9tKD0iICsgZnJvbSArICIpIGRvZXMgTk9UIGVxdWFsIik7Ci0KLQkJaWYgKHRhcmdldC5nZXRIb3N0KCkgIT0gbnVsbCAmJiB0YXJnZXQuZ2V0SG9zdCgpLmxlbmd0aCgpICE9IDApIHsKLQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJ0YXJnZXQuZ2V0SG9zdCgpPSIgKyB0YXJnZXQuZ2V0SG9zdCgpKTsKLQkJCWlmIChmcm9tLmdldEhvc3QoKSAhPSBudWxsICYmIGZyb20uZ2V0SG9zdCgpLmxlbmd0aCgpICE9IDApIHsKLQkJCQlpZiAoIXRhcmdldC5nZXRIb3N0KCkuZXF1YWxzKGZyb20uZ2V0SG9zdCgpKSkKLQkJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSG9zdHMgb2YgdGFyZ2V0KD0iICsgdGFyZ2V0ICsgIikgYW5kIGZyb20oPSIgKyBmcm9tICsgIikgZG9lcyBOT1QgZXF1YWwiKTsKLQkJCQlpZiAodGFyZ2V0LmdldFBvcnQoKSAhPSAoZnJvbS5nZXRQb3J0KCkpKQotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQb3J0cyBvZiB0YXJnZXQoPSIgKyB0YXJnZXQgKyAiKSBhbmQgZnJvbSg9IiArIGZyb20gKyAiKSBkb2VzIE5PVCBlcXVhbCIpOwotCQkJfSBlbHNlCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiV2hpbGUgSG9zdCBvZiB0YXJnZXQoPSIgKyB0YXJnZXQgKyAiKSBpcyBzZXQsIEhvc3Qgb2YgZnJvbSBpcyBudWxsLnRhcmdldC5nZXRIb3N0KCk9IiArIHRhcmdldC5nZXRIb3N0KCkpOwotCQl9IGVsc2UgaWYgKGZyb20uZ2V0SG9zdCgpICE9IG51bGwgJiYgZnJvbS5nZXRIb3N0KCkubGVuZ3RoKCkgIT0gMCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIldoaWxlIEhvc3Qgb2YgZnJvbSg9IiArIGZyb20gKyAiKSBpcyBzZXQsIEhvc3Qgb2YgdGFyZ2V0IGlzIG51bGwiKTsKLQotCQlTdHJpbmcgdGFyZ2V0UGF0aCA9IHRhcmdldC5nZXRGaWxlKCk7Ci0JCVN0cmluZyBmcm9tUGF0aCA9IGZyb20uZ2V0RmlsZSgpOwotCi0JCVN0cmluZ1tdIHRhcmdldFRva2VucyA9IFV0aWxzLmdldFRva2Vucyh0YXJnZXRQYXRoLCBQQVRIX1NFUCk7Ci0JCVN0cmluZ1tdIGZyb21Ub2tlbnMgPSBVdGlscy5nZXRUb2tlbnMoZnJvbVBhdGgsIFBBVEhfU0VQKTsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJvbVRva2Vucy5sZW5ndGg7IGkrKykKLQkJCWlmIChmcm9tVG9rZW5zW2ldLmVxdWFscyh0YXJnZXRUb2tlbnNbaV0pKQotCQkJCWluZGV4ID0gaTsKLQkJCWVsc2UKLQkJCQlicmVhazsKLQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSBpbmRleCArIDE7IGkgPCBmcm9tVG9rZW5zLmxlbmd0aDsgaSsrKQotCQkJc2IuYXBwZW5kKCIuLiIgKyBQQVRIX1NFUCk7Ci0KLQkJZm9yIChpbnQgaSA9IGluZGV4ICsgMTsgaSA8IHRhcmdldFRva2Vucy5sZW5ndGg7IGkrKykKLQkJCWlmIChpICE9IHRhcmdldFRva2Vucy5sZW5ndGggLSAxKQotCQkJCXNiLmFwcGVuZCh0YXJnZXRUb2tlbnNbaV0gKyBQQVRIX1NFUCk7Ci0JCQllbHNlCi0JCQkJc2IuYXBwZW5kKHRhcmdldFRva2Vuc1tpXSk7Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8vCXB1YmxpYyBzdGF0aWMgVVJMIGdldEFic29sdXRlVXJsKFN0cmluZyByZWxhdGl2ZVBhdGgsIFVSTCBiYXNlVXJsKSB0aHJvd3MgRndMYXVuY2hlckV4Y2VwdGlvbiB7Ci0JLy8JCXJlbGF0aXZlUGF0aCA9IFV0aWxzLnJlcGxhY2VBbGwocmVsYXRpdmVQYXRoLCBGaWxlLnNlcGFyYXRvciwgIi8iKTsKLQkvLwkJdHJ5IHsKLQkvLwkJCXJldHVybiBuZXcgVVJMKGJhc2VVcmwsIHJlbGF0aXZlUGF0aCk7Ci0JLy8JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JLy8JCQl0aHJvdyBuZXcgRndMYXVuY2hlckV4Y2VwdGlvbigiQWJzb2x1dGUgVVJMIGNhbm5vdCBiZSBjcmVhdGVkLiBcbnJlbGF0aXZlUGF0aD0iICsgcmVsYXRpdmVQYXRoICsgIixiYXNlVXJsPSIgKyBiYXNlVXJsLCBlLCBGd0xhdW5jaGVyRXhjZXB0aW9uLlVSTF9GT1JNQVRfRVJST1IpOwotCS8vCQl9Ci0JLy8JfQotCi0JLy8JcHVibGljIHN0YXRpYyB2b2lkIHNldFByb3BlcnRpZXMoUHJvcGVydGllcyB0bywgUHJvcGVydGllcyBmcm9tLCBTdHJpbmcga2V5KSB7Ci0JLy8JCWlmIChmcm9tICE9IG51bGwpIHsKLQkvLwkJCVN0cmluZyB2YWx1ZSA9IGZyb20uZ2V0UHJvcGVydHkoa2V5KTsKLQkvLwkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JLy8JCQkJaWYgKHRvICE9IG51bGwpCi0JLy8JCQkJCXRvID0gbmV3IFByb3BlcnRpZXMoKTsKLQkvLwkJCQl0by5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLQkvLwkJCX0KLQkvLwkJfQotCS8vCX0KLQotCS8vCXB1YmxpYyBzdGF0aWMgaW50IGdldEludFByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wcywgU3RyaW5nIGtleSkgey8vdGhyb3dzIE1hbmlwdWxhdG9yRXhjZXB0aW9uIHsKLQkvLwkJaWYgKHByb3BzID09IG51bGwpCi0JLy8JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm9wcyA9PSBudWxsIik7Ci0JLy8JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JLy8JCXRyeSB7Ci0JLy8JCQl2YWx1ZSA9IHByb3BzLmdldFByb3BlcnR5KGtleSk7Ci0JLy8JCQlyZXR1cm4gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JLy8JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkvLwkJCXRocm93IG5ldyBNYW5pcHVsYXRvckV4Y2VwdGlvbigia2V5PSIgKyBrZXkgKyAiLHZhbHVlPSIgKyB2YWx1ZSwgbmZlLCBNYW5pcHVsYXRvckV4Y2VwdGlvbi5PVEhFUlMpOwotCS8vCQl9Ci0JLy8JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgZm9yIGNyZWF0ZSBhIGJhY2t1cCBmaWxlLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlIHRhcmdldCBmaWxlCi0JICogQHJldHVybiBGaWxlIGJhY2t1cCBmaWxlIHdob3NlIGZpbGVuYW1lIGNvbnNpc3RzIG9mICJob2dlaG9nZS55eXl5TU1kZEhIbW1zcy5leHQiIG9yIAotCSAqIAkiaG9nZWhvZ2UueXl5eU1NZGRISG1tc3MiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRTaW1wbGVEYXRhRm9ybWF0dGVkRmlsZShGaWxlIGZpbGUpIHsKLQkJU2ltcGxlRGF0ZUZvcm1hdCBkZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJ5eXl5TU1kZEhIbW1zcyIpOwotCQlTdHJpbmcgZGF0ZSA9IGRmLmZvcm1hdChuZXcgRGF0ZSgpKTsKLQkJU3RyaW5nIGZpbGVuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCWludCBpbmRleCA9IGZpbGVuYW1lLmxhc3RJbmRleE9mKCIuIik7Ci0JCWlmIChpbmRleCAhPSAtMSkKLQkJCWZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKDAsIGluZGV4KSArICIuIiArIGRhdGUgKyAiLiIgKyBmaWxlbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQkJZWxzZQotCQkJZmlsZW5hbWUgPSBmaWxlbmFtZSArICIuIiArIGRhdGU7Ci0JCUZpbGUgZGVzdCA9IG5ldyBGaWxlKGZpbGUuZ2V0UGFyZW50RmlsZSgpLCBmaWxlbmFtZSk7Ci0JCXJldHVybiBkZXN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0VG9rZW5zKFN0cmluZyBtc2csIFN0cmluZyBkZWxpbSkgewotCQlyZXR1cm4gZ2V0VG9rZW5zKG1zZywgZGVsaW0sIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFRva2VucyhTdHJpbmcgbXNnLCBTdHJpbmcgZGVsaW0sIGJvb2xlYW4gcmV0dXJuRGVsaW1zKSB7Ci0JCVN0cmluZ1Rva2VuaXplciB0YXJnZXRTVCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobXNnLCBkZWxpbSwgcmV0dXJuRGVsaW1zKTsKLQkJU3RyaW5nW10gdG9rZW5zID0gbmV3IFN0cmluZ1t0YXJnZXRTVC5jb3VudFRva2VucygpXTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KHRhcmdldFNULmNvdW50VG9rZW5zKCkpOwotCQl3aGlsZSAodGFyZ2V0U1QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlsaXN0LmFkZCh0YXJnZXRTVC5uZXh0VG9rZW4oKSk7Ci0JCX0KLQkJbGlzdC50b0FycmF5KHRva2Vucyk7Ci0JCXJldHVybiB0b2tlbnM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0VXJsKFN0cmluZyBwcm90b2NvbCwgU3RyaW5nIGhvc3QsIFN0cmluZyBmaWxlKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsvLyB0aHJvd3MgTWFuaXB1bGF0b3JFeGNlcHRpb24gewotCQlmaWxlID0gVXRpbHMucmVwbGFjZUFsbChmaWxlLCBGaWxlLnNlcGFyYXRvciwgIi8iKTsKLQkJcmV0dXJuIG5ldyBVUkwocHJvdG9jb2wsIGhvc3QsIGZpbGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldFVybEluRnVsbChTdHJpbmcgcGF0aCwgVVJMIGZyb20pIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gey8vdGhyb3dzIE1hbmlwdWxhdG9yRXhjZXB0aW9uIHsKLQkJVXRpbHMuY2hlY2tGdWxsVXJsKGZyb20sICJmcm9tIik7Ci0JCXBhdGggPSBVdGlscy5yZXBsYWNlQWxsKHBhdGgsIEZpbGUuc2VwYXJhdG9yLCAiLyIpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZnJvbS50b0V4dGVybmFsRm9ybSgpPSIgKyBmcm9tLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQlTdHJpbmcgZnJvbVN0ID0gVXRpbHMucmVtb3ZlTGFzdENoKGZyb20udG9FeHRlcm5hbEZvcm0oKSwgJy8nKTsKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImZyb21TdD0iICsgZnJvbVN0KTsKLQkJaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7Ci0JCQlTdHJpbmcgZmlsZVN0ID0gZnJvbS5nZXRGaWxlKCk7Ci0JCQlyZXR1cm4gbmV3IFVSTChmcm9tU3Quc3Vic3RyaW5nKDAsIGZyb21TdC5sYXN0SW5kZXhPZihmaWxlU3QpIC0gMSkgKyBwYXRoKTsKLQkJfQotCQlyZXR1cm4gbmV3IFVSTChmcm9tU3QgKyAiLyIgKyBwYXRoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIG1hbmlmZXN0VG9Qcm9wZXJ0aWVzKEF0dHJpYnV0ZXMgZCkgewotCQlJdGVyYXRvciBpdGVyID0gZC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlQcm9wZXJ0aWVzIHJlc3VsdCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQXR0cmlidXRlcy5OYW1lIGtleSA9IChBdHRyaWJ1dGVzLk5hbWUpIGl0ZXIubmV4dCgpOwotCQkJcmVzdWx0LnB1dChrZXkudG9TdHJpbmcoKSwgZC5nZXQoa2V5KSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBKdXN0IHVzZWQgZm9yIGRlYnVnLgotCSAqIAotCSAqIEBwYXJhbSBwcyBwcmludHN0cmVhbQotCSAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgcHJvcGVydGllcyAKLQkgKiBAcGFyYW0gcHJvcHMgcHJvcGVydGllcyB3aG9zZSBrZXlzIGFuZCB2YWx1ZXMgd2lsbCBiZSBwcmludGVkIG91dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRvdXRQcm9wZXJ0aWVzKFByaW50U3RyZWFtIHBzLCBTdHJpbmcgbmFtZSwgUHJvcGVydGllcyBwcm9wcykgewotCQlpZiAocHJvcHMgPT0gbnVsbCB8fCBwcm9wcy5zaXplKCkgPT0gMCkgewotCQkJcHMucHJpbnRsbigiUHJvcHMoIiArIG5hbWUgKyAiKSBpcyBlbXB0eSIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXBzLnByaW50bG4oIlByb3BzKCIgKyBuYW1lICsgIik9Iik7Ci0JCWZvciAoRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBwcm9wcy5rZXlzKCk7IGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGVudW1lcmF0aW9uLm5leHRFbGVtZW50KCk7Ci0JCQlwcy5wcmludCgiXHRrZXk9IiArIGtleSk7Ci0JCQlwcy5wcmludGxuKCJcdHZhbHVlPSIgKyBwcm9wcy5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUxhc3RDaChTdHJpbmcgdGFyZ2V0LCBjaGFyIGNoKSB7Ci0JCXdoaWxlICh0YXJnZXQuY2hhckF0KHRhcmdldC5sZW5ndGgoKSAtIDEpID09IGNoKSB7Ci0JCQl0YXJnZXQgPSB0YXJnZXQuc3Vic3RyaW5nKDAsIHRhcmdldC5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUFsbChTdHJpbmcgc3QsIFN0cmluZyBvbGRTdCwgU3RyaW5nIG5ld1N0KSB7Ci0JCWlmIChvbGRTdC5lcXVhbHMobmV3U3QpKQotCQkJcmV0dXJuIHN0OwotCQlpbnQgaW5kZXggPSAtMTsKLQkJd2hpbGUgKChpbmRleCA9IHN0LmluZGV4T2Yob2xkU3QpKSAhPSAtMSkgewotCQkJc3QgPSBzdC5zdWJzdHJpbmcoMCwgaW5kZXgpICsgbmV3U3QgKyBzdC5zdWJzdHJpbmcoaW5kZXggKyBvbGRTdC5sZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIHN0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNocmlua1BhdGgoU3RyaW5nIHRhcmdldCkgewotCQlTdHJpbmcgdGFyZ2V0UGF0aCA9IFV0aWxzLnJlcGxhY2VBbGwodGFyZ2V0LCBGaWxlLnNlcGFyYXRvciwgUEFUSF9TRVApOwotCQlTdHJpbmdbXSB0YXJnZXRUb2tlbnMgPSBVdGlscy5nZXRUb2tlbnModGFyZ2V0UGF0aCwgUEFUSF9TRVApOwotCQkvL1N0cmluZ1tdIGZyb21Ub2tlbnMgPSBVdGlscy5nZXRUb2tlbnMoZnJvbVBhdGgsIFBBVEhfU0VQKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRUb2tlbnMubGVuZ3RoOyBpKyspCi0JCQlpZiAodGFyZ2V0VG9rZW5zW2ldLmVxdWFscygiIikpIHsKLQkJCQl0YXJnZXRUb2tlbnNbaV0gPSBudWxsOwotCQkJfSBlbHNlIGlmICh0YXJnZXRUb2tlbnNbaV0uZXF1YWxzKCIuIikpIHsKLQkJCQl0YXJnZXRUb2tlbnNbaV0gPSBudWxsOwotCQkJfSBlbHNlIGlmICh0YXJnZXRUb2tlbnNbaV0uZXF1YWxzKCIuLiIpKSB7Ci0JCQkJaW50IGlkID0gaSAtIDE7Ci0JCQkJd2hpbGUgKHRhcmdldFRva2Vuc1tpZF0gPT0gbnVsbCkgewotCQkJCQlpZC0tOwotCQkJCX0KLQkJCQl0YXJnZXRUb2tlbnNbaWRdID0gbnVsbDsKLQkJCX0KLQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmICh0YXJnZXRQYXRoLnN0YXJ0c1dpdGgoUEFUSF9TRVApKQotCQkJc2IuYXBwZW5kKFBBVEhfU0VQKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRUb2tlbnMubGVuZ3RoOyBpKyspCi0JCQlpZiAodGFyZ2V0VG9rZW5zW2ldICE9IG51bGwpCi0JCQkJc2IuYXBwZW5kKHRhcmdldFRva2Vuc1tpXSArIFBBVEhfU0VQKTsKLQkJU3RyaW5nIHJldCA9IHNiLnRvU3RyaW5nKCk7Ci0JCWlmICghdGFyZ2V0UGF0aC5lbmRzV2l0aChQQVRIX1NFUCkpCi0JCQlyZXQgPSByZXQuc3Vic3RyaW5nKDAsIHJldC5sYXN0SW5kZXhPZihQQVRIX1NFUCkpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIFNvcnQgYnkgaW5jcmVhc2luZyBvcmRlciBvZiBzdGFydGxldmVscy4KLQkgKiAKLQkgKiBAcGFyYW0gYkluZm9zIGFycmF5IG9mIEJ1bmRsZUluZm9zIHRvIGJlIHNvcnRlZC4KLQkgKiBAcGFyYW0gaW5pdGlhbEJTTCBpbml0aWFsIGJ1bmRsZSBzdGFydCBsZXZlbCB0byBiZSB1c2VkLgotCSAqIEByZXR1cm4gc29ydGVkIGFycmF5IG9mIEJ1bmRsZUluZm9zCi0JICovCi0JcHVibGljIHN0YXRpYyBCdW5kbGVJbmZvW10gc29ydEJ1bmRsZUluZm9zKEJ1bmRsZUluZm9bXSBiSW5mb3MsIGludCBpbml0aWFsQlNMKSB7Ci0JCVNvcnRlZE1hcCBic2xUb0xpc3QgPSBuZXcgVHJlZU1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJJbmZvcy5sZW5ndGg7IGkrKykgewotCQkJSW50ZWdlciBzTCA9IG5ldyBJbnRlZ2VyKGJJbmZvc1tpXS5nZXRTdGFydExldmVsKCkpOwotCQkJaWYgKHNMLmludFZhbHVlKCkgPT0gQnVuZGxlSW5mby5OT19MRVZFTCkKLQkJCQlzTCA9IG5ldyBJbnRlZ2VyKGluaXRpYWxCU0wpOwotCQkJTGlzdCBsaXN0ID0gKExpc3QpIGJzbFRvTGlzdC5nZXQoc0wpOwotCQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJCWxpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQkJCWJzbFRvTGlzdC5wdXQoc0wsIGxpc3QpOwotCQkJfQotCQkJbGlzdC5hZGQoYkluZm9zW2ldKTsKLQkJfQotCi0JCS8vIGJzbFRvTGlzdCBpcyBzb3J0ZWQgYnkgdGhlIGtleSAoU3RhcnRMZXZlbCkuCi0JCUxpc3QgYnVuZGxlSW5mb0xpc3QgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZSA9IGJzbFRvTGlzdC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGUuaGFzTmV4dCgpOykgewotCQkJSW50ZWdlciBzTCA9IChJbnRlZ2VyKSBpdGUubmV4dCgpOwotCQkJTGlzdCBsaXN0ID0gKExpc3QpIGJzbFRvTGlzdC5nZXQoc0wpOwotCQkJZm9yIChJdGVyYXRvciBpdGUyID0gbGlzdC5pdGVyYXRvcigpOyBpdGUyLmhhc05leHQoKTspIHsKLQkJCQlCdW5kbGVJbmZvIGJJbmZvID0gKEJ1bmRsZUluZm8pIGl0ZTIubmV4dCgpOwotCQkJCWJ1bmRsZUluZm9MaXN0LmFkZChiSW5mbyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdldEJ1bmRsZUluZm9zRnJvbUxpc3QoYnVuZGxlSW5mb0xpc3QpOwotCX0KLQotCS8qKgotCSAqIGdldCBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBwcm9wZXJ0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgcHJvcGVydGllcyAKLQkgKiBAcGFyYW0gcHJvcHMgcHJvcGVydGllcyB3aG9zZSBrZXlzIGFuZCB2YWx1ZXMgd2lsbCBiZSBwcmludGVkIG91dC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZ1Byb3BlcnRpZXMoU3RyaW5nIG5hbWUsIFByb3BlcnRpZXMgcHJvcHMpIHsKLQkJaWYgKHByb3BzID09IG51bGwgfHwgcHJvcHMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiAiUHJvcHMoIiArIG5hbWUgKyAiKSBpcyBlbXB0eVxuIjsKLQkJfQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgiUHJvcHMoIiArIG5hbWUgKyAiKSBpcyBcbiIpOwotCQlmb3IgKEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gcHJvcHMua2V5cygpOyBlbnVtZXJhdGlvbi5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotCQkJc2IuYXBwZW5kKCJcdGtleT0iICsga2V5ICsgIlx0dmFsdWU9IiArIHByb3BzLmdldFByb3BlcnR5KGtleSkgKyAiXG4iKTsKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVVcmwoVVJMIHVybCkgey8vdGhyb3dzIE1hbmlwdWxhdG9yRXhjZXB0aW9uIHsKLQkJdHJ5IHsvL3Rlc3QKLQkJCVVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJY29ubmVjdGlvbi5jb25uZWN0KCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVSTCgiICsgdXJsICsgIikgY2Fubm90IGJlIGNvbm5lY3RlZC4iKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yL0NvbmZpZ3VyYXRvck1hbmlwdWxhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29uZmlndXJhdG9ybWFuaXB1bGF0b3IvQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQwMGUzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29uZmlndXJhdG9ybWFuaXB1bGF0b3IvQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotCi0vKioKLSAqIAotICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kcyB0aGF0IGVuYWJsZSBjbGllbnQgYnVuZGxlcyB0byAKLSAqIG1hbmlwdWxhdGUgdGhlIGNvcnJlc3BvbmRpbmcgQ29uZmlndXJhdG9yQnVuZGxlLgotICogCi0gKiAgQHNlZSBDb25maWd1cmF0b3IKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yIHsKLQlTdHJpbmcgU0VSVklDRV9QUk9QX0tFWV9DT05GSUdVUkFUT1JfQlVORExFU1lNQk9MSUNOQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guY29uZmlndXJhdG9yLkJ1bmRsZVN5bWJvbGljTmFtZSI7Ci0KLQkvKioKLQkgKiBTYXZlIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjb3JyZXNwb25kaW5nIENvbmZpZ3VyYXRvciBCdW5kbGUgc28gdGhhdCAKLQkgKiBCdW5kbGVzIGtlcHQgYnkgdGhlIHNwZWNpZmllZCB7QGxpbmsgTWFuaXB1bGF0b3J9IHdvdWxkIGJlIGluc3RhbGxlZCBhZnRlciBjb21wbGV0aW9uIG9mIGEgbGF1bmNoLgotCSAqIFRoZSBsb2NhdGlvbiBvZiBhIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBwYXJhbWV0ZXJzIHNldCB0byB0aGUgTWFuaXB1bGF0b3Igb2JqZWN0Ci0JICogYW5kIGl0IGRlcGVuZHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgQ29uZmlndXJhdG9yQnVuZGxlIGltcGxlbWVudGF0aW9uLgotCSAqIAotCSAqIFdoaWxlIHNvbWUgcGFyYW1ldGVycyBvZiB0aGUge0BsaW5rIE1hbmlwdWxhdG9yfSBvYmplY3Qgd2lsbCBiZSBtb2RpZmllZCAoZm9yIHNldHRpbmcgaW5mbyBhYm91dCB0aGUgCi0JICogbG9jYXRpb24gdGhlIENvbmZpZ3VyYXRvckJ1bmRsZSB3b3VsZCBiZSBhYmxlIHRvIHJlZmVyIGluIGEgZnV0dXJlIGxhdW5jaCksIAotCSAqIHRoZSBCdW5kbGVzIGtlcHQgYnkgdGhlIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0IHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCi0JICogCi0JICogSW5zdGVhZCwgaXQgd2lsbCByZXR1cm4gQnVuZGxlSW5mb1tdIHRvIGJlIG1hbmFnZWQgbm90IGJ5IHRoZSBDb25maWd1cmF0b3JCdW5kbGUuCi0JICogVGhlc2UgdmFsdWVzIGFyZSBzdXBwb3NlZCB0byBiZSBzYXZlZCBpbnRvIGZ3IGNvbmZpZyBmaWxlcy4KLQkgKiAKLQkgKiBJZiBiYWNrdXAgZmxhZyBpcyB0cnVlLCBhIGZpbGUgaGF2ZSBleGlzdGVkIGFscmVhZHkgdW5kZXIgdGhlIHNhbWUgbmFtZQotCSAqIHdpbGwgYmUgcmVuYW1lZCBpbnRvIGFub3RoZXIgbmFtZSBhcyBhIGJhY2t1cC4gCi0JICogCi0JICogV2UgYXNzdW1lIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBNYW5pcHVsYXRvciNzYXZlKGJvb2xlYW4pfSB3aWxsIGNhbGwgdGhpcyBtZXRob2QuCi0JICogIAotCSAqIEByZXR1cm4gYXJyYXkgb2YgQnVuZGxlSW5mbyB0byBiZSBzYXZlZCBhcyBpbnN0YWxsaW5nIGJ1bmRsZXMgaW4gZncgY29uZmlnIGZpbGVzLgotCSAqIEBwYXJhbSBtYW5pcHVsYXRvciB7QGxpbmsgTWFuaXB1bGF0b3J9IG9iamVjdCB3aGljaCBjb250YWlucyB0aGUgYnVuZGxlcyB0byBiZSBpbnN0YWxsZWQgZmluYWxseS4KLQkgKiBAcGFyYW0gYmFja3VwIGlmIGZpbGVzIGV4aXN0cyBhdCB0aGUgbG9jYXRpb24gdG8gc2F2ZSwgaXQgd2lsbCBiZSBjb3BpZWQgYXMgYSBiYWNrdXAuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiAtIElmIGZhaWwgdG8gc2F2ZSBjb25maWd1cmF0aW9uIGZvciB0aGUgY29ycmVzcG9uZGluZyBDb25maWd1cmF0b3IgQnVuZGxlLgotCSAqLwotCUJ1bmRsZUluZm9bXSBzYXZlKE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yLCBib29sZWFuIGJhY2t1cCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVXBkYXRlIGJ1bmRsZXMga2VwdCBieSB0aGUgc3BlY2lmaWVkIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0IGludG8gaW5zdGFsbGVkIGJ1bmRsZXMKLQkgKiBpZiB7QGxpbmsgRnJhbWV3b3JrQWRtaW4jbGF1bmNoKE1hbmlwdWxhdG9yLCBGaWxlKX0gd2l0aCB0aGUgc3BlY2lmaWVkIAotCSAqIHtAbGluayBNYW5pcHVsYXRvcn0gaXMgY2FsbGVkIHRha2luZyB0aGUgY29ycmVzcG9uZGluZyBDb25maWd1cmF0b3JCdW5kbGUgYmVoYWl2aW9yIGludG8gYWNjb3VudC4KLQkgKiAKLQkgKiBJZiB0aGVyZSBpcyBubyBjb3JyZXNwb25kaW5nIENvbmZpZ3VyYXRvckJ1bmRsZSBpbiBNYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpLAotCSAqIGp1c3QgcmV0dXJuLgotCSAqIAotCSAqIFRoZSBCdW5kbGVJbmZvW10gb2YgdGhlIHNwZWNpZmllZCBNYW5pcHVsYXRvciBvYmplY3Qgd2lsbCBiZSBtb2RpZmllZC4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIGZyb20ge0BsaW5rIE1hbmlwdWxhdG9yI2xvYWQoKX0uCi0JICogIAotCSAqIEBwYXJhbSBtYW5pcHVsYXRvciB7QGxpbmsgTWFuaXB1bGF0b3J9IG9iamVjdCB0byBiZSB1c2VkIGFuZCB1cGRhdGVkLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLSBJZiBmYWlsIHRvIHJlYWQgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgQ29uZmlndXJhdG9yIEJ1bmRsZS4KLQkgKi8KLQl2b2lkIHVwZGF0ZUJ1bmRsZXMoTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXZvaWQgY2xlYW51cChNYW5pcHVsYXRvciBtYW5pcHVsYXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29uZmlndXJhdG9ybWFuaXB1bGF0b3IvQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29uZmlndXJhdG9ybWFuaXB1bGF0b3IvQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMTI0NTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yL0NvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9ybWFuaXB1bGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkZyYW1ld29ya0FkbWluOwotCi0vKioKLSAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yIG9iamVjdCBmcm9tIEphdmEgcHJvZ3JhbXMuCi0gKiAKLSAqICBAc2VlIEZyYW1ld29ya0FkbWluCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnkgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFNZU1RFTV9QUk9QRVJUWV9LRVkgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5jb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnkiOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yIGNyZWF0ZUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yKCk7Ci0KLQlwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yIGdldEluc3RhbmNlKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5IGZhY3RvcnkgPSAoQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5KSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSkubmV3SW5zdGFuY2UoKTsKLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vQnVuZGxlSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2ZyYW1ld29ya2FkbWluL0J1bmRsZUluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlkZWE0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vQnVuZGxlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLS8qKgotICogVGhpcyBvYmplY3QgcmVwcmVzZW50cyBpbmZvcm1hdGlvbiBvZiBhIGJ1bmRsZS4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCdW5kbGVJbmZvIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19MRVZFTCA9IC0xOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0JVTkRMRUlEID0gLTE7Ci0KLQlwcml2YXRlIFN0cmluZyBzeW1ib2xpY05hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHZlcnNpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotCXByaXZhdGUgbG9uZyBidW5kbGVJZCA9IE5PX0JVTkRMRUlEOwotCi0JcHJpdmF0ZSBib29sZWFuIG1hcmtlZEFzU3RhcnRlZCA9IGZhbHNlOwotCXByaXZhdGUgaW50IHN0YXJ0TGV2ZWwgPSBOT19MRVZFTDsKLQlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgU3RyaW5nIG1hbmlmZXN0OwotCi0JcHVibGljIEJ1bmRsZUluZm8oKSB7Ci0JfQotCi0JcHVibGljIEJ1bmRsZUluZm8oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKQotCQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mbyhTdHJpbmcgbG9jYXRpb24sIGJvb2xlYW4gc3RhcnRlZCkgewotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkKLQkJCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbi50cmltKCk7Ci0JCXRoaXMubWFya2VkQXNTdGFydGVkID0gc3RhcnRlZDsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mbyhTdHJpbmcgbG9jYXRpb24sIGludCBzdGFydExldmVsKSB7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKQotCQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uLnRyaW0oKTsKLQkJdGhpcy5zdGFydExldmVsID0gc3RhcnRMZXZlbDsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mbyhTdHJpbmcgbG9jYXRpb24sIGludCBzdGFydExldmVsLCBib29sZWFuIHN0YXJ0ZWQpIHsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpCi0JCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb24udHJpbSgpOwotCQl0aGlzLnN0YXJ0TGV2ZWwgPSBzdGFydExldmVsOwotCQl0aGlzLm1hcmtlZEFzU3RhcnRlZCA9IHN0YXJ0ZWQ7Ci0JfQotCi0JcHVibGljIEJ1bmRsZUluZm8oU3RyaW5nIGxvY2F0aW9uLCBpbnQgc3RhcnRMZXZlbCwgYm9vbGVhbiBzdGFydGVkLCBsb25nIGJ1bmRsZUlkKSB7Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKQotCQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uLnRyaW0oKTsKLQkJdGhpcy5zdGFydExldmVsID0gc3RhcnRMZXZlbDsKLQkJdGhpcy5tYXJrZWRBc1N0YXJ0ZWQgPSBzdGFydGVkOwotCQl0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7Ci0JfQotCi0JcHVibGljIEJ1bmRsZUluZm8oU3RyaW5nIHN5bWJvbGljLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIGxvY2F0aW9uLCBpbnQgc3RhcnRMZXZlbCwgYm9vbGVhbiBzdGFydGVkKSB7Ci0JCXRoaXMuc3ltYm9saWNOYW1lID0gc3ltYm9saWM7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCWlmIChsb2NhdGlvbiAhPSBudWxsKQotCQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uLnRyaW0oKTsKLQkJdGhpcy5tYXJrZWRBc1N0YXJ0ZWQgPSBzdGFydGVkOwotCQl0aGlzLnN0YXJ0TGV2ZWwgPSBzdGFydExldmVsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0b0NvbXBhcmUpIHsKLQkJaWYgKHRvQ29tcGFyZSBpbnN0YW5jZW9mIEJ1bmRsZUluZm8pIHsKLQkJCUJ1bmRsZUluZm8gaW5mbyA9IChCdW5kbGVJbmZvKSB0b0NvbXBhcmU7Ci0JCQkvL2lmIChpbmZvLnN5bWJvbGljTmFtZS5lcXVhbHMoc3ltYm9saWNOYW1lKSAmJiBpbmZvLnZlcnNpb24uZXF1YWxzKHZlcnNpb24pICYmIChpbmZvLnVybCA9PSBudWxsIHx8IHVybCA9PSBudWxsID8gdHJ1ZSA6IGluZm8udXJsLmVxdWFscyh1cmwpKSkKLQkJCWlmIChpbmZvLnN5bWJvbGljTmFtZSAhPSBudWxsICYmIGluZm8udmVyc2lvbiAhPSBudWxsICYmIHN5bWJvbGljTmFtZSAhPSBudWxsICYmIHZlcnNpb24gIT0gbnVsbCkgewotCQkJCS8vIFRPRE86IHRoZSBlcXVhbHNJZ25vcmVDYXNlIGZvciBsb2NhdGlvbiBjb21wYXJpc29uIGlzIGEgYnVnOwotCQkJCS8vCQkgbmVlZCBhIHBsYXRmb3JtIHNlbnNpdGl2ZSBsb2NhdGlvbiBjb21wYXJpc29uIG1ldGhvZAotCQkJCWlmIChpbmZvLnN5bWJvbGljTmFtZS5lcXVhbHMoc3ltYm9saWNOYW1lKSAmJiBpbmZvLnZlcnNpb24uZXF1YWxzKHZlcnNpb24pICYmIChpbmZvLmxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24gPT0gbnVsbCA/IHRydWUgOiBuZXcgUGF0aChpbmZvLmxvY2F0aW9uKS50b0ZpbGUoKS5lcXVhbHMobmV3IFBhdGgobG9jYXRpb24pLnRvRmlsZSgpKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gKGluZm8ubG9jYXRpb24gPT0gbnVsbCB8fCBsb2NhdGlvbiA9PSBudWxsID8gZmFsc2UgOiBuZXcgUGF0aChpbmZvLmxvY2F0aW9uKS50b0ZpbGUoKS5lcXVhbHMobmV3IFBhdGgobG9jYXRpb24pLnRvRmlsZSgpKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBsb25nIGdldEJ1bmRsZUlkKCkgewotCQlyZXR1cm4gYnVuZGxlSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TWFuaWZlc3QoKSB7Ci0JCXJldHVybiBtYW5pZmVzdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0TGV2ZWwoKSB7Ci0JCXJldHVybiBzdGFydExldmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKCkgewotCQlyZXR1cm4gc3ltYm9saWNOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIHZlcnNpb247Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IHJlc3VsdCA9IHN5bWJvbGljTmFtZSA9PSBudWxsID8gMCA6IHN5bWJvbGljTmFtZS5oYXNoQ29kZSgpOwotCQlyZXN1bHQgPSByZXN1bHQgKyAodmVyc2lvbiA9PSBudWxsID8gMCA6IHZlcnNpb24uaGFzaENvZGUoKSk7Ci0JCXJlc3VsdCA9IHJlc3VsdCArIChsb2NhdGlvbiA9PSBudWxsID8gMCA6IG5ldyBQYXRoKGxvY2F0aW9uKS5oYXNoQ29kZSgpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hcmtlZEFzU3RhcnRlZCgpIHsKLQkJcmV0dXJuIG1hcmtlZEFzU3RhcnRlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkgewotCQlyZXR1cm4gcmVzb2x2ZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnVuZGxlSWQobG9uZyBidW5kbGVJZCkgewotCQl0aGlzLmJ1bmRsZUlkID0gYnVuZGxlSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCXRoaXMubG9jYXRpb24gPSAobG9jYXRpb24gIT0gbnVsbCA/IGxvY2F0aW9uLnRyaW0oKSA6IG51bGwpOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0TWFuaWZlc3QoU3RyaW5nIG1hbmlmZXN0KSB7Ci0JCXRoaXMubWFuaWZlc3QgPSBtYW5pZmVzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNYXJrZWRBc1N0YXJ0ZWQoYm9vbGVhbiBtYXJrZWRBc1N0YXJ0ZWQpIHsKLQkJdGhpcy5tYXJrZWRBc1N0YXJ0ZWQgPSBtYXJrZWRBc1N0YXJ0ZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb2x2ZWQoYm9vbGVhbiByZXNvbHZlZCkgewotCQl0aGlzLnJlc29sdmVkID0gcmVzb2x2ZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RhcnRMZXZlbChpbnQgbGV2ZWwpIHsKLQkJdGhpcy5zdGFydExldmVsID0gbGV2ZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3ltYm9saWNOYW1lKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJdGhpcy5zeW1ib2xpY05hbWUgPSBzeW1ib2xpY05hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52ZXJzaW9uID0gdmFsdWU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiQnVuZGxlSW5mbygiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3ltYm9saWNOYW1lICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHN5bWJvbGljTmFtZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHZlcnNpb24gIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQodmVyc2lvbik7Ci0JCWJ1ZmZlci5hcHBlbmQoIiwgIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgibG9jYXRpb249Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChsb2NhdGlvbik7Ci0JCWJ1ZmZlci5hcHBlbmQoIiwgc3RhcnRMZXZlbD0iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHN0YXJ0TGV2ZWwpOwotCQlidWZmZXIuYXBwZW5kKCIsIHRvQmVTdGFydGVkPSIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQobWFya2VkQXNTdGFydGVkKTsKLQkJYnVmZmVyLmFwcGVuZCgiLCByZXNvbHZlZD0iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHJlc29sdmVkKTsKLQkJYnVmZmVyLmFwcGVuZCgiLCBpZD0iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHRoaXMuYnVuZGxlSWQpOy8vCQlidWZmZXIuYXBwZW5kKCcsJykuYXBwZW5kKG1hbmlmZXN0ID09IG51bGwgPyAibm8gbWFuaWZlc3QiIDogIm1hbmlmZXN0IGF2YWlsYWJsZSIpOwotCQlidWZmZXIuYXBwZW5kKCcsJykuYXBwZW5kKG1hbmlmZXN0ID09IG51bGwgPyAibm8gbWFuaWZlc3QiIDogIm1hbmlmZXN0IGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2ZyYW1ld29ya2FkbWluL0J1bmRsZXNTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2ZyYW1ld29ya2FkbWluL0J1bmRsZXNTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzEzNzNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9CdW5kbGVzU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbjsKLQotLyoqCi0gKiBUaGlzIEFQSSBpcyB1c2VkIGZvciBleHBlY3RpbmcgYnVuZGxlcyBzdGF0ZSB2aXJ0dWFsbHkuCi0gKiAKLSAqIFRoaXMgb2JqZWN0IGlzIGluc3RhbnRpYXRlZCBieSB7QGxpbmsgTWFuaXB1bGF0b3IjZ2V0QnVuZGxlc1N0YXRlKCl9LgotICogQXQgaXRzIGluc3RhbnRpYXRpb24sIHN0YXRlIG9mIHRoZSBidW5kbGVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIG9iamVjdCAKLSAqIGFjY29yZGluZyB0byB0aGUgcGFyYW1ldGVycyB3aGljaCB0aGUgY2FsbGluZyB7QGxpbmsgTWFuaXB1bGF0b3J9IG9iamVjdCBoYXMuCi0gKiBGb3IgaXRzIGNyZWF0aW9uLCBpbmZvcm1hdGlvbiBpbiB0aGUgZncgcGVyc2lzdGVudCBkYXRhIHdpbGwgYmUgdGFrZW4gaW50byBhY2NvdW50LiAKLSAqIAotICogTW9kaWZpY2F0aW9uIG9mIHRoaXMgb2JqZWN0IGFmdGVyIGl0cyBpbnN0YW50aWF0aW9uIG5ldmVyIGFmZmVjdHMgdGhlIHBhcmFtZXRlcnMKLSAqIGluIHRoZSBjYWxsaW5nIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0LiAgCi0gKiAgCi0gKiBYWFggSW1wbGVtZW50YXRpb24gb2YgU2ltcGxlIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yIG5lZWRzIHRoZSBmdW5jdGlvbnMuICAgCi0gKiAgCi0gKiBAc2VlIE1hbmlwdWxhdG9yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQnVuZGxlc1N0YXRlIHsKLQotCS8qKiBSZXR1cm4gZXhwZWN0ZWQgYnVuZGxlcyBzdGF0ZSBjdXJyZW50bHkga2VwdCBpbiB0aGlzIG9iamVjdC4gCi0JICogCi0JICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgdHJ5IHRvIHJlc29sdmUgdGhlIHN0YXRlCi0JICogaWYgcmVzb2x2aW5nIGEgc3RhdGUgaXMgc3VwcG9ydGVkLgotCSAqIAotCSAqIEByZXR1cm4gYnVuZGxlIGFycmF5IG9mIEJ1bmRsZUluZm8gY3VycmVudGx5IGNvbXBvc2VkIGluIHRoaXMgb2JqZWN0LgotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIC0gSWYgdGhlIHtAbGluayBGcmFtZXdvcmtBZG1pbn0gc2VydmljZSBjcmVhdGVkIHRoZSBwYXJlbnQge0BsaW5rIE1hbmlwdWxhdG9yfSBpcyB1bnJlZ2lzdGVyZWQuIAotCSAqLwotCUJ1bmRsZUluZm9bXSBnZXRFeHBlY3RlZFN0YXRlKCkgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbjsKLQotCS8qKgkKLQkgKiBSZXR1cm4gcmVxdWlyZWQgYnVuZGxlcyB0byBiZSByZXNvbHZlIHRoZSBzcGVjaWZpZWQgYkluZm8KLQkgKiB1bmRlciB0aGUgc3RhdGUgY3VycmVudGx5IGNvbXBvc2VkLiAgCi0JICogCi0JICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgdHJ5IHRvIHJlc29sdmUgdGhlIHN0YXRlCi0JICogaWYgcmVzb2x2aW5nIGEgc3RhdGUgaXMgc3VwcG9ydGVkLiAKLQkgKiAKLQkgKiBAcGFyYW0gYkluZm8gYnVuZGxlaW5mbyB3aG9zZSBwcmVyZXF1aXNpdGUgYnVuZGxlcyB3aWxsIGJlIHNlYXJjaGVkLgotCSAqIEByZXR1cm4gYnVuZGxlIGFycmF5IG9mIEJ1bmRsZUluZm9zIHJlcXVpcmVkIGZvciB0aGUgc3BlY2lmaWVkIGJJbmZvIHRvIGJlIHJlc29sdmVkLiAKLQkgKi8KLQlCdW5kbGVJbmZvW10gZ2V0UHJlcmVxdWlzdGVCdW5kbGVzKEJ1bmRsZUluZm8gYkluZm8pOwotCi0JLyoqCi0JICogUmV0dXJuIGEgYnVuZGxlIHRvIGJlIHVzZWQgYXMgYSBmcmFtZXdvcmsgdW5kZXIgdGhlIHN0YXRlIGN1cnJlbnRseSBjb21wb3NlZC4gIAotCSAqIEByZXR1cm4gYSBidW5kbGUgdG8gYmUgdXNlZCBhcyBhIGZyYW1ld29yayB1bmRlciB0aGUgc3RhdGUgY3VycmVudGx5IGNvbXBvc2VkLiAKLQkgKi8KLQlwdWJsaWMgQnVuZGxlSW5mbyBnZXRTeXN0ZW1CdW5kbGUoKTsKLQotCS8qKgotCSAqIFJldHVybiBidW5kbGVzIHdoaWNoIGFyZSBmcmFnbWVudCBidW5kbGVzIG9mIHRoZSBmcmFtZXdvcmsgdW5kZXIgdGhlIHN0YXRlIGN1cnJlbnRseSBjb21wb3NlZC4gIAotCSAqIEByZXR1cm4gYXJyYXkgb2YgQnVuZGxlSW5mb3Mgd2hpY2ggYXJlIGZyYWdtZW50IGJ1bmRsZXMgb2YgdGhlIGZyYW1ld29yay4KLQkgKi8KLQlwdWJsaWMgQnVuZGxlSW5mb1tdIGdldFN5c3RlbUZyYWdtZW50ZWRCdW5kbGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYXJyYXkgb2YgU3RyaW5ncyB3aGljaCB0ZWxscyB0aGUgdW5zYXRpc2ZpZWQgY29uc3RhaW50cwotCSAqIHRvIHJlc29sdmUgdGhlIHNwZWNpZmllZCBiSW5mbyB1bmRlciB0aGUgc3RhdGUgY3VycmVudGx5IGNvbXBvc2VkLiAgCi0JICogCi0JICogSWYgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgcmVzb2x2aW5nIHN0YXRlLAotCSAqIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB3aXRoIGEgY2F1c2Ugb2Yge0B2YWx1ZSBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24jVU5TVVBQT1JURURfT1BFUkFUSU9OfQotCSAqIHdpbGwgYmUgdGhyb3duLgotCSAqIAotCSAqIFhYWCB0aGlzIG1ldGhvZCBpcyBwcmVwYXJlZCBtYWlubHkgZm9yIGRlYnVnZ2luZy4gCi0JICogCi0JICogQHBhcmFtIGJJbmZvCi0JICogQHJldHVybiBhcnJheSBvZiBTdHJpbmdzIHdoaWNoIHRlbGxzIHRoZSB1bnNhdGlzZmllZCBjb25zdGFpbnRzLgotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIGlmIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IHJlc29sdmluZyBzdGF0ZSwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHdpdGggYSBjYXVzZSBvZiB7QHZhbHVlIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiNVTlNVUFBPUlRFRF9PUEVSQVRJT059ICB3aWxsIGJlIHRocm93bi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0VW5zYXRpc2ZpZWRDb25zdHJhaW50cyhCdW5kbGVJbmZvIGJJbmZvKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uOwotCi0JLyoqCi0JICogSW5zdGFsbCB0aGUgc3BlY2lmaWVkIGJJbmZvIGFzIGEgaW5zdGFsbGVkIGJ1bmRsZSB0byB0aGUgY3VycmVudCBzdGF0ZSB2aXJ0dWFsbHkuCi0JICogTm90ZSB0aGF0IHJlc29sdmUgdGhpcyBidW5kbGUgaXMgbm90IGRvbmUgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYkluZm8gQnVuZGxlSW5mbyB0byBiZSBpbnN0YWxsZWQKLQkgKiBAdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiAtIElmIHRoZSB7QGxpbmsgRnJhbWV3b3JrQWRtaW59IHNlcnZpY2UgY3JlYXRlZCB0aGUgcGFyZW50IHtAbGluayBNYW5pcHVsYXRvcn0gaXMgdW5yZWdpc3RlcmVkLiAKLQkgKi8KLQl2b2lkIGluc3RhbGxCdW5kbGUoQnVuZGxlSW5mbyBiSW5mbykgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgZnVsbCBmdW5jdGlvbnMsCi0JICogIHN1Y2ggYXMgcmVzb2x2aW5nIGJ1bmRsZXMgYW5kIC4KLQkgKiBPdGhlcndpc2UgZmFsc2Ugd2lsbCBiZSByZXR1cmVuZC4KLQkgKiBAcmV0dXJuICB0cnVlIGlmIHRoaXMgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgcmVzb2x2aW5nIHN0YXRlLiBPdGhlcndpc2UgZmFsc2UuCi0JICovCi0JYm9vbGVhbiBpc0Z1bGx5U3VwcG9ydGVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3RhdGUgY3VycmVudGx5IGNvbXBvc2VkIGlzIHJlc29sdmVkIGFmdGVyIHRoZSBsYXN0IGNoYW5nZSBvZiB0aGUgc3RhdGUuCi0JICogT3RoZXJ3aXNlIGZhbHNlLiAKLQkgKiAKLQkgKiBJZiB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCByZXNvbHZpbmcgc3RhdGUsCi0JICogRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHdpdGggYSBjYXVzZSBvZiB7QHZhbHVlIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiNVTlNVUFBPUlRFRF9PUEVSQVRJT059Ci0JICogd2lsbCBiZSB0aHJvd24uCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBzdGF0ZSBjdXJyZW50bHkgY29tcG9zZWQgaXMgcmVzb2x2ZWQgYWZ0ZXIgdGhlIGxhc3QgY2hhbmdlIG9mIHRoZSBzdGF0ZS4gT3RoZXJ3aXNlIGZhbHNlLiAKLQkgKiBAdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiBpZiB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCByZXNvbHZpbmcgc3RhdGUsIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB3aXRoIGEgY2F1c2Ugb2Yge0B2YWx1ZSBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24jVU5TVVBQT1JURURfT1BFUkFUSU9OfSAgd2lsbCBiZSB0aHJvd24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGJ1bmRsZSBpcyByZXNvbHZlZC4KLQkgKiBPdGhlcndpc2UgZmFsc2UuIAotCSAqIAotCSAqIElmIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IHJlc29sdmluZyBzdGF0ZSwKLQkgKiBGd0xhdW5jaGVyRXhjZXB0aW9uIHdpdGggYSBjYXVzZSBvZiB7QHZhbHVlIEZ3TGF1bmNoZXJFeGNlcHRpb24jVU5TVVBQT1JURURfT1BFUkFUSU9OfQotCSAqIHdpbGwgYmUgdGhyb3duLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGJ1bmRsZSBpcyByZXNvbHZlZC4gT3RoZXJ3aXNlIGZhbHNlLiAKLQkgKiBAdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiBpZiB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCByZXNvbHZpbmcgc3RhdGUsIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB3aXRoIGEgY2F1c2Ugb2Yge0B2YWx1ZSBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24jVU5TVVBQT1JURURfT1BFUkFUSU9OfSAgd2lsbCBiZSB0aHJvd24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZChCdW5kbGVJbmZvIGJJbmZvKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uOwotCi0JLyoqCQotCSAqIFJlc29sdmVzIHRoZSBjb25zdHJhaW50cyBjb250YWluZWQgaW4gdGhpcyBzdGF0ZS4KLQkgKiAKLQkgKiBJZiB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCByZXNvbHZpbmcgc3RhdGUsCi0JICogRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHdpdGggYSBjYXVzZSBvZiB7QHZhbHVlIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiNVTlNVUFBPUlRFRF9PUEVSQVRJT059Ci0JICogd2lsbCBiZSB0aHJvd24uCi0JICogCSAKLQkgKiBAcGFyYW0gaW5jcmVtZW50YWwgYSBmbGFnIGNvbnRyb2xsaW5nIHdoZXRoZXIgcmVzb2x1dGlvbiBzaG91bGQgYmUgaW5jcmVtZW50YWwKLQkgKiBAdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiAKLQkgKi8KLQl2b2lkIHJlc29sdmUoYm9vbGVhbiBpbmNyZW1lbnQpIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBVbmluc3RhbGwgdGhlIHNwZWNpZmllZCBiSW5mbyBmcm9tIHRoZSBjdXJyZW50IHN0YXRlIHZpcnR1YWxseS4gCi0JICogCi0JICogQHBhcmFtIGJJbmZvIEJ1bmRsZUluZm8gdG8gYmUgdW5pbnN0YWxsZWQKLQkgKiBAdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiAtIElmIHRoZSB7QGxpbmsgRnJhbWV3b3JrQWRtaW59IHNlcnZpY2UgY3JlYXRlZCB0aGUgcGFyZW50IHtAbGluayBNYW5pcHVsYXRvcn0gaXMgdW5yZWdpc3RlcmVkLiAKLQkgKi8KLQl2b2lkIHVuaW5zdGFsbEJ1bmRsZShCdW5kbGVJbmZvIGJJbmZvKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uOzsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9Db25maWdEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vQ29uZmlnRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWU2YmYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9Db25maWdEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoaXMgb2JqZWN0IGlzIGluc3RhbnRpYXRlZCBieSB7QGxpbmsgTWFuaXB1bGF0b3IjZ2V0Q29uZmlnRGF0YSgpfTsKLSAqIFRoZSBjbGFzcyB0aGF0IGtlZXBzIHNvbWUgcGFyYW1ldGVycyBvZiB0aGUge0BsaW5rIE1hbmlwdWxhdG9yfQotICogY3JlYXRlZCB0aGlzIG9iamVjdC4gVGhlIG1hbmlwdWxhdGluZyBvZiB0aGUgcGFyYW1ldGVycyB3aWxsIGFmZmVjdAotICogdGhlICB7QGxpbmsgTWFuaXB1bGF0b3J9LgotICogICAKLSAqIEBzZWUgTWFuaXB1bGF0b3IKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ0RhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBhcHBlbmRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgdG8sIFByb3BlcnRpZXMgZnJvbSkgewotCQlpZiAoZnJvbSAhPSBudWxsKSB7Ci0JCQlpZiAodG8gPT0gbnVsbCkKLQkJCQl0byA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQkvLwkJCXByaW50b3V0UHJvcGVydGllcyhTeXN0ZW0ub3V0LCAidG8iLCB0byk7Ci0JCQkvLwkJCXByaW50b3V0UHJvcGVydGllcyhTeXN0ZW0ub3V0LCAiZnJvbSIsIGZyb20pOwotCi0JCQlmb3IgKEVudW1lcmF0aW9uIGVudW1lcmF0aW9uID0gZnJvbS5rZXlzKCk7IGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotCQkJCXRvLnNldFByb3BlcnR5KGtleSwgZnJvbS5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJCX0KLQkJfQotCQkvLwkJcHJpbnRvdXRQcm9wZXJ0aWVzKFN5c3RlbS5vdXQsICJ0byIsIHRvKTsKLQkJcmV0dXJuIHRvOwotCX0KLQotCWZpbmFsIHByaXZhdGUgU3RyaW5nIGZ3TmFtZTsKLQlmaW5hbCBwcml2YXRlIFN0cmluZyBmd1ZlcnNpb247Ci0JZmluYWwgcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZXJOYW1lOwotCWZpbmFsIHByaXZhdGUgU3RyaW5nIGxhdW5jaGVyVmVyc2lvbjsKLQlwcml2YXRlIGludCBiZWdpbm5pbmdGd1N0YXJ0TGV2ZWwgPSBCdW5kbGVJbmZvLk5PX0xFVkVMOwotCXByaXZhdGUgaW50IGluaXRpYWxCdW5kbGVTdGFydExldmVsID0gQnVuZGxlSW5mby5OT19MRVZFTDsKLQkvLyBMaXN0IG9mIEJ1bmRsZUluZm8KLQlwcml2YXRlIExpbmtlZEhhc2hTZXQgYnVuZGxlc0xpc3QgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCXByaXZhdGUgUHJvcGVydGllcyBmd0luZGVwZW5kZW50UHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGZ3RGVwZW5kZW50UHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCi0JcHVibGljIENvbmZpZ0RhdGEoU3RyaW5nIGZ3TmFtZSwgU3RyaW5nIGZ3VmVyc2lvbiwgU3RyaW5nIGxhdW5jaGVyTmFtZSwgU3RyaW5nIGxhdW5jaGVyVmVyc2lvbikgewotCQl0aGlzLmZ3TmFtZSA9IGZ3TmFtZTsKLQkJdGhpcy5md1ZlcnNpb24gPSBmd1ZlcnNpb247Ci0JCXRoaXMubGF1bmNoZXJOYW1lID0gbGF1bmNoZXJOYW1lOwotCQl0aGlzLmxhdW5jaGVyVmVyc2lvbiA9IGxhdW5jaGVyVmVyc2lvbjsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlKEJ1bmRsZUluZm8gYnVuZGxlSW5mbykgewotCQl0aGlzLmJ1bmRsZXNMaXN0LmFkZChidW5kbGVJbmZvKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEJlZ2luaW5nRndTdGFydExldmVsKCkgewotCQlyZXR1cm4gdGhpcy5iZWdpbm5pbmdGd1N0YXJ0TGV2ZWw7Ci0JfQotCi0JcHVibGljIEJ1bmRsZUluZm9bXSBnZXRCdW5kbGVzKCkgewotCQlpZiAoYnVuZGxlc0xpc3Quc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbmV3IEJ1bmRsZUluZm9bMF07Ci0JCUJ1bmRsZUluZm9bXSByZXQgPSBuZXcgQnVuZGxlSW5mb1tidW5kbGVzTGlzdC5zaXplKCldOwotCQlidW5kbGVzTGlzdC50b0FycmF5KHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGd0RlcGVuZGVudFByb3AoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZndEZXBlbmRlbnRQcm9wcy5nZXRQcm9wZXJ0eShrZXkpOwotCX0KLQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldEZ3RGVwZW5kZW50UHJvcHMoKSB7Ci0JCVByb3BlcnRpZXMgcmV0ID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJYXBwZW5kUHJvcGVydGllcyhyZXQsIGZ3RGVwZW5kZW50UHJvcHMpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RndJbmRlcGVuZGVudFByb3AoU3RyaW5nIGtleSkgewotCQlyZXR1cm4gZndJbmRlcGVuZGVudFByb3BzLmdldFByb3BlcnR5KGtleSk7Ci0JfQotCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0RndJbmRlcGVuZGVudFByb3BzKCkgewotCQlQcm9wZXJ0aWVzIHJldCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCWFwcGVuZFByb3BlcnRpZXMocmV0LCBmd0luZGVwZW5kZW50UHJvcHMpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RndOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5md05hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGd1ZlcnNpb24oKSB7Ci0JCXJldHVybiB0aGlzLmZ3VmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEluaXRpYWxCdW5kbGVTdGFydExldmVsKCkgewotCQlyZXR1cm4gdGhpcy5pbml0aWFsQnVuZGxlU3RhcnRMZXZlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVyTmFtZSgpIHsKLQkJcmV0dXJuIGxhdW5jaGVyTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVyVmVyc2lvbigpIHsKLQkJcmV0dXJuIGxhdW5jaGVyVmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQl0aGlzLmJlZ2lubmluZ0Z3U3RhcnRMZXZlbCA9IEJ1bmRsZUluZm8uTk9fTEVWRUw7Ci0JCXRoaXMuaW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwgPSBCdW5kbGVJbmZvLk5PX0xFVkVMOwotCQl0aGlzLmJ1bmRsZXNMaXN0LmNsZWFyKCk7Ci0JCXRoaXMuZndJbmRlcGVuZGVudFByb3BzLmNsZWFyKCk7Ci0JCXRoaXMuZndEZXBlbmRlbnRQcm9wcy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUJ1bmRsZShCdW5kbGVJbmZvIGJ1bmRsZUluZm8pIHsKLQkJdGhpcy5idW5kbGVzTGlzdC5yZW1vdmUoYnVuZGxlSW5mbyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmVnaW5uaW5nRndTdGFydExldmVsKGludCBzdGFydExldmVsKSB7Ci0JCXRoaXMuYmVnaW5uaW5nRndTdGFydExldmVsID0gc3RhcnRMZXZlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdW5kbGVzKEJ1bmRsZUluZm9bXSBidW5kbGVJbmZvcykgewotCQl0aGlzLmJ1bmRsZXNMaXN0LmNsZWFyKCk7Ci0JCWlmIChidW5kbGVJbmZvcyAhPSBudWxsKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVJbmZvcy5sZW5ndGg7IGkrKykKLQkJCQlidW5kbGVzTGlzdC5hZGQoYnVuZGxlSW5mb3NbaV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZ3RGVwZW5kZW50UHJvcChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5md0RlcGVuZGVudFByb3BzLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZ3RGVwZW5kZW50UHJvcHMoUHJvcGVydGllcyBwcm9wcykgewotCQl0aGlzLmZ3RGVwZW5kZW50UHJvcHMuY2xlYXIoKTsKLQkJYXBwZW5kUHJvcGVydGllcyhmd0RlcGVuZGVudFByb3BzLCBwcm9wcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RndJbmRlcGVuZGVudFByb3AoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRoaXMuZndJbmRlcGVuZGVudFByb3BzLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZ3SW5kZXBlbmRlbnRQcm9wcyhQcm9wZXJ0aWVzIHByb3BzKSB7Ci0JCXRoaXMuZndJbmRlcGVuZGVudFByb3BzLmNsZWFyKCk7Ci0JCWFwcGVuZFByb3BlcnRpZXMoZndJbmRlcGVuZGVudFByb3BzLCBwcm9wcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwoaW50IHN0YXJ0TGV2ZWwpIHsKLQkJdGhpcy5pbml0aWFsQnVuZGxlU3RhcnRMZXZlbCA9IHN0YXJ0TGV2ZWw7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQoIkNsYXNzOiIgKyB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIlxuIik7Ci0JCXNiLmFwcGVuZCgiPT09PT09PT09PT09SW5kZXBlbmRlbnQ9PT09PT09PT09PT09PT1cbiIpOwotCQlzYi5hcHBlbmQoImZ3TmFtZT0iICsgdGhpcy5md05hbWUgKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCJmd1ZlcnNpb249IiArIHRoaXMuZndWZXJzaW9uICsgIlxuIik7Ci0JCXNiLmFwcGVuZCgibGF1bmNoZXJOYW1lPSIgKyB0aGlzLmxhdW5jaGVyTmFtZSArICJcbiIpOwotCQlzYi5hcHBlbmQoImxhdW5jaGVyVmVyc2lvbj0iICsgdGhpcy5sYXVuY2hlclZlcnNpb24gKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCJiZWdpbm5pbmdGd1N0YXJ0TGV2ZWw9IiArIHRoaXMuYmVnaW5uaW5nRndTdGFydExldmVsICsgIlxuIik7Ci0JCXNiLmFwcGVuZCgiaW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWw9IiArIHRoaXMuaW5pdGlhbEJ1bmRsZVN0YXJ0TGV2ZWwgKyAiXG4iKTsKLQkJaWYgKHRoaXMuYnVuZGxlc0xpc3Quc2l6ZSgpID09IDApCi0JCQlzYi5hcHBlbmQoImJ1bmRsZXNMaXN0PW51bGxcbiIpOwotCQllbHNlIHsKLQkJCXNiLmFwcGVuZCgiYnVuZGxlc0xpc3Q9XG4iKTsKLQkJCWludCBpID0gMDsKLQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHRoaXMuYnVuZGxlc0xpc3QuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJc2IuYXBwZW5kKCJcdGJ1bmRsZXNMaXN0WyIgKyBpICsgIl09IiArIGl0ZXIubmV4dCgpLnRvU3RyaW5nKCkgKyAiXG4iKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQotCQlzYi5hcHBlbmQoIj09PT09PT09PT09PSBGdyBJbmRlcGVuZGVudCBQcm9wcyA9PT09PT09PT09PT09PT1cbiIpOwotCQlzYi5hcHBlbmQoImZ3SW5kZXBlbmRlbnRQcm9wcz0iKTsKLQkJc2V0UHJvcHNTdHJpbmdzKHNiLCBmd0luZGVwZW5kZW50UHJvcHMpOwotCQlzYi5hcHBlbmQoIj09PT09PT09PT09PSBGdyBEZXBlbmRlbnQgUHJvcHMgPT09PT09PT09PT09PT09XG4iKTsKLQkJc2IuYXBwZW5kKCJmd0RlcGVuZGVudFByb3BzPSIpOwotCQlzZXRQcm9wc1N0cmluZ3Moc2IsIGZ3RGVwZW5kZW50UHJvcHMpOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFByb3BzU3RyaW5ncyhTdHJpbmdCdWZmZXIgc2IsIFByb3BlcnRpZXMgcHJvcHMpIHsKLQkJaWYgKHByb3BzLnNpemUoKSA+IDApIHsKLQkJCXNiLmFwcGVuZCgiXG4iKTsKLQkJCWZvciAoRW51bWVyYXRpb24gZW51bWVyYXRpb24gPSBwcm9wcy5rZXlzKCk7IGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnVtZXJhdGlvbi5uZXh0RWxlbWVudCgpOwotCQkJCVN0cmluZyB2YWx1ZSA9IHByb3BzLmdldFByb3BlcnR5KGtleSk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuZXF1YWxzKCIiKSkKLQkJCQkJY29udGludWU7Ci0JCQkJc2IuYXBwZW5kKCJcdHsiICsga2V5ICsgIiAsXHQiICsgdmFsdWUgKyAifVxuIik7Ci0JCQl9Ci0JCX0gZWxzZQotCQkJc2IuYXBwZW5kKCJlbXB0eVxuIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2ZyYW1ld29ya2FkbWluL0ZyYW1ld29ya0FkbWluLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vRnJhbWV3b3JrQWRtaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0NTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vRnJhbWV3b3JrQWRtaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIEFQSSB3aWxsIGJlIHJlZ2lzdGVyZWQgdG8gdGhlIHNlcnZpY2UgCi0gKiByZWdpc3RyeSBhcyBhbiBPU0dpIHNlcnZpY2UuCi0gKiAKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAxLiBGb3IgZGV2ZWxvcGVycyB3aG8gaW1wbGVtZW50IGJ1bmRsZXMgdGhhdCByZWdpc3RlciB0aGlzIHNlcnZpY2UuCi0gKiAKLSAqIFVwb24gcmVnaXN0cmF0aW9uLCB0aGUgZm9sbG93aW5nIHNlcnZpY2UgcHJvcGVydGllcyBtdXN0IGJlIHNldCB0byBhbGxvdyBjbGllbnRzIHRvIAotICogc2VhcmNoIHRoZSBGcmFtZXdvcmtBZG1pbiBvYmplY3QsIHdoaWNoIHdpbGwgY3JlYXRlIEJ1bmRsZXNTdGF0ZSAvIENvbmZpZ0RhdGEgLyBMYXVuY2hlckRhdGEgb2JqZWN0cy4KLSAqIAotICoge0BsaW5rIEZyYW1ld29ya0FkbWluI1NFUlZJQ0VfUFJPUF9LRVlfRldfTkFNRX06IFN0cmluZzsgbmFtZSBvZiB0aGUgZnJhbWV3b3JrIAotICoge0BsaW5rIEZyYW1ld29ya0FkbWluI1NFUlZJQ0VfUFJPUF9LRVlfRldfVkVSU0lPTn06IFN0cmluZzsgdmVyc2lvbiBvZiB0aGUgZnJhbWV3b3JrCi0gKiB7QGxpbmsgRnJhbWV3b3JrQWRtaW4jU0VSVklDRV9QUk9QX0tFWV9MQVVOQ0hFUl9OQU1FfTogU3RyaW5nOyBuYW1lIG9mIHRoZSBsYXVuY2hlciAKLSAqIHtAbGluayBGcmFtZXdvcmtBZG1pbiNTRVJWSUNFX1BST1BfS0VZX0xBVU5DSEVSX1ZFUlNJT059OiBTdHJpbmc7IHZlcnNpb24gb2YgdGhlIGxhdW5jaGVyIAotICoKLSAqIEJ1bmRsZXMgdGhhdCByZWdpc3RlciB0aGlzIHNlcnZpY2Ugd2lsbCBjaGVjayBpZiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgc3lzdGVtIGNhbiBiZSBtYW5pcHVsYXRlZCBieSAKLSAqIHRoaXMgRnJhbWV3b3JrQWRtaW4uIElmIHllcyBhbmQgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW4gY3JlYXRlIGFuIGluaXRpYWxpemVkIE1hbmlwdWxhdG9yIG9iamVjdAotICogYWNjb3JkaW5nIHRvIHRoZSBydW5uaW5nIGZyYW1ld29yayBhbmQgbGF1bmNoZXIsIGFkZCB0aGUgc2VydmljZSBwcm9wZXJ0eSBrZXllZCBieSAKLSAqIAotICoge0BsaW5rIEZyYW1ld29ya0FkbWluI1NFUlZJQ0VfUFJPUF9LRVlfUlVOTklOR19TWVNURU1fRkxBR306IFN0cmluZzsgaWYgInRydWUiLCAKLSAqIHRoZSBzZXJ2aWNlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSBnZXRSdW5uaW5nTWFuaXB1bGF0b3IoKSBpcyBmdWxseSBpbml0aWFsaXplZCB0byAKLSAqIHJlcHJlc2VudCB0aGUgc3RhdGUgb2YgdGhlIHJ1bm5pbmcgc3lzdGVtLgotICogICAgIAotICogSXQgaXMgcmVjb21tZW5kZWQgdG8gaW1wbGVtZW50IE1hbmlwdWxhdG9yIG9iamVjdHMgY3JlYXRlZCBieSBjYWxsaW5nIG1ldGhvZHMgb2YgdGhpcyBpbnRlcmZhY2UKLSAqIHNvIHRoYXQgdGhleSBjYW5ub3QgYmUgdXNlZCBhZnRlciB0aGlzIHNlcnZpY2UgaXMgdW5yZWdpc3RlcmVkLiAgCi0gKiAgICAgCi0gKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogMi4gRm9yIGRldmVsb3BlcnMgd2hvIGltcGxlbWVudCBjbGllbnQgYnVuZGxlcyB0aGF0IHVzZSB0aGlzIHNlcnZpY2UuCi0gKiAKLSAqIEEgY2xpZW50IG9mIHRoaXMgc2VydmljZSBjYW4gb2J0YWluIGEgTWFuaXB1bGF0b3Igb2JqZWN0IGJ5IGNhbGxpbmcgdGhlIHtAbGluayAjZ2V0TWFuaXB1bGF0b3IoKX0gbWV0aG9kLgotICogCi0gKiBBIGNsaWVudCBjYW4gc2VhcmNoIGFtb25nIHNlcnZpY2VzIHJlZ2lzdGVyZWQgaW4gYSBzZXJ2aWNlIHJlZ2lzdHJ5IHRvIGZpbmQgdGhlIAotICogZGVzaXJlZCBGcmFtZXdvcmtBZG1pbiBpbXBsZW1lbnRhdGlvbiB0aGF0IG1hdGNoZXMgdGhlIGRlc2lyZWQgZnJhbWV3b3JrIAotICogdHlwZSwgZnJhbWV3b3JrIHZlcnNpb24sIGxhdW5jaGVyIHR5cGUsIGFuZCBsYXVuY2hlciB2ZXJzaW9uLgotICogCi0gKiBJbiBvcmRlciBmb3IgYSBjbGllbnQgYnVuZGxlIHRvIG1hbmlwdWxhdGUgdGhlIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0IAotICogb2YgdGhlIHJ1bm5pbmcgZnJhbWV3b3JrIGFuZCBsYXVuY2hlciwgdGhlIHNlcnZpY2UgZmlsdGVyIChGcmFtZXdvcmtBZG1pbiNTRVJWSUNFX1BST1BfS0VZX1JVTk5JTkdfRldfRkxBRz10cnVlKSAKLSAqIHNob3VsZCBiZSB1c2VkLiAgIAotICogCi0gKiBBcyB3aXRoIGFsbCBPU0dpIHNlcnZpY2VzLCB0aGUgY2xpZW50IGJ1bmRsZSBzaG91bGQgdHJhY2sgdGhpcyBzZXJ2aWNlIHN0YXRlLgotICogSWYgdGhlIHNlcnZpY2UgaXMgdW5yZWdpc3RlcmVkLCBpdCBzaG91bGQgc3RvcCB1c2luZyBhbnkgb2YgdGhlIG9iamVjdHMgb2J0YWluZWQgZnJvbSB0aGlzIHNlcnZpY2UgYW5kIAotICogcmVsZWFzZSB0aGVtLiBJZiBpdCBjb250aW51ZXMgdG8gdXNlIHRoZW0sIHtAbGluayBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb259IG1pZ2h0IAotICogYmUgdGhyb3duLiAKLSAqIAotICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEluIGFkZGl0aW9uLCBGcmFtZXdvcmtBZG1pbkZhY3Rvcnkgd2lsbCBjcmVhdGUgdGhpcyBvYmplY3QuIFRoaXMgaXMgdXNlZCBieSBKYXZhIHByb2dyYW1zLgotICogCi0gKiBAc2VlIEZyYW1ld29ya0FkbWluRmFjdG9yeQotICogICAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRnJhbWV3b3JrQWRtaW4gewotCi0JU3RyaW5nIFNFUlZJQ0VfUFJPUF9LRVlfRldfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2hhbmRsZXIuZnJhbWV3b3JrLm5hbWUiOwotCVN0cmluZyBTRVJWSUNFX1BST1BfS0VZX0ZXX1ZFUlNJT04gPSAib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmtoYW5kbGVyLmZyYW1ld29yay52ZXJzaW9uIjsKLQotCVN0cmluZyBTRVJWSUNFX1BST1BfS0VZX0xBVU5DSEVSX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmtoYW5kbGVyLmxhdW5jaGVyLm5hbWUiOwotCVN0cmluZyBTRVJWSUNFX1BST1BfS0VZX0xBVU5DSEVSX1ZFUlNJT04gPSAib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmtoYW5kbGVyLmxhdW5jaGVyLnZlcnNpb24iOwotCVN0cmluZyBTRVJWSUNFX1BST1BfS0VZX1JVTk5JTkdfU1lTVEVNX0ZMQUcgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmtoYW5kbGVyLnJ1bm5pbmdmd2ZsYWciOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgTWFuaXB1bGF0b3J9IGFuZCByZXR1cm4gaXQuCi0JICogCi0JICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgTWFuaXB1bGF0b3IuCi0JICovCi0JcHVibGljIE1hbmlwdWxhdG9yIGdldE1hbmlwdWxhdG9yKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIHtAbGluayBNYW5pcHVsYXRvcn0gZm9yIHJ1bm5pbmcgc3lzdGVtIAotCSAqIGFuZCByZXR1cm4gaXQuIFRoZSBpbnN0YW5jZSBtdXN0IGJlIGluaXRpYWxpemVkIGZ1bGx5IGFjY29yZGluZyB0byB0aGUgCi0JICogcnVubmluZyBlbnZpcm9ubWVudC4gSWYgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW5ub3QgcHJvdmlkZSBpdCwgcmV0dXJuIG51bGwuCi0JICogCi0JICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgTWFuaXB1bGF0b3IuCi0JICovCi0JcHVibGljIE1hbmlwdWxhdG9yIGdldFJ1bm5pbmdNYW5pcHVsYXRvcigpOwotCi0JLyoqCi0JICogTGF1bmNoIGEgZnJhbWV3b3JrIGluc3RhbmNlIHVuZGVyIHRoZSBzcGVjaWZpZWQgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gCi0JICogCi0JICogQHBhcmFtIG1hbmlwdWxhdG9yIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0IHRvIGJlIGxhdW5jaGVkLgotCSAqIEBwYXJhbSBjd2QgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSB0byBiZSB1c2VkIGZvciBsYXVuY2hpbmcuCi0JICogQHJldHVybiBwcm9jZXNzCi0JICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc3BlY2lmaWVkIGFyZ3VtZW50cyBhcmUgbnVsbC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFueSBlcnJvciByZWxhdGUgd2l0aCBJTyBvY2N1cnMKLQkgKiBAdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiBpZiB0aGUgRnJhbWV3b3JrQWRtaW4gc2VydmljZSBvYmplY3QKLQkgKiAJCSB0aGF0IGNyZWF0ZWQgdGhlIHNwZWNpZmllZCBNYW5pcHVsYXRvciBvYmplY3QgaXMgdW5yZWdpc3RlcmVkLgotCSAqLwotCXB1YmxpYyBQcm9jZXNzIGxhdW5jaChNYW5pcHVsYXRvciBtYW5pcHVsYXRvciwgRmlsZSBjd2QpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiAJCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgb2JqZWN0IGlzIGFjdGl2ZS4gZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vRnJhbWV3b3JrQWRtaW5GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vRnJhbWV3b3JrQWRtaW5GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NzA0NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2ZyYW1ld29ya2FkbWluL0ZyYW1ld29ya0FkbWluRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW47Ci0KLS8qKgotICogRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgRnJhbWV3b3JrQWRtaW4gb2JqZWN0IGZyb20gSmF2YSBwcm9ncmFtcy4KLSAqIAotICogIEBzZWUgRnJhbWV3b3JrQWRtaW4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEZyYW1ld29ya0FkbWluRmFjdG9yeSB7Ci0JYWJzdHJhY3QgcHJvdGVjdGVkIEZyYW1ld29ya0FkbWluIGNyZWF0ZUZyYW1ld29ya0FkbWluKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb247Ci0KLQkvLyBwcm9wb3NlZCBtZXRob2Q6IG9ubHkgZm9yIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeSwgbWFnaWMgc3lzdGVtIHByb3BlcnR5IGlzIHVzZWQuCi0JcHVibGljIHN0YXRpYyBGcmFtZXdvcmtBZG1pbiBnZXRJbnN0YW5jZShTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCUZyYW1ld29ya0FkbWluRmFjdG9yeSBmYWN0b3J5ID0gKEZyYW1ld29ya0FkbWluRmFjdG9yeSkgQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JCXJldHVybiAoRnJhbWV3b3JrQWRtaW4pIGZhY3RvcnkuY3JlYXRlRnJhbWV3b3JrQWRtaW4oKTsKLQl9Ci0KLQkvLyAgLy8gbWV0aG9kIDM6IHR3byBtYWdpYyBzeXN0ZW0gcHJvcGVydGllcyBhcmUgdXNlZC4KLQkvLwlwdWJsaWMgc3RhdGljIEZyYW1ld29ya0FkbWluIGdldEluc3RhbmNlKCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCS8vCQlTdHJpbmcgY2xhc3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLmZyYW1ld29ya0FkbWluRmFjdG9yeSIpOwotCS8vCQlpZiAoY2xhc3NOYW1lID09IG51bGwpCi0JLy8JCQl0aHJvdyBuZXcgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigiU3lzdGVtIHByb3BlcnR5IGtleWVkIGJ5IFwib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5mcmFtZXdvcmtBZG1pbkZhY3RvcnlcIiBpcyBub3Qgc2V0LiIpOwotCS8vCQlGcmFtZXdvcmtBZG1pbkZhY3RvcnkgZmFjdG9yeSA9IChGcmFtZXdvcmtBZG1pbkZhY3RvcnkpIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCS8vCQlyZXR1cm4gKEZyYW1ld29ya0FkbWluKSBmYWN0b3J5LmNyZWF0ZUZyYW1ld29ya0FkbWluKCk7Ci0JLy8JfQotCi0JLy8gIC8vIG1ldGhvZCAxOiBubyBtYWdpYyBzeXN0ZW0gcHJvcGVydGllcyBhcmUgdXNlZC4KLQkvLwotCS8vCXB1YmxpYyBzdGF0aWMgRnJhbWV3b3JrQWRtaW4gZ2V0SW5zdGFuY2UoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIGNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeU5hbWUpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkvLwkJRXh0ZW5kZWRGcmFtZXdvcmtBZG1pbkZhY3RvcnkgZmFjdG9yeSA9IChFeHRlbmRlZEZyYW1ld29ya0FkbWluRmFjdG9yeSkgQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpLm5ld0luc3RhbmNlKCk7Ci0JLy8JCXJldHVybiAoRnJhbWV3b3JrQWRtaW4pIGZhY3RvcnkuY3JlYXRlRnJhbWV3b3JrQWRtaW4oY29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5TmFtZSk7Ci0JLy8JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOTk2MDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2ZyYW1ld29ya2FkbWluL0ZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbjsKLQotcHVibGljIGNsYXNzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIyOTI0OTg2NzcwMDA3NzIzMTdMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FV09SS0FETUlOX1VOQVZBSUxBQkxFID0gIkZyYW1ld29ya0FkbWluIHNlcnZpY2UgY3JlYXRlZCB0aGlzIG9iamVjdCBpcyBub3QgYXZhaWxhYmxlIGFueSBtb3JlIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTlNVUFBPUlRFRF9PUEVSQVRJT04gPSAiVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGhpcyBtZXRob2QuIjsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHJlYXNvbjsKLQlwcml2YXRlIFRocm93YWJsZSBjYXVzZTsKLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICovCi0JcHVibGljIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIHJlYXNvbikgewotCQlzdXBlcihtZXNzYWdlKTsKLQkJdGhpcy5yZWFzb24gPSByZWFzb247Ci0JCXRoaXMuY2F1c2UgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogQHBhcmFtIGNhdXNlCi0JICovCi0JcHVibGljIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlLCBTdHJpbmcgcmVhc29uKSB7Ci0JCXN1cGVyKG1lc3NhZ2UpOwotCQl0aGlzLnJlYXNvbiA9IHJlYXNvbjsKLQkJdGhpcy5jYXVzZSAgPSBjYXVzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2F1c2UKLQkgKi8KLQlwdWJsaWMgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSwgU3RyaW5nIHJlYXNvbikgewotCQlzdXBlcihjYXVzZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl0aGlzLnJlYXNvbiA9IHJlYXNvbjsKLQkJdGhpcy5jYXVzZSA9IGNhdXNlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uKCkgewotCQlyZXR1cm4gcmVhc29uOwotCX0KLQotCXB1YmxpYyBUaHJvd2FibGUgZ2V0Q2F1c2UoKSB7Ci0JCXJldHVybiBjYXVzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vTGF1bmNoZXJEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vTGF1bmNoZXJEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOGZkNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL2ZyYW1ld29ya2FkbWluL0xhdW5jaGVyRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIFRoaXMgb2JqZWN0IGlzIGluc3RhbnRpYXRlZCBieSB7QGxpbmsgTWFuaXB1bGF0b3IjZ2V0TGF1bmNoZXJEYXRhKCl9OwotICogVGhlIGNsYXNzIHRoYXQga2VlcHMgc29tZSBwYXJhbWV0ZXJzIG9mIHRoZSB7QGxpbmsgTWFuaXB1bGF0b3J9Ci0gKiAgY3JlYXRlZCB0aGlzIG9iamVjdC4gVGhlIG1hbmlwdWxhdGluZyBvZiB0aGUgcGFyYW1ldGVycyB3aWxsIGFmZmVjdAotICogIHRoZSAge0BsaW5rIE1hbmlwdWxhdG9yfS4KLSAqICAKLSAqIAotICogQHNlZSBNYW5pcHVsYXRvcgotICovCi1wdWJsaWMgY2xhc3MgTGF1bmNoZXJEYXRhIHsKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE5VTExfU1RSSU5HUyA9IG5ldyBTdHJpbmdbMF07Ci0JcHJpdmF0ZSBGaWxlIGZ3UGVyc2lzdGVudERhdGFMb2NhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBGaWxlIGp2bSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGp2bUFyZ3MgPSBuZXcgTGlua2VkTGlzdCgpOwotCXByaXZhdGUgTGlzdCBwcm9ncmFtQXJncyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2xlYW47Ci0JcHJpdmF0ZSBGaWxlIGZ3Q29uZmlnTG9jYXRpb247Ci0JcHJpdmF0ZSBGaWxlIGhvbWUgPSBudWxsOwotCXByaXZhdGUgRmlsZSBmd0phciA9IG51bGw7Ci0KLQlwcml2YXRlIEZpbGUgbGF1bmNoZXIgPSBudWxsOwotCXByaXZhdGUgRmlsZSBsYXVuY2hlckNvbmZpZ0xvY2F0aW9uID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIGZ3TmFtZTsKLQlwcml2YXRlIFN0cmluZyBmd1ZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZXJOYW1lOwotCXByaXZhdGUgU3RyaW5nIGxhdW5jaGVyVmVyc2lvbjsKLQotCXB1YmxpYyBMYXVuY2hlckRhdGEoU3RyaW5nIGZ3TmFtZSwgU3RyaW5nIGZ3VmVyc2lvbiwgU3RyaW5nIGxhdW5jaGVyTmFtZSwgU3RyaW5nIGxhdW5jaGVyVmVyc2lvbikgewotCQl0aGlzLmZ3TmFtZSA9IGZ3TmFtZTsKLQkJdGhpcy5md1ZlcnNpb24gPSBmd1ZlcnNpb247Ci0JCXRoaXMubGF1bmNoZXJOYW1lID0gbGF1bmNoZXJOYW1lOwotCQl0aGlzLmxhdW5jaGVyVmVyc2lvbiA9IGxhdW5jaGVyVmVyc2lvbjsKLQkJdGhpcy5pbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSnZtQXJnKFN0cmluZyBhcmcpIHsKLQkJaWYgKGFyZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlqdm1BcmdzLmFkZChhcmcpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb2dyYW1BcmcoU3RyaW5nIGFyZykgewotCQlpZiAoYXJnID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXByb2dyYW1BcmdzLmFkZChhcmcpOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldEZ3Q29uZmlnTG9jYXRpb24oKSB7Ci0JCXJldHVybiBmd0NvbmZpZ0xvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldEZ3SmFyKCkgewotCQlyZXR1cm4gZndKYXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGd05hbWUoKSB7Ci0JCXJldHVybiBmd05hbWU7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0RndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKCkgewotCQlyZXR1cm4gZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RndWZXJzaW9uKCkgewotCQlyZXR1cm4gZndWZXJzaW9uOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldEhvbWUoKSB7Ci0JCXJldHVybiBob21lOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldEp2bSgpIHsKLQkJcmV0dXJuIGp2bTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SnZtQXJncygpIHsKLQkJU3RyaW5nW10gYXJncyA9IG5ldyBTdHJpbmdbanZtQXJncy5zaXplKCldOwotCQlqdm1BcmdzLnRvQXJyYXkoYXJncyk7Ci0JCXJldHVybiBhcmdzOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldExhdW5jaGVyKCkgewotCQlyZXR1cm4gbGF1bmNoZXI7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0TGF1bmNoZXJDb25maWdMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxhdW5jaGVyQ29uZmlnTG9jYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXVuY2hlck5hbWUoKSB7Ci0JCXJldHVybiBsYXVuY2hlck5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYXVuY2hlclZlcnNpb24oKSB7Ci0JCXJldHVybiBsYXVuY2hlclZlcnNpb247Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFByb2dyYW1BcmdzKCkgewotCQlTdHJpbmdbXSBhcmdzID0gbmV3IFN0cmluZ1twcm9ncmFtQXJncy5zaXplKCldOwotCQlwcm9ncmFtQXJncy50b0FycmF5KGFyZ3MpOwotCQlyZXR1cm4gYXJnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24gPSBudWxsOwotCQlqdm0gPSBudWxsOwotCQlqdm1BcmdzLmNsZWFyKCk7Ci0JCXByb2dyYW1BcmdzLmNsZWFyKCk7Ci0JCWNsZWFuID0gZmFsc2U7Ci0JCWZ3Q29uZmlnTG9jYXRpb24gPSBudWxsOwotCQlmd0phciA9IG51bGw7Ci0JCWxhdW5jaGVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NsZWFuKCkgewotCQlyZXR1cm4gY2xlYW47Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlSnZtQXJnKFN0cmluZyBhcmcpIHsKLQkJanZtQXJncy5yZW1vdmUoYXJnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9ncmFtQXJnKFN0cmluZyBhcmcpIHsKLQkJcHJvZ3JhbUFyZ3MucmVtb3ZlKGFyZyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RndDb25maWdMb2NhdGlvbihGaWxlIGZ3Q29uZmlnTG9jYXRpb24pIHsKLQkJdGhpcy5md0NvbmZpZ0xvY2F0aW9uID0gZndDb25maWdMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGd0phcihGaWxlIGZ3SmFyKSB7Ci0JCXRoaXMuZndKYXIgPSBmd0phcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGd1BlcnNpc3RlbnREYXRhTG9jYXRpb24oRmlsZSBmd1BlcnNpc3RlbnREYXRhTG9jYXRpb24sIGJvb2xlYW4gY2xlYW4pIHsKLQkJdGhpcy5md1BlcnNpc3RlbnREYXRhTG9jYXRpb24gPSBmd1BlcnNpc3RlbnREYXRhTG9jYXRpb247Ci0JCXRoaXMuY2xlYW4gPSBjbGVhbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIb21lKEZpbGUgaG9tZSkgewotCQl0aGlzLmhvbWUgPSBob21lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEp2bShGaWxlIGZpbGUpIHsKLQkJdGhpcy5qdm0gPSBmaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEp2bUFyZ3MoU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncyA9PSBudWxsIHx8IGFyZ3MubGVuZ3RoID09IDApIHsKLQkJCWp2bUFyZ3MuY2xlYXIoKTsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0JCQl0aGlzLmFkZEp2bUFyZyhhcmdzW2ldKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hlcihGaWxlIGxhdW5jaGVyRmlsZSkgewotCQlsYXVuY2hlciA9IGxhdW5jaGVyRmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hlckNvbmZpZ0xvY2F0aW9uKEZpbGUgbGF1bmNoZXJDb25maWdMb2NhdGlvbikgewotCQl0aGlzLmxhdW5jaGVyQ29uZmlnTG9jYXRpb24gPSBsYXVuY2hlckNvbmZpZ0xvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2dyYW1BcmdzKFN0cmluZ1tdIGFyZ3MpIHsKLQkJaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA9PSAwKSB7Ci0JCQlwcm9ncmFtQXJncy5jbGVhcigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykKLQkJCXRoaXMuYWRkUHJvZ3JhbUFyZyhhcmdzW2ldKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXNiLmFwcGVuZCgiQ2xhc3M6IiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCJmd05hbWU9IiArIHRoaXMuZndOYW1lICsgIlxuIik7Ci0JCXNiLmFwcGVuZCgiZndWZXJzaW9uPSIgKyB0aGlzLmZ3VmVyc2lvbiArICJcbiIpOwotCQlzYi5hcHBlbmQoImxhdW5jaGVyTmFtZT0iICsgdGhpcy5sYXVuY2hlck5hbWUgKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCJsYXVuY2hlclZlcnNpb249IiArIHRoaXMubGF1bmNoZXJWZXJzaW9uICsgIlxuIik7Ci0KLQkJc2IuYXBwZW5kKCJqdm09IiArIHRoaXMuanZtICsgIlxuIik7Ci0JCWlmICh0aGlzLmp2bUFyZ3Muc2l6ZSgpID09IDApCi0JCQlzYi5hcHBlbmQoImp2bUFyZ3MgPSBudWxsXG4iKTsKLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQoImp2bUFyZ3M9XG4iKTsKLQkJCWludCBpID0gMDsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBqdm1BcmdzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgaXRlcmF0b3IubmV4dCgpKQotCQkJCXNiLmFwcGVuZCgiXHRqdm1BcmdzWyIgKyBpKysgKyAiXT0iICsgaXRlcmF0b3IgKyAiXG4iKTsKLQotCQl9Ci0JCWlmICh0aGlzLnByb2dyYW1BcmdzLnNpemUoKSA9PSAwKQotCQkJc2IuYXBwZW5kKCJwcm9ncmFtQXJncyA9IG51bGxcbiIpOwotCQllbHNlIHsKLQkJCXNiLmFwcGVuZCgicHJvZ3JhbUFyZ3M9XG4iKTsKLQkJCWludCBpID0gMDsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBwcm9ncmFtQXJncy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7IGl0ZXJhdG9yLm5leHQoKSkKLQkJCQlzYi5hcHBlbmQoIlx0cHJvZ3JhbUFyZ3NbIiArIGkrKyArICJdPSIgKyBpdGVyYXRvciArICJcbiIpOwotCQl9Ci0JCXNiLmFwcGVuZCgiZndDb25maWdMb2NhdGlvbj0iICsgdGhpcy5md0NvbmZpZ0xvY2F0aW9uICsgIlxuIik7Ci0JCXNiLmFwcGVuZCgiZndKYXI9IiArIHRoaXMuZndKYXIgKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCJmd1BlcnNpc3RlbnREYXRhTG9jYXRpb249IiArIHRoaXMuZndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uICsgIlxuIik7Ci0JCXNiLmFwcGVuZCgiaG9tZT0iICsgdGhpcy5ob21lICsgIlxuIik7Ci0JCXNiLmFwcGVuZCgibGF1bmNoZXI9IiArIHRoaXMubGF1bmNoZXIgKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCJsYXVuY2hlckNvbmZpZ0xvY2F0aW9uPSIgKyB0aGlzLmxhdW5jaGVyQ29uZmlnTG9jYXRpb24gKyAiXG4iKTsKLQkJc2IuYXBwZW5kKCJjbGVhbj0iICsgdGhpcy5pc0NsZWFuKCkgKyAiXG4iKTsKLQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZnJhbWV3b3JrYWRtaW4vTWFuaXB1bGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9NYW5pcHVsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDMyOTBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9mcmFtZXdvcmthZG1pbi9NYW5pcHVsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yLkNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yOwotCi0vKioKLSAqIEEgbWFuaXB1bGF0b3IgaXMgdXNlZCB0byBxdWVyeSBhbmQgbW9kaWZ5IHRoZSBzdGF0ZSBvZiBhIGZyYW1ld29yayBpbnN0YW5jZS4gCi0gKiBBIG1hbmlwdWxhdG9yIGluc3RhbmNlIGlzIG9idGFpbmVkIGJ5IGNhbGxpbmcge0BsaW5rIEZyYW1ld29ya0FkbWluI2dldE1hbmlwdWxhdG9yKCl9LgotICogCi0gKiBUaGUgdHlwaWNhbCB1c2UtY2FzZXMgb2YgdGhpcyBpbnRlcmZhY2U6Ci0gKiAKLSAqIFVzZWNhc2UgMTogc2V0IHBhcmFtZXRlcnMsIGNoZWNrIHRoZSBleHBlY3RlZCBzdGF0ZSwgc2F2ZSB0aGVtIGludG8gY29uZmlndXJhdGlvbiBmaWxlcywgYW5kIGxhdW5jaC4gCi0gKiAJQS4gY3JlYXRlIGEge0BsaW5rIE1hbmlwdWxhdG9yfSBvYmplY3QgZnJvbSBhIHtAbGluayBGcmFtZXdvcmtBZG1pbn0uCi0gKiAgQi4gc2V0IHBhcmFtZXRlcnMgdG8gdGhlIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0LgotICogIEMuIGdldEV4cGVjdGVkU3RhdGUoKSBhbmQgY2hlY2sgd2hhdCBidW5kbGUgc3RhdGUgd2lsbCBiZSByZWFsaXplZC4KLSAqICAgICBJZiBpdCBpcyBub3Qgc2FtZSBhcyB5b3UgZGVzaXJlLCByZXBlYXQgQiBhbmQgQyB1bnRpbCBpdCBiZWNvbWVzIGFzIHlvdSBkZXNpcmUuCi0gKiAgRC4gc2F2ZSBwYXJhbWV0ZXJzIGludG8gY29uZmlndXJhdGlvbiBmaWxlcyBieSB7QGxpbmsgTWFuaXB1bGF0b3Ijc2F2ZShib29sZWFuKX0uCi0gKiAgRS4gbGF1bmNoIHRoZSBmcmFtZXdvcmsgYnkge0BsaW5rIEZyYW1ld29ya0FkbWluI2xhdW5jaChNYW5pcHVsYXRvciwgRmlsZSl9LgotICogICAgIAotICogVXNlY2FzZSAyOiBzZXQgcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgbG9hZGluZywgbG9hZCBwYXJhbWV0ZXJzIGZyb20gY29uZmlndXJhdGlvbiBmaWxlcywKLSAqIAkJICBjaGVjayB0aGUgZXhwZWN0ZWQgc3RhdGUsIGFuZCBsYXVuY2guIAotICogCUEuIGNyZWF0ZSBhIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0IGZyb20gYSB7QGxpbmsgRnJhbWV3b3JrQWRtaW59LgotICogIEIuIHNldCBwYXJhbWV0ZXJzIGFib3V0IGxhdW5jaGVyIG9yIGZyYW1ld29yayBjb25maWd1cmF0aW9uIGZpbGUgdG8gdGhlIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0LgotICogIEMuIGxvYWQgcGFyYW1ldGVycyBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZXMgYnkge0BsaW5rIE1hbmlwdWxhdG9yI2xvYWQoKX07Ci0gKiAgRC4gZ2V0RXhwZWN0ZWRTdGF0ZSgpIGFuZCBjaGVjayB3aGF0IGJ1bmRsZSBzdGF0ZSB3aWxsIGJlIHJlYWxpemVkLgotICogIEUuIGxhdW5jaCB0aGUgZnJhbWV3b3JrIGJ5IHtAbGluayBGcmFtZXdvcmtBZG1pbiNsYXVuY2goTWFuaXB1bGF0b3IsIEZpbGUpfS4KLSAqIEBzZWUgRnJhbWV3b3JrQWRtaW4KLSAqIEBzZWUgQ29uZmlnRGF0YQotICogQHNlZSBMYXVuY2hlckRhdGEKLSAqLwotcHVibGljIGludGVyZmFjZSBNYW5pcHVsYXRvciB7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgQnVuZGxkc1N0YXRlIG9iamVjdCwKLQkgKiBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlcnMgc2V0IHRvIHRoaXMgb2JqZWN0ICJpbiBtZW1vcnkiLgotCSAqIAotCSAqIE5vbmUgb2YgbGF1bmNoZXIgY29uZmlnIGZpbGUsIGZyYW1ld29yayBjb25maWcgZmlsZSBhbmQgY29uZmlndXJhdG9yIGNvbmZpZyBmaWxlCi0JICogd2lsbCBiZSByZWFkIGJ5IHRoaXMgbWV0aG9kLiBIb3dldmVyLCB0aGUgZnJhbWV3b3JrIHBlcnNpc3RlbnQgZGF0YSBsb2NhdGlvbiBzaG91bGQgYmUKLQkgKiB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIEluIG90aGVyIHdvcmRzLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiAKLQkgKiB0aGUgZXhwZWN0ZWQge0BsaW5rIEJ1bmRsZXNTdGF0ZX0gb2JqZWN0IGFzc3VtaW5nIHRoYXQgdGhlIGN1cnJlbnQgcGFyYW1ldGVycyB3ZXJlIHNhdmVkIGFuZCAKLQkgKiB7QGxpbmsgRnJhbWV3b3JrQWRtaW4jbGF1bmNoKE1hbmlwdWxhdG9yLCBGaWxlKX0gd2l0aCBhbiBhcmd1bWVudCBvZiB0aGlzIG9iamVjdCAKLQkgKiB3ZXJlIGNhbGxlZC4gKEl0IHdvdWxkIHJlYWQgdGhlIGZyYW1ld29yayBwZXJzaXN0ZW50IGRhdGEgbG9jYXRpb24gaWYgcmVxdWlyZWQpLgotCSAqICAKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgbm90IG1vZGlmeSB0aGUgcGFyYW1ldGVycyBpbiB0aGlzIHtAbGluayBNYW5pcHVsYXRvcn0gb2JqZWN0LgotCSAqIAotCSAqIEByZXR1cm4gZnJhbWV3b3JrIGJ1bmRsZSBzdGF0ZSBvYmplY3QgY3JlYXRlZCBhY2NvcmRpbmcgdG8gaGUgY3VycmVudCBwYXJhbWV0ZXJzIHNldC4KLQkgKiBAdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiAtIElmIHRoZSB7QGxpbmsgRnJhbWV3b3JrQWRtaW59IHNlcnZpY2UgY3JlYXRlZCB0aGlzIG9iamVjdCBpcyB1bnJlZ2lzdGVyZWQgb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGhpcyBtZXRob2QuIAotCSAqLwotCUJ1bmRsZXNTdGF0ZSBnZXRCdW5kbGVzU3RhdGUoKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhlIHJlZmVyZW5jZSBvZiB7QGxpbmsgQ29uZmlnRGF0YX0gb2JqZWN0IHJlcHJlc2VudGluZyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHJlbGF0ZWQgd2l0aCBmcmFtZXdvcmsgc2V0dGluZ3Mgd2lsbCBiZSByZXR1cm5lZC4KLQkgKiBSZW1pbmQgdGhhdCBtYW5pcHVsYXRpbmcgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYWZmZWN0IHRoaXMgTWFuaXB1bGF0b3IgYmVoYXZpb3IuCi0JICogIAotCSAqIEByZXR1cm4gQ29uZmlnRGF0YSBvYmplY3QgcmVwcmVzZW50aW5nIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcmVsYXRlZCB3aXRoIGZyYW1ld29yayBzZXR0aW5nIAotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIC0gSWYgdGhlIHtAbGluayBGcmFtZXdvcmtBZG1pbn0gc2VydmljZSBjcmVhdGVkIHRoaXMgb2JqZWN0IGlzIHVucmVnaXN0ZXJlZCBvciB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIG1ldGhvZC4gCi0JICogQHNlZSBDb25maWdEYXRhCi0JICovCi0JQ29uZmlnRGF0YSBnZXRDb25maWdEYXRhKCkgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgZXhwZWN0ZWQgQnVuZGxlSW5mbyBhcnJheSByZXByZXNlbnRpbmcgc3RhdGUgb2YgYnVuZGxlcywKLQkgKiBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlcnMgc2V0IHRvIHRoaXMgb2JqZWN0ICJpbiBtZW1vcnkiLgotCSAqIAotCSAqIE5vbmUgb2YgbGF1bmNoZXIgY29uZmlnIGZpbGUsIGZyYW1ld29yayBjb25maWcgZmlsZSBhbmQgY29uZmlndXJhdG9yIGNvbmZpZyBmaWxlCi0JICogd2lsbCBiZSByZWFkIGJ5IHRoaXMgbWV0aG9kLiBIb3dldmVyLCB0aGUgZnJhbWV3b3JrIHBlcnNpc3RlbnQgZGF0YSBsb2NhdGlvbiBzaG91bGQgYmUKLQkgKiB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24uIEluIG90aGVyIHdvcmRzLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiAKLQkgKiB0aGUgZXhwZWN0ZWQgYnVuZGxlcyBzdGF0ZSBhc3N1bWluZyB0aGF0IHRoZSBjdXJyZW50IHBhcmFtZXRlcnMgd2VyZSBzYXZlZCBhbmQgCi0JICoge0BsaW5rIEZyYW1ld29ya0FkbWluI2xhdW5jaChNYW5pcHVsYXRvciwgRmlsZSl9IHdpdGggYW4gYXJndW1lbnQgb2YgdGhpcyBvYmplY3QgCi0JICogd2VyZSBjYWxsZWQuIChJdCB3b3VsZCByZWFkIHRoZSBmcmFtZXdvcmsgcGVyc2lzdGVudCBkYXRhIGxvY2F0aW9uIGlmIHJlcXVpcmVkKS4KLQkgKiAKLQkgKiBSZXR1cm5lZCBCdW5kbGVJbmZvcyBtdXN0IGhhdmUgcmVzb2x2ZWQgZmxhZyBzZXQuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIHBhcmFtZXRlcnMgaW4gdGhpcyB7QGxpbmsgTWFuaXB1bGF0b3J9IG9iamVjdC4gCi0JICogCi0JICogY2YuIGdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCkgd2lsbCByZXR1cm4gYXJyYXkgb2YgQnVuZGxlSW5mbyB0b28uCi0JICogCUhvd2V2ZXIgdGhlIHJlc29sdmVkIGZsYWcgb2YgcmV0dXJuZWQgQnVuZGxlSW5mb3MgbWlnaHQgbm90IGJlIHJlbGlhYmxlLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBnZXRCdW5kbGVzU3RhdGUoKS5nZXRFeHBlY3RlZFN0YXRlKCkuCi0JICogIAotCSAqIEByZXR1cm4gYXJyYXkgb2YgQnVuZGxlSW5mbyByZXByZXNlbnRpbmcgZXhwZWN0ZWQgc3RhdGUgb2YgYWxsIGJ1bmRsZXMgaW5zdGFsbGVkLgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIC0gSWYgZWl0aGVyIG9mIGZ3SmFyIG9yIGN3ZCBkb2Vzbid0IGV4aXN0LgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gLSBJZiByZWFkaW5nIGZ3IGNvbmZpZ3VyYXRpb24gZmlsZSBvciByZWFkaW5nIHBlcnNpc3RlbnRseSByZWNvcmRlZCBpbmZvcm1hdGlvbiAKLQkgKiAgIG9mIGZ3IGZhaWxzLiAKLQkgKiBAdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiAtIElmIHRoZSB7QGxpbmsgRnJhbWV3b3JrQWRtaW59IHNlcnZpY2UgY3JlYXRlZCB0aGlzIG9iamVjdCBpcyB1bnJlZ2lzdGVyZWQgb3IgdGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGhpcyBtZXRob2QuIAotCSAqLwotCUJ1bmRsZUluZm9bXSBnZXRFeHBlY3RlZFN0YXRlKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoZSByZWZlcmVuY2Ugb2Yge0BsaW5rIExhdW5jaGVyRGF0YX0gb2JqZWN0IHJlcHJlc2VudGluZyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uCi0JICogcmVsYXRlZCB3aXRoIGxhdW5jaGVyIHNldHRpbmdzIHdpbGwgYmUgcmV0dXJuZWQuIAotCSAqIFJlbWVtYmVyIHRoYXQgbWFuaXB1bGF0aW5nIHJldHVybmVkIG9iamVjdCB3aWxsIGFmZmVjdCB0aGlzIE1hbmlwdWxhdG9yIG9iamVjdCBiZWhhdmlvci4KLQkgKiAKLQkgKiBAcmV0dXJuIExhdW5jaGVyRGF0YSBvYmplY3QgcmVwcmVzZW50aW5nIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gcmVsYXRlZCB3aXRoIGxhdW5jaGVyIHNldHRpbmcgCi0JICogQHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gLSBJZiB0aGUgTWFuaXB1bGF0b3JBZG1pbiBzZXJ2aWNlIGNyZWF0ZWQgdGhpcyBvYmplY3QgaXMgdW5yZWdpc3RlcmVkIG9yIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IHRoaXMgbWV0aG9kLiAKLQkgKiBAc2VlIExhdW5jaGVyRGF0YQotCSAqLwotCUxhdW5jaGVyRGF0YSBnZXRMYXVuY2hlckRhdGEoKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJuIHRpbWVzdGFtcCBvZiBjb25maWd1cmF0aW9ucyB3aGljaCB3aWxsIGJlIGxvYWRlZCBieSBsb2FkKCkgbWV0aG9kCi0JICogYWNjb3JkaW5nIHRvIHRoZSBwYXJhbWV0ZXJzIHNldCB0byB0aGlzIG1hbmlwdWxhdG9yIGluIGxvbmcgdmFsdWUuCi0JICogCi0JICogVGhpcyBtZXRob2Qgd2lsbCBjaGVjayBsYXN0IG1vZGlmaWVkIHRpbWUgb2YgYWxsIGxhdW5jaGVyIGNvbmZpZ3VyYXRpb24gZmlsZSwgZnJhbWV3b3JrIGNvbmZpZ3VyYXRpb24gZmlsZSwKLQkgKiBhbmQgZnJhbWV3b3JrIHBlcnNpc3RlbnQgc3RvcmFnZSBhY2NvcmRpbmcgdG8gdGhlIHBhcmFtZXRlcnMgc2V0LgotCSAqIEByZXR1cm4KLQkgKi8KLQlsb25nIGdldFRpbWVTdGFtcCgpOwotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSBhbGwgaW5mb3JtYXRpb24gdGhhdCB0aGlzIG9iamVjdCBrZWVwcyBhdCB0aGF0IHRpbWUuCi0JICovCi0Jdm9pZCBpbml0aWFsaXplKCk7Ci0KLQkvKioKLQkgKiBsb2FkIGNvbmZpZ3MgZnJvbSBhcHByb3ByaWF0ZSBjb25maWcgZmlsZXMsIAotCSAqIGluY2x1ZGluZyBsYXVuY2hlciBjb25maWcgZmlsZSwgZncgY29uZmlnIGZpbGUsIGFuZCBjb25maWd1cmF0b3IgY29uZmlnIGZpbGVzLCAKLQkgKiB3aG9zZSBsb2NhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlIGN1cnJlbnQgc2V0dGluZy4gSW4gYWRkaXRpb24sIAotCSAqIHRoZSBmdyBwZXJzaXN0ZW50IGRhdGEgbG9jYXRpb24gc2hvdWxkIGJlIHRha2VuIGludG8gY29uc2lkZXJhdGlvbi4gCi0JICogCi0JICogVGhlIGZvbGxvd2luZyBwcm9jZWR1cmUgY29udGFpbnMgdGhlIG1hdHRlcnMgb2YgaW1wbGVtZW50YXRpb24gZGV0YWlsLgotCSAqIEhvd2V2ZXIsIGl0IGlzIGFuIGV4YW1wbGUgaG93IGl0IHdvcmtzLgotCSAqIAotCSAqIDEuIGlmIGxhdW5jaGVyIG9iamVjdCBpcyBzZXQsIGNvcnJlc3BvbmRpbmcgbGF1bmNoZXIgY29uZmlnIGZpbGUgd2lsbCBiZSByZWFkLgotCSAqIEFjY29yZGluZyB0byB0aGUgaW5mb3JtYXRpb24gcmV0cmlldmVkLCBzZXR0aW5nIG9mIHRoaXMgb2JqZWN0IHdpbGwgYmUgdXBkYXRlZC4KLQkgKiBpbmNsdWRpbmcgZncgY29uZmlnIGZpbGUuCi0JICogCi0JICogMi4gSWYgZncgY29uZmlnIGZpbGUgaXMgbm90IHNwZWNpZmllZCwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiAKLQkgKiBPdGhlcndpc2UsIHRoZSBpbmZvcm1hdGlvbiB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBmdyBjb25maWcgZmlsZS4KLQkgKiAKLQkgKiAzLiBJZiBhbnkgQ29uZmlndXJhdG9yQnVuZGxlIGlzIGluY2x1ZGVkIGluIHRoZSBidW5kbGUgbGlzdCwKLQkgKiByZWFkIGFwcHJvcHJpYXRlIGNvbmZpZ3VyYXRvciBjb25maWcgZmlsZSBieSAKLQkgKiB7QGxpbmsgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IjdXBkYXRlQnVuZGxlcyhNYW5pcHVsYXRvcil9LAotCSAqICB3aGljaCB3aWxsIHVwZGF0ZSB0aGUgcGFyYW1ldGVyIGFib3V0IGluc3RhbGxlZCBidW5kbGVzIGluIGl0cyAKLQkgKiAge0BsaW5rIE1hbmlwdWxhdG9yI2dldENvbmZpZ0RhdGEoKX0gb2JqZWN0LgotCSAqICAKLQkgKiBNb3N0IG9sZCBwYXJhbWV0ZXJzIHdpbGwgYmUgdXBkYXRlZCBieSB0aGlzIG1ldGhvZCBjYWxsLiAKLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gSWYgcmVhZGluZyBpbmZvIGZyb20gY29uZmlndXJhdGlvbiBmaWxlcyBmYWlscy4gCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gLSBJZiBjb25maWcgZmlsZXMgY2Fubm90IGJlIGRldGVybWluZWQuCi0JICogQHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gLSBJZiB0aGUge0BsaW5rIEZyYW1ld29ya0FkbWlufSBzZXJ2aWNlIGNyZWF0ZWQgdGhpcyBvYmplY3QgaXMgdW5yZWdpc3RlcmVkIG9yIHRoaXMgaW1wbGVtZW50YXRpb24gZG9lc24ndCBzdXBwb3J0IHRoaXMgbWV0aG9kLiAKLQkgKi8KLQl2b2lkIGxvYWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uOwotCi0JLyoqCi0JICogU2F2ZSBwYXJhbWV0ZXJzIHRoYXQgdGhpcyBvYmplY3Qga2VlcHMgYXQgdGhhdCB0aW1lIGludG8gYXBwcm9wcmlhdGUgY29uZmlndXJhdGlvbiBmaWxlcywgCi0JICogd2hpY2ggaW5jbHVkZSBsYXVuY2hlciBjb25maWd1cmF0aW9uIGZpbGUsIGZyYW1ld29yayBjb25maWd1cmF0aW9uIGZpbGUsIGFuZCBjb25maWd1cmF0b3IgY29uZmlndXJhdGlvbiBmaWxlcwotCSAqIChpZiByZXF1aXJlZCBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBvYmplY3Qgc3VwcG9ydHMpLCBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc2V0dGluZyBhbmQgc2l0dWF0aW9uLiAKLQkgKiAKLQkgKiBUaGUgZm9sbG93aW5nIHByb2NlZHVyZSBjb250YWlucyB0aGUgbWF0dGVycyBvZiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuCi0JICogSG93ZXZlciwgaXQgaXMgYW4gZXhhbXBsZSBob3cgaXQgd29ya3MuCi0JICogCi0JICogMS4gaWYgYSBsYXVuY2hlciBmaWxlIGlzIHNldCwKLQkgKiB0aGUgcGFyYW1ldGVycyB0byBiZSBzYXZlZCBpbnRvIGEgTGF1bmNoZXJDb25maWdGaWxlIHdpbGwgYmUgc2F2ZWQgaW50byB0aGUgZGVmYXVsdCBMYXVuY2hlckNvbmZpZ0ZpbGUKLQkgKiB0aGF0IGlzIGRldGVybWluZWQgYnkgdGhlIGxvY2F0aW9uIG9mIHRoZSBsYXVuY2hlciBmaWxlLgotCSAqIAotCSAqIAotCSAqIDIuIGlmIHRoZXJlIGFyZSBhbnkge0BsaW5rIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yfSBvYmplY3RzIGF2YWlsYWJsZSB3aG9zZSBjb3JyZXNwb25kaW5nIENvbmZpZ3VyYXRvckJ1bmRsZQotCSAqIGlzIHNldCB0byBiZSBzdGFydGVkLCBjaG9vc2UgdGhlIENvbmZpZ3VyYXRvckJ1ZG5sZSB0aGF0IHN0YXJ0cyB0aGUgZmlyc3QgYW1vbmcgdGhlbSBhbmQgZ28gdG8gbmV4dCBzdGVwLgotCSAqIE90aGVyd2lzZSwgc2F2ZSB0aGUgQnVuZGxlSW5mb1tdIHNldCB0byB0aGlzIG9iamVjdCBpbnRvIGEgRndDb25maWdGaWxlIHRoYXQgaXMgZGV0ZXJtaW5lZAotCSAqIGJ5IHRoZSBwYXJhbWV0ZXJzIHNldC4gCi0JICogIAotCSAqIDMuIGNhbGwge0BsaW5rIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yI3NhdmUoTWFuaXB1bGF0b3IsIGJvb2xlYW4pfSBvZiAKLQkgKiB0aGUgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IgdGhhdCBjYW4gbWFuaXB1bGF0ZSB0aGUgY2hvc2VuIENvbmZpZ3VyYXRvckJ1ZG5sZS4gCi0JICogVGhpcyBtZXRob2Qgd2lsbCBzYXZlIGNvbmZpZ3VyYXRpb25zIGZvciBDb25maWd1cmF0b3JCdW5kbGUgdG8gcmVhZCBhcHByb3ByaWF0ZWx5ICAKLQkgKiBhbmQgcmV0dXJuIEJ1bmRsZUluZm9bXSB0byBiZSBzYXZlZCBpbiB0aGUgRndDb25maWdGaWxlLCB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBwYXJhbWV0ZXJzIHNldC4KLQkgKiAKLQkgKiA0LiBTYXZlIHRoZSByZXR1cm5lZCBCdW5kbGVJbmZvW10gaW4gdGhlIEZ3Q29uZmlnRmlsZSwgd2hpY2ggaXMgZGV0ZXJtaW5lZCBieSB0aGUgcGFyYW1ldGVycyBzZXQuCi0JICogCSAgIAotCSAqIEBwYXJhbSBiYWNrdXAgLSBpZiB0cnVlLCBrZWVwIG9sZCBmaWxlIGJ5IHJlbmFtaW5nIGlmIGV4aXN0cy4gCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbiAtIElmIHdyaXRpbmcgaW5mbyBpbnRvIGNvbmZpZ3VyYXRpb24gZmlsZXMgZmFpbHMuIAotCSAqIEB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIC0gSWYgdGhlIHtAbGluayBGcmFtZXdvcmtBZG1pbn0gc2VydmljZSBjcmVhdGVkIHRoaXMgb2JqZWN0IGlzIHVucmVnaXN0ZXJlZCBvciB0aGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIG1ldGhvZC4gCi0JICovCi0Jdm9pZCBzYXZlKGJvb2xlYW4gYmFja3VwKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvcHkgYWxsIGluZm9ybWF0aW9uIHRoZSBzcGVjaWZpZWQge0BsaW5rIENvbmZpZ0RhdGF9IGNvbnRhaW5zIGludG8gdGhpcyBvYmplY3QuCi0JICogQWxsIG9mIG9sZCBzZXR0aW5ncyB3aWxsIGJlIGluaXRpYWxpemVkIGFuZCByZXBsYWNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlnRGF0YSBmdyBjb25maWcgZGF0YSB0byBiZSBzZXQgdG8gdGhpcyBvYmplY3QuCi0JICovCi0Jdm9pZCBzZXRDb25maWdEYXRhKENvbmZpZ0RhdGEgY29uZmlnRGF0YSk7Ci0KLQkvKioKLQkgKiBDb3B5IGFsbCBpbmZvcm1hdGlvbiB0aGUgc3BlY2lmaWVkIHtAbGluayBMYXVuY2hlckRhdGF9IGNvbnRhaW5zIGludG8gdGhpcyBvYmplY3QuCi0JICogQWxsIG9mIG9sZCBzZXR0aW5ncyB3aWxsIGJlIGluaXRpYWxpemVkIGFuZCByZXBsYWNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbGF1bmNoZXJEYXRhIGxhdW5jaGVyIGNvbmZpZyBkYXRhIHRvIGJlIHNldCB0byB0aGlzIG9iamVjdC4KLQkgKi8KLQl2b2lkIHNldExhdW5jaGVyRGF0YShMYXVuY2hlckRhdGEgbGF1bmNoZXJEYXRhKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2RlYjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvQ0RDLTEuMSVGb3VuZGF0aW9uLTEuMSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjQyNjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlkYzk1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNXZWQgTm92IDE0IDEyOjQ5OjI5IEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFlOWVlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotI01vbiBOb3YgMDUgMTY6NTM6MzEgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAwZTRlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotI01vbiBOb3YgMDUgMTY6NTM6MzEgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9ZmFsc2UKLXNwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTNkMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjYWVlMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5BY3RpdmF0b3IKLUltcG9ydC1QYWNrYWdlOiBpZS53b21iYXQuamJkaWZmLAotIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5zYXIsCi0gb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IsCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMSwKLSBKMlNFLTEuNAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVyczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5qYXJkZWx0YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5qYmRpZmY7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMucGFjazIwMDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGE4NTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvb3B0aW1pemVyLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL29wdGltaXplci5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YmY5MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvb3B0aW1pemVyLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9vcHRpbWl6ZXIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdF9hdXRvX3N0YXJ0IiB2YWx1ZT0iZmFsc2UiLz4KLTxpbnRBdHRyaWJ1dGUga2V5PSJkZWZhdWx0X3N0YXJ0X2xldmVsIiB2YWx1ZT0iNCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvanJlMS42LjAiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLWNvbnNvbGUgLWNvbnNvbGVsb2cgLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5wYWNrMjAwb3B0aW1pemVyJiMxMzsmIzEwOy1hcnRpZmFjdFJlcG9zaXRvcnkgZmlsZTpkOi9wcm92L3JlcG8mIzEzOyYjMTA7LWNvbnNvbGUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icGRlLnZlcnNpb24iIHZhbHVlPSIzLjMiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ic2hvd19zZWxlY3RlZF9vbmx5IiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0YXJnZXRfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC5jb3JlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmpvYnNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkucmVnaXN0cnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmFwcEBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb25AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpQDosb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvckBkZWZhdWx0OmRlZmF1bHQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VOYW1lZEpSRSIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ3b3Jrc3BhY2VfYnVuZGxlcyIgdmFsdWU9ImllLndvbWJhdC5qYmRpZmZAZGVmYXVsdDpkZWZhdWx0LG9yZy5hcGFjaGUueGVyY2VzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuYXBhY2hlLnhtbC5yZXNvbHZlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW5AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veEBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kb3dubG9hZEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhckBkZWZhdWx0OmRlZmF1bHQiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNjk3ZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggcDIgQXJ0aWZhY3QgT3B0aW1pemVycwotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjBlNGY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQk8ZXh0ZW5zaW9uIGlkPSJqYXJkZWx0YW9wdGltaXplciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPiAKLSAgICAgIDxhcHBsaWNhdGlvbj4gCi0gICAgICAgICA8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuamFyZGVsdGEuQXBwbGljYXRpb24iLz4gCi0gICAgICA8L2FwcGxpY2F0aW9uPiAKLSAgIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBpZD0icGFjazIwMG9wdGltaXplciIgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hcHBsaWNhdGlvbnMiPiAKLSAgICAgIDxhcHBsaWNhdGlvbj4gCi0gICAgICAgICA8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMucGFjazIwMC5BcHBsaWNhdGlvbiIvPiAKLSAgICAgIDwvYXBwbGljYXRpb24+IAotICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIGlkPSJqYmRpZmZvcHRpbWl6ZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4gCi0gICAgICA8YXBwbGljYXRpb24+IAotICAgICAgICAgPHJ1biBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmpiZGlmZi5BcHBsaWNhdGlvbiIvPiAKLSAgICAgIDwvYXBwbGljYXRpb24+IAotICAgPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIGlkPSJQYWNrMjAwT3B0aW1pemVyIiBwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmdTdGVwcyI+Ci0JCTxzdGVwIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMucGFjazIwMC5QYWNrMjAwT3B0aW1pemVyU3RlcCIvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBpZD0iSmFyRGVsdGFPcHRpbWl6ZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZ1N0ZXBzIj4KLQkJPHN0ZXAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5qYXJkZWx0YS5KYXJEZWx0YU9wdGltaXplclN0ZXAiLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gaWQ9IkpCRGlmZlN0ZXAiIHBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZ1N0ZXBzIj4KLQkJPHN0ZXAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5qYmRpZmYuSkJEaWZmU3RlcCIvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBpZD0iSkJEaWZmWmlwU3RlcCIgcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nU3RlcHMiPgotCQk8c3RlcCBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmpiZGlmZi5KQkRpZmZaaXBTdGVwIi8+Ci0JPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9BYnN0cmFjdEJ1ZmZlcmluZ1N0ZXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvQWJzdHJhY3RCdWZmZXJpbmdTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwOTBmNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9BYnN0cmFjdEJ1ZmZlcmluZ1N0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCUlCTSBDb3Jwb3JhdGlvbiAtIG9uZ29pbmcgZGV2ZWxvcG1lbnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QnVmZmVyaW5nU3RlcCBleHRlbmRzIFByb2Nlc3NpbmdTdGVwIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS19ESVJfUFJFRklYID0gIndvcmsiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktfRElSX1NVRkZJWCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX1NVRkZJWCA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ09NSU5HX1JPT1QgPSAicDIub3B0aW1pemVycy5pbmNvbWluZyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNVTFRfUk9PVCA9ICJwMi5vcHRpbWl6ZXJzLnJlc3VsdCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVERUNFU1NPUl9ST09UID0gInAyLm9wdGltaXplcnMucHJlZGVjZXNzb3IiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGluY29taW5nU3RyZWFtOwotCXByaXZhdGUgRmlsZSB3b3JrRGlyOwotCi0JcHJvdGVjdGVkIEFic3RyYWN0QnVmZmVyaW5nU3RlcCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJT3V0cHV0U3RyZWFtIHN0cmVhbSA9IGdldE91dHB1dFN0cmVhbSgpOwotCQlzdHJlYW0ud3JpdGUoYik7Ci0JfQotCi0JcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaW5jb21pbmdTdHJlYW0gIT0gbnVsbCkKLQkJCXJldHVybiBpbmNvbWluZ1N0cmVhbTsKLQkJLy8gaWYgYnVmZmVyaW5nLCBzdG9yZSBpbnB1dCBzdHJlYW0gaW4gdGVtcG9yYXJ5IGZpbGUKLQkJaW5jb21pbmdTdHJlYW0gPSBjcmVhdGVJbmNvbWluZ1N0cmVhbSgpOwotCQlyZXR1cm4gaW5jb21pbmdTdHJlYW07Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IE91dHB1dFN0cmVhbSBjcmVhdGVJbmNvbWluZ1N0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gV2hlbiB3ZSBnbyB0byBjbG9zZSB3ZSBtdXN0IGhhdmUgc2VlbiBhbGwgdGhlIGNvbnRlbnQgd2UgYXJlIGdvaW5nIHRvIHNlZS4KLQkJLy8gSWYgbm8gb25lIHdyb3RlIHRvIHRoZSB0ZW1wIHN0cmVhbSB0aGVuIHdlIHJldHVybiBhbiBlcnJvci4gSWYgdGhlcmUgaXMgCi0JCS8vIGNvbnRlbnQgdGhlbiBjbG9zZSB0aGUgdGVtcG9yYXJ5IHN0cmVhbSBhbmQgcGVyZm9ybSB0aGUgcHJvY2Vzc2luZy4KLQkJLy8gUGVyZm9ybWluZyB0aGUgc3RlcCBzaG91bGQgcmVzdWx0IGluIHRoZSBuZXcgY29udGVudCBiZWluZyB3cml0dGVuIHRvIAotCQkvLyB0aGUgZGVzdGluYXRpb24uICBNYWtlIHN1cmUgd2UgZGVsZXRlIHRoZSB0ZW1wb3JhcnkgZmlsZSBpZiBhbnkuCi0JCXRyeSB7Ci0JCQlpZiAoaW5jb21pbmdTdHJlYW0gIT0gbnVsbCkgewotCQkJCWluY29taW5nU3RyZWFtLmNsb3NlKCk7Ci0JCQkJcGVyZm9ybVByb2Nlc3NpbmcoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBNZXNzYWdlcy5FbXB0eV9zdHJlYW0pKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWluY29taW5nU3RyZWFtID0gbnVsbDsKLQkJCWNsZWFudXBUZW1wRmlsZXMoKTsKLQkJCWNsZWFudXBXb3JrRGlyKCk7Ci0JCX0KLQotCQlzdXBlci5jbG9zZSgpOwotCQkvLyBUT0RPIG5lZWQgdG8gZ2V0IHJlYWwgc3RhdHVzIGhlcmUuICBzb21ldGltZXMgdGhlIG9wdGltaXplcnMgZG8gbm90IGdpdmUgCi0JCS8vIGFueSByZWFzb25hYmxlIHJldHVybiBzdGF0dXMKLQkJLy8gQ09NTUVOVCBzdGF0dXMgaXMgaW5pdGlhbGx5IHNldCB0byBPSyEKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwZXJmb3JtUHJvY2Vzc2luZygpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXByb3RlY3RlZCB2b2lkIGNsZWFudXBUZW1wRmlsZXMoKSB7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBXb3JrRGlyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHdvcmtEaXIgIT0gbnVsbCkgewotCQkJRmlsZVV0aWxzLmRlbGV0ZUFsbCh3b3JrRGlyKTsKLQkJCS8vIFRPRE8gdHJ5IHR3aWNlIHNpbmNlIHRoZXJlIHNlZW1zIHRvIGJlIHNvbWUgY2FzZXMgd2hlcmUgdGhlIGRpciBpcyBub3QgCi0JCQkvLyBkZWxldGVkIHRoZSBmaXJzdCB0aW1lLiAgQXQgbGVhc3Qgb24gV2luZG93cy4uLgotCQkJRmlsZVV0aWxzLmRlbGV0ZUFsbCh3b3JrRGlyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBGaWxlIGdldFdvcmtEaXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAod29ya0RpciAhPSBudWxsKQotCQkJcmV0dXJuIHdvcmtEaXI7Ci0JCXdvcmtEaXIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKFdPUktfRElSX1BSRUZJWCwgV09SS19ESVJfU1VGRklYKTsKLQkJaWYgKCF3b3JrRGlyLmRlbGV0ZSgpKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLkNhbl9ub3RfZGVsZXRlX3RlbXBfZGlyLCB3b3JrRGlyKSk7Ci0JCWlmICghd29ya0Rpci5ta2RpcnMoKSkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5DYW5fbm90X2NyZWF0ZV90ZW1wX2Rpciwgd29ya0RpcikpOwotCQlyZXR1cm4gd29ya0RpcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL0Fic3RyYWN0RGVsdGFTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL0Fic3RyYWN0RGVsdGFTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMzIxZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9BYnN0cmFjdERlbHRhU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLQotLyoqCi0gKiBUaGUgPGNvZGU+QWJzdHJhY3REZWx0YURpZmZTdGVwPC9jb2RlPiBpcyBhbiBhYnN0cmFjdCBwcm9jZXNzaW5nIHN0ZXAgdGhhdAotICogcmV0cmlldmVzIGEgbG9jYWwgYXJ0aWZhY3QgcmVwb3NpdG9yeSBjb250YWluaW5nIHRoZSBzZXJpYWxpemVkL2VuY29kZWQKLSAqIGFydGlmYWN0IGtleS4gSXQgYXNzdW1lcyB0aGF0IHRoZSBhcnRpZmFjdCBrZXkgaXMgc3RvcmVkIHdpdGhpbiB0aGUgZGF0YSBwcm9wZXJ0eQotICogb2YgdGhlIHByb2Nlc3Npbmcgc3RlcCBkZXNjcmlwdG9yIGFuZCB0aGF0IGlzIGVuY29kZWQgd2l0aCB0aGUgPGNvZGU+QXJ0aWZhY3RLZXlTZXJpYWxpemVyPC9jb2RlPi4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGVsdGFTdGVwIGV4dGVuZHMgQWJzdHJhY3RCdWZmZXJpbmdTdGVwIHsKLQotCXByb3RlY3RlZCBJQXJ0aWZhY3RLZXkga2V5OwotCXByb3RlY3RlZCBJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnk7Ci0KLQlwdWJsaWMgQWJzdHJhY3REZWx0YVN0ZXAoKSB7Ci0JCXRoaXMobnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIEFic3RyYWN0RGVsdGFTdGVwKElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQlzdXBlcigpOwotCQl0aGlzLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElBcnRpZmFjdERlc2NyaXB0b3IgY29udGV4dCkgewotCQlzdXBlci5pbml0aWFsaXplKGRlc2NyaXB0b3IsIGNvbnRleHQpOwotCQlyZWFkQXJ0aWZhY3RLZXkoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEFydGlmYWN0S2V5KFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXRyeSB7Ci0JCQlrZXkgPSBBcnRpZmFjdEtleS5wYXJzZShkZXNjcmlwdG9yLmdldERhdGEoKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlzZXRTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJQcmVkZWNlc3NvciBhcnRpZmFjdCBrZXkgZm9yIGRlbHRhIGNvdWxkIG5vdCBiZSBkZXNlcmlhbGl6ZWQuIFNlcmlhbGl6ZWQga2V5IGlzICIgKyBkZXNjcmlwdG9yLmdldERhdGEoKSwgZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgZmV0Y2hQcmVkZWNlc3NvcihBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZiAocmVwb3NpdG9yeSBpbnN0YW5jZW9mIElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KQotCQkJcmV0dXJuICgoSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkpIHJlcG9zaXRvcnkpLmdldEFydGlmYWN0RmlsZShkZXNjcmlwdG9yKTsKLQkJRmlsZSByZXN1bHQgPSBudWxsOwotCQlPdXRwdXRTdHJlYW0gcmVzdWx0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gRmlsZS5jcmVhdGVUZW1wRmlsZShQUkVERUNFU1NPUl9ST09ULCBKQVJfU1VGRklYKTsKLQkJCQlyZXN1bHRTdHJlYW0gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ocmVzdWx0KSk7Ci0JCQkJc2V0U3RhdHVzKHJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3QoZGVzY3JpcHRvciwgcmVzdWx0U3RyZWFtLCBnZXRQcm9ncmVzc01vbml0b3IoKSkpOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChyZXN1bHRTdHJlYW0gIT0gbnVsbCkKLQkJCQkJcmVzdWx0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMGVhMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVyczsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYTk1ZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhbl9ub3RfY3JlYXRlX3RlbXBfZGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhbl9ub3RfZGVsZXRlX3RlbXBfZGlyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVtcHR5X3N0cmVhbTsKLQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvVmVyc2lvbmxlc3NBcnRpZmFjdEtleS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9WZXJzaW9ubGVzc0FydGlmYWN0S2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYzI3MzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9WZXJzaW9ubGVzc0FydGlmYWN0S2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBWZXJzaW9ubGVzc0FydGlmYWN0S2V5IGV4dGVuZHMgQXJ0aWZhY3RLZXkgewotCi0JcHVibGljIFZlcnNpb25sZXNzQXJ0aWZhY3RLZXkoU3RyaW5nIGNsYXNzaWZpZXIsIFN0cmluZyBpZCkgewotCQlzdXBlcihjbGFzc2lmaWVyLCBpZCwgVmVyc2lvbi5lbXB0eVZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBWZXJzaW9ubGVzc0FydGlmYWN0S2V5KElBcnRpZmFjdEtleSBiYXNlKSB7Ci0JCXN1cGVyKGJhc2UuZ2V0Q2xhc3NpZmllcigpLCBiYXNlLmdldElkKCksIFZlcnNpb24uZW1wdHlWZXJzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaGFzaCA9IGdldElkKCkuaGFzaENvZGUoKTsKLQkJaGFzaCA9IDE3ICogaGFzaCArIGdldENsYXNzaWZpZXIoKS5oYXNoQ29kZSgpOwotCQlyZXR1cm4gaGFzaDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJQXJ0aWZhY3RLZXkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJQXJ0aWZhY3RLZXkgYWsgPSAoSUFydGlmYWN0S2V5KSBvYmo7Ci0JCXJldHVybiBhay5nZXRJZCgpLmVxdWFscyhnZXRJZCgpKSAmJiBhay5nZXRDbGFzc2lmaWVyKCkuZXF1YWxzKGdldENsYXNzaWZpZXIoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamFyZGVsdGEvQXBwbGljYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamFyZGVsdGEvQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkwNjk2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2phcmRlbHRhL0FwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogCUlCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmphcmRlbHRhOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoZSBvcHRpbWl6ZXIgPGNvZGU+QXBwbGljYXRpb248L2NvZGU+IGZvciBKQkRpZmYgYmFzZWQgb3B0aW1pemF0aW9ucy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbiB7Ci0KLQlwcml2YXRlIFVSTCBhcnRpZmFjdFJlcG9zaXRvcnlMb2NhdGlvbjsKLQlwcml2YXRlIGludCB3aWR0aCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZGVwdGggPSAxOwotCi0JcHVibGljIE9iamVjdCBzdGFydChJQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlNYXAgYXJncyA9IGNvbnRleHQuZ2V0QXJndW1lbnRzKCk7Ci0JCWluaXRpYWxpemVGcm9tQXJndW1lbnRzKChTdHJpbmdbXSkgYXJncy5nZXQoImFwcGxpY2F0aW9uLmFyZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gc2V0dXBSZXBvc2l0b3J5KGFydGlmYWN0UmVwb3NpdG9yeUxvY2F0aW9uKTsKLQkJbmV3IE9wdGltaXplcihyZXBvc2l0b3J5LCB3aWR0aCwgZGVwdGgpLnJ1bigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgc2V0dXBSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJLy8gVE9ETyBsb2cgaGVyZQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQkvLyBub3RoaW5nIHRvIGRvIHlldAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoYXJncyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCS8vIGNoZWNrIGZvciBhcmdzIHdpdGhvdXQgcGFyYW1ldGVycyAoaS5lLiwgYSBmbGFnIGFyZykKLQkJCS8vCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKCItcGFjayIpKQotCQkJLy8JCQkJcGFjayA9IHRydWU7Ci0KLQkJCS8vIGNoZWNrIGZvciBhcmdzIHdpdGggcGFyYW1ldGVycy4gSWYgd2UgYXJlIGF0IHRoZSBsYXN0IGFyZ3VtZW50IG9yIAotCQkJLy8gaWYgdGhlIG5leHQgb25lIGhhcyBhICctJyBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyLCB0aGVuIHdlIGNhbid0IGhhdmUgCi0JCQkvLyBhbiBhcmcgd2l0aCBhIHBhcmFtIHNvIGNvbnRpbnVlLgotCQkJaWYgKGkgPT0gYXJncy5sZW5ndGggLSAxIHx8IGFyZ3NbaSArIDFdLnN0YXJ0c1dpdGgoIi0iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbKytpXTsKLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1hcnRpZmFjdFJlcG9zaXRvcnkiKSB8fCBhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItYXIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYXJ0aWZhY3RSZXBvc2l0b3J5TG9jYXRpb24gPSBuZXcgVVJMKGFyZyk7Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItZGVwdGgiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWRlcHRoID0gSW50ZWdlci5wYXJzZUludChhcmcpOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLXdpZHRoIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl3aWR0aCA9IEludGVnZXIucGFyc2VJbnQoYXJnKTsKLQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYXJkZWx0YS9EZWx0YUNvbXB1dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2phcmRlbHRhL0RlbHRhQ29tcHV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDk5MjgzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2phcmRlbHRhL0RlbHRhQ29tcHV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmphcmRlbHRhOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLQotcHVibGljIGNsYXNzIERlbHRhQ29tcHV0ZXIgewotCXByaXZhdGUgRmlsZSB0YXJnZXQ7Ci0JcHJpdmF0ZSBGaWxlIGJhc2U7Ci0JcHJpdmF0ZSBGaWxlIGRlc3RpbmF0aW9uOwotCXByaXZhdGUgWmlwRmlsZSBiYXNlSmFyOwotCXByaXZhdGUgWmlwRmlsZSB0YXJnZXRKYXI7Ci0JcHJpdmF0ZSBTZXQgYmFzZUVudHJpZXM7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgYWRkaXRpb25zOwotCXByaXZhdGUgQXJyYXlMaXN0IGNoYW5nZXM7Ci0JcHJpdmF0ZSBaaXBGaWxlIG1hbmlmZXN0SmFyID0gbnVsbDsKLQotCXB1YmxpYyBEZWx0YUNvbXB1dGVyKEZpbGUgYmFzZSwgRmlsZSB0YXJnZXQsIEZpbGUgZGVzdGluYXRpb24pIHsKLQkJdGhpcy5iYXNlID0gYmFzZTsKLQkJdGhpcy50YXJnZXQgPSB0YXJnZXQ7Ci0JCXRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJaWYgKCFvcGVuSmFycygpKQotCQkJCXJldHVybjsKLQkJCWNvbXB1dGVEZWx0YSgpOwotCQkJd3JpdGVEZWx0YSgpOwotCQl9IGZpbmFsbHkgewotCQkJY2xvc2VKYXJzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVEZWx0YSgpIHsKLQkJWmlwT3V0cHV0U3RyZWFtIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdGluYXRpb24pKTsKLQkJCQkvLyBpZiB0aGUgZGVsdGEgaW5jbHVkZXMgdGhlIG1hbmlmZXN0LCBiZSBzdXJlIHRvIHdyaXRlIGl0IGZpcnN0Ci0JCQkJaWYgKG1hbmlmZXN0SmFyICE9IG51bGwpCi0JCQkJCXdyaXRlRW50cnkocmVzdWx0LCBtYW5pZmVzdEphci5nZXRFbnRyeSgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSwgbWFuaWZlc3RKYXIsIHRydWUpOwotCQkJCS8vIHdyaXRlIG91dCB0aGUgcmVtb3ZhbHMuICBUaGVzZSBhcmUgYWxsIHRoZSBlbnRyaWVzIGxlZnQgaW4gdGhlIGJhc2VFbnRyaWVzCi0JCQkJLy8gc2luY2UgdGhleSB3ZXJlIG5vdCBzZWVuIGluIHRoZSB0YXJnZXRKYXIuICBIZXJlIGp1c3Qgd3JpdGUgb3V0IGFuIGVtcHR5Ci0JCQkJLy8gZW50cnkgd2l0aCBhIG5hbWUgdGhhdCBzaWduYWxzIHRoZSBkZWx0YSBwcm9jZXNzb3IgdG8gZGVsZXRlLgotCQkJCWZvciAoSXRlcmF0b3IgaSA9IGJhc2VFbnRyaWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCQkJd3JpdGVFbnRyeShyZXN1bHQsIG5ldyBaaXBFbnRyeSgoKFN0cmluZykgaS5uZXh0KCkpICsgIi5kZWxldGUiKSwgbnVsbCwgZmFsc2UpOwotCQkJCS8vIHdyaXRlIG91dCB0aGUgYWRkaXRpb25zLgotCQkJCWZvciAoSXRlcmF0b3IgaSA9IGFkZGl0aW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQkJCXdyaXRlRW50cnkocmVzdWx0LCAoWmlwRW50cnkpIGkubmV4dCgpLCB0YXJnZXRKYXIsIGZhbHNlKTsKLQkJCQkvLyB3cml0ZSBvdXQgdGhlIGNoYW5nZXMuCi0JCQkJZm9yIChJdGVyYXRvciBpID0gY2hhbmdlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQkJCXdyaXRlRW50cnkocmVzdWx0LCAoWmlwRW50cnkpIGkubmV4dCgpLCB0YXJnZXRKYXIsIGZhbHNlKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCQlyZXN1bHQuY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUVudHJ5KFppcE91dHB1dFN0cmVhbSByZXN1bHQsIFppcEVudHJ5IGVudHJ5LCBaaXBGaWxlIHNvdXJjZUphciwgYm9vbGVhbiBtYW5pZmVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKCFtYW5pZmVzdCAmJiBlbnRyeS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiTUVUQS1JTkYvTUFOSUZFU1QuTUYiKSkKLQkJCXJldHVybjsKLQkJLy8gYWRkIHRoZSBlbnRyeQotCQlyZXN1bHQucHV0TmV4dEVudHJ5KGVudHJ5KTsKLQkJdHJ5IHsKLQkJCS8vIGlmIHRoZXJlIGlzIGEgc291cmNlSmFyIGNvcHkgb3ZlciB0aGUgY29udGVudCBmb3IgdGhlIGVudHJ5IGludG8gdGhlIHJlc3VsdAotCQkJaWYgKHNvdXJjZUphciAhPSBudWxsKSB7Ci0JCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBzb3VyY2VKYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwotCQkJCXRyeSB7Ci0JCQkJCXRyYW5zZmVyU3RyZWFtcyhjb250ZW50cywgcmVzdWx0KTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXJlc3VsdC5jbG9zZUVudHJ5KCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2ZlcnMgYWxsIGF2YWlsYWJsZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGdpdmVuCi0JICogb3V0cHV0IHN0cmVhbS4gRG9lcyBub3QgY2xvc2UgZWl0aGVyIHN0cmVhbS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2ZlclN0cmVhbXMoSW5wdXRTdHJlYW0gc291cmNlLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXNvdXJjZSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvdXJjZSk7Ci0JCWRlc3RpbmF0aW9uID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uKTsKLQkJdHJ5IHsKLQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJaW50IGJ5dGVzUmVhZCA9IC0xOwotCQkJCWlmICgoYnl0ZXNSZWFkID0gc291cmNlLnJlYWQoYnVmZmVyKSkgPT0gLTEpCi0JCQkJCWJyZWFrOwotCQkJCWRlc3RpbmF0aW9uLndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWRlc3RpbmF0aW9uLmZsdXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZURlbHRhKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJY2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYWRkaXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBzdGFydCBvdXQgYXNzdW1pbmcgdGhhdCBhbGwgdGhlIGJhc2UgZW50cmllcyBhcmUgYmVpbmcgcmVtb3ZlZAotCQliYXNlRW50cmllcyA9IGdldEVudHJpZXMoYmFzZUphcik7Ci0JCWZvciAoRW51bWVyYXRpb24gZSA9IHRhcmdldEphci5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KQotCQkJY2hlY2soKFppcEVudHJ5KSBlLm5leHRFbGVtZW50KCksIHRhcmdldEphcik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG9wZW5KYXJzKCkgewotCQl0cnkgewotCQkJYmFzZUphciA9IG5ldyBaaXBGaWxlKGJhc2UpOwotCQkJdGFyZ2V0SmFyID0gbmV3IFppcEZpbGUodGFyZ2V0KTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjbG9zZUphcnMoKSB7Ci0JCWlmIChiYXNlSmFyICE9IG51bGwpCi0JCQl0cnkgewotCQkJCWJhc2VKYXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJaWYgKHRhcmdldEphciAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQl0YXJnZXRKYXIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQl9Ci0KLQkvKiogCi0JICogQ29tcGFyZSB0aGUgZ2l2ZW4gZW50cnkgYWdhaW5zdCB0aGUgYmFzZSBKQVIgdG8gc2VlIGlmL2hvdyBpdCBkaWZmZXJzLiAgVXBkYXRlIHRoZSBhcHByb3ByaWF0ZSBzZXQKLQkgKiBiYXNlZCBvbiB0aGUgZGlzY292ZXJlZCBkaWZmZXJlbmNlLgotCSAqIEBwYXJhbSBlbnRyeSB0aGUgZW50cnkgdG8gdGVzdAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrKFppcEVudHJ5IGVudHJ5LCBaaXBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVppcEVudHJ5IGJhc2VFbnRyeSA9IGJhc2VKYXIuZ2V0RW50cnkoZW50cnkuZ2V0TmFtZSgpKTsKLQotCQkvLyByZW1lbWJlciB0aGUgbWFuaWZlc3QgaWYgd2Ugc2VlIGl0Ci0JCWNoZWNrRm9yTWFuaWZlc3QoZW50cnksIGZpbGUpOwotCQkvLyBpZiB0aGVyZSBpcyBubyBlbnRyeSB0aGVuIHRoaXMgaXMgYW4gYWRkaXRpb24uICByZW1lbWJlciB0aGUgYWRkaXRpb24gYW5kIHJldHVybjsKLQkJaWYgKGJhc2VFbnRyeSA9PSBudWxsKSB7Ci0JCQlhZGRpdGlvbnMuYWRkKGVudHJ5KTsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBub3cgd2Uga25vdyBlYWNoIEpBUiBoYXMgYW4gZW50cnkgZm9yIHRoZSBuYW1lLCBjb21wYXJlIGFuZCBzZWUgaG93L2lmIHRoZXkgZGlmZmVyCi0JCWJvb2xlYW4gY2hhbmdlZCA9ICFlcXVhbHMoZW50cnksIGJhc2VFbnRyeSk7Ci0JCWlmIChjaGFuZ2VkKQotCQkJY2hhbmdlcy5hZGQoZW50cnkpOwotCQliYXNlRW50cmllcy5yZW1vdmUoYmFzZUVudHJ5LmdldE5hbWUoKSk7Ci0JfQotCi0JLy8gY29tcGFyZSB0aGUgdHdvIGVudHJpZXMuICBXZSBhbHJlYWR5IGtub3cgdGhhdCB0aGV5IGhhdmUgdGhlIHNhbWUgbmFtZS4KLQlwcml2YXRlIGJvb2xlYW4gZXF1YWxzKFppcEVudHJ5IGVudHJ5LCBaaXBFbnRyeSBiYXNlRW50cnkpIHsKLQkJaWYgKGVudHJ5LmdldFNpemUoKSAhPSBiYXNlRW50cnkuZ2V0U2l6ZSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBtYWtlIHN1cmUgdGhlIGVudHJpZXMgYXJlIG9mIHRoZSBzYW1lIHR5cGUKLQkJaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgIT0gYmFzZUVudHJ5LmlzRGlyZWN0b3J5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIGlmIHRoZSBlbnRyaWVzIGFyZSBmaWxlcyB0aGVuIGNvbXBhcmUgdGhlIHRpbWVzLgotCQlpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpCi0JCQlpZiAoZW50cnkuZ2V0VGltZSgpICE9IGJhc2VFbnRyeS5nZXRUaW1lKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIFNldCBnZXRFbnRyaWVzKFppcEZpbGUgamFyKSB7Ci0JCUhhc2hTZXQgcmVzdWx0ID0gbmV3IEhhc2hTZXQoamFyLnNpemUoKSk7Ci0JCWZvciAoRW51bWVyYXRpb24gZSA9IGphci5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotCQkJY2hlY2tGb3JNYW5pZmVzdChlbnRyeSwgamFyKTsKLQkJCXJlc3VsdC5hZGQoZW50cnkuZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gZW50cnkgaXMgdGhlIG1hbmlmZXN0LiAgSWYgc28sIHJlbWVtYmVyIGl0IGZvciB1c2Ugd2hlbiB3cml0aW5nCi0JICogdGhlIHJlc3VsdGFudCBKQVIuCi0JICogQHBhcmFtIGVudHJ5Ci0JICogQHBhcmFtIGphcgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0Zvck1hbmlmZXN0KFppcEVudHJ5IGVudHJ5LCBaaXBGaWxlIGphcikgewotCQlpZiAoZW50cnkuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoIk1FVEEtSU5GL01BTklGRVNULk1GIikpCi0JCQltYW5pZmVzdEphciA9IGphcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2phcmRlbHRhL0phckRlbHRhT3B0aW1pemVyU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYXJkZWx0YS9KYXJEZWx0YU9wdGltaXplclN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU3YjVlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2phcmRlbHRhL0phckRlbHRhT3B0aW1pemVyU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBvbmdvaW5nIGRldmVsb3BtZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuamFyZGVsdGE7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuQWJzdHJhY3REZWx0YVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLQotLyoqCi0gKiBUaGUgSkFSIGRlbHRhIGV4cGVjdHMgYW4gaW5wdXQgY29udGFpbmluZyBub3JtYWwgIi5qYXIiIGRhdGEuICAgCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXJEZWx0YU9wdGltaXplclN0ZXAgZXh0ZW5kcyBBYnN0cmFjdERlbHRhU3RlcCB7Ci0KLQlwcml2YXRlIEZpbGUgaW5jb21pbmc7Ci0KLQlwcm90ZWN0ZWQgSmFyRGVsdGFPcHRpbWl6ZXJTdGVwKElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQlzdXBlcihyZXBvc2l0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGNyZWF0ZUluY29taW5nU3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW5jb21pbmcgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKElOQ09NSU5HX1JPT1QsIEpBUl9TVUZGSVgpOwotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGluY29taW5nKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2xlYW51cFRlbXBGaWxlcygpIHsKLQkJc3VwZXIuY2xlYW51cFRlbXBGaWxlcygpOwotCQlpZiAoaW5jb21pbmcgIT0gbnVsbCkKLQkJCWluY29taW5nLmRlbGV0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1Qcm9jZXNzaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSByZXN1bHRGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdEZpbGUgPSBvcHRpbWl6ZSgpOwotCQkJLy8gbm93IHdyaXRlIHRoZSBvcHRpbWl6ZWQgY29udGVudCB0byB0aGUgZGVzdGluYXRpb24KLQkJCWlmIChyZXN1bHRGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCUlucHV0U3RyZWFtIHJlc3VsdFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVzdWx0RmlsZSkpOwotCQkJCUZpbGVVdGlscy5jb3B5U3RyZWFtKHJlc3VsdFN0cmVhbSwgdHJ1ZSwgZ2V0RGVzdGluYXRpb24oKSwgZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXRTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJFbXB0eSBvcHRpbWl6ZWQgZmlsZTogIiArIHJlc3VsdEZpbGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlc3VsdEZpbGUgIT0gbnVsbCkKLQkJCQlyZXN1bHRGaWxlLmRlbGV0ZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgb3B0aW1pemUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHByZWRlY2Vzc29yID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUZpbGUgcmVzdWx0RmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoUkVTVUxUX1JPT1QsIEpBUl9TVUZGSVgpOwotCQkJLy8gZ2V0IHRoZSBwcmVkZWNlc3NvciBhbmQgcGVyZm9ybSB0aGUgb3B0aW1pemF0aW9uIGludG8gYSB0ZW1wIGZpbGUKLQkJCXByZWRlY2Vzc29yID0gZmV0Y2hQcmVkZWNlc3NvcihuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSkpOwotCQkJbmV3IERlbHRhQ29tcHV0ZXIocHJlZGVjZXNzb3IsIGluY29taW5nLCByZXN1bHRGaWxlKS5ydW4oKTsKLQkJCXJldHVybiByZXN1bHRGaWxlOwotCQl9IGZpbmFsbHkgewotCQkJLy8gaWYgd2UgaGF2ZSBhIHByZWRlY2Vzc29yIGFuZCBpdCBpcyBvdXIgdGVtcCBmaWxlIHRoZW4gY2xlYW4gdXAgdGhlIGZpbGUKLQkJCWlmIChwcmVkZWNlc3NvciAhPSBudWxsICYmIHByZWRlY2Vzc29yLmdldEFic29sdXRlUGF0aCgpLmluZGV4T2YoUFJFREVDRVNTT1JfUk9PVCkgPiAtMSkKLQkJCQlwcmVkZWNlc3Nvci5kZWxldGUoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2phcmRlbHRhL09wdGltaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYXJkZWx0YS9PcHRpbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiNmRkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2phcmRlbHRhL09wdGltaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gYWRhcHRhdGlvbiB0byBKQVIgZGVsdGFzIGFuZCBvbi1nb2luZyBkZXZlbG9wbWVudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmphcmRlbHRhOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE9wdGltaXplciB7Ci0KLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeTsKLQlwcml2YXRlIGludCB3aWR0aDsKLQlwcml2YXRlIGludCBkZXB0aDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfREVMVEFfRk9STUFUID0gImphckRlbHRhIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfREVMVEFfUEFUQ0hfU1RFUCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuSmFyRGVsdGFQYXRjaFN0ZXAiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIEFSVElGQUNUX0RFU0NSSVBUT1JfVkVSU0lPTl9DT01QQVJBVE9SID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvclZlcnNpb25Db21wYXJhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBBUlRJRkFDVF9LRVlfVkVSU0lPTl9DT01QQVJBVE9SID0gbmV3IEFydGlmYWN0S2V5VmVyc2lvbkNvbXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFRoaXMgb3B0aW1pemVyIHBlcmZvcm1zIGRlbHRhIGdlbmVyYXRpb24gYmFzZWQgb24gKGN1cnJlbnRseSkgamJkaWZmLiAKLQkgKiBUaGUgb3B0aW1pemF0aW9uIGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlILR3aWR0aLQgYW5kIHRoZSC0ZGVwdGi0IHBhcmFtZXRlci4KLQkgKiC0d2lkdGi0IGRlZmluZXMgZm9yIGhvdyBtYW55ILRyZWxhdGVktCBhcnRpZmFjdCBrZXlzIGEgZGVsdGEgc2hvdWxkIGJlIGdlbmVyYXRlZCwKLQkgKiBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHVwLXRvLWRhdGUuCi0JICogtGRlcHRotCBkZWZpbmVzIHRvIGhvdyBtYW55IHByZWRlY2Vzc29yIGEgZGVsdGEgc2hvdWxkIGJlIGdlbmVyYXRlZC4KLQkgKiAKLQkgKiBXaXRoIEFLKGMtdikgOiBBSyAtIGFydGlmYWN0IGtleSwgYyAtIGFydGlmYWN0IGlkLCB2IC0gYXJ0aWZhY3QgdmVyc2lvbgotCSAqIHRoZSC0cmVwb3NpdG9yeSBjb250ZW50tCBjYW4gYmUgdmlld2VkIGEgdHdvIGRpbWVuc2lvbmFsIGFycmF5LCB3aGVyZSB0aGUKLQkgKiBhcnRpZmFjdCBrZXlzIGZvciB0aGUgc2FtZSBjb21wb25lbnQgYXJlIGluIG9yZGVyIG9mIHRoZWlyIHZlcnNpb246IAotCSAqIDxwcmU+PGNvZGU+Ci0JICogICAgIHc9MSAgICAgICB3PTIKLQkgKiAgICAgIHwgICAgICAgIHwKLQkgKiAgICAgIHwgKy0tLS0tLS4tLS0tLS0tLS0tLS0rIGQ9MgotCSAqICAgICAgfCB8ICstLS0tLi0tLSsgZD0xICAgIHwKLQkgKiAgICAgIHwgfCB8ICAgIHwgICB8ICAgICAgICB2Ci0JICogWyAgICB2IHwgfCAgICB2ICAgdiAgICAgICAgdgotCSAqIFsgQUsoeCwyLjApIEFLKHgsMS41KSBBSyh4LDEuMSkgXQotCSAqIFsgQUsoeSwyLjApIEFLKHksMS45KSBdCi0JICogWyBBSyh6LDIuMCkgQUsoeiwxLjUpIEFLKHosMS4zKSBBSyh6LDEuMCkgXQotCSAqIF0KLQkgKiA8L2NvZGU+PC9wcmU+ICAKLQkgKiBFLmc6IHdpdGggYSC0d2lkdGi0IG9mIG9uZSBhbmQgYSC0ZGVwdGi0IG9mIHR3byB0aGUgb3B0aW1pemVyIHdvdWxkCi0JICogY3JlYXRlIHR3byBkZWx0YXMgZm9yIGNvbXBvbmVudCC0eLQgZnJvbSAxLjUgdG8gMi4wIGFuZCBmcm9tIDEuMSB0byAyLjAuICAgIAotCSAqIAotCSAqIEBwYXJhbSByZXBvc2l0b3J5Ci0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGRlcHRoCi0JICovCi0JcHVibGljIE9wdGltaXplcihJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnksIGludCB3aWR0aCwgaW50IGRlcHRoKSB7Ci0JCXRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7Ci0JCXRoaXMud2lkdGggPSB3aWR0aDsKLQkJdGhpcy5kZXB0aCA9IGRlcHRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyBkZWx0YSAoamFyZGVsdGEpIG9wdGltaXphdGlvbnMgKHdpZHRoPSIgKyB3aWR0aCArICIsIGRlcHRoPSIgKyBkZXB0aCArICIpIik7Ci0JCUlBcnRpZmFjdEtleVtdW10ga2V5cyA9IGdldFNvcnRlZFJlbGF0ZWRBcnRpZmFjdEtleXMocmVwb3NpdG9yeS5nZXRBcnRpZmFjdEtleXMoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGtleXNbaV0ubGVuZ3RoIDwgMikKLQkJCQkvLyBOb3RoaW5nIHRvIGRpZmYgaGVyZSEKLQkJCQljb250aW51ZTsKLQkJCWludCBtaW5XaWR0aCA9IE1hdGgubWluKHdpZHRoLCBrZXlzW2ldLmxlbmd0aCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IG1pbldpZHRoOyBqKyspIHsKLQkJCQlJQXJ0aWZhY3RLZXkga2V5ID0ga2V5c1tpXVtqXTsKLQkJCQlib29sZWFuIGlzQXJjaGl2ZSA9IGtleS5nZXRDbGFzc2lmaWVyKCkuZXF1YWxzKCJwbHVnaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCW9wdGltaXplKGtleXNbaV0sIGtleSk7Ci0JCQl9Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJEb25lLiIpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wdGltaXplKElBcnRpZmFjdEtleVtdIGtleXMsIElBcnRpZmFjdEtleSBrZXkpIHsKLQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gcmVwb3NpdG9yeS5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKGtleSk7Ci0JCUlBcnRpZmFjdERlc2NyaXB0b3IgY2Fub25pY2FsID0gbnVsbDsKLQkJZm9yIChpbnQgayA9IDA7IGsgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGsrKykgewotCQkJSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNba107Ci0JCQlib29sZWFuIG9wdGltaXplZCA9IGZhbHNlOwotCQkJaWYgKGlzQ2Fub25pY2FsKGRlc2NyaXB0b3IpKQotCQkJCWNhbm9uaWNhbCA9IGRlc2NyaXB0b3I7Ci0JCQllbHNlCi0JCQkJb3B0aW1pemVkIHw9IGlzT3B0aW1pemVkKGRlc2NyaXB0b3IpOwotCQkJaWYgKCFvcHRpbWl6ZWQpCi0JCQkJb3B0aW1pemUoY2Fub25pY2FsLCBrZXlzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUFydGlmYWN0S2V5IGdldFZlcnNpb25sZXNzS2V5KElBcnRpZmFjdEtleSBrZXkpIHsKLQkJcmV0dXJuIG5ldyBBcnRpZmFjdEtleShrZXkuZ2V0Q2xhc3NpZmllcigpLCBrZXkuZ2V0SWQoKSwgVmVyc2lvbi5lbXB0eVZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHJpZXZlcyBhIGxpc3Qgb2YgbGlzdCBvZiBJQXJ0aWZhY3RLZXlzLiBUaGUgYXJ0aWZhY3Qga2V5cyBpbiB0aGUKLQkgKiBsaXN0IG9mIGFydGlmYWN0IGtleXMgYXJlIGFsbCC0c3Ryb25nbHkgcmVsYXRlZLQgdG8gZWFjaCBvdGhlciBzdWNoIHRoYXQgYXJlICAKLQkgKiBlcXVhbCBidXQgbm90IGNvbnNpZGVyaW5nIHRoZSB2ZXJzaW9ucy4gVGhpcyBsaXN0IGlzIHNvcnRlZCBzdWNoIHRoYXQgdGhlIAotCSAqIG5ld2VyIHZlcnNpb25zIGFyZSBmaXJzdCBpbiB0aGUgbGlzdC48cD4KLQkgKiBXaXRoIEFLKGMtdikgOiBBSyAtIGFydGlmYWN0IGtleSwgYyAtIGFydGlmYWN0IGlkLCB2IC0gYXJ0aWZhY3QgdmVyc2lvbgotCSAqIHRoZSByZXN1bHQgaXMgdGhhbiwgZS5nLgotCSAqIDxwcmU+PGNvZGU+Ci0JICogWwotCSAqIFsgQUsoeCwyLjApIEFLKHgsMS41KSBBSyh4LDEuMSkgXQotCSAqIFsgQUsoeSwyLjApIEFLKHksMS45KSBdCi0JICogWyBBSyh6LDIuMCkgQUsoeiwxLjUpIEFLKHosMS4zKSBBSyh6LDEuMCkgXQotCSAqIF0KLQkgKiA8L2NvZGU+PC9wcmU+ICAKLQkgKiBAcGFyYW0gYXJ0aWZhY3RLZXlzCi0JICogQHJldHVybiB0aGUgc29ydGVkIGFydGlmYWN0IGtleXMKLQkgKi8KLQlwcml2YXRlIElBcnRpZmFjdEtleVtdW10gZ2V0U29ydGVkUmVsYXRlZEFydGlmYWN0S2V5cyhJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdEtleXMpIHsKLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJ0aWZhY3RLZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQXJ0aWZhY3RLZXkgZnJlZUtleSA9IGdldFZlcnNpb25sZXNzS2V5KGFydGlmYWN0S2V5c1tpXSk7Ci0JCQlMaXN0IHZhbHVlcyA9IChMaXN0KSBtYXAuZ2V0KGZyZWVLZXkpOwotCQkJaWYgKHZhbHVlcyA9PSBudWxsKSB7Ci0JCQkJdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCW1hcC5wdXQoZnJlZUtleSwgdmFsdWVzKTsKLQkJCX0KLQkJCXZhbHVlcy5hZGQoYXJ0aWZhY3RLZXlzW2ldKTsKLQkJfQotCQlJQXJ0aWZhY3RLZXlbXVtdIGxpc3RzID0gbmV3IElBcnRpZmFjdEtleVttYXAuc2l6ZSgpXVtdOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJTGlzdCBhcnRpZmFjdEtleUxpc3QgPSAoTGlzdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJSUFydGlmYWN0S2V5W10gcmVsYXRlZEFydGlmYWN0S2V5cyA9IChJQXJ0aWZhY3RLZXlbXSkgYXJ0aWZhY3RLZXlMaXN0LnRvQXJyYXkobmV3IElBcnRpZmFjdEtleVthcnRpZmFjdEtleUxpc3Quc2l6ZSgpXSk7Ci0JCQlBcnJheXMuc29ydChyZWxhdGVkQXJ0aWZhY3RLZXlzLCBBUlRJRkFDVF9LRVlfVkVSU0lPTl9DT01QQVJBVE9SKTsKLQkJCWxpc3RzW2krK10gPSByZWxhdGVkQXJ0aWZhY3RLZXlzOwotCQl9Ci0JCWludCBjYW5kaWRhdGVzID0gMDsKLQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IGxpc3RzLmxlbmd0aDsgaWkrKykgewotCQkJZm9yIChpbnQgamogPSAwOyBqaiA8IGxpc3RzW2lpXS5sZW5ndGg7IGpqKyspIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4obGlzdHNbaWldW2pqXSArICIsICIpOwotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsKLQkJCWlmIChsaXN0c1tpaV0ubGVuZ3RoID4gMSkKLQkJCQljYW5kaWRhdGVzKys7Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJDYW5kaWRhdGVzIGZvdW5kOiAiICsgY2FuZGlkYXRlcyk7Ci0JCXJldHVybiBsaXN0czsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3B0aW1pemUoSUFydGlmYWN0RGVzY3JpcHRvciBjYW5vbmljYWwsIElBcnRpZmFjdEtleVtdIHJlbGF0ZWRBcnRpZmFjdEtleXMpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJPcHRpbWl6aW5nICIgKyBjYW5vbmljYWwpOwotCi0JCUlBcnRpZmFjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGdldFNvcnRlZENvbXBsZXRlUHJlZGVjZXNzb3JzKGNhbm9uaWNhbC5nZXRBcnRpZmFjdEtleSgpLCByZWxhdGVkQXJ0aWZhY3RLZXlzKTsKLQotCQlpbnQgbWluRGVwdGggPSBNYXRoLm1pbihkZXB0aCwgZGVzY3JpcHRvcnMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5EZXB0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IHdpdGggamFyIGRlbHRhIGFnYWluc3QgIiArIGRlc2NyaXB0b3JzW2ldLmdldEFydGlmYWN0S2V5KCkpOwotCQkJU3RyaW5nIHByZWRlY2Vzc29yRGF0YSA9IGRlc2NyaXB0b3JzW2ldLmdldEFydGlmYWN0S2V5KCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCUFydGlmYWN0RGVzY3JpcHRvciBuZXdEZXNjcmlwdG9yID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvcihjYW5vbmljYWwpOwotCQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIHBhdGNoU3RlcCA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoSkFSX0RFTFRBX1BBVENIX1NURVAsIHByZWRlY2Vzc29yRGF0YSwgdHJ1ZSk7Ci0JCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBzdGVwcyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB7cGF0Y2hTdGVwfTsKLQkJCW5ld0Rlc2NyaXB0b3Iuc2V0UHJvY2Vzc2luZ1N0ZXBzKHN0ZXBzKTsKLQkJCW5ld0Rlc2NyaXB0b3Iuc2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5GT1JNQVQsIEpBUl9ERUxUQV9GT1JNQVQpOwotCQkJT3V0cHV0U3RyZWFtIHJlcG9zaXRvcnlTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXBvc2l0b3J5U3RyZWFtID0gcmVwb3NpdG9yeS5nZXRPdXRwdXRTdHJlYW0obmV3RGVzY3JpcHRvcik7Ci0KLQkJCQkvLyBBZGQgaW4gYWxsIHRoZSBwcm9jZXNzaW5nIHN0ZXBzIG5lZWRlZCB0byBvcHRpbWl6ZSAoZS5nLiwgcGFjazIwMCwgLi4uKQotCQkJCVByb2Nlc3NpbmdTdGVwIG9wdGltaXplclN0ZXAgPSBuZXcgSmFyRGVsdGFPcHRpbWl6ZXJTdGVwKHJlcG9zaXRvcnkpOwotCQkJCW9wdGltaXplclN0ZXAuaW5pdGlhbGl6ZShwYXRjaFN0ZXAsIG5ld0Rlc2NyaXB0b3IpOwotCQkJCVByb2Nlc3NpbmdTdGVwSGFuZGxlciBoYW5kbGVyID0gbmV3IFByb2Nlc3NpbmdTdGVwSGFuZGxlcigpOwotCQkJCU91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiA9IGhhbmRsZXIubGluayhuZXcgUHJvY2Vzc2luZ1N0ZXBbXSB7b3B0aW1pemVyU3RlcH0sIHJlcG9zaXRvcnlTdHJlYW0sIG51bGwpOwotCi0JCQkJLy8gRG8gdGhlIGFjdHVhbCB3b3JrIGJ5IGFza2luZyB0aGUgcmVwbyB0byBnZXQgdGhlIGFydGlmYWN0IGFuZCBwdXQgaXQgaW4gdGhlIGRlc3RpbmF0aW9uLgotCQkJCUlTdGF0dXMgc3RhdHVzID0gcmVwb3NpdG9yeS5nZXRBcnRpZmFjdChjYW5vbmljYWwsIGRlc3RpbmF0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJHZXR0aW5nIHRoZSBhcnRpZmFjdCBpcyBub3Qgb2suIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0YXR1cyk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwaW5nIG9wdGltaXphdGlvbiBvZjogIiArIGRlc2NyaXB0b3JzW2ldLmdldEFydGlmYWN0S2V5KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAocmVwb3NpdG9yeVN0cmVhbSAhPSBudWxsKQotCQkJCQl0cnkgewotCQkJCQkJcmVwb3NpdG9yeVN0cmVhbS5jbG9zZSgpOwotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBQcm9jZXNzaW5nU3RlcEhhbmRsZXIuY2hlY2tTdGF0dXMocmVwb3NpdG9yeVN0cmVhbSk7Ci0JCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwaW5nIG9wdGltaXphdGlvbiBvZjogIiArIGRlc2NyaXB0b3JzW2ldLmdldEFydGlmYWN0S2V5KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHN0YXR1cy50b1N0cmluZygpKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTa2lwcGluZyBvcHRpbWl6YXRpb24gb2Y6ICIgKyBkZXNjcmlwdG9yc1tpXS5nZXRBcnRpZmFjdEtleSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgSUFydGlmYWN0RGVzY3JpcHRvcltdIGdldFNvcnRlZENvbXBsZXRlUHJlZGVjZXNzb3JzKElBcnRpZmFjdEtleSBhcnRpZmFjdEtleSwgSUFydGlmYWN0S2V5W10gcmVsYXRlZEFydGlmYWN0S2V5cykgewotCQkvLyBnZXQgYWxsIGFydGlmYWN0IGtleXMKLQkJTGlzdCBjb21wbGV0ZURlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdChyZWxhdGVkQXJ0aWZhY3RLZXlzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVsYXRlZEFydGlmYWN0S2V5cy5sZW5ndGg7IGkrKykgewotCQkJLy8gaWYgd2UgZmluZCC0b3VyIHNlbGa0IHNraXAKLQkJCWlmIChyZWxhdGVkQXJ0aWZhY3RLZXlzW2ldLmVxdWFscyhhcnRpZmFjdEtleSkpCi0JCQkJY29udGludWU7Ci0JCQkvLyBsb29rIGZvciBhIGNvbXBsZXRlIGFydGlmYWN0IGRlc2NyaXB0b3Igb2YgdGhlIGN1cnJlbnQga2V5ICAKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhyZWxhdGVkQXJ0aWZhY3RLZXlzW2ldKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoaXNDYW5vbmljYWwoZGVzY3JpcHRvcnNbal0pKSB7Ci0JCQkJCWNvbXBsZXRlRGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3JzW2pdKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIGNvbXBsZXRlU29ydGVkRGVzY3JpcHRvcnMgPSAoSUFydGlmYWN0RGVzY3JpcHRvcltdKSBjb21wbGV0ZURlc2NyaXB0b3JzLnRvQXJyYXkobmV3IElBcnRpZmFjdERlc2NyaXB0b3JbY29tcGxldGVEZXNjcmlwdG9ycy5zaXplKCldKTsKLQkJLy8gU29ydCwgc28gdG8gYWxsb3cgYSBkZXB0aCBsb29rdXAhCi0JCUFycmF5cy5zb3J0KGNvbXBsZXRlU29ydGVkRGVzY3JpcHRvcnMsIEFSVElGQUNUX0RFU0NSSVBUT1JfVkVSU0lPTl9DT01QQVJBVE9SKTsKLQkJcmV0dXJuIGNvbXBsZXRlU29ydGVkRGVzY3JpcHRvcnM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzT3B0aW1pemVkKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZiAoZGVzY3JpcHRvci5nZXRQcm9jZXNzaW5nU3RlcHMoKS5sZW5ndGggIT0gMSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIEpBUl9ERUxUQV9GT1JNQVQuZXF1YWxzKGRlc2NyaXB0b3IuZ2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5GT1JNQVQpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDYW5vbmljYWwoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCS8vIFRPRE8gbGVuZ3RoICE9IDAgaXMgbm90IG5lY2Vzc2FyaWx5IGFuIGluZGljYXRvciBmb3Igbm90IGJlaW5nIGNhbm9uaWNhbCEgICAKLQkJcmV0dXJuIGRlc2NyaXB0b3IuZ2V0UHJvY2Vzc2luZ1N0ZXBzKCkubGVuZ3RoID09IDA7Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGNsYXNzIEFydGlmYWN0RGVzY3JpcHRvclZlcnNpb25Db21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJ0aWZhY3REZXNjcmlwdG9yMCwgT2JqZWN0IGFydGlmYWN0RGVzY3JpcHRvcjEpIHsKLQkJCXJldHVybiAtMSAqICgoSUFydGlmYWN0RGVzY3JpcHRvcikgYXJ0aWZhY3REZXNjcmlwdG9yMCkuZ2V0QXJ0aWZhY3RLZXkoKS5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKCgoSUFydGlmYWN0RGVzY3JpcHRvcikgYXJ0aWZhY3REZXNjcmlwdG9yMSkuZ2V0QXJ0aWZhY3RLZXkoKS5nZXRWZXJzaW9uKCkpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGNsYXNzIEFydGlmYWN0S2V5VmVyc2lvbkNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yIHsKLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcnRpZmFjdEtleTAsIE9iamVjdCBhcnRpZmFjdEtleTEpIHsKLQkJCXJldHVybiAtMSAqICgoSUFydGlmYWN0S2V5KSBhcnRpZmFjdEtleTApLmdldFZlcnNpb24oKS5jb21wYXJlVG8oKChJQXJ0aWZhY3RLZXkpIGFydGlmYWN0S2V5MSkuZ2V0VmVyc2lvbigpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamJkaWZmL0FwcGxpY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL2piZGlmZi9BcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDJiMDhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamJkaWZmL0FwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogCUlCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmpiZGlmZjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgb3B0aW1pemVyIDxjb2RlPkFwcGxpY2F0aW9uPC9jb2RlPiBmb3IgSkJEaWZmIGJhc2VkIG9wdGltaXphdGlvbnMuIAotICovCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb24gaW1wbGVtZW50cyBJQXBwbGljYXRpb24gewotCi0JcHJpdmF0ZSBVUkwgYXJ0aWZhY3RSZXBvc2l0b3J5TG9jYXRpb247Ci0JcHJpdmF0ZSBpbnQgd2lkdGggPSAxOwotCXByaXZhdGUgaW50IGRlcHRoID0gMTsKLQlwcml2YXRlIGJvb2xlYW4gbm9zYXI7Ci0KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1hcCBhcmdzID0gY29udGV4dC5nZXRBcmd1bWVudHMoKTsKLQkJaW5pdGlhbGl6ZUZyb21Bcmd1bWVudHMoKFN0cmluZ1tdKSBhcmdzLmdldCgiYXBwbGljYXRpb24uYXJncyIpKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBzZXR1cFJlcG9zaXRvcnkoYXJ0aWZhY3RSZXBvc2l0b3J5TG9jYXRpb24pOwotCQluZXcgT3B0aW1pemVyKHJlcG9zaXRvcnksIHdpZHRoLCBkZXB0aCwgbm9zYXIpLnJ1bigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgc2V0dXBSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJLy8gVE9ETyBsb2cgaGVyZQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQkvLyBub3RoaW5nIHRvIGRvIHlldAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGcm9tQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoYXJncyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspIHsKLQkJCS8vIGNoZWNrIGZvciBhcmdzIHdpdGhvdXQgcGFyYW1ldGVycyAoaS5lLiwgYSBmbGFnIGFyZykKLQkJCS8vCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKCItcGFjayIpKQotCQkJLy8JCQkJcGFjayA9IHRydWU7Ci0KLQkJCWlmIChhcmdzW2ldLmVxdWFscygiLW5vc2FyIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlub3NhciA9IHRydWU7Ci0KLQkJCS8vIGNoZWNrIGZvciBhcmdzIHdpdGggcGFyYW1ldGVycy4gSWYgd2UgYXJlIGF0IHRoZSBsYXN0IGFyZ3VtZW50IG9yIAotCQkJLy8gaWYgdGhlIG5leHQgb25lIGhhcyBhICctJyBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyLCB0aGVuIHdlIGNhbid0IGhhdmUgCi0JCQkvLyBhbiBhcmcgd2l0aCBhIHBhcmFtIHNvIGNvbnRpbnVlLgotCQkJaWYgKGkgPT0gYXJncy5sZW5ndGggLSAxIHx8IGFyZ3NbaSArIDFdLnN0YXJ0c1dpdGgoIi0iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbKytpXTsKLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1hcnRpZmFjdFJlcG9zaXRvcnkiKSB8fCBhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItYXIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYXJ0aWZhY3RSZXBvc2l0b3J5TG9jYXRpb24gPSBuZXcgVVJMKGFyZyk7Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItZGVwdGgiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWRlcHRoID0gSW50ZWdlci5wYXJzZUludChhcmcpOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLXdpZHRoIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl3aWR0aCA9IEludGVnZXIucGFyc2VJbnQoYXJnKTsKLQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYmRpZmYvSkJEaWZmU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYmRpZmYvSkJEaWZmU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmU5Nzc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamJkaWZmL0pCRGlmZlN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gb25nb2luZyBkZXZlbG9wbWVudAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5qYmRpZmY7Ci0KLWltcG9ydCBpZS53b21iYXQuamJkaWZmLkpCRGlmZjsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLkFic3RyYWN0RGVsdGFTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnNhci5EaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgSkJEaWZmU3RlcCBleHRlbmRzIEFic3RyYWN0RGVsdGFTdGVwIHsKLQotCXB1YmxpYyBKQkRpZmZTdGVwKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8vIFRPRE8gV2UgbmVlZCBhIGRpZmZlcmVudCB3YXkgb2YgaW5qZWN0aW5nIHRoZSBiYXNlIGFydGlmYWN0cy4gIFRoaXMgYXBwcm9hY2ggZm9yY2VzCi0JLy8gdGhlIHRhcmdldCBhbmQgYmFzZSB0byBsaXZlIGluIHRoZSBzYW1lIHJlcG8uICBUeXBpY2FsIGJ1dCBub3QgcmVhbGx5IHJlcXVpcmVkLgotCXByb3RlY3RlZCBKQkRpZmZTdGVwKElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQlzdXBlcihyZXBvc2l0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGNyZWF0ZUluY29taW5nU3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtUHJvY2Vzc2luZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSBwcmVkZWNlc3NvciA9IGZldGNoUHJlZGVjZXNzb3JCeXRlcyhuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSkpOwotCQlEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY3VycmVudCA9IChEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0pIGluY29taW5nU3RyZWFtOwotCQlieXRlW10gZGlmZiA9IEpCRGlmZi5ic2RpZmYocHJlZGVjZXNzb3IuZ2V0QnVmZmVyKCksIHByZWRlY2Vzc29yLmdldEJ1ZmZlckxlbmd0aCgpLCBjdXJyZW50LmdldEJ1ZmZlcigpLCBjdXJyZW50LmdldEJ1ZmZlckxlbmd0aCgpKTsKLQkJLy8gZnJlZSB1cCB0aGUgbWVtb3J5IGFzIHNvb24gYXMgcG9zc2libGUuCi0JCXByZWRlY2Vzc29yID0gbnVsbDsKLQkJY3VycmVudCA9IG51bGw7Ci0JCWluY29taW5nU3RyZWFtID0gbnVsbDsKLQotCQkvLyBjb3B5IHRoZSByZXN1bHQgb2YgdGhlIG9wdGltaXphdGlvbiB0byB0aGUgZGVzdGluYXRpb24uCi0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkaWZmKSwgdHJ1ZSwgZ2V0RGVzdGluYXRpb24oKSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIGZldGNoUHJlZGVjZXNzb3JCeXRlcyhBcnRpZmFjdERlc2NyaXB0b3IgYXJ0aWZhY3REZXNjcmlwdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlzZXRTdGF0dXMocmVwb3NpdG9yeS5nZXRBcnRpZmFjdChhcnRpZmFjdERlc2NyaXB0b3IsIHJlc3VsdCwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpKTsKLQkJaWYgKCFnZXRTdGF0dXMoKS5pc09LKCkpCi0JCQl0aHJvdyAoSU9FeGNlcHRpb24pIG5ldyBJT0V4Y2VwdGlvbihnZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCkpLmluaXRDYXVzZShnZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYmRpZmYvSkJEaWZmWmlwU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYmRpZmYvSkJEaWZmWmlwU3RlcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDMwYWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamJkaWZmL0pCRGlmZlppcFN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCUlCTSBDb3Jwb3JhdGlvbiAtIG9uZ29pbmcgZGV2ZWxvcG1lbnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuamJkaWZmOwotCi1pbXBvcnQgaWUud29tYmF0LmpiZGlmZi5KQkRpZmY7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnNhci5EaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5zYXIuU2FyVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotCi1wdWJsaWMgY2xhc3MgSkJEaWZmWmlwU3RlcCBleHRlbmRzIEpCRGlmZlN0ZXAgewotCi0JcHVibGljIEpCRGlmZlppcFN0ZXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8gVE9ETyBXZSBuZWVkIGEgZGlmZmVyZW50IHdheSBvZiBpbmplY3RpbmcgdGhlIGJhc2UgYXJ0aWZhY3RzLiAgVGhpcyBhcHByb2FjaCBmb3JjZXMKLQkvLyB0aGUgdGFyZ2V0IGFuZCBiYXNlIHRvIGxpdmUgaW4gdGhlIHNhbWUgcmVwby4gIFR5cGljYWwgYnV0IG5vdCByZWFsbHkgcmVxdWlyZWQuCi0JcHJvdGVjdGVkIEpCRGlmZlppcFN0ZXAoSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCXN1cGVyKHJlcG9zaXRvcnkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1Qcm9jZXNzaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIHNhcnJlZEN1cnJlbnQgPSBuZXcgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCVNhclV0aWwuemlwVG9TYXIoKChEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0pIGluY29taW5nU3RyZWFtKS5nZXRJbnB1dFN0cmVhbSgpLCBzYXJyZWRDdXJyZW50KTsKLQkJaW5jb21pbmdTdHJlYW0gPSBudWxsOwotCQlEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcHJlZGVjZXNzb3IgPSBmZXRjaFByZWRlY2Vzc29yQnl0ZXMobmV3IEFydGlmYWN0RGVzY3JpcHRvcihrZXkpKTsKLQkJYnl0ZVtdIGRpZmYgPSBKQkRpZmYuYnNkaWZmKHByZWRlY2Vzc29yLmdldEJ1ZmZlcigpLCBwcmVkZWNlc3Nvci5nZXRCdWZmZXJMZW5ndGgoKSwgc2FycmVkQ3VycmVudC5nZXRCdWZmZXIoKSwgc2FycmVkQ3VycmVudC5nZXRCdWZmZXJMZW5ndGgoKSk7Ci0JCS8vIGZyZWUgdXAgdGhlIG1lbW9yeSBhcyBzb29uIGFzIHBvc3NpYmxlLgotCQlwcmVkZWNlc3NvciA9IG51bGw7Ci0JCWluY29taW5nU3RyZWFtID0gbnVsbDsKLQkJc2FycmVkQ3VycmVudCA9IG51bGw7Ci0KLQkJLy8gY29weSB0aGUgcmVzdWx0IG9mIHRoZSBvcHRpbWl6YXRpb24gdG8gdGhlIGRlc3RpbmF0aW9uLgotCQlGaWxlVXRpbHMuY29weVN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGlmZiksIHRydWUsIGdldERlc3RpbmF0aW9uKCksIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSBmZXRjaFByZWRlY2Vzc29yQnl0ZXMoQXJ0aWZhY3REZXNjcmlwdG9yIGFydGlmYWN0RGVzY3JpcHRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIHppcHBlZFByZWRlY2Vzc29yID0gbmV3IERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0JCXNldFN0YXR1cyhyZXBvc2l0b3J5LmdldEFydGlmYWN0KGFydGlmYWN0RGVzY3JpcHRvciwgemlwcGVkUHJlZGVjZXNzb3IsIGdldFByb2dyZXNzTW9uaXRvcigpKSk7Ci0JCWlmICghZ2V0U3RhdHVzKCkuaXNPSygpKQotCQkJdGhyb3cgKElPRXhjZXB0aW9uKSBuZXcgSU9FeGNlcHRpb24oZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpKS5pbml0Q2F1c2UoZ2V0U3RhdHVzKCkuZ2V0RXhjZXB0aW9uKCkpOwotCi0JCURpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCVNhclV0aWwuemlwVG9TYXIoemlwcGVkUHJlZGVjZXNzb3IuZ2V0SW5wdXRTdHJlYW0oKSwgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvamJkaWZmL09wdGltaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYmRpZmYvT3B0aW1pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OTJiNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9qYmRpZmYvT3B0aW1pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gb25nb2luZyBkZXZlbG9wbWVudAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5qYmRpZmY7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5WZXJzaW9ubGVzc0FydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLQotcHVibGljIGNsYXNzIE9wdGltaXplciB7Ci0KLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeTsKLQlwcml2YXRlIGludCB3aWR0aDsKLQlwcml2YXRlIGludCBkZXB0aDsKLQlwcml2YXRlIGJvb2xlYW4gbm9zYXI7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkJQQVRDSF9TVEVQX0lEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVwb3NpdG9yeS5KQlBhdGNoU3RlcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkJQQVRDSF9TVEVQX1pJUF9JRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlcG9zaXRvcnkuSkJQYXRjaFppcFN0ZXAiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIEFSVElGQUNUX0RFU0NSSVBUT1JfVkVSU0lPTl9DT01QQVJBVE9SID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvclZlcnNpb25Db21wYXJhdG9yKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBBUlRJRkFDVF9LRVlfVkVSU0lPTl9DT01QQVJBVE9SID0gbmV3IEFydGlmYWN0S2V5VmVyc2lvbkNvbXBhcmF0b3IoKTsKLQotCS8qKgotCSAqIFRoaXMgb3B0aW1pemVyIHBlcmZvcm1zIGRlbHRhIGdlbmVyYXRpb24gYmFzZWQgb24gKGN1cnJlbnRseSkgamJkaWZmLiAKLQkgKiBUaGUgb3B0aW1pemF0aW9uIGNhbiBiZSBjb250cm9sbGVkIHdpdGggdGhlILR3aWR0aLQgYW5kIHRoZSC0ZGVwdGi0IHBhcmFtZXRlci4KLQkgKiC0d2lkdGi0IGRlZmluZXMgZm9yIGhvdyBtYW55ILRyZWxhdGVktCBhcnRpZmFjdCBrZXlzIGEgZGVsdGEgc2hvdWxkIGJlIGdlbmVyYXRlZCwKLQkgKiBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHVwLXRvLWRhdGUuCi0JICogtGRlcHRotCBkZWZpbmVzIHRvIGhvdyBtYW55IHByZWRlY2Vzc29yIGEgZGVsdGEgc2hvdWxkIGJlIGdlbmVyYXRlZC4KLQkgKiAKLQkgKiBXaXRoIEFLKGMtdikgOiBBSyAtIGFydGlmYWN0IGtleSwgYyAtIGFydGlmYWN0IGlkLCB2IC0gYXJ0aWZhY3QgdmVyc2lvbgotCSAqIHRoZSC0cmVwb3NpdG9yeSBjb250ZW50tCBjYW4gYmUgdmlld2VkIGEgdHdvIGRpbWVuc2lvbmFsIGFycmF5LCB3aGVyZSB0aGUKLQkgKiBhcnRpZmFjdCBrZXlzIGZvciB0aGUgc2FtZSBjb21wb25lbnQgYXJlIGluIG9yZGVyIG9mIHRoZWlyIHZlcnNpb246IAotCSAqIDxwcmU+PGNvZGU+Ci0JICogICAgIHc9MSAgICAgICB3PTIKLQkgKiAgICAgIHwgICAgICAgIHwKLQkgKiAgICAgIHwgKy0tLS0tLS4tLS0tLS0tLS0tLS0rIGQ9MgotCSAqICAgICAgfCB8ICstLS0tLi0tLSsgZD0xICAgIHwKLQkgKiAgICAgIHwgfCB8ICAgIHwgICB8ICAgICAgICB2Ci0JICogWyAgICB2IHwgfCAgICB2ICAgdiAgICAgICAgdgotCSAqIFsgQUsoeCwyLjApIEFLKHgsMS41KSBBSyh4LDEuMSkgXQotCSAqIFsgQUsoeSwyLjApIEFLKHksMS45KSBdCi0JICogWyBBSyh6LDIuMCkgQUsoeiwxLjUpIEFLKHosMS4zKSBBSyh6LDEuMCkgXQotCSAqIF0KLQkgKiA8L2NvZGU+PC9wcmU+ICAKLQkgKiBFLmc6IHdpdGggYSC0d2lkdGi0IG9mIG9uZSBhbmQgYSC0ZGVwdGi0IG9mIHR3byB0aGUgb3B0aW1pemVyIHdvdWxkCi0JICogY3JlYXRlIHR3byBkZWx0YXMgZm9yIGNvbXBvbmVudCC0eLQgZnJvbSAxLjUgdG8gMi4wIGFuZCBmcm9tIDEuMSB0byAyLjAuICAgIAotCSAqIAotCSAqIEBwYXJhbSByZXBvc2l0b3J5Ci0JICogQHBhcmFtIHdpZHRoCi0JICogQHBhcmFtIGRlcHRoCi0JICogQHBhcmFtIG5vc2FyIAotCSAqLwotCXB1YmxpYyBPcHRpbWl6ZXIoSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5LCBpbnQgd2lkdGgsIGludCBkZXB0aCwgYm9vbGVhbiBub3NhcikgewotCQl0aGlzLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwotCQl0aGlzLndpZHRoID0gd2lkdGg7Ci0JCXRoaXMuZGVwdGggPSBkZXB0aDsKLQkJdGhpcy5ub3NhciA9IG5vc2FyOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJTdGFydGluZyBkZWx0YSAoamJkaWZmKSBvcHRpbWl6YXRpb25zICh3aWR0aD0iICsgd2lkdGggKyAiLCBkZXB0aD0iICsgZGVwdGggKyAiLCBub3Nhcj0iICsgbm9zYXIgKyAiKSIpOwotCQlJQXJ0aWZhY3RLZXlbXVtdIGtleXMgPSBnZXRTb3J0ZWRSZWxhdGVkQXJ0aWZhY3RLZXlzKHJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3RLZXlzKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChrZXlzW2ldLmxlbmd0aCA8IDIpCi0JCQkJLy8gTm90aGluZyB0byBkaWZmIGhlcmUhCi0JCQkJY29udGludWU7Ci0JCQlpbnQgbWluV2lkdGggPSBNYXRoLm1pbih3aWR0aCwga2V5c1tpXS5sZW5ndGgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBtaW5XaWR0aDsgaisrKSB7Ci0JCQkJSUFydGlmYWN0S2V5IGtleSA9IGtleXNbaV1bal07Ci0JCQkJYm9vbGVhbiBpc0FyY2hpdmUgPSBrZXkuZ2V0Q2xhc3NpZmllcigpLmVxdWFscygicGx1Z2luIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcHJvcG9zZWRTdHJhdGVneSA9IGlzQXJjaGl2ZSAmJiAhbm9zYXIgPyBKQlBBVENIX1NURVBfWklQX0lEIDogSkJQQVRDSF9TVEVQX0lEOwotCQkJCW9wdGltaXplKGtleXNbaV0sIGtleSwgcHJvcG9zZWRTdHJhdGVneSk7Ci0JCQl9Ci0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJEb25lLiIpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wdGltaXplKElBcnRpZmFjdEtleVtdIGtleXMsIElBcnRpZmFjdEtleSBrZXksIFN0cmluZyBwcm9wb3NlZFN0cmF0ZWd5KSB0aHJvd3MgT3V0T2ZNZW1vcnlFcnJvciB7Ci0JCWJvb2xlYW4gcmV0cnk7Ci0JCWRvIHsKLQkJCXJldHJ5ID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCUlBcnRpZmFjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhrZXkpOwotCQkJCUlBcnRpZmFjdERlc2NyaXB0b3IgY29tcGxldGUgPSBudWxsOwotCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBrKyspIHsKLQkJCQkJSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZGVzY3JpcHRvcnNba107Ci0JCQkJCWlmIChpc0Nhbm9uaWNhbChkZXNjcmlwdG9yKSkKLQkJCQkJCWNvbXBsZXRlID0gZGVzY3JpcHRvcjsKLQkJCQkJZWxzZSBpZiAoaXNPcHRpbWl6ZWQoZGVzY3JpcHRvciwgcHJvcG9zZWRTdHJhdGVneSkpIHsKLQkJCQkJCXByb3Bvc2VkU3RyYXRlZ3kgPSBudWxsOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHByb3Bvc2VkU3RyYXRlZ3kgIT0gbnVsbCAmJiBjb21wbGV0ZSAhPSBudWxsKQotCQkJCQlvcHRpbWl6ZShjb21wbGV0ZSwgcHJvcG9zZWRTdHJhdGVneSwga2V5cyk7Ci0JCQl9IGNhdGNoIChPdXRPZk1lbW9yeUVycm9yIGUpIHsKLQkJCQlpZiAoSkJQQVRDSF9TVEVQX0lELmVxdWFscyhwcm9wb3NlZFN0cmF0ZWd5KSkKLQkJCQkJdGhyb3cgZTsKLQkJCQlwcm9wb3NlZFN0cmF0ZWd5ID0gSkJQQVRDSF9TVEVQX0lEOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUmV0cnkgd2l0aCAiICsgcHJvcG9zZWRTdHJhdGVneSk7Ci0JCQkJcmV0cnkgPSB0cnVlOwotCQkJfQotCQl9IHdoaWxlIChyZXRyeSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmV0cmlldmVzIGEgbGlzdCBvZiBsaXN0IG9mIElBcnRpZmFjdEtleXMuIFRoZSBhcnRpZmFjdCBrZXlzIGluIHRoZQotCSAqIGxpc3Qgb2YgYXJ0aWZhY3Qga2V5cyBhcmUgYWxsILRzdHJvbmdseSByZWxhdGVktCB0byBlYWNoIG90aGVyIHN1Y2ggdGhhdCBhcmUgIAotCSAqIGVxdWFsIGJ1dCBub3QgY29uc2lkZXJpbmcgdGhlIHZlcnNpb25zLiBUaGlzIGxpc3QgaXMgc29ydGVkIHN1Y2ggdGhhdCB0aGUgCi0JICogbmV3ZXIgdmVyc2lvbnMgYXJlIGZpcnN0IGluIHRoZSBsaXN0LjxwPgotCSAqIFdpdGggQUsoYy12KSA6IEFLIC0gYXJ0aWZhY3Qga2V5LCBjIC0gYXJ0aWZhY3QgaWQsIHYgLSBhcnRpZmFjdCB2ZXJzaW9uCi0JICogdGhlIHJlc3VsdCBpcyB0aGFuLCBlLmcuCi0JICogPHByZT48Y29kZT4KLQkgKiBbCi0JICogWyBBSyh4LDIuMCkgQUsoeCwxLjUpIEFLKHgsMS4xKSBdCi0JICogWyBBSyh5LDIuMCkgQUsoeSwxLjkpIF0KLQkgKiBbIEFLKHosMi4wKSBBSyh6LDEuNSkgQUsoeiwxLjMpIEFLKHosMS4wKSBdCi0JICogXQotCSAqIDwvY29kZT48L3ByZT4gIAotCSAqIEBwYXJhbSBhcnRpZmFjdEtleXMKLQkgKiBAcmV0dXJuIHRoZSBzb3J0ZWQgYXJ0aWZhY3Qga2V5cwotCSAqLwotCXByaXZhdGUgSUFydGlmYWN0S2V5W11bXSBnZXRTb3J0ZWRSZWxhdGVkQXJ0aWZhY3RLZXlzKElBcnRpZmFjdEtleVtdIGFydGlmYWN0S2V5cykgewotCQlNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnRpZmFjdEtleXMubGVuZ3RoOyBpKyspIHsKLQkJCUlBcnRpZmFjdEtleSBmcmVlS2V5ID0gbmV3IFZlcnNpb25sZXNzQXJ0aWZhY3RLZXkoYXJ0aWZhY3RLZXlzW2ldKTsKLQkJCUxpc3QgdmFsdWVzID0gKExpc3QpIG1hcC5nZXQoZnJlZUtleSk7Ci0JCQlpZiAodmFsdWVzID09IG51bGwpIHsKLQkJCQl2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbWFwLnB1dChmcmVlS2V5LCB2YWx1ZXMpOwotCQkJfQotCQkJdmFsdWVzLmFkZChhcnRpZmFjdEtleXNbaV0pOwotCQl9Ci0JCUlBcnRpZmFjdEtleVtdW10gbGlzdHMgPSBuZXcgSUFydGlmYWN0S2V5W21hcC5zaXplKCldW107Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlMaXN0IGFydGlmYWN0S2V5TGlzdCA9IChMaXN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlJQXJ0aWZhY3RLZXlbXSByZWxhdGVkQXJ0aWZhY3RLZXlzID0gKElBcnRpZmFjdEtleVtdKSBhcnRpZmFjdEtleUxpc3QudG9BcnJheShuZXcgSUFydGlmYWN0S2V5W2FydGlmYWN0S2V5TGlzdC5zaXplKCldKTsKLQkJCUFycmF5cy5zb3J0KHJlbGF0ZWRBcnRpZmFjdEtleXMsIEFSVElGQUNUX0tFWV9WRVJTSU9OX0NPTVBBUkFUT1IpOwotCQkJbGlzdHNbaSsrXSA9IHJlbGF0ZWRBcnRpZmFjdEtleXM7Ci0JCX0KLQkJaW50IGNhbmRpZGF0ZXMgPSAwOwotCQlmb3IgKGludCBpaSA9IDA7IGlpIDwgbGlzdHMubGVuZ3RoOyBpaSsrKSB7Ci0JCQlmb3IgKGludCBqaiA9IDA7IGpqIDwgbGlzdHNbaWldLmxlbmd0aDsgamorKykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihsaXN0c1tpaV1bampdICsgIiwgIik7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIpOwotCQkJaWYgKGxpc3RzW2lpXS5sZW5ndGggPiAxKQotCQkJCWNhbmRpZGF0ZXMrKzsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhbmRpZGF0ZXMgZm91bmQ6ICIgKyBjYW5kaWRhdGVzKTsKLQkJcmV0dXJuIGxpc3RzOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcHRpbWl6ZShJQXJ0aWZhY3REZXNjcmlwdG9yIGNvbXBsZXRlLCBTdHJpbmcgc3RyYXRlZ3ksIElBcnRpZmFjdEtleVtdIHJlbGF0ZWRBcnRpZmFjdEtleXMpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJPcHRpbWl6aW5nICIgKyBjb21wbGV0ZSk7Ci0KLQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gZ2V0U29ydGVkQ29tcGxldGVQcmVkZWNlc3NvcnMoY29tcGxldGUuZ2V0QXJ0aWZhY3RLZXkoKSwgcmVsYXRlZEFydGlmYWN0S2V5cyk7Ci0KLQkJaW50IG1pbkRlcHRoID0gTWF0aC5taW4oZGVwdGgsIGRlc2NyaXB0b3JzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWluRGVwdGg7IGkrKykgewotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0IHdpdGggIiArIHN0cmF0ZWd5ICsgIiBhZ2FpbnN0ICIgKyBkZXNjcmlwdG9yc1tpXS5nZXRBcnRpZmFjdEtleSgpKTsKLQkJCVN0cmluZyBwcmVkZWNlc3NvckRhdGEgPSBkZXNjcmlwdG9yc1tpXS5nZXRBcnRpZmFjdEtleSgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQlBcnRpZmFjdERlc2NyaXB0b3IgbmV3RGVzY3JpcHRvciA9IG5ldyBBcnRpZmFjdERlc2NyaXB0b3IoY29tcGxldGUpOwotCQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIHBhdGNoU3RlcCA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3Ioc3RyYXRlZ3ksIHByZWRlY2Vzc29yRGF0YSwgdHJ1ZSk7Ci0JCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBzdGVwcyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB7cGF0Y2hTdGVwfTsKLQkJCW5ld0Rlc2NyaXB0b3Iuc2V0UHJvY2Vzc2luZ1N0ZXBzKHN0ZXBzKTsKLQkJCW5ld0Rlc2NyaXB0b3Iuc2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5GT1JNQVQsIHN0cmF0ZWd5KTsKLQkJCU91dHB1dFN0cmVhbSByZXBvc2l0b3J5U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJcmVwb3NpdG9yeVN0cmVhbSA9IHJlcG9zaXRvcnkuZ2V0T3V0cHV0U3RyZWFtKG5ld0Rlc2NyaXB0b3IpOwotCi0JCQkJLy8gQWRkIGluIGFsbCB0aGUgcHJvY2Vzc2luZyBzdGVwcyBuZWVkZWQgdG8gb3B0aW1pemUgKGUuZy4sIHBhY2syMDAsIC4uLikKLQkJCQlQcm9jZXNzaW5nU3RlcCBkaWZmU3RlcCA9IGdldFByb2Nlc3NpbmdTdGVwKHN0cmF0ZWd5KTsKLQkJCQlkaWZmU3RlcC5pbml0aWFsaXplKHBhdGNoU3RlcCwgbmV3RGVzY3JpcHRvcik7Ci0JCQkJUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyIGhhbmRsZXIgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyKCk7Ci0JCQkJT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gaGFuZGxlci5saW5rKG5ldyBQcm9jZXNzaW5nU3RlcFtdIHtkaWZmU3RlcH0sIHJlcG9zaXRvcnlTdHJlYW0sIG51bGwpOwotCi0JCQkJLy8gRG8gdGhlIGFjdHVhbCB3b3JrIGJ5IGFza2luZyB0aGUgcmVwbyB0byBnZXQgdGhlIGFydGlmYWN0IGFuZCBwdXQgaXQgaW4gdGhlIGRlc3RpbmF0aW9uLgotCQkJCUlTdGF0dXMgc3RhdHVzID0gcmVwb3NpdG9yeS5nZXRBcnRpZmFjdChjb21wbGV0ZSwgZGVzdGluYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkdldHRpbmcgdGhlIGFydGlmYWN0IGlzIG5vdCBvay4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RhdHVzKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2tpcHBpbmcgb3B0aW1pemF0aW9uIG9mOiAiICsgZGVzY3JpcHRvcnNbaV0uZ2V0QXJ0aWZhY3RLZXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChyZXBvc2l0b3J5U3RyZWFtICE9IG51bGwpCi0JCQkJCXRyeSB7Ci0JCQkJCQlyZXBvc2l0b3J5U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IFByb2Nlc3NpbmdTdGVwSGFuZGxlci5jaGVja1N0YXR1cyhyZXBvc2l0b3J5U3RyZWFtKTsKLQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU2tpcHBpbmcgb3B0aW1pemF0aW9uIG9mOiAiICsgZGVzY3JpcHRvcnNbaV0uZ2V0QXJ0aWZhY3RLZXkoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RhdHVzLnRvU3RyaW5nKCkpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwaW5nIG9wdGltaXphdGlvbiBvZjogIiArIGRlc2NyaXB0b3JzW2ldLmdldEFydGlmYWN0S2V5KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQcm9jZXNzaW5nU3RlcCBnZXRQcm9jZXNzaW5nU3RlcChTdHJpbmcgc3RyYXRlZ3kpIHsKLQkJaWYgKHN0cmF0ZWd5LmVxdWFscyhKQlBBVENIX1NURVBfSUQpKQotCQkJcmV0dXJuIG5ldyBKQkRpZmZTdGVwKHJlcG9zaXRvcnkpOwotCQlyZXR1cm4gbmV3IEpCRGlmZlppcFN0ZXAocmVwb3NpdG9yeSk7Ci0JfQotCi0JcHJpdmF0ZSBJQXJ0aWZhY3REZXNjcmlwdG9yW10gZ2V0U29ydGVkQ29tcGxldGVQcmVkZWNlc3NvcnMoSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5LCBJQXJ0aWZhY3RLZXlbXSByZWxhdGVkQXJ0aWZhY3RLZXlzKSB7Ci0JCS8vIGdldCBhbGwgYXJ0aWZhY3Qga2V5cwotCQlMaXN0IGNvbXBsZXRlRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KHJlbGF0ZWRBcnRpZmFjdEtleXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWxhdGVkQXJ0aWZhY3RLZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBpZiB3ZSBmaW5kILRvdXIgc2VsZrQgc2tpcAotCQkJaWYgKHJlbGF0ZWRBcnRpZmFjdEtleXNbaV0uZXF1YWxzKGFydGlmYWN0S2V5KSkKLQkJCQljb250aW51ZTsKLQkJCS8vIGxvb2sgZm9yIGEgY29tcGxldGUgYXJ0aWZhY3QgZGVzY3JpcHRvciBvZiB0aGUgY3VycmVudCBrZXkgIAotCQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gcmVwb3NpdG9yeS5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKHJlbGF0ZWRBcnRpZmFjdEtleXNbaV0pOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGorKykgewotCQkJCWlmIChpc0Nhbm9uaWNhbChkZXNjcmlwdG9yc1tqXSkpIHsKLQkJCQkJY29tcGxldGVEZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcnNbal0pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJQXJ0aWZhY3REZXNjcmlwdG9yW10gY29tcGxldGVTb3J0ZWREZXNjcmlwdG9ycyA9IChJQXJ0aWZhY3REZXNjcmlwdG9yW10pIGNvbXBsZXRlRGVzY3JpcHRvcnMudG9BcnJheShuZXcgSUFydGlmYWN0RGVzY3JpcHRvcltjb21wbGV0ZURlc2NyaXB0b3JzLnNpemUoKV0pOwotCQkvLyBTb3J0LCBzbyB0byBhbGxvdyBhIGRlcHRoIGxvb2t1cCEKLQkJQXJyYXlzLnNvcnQoY29tcGxldGVTb3J0ZWREZXNjcmlwdG9ycywgQVJUSUZBQ1RfREVTQ1JJUFRPUl9WRVJTSU9OX0NPTVBBUkFUT1IpOwotCQlyZXR1cm4gY29tcGxldGVTb3J0ZWREZXNjcmlwdG9yczsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNPcHRpbWl6ZWQoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBTdHJpbmcgc3RlcElkKSB7Ci0JCWlmIChkZXNjcmlwdG9yLmdldFByb2Nlc3NpbmdTdGVwcygpLmxlbmd0aCAhPSAxKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3RlcElkLmVxdWFscyhkZXNjcmlwdG9yLmdldFByb2Nlc3NpbmdTdGVwcygpWzBdLmdldFByb2Nlc3NvcklkKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0Nhbm9uaWNhbChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJLy8gVE9ETyBsZW5ndGggIT0gMCBpcyBub3QgbmVjZXNzYXJpbHkgYW4gaW5kaWNhdG9yIGZvciBub3QgYmVpbmcgY29tcGxldGUhICAgCi0JCXJldHVybiBkZXNjcmlwdG9yLmdldFByb2Nlc3NpbmdTdGVwcygpLmxlbmd0aCA9PSAwOwotCX0KLQotCXN0YXRpYyBmaW5hbCBjbGFzcyBBcnRpZmFjdERlc2NyaXB0b3JWZXJzaW9uQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFydGlmYWN0RGVzY3JpcHRvcjAsIE9iamVjdCBhcnRpZmFjdERlc2NyaXB0b3IxKSB7Ci0JCQlyZXR1cm4gLTEgKiAoKElBcnRpZmFjdERlc2NyaXB0b3IpIGFydGlmYWN0RGVzY3JpcHRvcjApLmdldEFydGlmYWN0S2V5KCkuZ2V0VmVyc2lvbigpLmNvbXBhcmVUbygoKElBcnRpZmFjdERlc2NyaXB0b3IpIGFydGlmYWN0RGVzY3JpcHRvcjEpLmdldEFydGlmYWN0S2V5KCkuZ2V0VmVyc2lvbigpKTsKLQkJfQotCX0KLQotCXN0YXRpYyBmaW5hbCBjbGFzcyBBcnRpZmFjdEtleVZlcnNpb25Db21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJ0aWZhY3RLZXkwLCBPYmplY3QgYXJ0aWZhY3RLZXkxKSB7Ci0JCQlyZXR1cm4gLTEgKiAoKElBcnRpZmFjdEtleSkgYXJ0aWZhY3RLZXkwKS5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKCgoSUFydGlmYWN0S2V5KSBhcnRpZmFjdEtleTEpLmdldFZlcnNpb24oKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjY2YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1DYW5fbm90X2NyZWF0ZV90ZW1wX2Rpcj1DYW5ub3QgY3JlYXRlIHRlbXBvcmFyeSB3b3JraW5nIGRpcmVjdG9yeSB7MH0uCi1DYW5fbm90X2RlbGV0ZV90ZW1wX2Rpcj1DYW5ubyBjcmVhdGUgdGVtcG9yYXJ5IHdvcmtpbmcgZGlyZWN0b3J5IHsxfS4KLUVtcHR5X3N0cmVhbT1FbXB0eSBpbnRlcm1lZGlhdGUgaW5jb21pbmcgc3RyZWFtLiBQcm9iYWJseSB6ZXJvIGxlbmd0aCBpbnB1dC4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvcGFjazIwMC9BcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZTlhYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL0FwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogCUlCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLnBhY2syMDA7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbiB7Ci0JLy9BcHBsaWNhdGlvbiByZXR1cm4gY29kZQotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgTk9OX1dSSVRUQUJMRV9SRVBPU0lUT1JZID0gbmV3IEludGVnZXIoLTEpOwotCi0JLy9BcHBsaWNhdGlvbiBhcmd1bWVudHMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfUkVQT1NJVE9SWV9BUkcgPSAiLWFydGlmYWN0UmVwb3NpdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfUkVQT1NJVE9SWV9TSE9SVF9BUkcgPSAiLWFyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBVUkwgYXJ0aWZhY3RSZXBvc2l0b3J5TG9jYXRpb247Ci0KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1hcCBhcmdzID0gY29udGV4dC5nZXRBcmd1bWVudHMoKTsKLQkJaW5pdGlhbGl6ZUZyb21Bcmd1bWVudHMoKFN0cmluZ1tdKSBhcmdzLmdldCgiYXBwbGljYXRpb24uYXJncyIpKTsgLy8kTk9OLU5MUy0xJAotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBzZXR1cFJlcG9zaXRvcnkoYXJ0aWZhY3RSZXBvc2l0b3J5TG9jYXRpb24pOwotCQlpZiAoIXJlcG9zaXRvcnkuaXNNb2RpZmlhYmxlKCkpCi0JCQlyZXR1cm4gTk9OX1dSSVRUQUJMRV9SRVBPU0lUT1JZOwotCQluZXcgT3B0aW1pemVyKHJlcG9zaXRvcnkpLnJ1bigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgc2V0dXBSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJLy8gVE9ETyBsb2cgaGVyZQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQkvL25vdGhpbmcgdG8gZG8KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbUFyZ3VtZW50cyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGFyZ3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBjaGVjayBmb3IgYXJncyB3aXRoIHBhcmFtZXRlcnMuIElmIHdlIGFyZSBhdCB0aGUgbGFzdCBhcmd1bWVudCBvciAKLQkJCS8vIGlmIHRoZSBuZXh0IG9uZSBoYXMgYSAnLScgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciwgdGhlbiB3ZSBjYW4ndCBoYXZlIAotCQkJLy8gYW4gYXJnIHdpdGggYSBwYXJhbSBzbyBjb250aW51ZS4KLQkJCWlmIChpID09IGFyZ3MubGVuZ3RoIC0gMSB8fCBhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBhcmcgPSBhcmdzWysraV07Ci0KLQkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKEFSVElGQUNUX1JFUE9TSVRPUllfQVJHKSB8fCBhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKEFSVElGQUNUX1JFUE9TSVRPUllfU0hPUlRfQVJHKSkKLQkJCQlhcnRpZmFjdFJlcG9zaXRvcnlMb2NhdGlvbiA9IG5ldyBVUkwoYXJnKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvcGFjazIwMC9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZGM3ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLnBhY2syMDA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMucGFjazIwMC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmYWlsZWRfZ2V0dGluZ19hcnRpZmFjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBza2lwX29wdGltaXphdGlvbjsKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL09wdGltaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL09wdGltaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmZhNWFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L29wdGltaXplcnMvcGFjazIwMC9PcHRpbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLnBhY2syMDA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgT3B0aW1pemVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0VEX0ZPUk1BVCA9ICJwYWNrZWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnk7Ci0KLQlwdWJsaWMgT3B0aW1pemVyKElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQl0aGlzLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJSUFydGlmYWN0S2V5W10ga2V5cyA9IHJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3RLZXlzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewotCQkJSUFydGlmYWN0S2V5IGtleSA9IGtleXNbaV07Ci0JCQlpZiAoIWtleS5nZXRDbGFzc2lmaWVyKCkuZXF1YWxzKCJwbHVnaW4iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gcmVwb3NpdG9yeS5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKGtleSk7Ci0JCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGNhbm9uaWNhbCA9IG51bGw7Ci0JCQlib29sZWFuIG9wdGltaXplZCA9IGZhbHNlOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGorKykgewotCQkJCUlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzW2pdOwotCQkJCWlmIChpc0Nhbm9uaWNhbChkZXNjcmlwdG9yKSkKLQkJCQkJY2Fub25pY2FsID0gZGVzY3JpcHRvcjsKLQkJCQlvcHRpbWl6ZWQgfD0gaXNPcHRpbWl6ZWQoZGVzY3JpcHRvcik7Ci0JCQl9Ci0JCQlpZiAoIW9wdGltaXplZCkKLQkJCQlvcHRpbWl6ZShjYW5vbmljYWwpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2Fub25pY2FsKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkvLyBUT0RPIGxlbmd0aCAhPSAwIGlzIG5vdCBuZWNlc3NhcmlseSBhbiBpbmRpY2F0b3IgZm9yIG5vdCBiZWluZyBjb21wbGV0ZSEKLQkJU3RyaW5nIGZvcm1hdCA9IGRlc2NyaXB0b3IuZ2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5GT1JNQVQpOwotCQlpZiAoZm9ybWF0ID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcHRpbWl6ZShJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJQXJ0aWZhY3REZXNjcmlwdG9yIG5ld0Rlc2NyaXB0b3IgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBzdGVwcyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB7bmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLlBhY2syMDBVbnBhY2tlciIsIG51bGwsIHRydWUpfTsgLy8kTk9OLU5MUy0xJAotCQluZXdEZXNjcmlwdG9yLnNldFByb2Nlc3NpbmdTdGVwcyhzdGVwcyk7Ci0JCW5ld0Rlc2NyaXB0b3Iuc2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5GT1JNQVQsIFBBQ0tFRF9GT1JNQVQpOwotCQlPdXRwdXRTdHJlYW0gcmVwb3NpdG9yeVN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXBvc2l0b3J5U3RyZWFtID0gcmVwb3NpdG9yeS5nZXRPdXRwdXRTdHJlYW0obmV3RGVzY3JpcHRvcik7Ci0KLQkJCS8vIEFkZCBpbiBhbGwgdGhlIHByb2Nlc3Npbmcgc3RlcHMgbmVlZGVkIHRvIG9wdGltaXplIChlLmcuLCBwYWNrMjAwLCAuLi4pCi0JCQlQcm9jZXNzaW5nU3RlcEhhbmRsZXIgaGFuZGxlciA9IG5ldyBQcm9jZXNzaW5nU3RlcEhhbmRsZXIoKTsKLQkJCU91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiA9IGhhbmRsZXIubGluayhuZXcgUHJvY2Vzc2luZ1N0ZXBbXSB7bmV3IFBhY2syMDBPcHRpbWl6ZXJTdGVwKCl9LCByZXBvc2l0b3J5U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gRG8gdGhlIGFjdHVhbCB3b3JrIGJ5IGFza2luZyB0aGUgcmVwbyB0byBnZXQgdGhlIGFydGlmYWN0IGFuZCBwdXQgaXQgaW4gdGhlIGRlc3RpbmF0aW9uLgotCQkJSVN0YXR1cyBzdGF0dXMgPSByZXBvc2l0b3J5LmdldEFydGlmYWN0KGRlc2NyaXB0b3IsIGRlc3RpbmF0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5mYWlsZWRfZ2V0dGluZ19hcnRpZmFjdCwgZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpKSk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKHN0YXR1cyk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuc2tpcF9vcHRpbWl6YXRpb24sIGRlc2NyaXB0b3IuZ2V0QXJ0aWZhY3RLZXkoKSkpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVwb3NpdG9yeVN0cmVhbSAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCXJlcG9zaXRvcnlTdHJlYW0uY2xvc2UoKTsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBQcm9jZXNzaW5nU3RlcEhhbmRsZXIuY2hlY2tTdGF0dXMocmVwb3NpdG9yeVN0cmVhbSk7Ci0JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLnNraXBfb3B0aW1pemF0aW9uLCBkZXNjcmlwdG9yLmdldEFydGlmYWN0S2V5KCkpKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzdGF0dXMudG9TdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5za2lwX29wdGltaXphdGlvbiwgZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzT3B0aW1pemVkKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gUEFDS0VEX0ZPUk1BVC5lcXVhbHMoZGVzY3JpcHRvci5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkZPUk1BVCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL1BhY2syMDBPcHRpbWl6ZXJTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL3BhY2syMDAvUGFjazIwME9wdGltaXplclN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE4MWE3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL3BhY2syMDAvUGFjazIwME9wdGltaXplclN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCUlCTSBDb3Jwb3JhdGlvbiAtIG9uZ29pbmcgZGV2ZWxvcG1lbnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMucGFjazIwMDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5BYnN0cmFjdEJ1ZmZlcmluZ1N0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yLkphclByb2Nlc3NvckV4ZWN1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yLkphclByb2Nlc3NvckV4ZWN1dG9yLk9wdGlvbnM7Ci0KLS8qKgotICogVGhlIFBhY2syMDBQYWNrZXIgZXhwZWN0cyBhbiBpbnB1dCBjb250YWluaW5nIG5vcm1hbCAiLmphciIgZGF0YS4gICAKLSAqLwotcHVibGljIGNsYXNzIFBhY2syMDBPcHRpbWl6ZXJTdGVwIGV4dGVuZHMgQWJzdHJhY3RCdWZmZXJpbmdTdGVwIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0VEX1NVRkZJWCA9ICIucGFjay5neiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIEZpbGUgaW5jb21pbmc7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBwYWNrMjAwQXZhaWxhYmxlOwotCi0Jc3RhdGljIHsKLQkJdHJ5IHsKLQkJCS8vIFRPRE8gVGhpcyBpcyBub3QgdmVyeSBlbGVnYW50LiBCdXQgdGhlcmUgaXMgY3VycmVudGx5IG5vIG90aGVyIHdheSB0byAKLQkJCS8vICAgICAgZmluZCBpdCBvdXQuIFBhY2tTdGVwLmNhblBhY2soKSBpcyBub3QgdmlzaWJsZSBkdWUgdG8gcmVzdHJpY3Rpb25zLgotCQkJSmFyUHJvY2Vzc29yLmdldFBhY2tQcm9jZXNzb3IobnVsbCk7Ci0JCQlwYWNrMjAwQXZhaWxhYmxlID0gdHJ1ZTsKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotCQkJcGFjazIwMEF2YWlsYWJsZSA9IGZhbHNlOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBjcmVhdGVJbmNvbWluZ1N0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWluY29taW5nID0gRmlsZS5jcmVhdGVUZW1wRmlsZShJTkNPTUlOR19ST09ULCBKQVJfU1VGRklYKTsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShpbmNvbWluZykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFudXBUZW1wRmlsZXMoKSB7Ci0JCXN1cGVyLmNsZWFudXBUZW1wRmlsZXMoKTsKLQkJaWYgKGluY29taW5nICE9IG51bGwpCi0JCQlpbmNvbWluZy5kZWxldGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtUHJvY2Vzc2luZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgcmVzdWx0RmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHRGaWxlID0gcHJvY2VzcygpOwotCQkJLy8gbm93IHdyaXRlIHRoZSBvcHRpbWl6ZWQgY29udGVudCB0byB0aGUgZGVzdGluYXRpb24KLQkJCWlmIChyZXN1bHRGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCUlucHV0U3RyZWFtIHJlc3VsdFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVzdWx0RmlsZSkpOwotCQkJCUZpbGVVdGlscy5jb3B5U3RyZWFtKHJlc3VsdFN0cmVhbSwgdHJ1ZSwgZ2V0RGVzdGluYXRpb24oKSwgZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXRTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJFbXB0eSBpbnRlcm1lZGlhdGUgZmlsZTogIiArIHJlc3VsdEZpbGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlc3VsdEZpbGUgIT0gbnVsbCkKLQkJCQlyZXN1bHRGaWxlLmRlbGV0ZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgcHJvY2VzcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghcGFjazIwMEF2YWlsYWJsZSkKLQkJCS8vIFRPRE8gU2xpZ2h0bHkgYWJ1c2VkIEFQSSEhCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBwYWNrMjAwIGNvbW1hbmQuIik7Ci0JCS8vIHVucGFjawotCQlPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotCQlvcHRpb25zLnBhY2sgPSB0cnVlOwotCQkvLyBUT0RPIHVzZSBmYWxzZSBoZXJlIGFzc3VtaW5nIHRoYXQgYWxsIGNvbnRlbnQgaXMgY29uZGl0aW9uZWQuICBOZWVkIHRvIHJldmlzZSB0aGlzCi0JCW9wdGlvbnMucHJvY2Vzc0FsbCA9IGZhbHNlOwotCQlvcHRpb25zLmlucHV0ID0gaW5jb21pbmc7Ci0JCW9wdGlvbnMub3V0cHV0RGlyID0gZ2V0V29ya0RpcigpLmdldFBhdGgoKTsKLQkJb3B0aW9ucy52ZXJib3NlID0gdHJ1ZTsKLQkJbmV3IEphclByb2Nlc3NvckV4ZWN1dG9yKCkucnVuSmFyUHJvY2Vzc29yKG9wdGlvbnMpOwotCQlyZXR1cm4gbmV3IEZpbGUoZ2V0V29ya0RpcigpLCBpbmNvbWluZy5nZXROYW1lKCkgKyBQQUNLRURfU1VGRklYKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3Qvb3B0aW1pemVycy9wYWNrMjAwL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL3BhY2syMDAvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5N2M4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9vcHRpbWl6ZXJzL3BhY2syMDAvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZmFpbGVkX2dldHRpbmdfYXJ0aWZhY3Q9RmFpbGVkIGdldHRpbmcgdGhlIGFydGlmYWN0IHswfS4KLXNraXBfb3B0aW1pemF0aW9uPVNraXBwaW5nIG9wdGltaXphdGlvbiBvZiB7MH0uIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGViNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9DREMtMS4xJUZvdW5kYXRpb24tMS4xIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NDAzMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTczYzEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1dlZCBOb3YgMTQgMTI6NDk6MzggRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTAzZDg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0jVHVlIE5vdiAwNiAyMDo0Njo1NCBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWluc3RhbmNlL29yZy5lY2xpcHNlLmNvcmUubmV0L29yZy5lY2xpcHNlLmNvcmUubmV0Lmhhc01pZ3JhdGVkPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2ViZWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jTW9uIE5vdiAwNSAyMToyMzo0MiBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzA4YjUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjEvRm91bmRhdGlvbi0xLjEsCi0gSjJTRS0xLjQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5LAotIG9yZy5lY2xpcHNlLm9zZ2kKLUltcG9ydC1QYWNrYWdlOiBpZS53b21iYXQuamJkaWZmLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3NvciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnNhciwKLSBvcmcuZWNsaXBzZS5pbnRlcm5hbC5wcm92aXNpb25hbC5lcXVpbm94LnAyLmphcnByb2Nlc3NvcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29yczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5qYXJkZWx0YTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5qYmRpZmY7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMucGFjazIwMDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy52ZXJpZmllcjt4LWludGVybmFsOj10cnVlCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMuQWN0aXZhdG9yCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ0MGFiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjUyOWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IHAyIEFydGlmYWN0IFByb2Nlc3NpbmcgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODBlMmQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLQk8ZXh0ZW5zaW9uCi0JCQlwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmdTdGVwcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuUGFjazIwMFVucGFja2VyIj4KLQkJPHN0ZXAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5wYWNrMjAwLlBhY2syMDBQcm9jZXNzb3JTdGVwIi8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nU3RlcHMiCi0JCQlpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLkphckRlbHRhUGF0Y2hTdGVwIj4KLQkJPHN0ZXAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5qYXJkZWx0YS5KYXJEZWx0YVByb2Nlc3NvclN0ZXAiLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCQlwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmdTdGVwcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuSkJQYXRjaFN0ZXAiPgotCQk8c3RlcCBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLmpiZGlmZi5KQlBhdGNoU3RlcCIvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJCXBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZ1N0ZXBzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5KQlBhdGNoWmlwU3RlcCI+Ci0JCTxzdGVwIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMuamJkaWZmLkpCUGF0Y2haaXBTdGVwIi8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nU3RlcHMiCi0JCQlpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLk1ENVZlcmlmaWVyIj4KLQkJPHN0ZXAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy52ZXJpZmllci5NRDVWZXJpZmllciIvPgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9wcm9jZXNzb3JzL0Fic3RyYWN0RGVsdGFQcm9jZXNzb3JTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9wcm9jZXNzb3JzL0Fic3RyYWN0RGVsdGFQcm9jZXNzb3JTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNjYzMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9BYnN0cmFjdERlbHRhUHJvY2Vzc29yU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBvbmdvaW5nIGRldmVsb3BtZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLkFic3RyYWN0RGVsdGFTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci0KLS8qKgotICogVGhlIDxjb2RlPkFic3RyYWN0RGVsdGFQYXRjaFN0ZXA8L2NvZGU+IGlzIGFuIGFic3RyYWN0IHByb2Nlc3Npbmcgc3RlcCB0aGF0Ci0gKiByZXRyaWV2ZXMgYSBsb2NhbCBhcnRpZmFjdCByZXBvc2l0b3J5IGNvbnRhaW5pbmcgdGhlIHNlcmlhbGl6ZWQvZW5jb2RlZAotICogYXJ0aWZhY3Qga2V5LiBJdCBhc3N1bWVzIHRoYXQgdGhlIGFydGlmYWN0IGtleSBpcyBzdG9yZWQgd2l0aGluIHRoZSBkYXRhIHByb3BlcnR5Ci0gKiBvZiB0aGUgcHJvY2Vzc2luZyBzdGVwIGRlc2NyaXB0b3IgZW5jb2RpbmcgdGhlIGFydGlmYWN0IGtleSBvZiB0aGUgYmFzZSBhcnRpZmFjdC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGVsdGFQcm9jZXNzb3JTdGVwIGV4dGVuZHMgQWJzdHJhY3REZWx0YVN0ZXAgewotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgZGVzY3JpcHRvciwgSUFydGlmYWN0RGVzY3JpcHRvciBjb250ZXh0KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoZGVzY3JpcHRvciwgY29udGV4dCk7Ci0JCWlmICghZ2V0U3RhdHVzKCkuaXNPSygpKQotCQkJcmV0dXJuOwotCQlmZXRjaExvY2FsQXJ0aWZhY3RSZXBvc2l0b3J5KCk7Ci0JfQotCi0JLyoqCi0JICogRmV0Y2ggYSBsb2NhbCBhcnRpZmFjdCByZXBvc2l0b3J5IGNvbnRhaW5pbmcgdGhlIGZldGNoZWQgYXJ0aWZhY3Qga2V5LgotCSAqLwotCXByaXZhdGUgdm9pZCBmZXRjaExvY2FsQXJ0aWZhY3RSZXBvc2l0b3J5KCkgewotCQlpZiAocmVwb3NpdG9yeSAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciByZXBvTWdyID0gKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKHJlcG9NZ3IgPT0gbnVsbCkgewotCQkJc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiQ291bGQgbm90IGdldCBhcnRpZmFjdCByZXBvc2l0b3J5IG1hbmFnZXIuIikpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJVVJMW10gcmVwb3NpdG9yaWVzID0gcmVwb01nci5nZXRLbm93blJlcG9zaXRvcmllcyhJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfTE9DQUwpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcG9zaXRvcmllcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IGN1cnJlbnRSZXBvID0gcmVwb01nci5sb2FkUmVwb3NpdG9yeShyZXBvc2l0b3JpZXNbaV0sIG51bGwpOwotCQkJCWlmIChjdXJyZW50UmVwby5jb250YWlucyhrZXkpKSB7Ci0JCQkJCXJlcG9zaXRvcnkgPSBjdXJyZW50UmVwbzsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9qdXN0IHNraXAgdW5yZWFkYWJsZSByZXBvc2l0b3JpZXMKLQkJCX0KLQkJfQotCQlzZXRTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJObyByZXBvc2l0b3J5IGF2YWlsYWJsZSBjb250YWluaW5nIGtleSAiICsga2V5KSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9wcm9jZXNzb3JzL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjExYWY5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9wcm9jZXNzb3JzL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCUlCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBY3RpdmF0b3IuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9qYXJkZWx0YS9EZWx0YUFwcGxpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvamFyZGVsdGEvRGVsdGFBcHBsaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZjRkMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9qYXJkZWx0YS9EZWx0YUFwcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLmphcmRlbHRhOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLQotcHVibGljIGNsYXNzIERlbHRhQXBwbGllciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTEVURV9TVUZGSVggPSAiLmRlbGV0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1RfRU5UUllfTkFNRSA9ICJNRVRBLUlORi9NQU5JRkVTVC5NRiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIEZpbGUgZGVsdGE7Ci0JcHJpdmF0ZSBGaWxlIGJhc2U7Ci0JcHJpdmF0ZSBGaWxlIGRlc3RpbmF0aW9uOwotCXByaXZhdGUgWmlwRmlsZSBiYXNlSmFyOwotCXByaXZhdGUgWmlwRmlsZSBkZWx0YUphcjsKLQlwcml2YXRlIFNldCBiYXNlRW50cmllczsKLQlwcml2YXRlIFppcEZpbGUgbWFuaWZlc3RKYXI7Ci0KLQlwdWJsaWMgRGVsdGFBcHBsaWVyKEZpbGUgYmFzZSwgRmlsZSBkZWx0YSwgRmlsZSBkZXN0aW5hdGlvbikgewotCQl0aGlzLmJhc2UgPSBiYXNlOwotCQl0aGlzLmRlbHRhID0gZGVsdGE7Ci0JCXRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoIW9wZW5KYXJzKCkpCi0JCQkJcmV0dXJuOwotCQkJYXBwbHlEZWx0YSgpOwotCQkJd3JpdGVSZXN1bHQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWNsb3NlSmFycygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGx5RGVsdGEoKSB7Ci0JCS8vIHN0YXJ0IG91dCBhc3N1bWluZyB0aGF0IGFsbCB0aGUgYmFzZSBlbnRyaWVzIHdpbGwgYmUgbW92ZWQgb3Zlci4gIAotCQliYXNlRW50cmllcyA9IGdldEVudHJpZXMoYmFzZUphcik7Ci0JCS8vIHJlbW92ZSBmcm9tIHRoZSBiYXNlIGFsbCB0aGUgZW50cmllcyB0aGF0IGFwcGVhciBpbiB0aGUgZGVsdGEKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gZGVsdGFKYXIuZW50cmllcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJWmlwRW50cnkgZW50cnkgPSAoKFppcEVudHJ5KSBlLm5leHRFbGVtZW50KCkpOwotCQkJY2hlY2tGb3JNYW5pZmVzdChlbnRyeSwgZGVsdGFKYXIpOwotCQkJU3RyaW5nIG5hbWUgPSBlbnRyeS5nZXROYW1lKCk7Ci0JCQlpZiAobmFtZS5lbmRzV2l0aChERUxFVEVfU1VGRklYKSkgewotCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gREVMRVRFX1NVRkZJWC5sZW5ndGgoKSk7Ci0JCQkJLy8gaWYgdGhlIG1hbmlmZXN0IGlzIGJlaW5nIGRlbGV0ZWQsIGZvcmdldCBhbnlvbmUgd2hvIG1pZ2h0IGhhdmUgYSBtYW5pZmVzdAotCQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUFOSUZFU1RfRU5UUllfTkFNRSkpCi0JCQkJCW1hbmlmZXN0SmFyID0gbnVsbDsKLQkJCX0KLQkJCWJhc2VFbnRyaWVzLnJlbW92ZShuYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZVJlc3VsdCgpIHsKLQkJWmlwT3V0cHV0U3RyZWFtIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdCA9IG5ldyBaaXBPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZGVzdGluYXRpb24pKTsKLQkJCQkvLyBpZiB0aGUgZGVsdGEgaW5jbHVkZXMgdGhlIG1hbmlmZXN0LCBiZSBzdXJlIHRvIHdyaXRlIGl0IGZpcnN0Ci0JCQkJaWYgKG1hbmlmZXN0SmFyICE9IG51bGwpCi0JCQkJCXdyaXRlRW50cnkocmVzdWx0LCBtYW5pZmVzdEphci5nZXRFbnRyeShNQU5JRkVTVF9FTlRSWV9OQU1FKSwgbWFuaWZlc3RKYXIsIHRydWUpOwotCQkJCS8vIHdyaXRlIG91dCB0aGUgdGhpbmdzIHdlIGtub3cgYXJlIHN0YXlpbmcgZnJvbSB0aGUgYmFzZSBKQVIKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBiYXNlRW50cmllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQkJWmlwRW50cnkgZW50cnkgPSBiYXNlSmFyLmdldEVudHJ5KChTdHJpbmcpIGkubmV4dCgpKTsKLQkJCQkJd3JpdGVFbnRyeShyZXN1bHQsIGVudHJ5LCBiYXNlSmFyLCBmYWxzZSk7Ci0JCQkJfQotCQkJCS8vIHdyaXRlIG91dCB0aGUgY2hhbmdlcy9hZGRpdGlvbnMgZnJvbSB0aGUgZGVsdGEuCi0JCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gZGVsdGFKYXIuZW50cmllcygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCQkJCQlaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotCQkJCQlpZiAoIWVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aChERUxFVEVfU1VGRklYKSkKLQkJCQkJCXdyaXRlRW50cnkocmVzdWx0LCBlbnRyeSwgZGVsdGFKYXIsIGZhbHNlKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJcmVzdWx0LmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVFbnRyeShaaXBPdXRwdXRTdHJlYW0gcmVzdWx0LCBaaXBFbnRyeSBlbnRyeSwgWmlwRmlsZSBzb3VyY2VKYXIsIGJvb2xlYW4gbWFuaWZlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICghbWFuaWZlc3QgJiYgZW50cnkuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoTUFOSUZFU1RfRU5UUllfTkFNRSkpCi0JCQlyZXR1cm47Ci0JCS8vIGFkZCB0aGUgZW50cnkKLQkJcmVzdWx0LnB1dE5leHRFbnRyeShlbnRyeSk7Ci0JCXRyeSB7Ci0JCQkvLyBpZiB0aGVyZSBpcyBhIHNvdXJjZUphciBjb3B5IG92ZXIgdGhlIGNvbnRlbnQgZm9yIHRoZSBlbnRyeSBpbnRvIHRoZSByZXN1bHQKLQkJCWlmIChzb3VyY2VKYXIgIT0gbnVsbCkgewotCQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gc291cmNlSmFyLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQkJCQl0cnkgewotCQkJCQl0cmFuc2ZlclN0cmVhbXMoY29udGVudHMsIHJlc3VsdCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJY29udGVudHMuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlyZXN1bHQuY2xvc2VFbnRyeSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVHJhbnNmZXJzIGFsbCBhdmFpbGFibGUgYnl0ZXMgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIHRvIHRoZSBnaXZlbgotCSAqIG91dHB1dCBzdHJlYW0uIERvZXMgbm90IGNsb3NlIGVpdGhlciBzdHJlYW0uCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhbnNmZXJTdHJlYW1zKElucHV0U3RyZWFtIHNvdXJjZSwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzb3VyY2UgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzb3VyY2UpOwotCQlkZXN0aW5hdGlvbiA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShkZXN0aW5hdGlvbik7Ci0JCXRyeSB7Ci0JCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCWludCBieXRlc1JlYWQgPSAtMTsKLQkJCQlpZiAoKGJ5dGVzUmVhZCA9IHNvdXJjZS5yZWFkKGJ1ZmZlcikpID09IC0xKQotCQkJCQlicmVhazsKLQkJCQlkZXN0aW5hdGlvbi53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlkZXN0aW5hdGlvbi5mbHVzaCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG9wZW5KYXJzKCkgewotCQl0cnkgewotCQkJYmFzZUphciA9IG5ldyBaaXBGaWxlKGJhc2UpOwotCQkJZGVsdGFKYXIgPSBuZXcgWmlwRmlsZShkZWx0YSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xvc2VKYXJzKCkgewotCQlpZiAoYmFzZUphciAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQliYXNlSmFyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCWlmIChkZWx0YUphciAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQlkZWx0YUphci5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCX0KLQotCXByaXZhdGUgU2V0IGdldEVudHJpZXMoWmlwRmlsZSBqYXIpIHsKLQkJSGFzaFNldCByZXN1bHQgPSBuZXcgSGFzaFNldChqYXIuc2l6ZSgpKTsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gamFyLmVudHJpZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVppcEVudHJ5IGVudHJ5ID0gKFppcEVudHJ5KSBlLm5leHRFbGVtZW50KCk7Ci0JCQljaGVja0Zvck1hbmlmZXN0KGVudHJ5LCBqYXIpOwotCQkJcmVzdWx0LmFkZChlbnRyeS5nZXROYW1lKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIHRoZSBnaXZlbiBlbnRyeSBpcyB0aGUgbWFuaWZlc3QuICBJZiBzbywgcmVtZW1iZXIgaXQgZm9yIHVzZSB3aGVuIHdyaXRpbmcKLQkgKiB0aGUgcmVzdWx0YW50IEpBUi4KLQkgKiBAcGFyYW0gZW50cnkKLQkgKiBAcGFyYW0gamFyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yTWFuaWZlc3QoWmlwRW50cnkgZW50cnksIFppcEZpbGUgamFyKSB7Ci0JCWlmIChlbnRyeS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShNQU5JRkVTVF9FTlRSWV9OQU1FKSkKLQkJCW1hbmlmZXN0SmFyID0gamFyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9qYXJkZWx0YS9KYXJEZWx0YVByb2Nlc3NvclN0ZXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvamFyZGVsdGEvSmFyRGVsdGFQcm9jZXNzb3JTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZGRhNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9qYXJkZWx0YS9KYXJEZWx0YVByb2Nlc3NvclN0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMuamFyZGVsdGE7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMuQWJzdHJhY3REZWx0YVByb2Nlc3NvclN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBQcm9jZXNzb3IgdGhhdCB0YWtlcyBhIEpBUiBkZWx0YSBhbmQgYXBwbGllcyBpdC4KLSAqLwotcHVibGljIGNsYXNzIEphckRlbHRhUHJvY2Vzc29yU3RlcCBleHRlbmRzIEFic3RyYWN0RGVsdGFQcm9jZXNzb3JTdGVwIHsKLQotCXByaXZhdGUgRmlsZSBpbmNvbWluZzsKLQotCXB1YmxpYyBKYXJEZWx0YVByb2Nlc3NvclN0ZXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBjcmVhdGVJbmNvbWluZ1N0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWluY29taW5nID0gRmlsZS5jcmVhdGVUZW1wRmlsZShJTkNPTUlOR19ST09ULCBKQVJfU1VGRklYKTsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShpbmNvbWluZykpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsZWFudXBUZW1wRmlsZXMoKSB7Ci0JCXN1cGVyLmNsZWFudXBUZW1wRmlsZXMoKTsKLQkJaWYgKGluY29taW5nICE9IG51bGwpCi0JCQlpbmNvbWluZy5kZWxldGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtUHJvY2Vzc2luZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgcmVzdWx0RmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHRGaWxlID0gcHJvY2VzcygpOwotCQkJLy8gbm93IHdyaXRlIHRoZSBvcHRpbWl6ZWQgY29udGVudCB0byB0aGUgZGVzdGluYXRpb24KLQkJCWlmIChyZXN1bHRGaWxlLmxlbmd0aCgpID4gMCkgewotCQkJCUlucHV0U3RyZWFtIHJlc3VsdFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVzdWx0RmlsZSkpOwotCQkJCUZpbGVVdGlscy5jb3B5U3RyZWFtKHJlc3VsdFN0cmVhbSwgdHJ1ZSwgZ2V0RGVzdGluYXRpb24oKSwgZmFsc2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXRTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJFbXB0eSBvcHRpbWl6ZWQgZmlsZTogIiArIHJlc3VsdEZpbGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHJlc3VsdEZpbGUgIT0gbnVsbCkKLQkJCQlyZXN1bHRGaWxlLmRlbGV0ZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgcHJvY2VzcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgcHJlZGVjZXNzb3IgPSBudWxsOwotCQl0cnkgewotCQkJRmlsZSByZXN1bHRGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShSRVNVTFRfUk9PVCwgSkFSX1NVRkZJWCk7Ci0JCQkvLyBnZXQgdGhlIHByZWRlY2Vzc29yIGFuZCBwZXJmb3JtIHRoZSBvcHRpbWl6YXRpb24gaW50byBhIHRlbXAgZmlsZQotCQkJcHJlZGVjZXNzb3IgPSBmZXRjaFByZWRlY2Vzc29yKG5ldyBBcnRpZmFjdERlc2NyaXB0b3Ioa2V5KSk7Ci0JCQluZXcgRGVsdGFBcHBsaWVyKHByZWRlY2Vzc29yLCBpbmNvbWluZywgcmVzdWx0RmlsZSkucnVuKCk7Ci0JCQlyZXR1cm4gcmVzdWx0RmlsZTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vIGlmIHdlIGhhdmUgYSBwcmVkZWNlc3NvciBhbmQgaXQgaXMgb3VyIHRlbXAgZmlsZSB0aGVuIGNsZWFuIHVwIHRoZSBmaWxlCi0JCQlpZiAocHJlZGVjZXNzb3IgIT0gbnVsbCAmJiBwcmVkZWNlc3Nvci5nZXRBYnNvbHV0ZVBhdGgoKS5pbmRleE9mKFBSRURFQ0VTU09SX1JPT1QpID4gLTEpCi0JCQkJcHJlZGVjZXNzb3IuZGVsZXRlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9wcm9jZXNzb3JzL2piZGlmZi9KQlBhdGNoU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9qYmRpZmYvSkJQYXRjaFN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRiYmUxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9wcm9jZXNzb3JzL2piZGlmZi9KQlBhdGNoU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBvbmdvaW5nIGRldmVsb3BtZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLmpiZGlmZjsKLQotaW1wb3J0IGllLndvbWJhdC5qYmRpZmYuSkJQYXRjaDsKLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLkFic3RyYWN0RGVsdGFQcm9jZXNzb3JTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnNhci5EaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGUgSkJQYXRjaFN0ZXAgcGF0Y2hlcyBhIEpCRGlmZiBiYXNlZCBkYXRhLiAgIAotICovCi1wdWJsaWMgY2xhc3MgSkJQYXRjaFN0ZXAgZXh0ZW5kcyBBYnN0cmFjdERlbHRhUHJvY2Vzc29yU3RlcCB7Ci0KLQlwdWJsaWMgSkJQYXRjaFN0ZXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIE91dHB1dFN0cmVhbSBjcmVhdGVJbmNvbWluZ1N0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVByb2Nlc3NpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcHJlZGVjZXNzb3IgPSBmZXRjaFByZWRlY2Vzc29yQnl0ZXMobmV3IEFydGlmYWN0RGVzY3JpcHRvcihrZXkpKTsKLQkJRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIGN1cnJlbnQgPSAoRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtKSBpbmNvbWluZ1N0cmVhbTsKLQkJYnl0ZVtdIHJlc3VsdCA9IEpCUGF0Y2guYnNwYXRjaChwcmVkZWNlc3Nvci5nZXRCdWZmZXIoKSwgcHJlZGVjZXNzb3IuZ2V0QnVmZmVyTGVuZ3RoKCksIGN1cnJlbnQuZ2V0QnVmZmVyKCksIGN1cnJlbnQuZ2V0QnVmZmVyTGVuZ3RoKCkpOwotCQkvLyBmcmVlIHVwIHRoZSBtZW1vcnkgYXMgc29vbiBhcyBwb3NzaWJsZS4KLQkJcHJlZGVjZXNzb3IgPSBudWxsOwotCQljdXJyZW50ID0gbnVsbDsKLQkJaW5jb21pbmdTdHJlYW0gPSBudWxsOwotCi0JCS8vIGNvcHkgdGhlIHJlc3VsdCBvZiB0aGUgb3B0aW1pemF0aW9uIHRvIHRoZSBkZXN0aW5hdGlvbi4KLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3VsdCksIHRydWUsIGdldERlc3RpbmF0aW9uKCksIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSBmZXRjaFByZWRlY2Vzc29yQnl0ZXMoQXJ0aWZhY3REZXNjcmlwdG9yIGFydGlmYWN0RGVzY3JpcHRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc2V0U3RhdHVzKHJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3QoYXJ0aWZhY3REZXNjcmlwdG9yLCByZXN1bHQsIGdldFByb2dyZXNzTW9uaXRvcigpKSk7Ci0JCWlmICghZ2V0U3RhdHVzKCkuaXNPSygpKQotCQkJdGhyb3cgKElPRXhjZXB0aW9uKSBuZXcgSU9FeGNlcHRpb24oZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpKS5pbml0Q2F1c2UoZ2V0U3RhdHVzKCkuZ2V0RXhjZXB0aW9uKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9wcm9jZXNzb3JzL2piZGlmZi9KQlBhdGNoWmlwU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9qYmRpZmYvSkJQYXRjaFppcFN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUxZjIyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9wcm9jZXNzb3JzL2piZGlmZi9KQlBhdGNoWmlwU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBvbmdvaW5nIGRldmVsb3BtZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLmpiZGlmZjsKLQotaW1wb3J0IGllLndvbWJhdC5qYmRpZmYuSkJQYXRjaDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5zYXIuRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyLlNhclV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+SkJQYXRjaFppcFN0ZXA8L2NvZGU+IHBhdGNoZXMgYSBKQkRpZmYgYmFzZWQgZGlmZiBvZiB6aXBzL2phcnMuICAgCi0gKi8KLXB1YmxpYyBjbGFzcyBKQlBhdGNoWmlwU3RlcCBleHRlbmRzIEpCUGF0Y2hTdGVwIHsKLQotCXB1YmxpYyBKQlBhdGNoWmlwU3RlcCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtUHJvY2Vzc2luZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSBwcmVkZWNlc3NvciA9IGZldGNoUHJlZGVjZXNzb3JCeXRlcyhuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSkpOwotCQlEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY3VycmVudCA9IChEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0pIGluY29taW5nU3RyZWFtOwotCQlieXRlW10gcmVzdWx0ID0gSkJQYXRjaC5ic3BhdGNoKHByZWRlY2Vzc29yLmdldEJ1ZmZlcigpLCBwcmVkZWNlc3Nvci5nZXRCdWZmZXJMZW5ndGgoKSwgY3VycmVudC5nZXRCdWZmZXIoKSwgY3VycmVudC5nZXRCdWZmZXJMZW5ndGgoKSk7Ci0JCS8vIGZyZWUgdXAgdGhlIG1lbW9yeSBhcyBzb29uIGFzIHBvc3NpYmxlLgotCQlwcmVkZWNlc3NvciA9IG51bGw7Ci0JCWN1cnJlbnQgPSBudWxsOwotCQlpbmNvbWluZ1N0cmVhbSA9IG51bGw7Ci0KLQkJLy8gY29weSB0aGUgcmVzdWx0IG9mIHRoZSBvcHRpbWl6YXRpb24gdG8gdGhlIGRlc3RpbmF0aW9uLgotCQlTYXJVdGlsLnNhclRvWmlwKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyZXN1bHQpLCB0cnVlLCBnZXREZXN0aW5hdGlvbigpLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZmV0Y2hQcmVkZWNlc3NvckJ5dGVzKEFydGlmYWN0RGVzY3JpcHRvciBhcnRpZmFjdERlc2NyaXB0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCURpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSB6aXBwZWRQcmVkZWNlc3NvciA9IG5ldyBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc2V0U3RhdHVzKHJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3QoYXJ0aWZhY3REZXNjcmlwdG9yLCB6aXBwZWRQcmVkZWNlc3NvciwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpKTsKLQkJaWYgKCFnZXRTdGF0dXMoKS5pc09LKCkpCi0JCQl0aHJvdyAoSU9FeGNlcHRpb24pIG5ldyBJT0V4Y2VwdGlvbihnZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCkpLmluaXRDYXVzZShnZXRTdGF0dXMoKS5nZXRFeGNlcHRpb24oKSk7Ci0KLQkJRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJU2FyVXRpbC56aXBUb1Nhcih6aXBwZWRQcmVkZWNlc3Nvci5nZXRJbnB1dFN0cmVhbSgpLCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvcGFjazIwMC9QYWNrMjAwUHJvY2Vzc29yU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9wYWNrMjAwL1BhY2syMDBQcm9jZXNzb3JTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzA5OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy9wYWNrMjAwL1BhY2syMDBQcm9jZXNzb3JTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogIElCTSBDb3Jwb3JhdGlvbiAtIG9uZ29pbmcgZGV2ZWxvcG1lbnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMucGFjazIwMDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5BYnN0cmFjdEJ1ZmZlcmluZ1N0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5qYXJwcm9jZXNzb3IuVW5wYWNrU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yRXhlY3V0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yRXhlY3V0b3IuT3B0aW9uczsKLQotLyoqCi0gKiBUaGUgUGFjazIwMFVucGFja2VyIGV4cGVjdHMgYW4gaW5wdXQgY29udGFpbmluZyAiLmphci5wYWNrLmd6IiBkYXRhLiAgIAotICovCi1wdWJsaWMgY2xhc3MgUGFjazIwMFByb2Nlc3NvclN0ZXAgZXh0ZW5kcyBBYnN0cmFjdEJ1ZmZlcmluZ1N0ZXAgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tFRF9TVUZGSVggPSAiLnBhY2suZ3oiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEZpbGUgaW5jb21pbmc7Ci0KLQlwcm90ZWN0ZWQgT3V0cHV0U3RyZWFtIGNyZWF0ZUluY29taW5nU3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW5jb21pbmcgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKElOQ09NSU5HX1JPT1QsIEpBUl9TVUZGSVggKyBQQUNLRURfU1VGRklYKTsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShpbmNvbWluZykpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElBcnRpZmFjdERlc2NyaXB0b3IgY29udGV4dCkgewotCQlzdXBlci5pbml0aWFsaXplKGRlc2NyaXB0b3IsIGNvbnRleHQpOwotCQlpZiAoIVVucGFja1N0ZXAuY2FuVW5wYWNrKCkpCi0JCQlzZXRTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJVbnBhY2sgZmFjaWxpdHkgbm90IGNvbmZpZ3VyZWQiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbGVhbnVwVGVtcEZpbGVzKCkgewotCQlzdXBlci5jbGVhbnVwVGVtcEZpbGVzKCk7Ci0JCWlmIChpbmNvbWluZyAhPSBudWxsKQotCQkJaW5jb21pbmcuZGVsZXRlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybVByb2Nlc3NpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIHJlc3VsdEZpbGUgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0RmlsZSA9IHByb2Nlc3MoKTsKLQkJCS8vIG5vdyB3cml0ZSB0aGUgcHJvY2Vzc2VkIGNvbnRlbnQgdG8gdGhlIGRlc3RpbmF0aW9uCi0JCQlpZiAocmVzdWx0RmlsZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlJbnB1dFN0cmVhbSByZXN1bHRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHJlc3VsdEZpbGUpKTsKLQkJCQlGaWxlVXRpbHMuY29weVN0cmVhbShyZXN1bHRTdHJlYW0sIHRydWUsIGdldERlc3RpbmF0aW9uKCksIGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2V0U3RhdHVzKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiRW1wdHkgaW50ZXJtZWRpYXRlIGZpbGU6ICIgKyByZXN1bHRGaWxlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChyZXN1bHRGaWxlICE9IG51bGwpCi0JCQkJcmVzdWx0RmlsZS5kZWxldGUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBGaWxlIHByb2Nlc3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlPcHRpb25zIG9wdGlvbnMgPSBuZXcgT3B0aW9ucygpOwotCQlvcHRpb25zLnVucGFjayA9IHRydWU7Ci0JCS8vIFRPRE8gdXNlIGZhbHNlIGhlcmUgYXNzdW1pbmcgdGhhdCBhbGwgY29udGVudCBpcyBjb25kaXRpb25lZC4gIE5lZWQgdG8gcmV2aXNlIHRoaXMKLQkJb3B0aW9ucy5wcm9jZXNzQWxsID0gZmFsc2U7Ci0JCW9wdGlvbnMuaW5wdXQgPSBpbmNvbWluZzsKLQkJb3B0aW9ucy5vdXRwdXREaXIgPSBnZXRXb3JrRGlyKCkuZ2V0UGF0aCgpOwotCQlvcHRpb25zLnZlcmJvc2UgPSBmYWxzZTsKLQkJbmV3IEphclByb2Nlc3NvckV4ZWN1dG9yKCkucnVuSmFyUHJvY2Vzc29yKG9wdGlvbnMpOwotCQlyZXR1cm4gbmV3IEZpbGUoZ2V0V29ya0RpcigpLCBpbmNvbWluZy5nZXROYW1lKCkuc3Vic3RyaW5nKDAsIGluY29taW5nLmdldE5hbWUoKS5sZW5ndGgoKSAtIFBBQ0tFRF9TVUZGSVgubGVuZ3RoKCkpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy92ZXJpZmllci9NRDVWZXJpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcHJvY2Vzc29ycy92ZXJpZmllci9NRDVWZXJpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTE2MWRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3Byb2Nlc3NvcnMvdmVyaWZpZXIvTUQ1VmVyaWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gb25nb2luZyBkZXZlbG9wbWVudAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy52ZXJpZmllcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNRDVWZXJpZmllciBleHRlbmRzIFByb2Nlc3NpbmdTdGVwIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgbWQ1VGVzdDsKLQlwcml2YXRlIE1lc3NhZ2VEaWdlc3QgbWQ1OwotCi0JcHVibGljIE1ENVZlcmlmaWVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBNRDVWZXJpZmllcihTdHJpbmcgbWQ1VGVzdCkgewotCQlzdXBlcigpOwotCQl0aGlzLm1kNVRlc3QgPSBtZDVUZXN0OwotCQliYXNpY0luaXRpYWxpemUobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgZGVzY3JpcHRvciwgSUFydGlmYWN0RGVzY3JpcHRvciBjb250ZXh0KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoZGVzY3JpcHRvciwgY29udGV4dCk7Ci0JCVN0cmluZyBkYXRhID0gZGVzY3JpcHRvci5nZXREYXRhKCk7Ci0JCWlmIChkYXRhLmVxdWFscygiZG93bmxvYWQiKSkKLQkJCW1kNVRlc3QgPSBjb250ZXh0LmdldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuRE9XTkxPQURfTUQ1KTsKLQkJZWxzZSBpZiAoZGF0YS5lcXVhbHMoImFydGlmYWN0IikpCi0JCQltZDVUZXN0ID0gY29udGV4dC5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkFSVElGQUNUX01ENSk7Ci0JCWVsc2UKLQkJCW1kNVRlc3QgPSBkYXRhOwotCQliYXNpY0luaXRpYWxpemUoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhc2ljSW5pdGlhbGl6ZShQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpbnQgY29kZSA9IChkZXNjcmlwdG9yID09IG51bGwpID8gSVN0YXR1cy5FUlJPUiA6IGRlc2NyaXB0b3IuaXNSZXF1aXJlZCgpID8gSVN0YXR1cy5FUlJPUiA6IElTdGF0dXMuSU5GTzsKLQkJaWYgKG1kNVRlc3QgPT0gbnVsbCB8fCBtZDVUZXN0Lmxlbmd0aCgpICE9IDMyKQotCQkJc2V0U3RhdHVzKG5ldyBTdGF0dXMoY29kZSwgQWN0aXZhdG9yLklELCAiTUQ1IHZhbHVlIG5vdCBhdmFpbGFibGUgb3IgaW5jb3JyZWN0IHNpemUiKSk7Ci0JCXRyeSB7Ci0JCQltZDUgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJNRDUiKTsKLQkJfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLQkJCXNldFN0YXR1cyhuZXcgU3RhdHVzKGNvZGUsIEFjdGl2YXRvci5JRCwgIkNvdWxkIG5vdCBjcmVhdGUgTUQ1IGFsZ29yaXRobSIsIGUpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYiAhPSAtMSkKLQkJCW1kNS51cGRhdGUoKGJ5dGUpIGIpOwotCQlnZXREZXN0aW5hdGlvbigpLndyaXRlKGIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuY2xvc2UoKTsKLQotCQlieXRlW10gZGlnZXN0ID0gbWQ1LmRpZ2VzdCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRpZ2VzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKChkaWdlc3RbaV0gJiAweEZGKSA8IDB4MTApCi0JCQkJYnVmLmFwcGVuZCgnMCcpOwotCQkJYnVmLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGRpZ2VzdFtpXSAmIDB4RkYpKTsKLQkJfQotCi0JCS8vIGlmIHRoZSBoYXNoZXMgZG9uJ3QgbGluZSB1cCBzZXQgdGhlIHN0YXR1cyB0byBlcnJvci4KLQkJaWYgKCFidWYudG9TdHJpbmcoKS5lcXVhbHMobWQ1VGVzdCkpCi0JCQlzZXRTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJFcnJvciBwcm9jZXNzaW5nIHN0cmVhbS4gTUQ1IGhhc2ggaXMgbm90IGFzIGV4cGVjdGVkLiIpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiYjdhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ly5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMzA5NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDNiODA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0jVGh1IEZlYiAyMSAxNTozNzoyNCBFU1QgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0NmQ4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotI1R1ZSBBdWcgMjEgMTE6Mjc6NDggQ0RUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPXVzZXIKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD05OQotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzllNGU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPXRydWUKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViZWE4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5O3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm1pcnJvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucyIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnNpbXBsZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNlbGZob3N0aW5nLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbiwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkaywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbiwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlIgotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5wYXJzZXJzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcztyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcDt2ZXJzaW9uPSIxLjAuMCI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5qYXJwcm9jZXNzb3I7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnBlcnNpc3RlbmNlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkuc3RvcmFnZSwKLSBvcmcuZWNsaXBzZS5pbnRlcm5hbC5wcm92aXNpb25hbC5lcXVpbm94LnAyLmphcnByb2Nlc3NvcjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXI7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2lnbmVkY29udGVudDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiLAotIG9yZy5vc2dpLnNlcnZpY2UucHJlZnM7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLnV0aWwudHJhY2tlcjt2ZXJzaW9uPSIxLjMuMCIsCi0gb3JnLnczYy5kb20sCi0gb3JnLnhtbC5zYXg7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BY3RpdmF0b3IKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQsCi0gQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIsCi0gb3JnLmVjbGlwc2UuZWNmLAotIG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkKLUVjbGlwc2UtQnVkZHlQb2xpY3k6IHJlZ2lzdGVyZWQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTg1YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvcDIgdG9vbHMgLSBtaXJyb3IgYXJ0aWZhY3RzLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3AyIHRvb2xzIC0gbWlycm9yIGFydGlmYWN0cy5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxOWYwNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvcDIgdG9vbHMgLSBtaXJyb3IgYXJ0aWZhY3RzLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuRXF1aW5veExhdW5jaGVyIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlL3AyIHRvb2xzIC0gbWlycm9yIGFydGlmYWN0cyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0X2F1dG9fc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPGludEF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfc3RhcnRfbGV2ZWwiIHZhbHVlPSI0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1jb25zb2xlIC1jb25zb2xlbG9nIC1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLm1pcnJvckFwcGxpY2F0aW9uJiMxMzsmIzEwOy1zb3VyY2UgaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvdGVzdFVwZGF0ZXMmIzEzOyYjMTA7LWRlc3RpbmF0aW9uIGZpbGU6ZDovdG1wL2VxdWlub3gucDIvc2VydmVycy5taXJyb3IiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icGRlLnZlcnNpb24iIHZhbHVlPSIzLjMiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ic2hvd19zZWxlY3RlZF9vbmx5IiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0YXJnZXRfYnVuZGxlcyIgdmFsdWU9ImphdmF4LnNlcnZsZXRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuam9ic0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpQDosb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlc0BkZWZhdWx0OmRlZmF1bHQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VOYW1lZEpSRSIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ3b3Jrc3BhY2VfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmVjZkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRvd25sb2FkQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvckBkZWZhdWx0OmRlZmF1bHQiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzN2Y1YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggUHJvdmlzaW9uaW5nIEFydGlmYWN0IFJlcG9zaXRvcnkgU3VwcG9ydAotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTg4ZmRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9ImFydGlmYWN0UmVwb3NpdG9yaWVzIiBuYW1lPSJBcnRpZmFjdCBSZXBvc2l0b3JpZXMiIHNjaGVtYT0ic2NoZW1hL2FydGlmYWN0UmVwb3NpdG9yaWVzLmV4c2QiLz4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9InByb2Nlc3NpbmdTdGVwcyIgbmFtZT0iUHJvY2Vzc2luZyBTdGVwcyIgc2NoZW1hPSJzY2hlbWEvcHJvY2Vzc2luZ1N0ZXBzLmV4c2QiLz4KLQotICAgPGV4dGVuc2lvbiBpZD0ic2ltcGxlUmVwb3NpdG9yeSIgIHBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuYXJ0aWZhY3RSZXBvc2l0b3JpZXMiPgotCQk8ZmlsdGVyIHN1ZmZpeD0iYXJ0aWZhY3RzLnhtbCIvPgotCQk8ZmFjdG9yeSBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5Ii8+Ci0gICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJCXBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZ1N0ZXBzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5TaWduYXR1cmVWZXJpZmllciI+Ci0JCTxzdGVwIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuU2lnbmF0dXJlVmVyaWZpZXIiLz4KLQk8L2V4dGVuc2lvbj4KLQotICAgPGV4dGVuc2lvbiBpZD0ibWlycm9yQXBwbGljYXRpb24iICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+Ci0gICAgICA8YXBwbGljYXRpb24gY2FyZGluYWxpdHk9IjEiIHRocmVhZD0ibWFpbiIgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgICAgICA8cnVuIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm1pcnJvci5NaXJyb3JBcHBsaWNhdGlvbiIvPgotICAgICAgPC9hcHBsaWNhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zY2hlbWEvYXJ0aWZhY3RSZXBvc2l0b3JpZXMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NjaGVtYS9hcnRpZmFjdFJlcG9zaXRvcmllcy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmMwYWRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NjaGVtYS9hcnRpZmFjdFJlcG9zaXRvcmllcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5IiBpZD0iYXJ0aWZhY3RSZXBvc2l0b3JpZXMiIG5hbWU9IkFydGlmYWN0IFJlcG9zaXRvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyB1c2VkIHRvIHByb3ZpZGUgYXJ0aWZhY3QgcmVwb3NpdG9yeSBpbXBsZW1lbnRhdGlvbnMKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmaWx0ZXIiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSIxIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZhY3RvcnkiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgYSBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIAotJmx0O3NhbXAmZ3Q7b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnkmbHQ7L3NhbXAmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnkiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmlsdGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ic3VmZml4IiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkgMC4xLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgY2xhc3MgYXR0cmlidXRlIG11c3QgcmVwcmVzZW50IGFuIAotaW1wbGVtZW50b3Igb2YgJmx0O3R0Jmd0O29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5Jmx0Oy90dCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NjaGVtYS9wcm9jZXNzaW5nU3RlcHMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NjaGVtYS9wcm9jZXNzaW5nU3RlcHMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJkYmIwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zY2hlbWEvcHJvY2Vzc2luZ1N0ZXBzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkiIGlkPSJwcm9jZXNzaW5nU3RlcHMiIG5hbWU9IlByb2Nlc3NpbmcgU3RlcHMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZCB0byBwcm92aWRlIHByb2Nlc3Npbmcgc3RlcCBpbXBsZW1lbnRhdGlvbnMKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0ic3RlcCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzdGVwIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDoiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5ID8uPy4/Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBleHRlbnNpb24gcG9pbnQgdXNhZ2UgZXhhbXBsZSBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIGNsYXNzIGF0dHJpYnV0ZSBtdXN0IHJlcHJlc2VudCBhbiAKLWltcGxlbWVudG9yIG9mICZsdDt0dCZndDtvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NpbmcuSVByb2Nlc3NpbmdTdGVwJmx0Oy90dCZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIAotYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EgCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L21pcnJvci9NaXJyb3JBcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvbWlycm9yL01pcnJvckFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjc3NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvbWlycm9yL01pcnJvckFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5taXJyb3I7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci0KLS8qKgotICogQW4gYXBwbGljYXRpb24gdGhhdCBwZXJmb3JtcyBtaXJyb3Jpbmcgb2YgYXJ0aWZhY3RzIGJldHdlZW4gcmVwb3NpdG9yaWVzLgotICovCi1wdWJsaWMgY2xhc3MgTWlycm9yQXBwbGljYXRpb24gaW1wbGVtZW50cyBJQXBwbGljYXRpb24gewotCi0JcHJpdmF0ZSBVUkwgc291cmNlTG9jYXRpb247Ci0JcHJpdmF0ZSBVUkwgZGVzdGluYXRpb25Mb2NhdGlvbjsKLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgc291cmNlOwotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSBkZXN0aW5hdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gYXBwZW5kOwotCXByaXZhdGUgYm9vbGVhbiByYXcgPSBmYWxzZTsKLQotCXB1YmxpYyBPYmplY3Qgc3RhcnQoSUFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWFwIGFyZ3MgPSBjb250ZXh0LmdldEFyZ3VtZW50cygpOwotCQlpbml0aWFsaXplRnJvbUFyZ3VtZW50cygoU3RyaW5nW10pIGFyZ3MuZ2V0KCJhcHBsaWNhdGlvbi5hcmdzIikpOwotCQlzZXR1cFJlcG9zaXRvcmllcygpOwotCQluZXcgTWlycm9yaW5nKHNvdXJjZSwgZGVzdGluYXRpb24sIHJhdykucnVuKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXR1cFJlcG9zaXRvcmllcygpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCS8vIFRPRE8gbG9nIGhlcmUKLQkJCXJldHVybjsKLQotCQlzb3VyY2UgPSBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KHNvdXJjZUxvY2F0aW9uLCBudWxsKTsKLQkJaWYgKGRlc3RpbmF0aW9uTG9jYXRpb24gIT0gbnVsbCkKLQkJCWRlc3RpbmF0aW9uID0gaW5pdGlhbGl6ZURlc3RpbmF0aW9uKCk7Ci0JCWVsc2UKLQkJCWRlc3RpbmF0aW9uID0gc291cmNlOwotCX0KLQotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSBpbml0aWFsaXplRGVzdGluYXRpb24oKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXRyeSB7Ci0JCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KGRlc3RpbmF0aW9uTG9jYXRpb24sIG51bGwpOwotCQkJaWYgKCFyZXBvc2l0b3J5LmlzTW9kaWZpYWJsZSgpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkFydGlmYWN0IHJlcG9zaXRvcnkgbm90IG1vZGlmaWFibGU6ICIgKyBkZXN0aW5hdGlvbkxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCFhcHBlbmQpCi0JCQkJcmVwb3NpdG9yeS5yZW1vdmVBbGwoKTsKLQkJCXJldHVybiByZXBvc2l0b3J5OwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy9mYWxsIHRocm91Z2ggYW5kIGNyZWF0ZSBhIG5ldyByZXBvc2l0b3J5IGJlbG93Ci0JCX0KLQkJLy8gCXRoZSBnaXZlbiByZXBvIGxvY2F0aW9uIGlzIG5vdCBhbiBleGlzdGluZyByZXBvIHNvIHdlIGhhdmUgdG8gY3JlYXRlIHNvbWV0aGluZwotCQkvLyBUT0RPIGZvciBub3cgY3JlYXRlIGEgU2ltcGxlIHJlcG8gYnkgZGVmYXVsdC4KLQkJU3RyaW5nIHJlcG9zaXRvcnlOYW1lID0gZGVzdGluYXRpb25Mb2NhdGlvbiArICIgLSBhcnRpZmFjdHMiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBtYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkoZGVzdGluYXRpb25Mb2NhdGlvbiwgcmVwb3NpdG9yeU5hbWUsIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLlRZUEVfU0lNUExFX1JFUE9TSVRPUlksIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZUZyb21Bcmd1bWVudHMoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhcmdzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aG91dCBwYXJhbWV0ZXJzIChpLmUuLCBhIGZsYWcgYXJnKQotCQkJaWYgKGFyZ3NbaV0uZXF1YWxzKCItcmF3IikpCi0JCQkJcmF3ID0gdHJ1ZTsKLQotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aCBwYXJhbWV0ZXJzLiBJZiB3ZSBhcmUgYXQgdGhlIGxhc3QgYXJndW1lbnQgb3IgCi0JCQkvLyBpZiB0aGUgbmV4dCBvbmUgaGFzIGEgJy0nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIsIHRoZW4gd2UgY2FuJ3QgaGF2ZSAKLQkJCS8vIGFuIGFyZyB3aXRoIGEgcGFyYW0gc28gY29udGludWUuCi0JCQlpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEgfHwgYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1srK2ldOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLXNvdXJjZSIpKQotCQkJCXNvdXJjZUxvY2F0aW9uID0gbmV3IFVSTChhcmcpOwotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoIi1kZXN0aW5hdGlvbiIpKQotCQkJCWRlc3RpbmF0aW9uTG9jYXRpb24gPSBuZXcgVVJMKGFyZyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9taXJyb3IvTWlycm9yaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9taXJyb3IvTWlycm9yaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMGM5MGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvbWlycm9yL01pcnJvcmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoJCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSB2YXJpb3VzIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm1pcnJvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLQotLyoqCi0gKiBBIHV0aWxpdHkgY2xhc3MgdGhhdCBwZXJmb3JtcyBtaXJyb3Jpbmcgb2YgYXJ0aWZhY3RzIGJldHdlZW4gcmVwb3NpdG9yaWVzLgotICovCi1wdWJsaWMgY2xhc3MgTWlycm9yaW5nIHsKLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgc291cmNlOwotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSBkZXN0aW5hdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gcmF3OwotCi0JcHVibGljIE1pcnJvcmluZyhJQXJ0aWZhY3RSZXBvc2l0b3J5IHNvdXJjZSwgSUFydGlmYWN0UmVwb3NpdG9yeSBkZXN0aW5hdGlvbiwgYm9vbGVhbiByYXcpIHsKLQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCXRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKLQkJdGhpcy5yYXcgPSByYXc7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlpZiAoIWRlc3RpbmF0aW9uLmlzTW9kaWZpYWJsZSgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGVzdGluYXRpb24gcmVwb3NpdG9yeSBtdXN0IGJlIG1vZGlmaWFibGU6ICIgKyBkZXN0aW5hdGlvbi5nZXRMb2NhdGlvbigpKTsKLQkJSUFydGlmYWN0S2V5W10ga2V5cyA9IHNvdXJjZS5nZXRBcnRpZmFjdEtleXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQXJ0aWZhY3RLZXkga2V5ID0ga2V5c1tpXTsKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHNvdXJjZS5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKGtleSk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JzLmxlbmd0aDsgaisrKQotCQkJCW1pcnJvcihkZXNjcmlwdG9yc1tqXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbWlycm9yKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlJQXJ0aWZhY3REZXNjcmlwdG9yIG5ld0Rlc2NyaXB0b3IgPSByYXcgPyBkZXNjcmlwdG9yIDogbmV3IEFydGlmYWN0RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJdHJ5IHsKLQkJCU91dHB1dFN0cmVhbSByZXBvc2l0b3J5U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJNaXJyb3Jpbmc6ICIgKyBkZXNjcmlwdG9yLmdldEFydGlmYWN0S2V5KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVwb3NpdG9yeVN0cmVhbSA9IGRlc3RpbmF0aW9uLmdldE91dHB1dFN0cmVhbShuZXdEZXNjcmlwdG9yKTsKLQkJCQlpZiAocmVwb3NpdG9yeVN0cmVhbSA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJLy8gVE9ETyBJcyB0aGF0IG9rIHRvIGlnbm9yZSB0aGUgcmVzdWx0PwotCQkJCXNvdXJjZS5nZXRBcnRpZmFjdChkZXNjcmlwdG9yLCByZXBvc2l0b3J5U3RyZWFtLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHJlcG9zaXRvcnlTdHJlYW0gIT0gbnVsbCkKLQkJCQkJcmVwb3NpdG9yeVN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBJcyB0aGF0IG9rIHRvIGlnbm9yZSB0aGUgZXhjZXB0aW9uCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIElzIHRoYXQgb2sgdG8gaWdub3JlIHRoZSBleGNlcHRpb24KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQWJzdHJhY3RSZXBvc2l0b3J5TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9BYnN0cmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMzc1NGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9BYnN0cmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV2ZW50OwotCi0vKioKLSAqIENvbW1vbiBjb2RlIHNoYXJlZCBiZXR3ZWVuIGFydGlmYWN0IGFuZCBtZXRhZGF0YSByZXBvc2l0b3J5IG1hbmFnZXJzLgotICovCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RSZXBvc2l0b3J5TWFuYWdlciB7Ci0JcHJvdGVjdGVkIHZvaWQgYnJvYWRjYXN0Q2hhbmdlRXZlbnQoVVJMIGxvY2F0aW9uLCBpbnQgcmVwb3NpdG9yeVR5cGUsIGludCBraW5kKSB7Ci0JCUlQcm92aXNpb25pbmdFdmVudEJ1cyBidXMgPSAoSVByb3Zpc2lvbmluZ0V2ZW50QnVzKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChidXMgIT0gbnVsbCkKLQkJCWJ1cy5wdWJsaXNoRXZlbnQobmV3IFJlcG9zaXRvcnlFdmVudChsb2NhdGlvbiwgcmVwb3NpdG9yeVR5cGUsIGtpbmQsIHRydWUpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDExNTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT19QUk9WSURFUl9YUFQgPSBJRCArICcuJyArICJhcnRpZmFjdFJlcG9zaXRvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVwb3NpdG9yeU1hbmFnZXJSZWdpc3RyYXRpb247Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIEFjdGl2YXRvci5jb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gY29udGV4dDsKLQkJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciByZXBvc2l0b3J5TWFuYWdlciA9IG5ldyBBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCk7Ci0JCXJlcG9zaXRvcnlNYW5hZ2VyUmVnaXN0cmF0aW9uID0gY29udGV4dC5yZWdpc3RlclNlcnZpY2UoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpLCByZXBvc2l0b3J5TWFuYWdlciwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBY3RpdmF0b3IuY29udGV4dCA9IG51bGw7Ci0JCWlmIChyZXBvc2l0b3J5TWFuYWdlclJlZ2lzdHJhdGlvbiAhPSBudWxsKQotCQkJcmVwb3NpdG9yeU1hbmFnZXJSZWdpc3RyYXRpb24udW5yZWdpc3RlcigpOwotCQlyZXBvc2l0b3J5TWFuYWdlclJlZ2lzdHJhdGlvbiA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0FydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGVmNzYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkNvbmZpZ3VyYXRpb25TY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLklQcm92aXNpb25pbmdFdmVudEJ1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuUHJvdmlzaW9uaW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLkFnZW50TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyfS4KLSAqIAotICogVE9ETyB0aGUgY3VycmVudCBhc3N1bXB0aW9uIHRoYXQgdGhlICJsb2NhdGlvbiIgaXMgdGhlIGRpci9yb290IGxpbWl0cyB1cyB0byAKLSAqIGhhdmluZyBqdXN0IG9uZSByZXBvc2l0b3J5IGluIGEgZ2l2ZW4gVVJMLi4gIAotICogVE9ETyBNZXJnZSBjb21tb24gcGFydHMgd2l0aCBNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RSZXBvc2l0b3J5TWFuYWdlciBpbXBsZW1lbnRzIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLCBQcm92aXNpb25pbmdMaXN0ZW5lciB7Ci0Jc3RhdGljIGNsYXNzIFJlcG9zaXRvcnlJbmZvIHsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uOwotCQlib29sZWFuIGlzU3lzdGVtID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXNFbmFibGVkID0gdHJ1ZTsKLQkJVVJMIGxvY2F0aW9uOwotCQlTdHJpbmcgbmFtZTsKLQkJU3RyaW5nIHN1ZmZpeDsKLQkJU29mdFJlZmVyZW5jZSByZXBvc2l0b3J5OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NVRkZJWCA9ICJzdWZmaXgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1VGRklYID0gImFydGlmYWN0cy54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMX0ZBQ1RPUlkgPSAiZmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9GSUxURVIgPSAiZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUk9WSURFUiA9ICJwcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NVRkZJWCA9ICJzdWZmaXgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TWVNURU0gPSAiaXNTeXN0ZW0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VUkwgPSAidXJsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT0RFX1JFUE9TSVRPUklFUyA9ICJyZXBvc2l0b3JpZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBNYXAgb2YgU3RyaW5nLT5SZXBvc2l0b3J5SW5mbywgd2hlcmUgU3RyaW5nIGlzIHRoZSByZXBvc2l0b3J5IGtleQotCSAqIG9idGFpbmVkIHZpYSBnZXRLZXkoVVJMKS4KLQkgKi8KLQlwcml2YXRlIE1hcCByZXBvc2l0b3JpZXMgPSBudWxsOwotCS8vbG9jayBvYmplY3QgdG8gYmUgaGVsZCB3aGVuIHJlZmVycmluZyB0byB0aGUgcmVwb3NpdG9yaWVzIGZpZWxkCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgcmVwb3NpdG9yeUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBDYWNoZSBMaXN0IG9mIHJlcG9zaXRvcmllcyB0aGF0IGFyZSBub3QgcmVhY2hhYmxlLiBNYWludGFpbiBjYWNoZQotCSAqIGZvciBzaG9ydCBkdXJhdGlvbiBiZWNhdXNlIHJlcG9zaXRvcnkgbWF5IGJlY29tZSBhdmFpbGFibGUgYXQgYW55IHRpbWUuCi0JICovCi0JcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlIHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzOwotCi0JcHVibGljIEFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKSB7Ci0JCUlQcm92aXNpb25pbmdFdmVudEJ1cyBidXMgPSAoSVByb3Zpc2lvbmluZ0V2ZW50QnVzKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChidXMgIT0gbnVsbCkKLQkJCWJ1cy5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJLy9pbml0aWFsaXplIHJlcG9zaXRvcmllcyBsYXppbHkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZXBvc2l0b3J5KElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQlhZGRSZXBvc2l0b3J5KHJlcG9zaXRvcnksIHRydWUsIG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRSZXBvc2l0b3J5KElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgYm9vbGVhbiBzaWduYWxBZGQsIFN0cmluZyBzdWZmaXgpIHsKLQkJYm9vbGVhbiBhZGRlZCA9IHRydWU7Ci0JCXN5bmNocm9uaXplZCAocmVwb3NpdG9yeUxvY2spIHsKLQkJCWlmIChyZXBvc2l0b3JpZXMgPT0gbnVsbCkKLQkJCQlyZXN0b3JlUmVwb3NpdG9yaWVzKCk7Ci0JCQlTdHJpbmcga2V5ID0gZ2V0S2V5KHJlcG9zaXRvcnkpOwotCQkJUmVwb3NpdG9yeUluZm8gaW5mbyA9IChSZXBvc2l0b3J5SW5mbykgcmVwb3NpdG9yaWVzLmdldChrZXkpOwotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlpbmZvID0gbmV3IFJlcG9zaXRvcnlJbmZvKCk7Ci0JCQlpbmZvLnJlcG9zaXRvcnkgPSBuZXcgU29mdFJlZmVyZW5jZShyZXBvc2l0b3J5KTsKLQkJCWluZm8ubmFtZSA9IHJlcG9zaXRvcnkuZ2V0TmFtZSgpOwotCQkJaW5mby5kZXNjcmlwdGlvbiA9IHJlcG9zaXRvcnkuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWluZm8ubG9jYXRpb24gPSByZXBvc2l0b3J5LmdldExvY2F0aW9uKCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSByZXBvc2l0b3J5LmdldFByb3BlcnRpZXMoKS5nZXQoSVJlcG9zaXRvcnkuUFJPUF9TWVNURU0pOwotCQkJaW5mby5pc1N5c3RlbSA9IHZhbHVlID09IG51bGwgPyBmYWxzZSA6IEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JCQlpbmZvLnN1ZmZpeCA9IHN1ZmZpeDsKLQkJCWFkZGVkID0gcmVwb3NpdG9yaWVzLnB1dChnZXRLZXkocmVwb3NpdG9yeSksIGluZm8pID09IG51bGw7Ci0JCX0KLQkJLy8gc2F2ZSB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBpbiB0aGUgcHJlZmVyZW5jZXMuCi0JCXJlbWVtYmVyKHJlcG9zaXRvcnksIHN1ZmZpeCk7Ci0JCWlmIChhZGRlZCAmJiBzaWduYWxBZGQpCi0JCQlicm9hZGNhc3RDaGFuZ2VFdmVudChyZXBvc2l0b3J5LmdldExvY2F0aW9uKCksIElSZXBvc2l0b3J5LlRZUEVfTUVUQURBVEEsIFJlcG9zaXRvcnlFdmVudC5BRERFRCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVwb3NpdG9yeShVUkwgbG9jYXRpb24pIHsKLQkJYWRkUmVwb3NpdG9yeShsb2NhdGlvbiwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBib29sZWFuIGlzRW5hYmxlZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGxvY2F0aW9uKTsKLQkJUmVwb3NpdG9yeUluZm8gaW5mbyA9IG5ldyBSZXBvc2l0b3J5SW5mbygpOwotCQlpbmZvLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JCWluZm8uaXNFbmFibGVkID0gaXNFbmFibGVkOwotCQlib29sZWFuIGFkZGVkID0gdHJ1ZTsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCWFkZGVkID0gcmVwb3NpdG9yaWVzLnB1dChnZXRLZXkobG9jYXRpb24pLCBpbmZvKSA9PSBudWxsOwotCQl9Ci0JCS8vIHNhdmUgdGhlIGdpdmVuIHJlcG9zaXRvcnkgaW4gdGhlIHByZWZlcmVuY2VzLgotCQlyZW1lbWJlcihpbmZvKTsKLQkJaWYgKGFkZGVkKQotCQkJYnJvYWRjYXN0Q2hhbmdlRXZlbnQobG9jYXRpb24sIElSZXBvc2l0b3J5LlRZUEVfQVJUSUZBQ1QsIFJlcG9zaXRvcnlFdmVudC5BRERFRCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgd2UgcmVjZW50bHkgYXR0ZW1wdGVkIHRvIGxvYWQgdGhlIGdpdmVuIGxvY2F0aW9uIGFuZCBmYWlsZWQKLQkgKiB0byBmaW5kIGFueXRoaW5nLiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXBvc2l0b3J5IHdhcyBub3QKLQkgKiBmb3VuZCwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrTm90Rm91bmQoVVJMIGxvY2F0aW9uKSB7Ci0JCWlmICh1bmF2YWlsYWJsZVJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlMaXN0IGJhZFJlcG9zID0gKExpc3QpIHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzLmdldCgpOwotCQlpZiAoYmFkUmVwb3MgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGJhZFJlcG9zLmNvbnRhaW5zKGxvY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciB0aGUgZmFjdCB0aGF0IHdlIHRyaWVkIHRvIGxvYWQgYSByZXBvc2l0b3J5IGF0IHRoaXMgbG9jYXRpb24gYW5kIGRpZCBub3QgZmluZCBhbnl0aGluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJOb3RGb3VuZChVUkwgbG9jYXRpb24pIHsKLQkJTGlzdCBiYWRSZXBvczsKLQkJaWYgKHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzICE9IG51bGwpIHsKLQkJCWJhZFJlcG9zID0gKExpc3QpIHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzLmdldCgpOwotCQkJaWYgKGJhZFJlcG9zICE9IG51bGwpIHsKLQkJCQliYWRSZXBvcy5yZW1vdmUobG9jYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXF1ZXN0IGNyZWF0ZURvd25sb2FkUmVxdWVzdChJQXJ0aWZhY3RLZXkga2V5LCBJUGF0aCBkZXN0aW5hdGlvbikgewotCQlyZXR1cm4gbmV3IEZpbGVEb3dubG9hZFJlcXVlc3Qoa2V5LCBkZXN0aW5hdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbiwgU3RyaW5nIGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnQpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nKCJFcnJvciBsb2FkaW5nIHJlcG9zaXRvcnkgZXh0ZW5zaW9uOiAiICsgZXh0ZW5zaW9uLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxvZygiTWFsZm9ybWVkIHJlcG9zaXRvcnkgZXh0ZW5zaW9uOiAiICsgZXh0ZW5zaW9uLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdFJlcXVlc3QgY3JlYXRlTWlycm9yUmVxdWVzdChJQXJ0aWZhY3RLZXkga2V5LCBJQXJ0aWZhY3RSZXBvc2l0b3J5IGRlc3RpbmF0aW9uKSB7Ci0JCXJldHVybiBjcmVhdGVNaXJyb3JSZXF1ZXN0KGtleSwgZGVzdGluYXRpb24sIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXF1ZXN0IGNyZWF0ZU1pcnJvclJlcXVlc3QoSUFydGlmYWN0S2V5IGtleSwgSUFydGlmYWN0UmVwb3NpdG9yeSBkZXN0aW5hdGlvbiwgUHJvcGVydGllcyBkZXN0aW5hdGlvbkRlc2NyaXB0b3JQcm9wZXJ0aWVzLCBQcm9wZXJ0aWVzIGRlc3RpbmF0aW9uUmVwb3NpdG9yeVByb3BlcnRpZXMpIHsKLQkJcmV0dXJuIG5ldyBNaXJyb3JSZXF1ZXN0KGtleSwgZGVzdGluYXRpb24sIGRlc3RpbmF0aW9uRGVzY3JpcHRvclByb3BlcnRpZXMsIGRlc3RpbmF0aW9uUmVwb3NpdG9yeVByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGNyZWF0ZVJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIE1hcCBwcm9wZXJ0aWVzKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJYm9vbGVhbiBsb2FkZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCAoSVByb2dyZXNzTW9uaXRvcikgbnVsbCwgdHlwZSwgdHJ1ZSk7Ci0JCQlsb2FkZWQgPSB0cnVlOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZCAtIGZhbGwgdGhyb3VnaCBhbmQgY3JlYXRlIGEgbmV3IHJlcG9zaXRvcnkKLQkJfQotCQlpZiAobG9hZGVkKQotCQkJZmFpbChsb2NhdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfRVhJU1RTKTsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBSZWdpc3RyeUZhY3RvcnkuZ2V0UmVnaXN0cnkoKS5nZXRFeHRlbnNpb24oQWN0aXZhdG9yLlJFUE9fUFJPVklERVJfWFBULCB0eXBlKTsKLQkJaWYgKGV4dGVuc2lvbiA9PSBudWxsKQotCQkJZmFpbChsb2NhdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfVU5LTk9XTl9UWVBFKTsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkgZmFjdG9yeSA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeSkgY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihleHRlbnNpb24sIEVMX0ZBQ1RPUlkpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJZmFpbChsb2NhdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfRkFJTEVEX1JFQUQpOwotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlc3VsdCA9IGZhY3RvcnkuY3JlYXRlKGxvY2F0aW9uLCBuYW1lLCB0eXBlLCBwcm9wZXJ0aWVzKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJZmFpbChsb2NhdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfRkFJTEVEX1JFQUQpOwotCQljbGVhck5vdEZvdW5kKHJlc3VsdC5nZXRMb2NhdGlvbigpKTsKLQkJYWRkUmVwb3NpdG9yeShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBmYWlsKFVSTCBsb2NhdGlvbiwgaW50IGNvZGUpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlTdHJpbmcgbXNnID0gbnVsbDsKLQkJc3dpdGNoIChjb2RlKSB7Ci0JCQljYXNlIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0VYSVNUUyA6Ci0JCQkJbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9leGlzdHMsIGxvY2F0aW9uKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfVU5LTk9XTl9UWVBFIDoKLQkJCQltc2cgPSBOTFMuYmluZChNZXNzYWdlcy5yZXBvTWFuX3Vua25vd25UeXBlLCBsb2NhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0ZBSUxFRF9SRUFEIDoKLQkJCQltc2cgPSBOTFMuYmluZChNZXNzYWdlcy5yZXBvTWFuX2ZhaWxlZFJlYWQsIGxvY2F0aW9uKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5EIDoKLQkJCQltc2cgPSBOTFMuYmluZChNZXNzYWdlcy5yZXBvTWFuX25vdEV4aXN0cywgbG9jYXRpb24pOwotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChtc2cgPT0gbnVsbCkKLQkJCW1zZyA9IE1lc3NhZ2VzLnJlcG9NYW5faW50ZXJuYWxFcnJvcjsKLQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgY29kZSwgbXNnLCBudWxsKSk7Ci0JfQotCi0JcHJpdmF0ZSBJRXh0ZW5zaW9uW10gZmluZE1hdGNoaW5nUmVwb3NpdG9yeUV4dGVuc2lvbnMoU3RyaW5nIHN1ZmZpeCwgU3RyaW5nIHR5cGUpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWx0ID0gbnVsbDsKLQkJaWYgKHR5cGUgIT0gbnVsbCAmJiB0eXBlLmxlbmd0aCgpID4gMCkgewotCQkJSUV4dGVuc2lvbiBleHQgPSBSZWdpc3RyeUZhY3RvcnkuZ2V0UmVnaXN0cnkoKS5nZXRFeHRlbnNpb24oQWN0aXZhdG9yLlJFUE9fUFJPVklERVJfWFBULCB0eXBlKTsKLQkJCWVsdCA9IChleHQgIT0gbnVsbCkgPyBleHQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkgOiBuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdOwotCQl9IGVsc2UgewotCQkJZWx0ID0gUmVnaXN0cnlGYWN0b3J5LmdldFJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKEFjdGl2YXRvci5SRVBPX1BST1ZJREVSX1hQVCk7Ci0JCX0KLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbHQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChFTF9GSUxURVIuZXF1YWxzKGVsdFtpXS5nZXROYW1lKCkpKSB7Ci0JCQkJaWYgKCFzdWZmaXguZXF1YWxzKGVsdFtpXS5nZXRBdHRyaWJ1dGUoQVRUUl9TVUZGSVgpKSkgewotCQkJCQllbHRbaV0gPSBudWxsOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvdW50Kys7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQllbHRbaV0gPSBudWxsOwotCQkJfQotCQl9Ci0JCUlFeHRlbnNpb25bXSByZXN1bHRzID0gbmV3IElFeHRlbnNpb25bY291bnRdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsdFtpXSAhPSBudWxsKQotCQkJCXJlc3VsdHNbLS1jb3VudF0gPSBlbHRbaV0uZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRBbGxTdWZmaXhlcygpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBSZWdpc3RyeUZhY3RvcnkuZ2V0UmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoQWN0aXZhdG9yLlJFUE9fUFJPVklERVJfWFBUKTsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoZWxlbWVudHMubGVuZ3RoKTsKLQkJcmVzdWx0LmFkZChERUZBVUxUX1NVRkZJWCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5nZXROYW1lKCkuZXF1YWxzKEVMX0ZJTFRFUikpIHsKLQkJCQlTdHJpbmcgc3VmZml4ID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKEFUVFJfU1VGRklYKTsKLQkJCQlpZiAoIXJlc3VsdC5jb250YWlucyhzdWZmaXgpKQotCQkJCQlyZXN1bHQuYWRkKHN1ZmZpeCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFN0cmluZ1tyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gYW4gZW5jb2RlZCByZXBvc2l0b3J5IGtleSB0aGF0IGlzIHN1aXRhYmxlIGZvciB1c2luZwotCSAqIGFzIHRoZSBuYW1lIG9mIGEgcHJlZmVyZW5jZSBub2RlLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEtleShJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKLQkJcmV0dXJuIGdldEtleShyZXBvc2l0b3J5LmdldExvY2F0aW9uKCkpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIGtleSBiYXNlZCBvbiB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBsb2NhdGlvbiB3aGljaAotCSAqIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgYSBwcmVmZXJlbmNlIG5vZGUgbmFtZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRLZXkoVVJMIGxvY2F0aW9uKSB7Ci0JCXJldHVybiBsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLnJlcGxhY2UoJy8nLCAnXycpOwotCX0KLQotCXB1YmxpYyBVUkxbXSBnZXRLbm93blJlcG9zaXRvcmllcyhpbnQgZmxhZ3MpIHsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVwb3NpdG9yaWVzLnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgaSsrKSB7Ci0JCQkJUmVwb3NpdG9yeUluZm8gaW5mbyA9IChSZXBvc2l0b3J5SW5mbykgaXQubmV4dCgpOwotCQkJCWlmIChtYXRjaGVzRmxhZ3MoaW5mbywgZmxhZ3MpKQotCQkJCQlyZXN1bHQuYWRkKGluZm8ubG9jYXRpb24pOwotCQkJfQotCQkJcmV0dXJuIChVUkxbXSkgcmVzdWx0LnRvQXJyYXkobmV3IFVSTFtyZXN1bHQuc2l6ZSgpXSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgcm9vdCBwcmVmZXJlbmNlIG5vZGUgd2hlcmUgd2Ugc3RvcmUgdGhlIHJlcG9zaXRvcnkgaW5mb3JtYXRpb24uCi0JICovCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uU2NvcGUoKS5nZXROb2RlKEFjdGl2YXRvci5JRCkubm9kZShOT0RFX1JFUE9TSVRPUklFUyk7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeShVUkwgbG9jYXRpb24pIHsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXBvc2l0b3JpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVJlcG9zaXRvcnlJbmZvIGluZm8gPSAoUmVwb3NpdG9yeUluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoVVJMVXRpbC5zYW1lVVJMKGluZm8ubG9jYXRpb24sIGxvY2F0aW9uKSkgewotCQkJCQlpZiAoaW5mby5yZXBvc2l0b3J5ID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvID0gKElBcnRpZmFjdFJlcG9zaXRvcnkpIGluZm8ucmVwb3NpdG9yeS5nZXQoKTsKLQkJCQkJLy91cGRhdGUgb3VyIHJlcG9zaXRvcnkgaW5mbyBiZWNhdXNlIHRoZSByZXBvc2l0b3J5IG1heSBoYXZlIGNoYW5nZWQKLQkJCQkJaWYgKHJlcG8gIT0gbnVsbCkKLQkJCQkJCWFkZFJlcG9zaXRvcnkocmVwbyk7Ci0JCQkJCXJldHVybiByZXBvOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIjZ2V0UmVwb3NpdG9yeVByb3BlcnR5KGphdmEubmV0LlVSTCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlQcm9wZXJ0eShVUkwgbG9jYXRpb24sIFN0cmluZyBrZXkpIHsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXBvc2l0b3JpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVJlcG9zaXRvcnlJbmZvIGluZm8gPSAoUmVwb3NpdG9yeUluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoVVJMVXRpbC5zYW1lVVJMKGluZm8ubG9jYXRpb24sIGxvY2F0aW9uKSkgewotCQkJCQlpZiAoSVJlcG9zaXRvcnkuUFJPUF9ERVNDUklQVElPTi5lcXVhbHMoa2V5KSkKLQkJCQkJCXJldHVybiBpbmZvLmRlc2NyaXB0aW9uOwotCQkJCQlpZiAoSVJlcG9zaXRvcnkuUFJPUF9OQU1FLmVxdWFscyhrZXkpKQotCQkJCQkJcmV0dXJuIGluZm8ubmFtZTsKLQkJCQkJLy8gS2V5IG5vdCBrbm93biwgcmV0dXJuIG51bGwKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJLy8gUmVwb3NpdG9yeSBub3QgZm91bmQsIHJldHVybiBudWxsCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyI2dldEVuYWJsZWQoamF2YS5uZXQuVVJMKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChVUkwgbG9jYXRpb24pIHsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXBvc2l0b3JpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVJlcG9zaXRvcnlJbmZvIGluZm8gPSAoUmVwb3NpdG9yeUluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoVVJMVXRpbC5zYW1lVVJMKGluZm8ubG9jYXRpb24sIGxvY2F0aW9uKSkgewotCQkJCQlyZXR1cm4gaW5mby5pc0VuYWJsZWQ7Ci0JCQkJfQotCQkJfQotCQkJLy8gUmVwb3NpdG9yeSBub3QgZm91bmQsIHJldHVybiBmYWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdFJlcG9zaXRvcnkgbG9hZFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbG9hZFJlcG9zaXRvcnkobG9jYXRpb24sIG1vbml0b3IsIG51bGwsIHRydWUpOwotCX0KLQotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSBsb2FkUmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIHR5cGUsIGJvb2xlYW4gc2lnbmFsQWRkKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgbW9uaXRvcgotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlc3VsdCA9IGdldFJlcG9zaXRvcnkobG9jYXRpb24pOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlpZiAoY2hlY2tOb3RGb3VuZChsb2NhdGlvbikpCi0JCQlmYWlsKGxvY2F0aW9uLCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQpOwotCQlTdHJpbmdbXSBzdWZmaXhlcyA9IHNvcnRTdWZmaXhlcyhnZXRBbGxTdWZmaXhlcygpLCBsb2NhdGlvbik7Ci0JCVN1Yk1vbml0b3Igc3ViID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIHN1ZmZpeGVzLmxlbmd0aCAqIDEwMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VmZml4ZXMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdCA9IGxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCBzdWZmaXhlc1tpXSwgdHlwZSwgc3ViLm5ld0NoaWxkKDEwMCkpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJYWRkUmVwb3NpdG9yeShyZXN1bHQsIHNpZ25hbEFkZCwgc3VmZml4ZXNbaV0pOwotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmVtZW1iZXJOb3RGb3VuZChsb2NhdGlvbik7Ci0JCWZhaWwobG9jYXRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSBsb2FkUmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIFN0cmluZyBzdWZmaXgsIFN0cmluZyB0eXBlLCBTdWJNb25pdG9yIG1vbml0b3IpIHsKLQkJSUV4dGVuc2lvbltdIHByb3ZpZGVycyA9IGZpbmRNYXRjaGluZ1JlcG9zaXRvcnlFeHRlbnNpb25zKHN1ZmZpeCwgdHlwZSk7Ci0JCS8vIExvb3Agb3ZlciB0aGUgY2FuZGlkYXRlcyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBvbmUgdGhhdCBzdWNjZXNzZnVsbHkgbG9hZHMKLQkJbW9uaXRvci5iZWdpblRhc2soIiIsIHByb3ZpZGVycy5sZW5ndGggKiAxMCk7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspCi0JCQl0cnkgewotCQkJCUlBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5IGZhY3RvcnkgPSAoSUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkpIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24ocHJvdmlkZXJzW2ldLCBFTF9GQUNUT1JZKTsKLQkJCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCQlyZXR1cm4gZmFjdG9yeS5sb2FkKGxvY2F0aW9uLCBtb25pdG9yLm5ld0NoaWxkKDEwKSk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgIT0gUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5EKQotCQkJCQlsb2coIlVuYWJsZSB0byBsb2FkIHJlcG9zaXRvcnk6ICIgKyBsb2NhdGlvbiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9nKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdCkgewotCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBtZXNzYWdlLCB0KSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG1hdGNoZXNGbGFncyhSZXBvc2l0b3J5SW5mbyBpbmZvLCBpbnQgZmxhZ3MpIHsKLQkJaWYgKChmbGFncyAmIFJFUE9TSVRPUklFU19TWVNURU0pID09IFJFUE9TSVRPUklFU19TWVNURU0pCi0JCQlpZiAoIWluZm8uaXNTeXN0ZW0pCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoKGZsYWdzICYgUkVQT1NJVE9SSUVTX05PTl9TWVNURU0pID09IFJFUE9TSVRPUklFU19OT05fU1lTVEVNKQotCQkJaWYgKGluZm8uaXNTeXN0ZW0pCi0JCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoKGZsYWdzICYgUkVQT1NJVE9SSUVTX0RJU0FCTEVEKSA9PSBSRVBPU0lUT1JJRVNfRElTQUJMRUQpIHsKLQkJCWlmIChpbmZvLmlzRW5hYmxlZCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQkvL2lnbm9yZSBkaXNhYmxlZCByZXBvc2l0b3JpZXMgZm9yIGFsbCBvdGhlciBmbGFnIHR5cGVzCi0JCQlpZiAoIWluZm8uaXNFbmFibGVkKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoKGZsYWdzICYgUkVQT1NJVE9SSUVTX0xPQ0FMKSA9PSBSRVBPU0lUT1JJRVNfTE9DQUwpCi0JCQlyZXR1cm4gImZpbGUiLmVxdWFscyhpbmZvLmxvY2F0aW9uLmdldFByb3RvY29sKCkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLlByb3Zpc2lvbmluZ0xpc3RlbmVyI25vdGlmeShqYXZhLnV0aWwuRXZlbnRPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5KEV2ZW50T2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBSZXBvc2l0b3J5RXZlbnQpIHsKLQkJCVJlcG9zaXRvcnlFdmVudCBldmVudCA9IChSZXBvc2l0b3J5RXZlbnQpIG87Ci0JCQlpZiAoZXZlbnQuZ2V0S2luZCgpID09IFJlcG9zaXRvcnlFdmVudC5ESVNDT1ZFUkVEICYmIGV2ZW50LmdldFJlcG9zaXRvcnlUeXBlKCkgPT0gSVJlcG9zaXRvcnkuVFlQRV9BUlRJRkFDVCkKLQkJCQlhZGRSZXBvc2l0b3J5KGV2ZW50LmdldFJlcG9zaXRvcnlMb2NhdGlvbigpLCBldmVudC5pc1JlcG9zaXRvcnlFbmFibGVkKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhIHByZWZlcmVuY2UgYW5kIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHByZWZlcmVuY2UKLQkgKiB3YXMgYWN0dWFsbHkgY2hhbmdlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcHV0VmFsdWUoUHJlZmVyZW5jZXMgbm9kZSwgU3RyaW5nIGtleSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IG5vZGUuZ2V0KGtleSwgbnVsbCk7Ci0JCWlmIChvbGRWYWx1ZSA9PSBuZXdWYWx1ZSB8fCAob2xkVmFsdWUgIT0gbnVsbCAmJiBvbGRWYWx1ZS5lcXVhbHMobmV3VmFsdWUpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG5ld1ZhbHVlID09IG51bGwpCi0JCQlub2RlLnJlbW92ZShrZXkpOwotCQllbHNlCi0JCQlub2RlLnB1dChrZXksIG5ld1ZhbHVlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdFJlcG9zaXRvcnkgcmVmcmVzaFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQljbGVhck5vdEZvdW5kKGxvY2F0aW9uKTsKLQkJaWYgKCFyZW1vdmVSZXBvc2l0b3J5KGxvY2F0aW9uKSkKLQkJCWZhaWwobG9jYXRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCk7Ci0JCXJldHVybiBsb2FkUmVwb3NpdG9yeShsb2NhdGlvbiwgbW9uaXRvciwgbnVsbCwgZmFsc2UpOwotCX0KLQotCS8qCi0JICogQWRkIHRoZSBnaXZlbiByZXBvc2l0b3J5IG9iamVjdCB0byB0aGUgcHJlZmVyZW5jZXMgYW5kIHNhdmUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbWVtYmVyKElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIHN1ZmZpeCkgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IGdldFByZWZlcmVuY2VzKCkubm9kZShnZXRLZXkocmVwb3NpdG9yeSkpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9VUkwsIHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfREVTQ1JJUFRJT04sIHJlcG9zaXRvcnkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX05BTUUsIHJlcG9zaXRvcnkuZ2V0TmFtZSgpKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfUFJPVklERVIsIHJlcG9zaXRvcnkuZ2V0UHJvdmlkZXIoKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX1RZUEUsIHJlcG9zaXRvcnkuZ2V0VHlwZSgpKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfVkVSU0lPTiwgcmVwb3NpdG9yeS5nZXRWZXJzaW9uKCkpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9TWVNURU0sIChTdHJpbmcpIHJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcygpLmdldChJUmVwb3NpdG9yeS5QUk9QX1NZU1RFTSkpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9TVUZGSVgsIHN1ZmZpeCk7Ci0JCWlmIChjaGFuZ2VkKQotCQkJc2F2ZVRvUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKgotCSAqIFNhdmUgdGhlIGxpc3Qgb2YgcmVwb3NpdG9yaWVzIGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1lbWJlcihSZXBvc2l0b3J5SW5mbyBpbmZvKSB7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQlQcmVmZXJlbmNlcyBub2RlID0gZ2V0UHJlZmVyZW5jZXMoKS5ub2RlKGdldEtleShpbmZvLmxvY2F0aW9uKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX1VSTCwgaW5mby5sb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfU1lTVEVNLCBCb29sZWFuLnRvU3RyaW5nKGluZm8uaXNTeXN0ZW0pKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfREVTQ1JJUFRJT04sIGluZm8uZGVzY3JpcHRpb24pOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9OQU1FLCBpbmZvLm5hbWUpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9FTkFCTEVELCBCb29sZWFuLnRvU3RyaW5nKGluZm8uaXNFbmFibGVkKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX1NVRkZJWCwgaW5mby5zdWZmaXgpOwotCQlpZiAoY2hhbmdlZCkKLQkJCXNhdmVUb1ByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FjaGUgdGhlIGZhY3QgdGhhdCB3ZSB0cmllZCB0byBsb2FkIGEgcmVwb3NpdG9yeSBhdCB0aGlzIGxvY2F0aW9uIGFuZCBkaWQgbm90IGZpbmQgYW55dGhpbmcuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbWVtYmVyTm90Rm91bmQoVVJMIGxvY2F0aW9uKSB7Ci0JCUxpc3QgYmFkUmVwb3M7Ci0JCWlmICh1bmF2YWlsYWJsZVJlcG9zaXRvcmllcyAhPSBudWxsKSB7Ci0JCQliYWRSZXBvcyA9IChMaXN0KSB1bmF2YWlsYWJsZVJlcG9zaXRvcmllcy5nZXQoKTsKLQkJCWlmIChiYWRSZXBvcyAhPSBudWxsKSB7Ci0JCQkJYmFkUmVwb3MuYWRkKGxvY2F0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJYmFkUmVwb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWJhZFJlcG9zLmFkZChsb2NhdGlvbik7Ci0JCXVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzID0gbmV3IFNvZnRSZWZlcmVuY2UoYmFkUmVwb3MpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZVJlcG9zaXRvcnkoVVJMIHRvUmVtb3ZlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwodG9SZW1vdmUpOwotCQlmaW5hbCBTdHJpbmcgcmVwb0tleSA9IGdldEtleSh0b1JlbW92ZSk7Ci0JCXN5bmNocm9uaXplZCAocmVwb3NpdG9yeUxvY2spIHsKLQkJCWlmIChyZXBvc2l0b3JpZXMgPT0gbnVsbCkKLQkJCQlyZXN0b3JlUmVwb3NpdG9yaWVzKCk7Ci0JCQlpZiAocmVwb3NpdG9yaWVzLnJlbW92ZShyZXBvS2V5KSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyByZW1vdmUgdGhlIHJlcG9zaXRvcnkgZnJvbSB0aGUgcHJlZmVyZW5jZSBzdG9yZQotCQl0cnkgewotCQkJZ2V0UHJlZmVyZW5jZXMoKS5ub2RlKHJlcG9LZXkpLnJlbW92ZU5vZGUoKTsKLQkJCXNhdmVUb1ByZWZlcmVuY2VzKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2coIkVycm9yIHNhdmluZyBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYnJvYWRjYXN0Q2hhbmdlRXZlbnQodG9SZW1vdmUsIElSZXBvc2l0b3J5LlRZUEVfQVJUSUZBQ1QsIFJlcG9zaXRvcnlFdmVudC5SRU1PVkVEKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc3RvcmVEb3dubG9hZENhY2hlKCkgewotCQkvLyBUT0RPIHdoaWxlIHJlY3JlYXRpbmcsIHdlIG1heSB3YW50IHRvIGhhdmUgcHJveGllcyBvbiByZXBvIGluc3RlYWQgb2YgdGhlIHJlYWwgcmVwbyBvYmplY3QgdG8gbGltaXQgd2hhdCBpcyBhY3RpdmF0ZWQuCi0JCUFnZW50TG9jYXRpb24gbG9jYXRpb24gPSAoQWdlbnRMb2NhdGlvbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEFnZW50TG9jYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQkvLyBUT0RPIHNob3VsZCBkbyBzb21ldGhpbmcgaGVyZSBzaW5jZSB3ZSBhcmUgZmFpbGluZyB0byByZXN0b3JlLgotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJbG9hZFJlcG9zaXRvcnkobG9jYXRpb24uZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5VVJMKCksIG51bGwpOwotCQkJcmV0dXJuOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGJ1dCBzdGlsbCBjb250aW51ZSBhbmQgdHJ5IHRvIGNyZWF0ZSBhIG5ldyBvbmUKLQkJCWlmIChlLmdldFN0YXR1cygpLmdldENvZGUoKSAhPSBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQpCi0JCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkVycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgZG93bmxvYWQgY2FjaGUuIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdHJ5IHsKLQkJCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoMSk7Ci0JCQlwcm9wZXJ0aWVzLnB1dChJUmVwb3NpdG9yeS5QUk9QX1NZU1RFTSwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQkJY3JlYXRlUmVwb3NpdG9yeShsb2NhdGlvbi5nZXRBcnRpZmFjdFJlcG9zaXRvcnlVUkwoKSwgImRvd25sb2FkIGNhY2hlIiwgVFlQRV9TSU1QTEVfUkVQT1NJVE9SWSwgcHJvcGVydGllcyk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2coZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIExvYWQgdGhlIGxpc3Qgb2YgcmVwb3NpdG9yaWVzIGZyb20gdGhlIHByZWZlcmVuY2VzLgotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlRnJvbVByZWZlcmVuY2VzKCkgewotCQkvLyByZXN0b3JlIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JCVByZWZlcmVuY2VzIG5vZGUgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlTdHJpbmdbXSBjaGlsZHJlbjsKLQkJdHJ5IHsKLQkJCWNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbk5hbWVzKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2coIkVycm9yIHJlc3RvcmluZyByZXBvc2l0b3JpZXMgZnJvbSBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJUHJlZmVyZW5jZXMgY2hpbGQgPSBub2RlLm5vZGUoY2hpbGRyZW5baV0pOwotCQkJU3RyaW5nIGxvY2F0aW9uU3RyaW5nID0gY2hpbGQuZ2V0KEtFWV9VUkwsIG51bGwpOwotCQkJaWYgKGxvY2F0aW9uU3RyaW5nID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQl0cnkgewotCQkJCVJlcG9zaXRvcnlJbmZvIGluZm8gPSBuZXcgUmVwb3NpdG9yeUluZm8oKTsKLQkJCQlpbmZvLmxvY2F0aW9uID0gbmV3IFVSTChsb2NhdGlvblN0cmluZyk7Ci0JCQkJaW5mby5uYW1lID0gY2hpbGQuZ2V0KEtFWV9OQU1FLCBudWxsKTsKLQkJCQlpbmZvLmRlc2NyaXB0aW9uID0gY2hpbGQuZ2V0KEtFWV9ERVNDUklQVElPTiwgbnVsbCk7Ci0JCQkJaW5mby5pc1N5c3RlbSA9IGNoaWxkLmdldEJvb2xlYW4oS0VZX1NZU1RFTSwgZmFsc2UpOwotCQkJCWluZm8uaXNFbmFibGVkID0gY2hpbGQuZ2V0Qm9vbGVhbihLRVlfRU5BQkxFRCwgdHJ1ZSk7Ci0JCQkJaW5mby5zdWZmaXggPSBjaGlsZC5nZXQoS0VZX1NVRkZJWCwgbnVsbCk7Ci0JCQkJcmVwb3NpdG9yaWVzLnB1dChnZXRLZXkoaW5mby5sb2NhdGlvbiksIGluZm8pOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2coIkVycm9yIHdoaWxlIHJlc3RvcmluZyByZXBvc2l0b3J5OiAiICsgbG9jYXRpb25TdHJpbmcsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBsb2FkZWQgZXZlcnl0aGluZywgcmVtZW1iZXIgdGhlbQotCQlzYXZlVG9QcmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZXN0b3JlRnJvbVN5c3RlbVByb3BlcnR5KCkgewotCQlTdHJpbmcgbG9jYXRpb25TdHJpbmcgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5KCJlY2xpcHNlLnAyLmFydGlmYWN0UmVwb3NpdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsb2NhdGlvblN0cmluZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihsb2NhdGlvblN0cmluZywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQl0cnkgewotCQkJCQlhZGRSZXBvc2l0b3J5KG5ldyBVUkwodG9rZW5pemVyLm5leHRUb2tlbigpKSk7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nKCJFcnJvciB3aGlsZSByZXN0b3JpbmcgcmVwb3NpdG9yeSAiICsgbG9jYXRpb25TdHJpbmcsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVzdG9yZXMgdGhlIHJlcG9zaXRvcnkgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXN0b3JlUmVwb3NpdG9yaWVzKCkgewotCQlzeW5jaHJvbml6ZWQgKHJlcG9zaXRvcnlMb2NrKSB7Ci0JCQlyZXBvc2l0b3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJcmVzdG9yZURvd25sb2FkQ2FjaGUoKTsKLQkJCXJlc3RvcmVGcm9tU3lzdGVtUHJvcGVydHkoKTsKLQkJCXJlc3RvcmVGcm9tUHJlZmVyZW5jZXMoKTsKLQkJfQotCX0KLQotCS8qCi0JICogU2F2ZSB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXMgdG8gdGhlIGZpbGUtc3lzdGVtLgotCSAqLwotCXByaXZhdGUgdm9pZCBzYXZlVG9QcmVmZXJlbmNlcygpIHsKLQkJdHJ5IHsKLQkJCWdldFByZWZlcmVuY2VzKCkuZmx1c2goKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCWxvZygiRXJyb3Igd2hpbGUgc2F2aW5nIHJlcG9zaXRvcmllcyBpbiBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKihub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciNzZXRFbmFibGVkKGphdmEubmV0LlVSTCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKFVSTCBsb2NhdGlvbiwgYm9vbGVhbiBlbmFibGVtZW50KSB7Ci0JCXN5bmNocm9uaXplZCAocmVwb3NpdG9yeUxvY2spIHsKLQkJCWlmIChyZXBvc2l0b3JpZXMgPT0gbnVsbCkKLQkJCQlyZXN0b3JlUmVwb3NpdG9yaWVzKCk7Ci0JCQlSZXBvc2l0b3J5SW5mbyBpbmZvID0gKFJlcG9zaXRvcnlJbmZvKSByZXBvc2l0b3JpZXMuZ2V0KGdldEtleShsb2NhdGlvbikpOwotCQkJaWYgKGluZm8gPT0gbnVsbCB8fCBpbmZvLmlzRW5hYmxlZCA9PSBlbmFibGVtZW50KQotCQkJCXJldHVybjsKLQkJCWluZm8uaXNFbmFibGVkID0gZW5hYmxlbWVudDsKLQkJCXJlbWVtYmVyKGluZm8pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3B0aW1pemUgdGhlIG9yZGVyIGluIHdoaWNoIHJlcG9zaXRvcnkgc3VmZml4ZXMgYXJlIHNlYXJjaGVkIGJ5IHRyeWluZyAKLQkgKiB0aGUgbGFzdCBzdWNjZXNzZnVsbHkgbG9hZGVkIHN1ZmZpeCBmaXJzdC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIHNvcnRTdWZmaXhlcyhTdHJpbmdbXSBzdWZmaXhlcywgVVJMIGxvY2F0aW9uKSB7Ci0JCXN5bmNocm9uaXplZCAocmVwb3NpdG9yeUxvY2spIHsKLQkJCWlmIChyZXBvc2l0b3JpZXMgPT0gbnVsbCkKLQkJCQlyZXN0b3JlUmVwb3NpdG9yaWVzKCk7Ci0JCQlSZXBvc2l0b3J5SW5mbyBpbmZvID0gKFJlcG9zaXRvcnlJbmZvKSByZXBvc2l0b3JpZXMuZ2V0KGdldEtleShsb2NhdGlvbikpOwotCQkJaWYgKGluZm8gPT0gbnVsbCB8fCBpbmZvLnN1ZmZpeCA9PSBudWxsKQotCQkJCXJldHVybiBzdWZmaXhlczsKLQkJCS8vbW92ZSBsYXN0U3VmZml4IHRvIHRoZSBmcm9udCBvZiB0aGUgbGlzdCBidXQgcHJlc2VydmUgb3JkZXIgb2YgcmVtYWluaW5nIGVudHJpZXMKLQkJCVN0cmluZyBsYXN0U3VmZml4ID0gaW5mby5zdWZmaXg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHN1ZmZpeGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGxhc3RTdWZmaXguZXF1YWxzKHN1ZmZpeGVzW2ldKSkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHN1ZmZpeGVzLCAwLCBzdWZmaXhlcywgMSwgaSk7Ci0JCQkJCXN1ZmZpeGVzWzBdID0gbGFzdFN1ZmZpeDsKLQkJCQkJcmV0dXJuIHN1ZmZpeGVzOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VmZml4ZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0FydGlmYWN0UmVxdWVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9BcnRpZmFjdFJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEzZDNkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0FydGlmYWN0UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGFsbCByZXF1ZXN0cyBvbiBhbiB7QGxpbmsgSUFydGlmYWN0UmVwb3NpdG9yeX0uCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBcnRpZmFjdFJlcXVlc3QgaW1wbGVtZW50cyBJQXJ0aWZhY3RSZXF1ZXN0IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdGF0dXMgREVGQVVMVF9TVEFUVVMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgImRlZmF1bHQiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBJQXJ0aWZhY3RLZXkgYXJ0aWZhY3Q7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlZEtleTsKLQlwcm90ZWN0ZWQgSUFydGlmYWN0UmVwb3NpdG9yeSBzb3VyY2U7Ci0JcHJvdGVjdGVkIElTdGF0dXMgcmVzdWx0ID0gREVGQVVMVF9TVEFUVVM7Ci0JcHJvdGVjdGVkIElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotCXB1YmxpYyBBcnRpZmFjdFJlcXVlc3QoSUFydGlmYWN0S2V5IGtleSkgewotCQlhcnRpZmFjdCA9IGtleTsKLQkJLy8gVE9ETyBkbyB3ZSBuZWVkIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGU/IGZvciBub3cgc2V0IGRlZmF1bHQgcmVxdWVzdCBoYW5kbGVyIHRvIEVDRgotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RLZXkgZ2V0QXJ0aWZhY3RLZXkoKSB7Ci0JCXJldHVybiBhcnRpZmFjdDsKLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0RGVzY3JpcHRvciBnZXRBcnRpZmFjdERlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgY2FsbCB0byB7QGxpbmsgI3BlcmZvcm0oSVByb2dyZXNzTW9uaXRvcil9LAotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHBlcmZvcm0gaGFzIG5ldmVyIGJlZW4gY2FsbGVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGVyZm9ybSBjYWxsLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldFJlc3VsdCgpIHsKLQkJaWYgKHJlc3VsdCA9PSBERUZBVUxUX1NUQVRVUykKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIk5vIHJlcG9zaXRvcnkgZm91bmQgY29udGFpbmluZzogIiArIGdldEFydGlmYWN0S2V5KCkudG9TdHJpbmcoKSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUFydGlmYWN0UmVwb3NpdG9yeSBnZXRTb3VyY2VSZXBvc2l0b3J5KCkgewotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBhcnRpZmFjdCByZXF1ZXN0LCBhbmQgc2V0cyB0aGUgcmVzdWx0IHN0YXR1cy4KLQkgKiAKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGlzIG5vdCBkZXNpcmVkCi0JICovCi0JYWJzdHJhY3QgcHVibGljIHZvaWQgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVzY3JpcHRvciB0byB1c2Ugd2hlbiBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIGRlc2NyaXB0b3IgdG8gdXNlIHdoZW4gcHJvY2Vzc2luZyB0aGlzIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yKElBcnRpZmFjdERlc2NyaXB0b3IgdmFsdWUpIHsKLQkJaWYgKCF2YWx1ZS5nZXRBcnRpZmFjdEtleSgpLmVxdWFscyhhcnRpZmFjdCkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEZXNjcmlwdG9yJ3Mga2V5IG11c3QgbWF0Y2ggdGhlIHJlcXVlc3QncyBrZXkiKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdG9yID0gdmFsdWU7Ci0JCWlmIChhcnRpZmFjdCA9PSBudWxsKQotCQkJYXJ0aWZhY3QgPSB2YWx1ZS5nZXRBcnRpZmFjdEtleSgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlc3VsdCBvZiBhbiBpbnZvY2F0aW9uIG9mIHtAbGluayAjcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yKX0uCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gc2V0IHRoZSByZXN1bHQgc3RhdHVzIGZvcgotCSAqIHRoaXMgcmVxdWVzdC4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUgVGhlIHJlc3VsdCBzdGF0dXMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSZXN1bHQoSVN0YXR1cyB2YWx1ZSkgewotCQlyZXN1bHQgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VSZXBvc2l0b3J5KElBcnRpZmFjdFJlcG9zaXRvcnkgdmFsdWUpIHsKLQkJc291cmNlID0gdmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9Eb3dubG9hZFN0YXR1cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9Eb3dubG9hZFN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDgxODQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvRG93bmxvYWRTdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLQotLyoqCi0gKiBBIHN0YXR1cyBvYmplY3QgdGhhdCBvcHRpb25hbGx5IHJlcG9ydHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUKLSAqIHJlc3VsdCBvZiBhIGRvd25sb2FkLgotICovCi1wdWJsaWMgY2xhc3MgRG93bmxvYWRTdGF0dXMgZXh0ZW5kcyBTdGF0dXMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBVTktOT1dOX1JBVEUgPSAtMTsKLQotCXByaXZhdGUgbG9uZyBzcGVlZCA9IFVOS05PV05fUkFURTsKLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBuZXcgRG93bmxvYWRTdGF0dXMgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4KLQkgKi8KLQlwdWJsaWMgRG93bmxvYWRTdGF0dXMoaW50IHNldmVyaXR5LCBTdHJpbmcgcGx1Z2luSWQsIGludCBjb2RlLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlcihzZXZlcml0eSwgcGx1Z2luSWQsIGNvZGUsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0cyBhIG5ldyBEb3dubG9hZFN0YXR1cyB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLgotCSAqLwotCXB1YmxpYyBEb3dubG9hZFN0YXR1cyhpbnQgc2V2ZXJpdHksIFN0cmluZyBwbHVnaW5JZCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJc3VwZXIoc2V2ZXJpdHksIHBsdWdpbklkLCBtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbmV3IERvd25sb2FkU3RhdHVzIHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCi0JICovCi0JcHVibGljIERvd25sb2FkU3RhdHVzKGludCBzZXZlcml0eSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlzdXBlcihzZXZlcml0eSwgcGx1Z2luSWQsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG93bmxvYWQgcmF0ZSBpbiBieXRlcyBwZXIgc2Vjb25kLiAgSWYgdGhlIHJhdGUgaXMgdW5rbm93biwKLQkgKiBAe2xpbmsge0BsaW5rICNVTktOT1dOX1JBVEV9fSBpcyByZXR1cm5lZC4KLQkgKiBAcmV0dXJuIHRoZSBkb3dubG9hZCByYXRlIGluIGJ5dGVzIHBlciBzZWNvbmQKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRUcmFuc2ZlclJhdGUoKSB7Ci0JCXJldHVybiBzcGVlZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb3dubG9hZCByYXRlIG9mIHRoZSB0cmFuc2ZlciBpbiBieXRlcyBwZXIgc2Vjb25kLgotCSAqIEBwYXJhbSByYXRlIFRoZSBkb3dubG9hZCByYXRlIGluIGJ5dGVzIHBlciBzZWNvbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmFuc2ZlclJhdGUobG9uZyByYXRlKSB7Ci0JCXRoaXMuc3BlZWQgPSByYXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvRUNGVHJhbnNwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0VDRlRyYW5zcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDVkZTAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvRUNGVHJhbnNwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoJCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSB2YXJpb3VzIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuUHJvdG9jb2xFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lY2YuY29yZS5zZWN1cml0eS5Db25uZWN0Q29udGV4dEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZWNmLmNvcmUuc2VjdXJpdHkuSUNvbm5lY3RDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLmV2ZW50cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIuaWRlbnRpdHkuRmlsZUNyZWF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLmlkZW50aXR5LkZpbGVJREZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2Zlci5zZXJ2aWNlLklSZXRyaWV2ZUZpbGVUcmFuc2ZlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JU3RhdGVmdWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLklTZXJ2aWNlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuSVNlcnZpY2VVSS5BdXRoZW50aWNhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS5zdG9yYWdlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci0KLS8qKgotICogQSB0cmFuc3BvcnQgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIEVDRiBmaWxlIHRyYW5zZmVyIEFQSS4KLSAqLwotcHVibGljIGNsYXNzIEVDRlRyYW5zcG9ydCBleHRlbmRzIFRyYW5zcG9ydCB7Ci0JLyoqCi0JICogVGhlIG51bWJlciBvZiBwYXNzd29yZCByZXRyeSBhdHRlbXB0cyBhbGxvd2VkIGJlZm9yZSBmYWlsaW5nLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0dJTl9SRVRSSUVTID0gMzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFByb3RvY29sRXhjZXB0aW9uIEVSUk9SXzQwMSA9IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9SRURJUkVDVCA9ICJTZXJ2ZXIgcmVkaXJlY3RlZCB0b28gbWFueSB0aW1lcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gdHJhbnNwb3J0IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEVDRlRyYW5zcG9ydCBpbnN0YW5jZTsKLQotCXByaXZhdGUgZmluYWwgU2VydmljZVRyYWNrZXIgcmV0cmlldmFsRmFjdG9yeVRyYWNrZXI7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGluaXRpYWxpemVkIGluc3RhbmNlIG9mIEVDRlRyYW5zcG9ydAotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEVDRlRyYW5zcG9ydCBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEVDRlRyYW5zcG9ydCgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBQcml2YXRlIHRvIGF2b2lkIGNsaWVudCBpbnN0YW50aWF0aW9uLgotCSAqLwotCXByaXZhdGUgRUNGVHJhbnNwb3J0KCkgewotCQlyZXRyaWV2YWxGYWN0b3J5VHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUmV0cmlldmVGaWxlVHJhbnNmZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7Ci0JCXJldHJpZXZhbEZhY3RvcnlUcmFja2VyLm9wZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBjb252ZXJ0VG9TdGF0dXMoSUZpbGVUcmFuc2ZlckV2ZW50IGV2ZW50LCBFeGNlcHRpb24gZmFpbHVyZSwgbG9uZyBzdGFydFRpbWUsIFN0cmluZyBsb2NhdGlvbikgewotCQlsb25nIHNwZWVkID0gRG93bmxvYWRTdGF0dXMuVU5LTk9XTl9SQVRFOwotCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJSW5jb21pbmdGaWxlVHJhbnNmZXJFdmVudCkgewotCQkJbG9uZyBieXRlcyA9ICgoSUluY29taW5nRmlsZVRyYW5zZmVyRXZlbnQpIGV2ZW50KS5nZXRTb3VyY2UoKS5nZXRCeXRlc1JlY2VpdmVkKCk7Ci0JCQlpZiAoYnl0ZXMgPiAwKSB7Ci0JCQkJbG9uZyBlbGFwc2VkID0gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSAvIDEwMDA7Ly9pbiBzZWNvbmRzCi0JCQkJaWYgKGVsYXBzZWQgPT0gMCkKLQkJCQkJZWxhcHNlZCA9IDE7Ci0JCQkJc3BlZWQgPSBieXRlcyAvIGVsYXBzZWQ7Ci0JCQl9Ci0JCX0KLQkJRG93bmxvYWRTdGF0dXMgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGZhaWx1cmUgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IG5ldyBEb3dubG9hZFN0YXR1cyhJU3RhdHVzLk9LLCBBY3RpdmF0b3IuSUQsIFN0YXR1cy5PS19TVEFUVVMuZ2V0TWVzc2FnZSgpKTsKLQkJZWxzZSBpZiAoZmFpbHVyZSBpbnN0YW5jZW9mIFVzZXJDYW5jZWxsZWRFeGNlcHRpb24pCi0JCQlyZXN1bHQgPSBuZXcgRG93bmxvYWRTdGF0dXMoSVN0YXR1cy5DQU5DRUwsIEFjdGl2YXRvci5JRCwgZmFpbHVyZS5nZXRNZXNzYWdlKCksIGZhaWx1cmUpOwotCQllbHNlCi0JCQlyZXN1bHQgPSBuZXcgRG93bmxvYWRTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5pb19mYWlsZWRSZWFkLCBsb2NhdGlvbiksIGZhaWx1cmUpOwotCQlyZXN1bHQuc2V0VHJhbnNmZXJSYXRlKHNwZWVkKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBkb3dubG9hZChTdHJpbmcgdXJsLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJSUNvbm5lY3RDb250ZXh0IGNvbnRleHQgPSBnZXRDb25uZWN0aW9uQ29udGV4dCh1cmwsIGZhbHNlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgTE9HSU5fUkVUUklFUzsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHBlcmZvcm1Eb3dubG9hZCh1cmwsIGRlc3RpbmF0aW9uLCBjb250ZXh0LCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChQcm90b2NvbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChlID09IEVSUk9SXzQwMSkKLQkJCQkJCWNvbnRleHQgPSBnZXRDb25uZWN0aW9uQ29udGV4dCh1cmwsIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVXNlckNhbmNlbGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQkvL3JlYWNoZWQgbWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyB3aXRob3V0IHN1Y2Nlc3MKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfQVVUSEVOVElDQVRJT04sIE5MUy5iaW5kKE1lc3NhZ2VzLmlvX2ZhaWxlZFJlYWQsIHVybCksIG51bGwpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHBlcmZvcm1Eb3dubG9hZChTdHJpbmcgdG9Eb3dubG9hZCwgT3V0cHV0U3RyZWFtIHRhcmdldCwgSUNvbm5lY3RDb250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKLQkJSVJldHJpZXZlRmlsZVRyYW5zZmVyRmFjdG9yeSBmYWN0b3J5ID0gKElSZXRyaWV2ZUZpbGVUcmFuc2ZlckZhY3RvcnkpIHJldHJpZXZhbEZhY3RvcnlUcmFja2VyLmdldFNlcnZpY2UoKTsKLQkJaWYgKGZhY3RvcnkgPT0gbnVsbCkKLQkJCXJldHVybiBzdGF0dXNPbih0YXJnZXQsIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5pb19mYWlsZWRSZWFkLCB0b0Rvd25sb2FkKSkpOwotCi0JCXJldHVybiB0cmFuc2ZlcihmYWN0b3J5Lm5ld0luc3RhbmNlKCksIHRvRG93bmxvYWQsIHRhcmdldCwgY29udGV4dCwgbW9uaXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIHRyYW5zZmVyKGZpbmFsIElSZXRyaWV2ZUZpbGVUcmFuc2ZlckNvbnRhaW5lckFkYXB0ZXIgcmV0cmlldmFsQ29udGFpbmVyLCBmaW5hbCBTdHJpbmcgdG9Eb3dubG9hZCwgZmluYWwgT3V0cHV0U3RyZWFtIHRhcmdldCwgSUNvbm5lY3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKLQkJZmluYWwgSVN0YXR1c1tdIHJlc3VsdCA9IG5ldyBJU3RhdHVzWzFdOwotCQlmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlJRmlsZVRyYW5zZmVyTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSUZpbGVUcmFuc2Zlckxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlVHJhbnNmZXJFdmVudChJRmlsZVRyYW5zZmVyRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlU3RhcnRFdmVudCkgewotCQkJCQlJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlU3RhcnRFdmVudCByc2UgPSAoSUluY29taW5nRmlsZVRyYW5zZmVyUmVjZWl2ZVN0YXJ0RXZlbnQpIGV2ZW50OwotCQkJCQl0cnkgewotCQkJCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQkJCQkJcnNlLnJlY2VpdmUodGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBjb252ZXJ0VG9TdGF0dXMoZXZlbnQsIGUsIHN0YXJ0VGltZSwgdG9Eb3dubG9hZCk7Ci0JCQkJCQlzeW5jaHJvbml6ZWQgKHJlc3VsdCkgewotCQkJCQkJCXJlc3VsdFswXSA9IHN0YXR1czsKLQkJCQkJCQlyZXN1bHQubm90aWZ5KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgSUluY29taW5nRmlsZVRyYW5zZmVyUmVjZWl2ZURhdGFFdmVudCkgewotCQkJCQlJSW5jb21pbmdGaWxlVHJhbnNmZXIgc291cmNlID0gKChJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlRGF0YUV2ZW50KSBldmVudCkuZ2V0U291cmNlKCk7Ci0JCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCQlzb3VyY2UuY2FuY2VsKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgSUluY29taW5nRmlsZVRyYW5zZmVyUmVjZWl2ZURvbmVFdmVudCkgewotCQkJCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gKChJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlRG9uZUV2ZW50KSBldmVudCkuZ2V0RXhjZXB0aW9uKCk7Ci0JCQkJCUlTdGF0dXMgc3RhdHVzID0gY29udmVydFRvU3RhdHVzKGV2ZW50LCBleGNlcHRpb24sIHN0YXJ0VGltZSwgdG9Eb3dubG9hZCk7Ci0JCQkJCXN5bmNocm9uaXplZCAocmVzdWx0KSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBzdGF0dXM7Ci0JCQkJCQlyZXN1bHQubm90aWZ5KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCXJldHJpZXZhbENvbnRhaW5lci5zZXRDb25uZWN0Q29udGV4dEZvckF1dGhlbnRpY2F0aW9uKGNvbnRleHQpOwotCQkJcmV0cmlldmFsQ29udGFpbmVyLnNlbmRSZXRyaWV2ZVJlcXVlc3QoRmlsZUlERmFjdG9yeS5nZXREZWZhdWx0KCkuY3JlYXRlRmlsZUlEKHJldHJpZXZhbENvbnRhaW5lci5nZXRSZXRyaWV2ZU5hbWVzcGFjZSgpLCB0b0Rvd25sb2FkKSwgbGlzdGVuZXIsIG51bGwpOwotCQl9IGNhdGNoIChJbmNvbWluZ0ZpbGVUcmFuc2ZlckV4Y2VwdGlvbiBlKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0JCQlUaHJvd2FibGUgZXhjZXB0aW9uID0gc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotCQkJaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0JCQkJaWYgKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkgIT0gbnVsbCAmJiAoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKS5pbmRleE9mKCIgNDAxICIpICE9IC0xIHx8IGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkuaW5kZXhPZihTRVJWRVJfUkVESVJFQ1QpICE9IC0xKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl0aHJvdyBFUlJPUl80MDE7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhdHVzT24odGFyZ2V0LCBzdGF0dXMpOwotCQl9IGNhdGNoIChGaWxlQ3JlYXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBzdGF0dXNPbih0YXJnZXQsIGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JCXN5bmNocm9uaXplZCAocmVzdWx0KSB7Ci0JCQl3aGlsZSAocmVzdWx0WzBdID09IG51bGwpIHsKLQkJCQlib29sZWFuIGxvZ2dlZCA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCXJlc3VsdC53YWl0KCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoIWxvZ2dlZCkKLQkJCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEFjdGl2YXRvci5JRCwgIlVuZXhwZWN0ZWQgaW50ZXJydXB0IHdoaWxlIHdhaXRpbmcgb24gRUNGIHRyYW5zZmVyIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN0YXR1c09uKHRhcmdldCwgcmVzdWx0WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb25uZWN0aW9uIGNvbnRleHQgZm9yIHRoZSBnaXZlbiBVUkwuIFRoaXMgbWF5IHByb21wdCB0aGUKLQkgKiB1c2VyIGZvciB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGFzIHJlcXVpcmVkLgotCSAqIAotCSAqIEBwYXJhbSB4bWxMb2NhdGlvbiAtIHRoZSBmaWxlIGxvY2F0aW9uIHJlcXVpcmluZyBsb2dpbiBkZXRhaWxzCi0JICogQHBhcmFtIHByb21wdCAtIHVzZSA8Y29kZT50cnVlPC9jb2RlPiB0byBwcm9tcHQgdGhlIHVzZXIgaW5zdGVhZCBvZgotCSAqIGxvb2tpbmcgYXQgdGhlIHNlY3VyZSBwcmVmZXJlbmNlIHN0b3JlIGZvciBsb2dpbiwgdXNlIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIHRvIG9ubHkgdHJ5IHRoZSBzZWN1cmUgcHJlZmVyZW5jZSBzdG9yZQotCSAqIEB0aHJvd3MgVXNlckNhbmNlbGxlZEV4Y2VwdGlvbiB3aGVuIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGxvZ2luIHByb21wdCAKLQkgKiBAdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiBpZiB0aGUgcGFzc3dvcmQgY2Fubm90IGJlIHJlYWQgb3Igc2F2ZWQKLQkgKiBAcmV0dXJuIFRoZSBjb25uZWN0aW9uIGNvbnRleHQKLQkgKi8KLQlwdWJsaWMgSUNvbm5lY3RDb250ZXh0IGdldENvbm5lY3Rpb25Db250ZXh0KFN0cmluZyB4bWxMb2NhdGlvbiwgYm9vbGVhbiBwcm9tcHQpIHRocm93cyBVc2VyQ2FuY2VsbGVkRXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24gewotCQlJU2VjdXJlUHJlZmVyZW5jZXMgc2VjdXJlUHJlZmVyZW5jZXMgPSBTZWN1cmVQcmVmZXJlbmNlc0ZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotCQlJUGF0aCBob3N0TG9jYXRpb24gPSBuZXcgUGF0aCh4bWxMb2NhdGlvbikucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQlTdHJpbmcgbm9kZUtleTsKLQkJdHJ5IHsKLQkJCW5vZGVLZXkgPSBVUkxFbmNvZGVyLmVuY29kZShob3N0TG9jYXRpb24udG9TdHJpbmcoKSwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMikgewotCQkJLy9mYWxsIGJhY2sgdG8gZGVmYXVsdCBwbGF0Zm9ybSBlbmNvZGluZwotCQkJbm9kZUtleSA9IFVSTEVuY29kZXIuZW5jb2RlKGhvc3RMb2NhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCQlTdHJpbmcgbm9kZU5hbWUgPSBJUmVwb3NpdG9yeS5QUkVGRVJFTkNFX05PREUgKyAnLycgKyBub2RlS2V5OwotCQlJU2VjdXJlUHJlZmVyZW5jZXMgcHJlZk5vZGUgPSBudWxsOwotCQlpZiAoc2VjdXJlUHJlZmVyZW5jZXMubm9kZUV4aXN0cyhub2RlTmFtZSkpCi0JCQlwcmVmTm9kZSA9IHNlY3VyZVByZWZlcmVuY2VzLm5vZGUobm9kZU5hbWUpOwotCQlpZiAoIXByb21wdCkgewotCQkJaWYgKHByZWZOb2RlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB1c2VybmFtZSA9IHByZWZOb2RlLmdldChJUmVwb3NpdG9yeS5QUk9QX1VTRVJOQU1FLCBudWxsKTsKLQkJCQlTdHJpbmcgcGFzc3dvcmQgPSBwcmVmTm9kZS5nZXQoSVJlcG9zaXRvcnkuUFJPUF9QQVNTV09SRCwgbnVsbCk7Ci0JCQkJLy9pZiB3ZSBkb24ndCBoYXZlIHN0b3JlZCBjb25uZWN0aW9uIGRhdGEganVzdCByZXR1cm4gYSBudWxsIGNvbm5lY3Rpb24gY29udGV4dAotCQkJCWlmICh1c2VybmFtZSA9PSBudWxsIHx8IHBhc3N3b3JkID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXJldHVybiBDb25uZWN0Q29udGV4dEZhY3RvcnkuY3JlYXRlVXNlcm5hbWVQYXNzd29yZENvbm5lY3RDb250ZXh0KHVzZXJuYW1lLCBwYXNzd29yZCk7Ci0JCQl9IGNhdGNoIChTdG9yYWdlRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9pbnRlcm5hbEVycm9yLCB4bWxMb2NhdGlvbi50b1N0cmluZygpKTsKLQkJCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsIG1zZywgbnVsbCkpOwotCQkJfQotCQl9Ci0JCS8vbmVlZCB0byBwcm9tcHQgdXNlciBmb3IgdXNlciBuYW1lIGFuZCBwYXNzd29yZAotCQlTZXJ2aWNlVHJhY2tlciBhZG1pblVJVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJU2VydmljZVVJLmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7Ci0JCWFkbWluVUlUcmFja2VyLm9wZW4oKTsKLQkJSVNlcnZpY2VVSSBhZG1pblVJU2VydmljZSA9IChJU2VydmljZVVJKSBhZG1pblVJVHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0JCUF1dGhlbnRpY2F0aW9uSW5mbyBsb2dpbkRldGFpbHMgPSBudWxsOwotCQlpZiAoYWRtaW5VSVNlcnZpY2UgIT0gbnVsbCkKLQkJCWxvZ2luRGV0YWlscyA9IGFkbWluVUlTZXJ2aWNlLmdldFVzZXJuYW1lUGFzc3dvcmQoaG9zdExvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQkvL251bGwgcmVzdWx0IG1lYW5zIHVzZXIgY2FuY2VsZWQgcGFzc3dvcmQgZGlhbG9nCi0JCWlmIChsb2dpbkRldGFpbHMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBVc2VyQ2FuY2VsbGVkRXhjZXB0aW9uKCk7Ci0JCS8vc2F2ZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGlmIHJlcXVlc3RlZCBieSB1c2VyCi0JCWlmIChsb2dpbkRldGFpbHMuc2F2ZVJlc3VsdCgpKSB7Ci0JCQlpZiAocHJlZk5vZGUgPT0gbnVsbCkKLQkJCQlwcmVmTm9kZSA9IHNlY3VyZVByZWZlcmVuY2VzLm5vZGUobm9kZU5hbWUpOwotCQkJdHJ5IHsKLQkJCQlwcmVmTm9kZS5wdXQoSVJlcG9zaXRvcnkuUFJPUF9VU0VSTkFNRSwgbG9naW5EZXRhaWxzLmdldFVzZXJOYW1lKCksIHRydWUpOwotCQkJCXByZWZOb2RlLnB1dChJUmVwb3NpdG9yeS5QUk9QX1BBU1NXT1JELCBsb2dpbkRldGFpbHMuZ2V0UGFzc3dvcmQoKSwgdHJ1ZSk7Ci0JCQkJcHJlZk5vZGUuZmx1c2goKTsKLQkJCX0gY2F0Y2ggKFN0b3JhZ2VFeGNlcHRpb24gZTEpIHsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9pbnRlcm5hbEVycm9yLCB4bWxMb2NhdGlvbi50b1N0cmluZygpKTsKLQkJCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsIG1zZywgbnVsbCkpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5yZXBvTWFuX2ludGVybmFsRXJyb3IsIHhtbExvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgbXNnLCBudWxsKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbm5lY3RDb250ZXh0RmFjdG9yeS5jcmVhdGVVc2VybmFtZVBhc3N3b3JkQ29ubmVjdENvbnRleHQobG9naW5EZXRhaWxzLmdldFVzZXJOYW1lKCksIGxvZ2luRGV0YWlscy5nZXRQYXNzd29yZCgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJU3RhdHVzIHN0YXR1c09uKE91dHB1dFN0cmVhbSB0YXJnZXQsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJU3RhdGVmdWwpCi0JCQkoKElTdGF0ZWZ1bCkgdGFyZ2V0KS5zZXRTdGF0dXMoc3RhdHVzKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0ZpbGVEb3dubG9hZFJlcXVlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvRmlsZURvd25sb2FkUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2U4ZDg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvRmlsZURvd25sb2FkUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgRmlsZURvd25sb2FkUmVxdWVzdCBleHRlbmRzIEFydGlmYWN0UmVxdWVzdCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlRG93bmxvYWRSZXF1ZXN0W10gTk9fUkVRVUVTVCA9IG5ldyBGaWxlRG93bmxvYWRSZXF1ZXN0WzBdOwotCi0JcHJpdmF0ZSBGaWxlIGRlc3RpbmF0aW9uOyAvLyBUaGUgZnVsbHkgcXVhbGlmaWVkIHBhdGggd2hlcmUgdGhlIGZpbGUgc2hvdWxkIGJlIHdyaXR0ZW4KLQotCXB1YmxpYyBGaWxlRG93bmxvYWRSZXF1ZXN0KElBcnRpZmFjdEtleSBkb3dubG9hZEtleSwgSVBhdGggZG93bmxvYWRQYXRoKSB7Ci0JCXN1cGVyKGRvd25sb2FkS2V5KTsKLQkJZGVzdGluYXRpb24gPSBkb3dubG9hZFBhdGgudG9GaWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCU91dHB1dFN0cmVhbSBkZXN0aW5hdGlvblN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWRlc3RpbmF0aW9uU3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uKSk7Ci0JCQkJc2V0UmVzdWx0KHNvdXJjZS5nZXRBcnRpZmFjdChkZXNjcmlwdG9yLCBkZXN0aW5hdGlvblN0cmVhbSwgbnVsbCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZGVzdGluYXRpb25TdHJlYW0gIT0gbnVsbCkKLQkJCQkJZGVzdGluYXRpb25TdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJc2V0UmVzdWx0KG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5GaWxlRG93bmxvYWRFcnJvciwgZGVzY3JpcHRvciwgZGVzdGluYXRpb24pLCBlKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZjk0YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X25vdF9mb3VuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhdmFpbGFibGVfYWxyZWFkeV9pbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb3dubG9hZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9jbG9zaW5nX3N0cmVhbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaWxlRG93bmxvYWRFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpb19mYWlsZWRSZWFkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlvX2luY29tcGF0aWJsZVZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2lnbmF0dXJlVmVyaWZpY2F0aW9uX2ZhaWxlZFJlYWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2lnbmF0dXJlVmVyaWZpY2F0aW9uX2ludmFsaWRDb250ZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpZ25hdHVyZVZlcmlmaWNhdGlvbl9pbnZhbGlkRmlsZUNvbnRlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaWduYXR1cmVWZXJpZmllcl9PdXRPZk1lbW9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpb19wYXJzZUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1pcnJvcmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvTWFuX2V4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvTWFuX2ZhaWxlZFJlYWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb01hbl9pbnRlcm5hbEVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9NYW5fbm90RXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9NYW5fdW5rbm93blR5cGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb0ZhaWxlZFdyaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9SZWFkT25seTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhcl9kb3dubG9hZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXJfZG93bmxvYWRKb2JOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNhcl9mYWlsZWRNa2RpcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzYXJfcmVwb3J0U3RhdHVzOwotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGVzCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L01pcnJvclJlcXVlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvTWlycm9yUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTA1Mjk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvTWlycm9yUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCQljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gdmFyaW91cyBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBBIHJlcXVlc3QgdG8gbWlycm9yIChjb3B5KSBhbiBhcnRpZmFjdCBpbnRvIGEgZ2l2ZW4gZGVzdGluYXRpb24gYXJ0aWZhY3QgcmVwb3NpdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIE1pcnJvclJlcXVlc3QgZXh0ZW5kcyBBcnRpZmFjdFJlcXVlc3QgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIEVNUFRZX1NURVBTID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvclswXTsKLQotCXByaXZhdGUgZmluYWwgSUFydGlmYWN0UmVwb3NpdG9yeSB0YXJnZXQ7Ci0KLQlwcml2YXRlIGZpbmFsIFByb3BlcnRpZXMgdGFyZ2V0RGVzY3JpcHRvclByb3BlcnRpZXM7Ci0KLQlwcml2YXRlIGZpbmFsIFByb3BlcnRpZXMgdGFyZ2V0UmVwb3NpdG9yeVByb3BlcnRpZXM7Ci0KLQlwdWJsaWMgTWlycm9yUmVxdWVzdChJQXJ0aWZhY3RLZXkga2V5LCBJQXJ0aWZhY3RSZXBvc2l0b3J5IHRhcmdldFJlcG9zaXRvcnksIFByb3BlcnRpZXMgdGFyZ2V0RGVzY3JpcHRvclByb3BlcnRpZXMsIFByb3BlcnRpZXMgdGFyZ2V0UmVwb3NpdG9yeVByb3BlcnRpZXMpIHsKLQkJc3VwZXIoa2V5KTsKLQkJdGFyZ2V0ID0gdGFyZ2V0UmVwb3NpdG9yeTsKLQkJaWYgKHRhcmdldERlc2NyaXB0b3JQcm9wZXJ0aWVzID09IG51bGwgfHwgdGFyZ2V0RGVzY3JpcHRvclByb3BlcnRpZXMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLnRhcmdldERlc2NyaXB0b3JQcm9wZXJ0aWVzID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudGFyZ2V0RGVzY3JpcHRvclByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJdGhpcy50YXJnZXREZXNjcmlwdG9yUHJvcGVydGllcy5wdXRBbGwodGFyZ2V0RGVzY3JpcHRvclByb3BlcnRpZXMpOwotCQl9Ci0KLQkJaWYgKHRhcmdldFJlcG9zaXRvcnlQcm9wZXJ0aWVzID09IG51bGwgfHwgdGFyZ2V0UmVwb3NpdG9yeVByb3BlcnRpZXMuaXNFbXB0eSgpKSB7Ci0JCQl0aGlzLnRhcmdldFJlcG9zaXRvcnlQcm9wZXJ0aWVzID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXRoaXMudGFyZ2V0UmVwb3NpdG9yeVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJdGhpcy50YXJnZXRSZXBvc2l0b3J5UHJvcGVydGllcy5wdXRBbGwodGFyZ2V0UmVwb3NpdG9yeVByb3BlcnRpZXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLmRvd25sb2FkaW5nLCBnZXRBcnRpZmFjdEtleSgpLmdldElkKCkpKTsKLQkJLy8gRG8gd2UgYWxyZWFkeSBoYXZlIHRoZSBhcnRpZmFjdCBpbiB0aGUgdGFyZ2V0PwotCQlpZiAodGFyZ2V0LmNvbnRhaW5zKGdldEFydGlmYWN0S2V5KCkpKSB7Ci0JCQlzZXRSZXN1bHQobmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLmF2YWlsYWJsZV9hbHJlYWR5X2luLCBnZXRBcnRpZmFjdEtleSgpKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gaWYgdGhlIHJlcXVlc3QgZG9lcyBub3QgaGF2ZSBhIGRlc2NyaXB0b3IgdGhlbiB0cnkgdG8gZmlsbCBvbmUgaW4gYnkgZ2V0dGluZwotCQkvLyB0aGUgbGlzdCBvZiBhbGwgYW5kIHJhbmRvbWx5IHBpY2tpbmcgb25lIHRoYXQgYXBwZWFycyB0byBiZSBvcHRpbWl6ZWQuCi0JCUlBcnRpZmFjdERlc2NyaXB0b3Igb3B0aW1pemVkID0gbnVsbDsKLQkJSUFydGlmYWN0RGVzY3JpcHRvciBjYW5vbmljYWwgPSBudWxsOwotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlJQXJ0aWZhY3REZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBzb3VyY2UuZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhnZXRBcnRpZmFjdEtleSgpKTsKLQkJCWlmIChkZXNjcmlwdG9ycy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZGVzY3JpcHRvcnNbaV0uZ2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5GT1JNQVQpID09IG51bGwpCi0JCQkJCQljYW5vbmljYWwgPSBkZXNjcmlwdG9yc1tpXTsKLQkJCQkJZWxzZSBpZiAoUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyLmNhblByb2Nlc3MoZGVzY3JpcHRvcnNbaV0pKQotCQkJCQkJb3B0aW1pemVkID0gZGVzY3JpcHRvcnNbaV07Ci0JCQkJfQotCQkJCWJvb2xlYW4gY2hvb3NlQ2Fub25pY2FsID0gc291cmNlLmdldExvY2F0aW9uKCkuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIElmIHRoZSBzb3VyY2UgcmVwbyBpcyBsb2NhbCB0aGVuIGxvb2sgZm9yIGEgY2Fub25pY2FsIGRlc2NyaXB0b3Igc28gd2UgZG9uJ3Qgd2FzdGUgcHJvY2Vzc2luZyB0aW1lLgotCQkJCWRlc2NyaXB0b3IgPSBjaG9vc2VDYW5vbmljYWwgPyBjYW5vbmljYWwgOiBvcHRpbWl6ZWQ7Ci0JCQkJLy8gaWYgdGhlIGRlc2NyaXB0b3IgaXMgc3RpbGwgbnVsbCB0aGVuIHdlIGNvdWxkIG5vdCBmaW5kIG91ciBmaXJzdCBjaG9pY2Ugb2YgZm9ybWF0IHNvIHN3aXRjaCB0aGUgbG9naWMuCi0JCQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCQkJZGVzY3JpcHRvciA9ICFjaG9vc2VDYW5vbmljYWwgPyBjYW5vbmljYWwgOiBvcHRpbWl6ZWQ7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB0aGUgZGVzY3JpcHRvciBpcyBub3Qgc2V0IG5vdyB0aGVuIHRoZSByZXBvIGRvZXMgbm90IGhhdmUgdGhlIHJlcXVlc3RlZCBhcnRpZmFjdAotCQkvLyBUT0RPIGltcHJvdmUgdGhlIHJlcG9ydGluZyBoZXJlLiAgSXQgbWF5IGJlIHRoZSBjYXNlIHRoYXQgdGhlIHJlcG8gaGFzIHRoZSBhcnRpZmFjdAotCQkvLyBidXQgdGhlIGNsaWVudCBkb2VzIG5vdCBoYXZlIGEgcHJvY2Vzc29yCi0JCWlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCXNldFJlc3VsdChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3Rfbm90X2ZvdW5kLCBnZXRBcnRpZmFjdEtleSgpKSkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gR2V0IHRoZSBvdXRwdXQgc3RyZWFtIHRvIHN0b3JlIHRoZSBhcnRpZmFjdAotCQkvLyBTaW5jZSB3ZSBhcmUgbWlycm9yaW5nLCBlbnN1cmUgd2UgY2xlYXIgb3V0IGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgZGVzY3JpcHRvciB0aGF0IG1heQotCQkvLyBub3QgYXBwbHkgaW4gdGhlIG5ldyByZXBvIGxvY2F0aW9uLgotCQkvLyBUT0RPIHRoaXMgaXMgYnJpdHRsZS4gIHBlcmhhcHMgdGhlIHJlcG8gaXRzZWxmIHNob3VsZCBkbyB0aGlzPyAgdGhlcmUgYXJlIGNhc2VzIHdoZXJlCi0JCS8vIHdlIHJlYWxseSBkbyBuZWVkIHRvIGdpdmUgdGhlIHJlcG8gdGhlIGFjdHVhbCBkZXNjcmlwdG9yIHRvIHVzZSBob3dldmVyLi4uCi0JCUFydGlmYWN0RGVzY3JpcHRvciBkZXN0aW5hdGlvbkRlc2NyaXB0b3IgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGdldEFydGlmYWN0RGVzY3JpcHRvcigpKTsKLQkJZGVzdGluYXRpb25EZXNjcmlwdG9yLnNldFByb2Nlc3NpbmdTdGVwcyhFTVBUWV9TVEVQUyk7Ci0JCWRlc3RpbmF0aW9uRGVzY3JpcHRvci5zZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkRPV05MT0FEX01ENSwgbnVsbCk7Ci0JCS8vCQlkZXN0aW5hdGlvbkRlc2NyaXB0b3Iuc2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5ET1dOTE9BRF9TSVpFLCBudWxsKTsKLQotCQlpZiAodGFyZ2V0RGVzY3JpcHRvclByb3BlcnRpZXMgIT0gbnVsbCkKLQkJCWRlc3RpbmF0aW9uRGVzY3JpcHRvci5hZGRQcm9wZXJ0aWVzKHRhcmdldERlc2NyaXB0b3JQcm9wZXJ0aWVzKTsKLQotCQlpZiAodGFyZ2V0UmVwb3NpdG9yeVByb3BlcnRpZXMgIT0gbnVsbCkKLQkJCWRlc3RpbmF0aW9uRGVzY3JpcHRvci5hZGRSZXBvc2l0b3J5UHJvcGVydGllcyh0YXJnZXRSZXBvc2l0b3J5UHJvcGVydGllcyk7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSB0cmFuc2ZlcihkZXN0aW5hdGlvbkRlc2NyaXB0b3IsIGRlc2NyaXB0b3IsIG1vbml0b3IpOwotCQkvLyBpZiBvayBvciB0cmFuc2ZlciBoYXMgYWxyZWFkeSBiZWVuIGRvbmUgd2l0aCB0aGUgY2Fub25pY2FsIGZvcm0gcmV0dXJuIHdpdGggc3RhdHVzIHNldCAKLQkJaWYgKHN0YXR1cy5pc09LKCkgfHwgZGVzY3JpcHRvciA9PSBjYW5vbmljYWwgfHwgY2Fub25pY2FsID09IG51bGwpIHsKLQkJCXNldFJlc3VsdChzdGF0dXMpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gcmV0cnkgd2l0aCBjYW5vbmljYWwsIGZpcnN0IHJlbW92ZSBwb3NzaWJseSBlcnJvbmVvdXNseSBhZGRlZCBkZXNjcmlwdG9yCi0JCWlmICh0YXJnZXQuY29udGFpbnMoZGVzdGluYXRpb25EZXNjcmlwdG9yKSkKLQkJCXRhcmdldC5yZW1vdmVEZXNjcmlwdG9yKGRlc3RpbmF0aW9uRGVzY3JpcHRvcik7Ci0JCXNldFJlc3VsdCh0cmFuc2ZlcihkZXN0aW5hdGlvbkRlc2NyaXB0b3IsIGNhbm9uaWNhbCwgbW9uaXRvcikpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyB0cmFuc2ZlcihJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc3RpbmF0aW9uRGVzY3JpcHRvciwgSUFydGlmYWN0RGVzY3JpcHRvciBzb3VyY2VEZXNjcmlwdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uOwotCQl0cnkgewotCQkJZGVzdGluYXRpb24gPSB0YXJnZXQuZ2V0T3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uRGVzY3JpcHRvcik7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfQotCi0JCS8vIERvIHRoZSBhY3R1YWwgdHJhbnNmZXIKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRTb3VyY2VSZXBvc2l0b3J5KCkuZ2V0QXJ0aWZhY3QoZGVzY3JpcHRvciwgZGVzdGluYXRpb24sIG1vbml0b3IpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlkZXN0aW5hdGlvbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JfY2xvc2luZ19zdHJlYW0sIGdldEFydGlmYWN0S2V5KCksIHRhcmdldC5nZXRMb2NhdGlvbigpKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gTWVzc2FnZXMubWlycm9yaW5nICsgZ2V0QXJ0aWZhY3RLZXkoKSArICIgaW50byAiICsgdGFyZ2V0OyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9NaXJyb3JTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9NaXJyb3JTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDkwODNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvTWlycm9yU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotCi0vKioKLSAqIE1pcnJvciBzdXBwb3J0IGNsYXNzIGZvciByZXBvc2l0b3JpZXMuIFRoaXMgY2xhc3MgaW1wbGVtZW50cwotICogbWlycm9yIHN1cHBvcnQgZXF1aXZhbGVudCB0byB0aGUgbWlycm9yaW5nIG9mIHVwZGF0ZSBtYW5hZ2VyIHNpdGVzLiBBIHJlcG9zaXRvcnkgCi0gKiBvcHRpb25hbGx5IHByb3ZpZGVzIGEgbWlycm9yIFVSTCB2aWEgdGhlIHtAbGluayBJUmVwb3NpdG9yeSNQUk9QX01JUlJPUlNfVVJMfSBrZXkuIAotICogVGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlIGF0IHRoaXMgVVJMIGlzIGV4cGVjdGVkIHRvIGJlIGFuIFhNTCBkb2N1bWVudCAKLSAqIGNvbnRhaW5pbmcgYSBsaXN0IG9mIDxtaXJyb3I+IGVsZW1lbnRzLiBUaGUgbWlycm9ycyBhcmUgYXNzdW1lZCB0byBiZSBhbHJlYWR5IAotICogc29ydGVkIGdlb2dyYXBoaWNhbGx5IHdpdGggY2xvc2VyIG1pcnJvcnMgZmlyc3QuCi0gKi8KLXB1YmxpYyBjbGFzcyBNaXJyb3JTZWxlY3RvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIExPRzIgPSBNYXRoLmxvZygyKTsKLQotCS8qKgotCSAqIEVuY2Fwc3VsYXRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBtaXJyb3IKLQkgKi8KLQlzdGF0aWMgY2xhc3MgTWlycm9ySW5mbyBpbXBsZW1lbnRzIENvbXBhcmFibGUgewotCQlsb25nIGJ5dGVzUGVyU2Vjb25kOwotCQlpbnQgZmFpbHVyZUNvdW50OwotCQlwcml2YXRlIGZpbmFsIGludCBpbml0aWFsUmFuazsKLQkJU3RyaW5nIGxvY2F0aW9uU3RyaW5nOwotCi0JCU1pcnJvckluZm8oU3RyaW5nIGxvY2F0aW9uLCBpbnQgaW5pdGlhbFJhbmspIHsKLQkJCXRoaXMuaW5pdGlhbFJhbmsgPSBpbml0aWFsUmFuazsKLQkJCXRoaXMubG9jYXRpb25TdHJpbmcgPSBsb2NhdGlvbjsKLQkJCWlmICghbG9jYXRpb25TdHJpbmcuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWxvY2F0aW9uU3RyaW5nID0gbG9jYXRpb25TdHJpbmcgKyAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCWZhaWx1cmVDb3VudCA9IDA7Ci0JCQlieXRlc1BlclNlY29uZCA9IERvd25sb2FkU3RhdHVzLlVOS05PV05fUkFURTsKLQkJfQotCi0JCS8qKgotCQkgKiBDb21wYXJpc29uIHVzZWQgdG8gc29ydCBtaXJyb3JzLgotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pIHsKLQkJCWlmICghKG8gaW5zdGFuY2VvZiBNaXJyb3JJbmZvKSkKLQkJCQlyZXR1cm4gMDsKLQkJCU1pcnJvckluZm8gdGhhdCA9IChNaXJyb3JJbmZvKSBvOwotCQkJLy9sZXNzIGZhaWx1cmVzIGlzIGJldHRlcgotCQkJaWYgKHRoaXMuZmFpbHVyZUNvdW50ICE9IHRoYXQuZmFpbHVyZUNvdW50KQotCQkJCXJldHVybiB0aGlzLmZhaWx1cmVDb3VudCAtIHRoYXQuZmFpbHVyZUNvdW50OwotCQkJLy9mYXN0ZXIgaXMgYmV0dGVyCi0JCQlpZiAodGhpcy5ieXRlc1BlclNlY29uZCAhPSB0aGF0LmJ5dGVzUGVyU2Vjb25kKQotCQkJCXJldHVybiAoaW50KSAodGhpcy5ieXRlc1BlclNlY29uZCAtIHRoYXQuZmFpbHVyZUNvdW50KTsKLQkJCS8vdHJ1c3QgdGhhdCBpbml0aWFsIHJhbmsgaW5kaWNhdGVzIGdlb2dyYXBoaWNhbCBwcm94aW1pdHkKLQkJCXJldHVybiB0aGlzLmluaXRpYWxSYW5rIC0gdGhhdC5pbml0aWFsUmFuazsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIk1pcnJvcigiICsgbG9jYXRpb25TdHJpbmcgKyAnLCcgKyBmYWlsdXJlQ291bnQgKyAnLCcgKyBieXRlc1BlclNlY29uZCArICcpJzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIFVSSSBvZiB0aGUgYmFzZSByZXBvc2l0b3J5IGJlaW5nIG1pcnJvcmVkLgotCSAqLwotCVVSSSBiYXNlVVJJOwotCi0JTWlycm9ySW5mb1tdIG1pcnJvcnM7Ci0KLQlwcml2YXRlIGZpbmFsIElSZXBvc2l0b3J5IHJlcG9zaXRvcnk7Ci0KLQlwcml2YXRlIGZpbmFsIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgbWlycm9yIHN1cHBvcnQgY2xhc3MgZm9yIHRoZSBnaXZlbiByZXBvc2l0b3J5LiBNaXJyb3JzIGFyZQotCSAqIG5vdCBjb250YWN0ZWQgYW5kIHRoZSBtaXJyb3JzVVJMIGRvY3VtZW50IGlzIG5vdCBwYXJzZWQgdW50aWwgYQotCSAqIG1pcnJvciBsb2NhdGlvbiByZXF1ZXN0IGlzIHNlbnQuCi0JICovCi0JcHVibGljIE1pcnJvclNlbGVjdG9yKElSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKLQkJdGhpcy5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTsKLQkJdHJ5IHsKLQkJCVVSTCByZXBvc2l0b3J5VVJMID0gcmVwb3NpdG9yeS5nZXRMb2NhdGlvbigpOwotCQkJaWYgKHJlcG9zaXRvcnlVUkwgIT0gbnVsbCkKLQkJCQl0aGlzLmJhc2VVUkkgPSBVUkxVdGlsLnRvVVJJKHJlcG9zaXRvcnlVUkwpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJbG9nKCJFcnJvciBpbml0aWFsaXppbmcgbWlycm9ycyBmb3I6ICIgKyByZXBvc2l0b3J5LmdldExvY2F0aW9uKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIGdpdmVuIG1pcnJvciBVUkwgdG8gb2J0YWluIHRoZSBsaXN0IG9mIG1pcnJvcnMuIFJldHVybnMgdGhlIG1pcnJvcnMsCi0JICogb3IgbnVsbCBpZiBtaXJyb3JzIGNvdWxkIG5vdCBiZSBjb21wdXRlZC4KLQkgKiAKLQkgKiBPcmlnaW5hbGx5IGNvcGllZCBmcm9tIERlZmF1bHRTaXRlUGFyc2VyLmdldE1pcnJvcnMgaW4gb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUKLQkgKi8KLQlwcml2YXRlIE1pcnJvckluZm9bXSBjb21wdXRlTWlycm9ycyhTdHJpbmcgbWlycm9yc1VSTCkgewotCQl0cnkgewotCQkJU3RyaW5nIGNvdW50cnlDb2RlID0gTG9jYWxlLmdldERlZmF1bHQoKS5nZXRDb3VudHJ5KCkudG9Mb3dlckNhc2UoKTsKLQkJCWludCB0aW1lWm9uZSA9IChuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKSkuZ2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKSAvICg2MCAqIDYwICogMTAwMCk7Ci0KLQkJCWlmIChtaXJyb3JzVVJMLmluZGV4T2YoJz8nKSAhPSAtMSkgewotCQkJCW1pcnJvcnNVUkwgPSBtaXJyb3JzVVJMICsgJyYnOwotCQkJfSBlbHNlIHsKLQkJCQltaXJyb3JzVVJMID0gbWlycm9yc1VSTCArICc/JzsKLQkJCX0KLQkJCW1pcnJvcnNVUkwgPSBtaXJyb3JzVVJMICsgImNvdW50cnlDb2RlPSIgKyBjb3VudHJ5Q29kZSArICImdGltZVpvbmU9IiArIHRpbWVab25lICsgIiZyZXNwb25zZVR5cGU9eG1sIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb21GYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBkb21GYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKG1pcnJvcnNVUkwpOwotCQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlOb2RlTGlzdCBtaXJyb3JOb2RlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJtaXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJaW50IG1pcnJvckNvdW50ID0gbWlycm9yTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlNaXJyb3JJbmZvW10gaW5mb3MgPSBuZXcgTWlycm9ySW5mb1ttaXJyb3JDb3VudCArIDFdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaXJyb3JDb3VudDsgaSsrKSB7Ci0JCQkJRWxlbWVudCBtaXJyb3JOb2RlID0gKEVsZW1lbnQpIG1pcnJvck5vZGVzLml0ZW0oaSk7Ci0JCQkJU3RyaW5nIGluZm9VUkwgPSBtaXJyb3JOb2RlLmdldEF0dHJpYnV0ZSgidXJsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpbmZvc1tpXSA9IG5ldyBNaXJyb3JJbmZvKGluZm9VUkwsIGkpOwotCQkJfQotCQkJLy9wMjogYWRkIHRoZSBiYXNlIHNpdGUgYXMgdGhlIGxhc3QgcmVzb3J0IG1pcnJvciBzbyB3ZSBjYW4gdHJhY2sgZG93bmxvYWQgc3BlZWQgYW5kIGZhaWx1cmUgcmF0ZQotCQkJaW5mb3NbbWlycm9yQ291bnRdID0gbmV3IE1pcnJvckluZm8ocmVwb3NpdG9yeS5nZXRMb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCksIG1pcnJvckNvdW50KTsKLQkJCXJldHVybiBpbmZvczsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBpZiBhYnNvbHV0ZSB1cmwKLQkJCWlmIChtaXJyb3JzVVJMICE9IG51bGwgJiYgKG1pcnJvcnNVUkwuc3RhcnRzV2l0aCgiaHR0cDovLyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgbWlycm9yc1VSTC5zdGFydHNXaXRoKCJodHRwczovLyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgbWlycm9yc1VSTC5zdGFydHNXaXRoKCJmaWxlOi8vIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBtaXJyb3JzVVJMLnN0YXJ0c1dpdGgoImZ0cDovLyIpIC8vJE5PTi1OTFMtMSQKLQkJCXx8IG1pcnJvcnNVUkwuc3RhcnRzV2l0aCgiamFyOi8vIikpKSAvLyROT04tTkxTLTEkCi0JCQkJbG9nKCJFcnJvciBwcm9jZXNzaW5nIG1pcnJvcnMgVVJMOiAiICsgbWlycm9yc1VSTCwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlcXVpdmFsZW50IGxvY2F0aW9uIGZvciB0aGUgZ2l2ZW4gYXJ0aWZhY3QgbG9jYXRpb24gaW4gdGhlIGJhc2UgCi0JICogcmVwb3NpdG9yeS4gIEFsd2F5cyBmYWxscyBiYWNrIHRvIHRoZSBnaXZlbiBpbnB1dCBsb2NhdGlvbiBpbiBjYXNlIG9mIGZhaWx1cmUKLQkgKiB0byBjb21wdXRlIG1pcnJvcnMuIE5ldmVyIHJldHVybnMgbnVsbC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRNaXJyb3JMb2NhdGlvbihTdHJpbmcgaW5wdXRMb2NhdGlvbikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlucHV0TG9jYXRpb24pOwotCQlpZiAoYmFzZVVSSSA9PSBudWxsKQotCQkJcmV0dXJuIGlucHV0TG9jYXRpb247Ci0JCVVSSSByZWxhdGl2ZUxvY2F0aW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlbGF0aXZlTG9jYXRpb24gPSBiYXNlVVJJLnJlbGF0aXZpemUobmV3IFVSSShpbnB1dExvY2F0aW9uKSk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoVHJhY2luZy5ERUJVR19NSVJST1JTKQotCQkJCWxvZygiVW5hYmxlIHRvIG1ha2UgbG9jYXRpb24gcmVsYXRpdmU6ICIgKyBpbnB1dExvY2F0aW9uLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vaWYgd2UgZmFpbGVkIHRvIHJlbGF0aXZpemUgdGhlIGxvY2F0aW9uLCB3ZSBjYW4ndCBzZWxlY3QgYSBtaXJyb3IKLQkJaWYgKHJlbGF0aXZlTG9jYXRpb24gPT0gbnVsbCB8fCByZWxhdGl2ZUxvY2F0aW9uLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiBpbnB1dExvY2F0aW9uOwotCQlNaXJyb3JJbmZvIHNlbGVjdGVkTWlycm9yID0gc2VsZWN0TWlycm9yKCk7Ci0JCWlmIChzZWxlY3RlZE1pcnJvciA9PSBudWxsKQotCQkJcmV0dXJuIGlucHV0TG9jYXRpb247Ci0JCWlmIChUcmFjaW5nLkRFQlVHX01JUlJPUlMpCi0JCQlUcmFjaW5nLmRlYnVnKCJTZWxlY3RlZCBtaXJyb3IgZm9yIGFydGlmYWN0ICIgKyBpbnB1dExvY2F0aW9uICsgIjogIiArIHNlbGVjdGVkTWlycm9yKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChzZWxlY3RlZE1pcnJvci5sb2NhdGlvblN0cmluZyArIHJlbGF0aXZlTG9jYXRpb24uZ2V0UGF0aCgpKS50b0V4dGVybmFsRm9ybSgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJbG9nKCJVbmFibGUgdG8gbWFrZSBsb2NhdGlvbiAiICsgaW5wdXRMb2NhdGlvbiArICIgcmVsYXRpdmUgdG8gbWlycm9yICIgKyBzZWxlY3RlZE1pcnJvci5sb2NhdGlvblN0cmluZywgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBpbnB1dExvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1pcnJvciBsb2NhdGlvbnMgZm9yIHRoaXMgcmVwb3NpdG9yeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGV5IGNvdWxkIG5vdCBiZSBjb21wdXRlZC4KLQkgKi8KLQlwcml2YXRlIE1pcnJvckluZm9bXSBpbml0TWlycm9ycygpIHsKLQkJaWYgKG1pcnJvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBtaXJyb3JzOwotCQlTdHJpbmcgbWlycm9yc1VSTCA9IChTdHJpbmcpIHJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcygpLmdldChJUmVwb3NpdG9yeS5QUk9QX01JUlJPUlNfVVJMKTsKLQkJaWYgKG1pcnJvcnNVUkwgIT0gbnVsbCkKLQkJCW1pcnJvcnMgPSBjb21wdXRlTWlycm9ycyhtaXJyb3JzVVJMKTsKLQkJcmV0dXJuIG1pcnJvcnM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBtZXNzYWdlLCBleGNlcHRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnRzIHRoZSByZXN1bHQgb2YgYSBtaXJyb3IgZG93bmxvYWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVwb3J0UmVzdWx0KFN0cmluZyB0b0Rvd25sb2FkLCBJU3RhdHVzIHJlc3VsdCkgewotCQlpZiAobWlycm9ycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG1pcnJvcnMubGVuZ3RoOyBpKyspIHsKLQkJCU1pcnJvckluZm8gbWlycm9yID0gbWlycm9yc1tpXTsKLQkJCWlmICh0b0Rvd25sb2FkLnN0YXJ0c1dpdGgobWlycm9yLmxvY2F0aW9uU3RyaW5nKSkgewotCQkJCWlmICghcmVzdWx0LmlzT0soKSAmJiByZXN1bHQuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkNBTkNFTCkKLQkJCQkJbWlycm9yLmZhaWx1cmVDb3VudCsrOwotCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBEb3dubG9hZFN0YXR1cykgewotCQkJCQlsb25nIG9sZFJhdGUgPSBtaXJyb3IuYnl0ZXNQZXJTZWNvbmQ7Ci0JCQkJCWxvbmcgbmV3UmF0ZSA9ICgoRG93bmxvYWRTdGF0dXMpIHJlc3VsdCkuZ2V0VHJhbnNmZXJSYXRlKCk7Ci0JCQkJCS8vYXZlcmFnZSBvbGQgYW5kIG5ldyByYXRlIHNvIG9uZSBzbG93IGRvd25sb2FkIGRvZXNuJ3QgcnVpbiB0aGUgbWlycm9yJ3MgcmVwdXRhdGlvbgotCQkJCQlpZiAob2xkUmF0ZSA+IDApCi0JCQkJCQluZXdSYXRlID0gKG9sZFJhdGUgKyBuZXdSYXRlKSAvIDI7Ci0JCQkJCW1pcnJvci5ieXRlc1BlclNlY29uZCA9IG5ld1JhdGU7Ci0JCQkJfQotCQkJCWlmIChUcmFjaW5nLkRFQlVHX01JUlJPUlMpCi0JCQkJCVRyYWNpbmcuZGVidWcoIlVwZGF0ZWQgbWlycm9yICIgKyBtaXJyb3IpOyAvLyROT04tTkxTLTEkCi0JCQkJQXJyYXlzLnNvcnQobWlycm9ycyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0cyBhIG1pcnJvciBmcm9tIHRoZSBnaXZlbiBsaXN0IG9mIG1pcnJvcnMuIFJldHVybnMgbnVsbCBpZiBhIG1pcnJvcgotCSAqIGNvdWxkIG5vdCBiZSBmb3VuZC4KLQkgKi8KLQlwcml2YXRlIE1pcnJvckluZm8gc2VsZWN0TWlycm9yKCkgewotCQlpbml0TWlycm9ycygpOwotCQlpbnQgbWlycm9yQ291bnQ7Ci0JCWlmIChtaXJyb3JzID09IG51bGwgfHwgKG1pcnJvckNvdW50ID0gbWlycm9ycy5sZW5ndGgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy90aGlzIGlzIGEgZnVuY3Rpb24gdGhhdCByYW5kb21seSBzZWxlY3RzIGEgbWlycm9yIGJhc2VkIG9uIGEgbG9nYXJpdGhtaWMKLQkJLy9kaXN0cmlidXRpb24uIE1pcnJvciAwIGhhcyBhIDEvMiBjaGFuY2Ugb2YgYmVpbmcgc2VsZWN0ZWQsIG1pcnJvciAxIGhhcyBhIDEvNCBjaGFuY2UsIAotCQkvLyBtaXJyb3IgMiBoYXMgYSAxLzggY2hhbmNlLCBldGMuIFRoaXMgaW50cm9kdWNlcyBzb21lIHZhcmlhdGlvbiBpbiB0aGUgbWlycm9yIAotCQkvL3NlbGVjdGlvbiwgd2hpbGUgc3RpbGwgZmF2b3JpbmcgYmV0dGVyIG1pcnJvcnMKLQkJaW50IHJlc3VsdCA9IChpbnQpIChNYXRoLmxvZyhyYW5kb20ubmV4dEludCgxIDw8IE1hdGgubWluKDE1LCBtaXJyb3JDb3VudCkpICsgMSkgLyBMT0cyKTsKLQkJaWYgKHJlc3VsdCA+PSBtaXJyb3JDb3VudCkKLQkJCXJlc3VsdCA9IG1pcnJvckNvdW50IC0gMTsKLQkJTWlycm9ySW5mbyBzZWxlY3RlZCA9IG1pcnJvcnNbbWlycm9yQ291bnQgLSAxIC0gcmVzdWx0XTsKLQkJLy9pZiB3ZSBzZWxlY3RlZCBhIG1pcnJvciB0aGF0IGhhcyBmYWlsZWQgaW4gdGhlIHBhc3QsIHJldmVydCB0byBiZXN0IGF2YWlsYWJsZSBtaXJyb3IKLQkJaWYgKHNlbGVjdGVkLmZhaWx1cmVDb3VudCA+IDApCi0JCQlzZWxlY3RlZCA9IG1pcnJvcnNbMF07Ci0JCS8vZm9yIG5vdywgZG9uJ3QgdG9sZXJhdGUgZmFpbGluZyBtaXJyb3JzCi0JCWlmIChzZWxlY3RlZC5mYWlsdXJlQ291bnQgPiAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBzZWxlY3RlZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvU2lnbmF0dXJlVmVyaWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvU2lnbmF0dXJlVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNhOGNiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L1NpZ25hdHVyZVZlcmlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qICBJQk0gLSBjb250aW51aW5nIGRldmVsb3BtZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNpZ25lZGNvbnRlbnQuKjsKLQotLyoqCi0gKiBUaGUgUGFjazIwMFVucGFja2VyIGV4cGVjdHMgYW4gaW5wdXQgY29udGFpbmluZyAiLmphci5wYWNrLmd6IiBkYXRhLiAgIAotICovCi1wdWJsaWMgY2xhc3MgU2lnbmF0dXJlVmVyaWZpZXIgZXh0ZW5kcyBQcm9jZXNzaW5nU3RlcCB7Ci0JcHJpdmF0ZSBGaWxlIGlucHV0RmlsZTsKLQlwcml2YXRlIE91dHB1dFN0cmVhbSB0ZW1wU3RyZWFtOwotCi0JcHVibGljIGJvb2xlYW4gYXJlUmVxdWlyZW1lbnRzU2F0aXNmaWVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoYik7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ5dGVzLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlnZXRPdXRwdXRTdHJlYW0oKS53cml0ZShieXRlcywgb2ZmLCBsZW4pOwotCX0KLQotCXByaXZhdGUgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmICh0ZW1wU3RyZWFtICE9IG51bGwpCi0JCQlyZXR1cm4gdGVtcFN0cmVhbTsKLQkJLy8gc3RvcmUgaW5wdXQgc3RyZWFtIGluIHRlbXBvcmFyeSBmaWxlCi0JCWlucHV0RmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInNpZ25hdHVyZUZpbGUiLCAiLmphciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGVtcFN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShpbnB1dEZpbGUpKTsKLQkJcmV0dXJuIHRlbXBTdHJlYW07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZlcmlmeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gcmVzdWx0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICh0ZW1wU3RyZWFtID09IG51bGwpCi0JCQkJLy8gaG1tbSwgbm8gb25lIHdyb3RlIHRvIHRoaXMgc3RyZWFtIHNvIHRoZXJlIGlzIG5vdGhpbmcgdG8gcGFzcyBvbgotCQkJCXJldHVybjsKLQkJCS8vIE9rLCBzbyB0aGVyZSBpcyBjb250ZW50LCBjbG9zZSB0aGUgdGVtcFN0cmVhbQotCQkJdGVtcFN0cmVhbS5jbG9zZSgpOwotCQkJc2V0U3RhdHVzKHZlcmlmeUNvbnRlbnQoKSk7Ci0KLQkJCS8vIG5vdyB3cml0ZSB0aGUgIGNvbnRlbnQgdG8gdGhlIGZpbmFsIGRlc3RpbmF0aW9uCi0JCQlyZXN1bHRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGlucHV0RmlsZSkpOwotCQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0ocmVzdWx0U3RyZWFtLCB0cnVlLCBnZXREZXN0aW5hdGlvbigpLCBmYWxzZSk7Ci0JCQlyZXN1bHRTdHJlYW0gPSBudWxsOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0RmlsZSAhPSBudWxsKQotCQkJCWlucHV0RmlsZS5kZWxldGUoKTsKLQkJCWlmIChyZXN1bHRTdHJlYW0gIT0gbnVsbCkKLQkJCQlyZXN1bHRTdHJlYW0uY2xvc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVN0YXR1cyB2ZXJpZnlDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU2lnbmVkQ29udGVudEZhY3RvcnkgdmVyaWZpZXJGYWN0b3J5ID0gKFNpZ25lZENvbnRlbnRGYWN0b3J5KSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgU2lnbmVkQ29udGVudEZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJU2lnbmVkQ29udGVudCBzaWduZWRDb250ZW50OwotCQl0cnkgewotCQkJc2lnbmVkQ29udGVudCA9IHZlcmlmaWVyRmFjdG9yeS5nZXRTaWduZWRDb250ZW50KGlucHV0RmlsZSk7Ci0JCX0gY2F0Y2ggKEdlbmVyYWxTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE1lc3NhZ2VzLlNpZ25hdHVyZVZlcmlmaWNhdGlvbl9mYWlsZWRSZWFkICsgaW5wdXRGaWxlLCBlKTsKLQkJfQotCQlBcnJheUxpc3QgYWxsU3RhdHVzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJU2lnbmVkQ29udGVudEVudHJ5W10gZW50cmllcyA9IHNpZ25lZENvbnRlbnQuZ2V0U2lnbmVkRW50cmllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspCi0JCQl0cnkgewotCQkJCWVudHJpZXNbaV0udmVyaWZ5KCk7Ci0JCQl9IGNhdGNoIChJbnZhbGlkQ29udGVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJYWxsU3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTWVzc2FnZXMuU2lnbmF0dXJlVmVyaWZpY2F0aW9uX2ludmFsaWRDb250ZW50ICsgZW50cmllc1tpXS5nZXROYW1lKCksIGUpKTsKLQkJCX0gY2F0Y2ggKE91dE9mTWVtb3J5RXJyb3IgZSkgewotCQkJCWFsbFN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE1lc3NhZ2VzLlNpZ25hdHVyZVZlcmlmaWVyX091dE9mTWVtb3J5LCBlKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCWlmIChhbGxTdGF0dXMuc2l6ZSgpID4gMCkKLQkJCXJldHVybiBuZXcgTXVsdGlTdGF0dXMoQWN0aXZhdG9yLklELCBJU3RhdHVzLkVSUk9SLCAoSVN0YXR1c1tdKSBhbGxTdGF0dXMudG9BcnJheShuZXcgSVN0YXR1c1thbGxTdGF0dXMuc2l6ZSgpXSksIE1lc3NhZ2VzLlNpZ25hdHVyZVZlcmlmaWNhdGlvbl9pbnZhbGlkRmlsZUNvbnRlbnQgKyBpbnB1dEZpbGUsIG51bGwpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIFdoZW4gd2UgZ28gdG8gY2xvc2Ugd2UgbXVzdCBoYXZlIHNlZW4gYWxsIHRoZSBjb250ZW50IHdlIGFyZSBnb2luZyB0byBzZWUKLQkJLy8gU28gYmVmb3JlIGNsb3NpbmcsIHZlcmlmeSBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byB0aGUgZGVzdGluYXRpb24KLQkJdmVyaWZ5KCk7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9UcmFuc3BvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvVHJhbnNwb3J0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4OWVjNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9UcmFuc3BvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zcG9ydCB7Ci0JcHVibGljIGFic3RyYWN0IElTdGF0dXMgZG93bmxvYWQoU3RyaW5nIHRvRG93bmxvYWQsIE91dHB1dFN0cmVhbSB0YXJnZXQsIElQcm9ncmVzc01vbml0b3IgcG0pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTEyMDY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWFydGlmYWN0X25vdF9mb3VuZD1BcnRpZmFjdCBub3QgZm91bmQ6IHswfS4KLWF2YWlsYWJsZV9hbHJlYWR5X2luPVRoZSBhcnRpZmFjdCBpcyBhbHJlYWR5IGF2YWlsYWJsZSBpbiB0aGUgcmVwb3NpdG9yeSB7MH0uCi1kb3dubG9hZGluZz1Eb3dubG9hZGluZyB7MH0KLWVycm9yX2Nsb3Npbmdfc3RyZWFtPUVycm9yIGNsb3NpbmcgdGhlIG91dHB1dCBzdHJlYW0gZm9yIHswfSBvbiByZXBvc2l0b3J5IHsxfS4gCi0KLUZpbGVEb3dubG9hZEVycm9yPUVycm9yIGRvd25sb2FkaW5nIHswfSB0byB7MX0uIAotaW9fZmFpbGVkUmVhZD1VbmFibGUgdG8gcmVhZCByZXBvc2l0b3J5IGF0IHswfS4KLWlvX3BhcnNlRXJyb3I9XAotCUVycm9yIHBhcnNpbmcgc2ltcGxlIGFydGlmYWN0IHJlcG9zaXRvcnkuCi1pb19pbmNvbXBhdGlibGVWZXJzaW9uPVwKLQlTaW1wbGUgYXJ0aWZhY3QgcmVwb3NpdG9yeSBoYXMgaW5jb21wYXRpYmxlIHZlcnNpb24gezB9OyBleHBlY3RlZCB7MX0uCi1taXJyb3Jpbmc9TWlycm9yaW5nOiAKLQotcmVwb0ZhaWxlZFdyaXRlPVVuYWJsZSB0byB3cml0ZSB0byByZXBvc2l0b3J5OiB7MH0uCi1yZXBvUmVhZE9ubHk9Q2Fubm90IHdyaXRlIGJlY2F1c2UgcmVwb3NpdG9yeSBpcyByZWFkIG9ubHk6IHswfQotCi1yZXBvTWFuX2V4aXN0cz1SZXBvc2l0b3J5IGFscmVhZHkgZXhpc3RzIGF0IHswfS4KLXJlcG9NYW5fZmFpbGVkUmVhZD1UaGUgcmVwb3NpdG9yeSBjb3VsZCBub3QgYmUgcmVhZDogezB9LgotcmVwb01hbl9pbnRlcm5hbEVycm9yPUludGVybmFsIGVycm9yLgotcmVwb01hbl9ub3RFeGlzdHM9Tm8gcmVwb3NpdG9yeSBmb3VuZCBhdCB7MH0uCi1yZXBvTWFuX3Vua25vd25UeXBlPVVua25vd24gcmVwb3NpdG9yeSB0eXBlIGF0IHswfS4KLQotU2lnbmF0dXJlVmVyaWZpY2F0aW9uX2ZhaWxlZFJlYWQ9RXJyb3IgcmVhZGluZyBzaWduZWQgY29udGVudDogCi1TaWduYXR1cmVWZXJpZmljYXRpb25faW52YWxpZENvbnRlbnQ9SW52YWxpZCBjb250ZW50OiAKLVNpZ25hdHVyZVZlcmlmaWNhdGlvbl9pbnZhbGlkRmlsZUNvbnRlbnQ9RmlsZSBoYXMgaW52YWxpZCBjb250ZW50OiAKLVNpZ25hdHVyZVZlcmlmaWVyX091dE9mTWVtb3J5PU91dCBvZiBtZW1vcnk6IENhbm5vdCB2ZXJpZnkgc2lnbmVkIGNvbnRlbnQuCi0JCi1zYXJfZG93bmxvYWRpbmc9RG93bmxvYWQgezB9IGFydGlmYWN0cwotc2FyX2Rvd25sb2FkSm9iTmFtZT1JbnN0YWxsIGRvd25sb2FkIAotc2FyX2ZhaWxlZE1rZGlyPUZhaWxlZCB0byBjcmVhdGUgZGlyZWN0b3J5IHswfS4KLXNhcl9yZXBvcnRTdGF0dXM9UHJvYmxlbXMgZG93bmxvYWRpbmcgYXJ0aWZhY3Q6IHswfS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvc2ltcGxlL0Jsb2JTdG9yZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvQmxvYlN0b3JlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNzY5YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvQmxvYlN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5zaW1wbGU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci0KLS8qKgotICogQmxvYiBzdG9yZSB3aGljaCBtYXBzIFVVSURzIHRvIGJsb2JzIG9uIGRpc2suIFRoZSBVVUlEIGlzIG1hcHBlZAotICogdG8gYSBmaWxlIGluIHRoZSBmaWxlLXN5c3RlbSBhbmQgdGhlIGJsb2IgaXMgdGhlIGZpbGUgY29udGVudHMuIEZvciBzY2FsYWJpbGl0eSwKLSAqIHRoZSBibG9icyBhcmUgc3BsaXQgYW1vbmcgMjU1IGRpcmVjdG9yaWVzIHdpdGggdGhlIG5hbWVzIDAwIHRvIEZGLgotICovCi1wdWJsaWMgY2xhc3MgQmxvYlN0b3JlIHsKLQlwcm90ZWN0ZWQgVVJMIHN0b3JlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZmlsZUJhc2VkOwotCS8qKiBMaW1pdHMgdGhlIHJhbmdlIG9mIGRpcmVjdG9yaWVzJyBuYW1lcy4gKi8KLQlwcm90ZWN0ZWQgYnl0ZSBtYXNrOwotCi0JLy9wcml2YXRlIHN0YXRpYyBzaG9ydFtdIHJhbmRvbUFycmF5ID0gezIxMywgMjMxLCAzNywgODUsIDIxMSwgMjksIDE2MSwgMTc1LCAxODcsIDMsIDE0NywgMjQ2LCAxNzAsIDMwLCAyMDIsIDE4MywgMjQyLCA0NywgMjU0LCAxODksIDI1LCAyNDgsIDE5MywgMiwgMTE5LCAxMzMsIDEyNSwgMTIsIDc2LCAyMTMsIDIxOSwgNzksIDY5LCAxMzMsIDIwMiwgODAsIDE1MCwgMTkwLCAxNTcsIDE5MCwgODAsIDE5MCwgMjE5LCAxNTAsIDE2OSwgMTE3LCA5NSwgMTAsIDc3LCAyMTQsIDIzMywgNzAsIDUsIDE4OCwgNDQsIDkxLCAxNjUsIDE0OSwgMTc3LCA5MywgMTcsIDExMiwgNCwgNDEsIDIzMCwgMTQ4LCAxODgsIDEwNywgMjEzLCAzMSwgNTIsIDYwLCAxMTEsIDI0NiwgMjI2LCAxMjEsIDEyOSwgMTk3LCAxNDQsIDI0OCwgOTIsIDEzMywgOTYsIDExNiwgMTA0LCA2NywgNzQsIDE0NCwgMTg1LCAxNDEsIDk2LCAzNCwgMTgyLCA5MCwgMzYsIDIxNywgMjgsIDIwNSwgMTA3LCA1MiwgMjAxLCAxNCwgOCwgMSwgMjcsIDIxNiwgNjAsIDM1LCAyNTEsIDE5NCwgNywgMTU2LCAzMiwgNSwgMTQ1LCAyOSwgOTYsIDYxLCAxMTAsIDE0NSwgNTAsIDU2LCAyMzUsIDIzOSwgMTcwLCAxMzgsIDE3LCAyMTEsIDU2LCA5OCwgMTAxLCAxMjYsIDI3LCA1NywgMjExLCAxNDQsIDIwNiwgMjA3LCAxNzksIDExMSwgMTYwLCA1MCwgMjQzLCA2OSwgMTA2LCAxMTgsIDE1NSwgMTU5LCAyOCwgNTcsIDExLCAxNzUsIDQzLCAxNzMsIDk2LCAxODEsIDk5LCAxNjksIDE3MSwgMTU2LCAyNDYsIDI0MywgMzAsIDE5OCwgMjUxLCA4MSwgNzcsIDkyLCAxNjAsIDIzNSwgMjE1LCAxODcsIDIzLCA3MSwgNTgsIDI0NywgMTI3LCA1NiwgMTE4LCAxMzIsIDc5LCAxODgsIDQyLCAxODgsIDE1OCwgMTIxLCAyNTUsIDY1LCAxNTQsIDExOCwgMTcyLCAyMTcsIDQsIDQ3LCAxMDUsIDIwNCwgMTM1LCAyNywgNDMsIDkwLCA5LCAzMSwgNTksIDExNSwgMTkzLCAyOCwgNTUsIDEwMSwgOSwgMTE3LCAyMTEsIDExMiwgNjEsIDU1LCAyMywgMjM1LCA1MSwgMTA0LCAxMjMsIDEzOCwgNzYsIDE0OCwgMTE1LCAxMTksIDgxLCA1NCwgMzksIDQ2LCAxNDksIDE5MSwgNzksIDE2LCAyMjIsIDY5LCAyMTksIDEzNiwgMTQ4LCAxODEsIDc3LCAyNTAsIDEwMSwgMjIzLCAxNDAsIDE5NCwgMTQxLCA0NCwgMTk1LCAyMTcsIDMxLCAyMjMsIDIwNywgMTQ5LCAyNDUsIDExNSwgMjQzLCAxODN9OwotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSByYW5kb21BcnJheSA9IHstNDMsIC0yNSwgMzcsIDg1LCAtNDUsIDI5LCAtOTUsIC04MSwgLTY5LCAzLCAtMTA5LCAtMTAsIC04NiwgMzAsIC01NCwgLTczLCAtMTQsIDQ3LCAtMiwgLTY3LCAyNSwgLTgsIC02MywgMiwgMTE5LCAtMTIzLCAxMjUsIDEyLCA3NiwgLTQzLCAtMzcsIDc5LCA2OSwgLTEyMywgLTU0LCA4MCwgLTEwNiwgLTY2LCAtOTksIC02NiwgODAsIC02NiwgLTM3LCAtMTA2LCAtODcsIDExNywgOTUsIDEwLCA3NywgLTQyLCAtMjMsIDcwLCA1LCAtNjgsIDQ0LCA5MSwgLTkxLCAtMTA3LCAtNzksIDkzLCAxNywgMTEyLCA0LCA0MSwgLTI2LCAtMTA4LCAtNjgsIDEwNywgLTQzLCAzMSwgNTIsIDYwLCAxMTEsIC0xMCwgLTMwLCAxMjEsIC0xMjcsIC01OSwgLTExMiwgLTgsIDkyLCAtMTIzLCA5NiwgMTE2LCAxMDQsIDY3LCA3NCwgLTExMiwgLTcxLCAtMTE1LCA5NiwgMzQsIC03NCwgOTAsIDM2LCAtMzksIDI4LCAtNTEsIDEwNywgNTIsIC01NSwgMTQsIDgsIDEsIDI3LCAtNDAsIDYwLCAzNSwgLTUsIC02MiwgNywgLTEwMCwgMzIsIDUsIC0xMTEsIDI5LCA5NiwgNjEsIDExMCwgLTExMSwgNTAsIDU2LCAtMjEsIC0xNywgLTg2LCAtMTE4LCAxNywgLTQ1LCA1NiwgOTgsIDEwMSwgMTI2LCAyNywgNTcsIC00NSwgLTExMiwgLTUwLCAtNDksIC03NywgMTExLCAtOTYsIDUwLCAtMTMsIDY5LCAxMDYsIDExOCwgLTEwMSwgLTk3LCAyOCwgNTcsIDExLCAtODEsIDQzLCAtODMsIDk2LCAtNzUsIDk5LCAtODcsIC04NSwgLTEwMCwgLTEwLCAtMTMsIDMwLAotCQkJLTU4LCAtNSwgODEsIDc3LCA5MiwgLTk2LCAtMjEsIC00MSwgLTY5LCAyMywgNzEsIDU4LCAtOSwgMTI3LCA1NiwgMTE4LCAtMTI0LCA3OSwgLTY4LCA0MiwgLTY4LCAtOTgsIDEyMSwgLTEsIDY1LCAtMTAyLCAxMTgsIC04NCwgLTM5LCA0LCA0NywgMTA1LCAtNTIsIC0xMjEsIDI3LCA0MywgOTAsIDksIDMxLCA1OSwgMTE1LCAtNjMsIDI4LCA1NSwgMTAxLCA5LCAxMTcsIC00NSwgMTEyLCA2MSwgNTUsIDIzLCAtMjEsIDUxLCAxMDQsIDEyMywgLTExOCwgNzYsIC0xMDgsIDExNSwgMTE5LCA4MSwgNTQsIDM5LCA0NiwgLTEwNywgLTY1LCA3OSwgMTYsIC0zNCwgNjksIC0zNywgLTEyMCwgLTEwOCwgLTc1LCA3NywgLTYsIDEwMSwgLTMzLCAtMTE2LCAtNjIsIC0xMTUsIDQ0LCAtNjEsIC0zOSwgMzEsIC0zMywgLTQ5LCAtMTA3LCAtMTEsIDExNSwgLTEzLCAtNzMsfTsKLQotCS8qKgotCSAqIFRoZSBsaW1pdCBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGlyZWN0b3JpZXMgbWFuYWdlZCBieSB0aGlzIHN0b3JlLgotCSAqIFRoaXMgbnVtYmVyIG11c3QgYmUgcG93ZXIgb2YgMiBhbmQgZG8gbm90IGV4Y2VlZCAyNTYuIFRoZSBsb2NhdGlvbgotCSAqIHNob3VsZCBiZSBhbiBleGlzdGluZyB2YWxpZCBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIEJsb2JTdG9yZShVUkwgc3RvcmUsIGludCBsaW1pdCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHN0b3JlKTsKLQkJdGhpcy5zdG9yZSA9IHN0b3JlOwotCQlmaWxlQmFzZWQgPSAiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZShzdG9yZS5nZXRQcm90b2NvbCgpKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZmlsZUJhc2VkKQotCQkJQXNzZXJ0LmlzVHJ1ZSghbmV3IEZpbGUoc3RvcmUuZ2V0UGF0aCgpKS5pc0ZpbGUoKSk7Ci0JCUFzc2VydC5pc1RydWUobGltaXQgPT0gMjU2IHx8IGxpbWl0ID09IDEyOCB8fCBsaW1pdCA9PSA2NCB8fCBsaW1pdCA9PSAzMiB8fCBsaW1pdCA9PSAxNiB8fCBsaW1pdCA9PSA4IHx8IGxpbWl0ID09IDQgfHwgbGltaXQgPT0gMiB8fCBsaW1pdCA9PSAxKTsKLQkJbWFzayA9IChieXRlKSAobGltaXQgLSAxKTsKLQl9Ci0KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShieXRlW10gdXVpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKCFmaWxlQmFzZWQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJbmV3IEZpbGUoZm9sZGVyRm9yKHV1aWQpKS5ta2RpcigpOwotCQlyZXR1cm4gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZUZvcih1dWlkKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgVW5pdmVyc2FsVW5pcXVlSWRlbnRpZmllciNhcHBlbmRCeXRlU3RyaW5nKFN0cmluZ0J1ZmZlciwgYnl0ZSkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kQnl0ZVN0cmluZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBieXRlIHZhbHVlKSB7Ci0JCVN0cmluZyBoZXhTdHJpbmc7Ci0JCWlmICh2YWx1ZSA8IDApCi0JCQloZXhTdHJpbmcgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKDI1NiArIHZhbHVlKTsKLQkJZWxzZQotCQkJaGV4U3RyaW5nID0gSW50ZWdlci50b0hleFN0cmluZyh2YWx1ZSk7Ci0JCWlmIChoZXhTdHJpbmcubGVuZ3RoKCkgPT0gMSkKLQkJCWJ1ZmZlci5hcHBlbmQoIjAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGhleFN0cmluZyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIENvbnZlcnRzIGFuIGFycmF5IG9mIGJ5dGVzIGludG8gYSBTdHJpbmcuCi0JICoKLQkgKiBAc2VlIFVuaXZlcnNhbFVuaXF1ZUlkZW50aWZpZXIjdG9TdHJpbmcoKQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGJ5dGVzVG9IZXhTdHJpbmcoYnl0ZVtdIGIpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBiLmxlbmd0aDsgaSsrKQotCQkJYXBwZW5kQnl0ZVN0cmluZyhidWZmZXIsIGJbaV0pOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyBhIGJsb2JGaWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZUJsb2IoYnl0ZVtdIHV1aWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbCh1dWlkKTsKLQkJaWYgKGZpbGVCYXNlZCkKLQkJCW5ldyBGaWxlKGZpbGVGb3IodXVpZCkpLmRlbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZSBhbGwgb2YgdGhlIGJsb2JzIGluIHRoZSBnaXZlbiBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlQmxvYnMoU2V0IHNldCkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBzZXQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQkJZGVsZXRlQmxvYigoYnl0ZVtdKSBpLm5leHQoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBmaWxlRm9yKGJ5dGVbXSB1dWlkKSB7Ci0JCXJldHVybiBmb2xkZXJGb3IodXVpZCkgKyBieXRlc1RvSGV4U3RyaW5nKHV1aWQpOwotCX0KLQotCS8qKgotCSAqIEZpbmQgb3V0IHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkgdGhhdCBmaXRzIGJldHRlciB0byB0aGlzIFVVSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBmb2xkZXJGb3IoYnl0ZVtdIHV1aWQpIHsKLQkJYnl0ZSBoYXNoID0gaGFzaFVVSURieXRlcyh1dWlkKTsKLQkJaGFzaCAmPSBtYXNrOyAvLyBsaW1pdCB0aGUgcmFuZ2Ugb2YgdGhlIGRpcmVjdG9yeQotCQlyZXR1cm4gc3RvcmUgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGhhc2ggKyAoMTI4ICYgbWFzaykpICsgIi8iOyAvLyArKDEyOCAmIG1hc2spIG1ha2VzIHN1cmUgMDBoIGlzIHRoZSBsb3dlciB2YWx1ZSAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldEJsb2IoYnl0ZVtdIHV1aWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgVVJMKGZpbGVGb3IodXVpZCkpLm9wZW5TdHJlYW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIGJ5dGUgYXJyYXkgaW50byBhIGJ5dGUgaGFzaCByZXByZXNlbnRhdGlvbi4gSXQgaXMgdXNlZCB0bwotCSAqIGdldCBhIGRpcmVjdG9yeSBuYW1lLgotCSAqLwotCXByb3RlY3RlZCBieXRlIGhhc2hVVUlEYnl0ZXMoYnl0ZVtdIHV1aWQpIHsKLQkJYnl0ZSBoYXNoID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1dWlkLmxlbmd0aDsgaSsrKQotCQkJaGFzaCBePSByYW5kb21BcnJheVt1dWlkW2ldICsgMTI4XTsgLy8gKzEyOCBtYWtlcyBzdXJlIHRoZSBpbmRleCBpcyA+MAotCQlyZXR1cm4gaGFzaDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3NpbXBsZS9Eb3dubG9hZEpvYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvRG93bmxvYWRKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMWEyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3NpbXBsZS9Eb3dubG9hZEpvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBHZW51aXRlYywgTExDIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogR2VudWl0ZWMsIExMQyAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCQkJCQkJSUJNIENvcnBvcmF0aW9uIC0gb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnNpbXBsZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXF1ZXN0OwotCi1wdWJsaWMgY2xhc3MgRG93bmxvYWRKb2IgZXh0ZW5kcyBKb2IgewotCXN0YXRpYyBmaW5hbCBPYmplY3QgRkFNSUxZID0gbmV3IE9iamVjdCgpOwotCi0JcHJpdmF0ZSBMaW5rZWRMaXN0IHJlcXVlc3RzUGVuZGluZzsKLQlwcml2YXRlIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5OwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtYXN0ZXJNb25pdG9yOwotCXByaXZhdGUgTXVsdGlTdGF0dXMgb3ZlcmFsbFN0YXR1czsKLQotCURvd25sb2FkSm9iKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JfQotCi0Jdm9pZCBpbml0aWFsaXplKFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5LCBMaW5rZWRMaXN0IHJlcXVlc3RzUGVuZGluZywgSVByb2dyZXNzTW9uaXRvciBtYXN0ZXJNb25pdG9yLCBNdWx0aVN0YXR1cyBvdmVyYWxsU3RhdHVzKSB7Ci0JCXRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7Ci0JCXRoaXMucmVxdWVzdHNQZW5kaW5nID0gcmVxdWVzdHNQZW5kaW5nOwotCQl0aGlzLm1hc3Rlck1vbml0b3IgPSBtYXN0ZXJNb25pdG9yOwotCQl0aGlzLm92ZXJhbGxTdGF0dXMgPSBvdmVyYWxsU3RhdHVzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNiZWxvbmdzVG8oamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBiZWxvbmdzVG8oT2JqZWN0IGZhbWlseSkgewotCQlyZXR1cm4gZmFtaWx5ID09IEZBTUlMWTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIGpvYk1vbml0b3IpIHsKLQkJam9iTW9uaXRvci5iZWdpblRhc2soIkRvd25sb2FkaW5nIHNvZnR3YXJlIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsKLQkJZG8gewotCQkJLy8gZ2V0IHRoZSByZXF1ZXN0IHdlIGFyZSBnb2luZyB0byBwcm9jZXNzCi0JCQlJQXJ0aWZhY3RSZXF1ZXN0IHJlcXVlc3Q7Ci0JCQlzeW5jaHJvbml6ZWQgKHJlcXVlc3RzUGVuZGluZykgewotCQkJCWlmIChyZXF1ZXN0c1BlbmRpbmcuaXNFbXB0eSgpKQotCQkJCQlicmVhazsKLQkJCQlyZXF1ZXN0ID0gKElBcnRpZmFjdFJlcXVlc3QpIHJlcXVlc3RzUGVuZGluZy5yZW1vdmVGaXJzdCgpOwotCQkJfQotCQkJaWYgKG1hc3Rlck1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCS8vIHByb2Nlc3MgdGhlIGFjdHVhbCByZXF1ZXN0Ci0JCQlTdWJQcm9ncmVzc01vbml0b3Igc3ViTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobWFzdGVyTW9uaXRvciwgMSk7Ci0JCQlzdWJNb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJSVN0YXR1cyBzdGF0dXMgPSByZXBvc2l0b3J5LmdldEFydGlmYWN0KChBcnRpZmFjdFJlcXVlc3QpIHJlcXVlc3QsIHN1Yk1vbml0b3IpOwotCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotCQkJCQlzeW5jaHJvbml6ZWQgKG92ZXJhbGxTdGF0dXMpIHsKLQkJCQkJCW92ZXJhbGxTdGF0dXMuYWRkKHN0YXR1cyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN1Yk1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9IHdoaWxlICh0cnVlKTsKLQotCQlqb2JNb25pdG9yLmRvbmUoKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvTWFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3NpbXBsZS9NYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlNjkwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3NpbXBsZS9NYXBwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKgkJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIHZhcmlvdXMgb25nb2luZyBtYWludGVuYW5jZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5zaW1wbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi1wdWJsaWMgY2xhc3MgTWFwcGVyIHsKLQlwcml2YXRlIEZpbHRlcltdIGZpbHRlcnM7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBvdXRwdXRTdHJpbmdzOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9VUkwgPSAicmVwb1VybCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NJRklFUiA9ICJjbGFzc2lmaWVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVQgPSAiZm9ybWF0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIE1hcHBlcigpIHsKLQkJZmlsdGVycyA9IG5ldyBGaWx0ZXJbMF07Ci0JCW91dHB1dFN0cmluZ3MgPSBuZXcgU3RyaW5nWzBdOwotCX0KLQotCS8qKgotCSAqIG1hcHBpbmcgcnVsZTogTERBUCBmaWx0ZXIgLS0+IG91dHB1dCB2YWx1ZQotCSAqIHRoZSBtb3JlIHNwZWNpZmljIGZpbHRlcnMgc2hvdWxkIGJlIGdpdmVuIGZpcnN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoQnVuZGxlQ29udGV4dCBjdHgsIFN0cmluZ1tdW10gbWFwcGluZ1J1bGVzKSB7Ci0JCWZpbHRlcnMgPSBuZXcgRmlsdGVyW21hcHBpbmdSdWxlcy5sZW5ndGhdOwotCQlvdXRwdXRTdHJpbmdzID0gbmV3IFN0cmluZ1ttYXBwaW5nUnVsZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5nUnVsZXMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJZmlsdGVyc1tpXSA9IGN0eC5jcmVhdGVGaWx0ZXIobWFwcGluZ1J1bGVzW2ldWzBdKTsKLQkJCQlvdXRwdXRTdHJpbmdzW2ldID0gbWFwcGluZ1J1bGVzW2ldWzFdOwotCQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9UT0RPIE5lZWVkIHRvIHByb2Nlc3MgdGhpcwotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIG1hcChTdHJpbmcgcmVwb1VybCwgU3RyaW5nIGNsYXNzaWZpZXIsIFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBmb3JtYXQpIHsKLQkJRGljdGlvbmFyeSB2YWx1ZXMgPSBuZXcgSGFzaHRhYmxlKDUpOwotCQlpZiAocmVwb1VybCAhPSBudWxsKQotCQkJdmFsdWVzLnB1dChSRVBPVVJMLCByZXBvVXJsKTsKLQotCQlpZiAoY2xhc3NpZmllciAhPSBudWxsKQotCQkJdmFsdWVzLnB1dChDTEFTU0lGSUVSLCBjbGFzc2lmaWVyKTsKLQotCQlpZiAoaWQgIT0gbnVsbCkKLQkJCXZhbHVlcy5wdXQoSUQsIGlkKTsKLQotCQlpZiAodmVyc2lvbiAhPSBudWxsKQotCQkJdmFsdWVzLnB1dChWRVJTSU9OLCB2ZXJzaW9uKTsKLQotCQlpZiAoZm9ybWF0ICE9IG51bGwpCi0JCQl2YWx1ZXMucHV0KEZPUk1BVCwgZm9ybWF0KTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmaWx0ZXJzW2ldLm1hdGNoKHZhbHVlcykpCi0JCQkJcmV0dXJuIGRvUmVwbGFjZW1lbnQob3V0cHV0U3RyaW5nc1tpXSwgcmVwb1VybCwgY2xhc3NpZmllciwgaWQsIHZlcnNpb24sIGZvcm1hdCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZG9SZXBsYWNlbWVudChTdHJpbmcgcGF0dGVybiwgU3RyaW5nIHJlcG9VcmwsIFN0cmluZyBjbGFzc2lmaWVyLCBTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgZm9ybWF0KSB7Ci0JCS8vIGN1cnJlbnRseSBvdXIgbWFwcGluZyBydWxlcyBhc3N1bWUgdGhlIHJlcG8gVVJMIGlzIG5vdCAiLyIgdGVybWluYXRlZC4gCi0JCS8vIFRoaXMgbWF5IGJlIHRoZSBjYXNlIGZvciByZXBvVVJMcyBpbiB0aGUgcm9vdCBvZiBhIFVSTCBzcGFjZSBlLmcuIHJvb3Qgb2YgYSBqYXIgZmlsZSBvciBmaWxlOi9jOi8KLQkJaWYgKHJlcG9VcmwuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJcmVwb1VybCA9IHJlcG9Vcmwuc3Vic3RyaW5nKDAsIHJlcG9VcmwubGVuZ3RoKCkgLSAxKTsKLQotCQlTdHJpbmdCdWZmZXIgb3V0cHV0ID0gbmV3IFN0cmluZ0J1ZmZlcihwYXR0ZXJuKTsKLQkJaW50IGluZGV4ID0gMDsKLQkJd2hpbGUgKGluZGV4IDwgb3V0cHV0Lmxlbmd0aCgpKSB7Ci0JCQlpbnQgYmVnaW5uaW5nID0gb3V0cHV0LmluZGV4T2YoIiR7IiwgaW5kZXgpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYmVnaW5uaW5nID09IC0xKQotCQkJCXJldHVybiBvdXRwdXQudG9TdHJpbmcoKTsKLQotCQkJaW50IGVuZCA9IG91dHB1dC5pbmRleE9mKCJ9IiwgYmVnaW5uaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGVuZCA9PSAtMSkKLQkJCQlyZXR1cm4gcGF0dGVybjsKLQotCQkJU3RyaW5nIHZhck5hbWUgPSBvdXRwdXQuc3Vic3RyaW5nKGJlZ2lubmluZyArIDIsIGVuZCk7Ci0JCQlTdHJpbmcgdmFyVmFsdWUgPSBudWxsOwotCQkJaWYgKHZhck5hbWUuZXF1YWxzSWdub3JlQ2FzZShDTEFTU0lGSUVSKSkgewotCQkJCXZhclZhbHVlID0gY2xhc3NpZmllcjsKLQkJCX0gZWxzZSBpZiAodmFyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKElEKSkgewotCQkJCXZhclZhbHVlID0gaWQ7Ci0JCQl9IGVsc2UgaWYgKHZhck5hbWUuZXF1YWxzSWdub3JlQ2FzZShWRVJTSU9OKSkgewotCQkJCXZhclZhbHVlID0gdmVyc2lvbjsKLQkJCX0gZWxzZSBpZiAodmFyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKFJFUE9VUkwpKSB7Ci0JCQkJdmFyVmFsdWUgPSByZXBvVXJsOwotCQkJfSBlbHNlIGlmICh2YXJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoRk9STUFUKSkgewotCQkJCXZhclZhbHVlID0gZm9ybWF0OwotCQkJfQotCQkJaWYgKHZhclZhbHVlID09IG51bGwpCi0JCQkJdmFyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlvdXRwdXQucmVwbGFjZShiZWdpbm5pbmcsIGVuZCArIDEsIHZhclZhbHVlKTsKLQkJCWluZGV4ID0gYmVnaW5uaW5nICsgdmFyVmFsdWUubGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIG91dHB1dC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0LmFwcGVuZChmaWx0ZXJzW2ldKS5hcHBlbmQoJy0nKS5hcHBlbmQoJz4nKS5hcHBlbmQob3V0cHV0U3RyaW5nc1tpXSkuYXBwZW5kKCdcbicpOwotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW11bXSBzZXJpYWxpemUoKSB7Ci0JCVN0cmluZ1tdW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tmaWx0ZXJzLmxlbmd0aF1bMl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVycy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldWzBdID0gZmlsdGVyc1tpXS50b1N0cmluZygpOwotCQkJcmVzdWx0W2ldWzFdID0gb3V0cHV0U3RyaW5nc1tpXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvc2ltcGxlL1NpbXBsZUFydGlmYWN0UmVwb3NpdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMzAxMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAkJCQkJCUdlbnVpdGVjLCBMTEMgLSBzdXBwb3J0IGZvciBtdWx0aS10aHJlYWRlZCBkb3dubG9hZHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5zaW1wbGU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFic3RyYWN0QXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkgZXh0ZW5kcyBBYnN0cmFjdEFydGlmYWN0UmVwb3NpdG9yeSBpbXBsZW1lbnRzIElBcnRpZmFjdFJlcG9zaXRvcnksIElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IHsKLQkvKiogCi0JICogQSBib29sZWFuIHByb3BlcnR5IGNvbnRyb2xsaW5nIHdoZXRoZXIgbWlycm9yaW5nIGlzIGVuYWJsZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIE1JUlJPUlNfRU5BQkxFRCA9ICEiZmFsc2UiLmVxdWFscyhBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5KCJlY2xpcHNlLnAyLm1pcnJvcnMiKSk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0KLQkvKiogCi0JICogVGhlIGtleSBmb3IgYSBpbnRlZ2VyIHByb3BlcnR5IGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlcgotCSAqIG9mIHRocmVhZHMgdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIG9wdGltaXppbmcgZG93bmxvYWRzIGZyb20gYSByZW1vdGUKLQkgKiBhcnRpZmFjdCByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTUFYX1RIUkVBRFMgPSAiZWNsaXBzZS5wMi5tYXgudGhyZWFkcyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFsbG93cyBvdmVycmlkZSBvZiB3aGV0aGVyIHRocmVhZGluZyBzaG91bGQgYmUgdXNlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0ZPUkNFX1RIUkVBRElORyA9ICJlY2xpcHNlLnAyLmZvcmNlLnRocmVhZGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBjbGFzcyBBcnRpZmFjdE91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSBpbXBsZW1lbnRzIElTdGF0ZWZ1bCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBjbG9zZWQ7Ci0JCXByaXZhdGUgbG9uZyBjb3VudCA9IDA7Ci0JCXByaXZhdGUgSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQlwcml2YXRlIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbjsKLQkJcHJpdmF0ZSBGaWxlIGZpbGU7Ci0JCXByaXZhdGUgSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCXB1YmxpYyBBcnRpZmFjdE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3MsIElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkJdGhpcyhvcywgZGVzY3JpcHRvciwgbnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgQXJ0aWZhY3RPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG9zLCBJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIEZpbGUgZmlsZSkgewotCQkJdGhpcy5kZXN0aW5hdGlvbiA9IG9zOwotCQkJdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLQkJCXRoaXMuZmlsZSA9IGZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlpZiAoY2xvc2VkKQotCQkJCXJldHVybjsKLQkJCWNsb3NlZCA9IHRydWU7Ci0KLQkJCXRyeSB7Ci0JCQkJZGVzdGluYXRpb24uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjbGVhbnVwIGlmIHBvc3NpYmxlCi0JCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQkJZGVsZXRlKGZpbGUpOwotCQkJCWlmIChnZXRTdGF0dXMoKS5pc09LKCkpCi0JCQkJCXRocm93IGU7Ci0JCQkJLy8gaWYgdGhlIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGUuZy4gY2FuY2VsZWQsIHdlIGNhbiByZXR1cm4gLSB0aGUgc3RhdHVzIGlzIGFscmVhZHkgc2V0IGNvcnJlY3RseSAKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBpZiB0aGUgc3RlcHMgcmFuIG9rIGFuZCB0aGVyZSB3YXMgYWN0dWFsIGNvbnRlbnQsIHdyaXRlIHRoZSBhcnRpZmFjdCBkZXNjcmlwdG9yCi0JCQkvLyBUT0RPIHRoZSBjb3VudCBjaGVjayBpcyBhIGJpdCBib2d1cyBidXQgaGVscHMgaW4gc29tZSBlcnJvciBjYXNlcyAoZS5nLiwgdGhlIG9wdGltaXplcikKLQkJCS8vIHdoZXJlIGVycm9ycyBvY2N1cnJlZCBpbiBhIHByb2Nlc3Npbmcgc3RlcCBlYXJsaWVyIGluIHRoZSBjaGFpbi4gIFdlIGxpa2VseSBuZWVkIGEgYmV0dGVyCi0JCQkvLyBvciBtb3JlIGV4cGxpY2l0IHdheSBvZiBoYW5kbGluZyB0aGlzIGNhc2UuCi0JCQlpZiAoZ2V0U3RhdHVzKCkuaXNPSygpICYmIFByb2Nlc3NpbmdTdGVwSGFuZGxlci5jaGVja1N0YXR1cyhkZXN0aW5hdGlvbikuaXNPSygpICYmIGNvdW50ID4gMCkgewotCQkJCSgoQXJ0aWZhY3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5zZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkRPV05MT0FEX1NJWkUsIExvbmcudG9TdHJpbmcoY291bnQpKTsKLQkJCQlhZGREZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCQkJfSBlbHNlIGlmIChmaWxlICE9IG51bGwpCi0JCQkJLy8gY2xlYW51cCBpZiBwb3NzaWJsZQotCQkJCWRlbGV0ZShmaWxlKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJCXRoaXMuc3RhdHVzID0gc3RhdHVzID09IG51bGwgPyBTdGF0dXMuT0tfU1RBVFVTIDogc3RhdHVzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlkZXN0aW5hdGlvbi53cml0ZShiKTsKLQkJCWNvdW50ICs9IGIubGVuZ3RoOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlkZXN0aW5hdGlvbi53cml0ZShiLCBvZmYsIGxlbik7Ci0JCQljb3VudCArPSBsZW47Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCWRlc3RpbmF0aW9uLndyaXRlKGIpOwotCQkJY291bnQrKzsKLQkJfQotCX0KLQotCS8vIFRPRE86IG9wdGltaXplCi0JLy8gd2UgY291bGQgc3RyZWFtIHJpZ2h0IGludG8gdGhlIGZvbGRlcgotCXB1YmxpYyBzdGF0aWMgY2xhc3MgWmlwcGVkRm9sZGVyT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKLQotCQlwcml2YXRlIGZpbmFsIEZpbGUgZm9sZGVyOwotCQlwcml2YXRlIGZpbmFsIEZpbGVPdXRwdXRTdHJlYW0gZm9zOwotCQlwcml2YXRlIGZpbmFsIEZpbGUgemlwRmlsZTsKLQotCQlwdWJsaWMgWmlwcGVkRm9sZGVyT3V0cHV0U3RyZWFtKEZpbGUgZm9sZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJdGhpcy5mb2xkZXIgPSBmb2xkZXI7Ci0JCQl6aXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShmb2xkZXIuZ2V0TmFtZSgpLCBKQVJfRVhURU5TSU9OLCBudWxsKTsKLQkJCWZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHppcEZpbGUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJZm9zLmNsb3NlKCk7Ci0JCQlGaWxlVXRpbHMudW56aXBGaWxlKHppcEZpbGUsIGZvbGRlcik7Ci0JCQl6aXBGaWxlLmRlbGV0ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJZm9zLmZsdXNoKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIGZvcy50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlmb3Mud3JpdGUoYik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCWZvcy53cml0ZShiLCBvZmYsIGxlbik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCWZvcy53cml0ZShiKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9GT0xERVIgPSAiYXJ0aWZhY3QuZm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9SRUZFUkVOQ0UgPSAiYXJ0aWZhY3QucmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9VVUlEID0gImFydGlmYWN0LnV1aWQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIEJMT0JTVE9SRSA9ICIuYmxvYnN0b3JlLyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgQ09OVEVOVF9GSUxFTkFNRSA9ICJhcnRpZmFjdHMiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nW11bXSBQQUNLRURfTUFQUElOR19SVUxFUyA9IHsgeyIoJiAoY2xhc3NpZmllcj1vc2dpLmJ1bmRsZSkgKGZvcm1hdD1wYWNrZWQpKSIsICIke3JlcG9Vcmx9L3BsdWdpbnMvJHtpZH1fJHt2ZXJzaW9ufS5qYXIucGFjay5neiJ9LCAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJeyIoJiAoY2xhc3NpZmllcj1vc2dpLmJ1bmRsZSkpIiwgIiR7cmVwb1VybH0vcGx1Z2lucy8ke2lkfV8ke3ZlcnNpb259LmphciJ9LCAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJeyIoJiAoY2xhc3NpZmllcj1iaW5hcnkpKSIsICIke3JlcG9Vcmx9L2JpbmFyeS8ke2lkfV8ke3ZlcnNpb259In0sIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJeyIoJiAoY2xhc3NpZmllcj1vcmcuZWNsaXBzZS51cGRhdGUuZmVhdHVyZSkpIiwgIiR7cmVwb1VybH0vZmVhdHVyZXMvJHtpZH1fJHt2ZXJzaW9ufS5qYXIifX07IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0KLQlzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmdbXVtdIERFRkFVTFRfTUFQUElOR19SVUxFUyA9IHsgeyIoJiAoY2xhc3NpZmllcj1vc2dpLmJ1bmRsZSkpIiwgIiR7cmVwb1VybH0vcGx1Z2lucy8ke2lkfV8ke3ZlcnNpb259LmphciJ9LCAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJeyIoJiAoY2xhc3NpZmllcj1iaW5hcnkpKSIsICIke3JlcG9Vcmx9L2JpbmFyeS8ke2lkfV8ke3ZlcnNpb259In0sIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJeyIoJiAoY2xhc3NpZmllcj1vcmcuZWNsaXBzZS51cGRhdGUuZmVhdHVyZSkpIiwgIiR7cmVwb1VybH0vZmVhdHVyZXMvJHtpZH1fJHt2ZXJzaW9ufS5qYXIifX07IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUl9FWFRFTlNJT04gPSAiLmphciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgUkVQT1NJVE9SWV9UWVBFID0gSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuVFlQRV9TSU1QTEVfUkVQT1NJVE9SWTsKLQotCXN0YXRpYyBmaW5hbCBwcml2YXRlIEludGVnZXIgUkVQT1NJVE9SWV9WRVJTSU9OID0gbmV3IEludGVnZXIoMSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FWFRFTlNJT04gPSAiLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU2V0IGFydGlmYWN0RGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCXByaXZhdGUgdHJhbnNpZW50IEJsb2JTdG9yZSBibG9iU3RvcmU7Ci0JdHJhbnNpZW50IHByaXZhdGUgTWFwcGVyIG1hcHBlciA9IG5ldyBNYXBwZXIoKTsKLQotCXN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBQQUNLRURfRk9STUFUID0gInBhY2tlZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgUFVCTElTSF9QQUNLX0ZJTEVTX0FTX1NJQkxJTkdTID0gInB1Ymxpc2hQYWNrRmlsZXNBc1NpYmxpbmdzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfTUFYX1RIUkVBRFMgPSA0OwotCi0JcHJvdGVjdGVkIFN0cmluZ1tdW10gbWFwcGluZ1J1bGVzID0gREVGQVVMVF9NQVBQSU5HX1JVTEVTOwotCi0JcHJpdmF0ZSBNaXJyb3JTZWxlY3RvciBtaXJyb3JzOwotCi0Jc3RhdGljIHZvaWQgZGVsZXRlKEZpbGUgdG9EZWxldGUpIHsKLQkJaWYgKHRvRGVsZXRlLmlzRmlsZSgpKSB7Ci0JCQl0b0RlbGV0ZS5kZWxldGUoKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodG9EZWxldGUuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGNoaWxkcmVuID0gdG9EZWxldGUubGlzdEZpbGVzKCk7Ci0JCQlpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJZGVsZXRlKGNoaWxkcmVuW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0b0RlbGV0ZS5kZWxldGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEFjdHVhbExvY2F0aW9uKFVSTCBiYXNlLCBib29sZWFuIGNvbXByZXNzKSB7Ci0JCXJldHVybiBnZXRBY3R1YWxMb2NhdGlvbihiYXNlLCBjb21wcmVzcyA/IEpBUl9FWFRFTlNJT04gOiBYTUxfRVhURU5TSU9OKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBVUkwgZ2V0QWN0dWFsTG9jYXRpb24oVVJMIGJhc2UsIFN0cmluZyBleHRlbnNpb24pIHsKLQkJZmluYWwgU3RyaW5nIG5hbWUgPSBDT05URU5UX0ZJTEVOQU1FICsgZXh0ZW5zaW9uOwotCQlTdHJpbmcgc3BlYyA9IGJhc2UudG9FeHRlcm5hbEZvcm0oKTsKLQkJaWYgKHNwZWMuZW5kc1dpdGgobmFtZSkpCi0JCQlyZXR1cm4gYmFzZTsKLQkJaWYgKHNwZWMuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJc3BlYyArPSBuYW1lOwotCQllbHNlCi0JCQlzcGVjICs9ICIvIiArIG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKHNwZWMpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRCbG9iU3RvcmVMb2NhdGlvbihVUkwgYmFzZSkgewotCQlTdHJpbmcgc3BlYyA9IGJhc2UudG9FeHRlcm5hbEZvcm0oKTsKLQkJaWYgKHNwZWMuZW5kc1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJc3BlYyArPSBCTE9CU1RPUkU7Ci0JCWVsc2UKLQkJCXNwZWMgKz0gIi8iICsgQkxPQlNUT1JFOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChzcGVjKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGlzIGlzIG9ubHkgY2FsbGVkIGJ5IHRoZSBwYXJzZXIgd2hlbiBsb2FkaW5nIGEgcmVwb3NpdG9yeS4KLQkgKi8KLQlTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgcHJvdmlkZXIsIFNldCBhcnRpZmFjdHMsIFN0cmluZ1tdW10gbWFwcGluZ1J1bGVzLCBNYXAgcHJvcGVydGllcykgewotCQlzdXBlcihuYW1lLCB0eXBlLCB2ZXJzaW9uLCBudWxsLCBkZXNjcmlwdGlvbiwgcHJvdmlkZXIsIHByb3BlcnRpZXMpOwotCQl0aGlzLmFydGlmYWN0RGVzY3JpcHRvcnMuYWRkQWxsKGFydGlmYWN0cyk7Ci0JCXRoaXMubWFwcGluZ1J1bGVzID0gbWFwcGluZ1J1bGVzOwotCX0KLQotCXB1YmxpYyBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkoU3RyaW5nIHJlcG9zaXRvcnlOYW1lLCBVUkwgbG9jYXRpb24sIE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyKHJlcG9zaXRvcnlOYW1lLCBSRVBPU0lUT1JZX1RZUEUsIFJFUE9TSVRPUllfVkVSU0lPTi50b1N0cmluZygpLCBsb2NhdGlvbiwgbnVsbCwgbnVsbCwgcHJvcGVydGllcyk7Ci0JCWluaXRpYWxpemVBZnRlckxvYWQobG9jYXRpb24pOwotCQlpZiAocHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlpZiAocHJvcGVydGllcy5jb250YWluc0tleShQVUJMSVNIX1BBQ0tfRklMRVNfQVNfU0lCTElOR1MpKSB7Ci0JCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KFBVQkxJU0hfUEFDS19GSUxFU19BU19TSUJMSU5HUyk7Ci0JCQkJCWlmIChCb29sZWFuLlRSVUUudG9TdHJpbmcoKS5lcXVhbHMobmV3VmFsdWUpKSB7Ci0JCQkJCQltYXBwaW5nUnVsZXMgPSBQQUNLRURfTUFQUElOR19SVUxFUzsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCW1hcHBpbmdSdWxlcyA9IERFRkFVTFRfTUFQUElOR19SVUxFUzsKLQkJCQkJfQotCQkJCQlpbml0aWFsaXplTWFwcGVyKCk7Ci0JCQkJfQotCQkJfQotCQkJc2F2ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZERlc2NyaXB0b3IoSUFydGlmYWN0RGVzY3JpcHRvciB0b0FkZCkgewotCQkvLyBUT0RPIHBlcmhhcHMgdGhlIGFyZ3VtZW50IGhlcmUgc2hvdWxkIGJlIEFydGlmYWN0RGVzY3JpcHRvci4gIElBcnRpZmFjdERlc2NyaXB0b3JzIGFyZSBmb3IgCi0JCS8vIHBlb3BsZSB3aG8gYXJlIHJlYWRpbmcgdGhlIHJlcG9zaXRvcnkuCi0JCS8vIFRPRE86IGhlcmUgd2UgbWF5IHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGFydGlmYWN0IGhhcyBub3QgYmVlbiBhZGRlZCBjb25jdXJyZW50bHkKLQkJKChBcnRpZmFjdERlc2NyaXB0b3IpIHRvQWRkKS5zZXRSZXBvc2l0b3J5KHRoaXMpOwotCQlhcnRpZmFjdERlc2NyaXB0b3JzLmFkZCh0b0FkZCk7Ci0JCXNhdmUoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkRGVzY3JpcHRvcnMoSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzKSB7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJKChBcnRpZmFjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3JzW2ldKS5zZXRSZXBvc2l0b3J5KHRoaXMpOwotCQkJYXJ0aWZhY3REZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcnNbaV0pOwotCQl9Ci0JCXNhdmUoKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBPdXRwdXRTdHJlYW0gYWRkUG9zdFN0ZXBzKFByb2Nlc3NpbmdTdGVwSGFuZGxlciBoYW5kbGVyLCBJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUFycmF5TGlzdCBzdGVwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc3RlcHMuYWRkKG5ldyBTaWduYXR1cmVWZXJpZmllcigpKTsKLQkJLy8JCWlmIChtZDVWZXJpZmljYXRpb24pCi0JCS8vCQkJc3RlcHMuYWRkKG5ldyBNRDVWZXJpZmllcihkZXNjcmlwdG9yLmdldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuQVJUSUZBQ1RfTUQ1KSkpOwotCQlpZiAoc3RlcHMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGRlc3RpbmF0aW9uOwotCQlQcm9jZXNzaW5nU3RlcFtdIHN0ZXBBcnJheSA9IChQcm9jZXNzaW5nU3RlcFtdKSBzdGVwcy50b0FycmF5KG5ldyBQcm9jZXNzaW5nU3RlcFtzdGVwcy5zaXplKCldKTsKLQkJLy8gVE9ETyBzaG91bGQgcHJvYmFibHkgYmUgdXNpbmcgY3JlYXRlQW5kTGluayBoZXJlCi0JCXJldHVybiBoYW5kbGVyLmxpbmsoc3RlcEFycmF5LCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JfQotCi0JcHJpdmF0ZSBPdXRwdXRTdHJlYW0gYWRkUHJlU3RlcHMoUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyIGhhbmRsZXIsIElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJQXJyYXlMaXN0IHN0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBBZGQgc3RlcHMgaGVyZSBpZiBuZWVkZWQKLQkJaWYgKHN0ZXBzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBkZXN0aW5hdGlvbjsKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwQXJyYXkgPSAoUHJvY2Vzc2luZ1N0ZXBbXSkgc3RlcHMudG9BcnJheShuZXcgUHJvY2Vzc2luZ1N0ZXBbc3RlcHMuc2l6ZSgpXSk7Ci0JCS8vIFRPRE8gc2hvdWxkIHByb2JhYmx5IGJlIHVzaW5nIGNyZWF0ZUFuZExpbmsgaGVyZQotCQlyZXR1cm4gaGFuZGxlci5saW5rKHN0ZXBBcnJheSwgZGVzdGluYXRpb24sIG1vbml0b3IpOwotCX0KLQotCXByaXZhdGUgYnl0ZVtdIGJ5dGVzRnJvbUhleFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7Ci0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW1VuaXZlcnNhbFVuaXF1ZUlkZW50aWZpZXIuQllURVNfU0laRV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aCgpOyBpICs9IDIpIHsKLQkJCVN0cmluZyBieXRlU3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZyhpLCBpICsgMik7Ci0JCQlieXRlc1tpIC8gMl0gPSAoYnl0ZSkgSW50ZWdlci5wYXJzZUludChieXRlU3RyaW5nLCAxNik7Ci0JCX0KLQkJcmV0dXJuIGJ5dGVzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGJ5dGVzVG9IZXhTdHJpbmcoYnl0ZVtdIGJ5dGVzKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBoZXhTdHJpbmc7Ci0JCQlpZiAoYnl0ZXNbaV0gPCAwKQotCQkJCWhleFN0cmluZyA9IEludGVnZXIudG9IZXhTdHJpbmcoMjU2ICsgYnl0ZXNbaV0pOwotCQkJZWxzZQotCQkJCWhleFN0cmluZyA9IEludGVnZXIudG9IZXhTdHJpbmcoYnl0ZXNbaV0pOwotCQkJaWYgKGhleFN0cmluZy5sZW5ndGgoKSA9PSAxKQotCQkJCWJ1ZmZlci5hcHBlbmQoIjAiKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChoZXhTdHJpbmcpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gY29udGFpbnMoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJldHVybiBhcnRpZmFjdERlc2NyaXB0b3JzLmNvbnRhaW5zKGRlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBjb250YWlucyhJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhcnRpZmFjdERlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChJQXJ0aWZhY3REZXNjcmlwdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpLmVxdWFscyhrZXkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBjcmVhdGVMb2NhdGlvbihBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZiAoZmxhdEJ1dFBhY2tlZEVuYWJsZWQoZGVzY3JpcHRvcikpIHsKLQkJCXJldHVybiBnZXRMb2NhdGlvbkZvclBhY2tlZEJ1dEZsYXRBcnRpZmFjdHMoZGVzY3JpcHRvcik7Ci0JCX0KLQkJLy8gaWYgdGhlIGRlc2NyaXB0b3IgaXMgY2Fub25pY2FsLCBjbGVhciBvdXQgYW55IFVVSUQgdGhhdCBtaWdodCBiZSBzZXQgYW5kIHVzZSB0aGUgTWFwcGVyCi0JCWlmIChkZXNjcmlwdG9yLmdldFByb2Nlc3NpbmdTdGVwcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlkZXNjcmlwdG9yLnNldFByb3BlcnR5KEFSVElGQUNUX1VVSUQsIG51bGwpOwotCQkJSUFydGlmYWN0S2V5IGtleSA9IGRlc2NyaXB0b3IuZ2V0QXJ0aWZhY3RLZXkoKTsKLQkJCVN0cmluZyByZXN1bHQgPSBtYXBwZXIubWFwKGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCksIGtleS5nZXRDbGFzc2lmaWVyKCksIGtleS5nZXRJZCgpLCBrZXkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCksIGRlc2NyaXB0b3IuZ2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5GT1JNQVQpKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCWlmIChpc0ZvbGRlckJhc2VkKGRlc2NyaXB0b3IpICYmIHJlc3VsdC5lbmRzV2l0aChKQVJfRVhURU5TSU9OKSkKLQkJCQkJcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMCwgcmVzdWx0Lmxhc3RJbmRleE9mKEpBUl9FWFRFTlNJT04pKTsKLQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQotCQkvLyBPdGhlcndpc2UgZ2VuZXJhdGUgYSBsb2NhdGlvbiBieSBjcmVhdGluZyBhIFVVSUQsIHJlbWVtYmVyaW5nIGl0IGluIHRoZSBwcm9wZXJ0aWVzIAotCQkvLyBhbmQgY29tcHV0aW5nIHRoZSBsb2NhdGlvbgotCQlieXRlW10gYnl0ZXMgPSBuZXcgVW5pdmVyc2FsVW5pcXVlSWRlbnRpZmllcigpLnRvQnl0ZXMoKTsKLQkJZGVzY3JpcHRvci5zZXRQcm9wZXJ0eShBUlRJRkFDVF9VVUlELCBieXRlc1RvSGV4U3RyaW5nKGJ5dGVzKSk7Ci0JCXJldHVybiBibG9iU3RvcmUuZmlsZUZvcihieXRlcyk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZGVzY3JpcHRvciwgYW5kIHRoZSBwaHlzaWNhbCBhcnRpZmFjdCBjb3JyZXNwb25kaW5nCi0JICogdG8gdGhhdCBkZXNjcmlwdG9yLiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoZQotCSAqIGRlc2NyaXB0b3IgZXhpc3RlZCBpbiB0aGUgcmVwb3NpdG9yeSwgYW5kIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZG9SZW1vdmVBcnRpZmFjdChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKCgoQXJ0aWZhY3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRSZXBvc2l0b3J5UHJvcGVydHkoQVJUSUZBQ1RfUkVGRVJFTkNFKSA9PSBudWxsKSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRBcnRpZmFjdEZpbGUoZGVzY3JpcHRvcik7Ci0JCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWRlbGV0ZShmaWxlKTsKLQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gYXJ0aWZhY3REZXNjcmlwdG9ycy5yZW1vdmUoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgZG93bmxvYWRBcnRpZmFjdChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChpc0ZvbGRlckJhc2VkKGRlc2NyaXB0b3IpKSB7Ci0JCQlGaWxlIGFydGlmYWN0Rm9sZGVyID0gZ2V0QXJ0aWZhY3RGaWxlKGRlc2NyaXB0b3IpOwotCQkJLy8gVE9ETzogb3B0aW1pemUgYW5kIGVuc3VyZSBtYW5pZmVzdCBpcyB3cml0dGVuIGZpcnN0Ci0JCQlGaWxlIHppcEZpbGUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl6aXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShhcnRpZmFjdEZvbGRlci5nZXROYW1lKCksIEpBUl9FWFRFTlNJT04sIG51bGwpOwotCQkJCUZpbGVVdGlscy56aXAoYXJ0aWZhY3RGb2xkZXIubGlzdEZpbGVzKCksIHppcEZpbGUpOwotCQkJCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGUpOwotCQkJCUZpbGVVdGlscy5jb3B5U3RyZWFtKGZpcywgdHJ1ZSwgZGVzdGluYXRpb24sIGZhbHNlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKHppcEZpbGUgIT0gbnVsbCkKLQkJCQkJemlwRmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJLy9kb3dubG9hZCBmcm9tIHRoZSBiZXN0IGF2YWlsYWJsZSBtaXJyb3IKLQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IGdldExvY2F0aW9uKGRlc2NyaXB0b3IpOwotCQlTdHJpbmcgbWlycm9yTG9jYXRpb24gPSBnZXRNaXJyb3IoYmFzZUxvY2F0aW9uKTsKLQkJSVN0YXR1cyByZXN1bHQgPSBnZXRUcmFuc3BvcnQoKS5kb3dubG9hZChtaXJyb3JMb2NhdGlvbiwgZGVzdGluYXRpb24sIG1vbml0b3IpOwotCQlpZiAobWlycm9ycyAhPSBudWxsKQotCQkJbWlycm9ycy5yZXBvcnRSZXN1bHQobWlycm9yTG9jYXRpb24sIHJlc3VsdCk7Ci0JCWlmIChyZXN1bHQuaXNPSygpIHx8IGJhc2VMb2NhdGlvbi5lcXVhbHMobWlycm9yTG9jYXRpb24pKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJLy9tYXliZSB3ZSBoaXQgYSBiYWQgbWlycm9yIC0gdHJ5IHRoZSBiYXNlIGxvY2F0aW9uCi0JCXJldHVybiBnZXRUcmFuc3BvcnQoKS5kb3dubG9hZChiYXNlTG9jYXRpb24sIGRlc3RpbmF0aW9uLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVxdWl2YWxlbnQgbWlycm9yIGxvY2F0aW9uIGZvciB0aGUgZ2l2ZW4gYXJ0aWZhY3QgbG9jYXRpb24uCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIGFydGlmYWN0IGluIHRoaXMgcmVwb3NpdG9yeQotCSAqIEByZXR1cm4gdGhlIExvY2F0aW9uIG9mIHRoZSBhcnRpZmFjdCBpbiB0aGlzIHJlcG9zaXRvcnksIG9yIGFuIGVxdWl2YWxlbnQgbWlycm9yCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldE1pcnJvcihTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCWlmICghTUlSUk9SU19FTkFCTEVEIHx8ICghaXNGb3JjZVRocmVhZGluZygpICYmIGlzTG9jYWwoKSkpCi0JCQlyZXR1cm4gYmFzZUxvY2F0aW9uOwotCQlpZiAobWlycm9ycyA9PSBudWxsKQotCQkJbWlycm9ycyA9IG5ldyBNaXJyb3JTZWxlY3Rvcih0aGlzKTsKLQkJcmV0dXJuIG1pcnJvcnMuZ2V0TWlycm9yTG9jYXRpb24oYmFzZUxvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkvLyBpZiB3ZSBhcmUgYWRhcHRpbmcgdG8gZmlsZSBvciB3cml0YWJsZSByZXBvc2l0b3JpZXMgdGhlbiBtYWtlIHN1cmUgd2UgaGF2ZSBhIGZpbGUgbG9jYXRpb24KLQkJaWYgKGFkYXB0ZXIgPT0gSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkuY2xhc3MpCi0JCQlpZiAoIWlzTG9jYWwoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCi0JSVN0YXR1cyBnZXRBcnRpZmFjdChBcnRpZmFjdFJlcXVlc3QgcmVxdWVzdCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJlcXVlc3Quc2V0U291cmNlUmVwb3NpdG9yeSh0aGlzKTsKLQkJcmVxdWVzdC5wZXJmb3JtKG1vbml0b3IpOwotCQlyZXR1cm4gcmVxdWVzdC5nZXRSZXN1bHQoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRBcnRpZmFjdChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVByb2Nlc3NpbmdTdGVwSGFuZGxlciBoYW5kbGVyID0gbmV3IFByb2Nlc3NpbmdTdGVwSGFuZGxlcigpOwotCQlkZXN0aW5hdGlvbiA9IHByb2Nlc3NEZXN0aW5hdGlvbihoYW5kbGVyLCBkZXNjcmlwdG9yLCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JCUlTdGF0dXMgc3RhdHVzID0gUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyLmNoZWNrU3RhdHVzKGRlc3RpbmF0aW9uKTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpICYmIHN0YXR1cy5nZXRTZXZlcml0eSgpICE9IElTdGF0dXMuSU5GTykKLQkJCXJldHVybiBzdGF0dXM7Ci0KLQkJc3RhdHVzID0gZG93bmxvYWRBcnRpZmFjdChkZXNjcmlwdG9yLCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JCXJldHVybiByZXBvcnRTdGF0dXMoZGVzY3JpcHRvciwgZGVzdGluYXRpb24sIHN0YXR1cyk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJQXJ0aWZhY3REZXNjcmlwdG9yW10gZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhcnRpZmFjdERlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IChJQXJ0aWZhY3REZXNjcmlwdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpLmVxdWFscyhrZXkpKQotCQkJCXJlc3VsdC5hZGQoZGVzY3JpcHRvcik7Ci0JCX0KLQkJcmV0dXJuIChJQXJ0aWZhY3REZXNjcmlwdG9yW10pIHJlc3VsdC50b0FycmF5KG5ldyBJQXJ0aWZhY3REZXNjcmlwdG9yW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRBcnRpZmFjdEZpbGUoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBnZXRMb2NhdGlvbihkZXNjcmlwdG9yKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8ICFyZXN1bHQuc3RhcnRzV2l0aCgiZmlsZToiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgRmlsZShyZXN1bHQuc3Vic3RyaW5nKDUpKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRBcnRpZmFjdEZpbGUoSUFydGlmYWN0S2V5IGtleSkgewotCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXRDb21wbGV0ZUFydGlmYWN0RGVzY3JpcHRvcihrZXkpOwotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRBcnRpZmFjdEZpbGUoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJQXJ0aWZhY3RLZXlbXSBnZXRBcnRpZmFjdEtleXMoKSB7Ci0JCS8vIHRoZXJlIG1heSBiZSBtb3JlIGRlc2NyaXB0b3JzIHRoYW4ga2V5cyB0byBjb2xsZWN0IHVwIHRoZSB1bmlxdWUga2V5cwotCQlIYXNoU2V0IHJlc3VsdCA9IG5ldyBIYXNoU2V0KGFydGlmYWN0RGVzY3JpcHRvcnMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGFydGlmYWN0RGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXJlc3VsdC5hZGQoKChJQXJ0aWZhY3REZXNjcmlwdG9yKSBpdC5uZXh0KCkpLmdldEFydGlmYWN0S2V5KCkpOwotCQlyZXR1cm4gKElBcnRpZmFjdEtleVtdKSByZXN1bHQudG9BcnJheShuZXcgSUFydGlmYWN0S2V5W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRBcnRpZmFjdHMoSUFydGlmYWN0UmVxdWVzdFtdIHJlcXVlc3RzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgTXVsdGlTdGF0dXMgb3ZlcmFsbFN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhBY3RpdmF0b3IuSUQsIElTdGF0dXMuT0ssIG51bGwsIG51bGwpOwotCQlMaW5rZWRMaXN0IHJlcXVlc3RzUGVuZGluZyA9IG5ldyBMaW5rZWRMaXN0KEFycmF5cy5hc0xpc3QocmVxdWVzdHMpKTsKLQotCQlpbnQgbnVtYmVyT2ZKb2JzID0gTWF0aC5taW4ocmVxdWVzdHMubGVuZ3RoLCBnZXRNYXhpbXVtVGhyZWFkcygpKTsKLQkJaWYgKG51bWJlck9mSm9icyA8PSAxIHx8ICghaXNGb3JjZVRocmVhZGluZygpICYmIGlzTG9jYWwoKSkpIHsKLQkJCVN1Yk1vbml0b3Igc3ViTW9uaXRvciA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCByZXF1ZXN0cy5sZW5ndGgpOwotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJSVN0YXR1cyByZXN1bHQgPSBnZXRBcnRpZmFjdCgoQXJ0aWZhY3RSZXF1ZXN0KSByZXF1ZXN0c1tpXSwgc3ViTW9uaXRvci5uZXdDaGlsZCgxKSk7Ci0JCQkJCWlmICghcmVzdWx0LmlzT0soKSkKLQkJCQkJCW92ZXJhbGxTdGF0dXMuYWRkKHJlc3VsdCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlzdWJNb25pdG9yLmRvbmUoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIGluaXRpYWxpemUgdGhlIHZhcmlvdXMgam9icyBuZWVkZWQgdG8gcHJvY2VzcyB0aGUgZ2V0IGFydGlmYWN0IHJlcXVlc3RzCi0JCQltb25pdG9yLmJlZ2luVGFzayhOTFMuYmluZChNZXNzYWdlcy5zYXJfZG93bmxvYWRpbmcsIEludGVnZXIudG9TdHJpbmcocmVxdWVzdHMubGVuZ3RoKSksIHJlcXVlc3RzLmxlbmd0aCk7Ci0JCQl0cnkgewotCQkJCURvd25sb2FkSm9iIGpvYnNbXSA9IG5ldyBEb3dubG9hZEpvYltudW1iZXJPZkpvYnNdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZKb2JzOyBpKyspIHsKLQkJCQkJam9ic1tpXSA9IG5ldyBEb3dubG9hZEpvYihNZXNzYWdlcy5zYXJfZG93bmxvYWRKb2JOYW1lICsgaSk7Ci0JCQkJCWpvYnNbaV0uaW5pdGlhbGl6ZSh0aGlzLCByZXF1ZXN0c1BlbmRpbmcsIG1vbml0b3IsIG92ZXJhbGxTdGF0dXMpOwotCQkJCQlqb2JzW2ldLnNjaGVkdWxlKCk7Ci0JCQkJfQotCQkJCS8vIHdhaXQgZm9yIGFsbCB0aGUgam9icyB0byBjb21wbGV0ZQotCQkJCXRyeSB7Ci0JCQkJCUpvYi5nZXRKb2JNYW5hZ2VyKCkuam9pbihEb3dubG9hZEpvYi5GQU1JTFksIG51bGwpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9pZ25vcmUKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAobW9uaXRvci5pc0NhbmNlbGVkKCkgPyBTdGF0dXMuQ0FOQ0VMX1NUQVRVUyA6IG92ZXJhbGxTdGF0dXMpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSUFydGlmYWN0RGVzY3JpcHRvciBnZXRDb21wbGV0ZUFydGlmYWN0RGVzY3JpcHRvcihJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhcnRpZmFjdERlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3IgZGVzYyA9IChJQXJ0aWZhY3REZXNjcmlwdG9yKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkvLyBsb29rIGZvciBhIGRlc2NyaXB0b3IgdGhhdCBtYXRjaGVzIHRoZSBrZXkgYW5kIGlzICJjb21wbGV0ZSIKLQkJCWlmIChkZXNjLmdldEFydGlmYWN0S2V5KCkuZXF1YWxzKGtleSkgJiYgZGVzYy5nZXRQcm9jZXNzaW5nU3RlcHMoKS5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gZGVzYzsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFNldCBnZXREZXNjcmlwdG9ycygpIHsKLQkJcmV0dXJuIGFydGlmYWN0RGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogVHlwaWNhbGx5IG5vbi1jYW5vbmljYWwgZm9ybXMgb2YgdGhlIGFydGlmYWN0IGFyZSBzdG9yZWQgaW4gdGhlIGJsb2Igc3RvcmUuCi0JICogSG93ZXZlciwgd2Ugc3VwcG9ydCBoYXZpbmcgdGhlIHBhY2syMDAgZmlsZXMgYWxvbmdzaWRlIHRoZSBjYW5vbmljYWwgYXJ0aWZhY3QKLQkgKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBmb3JtYXQgdXNlZCBpbiBvcHRpbWl6ZWQgdXBkYXRlIHNpdGVzLiAgV2UgY2FsbAotCSAqIHRoaXMgYXJyYW5nZW1lbnQgImZsYXQgYnV0IHBhY2tlZCIuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZsYXRCdXRQYWNrZWRFbmFibGVkKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkuZXF1YWxzKGdldFByb3BlcnRpZXMoKS5nZXQoUFVCTElTSF9QQUNLX0ZJTEVTX0FTX1NJQkxJTkdTKSkgJiYgUEFDS0VEX0ZPUk1BVC5lcXVhbHMoZGVzY3JpcHRvci5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkZPUk1BVCkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgI2ZsYXRCdXRQYWNrZWRFbmFibGVkKElBcnRpZmFjdERlc2NyaXB0b3IpCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25Gb3JQYWNrZWRCdXRGbGF0QXJ0aWZhY3RzKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlJQXJ0aWZhY3RLZXkga2V5ID0gZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpOwotCQlyZXR1cm4gbWFwcGVyLm1hcChsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLCBrZXkuZ2V0Q2xhc3NpZmllcigpLCBrZXkuZ2V0SWQoKSwga2V5LmdldFZlcnNpb24oKS50b1N0cmluZygpLCBkZXNjcmlwdG9yLmdldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuRk9STUFUKSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0TG9jYXRpb24oSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCS8vIGlmIHRoZSBhcnRpZmFjdCBoYXMgYSB1dWlkIHRoZW4gdXNlIGl0Ci0JCVN0cmluZyB1dWlkID0gZGVzY3JpcHRvci5nZXRQcm9wZXJ0eShBUlRJRkFDVF9VVUlEKTsKLQkJaWYgKHV1aWQgIT0gbnVsbCkKLQkJCXJldHVybiBibG9iU3RvcmUuZmlsZUZvcihieXRlc0Zyb21IZXhTdHJpbmcodXVpZCkpOwotCi0JCWlmIChmbGF0QnV0UGFja2VkRW5hYmxlZChkZXNjcmlwdG9yKSkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uRm9yUGFja2VkQnV0RmxhdEFydGlmYWN0cyhkZXNjcmlwdG9yKTsKLQkJfQotCi0JCS8vIGlmIHRoZSBhcnRpZmFjdCBpcyBqdXN0IGEgcmVmZXJlbmNlIHRoZW4gcmV0dXJuIHRoZSByZWZlcmVuY2UgbG9jYXRpb24KLQkJaWYgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBBcnRpZmFjdERlc2NyaXB0b3IpIHsKLQkJCVN0cmluZyBhcnRpZmFjdFJlZmVyZW5jZSA9ICgoQXJ0aWZhY3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5nZXRSZXBvc2l0b3J5UHJvcGVydHkoQVJUSUZBQ1RfUkVGRVJFTkNFKTsKLQkJCWlmIChhcnRpZmFjdFJlZmVyZW5jZSAhPSBudWxsKQotCQkJCXJldHVybiBhcnRpZmFjdFJlZmVyZW5jZTsKLQkJfQotCi0JCS8vIGlmIHRoZSBkZXNjcmlwdG9yIGlzIGNvbXBsZXRlIHRoZW4gdXNlIHRoZSBtYXBwaW5nIHJ1bGVzLi4uCi0JCWlmIChkZXNjcmlwdG9yLmdldFByb2Nlc3NpbmdTdGVwcygpLmxlbmd0aCA9PSAwKSB7Ci0JCQlJQXJ0aWZhY3RLZXkga2V5ID0gZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpOwotCQkJU3RyaW5nIHJlc3VsdCA9IG1hcHBlci5tYXAobG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSwga2V5LmdldENsYXNzaWZpZXIoKSwga2V5LmdldElkKCksIGtleS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSwgZGVzY3JpcHRvci5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkZPUk1BVCkpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJaWYgKGlzRm9sZGVyQmFzZWQoZGVzY3JpcHRvcikgJiYgcmVzdWx0LmVuZHNXaXRoKEpBUl9FWFRFTlNJT04pKQotCQkJCQlyZXR1cm4gcmVzdWx0LnN1YnN0cmluZygwLCByZXN1bHQubGFzdEluZGV4T2YoSkFSX0VYVEVOU0lPTikpOwotCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCi0JCS8vIGluIHRoZSBlbmQgdGhlcmUgaXMgbm90IGVub3VnaCBpbmZvcm1hdGlvbiBzbyByZXR1cm4gbnVsbCAKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBkb3dubG9hZCB0aHJlYWRzLgotCSAqLwotCXByaXZhdGUgaW50IGdldE1heGltdW1UaHJlYWRzKCkgewotCQl0cnkgewotCQkJU3RyaW5nIG1heFRocmVhZFN0cmluZyA9IChTdHJpbmcpIGdldFByb3BlcnRpZXMoKS5nZXQoUFJPUF9NQVhfVEhSRUFEUyk7Ci0JCQlpZiAobWF4VGhyZWFkU3RyaW5nICE9IG51bGwpCi0JCQkJcmV0dXJuIE1hdGgubWF4KDEsIEludGVnZXIucGFyc2VJbnQobWF4VGhyZWFkU3RyaW5nKSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmUpIHsKLQkJCS8vIHJldHVybiBkZWZhdWx0IG51bWJlciBvZiB0aHJlYWRzCi0JCX0KLQkJcmV0dXJuIERFRkFVTFRfTUFYX1RIUkVBRFM7Ci0JfQotCi0JcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJYXNzZXJ0TW9kaWZpYWJsZSgpOwotCQkvLyBDaGVjayBpZiB0aGUgYXJ0aWZhY3QgaXMgYWxyZWFkeSBpbiB0aGlzIHJlcG9zaXRvcnkKLQkJaWYgKGNvbnRhaW5zKGRlc2NyaXB0b3IpKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuYXZhaWxhYmxlX2FscmVhZHlfaW4sIGdldExvY2F0aW9uKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uQVJUSUZBQ1RfRVhJU1RTLCBtc2csIG51bGwpKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIG9yaWdpbmFsIGRlc2NyaXB0b3IgdGhhdCB3ZSBjYW4gbWFuaXB1bGF0ZQotCQlBcnRpZmFjdERlc2NyaXB0b3IgbmV3RGVzY3JpcHRvciA9IG5ldyBBcnRpZmFjdERlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCWlmIChpc0ZvbGRlckJhc2VkKGRlc2NyaXB0b3IpKQotCQkJbmV3RGVzY3JpcHRvci5zZXRSZXBvc2l0b3J5UHJvcGVydHkoQVJUSUZBQ1RfRk9MREVSLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0KLQkJLy8gRGV0ZXJtaW5lIHdyaXRpbmcgbG9jYXRpb24KLQkJU3RyaW5nIG5ld0xvY2F0aW9uID0gY3JlYXRlTG9jYXRpb24obmV3RGVzY3JpcHRvcik7Ci0JCVN0cmluZyBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZpbGUgPSBuZXcgVVJMKG5ld0xvY2F0aW9uKS5nZXRGaWxlKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgewotCQkJLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbgotCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSwgIlVuZXhwZWN0ZWQgZmFpbHVyZTogIiArIGUxKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gVE9ETyBhdCB0aGlzIHBvaW50IHdlIGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlIHJlcG9zaXRvcnkgaXMgZmlsZS1iYXNlZC4gIEV2ZW50dWFsbHkgCi0JCS8vIHdlIHNob3VsZCBlbmQgdXAgd2l0aCB3cml0ZWFibGUgVVJMcy4uLgotCQkvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBhbmQgdGhhdCB0aGUgcGFyZW50cyBkbwotCQlGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShmaWxlKTsKLQkJaWYgKG91dHB1dEZpbGUuZXhpc3RzKCkpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQXJ0aWZhY3QgcmVwb3NpdG9yeSBvdXQgb2Ygc3luYy4gT3ZlcndyaXRpbmcgIiArIG91dHB1dEZpbGUuZ2V0QWJzb2x1dGVGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQlkZWxldGUob3V0cHV0RmlsZSk7Ci0JCX0KLQotCQlPdXRwdXRTdHJlYW0gdGFyZ2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChpc0ZvbGRlckJhc2VkKG5ld0Rlc2NyaXB0b3IpKSB7Ci0JCQkJb3V0cHV0RmlsZS5ta2RpcnMoKTsKLQkJCQlpZiAoIW91dHB1dEZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCQkJdGhyb3cgZmFpbGVkV3JpdGUobmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLnNhcl9mYWlsZWRNa2Rpciwgb3V0cHV0RmlsZS50b1N0cmluZygpKSkpOwotCQkJCXRhcmdldCA9IG5ldyBaaXBwZWRGb2xkZXJPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGZpbGUgYmFzZWQKLQkJCQlGaWxlIHBhcmVudCA9IG91dHB1dEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJCQlpZiAoIXBhcmVudC5pc0RpcmVjdG9yeSgpKQotCQkJCQl0aHJvdyBmYWlsZWRXcml0ZShuZXcgSU9FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuc2FyX2ZhaWxlZE1rZGlyLCBwYXJlbnQudG9TdHJpbmcoKSkpKTsKLQkJCQl0YXJnZXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKTsKLQkJCX0KLQotCQkJLy8gZmluYWxseSBjcmVhdGUgYW5kIHJldHVybiBhbiBvdXRwdXQgc3RyZWFtIHN1aXRhYmx5IHdyYXBwZWQgc28gdGhhdCB3aGVuIGl0IGlzIAotCQkJLy8gY2xvc2VkIHRoZSByZXBvc2l0b3J5IGlzIHVwZGF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRvcgotCQkJcmV0dXJuIG5ldyBBcnRpZmFjdE91dHB1dFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0odGFyZ2V0KSwgbmV3RGVzY3JpcHRvciwgb3V0cHV0RmlsZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGZhaWxlZFdyaXRlKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBQcm92aXNpb25FeGNlcHRpb24gZmFpbGVkV3JpdGUoRXhjZXB0aW9uIGUpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb0ZhaWxlZFdyaXRlLCBnZXRMb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfV1JJVEUsIG1zZywgZSkpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nW11bXSBnZXRSdWxlcygpIHsKLQkJcmV0dXJuIG1hcHBpbmdSdWxlczsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoKSB7Ci0JCXJldHVybiBFQ0ZUcmFuc3BvcnQuZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvLyB1c2UgdGhpcyBtZXRob2QgdG8gc2V0dXAgYW55IHRyYW5zaWVudCBmaWVsZHMgZXRjIGFmdGVyIHRoZSBvYmplY3QgaGFzIGJlZW4gcmVzdG9yZWQgZnJvbSBhIHN0cmVhbQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbml0aWFsaXplQWZ0ZXJMb2FkKFVSTCBsb2NhdGlvbikgewotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JCWJsb2JTdG9yZSA9IG5ldyBCbG9iU3RvcmUoZ2V0QmxvYlN0b3JlTG9jYXRpb24obG9jYXRpb24pLCAxMjgpOwotCQlpbml0aWFsaXplTWFwcGVyKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGFydGlmYWN0RGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkoKEFydGlmYWN0RGVzY3JpcHRvcikgaS5uZXh0KCkpLnNldFJlcG9zaXRvcnkodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGluaXRpYWxpemVNYXBwZXIoKSB7Ci0JCW1hcHBlciA9IG5ldyBNYXBwZXIoKTsKLQkJbWFwcGVyLmluaXRpYWxpemUoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgbWFwcGluZ1J1bGVzKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNGb2xkZXJCYXNlZChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJLy8gaWYgdGhlIGFydGlmYWN0IGlzIGp1c3QgYSByZWZlcmVuY2UgdGhlbiByZXR1cm4gdGhlIHJlZmVyZW5jZSBsb2NhdGlvbgotCQlpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIEFydGlmYWN0RGVzY3JpcHRvcikgewotCQkJU3RyaW5nIHVzZUFydGlmYWN0Rm9sZGVyID0gKChBcnRpZmFjdERlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLmdldFJlcG9zaXRvcnlQcm9wZXJ0eShBUlRJRkFDVF9GT0xERVIpOwotCQkJaWYgKHVzZUFydGlmYWN0Rm9sZGVyICE9IG51bGwpCi0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih1c2VBcnRpZmFjdEZvbGRlcikuYm9vbGVhblZhbHVlKCk7Ci0JCX0KLQkJLy9UT0RPOiByZWZhY3RvciB0aGlzIHdoZW4gdGhlIGFydGlmYWN0IGZvbGRlciBwcm9wZXJ0eSBpcyBjb25zaXN0ZW50bHkgc2V0IGluIHJlcG9zaXRvcnkgcHJvcGVydGllcwotCQlyZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGRlc2NyaXB0b3IuZ2V0UHJvcGVydHkoQVJUSUZBQ1RfRk9MREVSKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRm9yY2VUaHJlYWRpbmcoKSB7Ci0JCXJldHVybiAidHJ1ZSIuZXF1YWxzKGdldFByb3BlcnRpZXMoKS5nZXQoUFJPUF9GT1JDRV9USFJFQURJTkcpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xvY2FsKCkgewotCQlyZXR1cm4gImZpbGUiLmVxdWFsc0lnbm9yZUNhc2UobG9jYXRpb24uZ2V0UHJvdG9jb2woKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoKSB7Ci0JCXJldHVybiBpc0xvY2FsKCk7Ci0JfQotCi0JcHVibGljIE91dHB1dFN0cmVhbSBwcm9jZXNzRGVzdGluYXRpb24oUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyIGhhbmRsZXIsIElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZGVzdGluYXRpb24gPSBhZGRQb3N0U3RlcHMoaGFuZGxlciwgZGVzY3JpcHRvciwgZGVzdGluYXRpb24sIG1vbml0b3IpOwotCQlkZXN0aW5hdGlvbiA9IGhhbmRsZXIuY3JlYXRlQW5kTGluayhkZXNjcmlwdG9yLmdldFByb2Nlc3NpbmdTdGVwcygpLCBkZXNjcmlwdG9yLCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JCWRlc3RpbmF0aW9uID0gYWRkUHJlU3RlcHMoaGFuZGxlciwgZGVzY3JpcHRvciwgZGVzdGluYXRpb24sIG1vbml0b3IpOwotCQlyZXR1cm4gZGVzdGluYXRpb247Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIHRvUmVtb3ZlID0gKElBcnRpZmFjdERlc2NyaXB0b3JbXSkgYXJ0aWZhY3REZXNjcmlwdG9ycy50b0FycmF5KG5ldyBJQXJ0aWZhY3REZXNjcmlwdG9yW2FydGlmYWN0RGVzY3JpcHRvcnMuc2l6ZSgpXSk7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvUmVtb3ZlLmxlbmd0aDsgaSsrKQotCQkJY2hhbmdlZCB8PSBkb1JlbW92ZUFydGlmYWN0KHRvUmVtb3ZlW2ldKTsKLQkJaWYgKGNoYW5nZWQpCi0JCQlzYXZlKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZURlc2NyaXB0b3IoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWlmIChkb1JlbW92ZUFydGlmYWN0KGRlc2NyaXB0b3IpKQotCQkJc2F2ZSgpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVEZXNjcmlwdG9yKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIHRvUmVtb3ZlID0gZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhrZXkpOwotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b1JlbW92ZS5sZW5ndGg7IGkrKykKLQkJCWNoYW5nZWQgfD0gZG9SZW1vdmVBcnRpZmFjdCh0b1JlbW92ZVtpXSk7Ci0JCWlmIChjaGFuZ2VkKQotCQkJc2F2ZSgpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHJlcG9ydFN0YXR1cyhJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJLy8gSWYgdGhlIGRlc3RpbmF0aW9uIGlzIGp1c3QgYSBub3JtYWwgc3RyZWFtIHRoZW4gdGhlIHN0YXR1cyBpcyBzaW1wbGUuICBKdXN0IHJldHVybgotCQkvLyBpdCBhbmQgZG8gbm90IGNsb3NlIHRoZSBkZXN0aW5hdGlvbgotCQlpZiAoIShkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFByb2Nlc3NpbmdTdGVwKSkKLQkJCXJldHVybiBzdGF0dXM7Ci0KLQkJLy8gSWYgdGhlIGRlc3RpbmF0aW9uIGlzIGEgcHJvY2Vzc2luZyBzdGVwIHRoZW4gY2xvc2UgdGhlIHN0cmVhbSB0byBmbHVzaCB0aGUgZGF0YSB0aHJvdWdoIGFsbAotCQkvLyB0aGUgc3RlcHMuICB0aGVuIGNvbGxlY3QgdXAgdGhlIHN0YXR1cyBmcm9tIGFsbCB0aGUgc3RlcHMgYW5kIHJldHVybgotCQl0cnkgewotCQkJZGVzdGluYXRpb24uY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5zYXJfcmVwb3J0U3RhdHVzLCBkZXNjcmlwdG9yLmdldEFydGlmYWN0S2V5KCkudG9FeHRlcm5hbEZvcm0oKSksIGUpOwotCQl9Ci0KLQkJSVN0YXR1cyBzdGVwU3RhdHVzID0gKChQcm9jZXNzaW5nU3RlcCkgZGVzdGluYXRpb24pLmdldFN0YXR1cyh0cnVlKTsKLQkJLy8gaWYgdGhlIHN0ZXBzIGFsbCByYW4gb2sgYW5kIHRoZXJlIGlzIG5vIGludGVyZXN0aW5nIGluZm9ybWF0aW9uLCByZXR1cm4gdGhlIHN0YXR1cyBmcm9tIHRoaXMgbWV0aG9kCi0JCWlmICghc3RlcFN0YXR1cy5pc011bHRpU3RhdHVzKCkgJiYgc3RlcFN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm4gc3RhdHVzOwotCQkvLyBlbHNlIGdhdGhlciB1cCB0aGUgc3RhdHVzIGZyb20gdGhlIHN0ZXBzCi0JCU11bHRpU3RhdHVzIHJlc3VsdCA9IG5ldyBNdWx0aVN0YXR1cyhBY3RpdmF0b3IuSUQsIElTdGF0dXMuT0ssIG5ldyBJU3RhdHVzWzBdLCBOTFMuYmluZChNZXNzYWdlcy5zYXJfcmVwb3J0U3RhdHVzLCBkZXNjcmlwdG9yLmdldEFydGlmYWN0S2V5KCkudG9FeHRlcm5hbEZvcm0oKSksIG51bGwpOwotCQlyZXN1bHQubWVyZ2Uoc3RhdHVzKTsKLQkJcmVzdWx0Lm1lcmdlKHN0ZXBTdGF0dXMpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoKSB7Ci0JCWJvb2xlYW4gY29tcHJlc3MgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChQUk9QX0NPTVBSRVNTRUQpKTsgLy8kTk9OLU5MUy0xJAotCQlzYXZlKGNvbXByZXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKGJvb2xlYW4gY29tcHJlc3MpIHsKLQkJYXNzZXJ0TW9kaWZpYWJsZSgpOwotCQlPdXRwdXRTdHJlYW0gb3MgPSBudWxsOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlVUkwgYWN0dWFsTG9jYXRpb24gPSBnZXRBY3R1YWxMb2NhdGlvbihsb2NhdGlvbiwgZmFsc2UpOwotCQkJCUZpbGUgYXJ0aWZhY3RzRmlsZSA9IG5ldyBGaWxlKGFjdHVhbExvY2F0aW9uLmdldFBhdGgoKSk7Ci0JCQkJRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoZ2V0QWN0dWFsTG9jYXRpb24obG9jYXRpb24sIHRydWUpLmdldFBhdGgoKSk7Ci0JCQkJaWYgKCFjb21wcmVzcykgewotCQkJCQlpZiAoamFyRmlsZS5leGlzdHMoKSkgewotCQkJCQkJamFyRmlsZS5kZWxldGUoKTsKLQkJCQkJfQotCQkJCQlpZiAoIWFydGlmYWN0c0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCS8vIGNyZWF0ZSBwYXJlbnQgZm9sZGVycwotCQkJCQkJYXJ0aWZhY3RzRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJCX0KLQkJCQkJb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShhcnRpZmFjdHNGaWxlKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAoYXJ0aWZhY3RzRmlsZS5leGlzdHMoKSkgewotCQkJCQkJYXJ0aWZhY3RzRmlsZS5kZWxldGUoKTsKLQkJCQkJfQotCQkJCQlpZiAoIWphckZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCWlmICghamFyRmlsZS5nZXRQYXJlbnRGaWxlKCkuZXhpc3RzKCkpCi0JCQkJCQkJamFyRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJCQlqYXJGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQkJfQotCQkJCQlKYXJPdXRwdXRTdHJlYW0gak9zID0gbmV3IEphck91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShqYXJGaWxlKSk7Ci0JCQkJCWpPcy5wdXROZXh0RW50cnkobmV3IEphckVudHJ5KG5ldyBQYXRoKGFjdHVhbExvY2F0aW9uLmdldEZpbGUoKSkubGFzdFNlZ21lbnQoKSkpOwotCQkJCQlvcyA9IGpPczsKLQkJCQl9Ci0JCQkJc3VwZXIuc2V0UHJvcGVydHkoSVJlcG9zaXRvcnkuUFJPUF9USU1FU1RBTVAsIExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKLQkJCQluZXcgU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5SU8oKS53cml0ZSh0aGlzLCBvcyk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBwcm9wZXIgZXhjZXB0aW9uIGhhbmRsaW5nCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKG9zICE9IG51bGwpCi0JCQkJCW9zLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHNldFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSBzdXBlci5zZXRQcm9wZXJ0eShrZXksIG5ld1ZhbHVlKTsKLQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlIHx8IChvbGRWYWx1ZSAhPSBudWxsICYmIG9sZFZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpKQotCQkJcmV0dXJuIG9sZFZhbHVlOwotCQlpZiAoUFVCTElTSF9QQUNLX0ZJTEVTX0FTX1NJQkxJTkdTLmVxdWFscyhrZXkpKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQlpZiAoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkuZXF1YWxzKG5ld1ZhbHVlKSkgewotCQkJCQltYXBwaW5nUnVsZXMgPSBQQUNLRURfTUFQUElOR19SVUxFUzsKLQkJCQl9IGVsc2UgewotCQkJCQltYXBwaW5nUnVsZXMgPSBERUZBVUxUX01BUFBJTkdfUlVMRVM7Ci0JCQkJfQotCQkJCWluaXRpYWxpemVNYXBwZXIoKTsKLQkJCX0KLQkJfQotCQlzYXZlKCk7Ci0JCS8vZm9yY2UgcmVwb3NpdG9yeSBtYW5hZ2VyIHRvIHJlbG9hZCB0aGlzIHJlcG9zaXRvcnkgYmVjYXVzZSBpdCBjYWNoZXMgcHJvcGVydGllcwotCQlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChtYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkoZ2V0TG9jYXRpb24oKSkpCi0JCQltYW5hZ2VyLmFkZFJlcG9zaXRvcnkodGhpcyk7Ci0JCXJldHVybiBvbGRWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UnVsZXMoU3RyaW5nW11bXSBydWxlcykgewotCQltYXBwaW5nUnVsZXMgPSBydWxlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gbG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvc2ltcGxlL1NpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUlPLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3NpbXBsZS9TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlJTy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjE3NzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvc2ltcGxlL1NpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUlPLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5zaW1wbGU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLk9yZGVyZWRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wZXJzaXN0ZW5jZS5YTUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wZXJzaXN0ZW5jZS5YTUxXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGFuZCB3cml0ZXMgYXJ0aWZhY3QgcmVwb3NpdG9yeSBtZXRhZGF0YQotICogKGUuZy4gdGFibGUgb2YgY29udGVudHMgZmlsZXMpOwotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCB1c2VkIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgdGhlIGFjdHVhbCBhcnRpZmFjdHMuCi0gKi8KLQotLy8gVE9ETzogU2hvdWxkIGEgcmVnaXN0cmF0aW9uL2ZhY3RvcnkgbWVjaGFuaXNtIGJlIHN1cHBvcnRlZAotLy8JCSBmb3IgZ2V0dGluZyBhIHJlcG9zaXRvcnkgcmVhZGVyL3dyaXRlciBnaXZlbiBhIHJlcG9zaXRvcnkgdHlwZQotcHVibGljIGNsYXNzIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUlPIHsKLQotCS8qKgotCSAqIFdyaXRlcyB0aGUgZ2l2ZW4gYXJ0aWZhY3QgcmVwb3NpdG9yeSB0byB0aGUgc3RyZWFtLgotCSAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGJ1ZmZlcmluZywgYW5kIGNsb3NlcyB0aGUgc3RyZWFtIHdoZW4gZmluaXNoZWQuCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnksIE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLQkJT3V0cHV0U3RyZWFtIGJ1ZmZlcmVkT3V0cHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJYnVmZmVyZWRPdXRwdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0cHV0KTsKLQkJCQlXcml0ZXIgcmVwb3NpdG9yeVdyaXRlciA9IG5ldyBXcml0ZXIoYnVmZmVyZWRPdXRwdXQpOwotCQkJCXJlcG9zaXRvcnlXcml0ZXIud3JpdGUocmVwb3NpdG9yeSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChidWZmZXJlZE91dHB1dCAhPSBudWxsKSB7Ci0JCQkJCWJ1ZmZlcmVkT3V0cHV0LmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCS8vIFRPRE8gc2hvdWxkbid0IHRoaXMgdGhyb3cgYSBjb3JlIGV4Y2VwdGlvbj8KLQkJCWlvZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBhcnRpZmFjdCByZXBvc2l0b3J5IGZyb20gdGhlIGdpdmVuIHN0cmVhbSwKLQkgKiBhbmQgcmV0dXJucyB0aGUgY29udGFpbmVkIGFycmF5IG9mIGFic3RyYWN0IGFydGlmYWN0IHJlcG9zaXRvcmllcy4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyBidWZmZXJpbmcsIGFuZCBjbG9zZXMgdGhlIHN0cmVhbSB3aGVuIGZpbmlzaGVkLgotCSAqLwotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlYWQoVVJMIGxvY2F0aW9uLCBJbnB1dFN0cmVhbSBpbnB1dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBidWZmZXJlZElucHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJYnVmZmVyZWRJbnB1dCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0KTsKLQkJCQlQYXJzZXIgcmVwb3NpdG9yeVBhcnNlciA9IG5ldyBQYXJzZXIoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgQWN0aXZhdG9yLklEKTsKLQkJCQlyZXBvc2l0b3J5UGFyc2VyLnBhcnNlKGlucHV0KTsKLQkJCQlJU3RhdHVzIHJlc3VsdCA9IHJlcG9zaXRvcnlQYXJzZXIuZ2V0U3RhdHVzKCk7Ci0JCQkJc3dpdGNoIChyZXN1bHQuZ2V0U2V2ZXJpdHkoKSkgewotCQkJCQljYXNlIElTdGF0dXMuQ0FOQ0VMIDoKLQkJCQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQkJCQljYXNlIElTdGF0dXMuRVJST1IgOgotCQkJCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihyZXN1bHQpOwotCQkJCQljYXNlIElTdGF0dXMuV0FSTklORyA6Ci0JCQkJCWNhc2UgSVN0YXR1cy5JTkZPIDoKLQkJCQkJCUxvZ0hlbHBlci5sb2cocmVzdWx0KTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJlcG9zaXRvcnlQYXJzZXIuZ2V0UmVwb3NpdG9yeSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoYnVmZmVyZWRJbnB1dCAhPSBudWxsKQotCQkJCQlidWZmZXJlZElucHV0LmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLmlvX2ZhaWxlZFJlYWQsIGxvY2F0aW9uKTsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0ZBSUxFRF9SRUFELCBtc2csIGlvZSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnRlcmZhY2UgWE1MQ29uc3RhbnRzIGV4dGVuZHMgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wZXJzaXN0ZW5jZS5YTUxDb25zdGFudHMgewotCi0JCS8vIENvbnN0YW50cyBkZWZpbmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBYTUwgZm9yIGEgU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5Ci0KLQkJLy8gQSBmb3JtYXQgdmVyc2lvbiBudW1iZXIgZm9yIHNpbXBsZSBhcnRpZmFjdCByZXBvc2l0b3J5IFhNTC4KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBWZXJzaW9uIENVUlJFTlRfVkVSU0lPTiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFZlcnNpb25SYW5nZSBYTUxfVE9MRVJBTkNFID0gbmV3IFZlcnNpb25SYW5nZShDVVJSRU5UX1ZFUlNJT04sIHRydWUsIG5ldyBWZXJzaW9uKDIsIDAsIDApLCBmYWxzZSk7Ci0KLQkJLy8gQ29uc3RhbnRzIGZvciBwcm9jZXNzaW5nIGluc3RydWN0aW9ucwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9SRVBPU0lUT1JZX1RBUkdFVCA9ICJhcnRpZmFjdFJlcG9zaXRvcnkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgWE1MV3JpdGVyLlByb2Nlc3NpbmdJbnN0cnVjdGlvbltdIFBJX0RFRkFVTFRTID0gbmV3IFhNTFdyaXRlci5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25bXSB7WE1MV3JpdGVyLlByb2Nlc3NpbmdJbnN0cnVjdGlvbi5tYWtlQ2xhc3NWZXJzaW9uSW5zdHJ1Y3Rpb24oUElfUkVQT1NJVE9SWV9UQVJHRVQsIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeS5jbGFzcywgQ1VSUkVOVF9WRVJTSU9OKX07Ci0KLQkJLy8gQ29uc3RhbnRzIGZvciBhcnRpZmFjdCByZXBvc2l0b3J5IGVsZW1lbnRzCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfRUxFTUVOVCA9ICJyZXBvc2l0b3J5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPU0lUT1JZX1BST1BFUlRJRVNfRUxFTUVOVCA9ICJyZXBvc2l0b3J5UHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19SVUxFU19FTEVNRU5UID0gIm1hcHBpbmdzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQSU5HX1JVTEVfRUxFTUVOVCA9ICJydWxlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVFNfRUxFTUVOVCA9ICJhcnRpZmFjdHMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX0VMRU1FTlQgPSAiYXJ0aWZhY3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NJTkdfU1RFUFNfRUxFTUVOVCA9ICJwcm9jZXNzaW5nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTSU5HX1NURVBfRUxFTUVOVCA9ICJzdGVwIjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUFBJTkdfUlVMRV9GSUxURVJfQVRUUklCVVRFID0gImZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUElOR19SVUxFX09VVFBVVF9BVFRSSUJVVEUgPSAib3V0cHV0IjsgLy8kTk9OLU5MUy0xJAotCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX0NMQVNTSUZJRVJfQVRUUklCVVRFID0gQ0xBU1NJRklFUl9BVFRSSUJVVEU7Ci0KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RFUF9EQVRBX0FUVFJJQlVURSA9ICJkYXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEVQX1JFUVVJUkVEX0FUVFJJQlVURSA9ICJyZXF1aXJlZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBYTUwgd3JpdGVyIGZvciBhIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeQotCXByb3RlY3RlZCBjbGFzcyBXcml0ZXIgZXh0ZW5kcyBYTUxXcml0ZXIgaW1wbGVtZW50cyBYTUxDb25zdGFudHMgewotCi0JCXB1YmxpYyBXcml0ZXIoT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXN1cGVyKG91dHB1dCwgUElfREVGQVVMVFMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFdyaXRlIHRoZSBnaXZlbiBhcnRpZmFjdCByZXBvc2l0b3J5IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotCQkgKi8KLQkJcHVibGljIHZvaWQgd3JpdGUoU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKLQkJCXN0YXJ0KFJFUE9TSVRPUllfRUxFTUVOVCk7Ci0JCQlhdHRyaWJ1dGUoTkFNRV9BVFRSSUJVVEUsIHJlcG9zaXRvcnkuZ2V0TmFtZSgpKTsKLQkJCWF0dHJpYnV0ZShUWVBFX0FUVFJJQlVURSwgcmVwb3NpdG9yeS5nZXRUeXBlKCkpOwotCQkJYXR0cmlidXRlKFZFUlNJT05fQVRUUklCVVRFLCByZXBvc2l0b3J5LmdldFZlcnNpb24oKSk7Ci0JCQlhdHRyaWJ1dGVPcHRpb25hbChQUk9WSURFUl9BVFRSSUJVVEUsIHJlcG9zaXRvcnkuZ2V0UHJvdmlkZXIoKSk7Ci0JCQlhdHRyaWJ1dGVPcHRpb25hbChERVNDUklQVElPTl9BVFRSSUJVVEUsIHJlcG9zaXRvcnkuZ2V0RGVzY3JpcHRpb24oKSk7IC8vIFRPRE86IGNvdWxkIGJlIGNkYXRhPwotCi0JCQl3cml0ZVByb3BlcnRpZXMocmVwb3NpdG9yeS5nZXRQcm9wZXJ0aWVzKCkpOwotCQkJd3JpdGVNYXBwaW5nUnVsZXMocmVwb3NpdG9yeS5nZXRSdWxlcygpKTsKLQkJCXdyaXRlQXJ0aWZhY3RzKHJlcG9zaXRvcnkuZ2V0RGVzY3JpcHRvcnMoKSk7Ci0KLQkJCWVuZChSRVBPU0lUT1JZX0VMRU1FTlQpOwotCQkJZmx1c2goKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB3cml0ZU1hcHBpbmdSdWxlcyhTdHJpbmdbXVtdIHJ1bGVzKSB7Ci0JCQlpZiAocnVsZXMubGVuZ3RoID4gMCkgewotCQkJCXN0YXJ0KE1BUFBJTkdfUlVMRVNfRUxFTUVOVCk7Ci0JCQkJYXR0cmlidXRlKENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUsIHJ1bGVzLmxlbmd0aCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBydWxlcy5sZW5ndGg7IGkrKykgewotCQkJCQlzdGFydChNQVBQSU5HX1JVTEVfRUxFTUVOVCk7Ci0JCQkJCWF0dHJpYnV0ZShNQVBQSU5HX1JVTEVfRklMVEVSX0FUVFJJQlVURSwgcnVsZXNbaV1bMF0pOwotCQkJCQlhdHRyaWJ1dGUoTUFQUElOR19SVUxFX09VVFBVVF9BVFRSSUJVVEUsIHJ1bGVzW2ldWzFdKTsKLQkJCQkJZW5kKE1BUFBJTkdfUlVMRV9FTEVNRU5UKTsKLQkJCQl9Ci0JCQkJZW5kKE1BUFBJTkdfUlVMRVNfRUxFTUVOVCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgd3JpdGVBcnRpZmFjdHMoU2V0IGFydGlmYWN0RGVzY3JpcHRvcnMpIHsKLQkJCXN0YXJ0KEFSVElGQUNUU19FTEVNRU5UKTsKLQkJCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCBhcnRpZmFjdERlc2NyaXB0b3JzLnNpemUoKSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhcnRpZmFjdERlc2NyaXB0b3JzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKEFydGlmYWN0RGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQkJSUFydGlmYWN0S2V5IGtleSA9IGRlc2NyaXB0b3IuZ2V0QXJ0aWZhY3RLZXkoKTsKLQkJCQlzdGFydChBUlRJRkFDVF9FTEVNRU5UKTsKLQkJCQlhdHRyaWJ1dGUoQVJUSUZBQ1RfQ0xBU1NJRklFUl9BVFRSSUJVVEUsIGtleS5nZXRDbGFzc2lmaWVyKCkpOwotCQkJCWF0dHJpYnV0ZShJRF9BVFRSSUJVVEUsIGtleS5nZXRJZCgpKTsKLQkJCQlhdHRyaWJ1dGUoVkVSU0lPTl9BVFRSSUJVVEUsIGtleS5nZXRWZXJzaW9uKCkpOwotCQkJCXdyaXRlUHJvY2Vzc2luZ1N0ZXBzKGRlc2NyaXB0b3IuZ2V0UHJvY2Vzc2luZ1N0ZXBzKCkpOwotCQkJCXdyaXRlUHJvcGVydGllcyhkZXNjcmlwdG9yLmdldFByb3BlcnRpZXMoKSk7Ci0JCQkJd3JpdGVQcm9wZXJ0aWVzKFJFUE9TSVRPUllfUFJPUEVSVElFU19FTEVNRU5ULCBkZXNjcmlwdG9yLmdldFJlcG9zaXRvcnlQcm9wZXJ0aWVzKCkpOwotCQkJCWVuZChBUlRJRkFDVF9FTEVNRU5UKTsKLQkJCX0KLQkJCWVuZChBUlRJRkFDVFNfRUxFTUVOVCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgd3JpdGVQcm9jZXNzaW5nU3RlcHMoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gcHJvY2Vzc2luZ1N0ZXBzKSB7Ci0JCQlpZiAocHJvY2Vzc2luZ1N0ZXBzLmxlbmd0aCA+IDApIHsKLQkJCQlzdGFydChQUk9DRVNTSU5HX1NURVBTX0VMRU1FTlQpOwotCQkJCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCBwcm9jZXNzaW5nU3RlcHMubGVuZ3RoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2Nlc3NpbmdTdGVwcy5sZW5ndGg7IGkrKykgewotCQkJCQlzdGFydChQUk9DRVNTSU5HX1NURVBfRUxFTUVOVCk7Ci0JCQkJCWF0dHJpYnV0ZShJRF9BVFRSSUJVVEUsIHByb2Nlc3NpbmdTdGVwc1tpXS5nZXRQcm9jZXNzb3JJZCgpKTsKLQkJCQkJYXR0cmlidXRlKFNURVBfREFUQV9BVFRSSUJVVEUsIHByb2Nlc3NpbmdTdGVwc1tpXS5nZXREYXRhKCkpOwotCQkJCQlhdHRyaWJ1dGUoU1RFUF9SRVFVSVJFRF9BVFRSSUJVVEUsIHByb2Nlc3NpbmdTdGVwc1tpXS5pc1JlcXVpcmVkKCkpOwotCQkJCQllbmQoUFJPQ0VTU0lOR19TVEVQX0VMRU1FTlQpOwotCQkJCX0KLQkJCQllbmQoUFJPQ0VTU0lOR19TVEVQU19FTEVNRU5UKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogUGFyc2VyIGZvciB0aGUgY29udGVudHMgb2YgYSBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnksCi0JICogYXMgd3JpdHRlbiBieSB0aGUgV3JpdGVyIGNsYXNzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgUGFyc2VyIGV4dGVuZHMgWE1MUGFyc2VyIGltcGxlbWVudHMgWE1MQ29uc3RhbnRzIHsKLQotCQlwcml2YXRlIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSB0aGVSZXBvc2l0b3J5ID0gbnVsbDsKLQotCQlwdWJsaWMgUGFyc2VyKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIGJ1bmRsZUlkKSB7Ci0JCQlzdXBlcihjb250ZXh0LCBidW5kbGVJZCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJzZShGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlwYXJzZShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl0aGlzLnN0YXR1cyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIFRPRE86IGN1cnJlbnRseSBub3QgY2FjaGluZyB0aGUgcGFyc2VyIHNpbmNlIHdlIG1ha2Ugbm8gYXNzdW1wdGlvbnMKLQkJCQkvLwkJIG9yIHJlc3RyaWN0aW9ucyBvbiBjb25jdXJyZW50IHBhcnNpbmcKLQkJCQlnZXRQYXJzZXIoKTsKLQkJCQlSZXBvc2l0b3J5SGFuZGxlciByZXBvc2l0b3J5SGFuZGxlciA9IG5ldyBSZXBvc2l0b3J5SGFuZGxlcigpOwotCQkJCXhtbFJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgUmVwb3NpdG9yeURvY0hhbmRsZXIoUkVQT1NJVE9SWV9FTEVNRU5ULCByZXBvc2l0b3J5SGFuZGxlcikpOwotCQkJCXhtbFJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKSk7Ci0JCQkJaWYgKGlzVmFsaWRYTUwoKSkgewotCQkJCQl0aGVSZXBvc2l0b3J5ID0gcmVwb3NpdG9yeUhhbmRsZXIuZ2V0UmVwb3NpdG9yeSgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgewotCQkJcmV0dXJuIHRoZVJlcG9zaXRvcnk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhlUmVwb3NpdG9yeTsKLQkJfQotCi0JCXByaXZhdGUgZmluYWwgY2xhc3MgUmVwb3NpdG9yeURvY0hhbmRsZXIgZXh0ZW5kcyBEb2NIYW5kbGVyIHsKLQotCQkJcHVibGljIFJlcG9zaXRvcnlEb2NIYW5kbGVyKFN0cmluZyByb290TmFtZSwgUm9vdEhhbmRsZXIgcm9vdEhhbmRsZXIpIHsKLQkJCQlzdXBlcihyb290TmFtZSwgcm9vdEhhbmRsZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCWlmIChQSV9SRVBPU0lUT1JZX1RBUkdFVC5lcXVhbHModGFyZ2V0KSkgewotCQkJCQkvLyBUT0RPOiBzaG91bGQgdGhlIHJvb3QgaGFuZGxlciBiZSBjb25zdHJ1Y3RlZCBiYXNlZCBvbiBjbGFzcwotCQkJCQkvLyAJCSB2aWEgYW4gZXh0ZW5zaW9uIHJlZ2lzdHJ5IG1lY2hhbmlzbT8KLQkJCQkJLy8gU3RyaW5nIGNsYXp6ID0gZXh0cmFjdFBJQ2xhc3MoZGF0YSk7Ci0JCQkJCS8vIFRPRE86IHZlcnNpb24gdG9sZXJhbmNlIGJ5IGV4dGVuc2lvbgotCQkJCQlWZXJzaW9uIHJlcG9zaXRvcnlWZXJzaW9uID0gZXh0cmFjdFBJVmVyc2lvbih0YXJnZXQsIGRhdGEpOwotCQkJCQlpZiAoIVhNTF9UT0xFUkFOQ0UuaXNJbmNsdWRlZChyZXBvc2l0b3J5VmVyc2lvbikpIHsKLQkJCQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuaW9faW5jb21wYXRpYmxlVmVyc2lvbiwgcmVwb3NpdG9yeVZlcnNpb24sIFhNTF9UT0xFUkFOQ0UpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZXBvc2l0b3J5SGFuZGxlciBleHRlbmRzIFJvb3RIYW5kbGVyIHsKLQotCQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSByZXF1aXJlZCA9IG5ldyBTdHJpbmdbXSB7TkFNRV9BVFRSSUJVVEUsIFRZUEVfQVRUUklCVVRFLCBWRVJTSU9OX0FUVFJJQlVURX07Ci0JCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG9wdGlvbmFsID0gbmV3IFN0cmluZ1tdIHtERVNDUklQVElPTl9BVFRSSUJVVEUsIFBST1ZJREVSX0FUVFJJQlVURX07Ci0KLQkJCXByaXZhdGUgU3RyaW5nW10gYXR0clZhbHVlcyA9IG5ldyBTdHJpbmdbcmVxdWlyZWQubGVuZ3RoICsgb3B0aW9uYWwubGVuZ3RoXTsKLQotCQkJcHJpdmF0ZSBNYXBwaW5nUnVsZXNIYW5kbGVyIG1hcHBpbmdSdWxlc0hhbmRsZXIgPSBudWxsOwotCQkJcHJpdmF0ZSBQcm9wZXJ0aWVzSGFuZGxlciBwcm9wZXJ0aWVzSGFuZGxlciA9IG51bGw7Ci0JCQlwcml2YXRlIEFydGlmYWN0c0hhbmRsZXIgYXJ0aWZhY3RzSGFuZGxlciA9IG51bGw7Ci0KLQkJCXByaXZhdGUgU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBudWxsOwotCi0JCQlwdWJsaWMgUmVwb3NpdG9yeUhhbmRsZXIoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQotCQkJcHVibGljIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgewotCQkJCXJldHVybiByZXBvc2l0b3J5OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSb290QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCQlhdHRyVmFsdWVzID0gcGFyc2VBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHJlcXVpcmVkLCBvcHRpb25hbCk7Ci0JCQkJYXR0clZhbHVlc1syXSA9IGNoZWNrVmVyc2lvbihSRVBPU0lUT1JZX0VMRU1FTlQsIFZFUlNJT05fQVRUUklCVVRFLCBhdHRyVmFsdWVzWzJdKS50b1N0cmluZygpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJCWlmIChNQVBQSU5HX1JVTEVTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCWlmIChtYXBwaW5nUnVsZXNIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJCW1hcHBpbmdSdWxlc0hhbmRsZXIgPSBuZXcgTWFwcGluZ1J1bGVzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKEFSVElGQUNUU19FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCQlpZiAoYXJ0aWZhY3RzSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQlhcnRpZmFjdHNIYW5kbGVyID0gbmV3IEFydGlmYWN0c0hhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChQUk9QRVJUSUVTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCWlmIChwcm9wZXJ0aWVzSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQlwcm9wZXJ0aWVzSGFuZGxlciA9IG5ldyBQcm9wZXJ0aWVzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkKCkgewotCQkJCWlmIChpc1ZhbGlkWE1MKCkpIHsKLQkJCQkJU3RyaW5nW11bXSBtYXBwaW5nUnVsZXMgPSAobWFwcGluZ1J1bGVzSGFuZGxlciA9PSBudWxsID8gbmV3IFN0cmluZ1swXVswXSAvLwotCQkJCQkJCTogbWFwcGluZ1J1bGVzSGFuZGxlci5nZXRNYXBwaW5nUnVsZXMoKSk7Ci0JCQkJCU1hcCBwcm9wZXJ0aWVzID0gKHByb3BlcnRpZXNIYW5kbGVyID09IG51bGwgPyBuZXcgT3JkZXJlZFByb3BlcnRpZXMoMCkgLy8KLQkJCQkJCQk6IHByb3BlcnRpZXNIYW5kbGVyLmdldFByb3BlcnRpZXMoKSk7Ci0JCQkJCVNldCBhcnRpZmFjdHMgPSAoYXJ0aWZhY3RzSGFuZGxlciA9PSBudWxsID8gbmV3IEhhc2hTZXQoMCkgLy8KLQkJCQkJCQk6IGFydGlmYWN0c0hhbmRsZXIuZ2V0QXJ0aWZhY3RzKCkpOwotCQkJCQlyZXBvc2l0b3J5ID0gbmV3IFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeShhdHRyVmFsdWVzWzBdLCBhdHRyVmFsdWVzWzFdLCBhdHRyVmFsdWVzWzJdLCBhdHRyVmFsdWVzWzNdLCAvLwotCQkJCQkJCWF0dHJWYWx1ZXNbNF0sIGFydGlmYWN0cywgbWFwcGluZ1J1bGVzLCBwcm9wZXJ0aWVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgY2xhc3MgTWFwcGluZ1J1bGVzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJCXByaXZhdGUgTGlzdCBtYXBwaW5nUnVsZXM7Ci0KLQkJCXB1YmxpYyBNYXBwaW5nUnVsZXNIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBNQVBQSU5HX1JVTEVTX0VMRU1FTlQpOwotCQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCQltYXBwaW5nUnVsZXMgPSAoc2l6ZSAhPSBudWxsID8gbmV3IEFycmF5TGlzdChuZXcgSW50ZWdlcihzaXplKS5pbnRWYWx1ZSgpKSA6IG5ldyBBcnJheUxpc3QoNCkpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nW11bXSBnZXRNYXBwaW5nUnVsZXMoKSB7Ci0JCQkJU3RyaW5nW11bXSBydWxlcyA9IG5ldyBTdHJpbmdbbWFwcGluZ1J1bGVzLnNpemUoKV1bMl07Ci0JCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IG1hcHBpbmdSdWxlcy5zaXplKCk7IGluZGV4KyspIHsKLQkJCQkJU3RyaW5nW10gcnVsZUF0dHJpYnV0ZXMgPSAoU3RyaW5nW10pIG1hcHBpbmdSdWxlcy5nZXQoaW5kZXgpOwotCQkJCQlydWxlc1tpbmRleF0gPSBydWxlQXR0cmlidXRlczsKLQkJCQl9Ci0JCQkJcmV0dXJuIHJ1bGVzOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJCWlmIChuYW1lLmVxdWFscyhNQVBQSU5HX1JVTEVfRUxFTUVOVCkpIHsKLQkJCQkJbmV3IE1hcHBpbmdSdWxlSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCBtYXBwaW5nUnVsZXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBjbGFzcyBNYXBwaW5nUnVsZUhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHJlcXVpcmVkID0gbmV3IFN0cmluZ1tdIHtNQVBQSU5HX1JVTEVfRklMVEVSX0FUVFJJQlVURSwgTUFQUElOR19SVUxFX09VVFBVVF9BVFRSSUJVVEV9OwotCi0JCQlwdWJsaWMgTWFwcGluZ1J1bGVIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIExpc3QgbWFwcGluZ1J1bGVzKSB7Ci0JCQkJc3VwZXIocGFyZW50SGFuZGxlciwgTUFQUElOR19SVUxFX0VMRU1FTlQpOwotCQkJCW1hcHBpbmdSdWxlcy5hZGQocGFyc2VSZXF1aXJlZEF0dHJpYnV0ZXMoYXR0cmlidXRlcywgcmVxdWlyZWQpKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBjbGFzcyBBcnRpZmFjdHNIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCQkJcHJpdmF0ZSBTZXQgYXJ0aWZhY3RzOwotCi0JCQlwdWJsaWMgQXJ0aWZhY3RzSGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQkJc3VwZXIocGFyZW50SGFuZGxlciwgQVJUSUZBQ1RTX0VMRU1FTlQpOwotCQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCQlhcnRpZmFjdHMgPSAoc2l6ZSAhPSBudWxsID8gbmV3IExpbmtlZEhhc2hTZXQobmV3IEludGVnZXIoc2l6ZSkuaW50VmFsdWUoKSkgOiBuZXcgTGlua2VkSGFzaFNldCg0KSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTZXQgZ2V0QXJ0aWZhY3RzKCkgewotCQkJCXJldHVybiBhcnRpZmFjdHM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKEFSVElGQUNUX0VMRU1FTlQpKSB7Ci0JCQkJCW5ldyBBcnRpZmFjdEhhbmRsZXIodGhpcywgYXR0cmlidXRlcywgYXJ0aWZhY3RzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgY2xhc3MgQXJ0aWZhY3RIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSByZXF1aXJlZCA9IG5ldyBTdHJpbmdbXSB7QVJUSUZBQ1RfQ0xBU1NJRklFUl9BVFRSSUJVVEUsIElEX0FUVFJJQlVURSwgVkVSU0lPTl9BVFRSSUJVVEV9OwotCi0JCQlwcml2YXRlIFNldCBhcnRpZmFjdHM7Ci0JCQlBcnRpZmFjdERlc2NyaXB0b3IgY3VycmVudEFydGlmYWN0ID0gbnVsbDsKLQotCQkJcHJpdmF0ZSBQcm9wZXJ0aWVzSGFuZGxlciBwcm9wZXJ0aWVzSGFuZGxlciA9IG51bGw7Ci0JCQlwcml2YXRlIFByb3BlcnRpZXNIYW5kbGVyIHJlcG9zaXRvcnlQcm9wZXJ0aWVzSGFuZGxlciA9IG51bGw7Ci0JCQlwcml2YXRlIFByb2Nlc3NpbmdTdGVwc0hhbmRsZXIgcHJvY2Vzc2luZ1N0ZXBzSGFuZGxlciA9IG51bGw7Ci0KLQkJCXB1YmxpYyBBcnRpZmFjdEhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgU2V0IGFydGlmYWN0cykgewotCQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIEFSVElGQUNUX0VMRU1FTlQpOwotCQkJCXRoaXMuYXJ0aWZhY3RzID0gYXJ0aWZhY3RzOwotCQkJCVN0cmluZ1tdIHZhbHVlcyA9IHBhcnNlUmVxdWlyZWRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHJlcXVpcmVkKTsKLQkJCQlWZXJzaW9uIHZlcnNpb24gPSBjaGVja1ZlcnNpb24oQVJUSUZBQ1RfRUxFTUVOVCwgVkVSU0lPTl9BVFRSSUJVVEUsIHZhbHVlc1syXSk7Ci0JCQkJLy8gVE9ETzogcmVzb2x2ZSBhY2Nlc3MgcmVzdHJpY3Rpb24gb24gQXJ0aWZhY3RLZXkgY29uc3RydWN0aW9uCi0JCQkJY3VycmVudEFydGlmYWN0ID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvcihuZXcgQXJ0aWZhY3RLZXkodmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZlcnNpb24pKTsKLQkJCX0KLQotCQkJcHVibGljIEFydGlmYWN0RGVzY3JpcHRvciBnZXRBcnRpZmFjdCgpIHsKLQkJCQlyZXR1cm4gY3VycmVudEFydGlmYWN0OwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJCWlmIChQUk9DRVNTSU5HX1NURVBTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCWlmIChwcm9jZXNzaW5nU3RlcHNIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJCXByb2Nlc3NpbmdTdGVwc0hhbmRsZXIgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKFBST1BFUlRJRVNfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQkJaWYgKHByb3BlcnRpZXNIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJCXByb3BlcnRpZXNIYW5kbGVyID0gbmV3IFByb3BlcnRpZXNIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoUkVQT1NJVE9SWV9QUk9QRVJUSUVTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCWlmIChyZXBvc2l0b3J5UHJvcGVydGllc0hhbmRsZXIgPT0gbnVsbCkgewotCQkJCQkJcmVwb3NpdG9yeVByb3BlcnRpZXNIYW5kbGVyID0gbmV3IFByb3BlcnRpZXNIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSB7Ci0JCQkJaWYgKGlzVmFsaWRYTUwoKSAmJiBjdXJyZW50QXJ0aWZhY3QgIT0gbnVsbCkgewotCQkJCQlNYXAgcHJvcGVydGllcyA9IChwcm9wZXJ0aWVzSGFuZGxlciA9PSBudWxsID8gbmV3IE9yZGVyZWRQcm9wZXJ0aWVzKDApIDogcHJvcGVydGllc0hhbmRsZXIuZ2V0UHJvcGVydGllcygpKTsKLQkJCQkJY3VycmVudEFydGlmYWN0LmFkZFByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLQkJCQkJcHJvcGVydGllcyA9IChyZXBvc2l0b3J5UHJvcGVydGllc0hhbmRsZXIgPT0gbnVsbCA/IG5ldyBPcmRlcmVkUHJvcGVydGllcygwKSA6IHJlcG9zaXRvcnlQcm9wZXJ0aWVzSGFuZGxlci5nZXRQcm9wZXJ0aWVzKCkpOwotCQkJCQljdXJyZW50QXJ0aWZhY3QuYWRkUmVwb3NpdG9yeVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLQkJCQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gcHJvY2Vzc2luZ1N0ZXBzID0gKHByb2Nlc3NpbmdTdGVwc0hhbmRsZXIgPT0gbnVsbCA/IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbMF0gLy8KLQkJCQkJCQk6IHByb2Nlc3NpbmdTdGVwc0hhbmRsZXIuZ2V0UHJvY2Vzc2luZ1N0ZXBzKCkpOwotCQkJCQljdXJyZW50QXJ0aWZhY3Quc2V0UHJvY2Vzc2luZ1N0ZXBzKHByb2Nlc3NpbmdTdGVwcyk7Ci0JCQkJCWFydGlmYWN0cy5hZGQoY3VycmVudEFydGlmYWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgY2xhc3MgUHJvY2Vzc2luZ1N0ZXBzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJCXByaXZhdGUgTGlzdCBwcm9jZXNzaW5nU3RlcHM7Ci0KLQkJCXB1YmxpYyBQcm9jZXNzaW5nU3RlcHNIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBQUk9DRVNTSU5HX1NURVBTX0VMRU1FTlQpOwotCQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCQlwcm9jZXNzaW5nU3RlcHMgPSAoc2l6ZSAhPSBudWxsID8gbmV3IEFycmF5TGlzdChuZXcgSW50ZWdlcihzaXplKS5pbnRWYWx1ZSgpKSA6IG5ldyBBcnJheUxpc3QoNCkpOwotCQkJfQotCi0JCQlwdWJsaWMgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gZ2V0UHJvY2Vzc2luZ1N0ZXBzKCkgewotCQkJCXJldHVybiAoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10pIHByb2Nlc3NpbmdTdGVwcy50b0FycmF5KG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbcHJvY2Vzc2luZ1N0ZXBzLnNpemUoKV0pOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJCWlmIChuYW1lLmVxdWFscyhQUk9DRVNTSU5HX1NURVBfRUxFTUVOVCkpIHsKLQkJCQkJbmV3IFByb2Nlc3NpbmdTdGVwSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCBwcm9jZXNzaW5nU3RlcHMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBjbGFzcyBQcm9jZXNzaW5nU3RlcEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHJlcXVpcmVkID0gbmV3IFN0cmluZ1tdIHtJRF9BVFRSSUJVVEUsIFNURVBfUkVRVUlSRURfQVRUUklCVVRFfTsKLQkJCXByaXZhdGUgZmluYWwgU3RyaW5nW10gb3B0aW9uYWwgPSBuZXcgU3RyaW5nW10ge1NURVBfREFUQV9BVFRSSUJVVEV9OwotCi0JCQlwdWJsaWMgUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIExpc3QgcHJvY2Vzc2luZ1N0ZXBzKSB7Ci0JCQkJc3VwZXIocGFyZW50SGFuZGxlciwgUFJPQ0VTU0lOR19TVEVQX0VMRU1FTlQpOwotCQkJCVN0cmluZ1tdIGF0dHJpYnV0ZVZhbHVlcyA9IHBhcnNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCByZXF1aXJlZCwgb3B0aW9uYWwpOwotCQkJCXByb2Nlc3NpbmdTdGVwcy5hZGQobmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcihhdHRyaWJ1dGVWYWx1ZXNbMF0sIGF0dHJpYnV0ZVZhbHVlc1sxXSwgY2hlY2tCb29sZWFuKFBST0NFU1NJTkdfU1RFUF9FTEVNRU5ULCBTVEVQX1JFUVVJUkVEX0FUVFJJQlVURSwgYXR0cmlidXRlVmFsdWVzWzJdKS5ib29sZWFuVmFsdWUoKSkpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gTWVzc2FnZXMuaW9fcGFyc2VFcnJvcjsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQkvLyBUT0RPOgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvVW5pdmVyc2FsVW5pcXVlSWRlbnRpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9zaW1wbGUvVW5pdmVyc2FsVW5pcXVlSWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzY4OTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvc2ltcGxlL1VuaXZlcnNhbFVuaXF1ZUlkZW50aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnNpbXBsZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKLWltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuR3JlZ29yaWFuQ2FsZW5kYXI7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotCi1wdWJsaWMgY2xhc3MgVW5pdmVyc2FsVW5pcXVlSWRlbnRpZmllciBpbXBsZW1lbnRzIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKLQotCS8qKgotCSAqIEFsbCBzZXJpYWxpemFibGUgb2JqZWN0cyBzaG91bGQgaGF2ZSBhIHN0YWJsZSBzZXJpYWxWZXJzaW9uVUlECi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKiBJTlNUQU5DRSBGSUVMRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotCXByaXZhdGUgYnl0ZVtdIGZCaXRzID0gbmV3IGJ5dGVbQllURVNfU0laRV07Ci0KLQkvKiBOT04tRklOQUwgUFJJVkFURSBTVEFUSUMgRklFTERTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotCXByaXZhdGUgc3RhdGljIEJpZ0ludGVnZXIgZmdQcmV2aW91c0Nsb2NrVmFsdWU7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IGZnQ2xvY2tBZGp1c3RtZW50ID0gMDsKLQlwcml2YXRlIHN0YXRpYyBpbnQgZmdDbG9ja1NlcXVlbmNlID0gLTE7Ci0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG5vZGVBZGRyZXNzOwotCi0Jc3RhdGljIHsKLQkJbm9kZUFkZHJlc3MgPSBjb21wdXRlTm9kZUFkZHJlc3MoKTsKLQl9Ci0KLQkvKiBQUklWQVRFIFNUQVRJQyBGSU5BTCBGSUVMRFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotCXByaXZhdGUgc3RhdGljIFJhbmRvbSBmZ1JhbmRvbU51bWJlckdlbmVyYXRvciA9IG5ldyBSYW5kb20oKTsKLQotCS8qIFBVQkxJQyBTVEFUSUMgRklOQUwgRklFTERTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQllURVNfU0laRSA9IDE2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFVOREVGSU5FRF9VVUlEX0JZVEVTID0gbmV3IGJ5dGVbMTZdOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9DTE9DS19TRVFVRU5DRSA9IDB4NDAwMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQ0xPQ0tfQURKVVNUTUVOVCA9IDB4N0ZGRjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FX0ZJRUxEX1NUQVJUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUSU1FX0ZJRUxEX1NUT1AgPSA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVfSElHSF9BTkRfVkVSU0lPTiA9IDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xPQ0tfU0VRVUVOQ0VfSElHSF9BTkRfUkVTRVJWRUQgPSA4OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMT0NLX1NFUVVFTkNFX0xPVyA9IDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ERV9BRERSRVNTX1NUQVJUID0gMTA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9ERV9BRERSRVNTX0JZVEVfU0laRSA9IDY7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCWVRFX01BU0sgPSAweEZGOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElHSF9OSUJCTEVfTUFTSyA9IDB4RjA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT1dfTklCQkxFX01BU0sgPSAweDBGOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hJRlRfTklCQkxFID0gNDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNoaWZ0Qnl0ZSA9IDg7Ci0KLQkvKioKLQkgVW5pdmVyc2FsVW5pcXVlSWRlbnRpZmllciBkZWZhdWx0IGNvbnN0cnVjdG9yIHJldHVybnMgYQotCSBuZXcgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBpbml0aWFsaXplZCB0byBhIHVuaXF1ZSB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgVW5pdmVyc2FsVW5pcXVlSWRlbnRpZmllcigpIHsKLQkJdGhpcy5zZXRWZXJzaW9uKDEpOwotCQl0aGlzLnNldFZhcmlhbnQoMSk7Ci0JCXRoaXMuc2V0VGltZVZhbHVlcygpOwotCQl0aGlzLnNldE5vZGUoZ2V0Tm9kZUFkZHJlc3MoKSk7Ci0JfQotCi0JLyoqCi0JIENvbnN0cnVjdG9yIHRoYXQgYWNjZXB0cyB0aGUgYnl0ZXMgdG8gdXNlIGZvciB0aGUgaW5zdGFuY2UuJm5ic3A7Jm5ic3A7IFRoZSBmb3JtYXQKLQkgb2YgdGhlIGJ5dGUgYXJyYXkgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSA8Y29kZT50b0J5dGVzKCk8L2NvZGU+IG1ldGhvZC4KLQotCSA8cD5UaGUgY29uc3RydWN0b3IgcmV0dXJucyB0aGUgdW5kZWZpbmVkIHV1aWQgaWYgdGhlIGJ5dGUgYXJyYXkgaXMgaW52YWxpZC4KLQotCSBAc2VlICN0b0J5dGVzKCkKLQkgQHNlZSAjQllURVNfU0laRQotCSAqLwotCXB1YmxpYyBVbml2ZXJzYWxVbmlxdWVJZGVudGlmaWVyKGJ5dGVbXSBieXRlVmFsdWUpIHsKLQkJZkJpdHMgPSBuZXcgYnl0ZVtCWVRFU19TSVpFXTsKLQkJaWYgKGJ5dGVWYWx1ZS5sZW5ndGggPj0gQllURVNfU0laRSkKLQkJCVN5c3RlbS5hcnJheWNvcHkoYnl0ZVZhbHVlLCAwLCBmQml0cywgMCwgQllURVNfU0laRSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZEJ5dGVTdHJpbmcoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgYnl0ZSB2YWx1ZSkgewotCQlTdHJpbmcgaGV4U3RyaW5nOwotCi0JCWlmICh2YWx1ZSA8IDApCi0JCQloZXhTdHJpbmcgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKDI1NiArIHZhbHVlKTsKLQkJZWxzZQotCQkJaGV4U3RyaW5nID0gSW50ZWdlci50b0hleFN0cmluZyh2YWx1ZSk7Ci0JCWlmIChoZXhTdHJpbmcubGVuZ3RoKCkgPT0gMSkKLQkJCWJ1ZmZlci5hcHBlbmQoIjAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGhleFN0cmluZyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlciBjbG9ja1ZhbHVlTm93KCkgewotCQlHcmVnb3JpYW5DYWxlbmRhciBub3cgPSBuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKTsKLQkJQmlnSW50ZWdlciBub3dNaWxsaXMgPSBCaWdJbnRlZ2VyLnZhbHVlT2Yobm93LmdldFRpbWUoKS5nZXRUaW1lKCkpOwotCQlCaWdJbnRlZ2VyIGJhc2VNaWxsaXMgPSBCaWdJbnRlZ2VyLnZhbHVlT2Yobm93LmdldEdyZWdvcmlhbkNoYW5nZSgpLmdldFRpbWUoKSk7Ci0KLQkJcmV0dXJuIChub3dNaWxsaXMuc3VidHJhY3QoYmFzZU1pbGxpcykubXVsdGlwbHkoQmlnSW50ZWdlci52YWx1ZU9mKDEwMDAwTCkpKTsKLQl9Ci0KLQkvKioKLQkgU2ltcGx5IGluY3JlYXNlcyB0aGUgdmlzaWJpbGl0eSBvZiA8Y29kZT5PYmplY3Q8L2NvZGU+J3MgY2xvbmUuCi0JIE90aGVyd2lzZSwgbm8gbmV3IGJlaGF2aW91ci4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNsb25lKCkgewotCQl0cnkgewotCQkJcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0JCX0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLQkJCUFzc2VydC5pc1RydWUoZmFsc2UsICJDbG9uZSBub3Qgc3VwcG9ydGVkIik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGNvbXBhcmVUaW1lKGJ5dGVbXSBmQml0czEsIGJ5dGVbXSBmQml0czIpIHsKLQkJZm9yIChpbnQgaSA9IFRJTUVfRklFTERfU1RPUDsgaSA+PSAwOyBpLS0pCi0JCQlpZiAoZkJpdHMxW2ldICE9IGZCaXRzMltpXSkKLQkJCQlyZXR1cm4gKDB4RkYgJiBmQml0czFbaV0pIC0gKDB4RkYgJiBmQml0czJbaV0pOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBBbnN3ZXJzIHRoZSBub2RlIGFkZHJlc3MgYXR0ZW1wdGluZyB0byBtYXNrIHRoZSBJUAotCSAqIGFkZHJlc3Mgb2YgdGhpcyBtYWNoaW5lLgotCSAqIAotCSAqIEByZXR1cm4gYnl0ZVtdIHRoZSBub2RlIGFkZHJlc3MKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBieXRlW10gY29tcHV0ZU5vZGVBZGRyZXNzKCkgewotCi0JCWJ5dGVbXSBhZGRyZXNzID0gbmV3IGJ5dGVbTk9ERV9BRERSRVNTX0JZVEVfU0laRV07Ci0KLQkJLy8gU2VlZCB0aGUgc2VjdXJlIHJhbmRvbWl6ZXIgd2l0aCBzb21lIG9mdC12YXJ5aW5nIGlucHV0cwotCQlpbnQgdGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5oYXNoQ29kZSgpOwotCQlsb25nIHRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaW50IG9iamVjdElkID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUobmV3IFN0cmluZygpKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVPdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCURhdGFPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IERhdGFPdXRwdXRTdHJlYW0oYnl0ZU91dCk7Ci0JCWJ5dGVbXSBpcEFkZHJlc3MgPSBnZXRJUEFkZHJlc3MoKTsKLQotCQl0cnkgewotCQkJaWYgKGlwQWRkcmVzcyAhPSBudWxsKQotCQkJCW91dC53cml0ZShpcEFkZHJlc3MpOwotCQkJb3V0LndyaXRlKHRocmVhZCk7Ci0JCQlvdXQud3JpdGVMb25nKHRpbWUpOwotCQkJb3V0LndyaXRlKG9iamVjdElkKTsKLQkJCW91dC5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGMpIHsKLQkJCS8vaWdub3JlIHRoZSBmYWlsdXJlLCB3ZSdyZSBqdXN0IHRyeWluZyB0byBjb21lIHVwIHdpdGggYSByYW5kb20gc2VlZAotCQl9Ci0JCWJ5dGVbXSByYW5kID0gYnl0ZU91dC50b0J5dGVBcnJheSgpOwotCi0JCVNlY3VyZVJhbmRvbSByYW5kb21pemVyID0gbmV3IFNlY3VyZVJhbmRvbShyYW5kKTsKLQkJcmFuZG9taXplci5uZXh0Qnl0ZXMoYWRkcmVzcyk7Ci0KLQkJLy8gc2V0IHRoZSBNU0Igb2YgdGhlIGZpcnN0IG9jdGV0IHRvIDEgdG8gZGlzdGluZ3Vpc2ggZnJvbSBJRUVFIG5vZGUgYWRkcmVzc2VzCi0JCWFkZHJlc3NbMF0gPSAoYnl0ZSkgKGFkZHJlc3NbMF0gfCAoYnl0ZSkgMHg4MCk7Ci0KLQkJcmV0dXJuIGFkZHJlc3M7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIFVuaXZlcnNhbFVuaXF1ZUlkZW50aWZpZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWJ5dGVbXSBvdGhlciA9ICgoVW5pdmVyc2FsVW5pcXVlSWRlbnRpZmllcikgb2JqKS5mQml0czsKLQkJaWYgKGZCaXRzID09IG90aGVyKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChmQml0cy5sZW5ndGggIT0gb3RoZXIubGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZCaXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZkJpdHNbaV0gIT0gb3RoZXJbaV0pCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSBBbnN3ZXJzIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBsb2NhbCBtYWNoaW5lIHVzaW5nIHRoZQotCSBKYXZhIEFQSSBjbGFzcyA8Y29kZT5JbmV0QWRkcmVzczwvY29kZT4uCi0KLQkgQHJldHVybiBieXRlW10gdGhlIG5ldHdvcmsgYWRkcmVzcyBpbiBuZXR3b3JrIG9yZGVyCi0JIEBzZWUgICAgamF2YS5uZXQuSW5ldEFkZHJlc3MjZ2V0TG9jYWxIb3N0KCkKLQkgQHNlZSAgICBqYXZhLm5ldC5JbmV0QWRkcmVzcyNnZXRBZGRyZXNzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSBnZXRJUEFkZHJlc3MoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gSW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0QWRkcmVzcygpOwotCQl9IGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL3ZhbGlkIGZvciB0aGlzIHRvIGJlIHRocm93biBiZSBhIG1hY2hpbmUgd2l0aCBubyBJUCBjb25uZWN0aW9uCi0JCQkvL0l0IGlzIFZFUlkgaW1wb3J0YW50IE5PVCB0byB0aHJvdyB0aGlzIGV4Y2VwdGlvbgotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBieXRlW10gZ2V0Tm9kZUFkZHJlc3MoKSB7Ci0JCXJldHVybiBub2RlQWRkcmVzczsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkJpdHNbMF0gKyBmQml0c1szXSArIGZCaXRzWzddICsgZkJpdHNbMTFdICsgZkJpdHNbMTVdOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBuZXh0Q2xvY2tTZXF1ZW5jZSgpIHsKLQotCQlpZiAoZmdDbG9ja1NlcXVlbmNlID09IC0xKQotCQkJZmdDbG9ja1NlcXVlbmNlID0gKGludCkgKGZnUmFuZG9tTnVtYmVyR2VuZXJhdG9yLm5leHREb3VibGUoKSAqIE1BWF9DTE9DS19TRVFVRU5DRSk7Ci0KLQkJZmdDbG9ja1NlcXVlbmNlID0gKGZnQ2xvY2tTZXF1ZW5jZSArIDEpICUgTUFYX0NMT0NLX1NFUVVFTkNFOwotCi0JCXJldHVybiBmZ0Nsb2NrU2VxdWVuY2U7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlciBuZXh0VGltZXN0YW1wKCkgewotCi0JCUJpZ0ludGVnZXIgdGltZXN0YW1wID0gY2xvY2tWYWx1ZU5vdygpOwotCQlpbnQgdGltZXN0YW1wQ29tcGFyaXNvbjsKLQotCQl0aW1lc3RhbXBDb21wYXJpc29uID0gdGltZXN0YW1wLmNvbXBhcmVUbyhmZ1ByZXZpb3VzQ2xvY2tWYWx1ZSk7Ci0KLQkJaWYgKHRpbWVzdGFtcENvbXBhcmlzb24gPT0gMCkgewotCQkJaWYgKGZnQ2xvY2tBZGp1c3RtZW50ID09IE1BWF9DTE9DS19BREpVU1RNRU5UKSB7Ci0JCQkJd2hpbGUgKHRpbWVzdGFtcC5jb21wYXJlVG8oZmdQcmV2aW91c0Nsb2NrVmFsdWUpID09IDApCi0JCQkJCXRpbWVzdGFtcCA9IGNsb2NrVmFsdWVOb3coKTsKLQkJCQl0aW1lc3RhbXAgPSBuZXh0VGltZXN0YW1wKCk7Ci0JCQl9IGVsc2UKLQkJCQlmZ0Nsb2NrQWRqdXN0bWVudCsrOwotCQl9IGVsc2UgewotCQkJZmdDbG9ja0FkanVzdG1lbnQgPSAwOwotCi0JCQlpZiAodGltZXN0YW1wQ29tcGFyaXNvbiA8IDApCi0JCQkJbmV4dENsb2NrU2VxdWVuY2UoKTsKLQkJfQotCi0JCXJldHVybiB0aW1lc3RhbXA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENsb2NrU2VxdWVuY2UoaW50IGNsb2NrU2VxKSB7Ci0JCWludCBjbG9ja1NlcUhpZ2ggPSAoY2xvY2tTZXEgPj4+IFNoaWZ0Qnl0ZSkgJiBMT1dfTklCQkxFX01BU0s7Ci0JCWludCByZXNlcnZlZCA9IGZCaXRzW0NMT0NLX1NFUVVFTkNFX0hJR0hfQU5EX1JFU0VSVkVEXSAmIEhJR0hfTklCQkxFX01BU0s7Ci0KLQkJZkJpdHNbQ0xPQ0tfU0VRVUVOQ0VfSElHSF9BTkRfUkVTRVJWRURdID0gKGJ5dGUpIChyZXNlcnZlZCB8IGNsb2NrU2VxSGlnaCk7Ci0JCWZCaXRzW0NMT0NLX1NFUVVFTkNFX0xPV10gPSAoYnl0ZSkgKGNsb2NrU2VxICYgQllURV9NQVNLKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROb2RlKGJ5dGVbXSBieXRlcykgewotCi0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBOT0RFX0FERFJFU1NfQllURV9TSVpFOyBpbmRleCsrKQotCQkJZkJpdHNbaW5kZXggKyBOT0RFX0FERFJFU1NfU1RBUlRdID0gYnl0ZXNbaW5kZXhdOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUaW1lc3RhbXAoQmlnSW50ZWdlciB0aW1lc3RhbXApIHsKLQkJQmlnSW50ZWdlciB2YWx1ZSA9IHRpbWVzdGFtcDsKLQkJQmlnSW50ZWdlciBiaWdCeXRlID0gQmlnSW50ZWdlci52YWx1ZU9mKDI1NkwpOwotCQlCaWdJbnRlZ2VyW10gcmVzdWx0czsKLQkJaW50IHZlcnNpb247Ci0JCWludCB0aW1lSGlnaDsKLQotCQlmb3IgKGludCBpbmRleCA9IFRJTUVfRklFTERfU1RBUlQ7IGluZGV4IDwgVElNRV9GSUVMRF9TVE9QOyBpbmRleCsrKSB7Ci0JCQlyZXN1bHRzID0gdmFsdWUuZGl2aWRlQW5kUmVtYWluZGVyKGJpZ0J5dGUpOwotCQkJdmFsdWUgPSByZXN1bHRzWzBdOwotCQkJZkJpdHNbaW5kZXhdID0gKGJ5dGUpIHJlc3VsdHNbMV0uaW50VmFsdWUoKTsKLQkJfQotCQl2ZXJzaW9uID0gZkJpdHNbVElNRV9ISUdIX0FORF9WRVJTSU9OXSAmIEhJR0hfTklCQkxFX01BU0s7Ci0JCXRpbWVIaWdoID0gdmFsdWUuaW50VmFsdWUoKSAmIExPV19OSUJCTEVfTUFTSzsKLQkJZkJpdHNbVElNRV9ISUdIX0FORF9WRVJTSU9OXSA9IChieXRlKSAodGltZUhpZ2ggfCB2ZXJzaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgc2V0VGltZVZhbHVlcygpIHsKLQkJdGhpcy5zZXRUaW1lc3RhbXAodGltZXN0YW1wKCkpOwotCQl0aGlzLnNldENsb2NrU2VxdWVuY2UoZmdDbG9ja1NlcXVlbmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IHNldFZhcmlhbnQoaW50IHZhcmlhbnRJZGVudGlmaWVyKSB7Ci0JCWludCBjbG9ja1NlcUhpZ2ggPSBmQml0c1tDTE9DS19TRVFVRU5DRV9ISUdIX0FORF9SRVNFUlZFRF0gJiBMT1dfTklCQkxFX01BU0s7Ci0JCWludCB2YXJpYW50ID0gdmFyaWFudElkZW50aWZpZXIgJiBMT1dfTklCQkxFX01BU0s7Ci0KLQkJZkJpdHNbQ0xPQ0tfU0VRVUVOQ0VfSElHSF9BTkRfUkVTRVJWRURdID0gKGJ5dGUpICgodmFyaWFudCA8PCBTSElGVF9OSUJCTEUpIHwgY2xvY2tTZXFIaWdoKTsKLQkJcmV0dXJuICh2YXJpYW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRWZXJzaW9uKGludCB2ZXJzaW9uSWRlbnRpZmllcikgewotCQlpbnQgdGltZUhpZ2ggPSBmQml0c1tUSU1FX0hJR0hfQU5EX1ZFUlNJT05dICYgTE9XX05JQkJMRV9NQVNLOwotCQlpbnQgdmVyc2lvbiA9IHZlcnNpb25JZGVudGlmaWVyICYgTE9XX05JQkJMRV9NQVNLOwotCi0JCWZCaXRzW1RJTUVfSElHSF9BTkRfVkVSU0lPTl0gPSAoYnl0ZSkgKHRpbWVIaWdoIHwgKHZlcnNpb24gPDwgU0hJRlRfTklCQkxFKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQmlnSW50ZWdlciB0aW1lc3RhbXAoKSB7Ci0JCUJpZ0ludGVnZXIgdGltZXN0YW1wOwotCi0JCWlmIChmZ1ByZXZpb3VzQ2xvY2tWYWx1ZSA9PSBudWxsKSB7Ci0JCQlmZ0Nsb2NrQWRqdXN0bWVudCA9IDA7Ci0JCQluZXh0Q2xvY2tTZXF1ZW5jZSgpOwotCQkJdGltZXN0YW1wID0gY2xvY2tWYWx1ZU5vdygpOwotCQl9IGVsc2UKLQkJCXRpbWVzdGFtcCA9IG5leHRUaW1lc3RhbXAoKTsKLQotCQlmZ1ByZXZpb3VzQ2xvY2tWYWx1ZSA9IHRpbWVzdGFtcDsKLQkJcmV0dXJuIGZnQ2xvY2tBZGp1c3RtZW50ID09IDAgPyB0aW1lc3RhbXAgOiB0aW1lc3RhbXAuYWRkKEJpZ0ludGVnZXIudmFsdWVPZihmZ0Nsb2NrQWRqdXN0bWVudCkpOwotCX0KLQotCS8qKiAKLQkgVGhpcyByZXByZXNlbnRhdGlvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIChieXRlW10pIGNvbnN0cnVjdG9yLgotCi0JIEBzZWUgI1VuaXZlcnNhbFVuaXF1ZUlkZW50aWZpZXIoYnl0ZVtdKQotCSAqLwotCXB1YmxpYyBieXRlW10gdG9CeXRlcygpIHsKLQkJYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2ZCaXRzLmxlbmd0aF07Ci0KLQkJU3lzdGVtLmFycmF5Y29weShmQml0cywgMCwgcmVzdWx0LCAwLCBmQml0cy5sZW5ndGgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkJpdHMubGVuZ3RoOyBpKyspCi0JCQlhcHBlbmRCeXRlU3RyaW5nKGJ1ZmZlciwgZkJpdHNbaV0pOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZ0FzQnl0ZXMoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAieyI7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZCaXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHQgKz0gZkJpdHNbaV07Ci0JCQlpZiAoaSA8IGZCaXRzLmxlbmd0aCArIDEpCi0JCQkJcmVzdWx0ICs9ICIsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQgKyAifSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0FydGlmYWN0RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9BcnRpZmFjdERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVjNzdmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0FydGlmYWN0RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuT3JkZXJlZFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotCi0vKioKLSAqIFRoaXMgcmVwcmVzZW50cyBpbmZvcm1hdGlvbiBhYm91dCBhIGdpdmVuIGFydGlmYWN0IHN0b3JlZCBvbiBhIHBhcnRpY3VsYXIgYnl0ZSBzZXJ2ZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdERlc2NyaXB0b3IgaW1wbGVtZW50cyBJQXJ0aWZhY3REZXNjcmlwdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIEVNUFRZX1NURVBTID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvclswXTsKLQotCXByb3RlY3RlZCBJQXJ0aWZhY3RLZXkga2V5OyAvLyBUaGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFydGlmYWN0Ci0KLQkvLyBUaGUgbGlzdCBvZiBwb3N0IHByb2Nlc3Npbmcgc3RlcHMgdGhhdCBtdXN0IGJlIGFwcGxpZWQgb25lIHRoZSBhcnRpZmFjdCBvbmNlIGl0IAotCS8vIGhhcyBiZWVuIGRvd25sb2FkZWQgKGUuZywgdW5wYWNrLCB0aGVuIG1kNSBjaGVja3N1bSwgdGhlbi4uLikKLQlwcm90ZWN0ZWQgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gcHJvY2Vzc2luZ1N0ZXBzID0gRU1QVFlfU1RFUFM7Ci0KLQlwcm90ZWN0ZWQgTWFwIHByb3BlcnRpZXMgPSBuZXcgT3JkZXJlZFByb3BlcnRpZXMoKTsKLQlwcm90ZWN0ZWQgTWFwIHJlcG9zaXRvcnlQcm9wZXJ0aWVzID0gbmV3IE9yZGVyZWRQcm9wZXJ0aWVzKCk7Ci0KLQlwcm90ZWN0ZWQgdHJhbnNpZW50IElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeTsKLQotCS8vIFFVRVNUSU9OOiBEbyB3ZSBuZWVkIGFueSBkZXNjcmlwdGlvbiBvciB1c2VyIHJlYWRhYmxlIG5hbWUKLQotCXB1YmxpYyBBcnRpZmFjdERlc2NyaXB0b3IoSUFydGlmYWN0RGVzY3JpcHRvciBiYXNlKSB7Ci0JCXN1cGVyKCk7Ci0JCWtleSA9IGJhc2UuZ2V0QXJ0aWZhY3RLZXkoKTsKLQkJcHJvY2Vzc2luZ1N0ZXBzID0gYmFzZS5nZXRQcm9jZXNzaW5nU3RlcHMoKTsKLQkJcHJvcGVydGllcy5wdXRBbGwoYmFzZS5nZXRQcm9wZXJ0aWVzKCkpOwotCQlyZXBvc2l0b3J5ID0gYmFzZS5nZXRSZXBvc2l0b3J5KCk7Ci0JCS8vIFRPRE8gdGhpcyBwcm9wZXJ0eSBpcyBoYXJkY29kZWQgZm9yIHRoZSBibG9iIHN0b3JlLgotCQkvLwkJc2V0UHJvcGVydHkoImFydGlmYWN0LnV1aWQiLCBiYXNlLmdldFByb3BlcnR5KCJhcnRpZmFjdC51dWlkIikpOwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdERlc2NyaXB0b3IoQXJ0aWZhY3REZXNjcmlwdG9yIGJhc2UpIHsKLQkJc3VwZXIoKTsKLQkJa2V5ID0gYmFzZS5rZXk7Ci0JCXByb2Nlc3NpbmdTdGVwcyA9IGJhc2UucHJvY2Vzc2luZ1N0ZXBzOwotCQlwcm9wZXJ0aWVzID0gYmFzZS5wcm9wZXJ0aWVzOwotCQlyZXBvc2l0b3J5ID0gYmFzZS5yZXBvc2l0b3J5OwotCX0KLQotCXB1YmxpYyBBcnRpZmFjdERlc2NyaXB0b3IoSUFydGlmYWN0S2V5IGtleSkgewotCQlzdXBlcigpOwotCQl0aGlzLmtleSA9IGtleTsKLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0S2V5IGdldEFydGlmYWN0S2V5KCkgewotCQlyZXR1cm4ga2V5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5S2V5KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChwcm9wZXJ0eUtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcHJvcGVydGllcy5yZW1vdmUoa2V5KTsKLQkJZWxzZQotCQkJcHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydGllcyhNYXAgYWRkaXRpb25hbFByb3BlcnRpZXMpIHsKLQkJcHJvcGVydGllcy5wdXRBbGwoYWRkaXRpb25hbFByb3BlcnRpZXMpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSByZWFkLW9ubHkgY29sbGVjdGlvbiBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXJ0aWZhY3QgZGVzY3JpcHRvci4KLQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgYXJ0aWZhY3QgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBPcmRlcmVkUHJvcGVydGllcy51bm1vZGlmaWFibGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeVByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eUtleSkgewotCQlyZXR1cm4gKFN0cmluZykgcmVwb3NpdG9yeVByb3BlcnRpZXMuZ2V0KHByb3BlcnR5S2V5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXBvc2l0b3J5UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmVwb3NpdG9yeVByb3BlcnRpZXMucmVtb3ZlKGtleSk7Ci0JCWVsc2UKLQkJCXJlcG9zaXRvcnlQcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZXBvc2l0b3J5UHJvcGVydGllcyhNYXAgYWRkaXRpb25hbFByb3BlcnRpZXMpIHsKLQkJcmVwb3NpdG9yeVByb3BlcnRpZXMucHV0QWxsKGFkZGl0aW9uYWxQcm9wZXJ0aWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcmVhZC1vbmx5IGNvbGxlY3Rpb24gb2YgdGhlIHJlcG9zaXRvcnkgcHJvcGVydGllcyBvZiB0aGUgYXJ0aWZhY3QgZGVzY3JpcHRvci4KLQkgKiBAcmV0dXJuIHRoZSByZXBvc2l0b3J5IHByb3BlcnRpZXMgb2YgdGhpcyBhcnRpZmFjdCBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UmVwb3NpdG9yeVByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBPcmRlcmVkUHJvcGVydGllcy51bm1vZGlmaWFibGVQcm9wZXJ0aWVzKHJlcG9zaXRvcnlQcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwdWJsaWMgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gZ2V0UHJvY2Vzc2luZ1N0ZXBzKCkgewotCQlyZXR1cm4gcHJvY2Vzc2luZ1N0ZXBzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2Nlc3NpbmdTdGVwcyhQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB2YWx1ZSkgewotCQlwcm9jZXNzaW5nU3RlcHMgPSB2YWx1ZSA9PSBudWxsID8gRU1QVFlfU1RFUFMgOiB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJQXJ0aWZhY3REZXNjcmlwdG9yIG90aGVyID0gKEFydGlmYWN0RGVzY3JpcHRvcikgb2JqOwotCQlpZiAoa2V5ID09IG51bGwpIHsKLQkJCWlmIChvdGhlci5rZXkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIWtleS5lcXVhbHMob3RoZXIua2V5KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFBcnJheXMuZXF1YWxzKHByb2Nlc3NpbmdTdGVwcywgb3RoZXIucHJvY2Vzc2luZ1N0ZXBzKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLnByb3BlcnRpZXMgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIXByb3BlcnRpZXMuZXF1YWxzKG90aGVyLnByb3BlcnRpZXMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGludCBoYXNoQ29kZShPYmplY3RbXSBhcnJheSkgewotCQlpbnQgcHJpbWUgPSAzMTsKLQkJaWYgKGFycmF5ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJaW50IHJlc3VsdCA9IDE7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBhcnJheS5sZW5ndGg7IGluZGV4KyspIHsKLQkJCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKGFycmF5W2luZGV4XSA9PSBudWxsID8gMCA6IGFycmF5W2luZGV4XS5oYXNoQ29kZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWZpbmFsIGludCBwcmltZSA9IDMxOwotCQlpbnQgcmVzdWx0ID0gMTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGtleSA9PSBudWxsKSA/IDAgOiBrZXkuaGFzaENvZGUoKSk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgaGFzaENvZGUocHJvY2Vzc2luZ1N0ZXBzKTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHByb3BlcnRpZXMgPT0gbnVsbCkgPyAwIDogcHJvcGVydGllcy5oYXNoQ29kZSgpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgewotCQlyZXR1cm4gcmVwb3NpdG9yeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXBvc2l0b3J5KElBcnRpZmFjdFJlcG9zaXRvcnkgdmFsdWUpIHsKLQkJcmVwb3NpdG9yeSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBmb3JtYXQgPSBnZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkZPUk1BVCk7Ci0JCWlmIChmb3JtYXQgPT0gbnVsbCkKLQkJCXJldHVybiAiY2Fub25pY2FsOiAiICsga2V5LnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZvcm1hdCArICI6ICIgKyBrZXkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JQXJ0aWZhY3REZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lBcnRpZmFjdERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlYmM2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lBcnRpZmFjdERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLQotcHVibGljIGludGVyZmFjZSBJQXJ0aWZhY3REZXNjcmlwdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPV05MT0FEX1NJWkUgPSAiZG93bmxvYWQuc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9TSVpFID0gImFydGlmYWN0LnNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9XTkxPQURfTUQ1ID0gImRvd25sb2FkLm1kNSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9NRDUgPSAiYXJ0aWZhY3QubWQ1IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVCA9ICJmb3JtYXQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGtleSBmb3IgdGhlIGFydGlmYWN0IGRlc2NyaWJlZCBieSB0aGlzIGRlc2NyaXB0b3IuCi0JICogQHJldHVybiB0aGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUFydGlmYWN0S2V5IGdldEFydGlmYWN0S2V5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eSBpbiB0aGlzIGRlc2NyaXB0b3IgIDxjb2RlPm51bGw8L2NvZGU+IAotCSAqIGlzIHJldHVybmVkIGlmIG5vIHN1Y2ggcHJvcGVydHkgZXhpc3RzCi0JICogQHBhcmFtIGtleSB0aGUgcHJvcGVydHkga2V5IHRvIGxvb2sgZm9yCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5IG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KTsKLQotCS8qKgotCSAqIFJldHVybnMgYSByZWFkLW9ubHkgY29sbGVjdGlvbiBvZiB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXJ0aWZhY3QgZGVzY3JpcHRvci4KLQkgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgYXJ0aWZhY3QgZGVzY3JpcHRvci4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKTsKLQotCS8qKiAKLQkgKiBSZXR1cm4gdGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBzdGVwcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXNjcmlwdG9yLgotCSAqIEFuIGVtcHR5IHNldCBvZiBzdGVwcyBpbXBsaWVzIHRoYXQgdGhpcyBkZXNjcmlwdG9yIGRlc2NyaWJlcyBhIGNvbXBsZXRlCi0JICogY29weSBvZiB0aGUgYXJ0aWZhY3QgaW4gaXRzIG5hdGl2ZSBmb3JtLgotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcHJvY2Vzc2luZyBzdGVwcyBmb3IgdGhpcyBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIGFic3RyYWN0IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIGdldFByb2Nlc3NpbmdTdGVwcygpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhcnRpZmFjdCByZXBvc2l0b3J5IHRoYXQgaG9sZHMgdGhlIGFydGlmYWN0IGRlc2NyaWJlZCBieSB0aGlzIGRlc2NyaXB0b3IuCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuZWQgaWYgdGhpcyBkZXNjcmlwdG9yIGlzIG5vdCBoZWxkIGluIGEgcmVwb3NpdG9yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZXBvc2l0b3J5IGhvbGRpbmcgdGhpcyBhcnRpZmFjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJQXJ0aWZhY3RSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvSUFydGlmYWN0UmVwb3NpdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JQXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiY2VjNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JQXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BYnN0cmFjdEFydGlmYWN0UmVwb3NpdG9yeTsKLQotLyoqCi0gKiBBIHJlcG9zaXRvcnkgY29udGFpbmluZyBhcnRpZmFjdHMuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAgQXJ0aWZhY3QgcmVwb3NpdG9yeQotICogaW1wbGVtZW50YXRpb25zIG11c3Qgc3ViY2xhc3Mge0BsaW5rIEFic3RyYWN0QXJ0aWZhY3RSZXBvc2l0b3J5fSByYXRoZXIgdGhhbiAKLSAqIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBkaXJlY3RseS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJ0aWZhY3RSZXBvc2l0b3J5IGV4dGVuZHMgSVJlcG9zaXRvcnkgewotCS8qKgotCSAqIEFkZCB0aGUgZ2l2ZW4gZGVzY3JpcHRvciB0byB0aGUgc2V0IG9mIGRlc2NyaXB0b3JzIGluIHRoaXMgcmVwb3NpdG9yeS4gIFRoaXMgaXMgCi0JICogYSByZWxhdGl2ZWx5IGxvdy1sZXZlbCBvcGVyYXRpb24gdGhhdCBzaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gdGhlIGFjdHVhbCByZWxhdGVkIAotCSAqIGNvbnRlbnQgaXMgaW4gdGhpcyByZXBvc2l0b3J5IGFuZCB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBhY2N1cmF0ZWx5IGRlc2NyaWJlcyAKLQkgKiB0aGF0IGNvbnRlbnQuCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGRlc2NyaXB0b3IgdG8gYWRkLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0b3IoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgZ2l2ZW4gYXJ0aWZhY3QgZGVzY3JpcHRvcnMgdG8gdGhpcyByZXBvc2l0b3J5Ci0JICogQHBhcmFtIGRlc2NyaXB0b3JzIHRoZSBhcnRpZmFjdCBkZXNjcmlwdG9ycyB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdG9ycyhJQXJ0aWZhY3REZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMpOwotCi0JLyoqIAotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJlcG9zaXRvcnkgY29udGFpbnMgdGhlIGdpdmVuIGRlc2NyaXB0b3IuCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGRlc2NyaXB0b3IgdG8gcXVlcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGRlc2NyaXB0b3IgaXMgYWxyZWFkeSBpbiB0aGlzIHJlcG9zaXRvcnkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpOwotCi0JLyoqIAotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJlcG9zaXRvcnkgY29udGFpbnMgdGhlIGdpdmVuIGFydGlmYWN0IGtleS4KLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gcXVlcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGtleSBpcyBhbHJlYWR5IGluIHRoaXMgcmVwb3NpdG9yeQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdEtleSBrZXkpOwotCi0JLyoqCi0JICogRmlsbCB0aGUgZ2l2ZW4gc3RyZWFtIHdpdGggdGhlIGRlc2NyaWJlZCBhcnRpZmFjdC4gU2V0cyBzdGF0dXMgYWNjb3JkaW5nbHkuIAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldEFydGlmYWN0KElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBzZXQgb2YgYXJ0aWZhY3QgZGVzY3JpcHRvcnMgZGVzY3JpYmluZyB0aGUgd2F5cyB0aGF0IHRoaXMgcmVwb3NpdG9yeQotCSAqIGNhbiBzdXBwbHkgdGhlIGFydGlmYWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gYXJ0aWZhY3Qga2V5Ci0JICogQHBhcmFtIGtleSB0aGUgYXJ0aWZhY3Qga2V5IHRvIGxvb2t1cAotCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3JzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5Ci0JICovCi0JcHVibGljIElBcnRpZmFjdERlc2NyaXB0b3JbXSBnZXRBcnRpZmFjdERlc2NyaXB0b3JzKElBcnRpZmFjdEtleSBrZXkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBhcnRpZmFjdCBrZXlzIG1hbmFnZWQgYnkgdGhpcyByZXBvc2l0b3J5Ci0JICogQHJldHVybiBsaXN0IG9mIGFydGlmYWN0IGtleXMKLQkgKi8KLQlwdWJsaWMgSUFydGlmYWN0S2V5W10gZ2V0QXJ0aWZhY3RLZXlzKCk7Ci0KLQkvKioKLQkgKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gYXJ0aWZhY3QgcmVxdWVzdHMgb24gdGhpcyBieXRlIHNlcnZlci4KLQkgKiBAcGFyYW0gcmVxdWVzdHMgVGhlIGFydGlmYWN0IHJlcXVlc3RzCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAcmV0dXJuIGEgc3RhdHVzIG9iamVjdCB0aGF0IGlzIDxjb2RlPk9LPC9jb2RlPiBpZiByZXF1ZXN0cyB3ZXJlCi0JICogcHJvY2Vzc2VkIHN1Y2Nlc3NmdWxseS4gT3RoZXJ3aXNlLCBhIHN0YXR1cyBpbmRpY2F0aW5nIGluZm9ybWF0aW9uLAotCSAqIHdhcm5pbmdzLCBvciBlcnJvcnMgdGhhdCBvY2N1cnJlZCB3aGlsZSBleGVjdXRpbmcgdGhlIGFydGlmYWN0IHJlcXVlc3RzCi0JICovCi0JcHVibGljIElTdGF0dXMgZ2V0QXJ0aWZhY3RzKElBcnRpZmFjdFJlcXVlc3RbXSByZXF1ZXN0cywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCS8qKgotCSAqIE9wZW4gYW4gb3V0cHV0IHN0cmVhbSB0byB3aGljaCBhIGNsaWVudCBjYW4gd3JpdGUgdGhlIGRhdGEgZm9yIHRoZSBnaXZlbiAKLQkgKiBhcnRpZmFjdCBkZXNjcmlwdG9yLgotCSAqIEBwYXJhbSBkZXNjcmlwdG9yIHRoZSBkZXNjcmlwdG9yIGRlc2NyaWJpbmcgdGhlIGFydGlmYWN0IGRhdGEgdG8gYmUgd3JpdHRlbiB0byB0aGUgCi0JICogcmVzdWx0YW50IHN0cmVhbQotCSAqIEByZXR1cm4gdGhlIHN0cmVhbSB0byB3aGljaCB0aGUgYXJ0aWZhY3QgY29udGVudCBjYW4gYmUgd3JpdHRlbi4gVGhlIHJldHVybmVkIG91dHB1dAotCSAqICBzdHJlYW0gbWF5IGltcGxlbWVudCA8Y29kZT5JU3RhdGVmdWw8L2NvZGU+LgotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIGlmIHRoZSBvdXRwdXQgc3RyZWFtIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiAgUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+QW4gSS9PIGV4Y2VwdGlvbiBvY2N1cnJlZCAoQGxpbmsge0BsaW5rIFByb3Zpc2lvbkV4Y2VwdGlvbiNSRVBPU0lUT1JZX0ZBSUxFRF9XUklURX0pIC48L2xpPgotCSAqIDxsaT5BbiBhcnRpZmFjdCBhbHJlYWR5IGV4aXN0cyBhdCB0aGF0IGxvY2F0aW9uICh7QGxpbmsgUHJvdmlzaW9uRXhjZXB0aW9uI0FSVElGQUNUX0VYSVNUU30pLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGFsbCBrZXlzLCBkZXNjcmlwdG9ycywgYW5kIGNvbnRlbnRzIGZyb20gdGhpcyByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpOwotCi0JLyoqCi0JICogUmVtb3ZlIHRoZSBnaXZlbiBkZXNjcmlwdG9yIGFuZCBpdHMgY29ycmVzcG9uZGluZyBjb250ZW50IGluIHRoaXMgcmVwb3NpdG9yeS4gIAotCSAqIEBwYXJhbSBkZXNjcmlwdG9yIHRoZSBkZXNjcmlwdG9yIHRvIHJlbW92ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEZXNjcmlwdG9yKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcik7Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGdpdmVuIGtleSBhbmQgYWxsIHJlbGF0ZWQgY29udGVudCBhbmQgZGVzY3JpcHRvcnMgZnJvbSB0aGlzIHJlcG9zaXRvcnkuICAKLQkgKiBAcGFyYW0ga2V5IHRoZSBrZXkgdG8gcmVtb3ZlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURlc2NyaXB0b3IoSUFydGlmYWN0S2V5IGtleSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBjOWM1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLQotLyoqCi0gKiBUaGUgbWV0YWRhdGEgcmVwb3NpdG9yeSBtYW5hZ2VyIGlzIHVzZWQgdG8gY3JlYXRlLCBhY2Nlc3MsIGFuZCBtYW5pcHVsYXRlCi0gKiB7QGxpbmsgSUFydGlmYWN0UmVwb3NpdG9yeX0gaW5zdGFuY2VzLiBUaGUgbWFuYWdlciBrZWVwcyB0cmFjayBvZiBhIAotICogc2V0IG9mIGtub3duIHJlcG9zaXRvcmllcywgYW5kIHByb3ZpZGVzIGNhY2hpbmcgb2YgdGhlc2Uga25vd24gcmVwb3NpdG9yaWVzCi0gKiB0byBhdm9pZCB1bm5lY2Vzc2FyeSBsb2FkaW5nIG9mIHJlcG9zaXRvcmllcyBmcm9tIHRoZSBkaXNrIG9yIG5ldHdvcmsuICBUaGUKLSAqIG1hbmFnZXIgZmlyZXMge0BsaW5rIFJlcG9zaXRvcnlFdmVudH1zIHdoZW4gdGhlIHNldCBvZiBrbm93biByZXBvc2l0b3JpZXMKLSAqIGNoYW5nZXMuCi0gKiAKLSAqIEBub2ltcGxlbWVudCBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBJQXJ0aWZhY3RSZXF1ZXN0W10gTk9fQVJUSUZBQ1RfUkVRVUVTVCA9IG5ldyBJQXJ0aWZhY3RSZXF1ZXN0WzBdOwotCi0JLyoqCi0JICogQ29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGFsbCByZXBvc2l0b3JpZXMgYXJlIG9mIGludGVyZXN0LgotCSAqIEBzZWUgI2dldEtub3duUmVwb3NpdG9yaWVzKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBPU0lUT1JJRVNfQUxMID0gMDsKLQotCS8qKgotCSAqIENvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBzeXN0ZW0gcmVwb3NpdG9yaWVzIGFyZSBvZiBpbnRlcmVzdC4KLQkgKiBAc2VlIElSZXBvc2l0b3J5I1BST1BfU1lTVEVNCi0JICogQHNlZSAjZ2V0S25vd25SZXBvc2l0b3JpZXMoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9TSVRPUklFU19TWVNURU0gPSAxIDw8IDA7Ci0KLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm9uLXN5c3RlbSByZXBvc2l0b3JpZXMgYXJlIG9mIGludGVyZXN0Ci0JICogQHNlZSBJUmVwb3NpdG9yeSNQUk9QX1NZU1RFTQotCSAqIEBzZWUgI2dldEtub3duUmVwb3NpdG9yaWVzKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBPU0lUT1JJRVNfTk9OX1NZU1RFTSA9IDEgPDwgMTsKLQotCS8qKgotCSAqIENvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBsb2NhbCByZXBvc2l0b3JpZXMgYXJlIG9mIGludGVyZXN0LgotCSAqIEBzZWUgI2dldEtub3duUmVwb3NpdG9yaWVzKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBPU0lUT1JJRVNfTE9DQUwgPSAxIDw8IDI7Ci0KLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIGluZGljYXRlIHRoYXQgZGlzYWJsZWQgcmVwb3NpdG9yaWVzIGFyZSBvZiBpbnRlcmVzdC4KLQkgKiBAc2VlICNnZXRLbm93blJlcG9zaXRvcmllcyhpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1NJVE9SSUVTX0RJU0FCTEVEID0gMSA8PCAzOwotCi0JLyoqCi0JICogUmVwb3NpdG9yeSB0eXBlIGZvciBhIHNpbXBsZSByZXBvc2l0b3J5IGJhc2VkIG9uIGEgVVJMIG9yIGxvY2FsIGZpbGUgc3lzdGVtIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU0lNUExFX1JFUE9TSVRPUlkgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnNpbXBsZVJlcG9zaXRvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBZGRzIGEgcmVwb3NpdG9yeSB0byB0aGUgbGlzdCBvZiBhcnRpZmFjdCByZXBvc2l0b3JpZXMgdHJhY2tlZCBieSB0aGUgcmVwb3NpdG9yeQotCSAqIG1hbmFnZXIuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgYXJ0aWZhY3QgcmVwb3NpdG9yeSB0byBhZGQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgcmVxdWVzdCB0byBkb3dubG9hZCB0aGUgZ2l2ZW4gYXJ0aWZhY3QgYW5kIHN0b3JlIGl0IGF0IHRoZSBnaXZlbiBkZXN0aW5hdGlvbi4KLQkgKiBAcGFyYW0ga2V5IHRoZSBhcnRpZmFjdCB0byBkb3dubG9hZAotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgZGVzdGluYXRpb24gd2hlcmUgdGhlIGFydGlmYWN0IHdpbGwgYmUgc3RvcmVkCi0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCByZXF1ZXN0IG9iamVjdAotCSAqLwotCXB1YmxpYyBJQXJ0aWZhY3RSZXF1ZXN0IGNyZWF0ZURvd25sb2FkUmVxdWVzdChJQXJ0aWZhY3RLZXkga2V5LCBJUGF0aCBkZXN0aW5hdGlvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgcmVxdWVzdCB0byBtaXJyb3IgdGhlIGdpdmVuIGFydGlmYWN0IGludG8gdGhlIGRlc3RpbmF0aW9uIHJlcG9zaXRvcnkuCi0JICogQHBhcmFtIGtleSB0aGUgYXJ0aWZhY3QgdG8gbWlycm9yCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uIHRoZSBkZXN0aW5hdGlvbiB3aGVyZSB0aGUgYXJ0aWZhY3Qgd2lsbCBiZSBtaXJyb3JlZAotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgcmVxdWVzdCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgSUFydGlmYWN0UmVxdWVzdCBjcmVhdGVNaXJyb3JSZXF1ZXN0KElBcnRpZmFjdEtleSBrZXksIElBcnRpZmFjdFJlcG9zaXRvcnkgZGVzdGluYXRpb24pOwotCi0JLyoqCi0JICogUmV0dXJuIGEgbmV3IHJlcXVlc3QgdG8gbWlycm9yIHRoZSBnaXZlbiBhcnRpZmFjdCBpbnRvIHRoZSBkZXN0aW5hdGlvbiByZXBvc2l0b3J5LgotCSAqIEBwYXJhbSBrZXkgdGhlIGFydGlmYWN0IHRvIG1pcnJvcgotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgZGVzdGluYXRpb24gd2hlcmUgdGhlIGFydGlmYWN0IHdpbGwgYmUgbWlycm9yZWQKLQkgKiBAcGFyYW0gZGVzdGluYXRpb25EZXNjcmlwdG9yUHJvcGVydGllcyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgZm9yIHVzZSBpbiBjcmVhdGluZyB0aGUgcmVwb3NpdG9yJ3MgQXJ0aWZhY3REZXNjcmlwdG9yCi0JICogQHBhcmFtIGRlc3RpbmF0aW9uUmVwb3NpdG9yeVByb3BlcnRpZXMgYWRkaXRpb25hbCByZXBvc2l0b3J5IHNwZWNpZmljIHByb3BlcnRpZXMgZm9yIHVzZSBpbiBjcmVhdGluZyB0aGUgcmVwb3NpdG9yJ3MgQXJ0aWZhY3REZXNjcmlwdG9yCi0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCByZXF1ZXN0IG9iamVjdAotCSAqLwotCXB1YmxpYyBJQXJ0aWZhY3RSZXF1ZXN0IGNyZWF0ZU1pcnJvclJlcXVlc3QoSUFydGlmYWN0S2V5IGtleSwgSUFydGlmYWN0UmVwb3NpdG9yeSBkZXN0aW5hdGlvbiwgUHJvcGVydGllcyBkZXN0aW5hdGlvbkRlc2NyaXB0b3JQcm9wZXJ0aWVzLCBQcm9wZXJ0aWVzIGRlc3RpbmF0aW9uUmVwb3NpdG9yeVByb3BlcnRpZXMpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnRpZmFjdCByZXBvc2l0b3J5IG9mIHRoZSBnaXZlbiB0eXBlIGF0IAotCSAqIHRoZSBnaXZlbiBsb2NhdGlvbi4KLQkgKiA8cD4KLQkgKiBUaGUgcmVzdWx0aW5nIHJlcG9zaXRvcnkgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcmVwb3NpdG9yaWVzIHRyYWNrZWQgYnkKLQkgKiB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyLiBDbGllbnRzIG11c3QgbWFrZSBhIHN1YnNlcXVlbnQgY2FsbCB0byB7QGxpbmsgI3JlbW92ZVJlcG9zaXRvcnkoVVJMKX0KLQkgKiBpZiB0aGV5IGRvIG5vdCB3YW50IHRoZSByZXBvc2l0b3J5IG1hbmFnZXIgdG8gcmVtZW1iZXIgdGhlIHJlcG9zaXRvcnkgZm9yIHN1YnNlcXVlbnQKLQkgKiBsb2FkIGF0dGVtcHRzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIGZvciB0aGUgbmV3IHJlcG9zaXRvcnkKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IHJlcG9zaXRvcnkKLQkgKiBAcGFyYW0gdHlwZSB0aGUga2luZCBvZiByZXBvc2l0b3J5IHRvIGNyZWF0ZQotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzIHRoZSBwcm9wZXJ0aWVzIHRvIHNldCBvbiB0aGUgcmVwb3NpdG9yeQotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgcmVwb3NpdG9yeQotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIGlmIHRoZSByZXBvc2l0b3J5IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiAgUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+VGhlIHJlcG9zaXRvcnkgdHlwZSBpcyB1bmtub3duLjwvbGk+Ci0JICogPGxpPlRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBnaXZlbiByZXBvc2l0b3J5IGxvY2F0aW9uLjwvbGk+Ci0JICogPGxpPkEgcmVwb3NpdG9yeSBhbHJlYWR5IGV4aXN0cyBhdCB0aGF0IGxvY2F0aW9uLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBjcmVhdGVSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBNYXAgcHJvcGVydGllcykgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFydGlmYWN0IHJlcG9zaXRvcnkgbG9jYXRpb25zIGtub3duIHRvIHRoZSByZXBvc2l0b3J5IG1hbmFnZXIuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHRoZSByZXBvc2l0b3J5IG1hbmFnZXIgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgYSB2YWxpZCByZXBvc2l0b3J5Ci0JICogZXhpc3RzIGF0IGFueSBvZiB0aGUgcmV0dXJuZWQgbG9jYXRpb25zIGF0IGFueSBwYXJ0aWN1bGFyIG1vbWVudCBpbiB0aW1lLgotCSAqIEEgc3Vic2VxdWVudCBhdHRlbXB0IHRvIGxvYWQgYSByZXBvc2l0b3J5IGF0IGFueSBvZiB0aGUgZ2l2ZW4gbG9jYXRpb25zIG1heQotCSAqIG9yIG1heSBub3Qgc3VjY2VlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZmxhZ3MgYW4gaW50ZWdlciBiaXQtbWFzayBpbmRpY2F0aW5nIHdoaWNoIHJlcG9zaXRvcmllcyBzaG91bGQgYmUKLQkgKiByZXR1cm5lZC4gIDxjb2RlPlJFUE9TSVRPUklFU19BTEw8L2NvZGU+IGNhbiBiZSB1c2VkIGFzIHRoZSBtYXNrIHdoZW4KLQkgKiBhbGwgZW5hYmxlZCByZXBvc2l0b3JpZXMgc2hvdWxkIGJlIHJldHVybmVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2F0aW9ucyBvZiB0aGUgcmVwb3NpdG9yaWVzIG1hbmFnZWQgYnkgdGhpcyByZXBvc2l0b3J5IG1hbmFnZXIuCi0JICogCi0JICogQHNlZSAjUkVQT1NJVE9SSUVTX0FMTAotCSAqIEBzZWUgI1JFUE9TSVRPUklFU19TWVNURU0KLQkgKiBAc2VlICNSRVBPU0lUT1JJRVNfTk9OX1NZU1RFTQotCSAqIEBzZWUgI1JFUE9TSVRPUklFU19MT0NBTAotCSAqIEBzZWUgI1JFUE9TSVRPUklFU19ESVNBQkxFRAotCSAqLwotCXB1YmxpYyBVUkxbXSBnZXRLbm93blJlcG9zaXRvcmllcyhpbnQgZmxhZ3MpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXBvc2l0b3J5IGF0IHRoZSBnaXZlbiBVUkwsIAotCSAqIHdpdGhvdXQgbG9hZGluZyB0aGUgcmVwb3NpdG9yeS4KLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgc29tZSBwcm9wZXJ0aWVzIGZvciBhIHJlcG9zaXRvcnkgY2FuIG9ubHkgYmUKLQkgKiBkZXRlcm1pbmVkIHdoZW4gdGhhdCByZXBvc2l0b3J5IGlzIGxvYWRlZC4gIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogZm9yIHN1Y2ggcHJvcGVydGllcy4gIE9ubHkgdmFsdWVzIGZvciB0aGUgcHJvcGVydGllcyB0aGF0IGFyZSBhbHJlYWR5Ci0JICoga25vd24gYnkgYSByZXBvc2l0b3J5IG1hbmFnZXIgd2lsbCBiZSByZXR1cm5lZC4gCi0JICogPHA+Ci0JICogSWYgYSBjbGllbnQgd2lzaGVzIHRvIHJldHJpZXZlIGEgcHJvcGVydHkgdmFsdWUgZnJvbSBhIHJlcG9zaXRvcnkgCi0JICogcmVnYXJkbGVzcyBvZiB0aGUgY29zdCBvZiByZXRyaWV2aW5nIGl0LCB0aGUgY2xpZW50IHNob3VsZCBsb2FkIHRoZSAKLQkgKiByZXBvc2l0b3J5IGFuZCB0aGVuIHJldHJpZXZlIHRoZSBwcm9wZXJ0eSBmcm9tIHRoZSByZXBvc2l0b3J5IGl0c2VsZi4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIFVSTCBvZiB0aGUgcmVwb3NpdG9yeSBpbiBxdWVzdGlvbgotCSAqIEBwYXJhbSBrZXkgdGhlIFN0cmluZyBrZXkgb2YgdGhlIHByb3BlcnR5IGRlc2lyZWQKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHksIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSByZXBvc2l0b3J5Ci0JICogZG9lcyBub3QgZXhpc3QsIHRoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdCwgb3IgdGhlIHByb3BlcnR5IHZhbHVlIAotCSAqIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkIHdpdGhvdXQgbG9hZGluZyB0aGUgcmVwb3NpdG9yeS4KLQkgKiAKLQkgKiBAc2VlICNsb2FkUmVwb3NpdG9yeShVUkwsIElQcm9ncmVzc01vbml0b3IpCi0JICogQHNlZSBJUmVwb3NpdG9yeSNnZXRQcm9wZXJ0aWVzKCkKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlQcm9wZXJ0eShVUkwgbG9jYXRpb24sIFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5hYmxlbWVudCB2YWx1ZSBvZiBhIHJlcG9zaXRvcnkuICBEaXNhYmxlZCByZXBvc2l0b3JpZXMgYXJlIGtub3duCi0JICogdG8gdGhlIHJlcG9zaXRvcnkgbWFuYWdlciwgYnV0IGFyZSBuZXZlciB1c2VkIGluIHRoZSBjb250ZXh0IG9mIHByb3Zpc2lvbmluZwotCSAqIG9wZXJhdGlvbi4gRGlzYWJsZWQgcmVwb3NpdG9yaWVzIGFyZSB1c2VmdWwgYXMgYSBmb3JtIG9mIGJvb2ttYXJrIHRvIGluZGljYXRlIHRoYXQgYSAKLQkgKiByZXBvc2l0b3J5IGxvY2F0aW9uIGlzIG9mIGludGVyZXN0LCBidXQgbm90IGN1cnJlbnRseSB1c2VkLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBlbmFibGVtZW50IGlzIGEgcHJvcGVydHkgb2YgdGhlIHJlcG9zaXRvcnkgbWFuYWdlciBhbmQgbm90IGEgcHJvcGVydHkKLQkgKiBvZiB0aGUgYWZmZWN0ZWQgcmVwb3NpdG9yeS4gVGhlIGVuYWJsZW1lbnQgb2YgdGhlIHJlcG9zaXRvcnkgaXMgZGlzY2FyZGVkIHdoZW4gCi0JICogYSByZXBvc2l0b3J5IGlzIHJlbW92ZWQgZnJvbSB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkgd2hvc2UgZW5hYmxlbWVudCBpcyByZXF1ZXN0ZWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXBvc2l0b3J5IGlzIGVuYWJsZWQsIGFuZAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBpdCBpcyBub3QgZW5hYmxlZCwgb3IgaWYgdGhlIHJlcG9zaXRvcnkgbG9jYXRpb24gCi0JICogaXMgbm90IGtub3duIHRvIHRoZSByZXBvc2l0b3J5IG1hbmFnZXIuCi0JICogQHNlZSAjUkVQT1NJVE9SSUVTX0RJU0FCTEVECi0JICogQHNlZSAjc2V0RW5hYmxlZChVUkwsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKFVSTCBsb2NhdGlvbik7Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgcmVwb3NpdG9yeSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uICBUaGUgbG9jYXRpb24gaXMgZXhwZWN0ZWQgdG8gY29udGFpbiAKLQkgKiBkYXRhIHRoYXQgZGVzY3JpYmVzIGEgdmFsaWQgYXJ0aWZhY3QgcmVwb3NpdG9yeSBvZiBhIGtub3duIHR5cGUuICBJZiB0aGlzIG1hbmFnZXIKLQkgKiBhbHJlYWR5IGtub3dzIGEgcmVwb3NpdG9yeSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gdGhlbiB0aGF0IHJlcG9zaXRvcnkgaXMgcmV0dXJuZWQuCi0JICogPHA+Ci0JICogVGhlIHJlc3VsdGluZyByZXBvc2l0b3J5IGlzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyB0cmFja2VkIGJ5Ci0JICogdGhlIHJlcG9zaXRvcnkgbWFuYWdlci4gQ2xpZW50cyBtdXN0IG1ha2UgYSBzdWJzZXF1ZW50IGNhbGwgdG8ge0BsaW5rICNyZW1vdmVSZXBvc2l0b3J5KFVSTCl9Ci0JICogaWYgdGhleSBkbyBub3Qgd2FudCB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyIHRvIHJlbWVtYmVyIHRoZSByZXBvc2l0b3J5IGZvciBzdWJzZXF1ZW50Ci0JICogbG9hZCBhdHRlbXB0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBpbiB3aGljaCB0byBsb29rIGZvciBhIHJlcG9zaXRvcnkgZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGlzIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBhIHJlcG9zaXRvcnkgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gbG9jYXRpb24KLQkgKiBAdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiBpZiB0aGUgcmVwb3NpdG9yeSBjb3VsZCBub3QgYmUgY3JlYXRlZC4gIFJlYXNvbnMgaW5jbHVkZToKLQkgKiA8dWw+Ci0JICogPGxpPlRoZXJlIGlzIG5vIGV4aXN0aW5nIHJlcG9zaXRvcnkgYXQgdGhhdCBsb2NhdGlvbi48L2xpPgotCSAqIDxsaT5UaGUgcmVwb3NpdG9yeSBhdCB0aGF0IGxvY2F0aW9uIGNvdWxkIG5vdCBiZSByZWFkLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBsb2FkUmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlZnJlc2hlcyB0aGUgcmVwb3NpdG9yeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBVUkwuIFRoaXMgbWV0aG9kIGRpc2NhcmRzCi0JICogYW55IGNhY2hlZCBzdGF0ZSBoZWxkIGJ5IHRoZSByZXBvc2l0b3J5IG1hbmFnZXIgYW5kIHJlbG9hZHMgdGhlIHJlcG9zaXRvcnkKLQkgKiBjb250ZW50cy4gVGhlIHByb3ZpZGVkIHJlcG9zaXRvcnkgbG9jYXRpb24gbXVzdCBhbHJlYWR5IGJlIGtub3duIHRvIHRoZSByZXBvc2l0b3J5Ci0JICogbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSByZXBvc2l0b3J5IHRvIHJlZnJlc2gKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGlzIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBUaGUgcmVmcmVzaGVkIG1ldGFkYXRhIHJlcG9zaXRvcnkKLQkgKiBAdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiBpZiB0aGUgcmVwb3NpdG9yeSBjb3VsZCBub3QgYmUgY3JlYXRlZC4gIFJlYXNvbnMgaW5jbHVkZToKLQkgKiA8dWw+Ci0JICogPGxpPlRoZSBsb2NhdGlvbiBpcyBub3Qga25vd24gdG8gdGhlIHJlcG9zaXRvcnkgbWFuYWdlci48L2xpPgotCSAqIDxsaT5UaGVyZSBpcyBubyBleGlzdGluZyByZXBvc2l0b3J5IGF0IHRoYXQgbG9jYXRpb24uPC9saT4KLQkgKiA8bGk+VGhlIHJlcG9zaXRvcnkgYXQgdGhhdCBsb2NhdGlvbiBjb3VsZCBub3QgYmUgcmVhZC48L2xpPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIElBcnRpZmFjdFJlcG9zaXRvcnkgcmVmcmVzaFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGdpdmVuIHJlcG9zaXRvcnkgZnJvbSB0aGlzIG1hbmFnZXIuICBEbyBub3RoaW5nIGlmIHRoZSByZXBvc2l0b3J5Ci0JICogaXMgbm90IGN1cnJlbnRseSBtYW5hZ2VkLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkgdG8gcmVtb3ZlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhIHJlcG9zaXRvcnkgd2FzIHJlbW92ZWQsIGFuZCAKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZVJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGVuYWJsZW1lbnQgb2YgYSByZXBvc2l0b3J5LiBEaXNhYmxlZCByZXBvc2l0b3JpZXMgYXJlIGtub3duCi0JICogdG8gdGhlIHJlcG9zaXRvcnkgbWFuYWdlciwgYnV0IGFyZSBuZXZlciB1c2VkIGluIHRoZSBjb250ZXh0IG9mIHByb3Zpc2lvbmluZwotCSAqIG9wZXJhdGlvbi4gRGlzYWJsZWQgcmVwb3NpdG9yaWVzIGFyZSB1c2VmdWwgYXMgYSBmb3JtIG9mIGJvb2ttYXJrIHRvIGluZGljYXRlIHRoYXQgYSAKLQkgKiByZXBvc2l0b3J5IGxvY2F0aW9uIGlzIG9mIGludGVyZXN0LCBidXQgbm90IGN1cnJlbnRseSB1c2VkLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBlbmFibGVtZW50IGlzIGEgcHJvcGVydHkgb2YgdGhlIHJlcG9zaXRvcnkgbWFuYWdlciBhbmQgbm90IGEgcHJvcGVydHkKLQkgKiBvZiB0aGUgYWZmZWN0ZWQgcmVwb3NpdG9yeS4gVGhlIGVuYWJsZW1lbnQgb2YgdGhlIHJlcG9zaXRvcnkgaXMgZGlzY2FyZGVkIHdoZW4gCi0JICogYSByZXBvc2l0b3J5IGlzIHJlbW92ZWQgZnJvbSB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QgaWYgdGhlIGdpdmVuIHJlcG9zaXRvcnkgbG9jYXRpb24gaXMgbm90IGtub3duIHRvIHRoZQotCSAqIHJlcG9zaXRvcnkgbWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSByZXBvc2l0b3J5IHRvIGVuYWJsZSBvciBkaXNhYmxlCi0JICogQHBhcmFtIGVuYWJsZW1lbnQgPGNvZGU+dHJ1ZTwvY29kZT50byBlbmFibGUgdGhlIHJlcG9zaXRvcnksIGFuZAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0byBkaXNhYmxlIHRoZSByZXBvc2l0b3J5Ci0JICogQHNlZSAjUkVQT1NJVE9SSUVTX0RJU0FCTEVECi0JICogQHNlZSAjaXNFbmFibGVkKFVSTCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKFVSTCBsb2NhdGlvbiwgYm9vbGVhbiBlbmFibGVtZW50KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lBcnRpZmFjdFJlcXVlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvSUFydGlmYWN0UmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWQxMjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvSUFydGlmYWN0UmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBJQXJ0aWZhY3RSZXF1ZXN0IHsKLQotCXB1YmxpYyBJQXJ0aWZhY3RLZXkgZ2V0QXJ0aWZhY3RLZXkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgY2FsbCB0byB7QGxpbmsgQXJ0aWZhY3RSZXF1ZXN0I3BlcmZvcm0oSVByb2dyZXNzTW9uaXRvcil9LAotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHBlcmZvcm0gaGFzIG5ldmVyIGJlZW4gY2FsbGVkLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgcHJldmlvdXMgcGVyZm9ybSBjYWxsLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldFJlc3VsdCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNmUwN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JRmlsZUFydGlmYWN0UmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLQotcHVibGljIGludGVyZmFjZSBJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSBleHRlbmRzIElBcnRpZmFjdFJlcG9zaXRvcnkgewotCS8qKgotCSAqIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIGZ1bGwgbG9jYWwgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiAKLQkgKiBhcnRpZmFjdCBrZXkgdG8gdGhlIGdpdmVuIGtleSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVxdWVzdGVkIGFydGlmYWN0IG9yPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGF2YWlsYWJsZQotCSAqLwotCXB1YmxpYyBGaWxlIGdldEFydGlmYWN0RmlsZShJQXJ0aWZhY3RLZXkga2V5KTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhlIGxvY2FsIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gCi0JICogYXJ0aWZhY3QgZGVzY3JpcHRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVxdWVzdGVkIGRlc2NyaXB0b3Igb3I8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgYXZhaWxhYmxlCi0JICovCi0JcHVibGljIEZpbGUgZ2V0QXJ0aWZhY3RGaWxlKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lTdGF0ZWZ1bC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JU3RhdGVmdWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyZDdmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lTdGF0ZWZ1bC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotLyoqCi0gKiBJbXBsZW1lbnRpbmcgPGNvZGU+SVN0YXRlZnVsPC9jb2RlPiBhZGRzIHRoZSBhYmlsaXR5IHRvIHN0b3JlIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RhdGVmdWwgewotCi0JLyoqCi0JICogU2V0IHRoZSBzdGF0dXMuCi0JICogCi0JICogQHBhcmFtIHN0YXR1cyBpZiBzdGF0dXMgZXF1YWxzIG51bGwgPT4gZ2V0U3RhdHVzKCkuaXNPSwotCSAqLwotCXZvaWQgc2V0U3RhdHVzKElTdGF0dXMgc3RhdHVzKTsKLQotCS8qKgotCSAqIEdldCBzdGF0dXMuCi0JICogQHJldHVybiBzdGF0dXMKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL1Byb2Nlc3NpbmdTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvUHJvY2Vzc2luZ1N0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYxMjZlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvUHJvY2Vzc2luZ1N0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSogICBJQk0gQ29ycG9yYXRpb24gLSBjb250aW51aW5nIGRldmVsb3BtZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JU3RhdGVmdWw7Ci0KLS8qKgotICogUHJvY2Vzc2luZ1N0ZXBzIHByb2Nlc3MgdGhlIGRhdGEgd3JpdHRlbiB0byB0aGVtIGFuZCBwYXNzIHRoZSByZXN1bHRhbnQgZGF0YSBvbgotICogdG8gYSBjb25maWd1cmVkIGRlc3RpbmF0aW9uIHN0cmVhbS4gIFN0ZXBzIG1heSBtb25pdG9yIChlLmcuLCBjb3VudCkgdGhlIGRhdGEsIGNvbXB1dGUgaW5mb3JtYXRpb24gCi0gKiBhYm91dCB0aGUgZGF0YSAoZS5nLiwgY2hlY2tzdW0gb3IgaGFzaCkgb3IgdHJhbnNmb3JtIHRoZSBkYXRhIChlLmcuLCB1bnBhY2syMDApLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvY2Vzc2luZ1N0ZXAgZXh0ZW5kcyBPdXRwdXRTdHJlYW0gaW1wbGVtZW50cyBJU3RhdGVmdWwgewotCi0JcHJpdmF0ZSBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb247Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3I7Ci0JcHJpdmF0ZSBJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0KLQlwcm90ZWN0ZWQgUHJvY2Vzc2luZ1N0ZXAoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGlzIHByb2Nlc3Npbmcgc3RlcCBhY2NvcmRpbmcgdG8gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBnaXZlbiAKLQkgKiBkZXNjcmlwdG9yIGFuZCBjb250ZXh0LiAgQWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHRoaXMgc3RlcCBpcyByZWFkeSBmb3IgbGlua2luZyAKLQkgKiB3aXRoIG90aGVyIHN0ZXBzIG9yIG91dHB1dCBzdHJlYW1zCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgZGVzY3JpcHRpb24gb2YgdGhlIHN0ZXAKLQkgKiBAcGFyYW0gY29udGV4dCB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgc3RlcCBpcyBiZWluZyB1c2VkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgZGVzY3JpcHRvciwgSUFydGlmYWN0RGVzY3JpcHRvciBjb250ZXh0KSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gaGVyZSEKLQl9Ci0KLQkvKioKLQkgKiBMaW5rIHRoaXMgc3RlcCB3aXRoIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtIGFuZCBjb25maWd1cmUgdGhlIHN0ZXAgdG8gdXNlIHRoZSBnaXZlbgotCSAqIHByb2dyZXNzIG1vbml0b3IuICBBZnRlciBsaW5raW5nIHRoZSBzdGVwIGlzIHJlYWR5IHRvIGhhdmUgZGF0YSB3cml0dGVuIHRvIGl0LgotCSAqIEBwYXJhbSBkZXN0aW5hdGlvbiB0aGUgc3RyZWFtIGludG8gd2hpY2ggdG8gd3JpdGUgdGhlIHByb2Nlc3NlZCBkYXRhCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIHByb2dyZXNzIG1vbml0b3IgdG8gdXNlIGZvciByZXBvcnRpbmcgYWN0aXZpdHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBsaW5rKE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKLQkJdGhpcy5tb25pdG9yID0gbW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSBnaXZlbiBieXRlIGFuZCBwYXNzIHRoZSByZXN1bHQgb24gdG8gdGhlIGNvbmZpZ3VyZWQgZGVzdGluYXRpb24gc3RyZWFtCi0JICogQHBhcmFtIGIgdGhlIGJ5dGUgYmVpbmcgd3JpdHRlbgotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RoaW5nIHRvIGRvIGhlcmUhCi0JfQotCi0JLyoqIAotCSAqIEZsdXNoIGFueSB1bndyaXR0ZW4gZGF0YSBmcm9tIHRoaXMgc3RyZWFtLgotCSAqLwotCXB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuZmx1c2goKTsKLQkJaWYgKGRlc3RpbmF0aW9uICE9IG51bGwpCi0JCQlkZXN0aW5hdGlvbi5mbHVzaCgpOwotCX0KLQotCS8qKgotCSAqIENsb3NlIHRoaXMgc3RyZWFtIGFuZCwgaWYgdGhlIGNvbmZpZ3VyZWQgZGVzdGluYXRpb24gaXMgYSBQcm9jZXNzaW5nU3RlcCwgCi0JICogY2xvc2UgaXQgYXMgd2VsbC4gIFR5cGljYWxseSBhIGNoYWluIG9mIHN0ZXBzIHRlcm1pbmF0ZXMgaW4gYSBjb252ZW50aW9uYWwgCi0JICogb3V0cHV0IHN0cmVhbS4gIEltcGxlbWVudG9ycyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgZW5zdXJlIHRoZXkgc2V0IHRoZSAKLQkgKiBzdGF0dXMgb2YgdGhlIHN0ZXAuCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5jbG9zZSgpOwotCQlpZiAoZGVzdGluYXRpb24gaW5zdGFuY2VvZiBQcm9jZXNzaW5nU3RlcCkKLQkJCWRlc3RpbmF0aW9uLmNsb3NlKCk7Ci0JCW1vbml0b3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cygpIHsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGF0dXMoSVN0YXR1cyBzdGF0dXMpIHsKLQkJdGhpcy5zdGF0dXMgPSBzdGF0dXMgPT0gbnVsbCA/IFN0YXR1cy5PS19TVEFUVVMgOiBzdGF0dXM7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcm9ncmVzcyBtb25pdG9yLiAKLQkgKiBAcmV0dXJuIHRoZSBwcm9ncmVzcyBtb25pdG9yOyBtYXkgYmUgbnVsbAotCSAqLwotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJcmV0dXJuIG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBzdHJlYW0gdG8gd3JpdGUgdGhlIHByb2Nlc3NlZCBkYXRhIGludG8uCi0JICogCi0JICogQHJldHVybiBvdXRwdXQgc3RyZWFtIGZvciBwcm9jZXNzZWQgZGF0YQotCSAqLwotCXByb3RlY3RlZCBPdXRwdXRTdHJlYW0gZ2V0RGVzdGluYXRpb24oKSB7Ci0JCXJldHVybiBkZXN0aW5hdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGlzIHN0ZXAuICBUaGUgc3RhdHVzIHdpbGwgYmUgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogc3RlcCBoYXMgbm90IHlldCBleGVjdXRlZC4gSWYgdGhlIHN0ZXAgaGFzIGV4ZWN1dGVkIHRoZSByZXR1cm5lZCBzdGF0dXMKLQkgKiBpbmRpY2F0ZXMgdGhlIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgc3RlcC4KLQkgKiBAcGFyYW0gZGVlcCB3aGV0aGVyIG9yIG5vdCB0byBhZ2dyZWdhdGUgdGhlIHN0YXR1cyBvZiBhbnkgbGlua2VkIHN0ZXBzCi0JICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHN0YXR1cyAKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoYm9vbGVhbiBkZWVwKSB7Ci0JCWlmICghZGVlcCkKLQkJCXJldHVybiBnZXRTdGF0dXMoKTsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBzZXZlcml0eSA9IGNvbGxlY3RTdGF0dXMobGlzdCk7Ci0JCWlmIChzZXZlcml0eSA9PSBJU3RhdHVzLk9LKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCUlTdGF0dXNbXSByZXN1bHQgPSAoSVN0YXR1c1tdKSBsaXN0LnRvQXJyYXkobmV3IElTdGF0dXNbbGlzdC5zaXplKCldKTsKLQkJcmV0dXJuIG5ldyBNdWx0aVN0YXR1cyhBY3RpdmF0b3IuSUQsIHNldmVyaXR5LCByZXN1bHQsICJSZXN1bHQgb2YgcHJvY2Vzc2luZyBzdGVwcyIsIG51bGwpOwotCX0KLQotCXByaXZhdGUgaW50IGNvbGxlY3RTdGF0dXMoQXJyYXlMaXN0IGxpc3QpIHsKLQkJbGlzdC5hZGQoZ2V0U3RhdHVzKCkpOwotCQlpZiAoIShkZXN0aW5hdGlvbiBpbnN0YW5jZW9mIFByb2Nlc3NpbmdTdGVwKSkKLQkJCXJldHVybiBnZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpOwotCQlpbnQgcmVzdWx0ID0gKChQcm9jZXNzaW5nU3RlcCkgZGVzdGluYXRpb24pLmNvbGxlY3RTdGF0dXMobGlzdCk7Ci0JCS8vIFRPRE8gZ3JlYXRlciB0aGFuIHRlc3QgaGVyZSBpcyBhIGxpdHRsZSBicml0dGxlIGJ1dCBpdCBpcyB2ZXJ5IHVubGlrZWx5IHRoYXQgd2Ugd2lsbCBhZGQKLQkJLy8gYSBuZXcgc3RhdHVzIHNldmVyaXR5LgotCQlpZiAoZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSA+IHJlc3VsdCkKLQkJCXJldHVybiBnZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL1Byb2Nlc3NpbmdTdGVwRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL1Byb2Nlc3NpbmdTdGVwRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzIwZmIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3Npbmc7Ci0KLS8qKgotICogVGhlIGRlc2NyaXB0aW9uIG9mIGEgcHJvY2Vzc29yIHN0ZXAuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvY2Vzc29ySWQ7IC8vdGhlIG9wZXJhdGlvbiB0byBiZSBhcHBsaWVkIChlLmc6IHVucGFjaywgbWQ1LCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLCBldGMuKQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGRhdGE7IC8vZGF0YSByZXF1ZXN0ZWQgZm9yIHRoZSBwcm9jZXNzaW5nIChlZy4gZXhwZWN0ZWQgY2hlY2tzdW0pCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcXVpcmVkOyAvL3doZXRoZXIgdGhlIHN0ZXAgaXMgb3B0aW9uYWwgb3Igbm90Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBwcm9jZXNzaW5nIHN0ZXAgZGVzY3JpcHRpb24uCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3NvcklkCi0JICogQHBhcmFtIGRhdGEKLQkgKiBAcGFyYW0gcmVxdWlyZWQKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKFN0cmluZyBwcm9jZXNzb3JJZCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gcmVxdWlyZWQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wcm9jZXNzb3JJZCA9IHByb2Nlc3NvcklkOwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCQl0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9jZXNzb3JJZCgpIHsKLQkJcmV0dXJuIHByb2Nlc3NvcklkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHJlcXVpcmVkOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWZpbmFsIGludCBwcmltZSA9IDMxOwotCQlpbnQgcmVzdWx0ID0gMTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGRhdGEgPT0gbnVsbCkgPyAwIDogZGF0YS5oYXNoQ29kZSgpKTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHByb2Nlc3NvcklkID09IG51bGwpID8gMCA6IHByb2Nlc3NvcklkLmhhc2hDb2RlKCkpOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIChyZXF1aXJlZCA/IDEyMzEgOiAxMjM3KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZpbmFsIFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBvdGhlciA9IChQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IpIG9iajsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLmRhdGEgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIWRhdGEuZXF1YWxzKG90aGVyLmRhdGEpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAocHJvY2Vzc29ySWQgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLnByb2Nlc3NvcklkICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFwcm9jZXNzb3JJZC5lcXVhbHMob3RoZXIucHJvY2Vzc29ySWQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAocmVxdWlyZWQgIT0gb3RoZXIucmVxdWlyZWQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL1Byb2Nlc3NpbmdTdGVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL1Byb2Nlc3NpbmdTdGVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDAzODIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9Qcm9jZXNzaW5nU3RlcEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSogIElCTSAtIGNvbnRpbnVpbmcgZGV2ZWxvcG1lbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLQotLyoqCi0gKiBDcmVhdGVzIHByb2Nlc3Npbmcgc3RlcCBpbnN0YW5jZXMgZnJvbSBleHRlbnNpb25zIGFuZCBleGVjdXRlcyB0aGVtLgotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9DRVNTSU5HX1NURVBTX0VYVEVOU0lPTl9JRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZ1N0ZXBzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNoZWNrU3RhdHVzKE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLQkJaWYgKCEob3V0cHV0IGluc3RhbmNlb2YgUHJvY2Vzc2luZ1N0ZXApKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCXJldHVybiAoKFByb2Nlc3NpbmdTdGVwKSBvdXRwdXQpLmdldFN0YXR1cyh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgdGhhdCB3ZSBoYXZlIHByb2Nlc3NvcnMgZm9yIGFsbCB0aGUgc3RlcHMgaW4gdGhlIGdpdmVuIGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gZGVzY3JpcHRvciB0aGUgZGVzY3JpcHRvciB0byBjaGVjawotCSAqIEByZXR1cm4gd2hldGhlciBvciBub3QgcHJvY2Vzc29ycyBmb3IgYWxsIHRoZSBkZXNjcmlwdG9yJ3Mgc3RlcHMgYXJlIGluc3RhbGxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5Qcm9jZXNzKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBSZWdpc3RyeUZhY3RvcnkuZ2V0UmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUFJPQ0VTU0lOR19TVEVQU19FWFRFTlNJT05fSUQpOwotCQlpZiAocG9pbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gc3RlcHMgPSBkZXNjcmlwdG9yLmdldFByb2Nlc3NpbmdTdGVwcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0ZXBzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocG9pbnQuZ2V0RXh0ZW5zaW9uKHN0ZXBzW2ldLmdldFByb2Nlc3NvcklkKCkpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBQcm9jZXNzaW5nU3RlcFtdIGNyZWF0ZShQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycywgSUFydGlmYWN0RGVzY3JpcHRvciBjb250ZXh0KSB7Ci0JCVByb2Nlc3NpbmdTdGVwW10gcmVzdWx0ID0gbmV3IFByb2Nlc3NpbmdTdGVwW2Rlc2NyaXB0b3JzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspCi0JCQlyZXN1bHRbaV0gPSBjcmVhdGUoZGVzY3JpcHRvcnNbaV0sIGNvbnRleHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBQcm9jZXNzaW5nU3RlcCBjcmVhdGUoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElBcnRpZmFjdERlc2NyaXB0b3IgY29udGV4dCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBSZWdpc3RyeUZhY3RvcnkuZ2V0UmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSByZWdpc3RyeS5nZXRFeHRlbnNpb24oUFJPQ0VTU0lOR19TVEVQU19FWFRFTlNJT05fSUQsIGRlc2NyaXB0b3IuZ2V0UHJvY2Vzc29ySWQoKSk7Ci0JCUV4Y2VwdGlvbiBlcnJvcjsKLQkJaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWcgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQl0cnkgewotCQkJCU9iamVjdCBvYmplY3QgPSBjb25maWdbMF0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVByb2Nlc3NpbmdTdGVwIHN0ZXAgPSAoUHJvY2Vzc2luZ1N0ZXApIG9iamVjdDsKLQkJCQlzdGVwLmluaXRpYWxpemUoZGVzY3JpcHRvciwgY29udGV4dCk7Ci0JCQkJcmV0dXJuIHN0ZXA7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWVycm9yID0gZTsKLQkJCX0KLQkJfSBlbHNlCi0JCQllcnJvciA9IG5ldyBQcm9jZXNzaW5nU3RlcEhhbmRsZXJFeGNlcHRpb24oIkNvdWxkIG5vdCBnZXQgZXh0ZW5zaW9uICIgKyBQUk9DRVNTSU5HX1NURVBTX0VYVEVOU0lPTl9JRCArICIgZm9yIGRlc3JpcHRvciBpZCAiICsgZGVzY3JpcHRvci5nZXRQcm9jZXNzb3JJZCgpKTsKLQotCQlpbnQgc2V2ZXJpdHkgPSBkZXNjcmlwdG9yLmlzUmVxdWlyZWQoKSA/IElTdGF0dXMuRVJST1IgOiBJU3RhdHVzLklORk87Ci0JCVByb2Nlc3NpbmdTdGVwIHJlc3VsdCA9IG5ldyBFbXB0eVByb2Nlc3NpbmdTdGVwKCk7Ci0JCXJlc3VsdC5zZXRTdGF0dXMobmV3IFN0YXR1cyhzZXZlcml0eSwgQWN0aXZhdG9yLklELCAiQ291bGQgbm90IGluc3RhbnRpYXRlIHN0ZXA6IiArIGRlc2NyaXB0b3IuZ2V0UHJvY2Vzc29ySWQoKSwgZXJyb3IpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgT3V0cHV0U3RyZWFtIGNyZWF0ZUFuZExpbmsoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMsIElBcnRpZmFjdERlc2NyaXB0b3IgY29udGV4dCwgT3V0cHV0U3RyZWFtIG91dHB1dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChkZXNjcmlwdG9ycyA9PSBudWxsKQotCQkJcmV0dXJuIG91dHB1dDsKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcyA9IGNyZWF0ZShkZXNjcmlwdG9ycywgY29udGV4dCk7Ci0JCXJldHVybiBsaW5rKHN0ZXBzLCBvdXRwdXQsIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBPdXRwdXRTdHJlYW0gbGluayhQcm9jZXNzaW5nU3RlcFtdIHN0ZXBzLCBPdXRwdXRTdHJlYW0gb3V0cHV0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJT3V0cHV0U3RyZWFtIHByZXZpb3VzID0gb3V0cHV0OwotCQlmb3IgKGludCBpID0gc3RlcHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCVByb2Nlc3NpbmdTdGVwIHN0ZXAgPSBzdGVwc1tpXTsKLQkJCXN0ZXAubGluayhwcmV2aW91cywgbW9uaXRvcik7Ci0JCQlwcmV2aW91cyA9IHN0ZXA7Ci0JCX0KLQkJcmV0dXJuIHByZXZpb3VzOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgRW1wdHlQcm9jZXNzaW5nU3RlcCBleHRlbmRzIFByb2Nlc3NpbmdTdGVwIHsKLQkJLy8gSnVzdCB0byBob2xkIHRoZSBzdGF0dXMKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIFByb2Nlc3NpbmdTdGVwSGFuZGxlckV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBQcm9jZXNzaW5nU3RlcEhhbmRsZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLQkJCXN1cGVyKG1lc3NhZ2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQWJzdHJhY3RBcnRpZmFjdFJlcG9zaXRvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0Fic3RyYWN0QXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NGM4NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL2FydGlmYWN0L3JlcG9zaXRvcnkvQWJzdHJhY3RBcnRpZmFjdFJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuVVJMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmNvcmUucmVwb3NpdG9yeS5BYnN0cmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QXJ0aWZhY3RSZXBvc2l0b3J5IGV4dGVuZHMgQWJzdHJhY3RSZXBvc2l0b3J5IGltcGxlbWVudHMgSUFydGlmYWN0UmVwb3NpdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RBcnRpZmFjdFJlcG9zaXRvcnkoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbiwgVVJMIGxvY2F0aW9uLCBTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBwcm92aWRlciwgTWFwIHByb3BlcnRpZXMpIHsKLQkJc3VwZXIobmFtZSwgdHlwZSwgdmVyc2lvbiwgbG9jYXRpb24sIGRlc2NyaXB0aW9uLCBwcm92aWRlciwgcHJvcGVydGllcyk7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gY29udGFpbnMoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdEtleSBrZXkpOwotCi0JcHVibGljIGFic3RyYWN0IElTdGF0dXMgZ2V0QXJ0aWZhY3QoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSUFydGlmYWN0RGVzY3JpcHRvcltdIGdldEFydGlmYWN0RGVzY3JpcHRvcnMoSUFydGlmYWN0S2V5IGtleSk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSUFydGlmYWN0S2V5W10gZ2V0QXJ0aWZhY3RLZXlzKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSVN0YXR1cyBnZXRBcnRpZmFjdHMoSUFydGlmYWN0UmVxdWVzdFtdIHJlcXVlc3RzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJaWYgKCFpc01vZGlmaWFibGUoKSkKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLnJlcG9SZWFkT25seSwgZ2V0TG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpKSkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREZXNjcmlwdG9yKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlhc3NlcnRNb2RpZmlhYmxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRGVzY3JpcHRvcnMoSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzKSB7Ci0JCWFzc2VydE1vZGlmaWFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEZXNjcmlwdG9yKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlhc3NlcnRNb2RpZmlhYmxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRGVzY3JpcHRvcihJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCWFzc2VydE1vZGlmaWFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7Ci0JCWFzc2VydE1vZGlmaWFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKHRoaXMgPT0gbykgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKCEobyBpbnN0YW5jZW9mIEFic3RyYWN0QXJ0aWZhY3RSZXBvc2l0b3J5KSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChVUkxVdGlsLnNhbWVVUkwoZ2V0TG9jYXRpb24oKSwgKChBYnN0cmFjdEFydGlmYWN0UmVwb3NpdG9yeSkgbykuZ2V0TG9jYXRpb24oKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAodGhpcy5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkuaGFzaENvZGUoKSkgKiA4NzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9JQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTdmNTBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L0lBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkgewotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnRpZmFjdCByZXBvc2l0b3J5IG9mIHRoZSBnaXZlbiB0eXBlIGF0IAotCSAqIHRoZSBnaXZlbiBsb2NhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIGZvciB0aGUgbmV3IHJlcG9zaXRvcnkKLQkgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSBvZiB0aGUgbmV3IHJlcG9zaXRvcnkKLQkgKiBAcGFyYW0gdHlwZSB0aGUga2luZCBvZiByZXBvc2l0b3J5IHRvIGNyZWF0ZQotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzIHRoZSBwcm9wZXJ0aWVzIHRvIHNldCBvbiB0aGUgcmVwb3NpdG9yeQotCSAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgcmVwb3NpdG9yeQotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIGlmIHRoZSByZXBvc2l0b3J5IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiAgUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+VGhlIHJlcG9zaXRvcnkgdHlwZSBpcyB1bmtub3duLjwvbGk+Ci0JICogPGxpPlRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBnaXZlbiByZXBvc2l0b3J5IGxvY2F0aW9uLjwvbGk+Ci0JICogPGxpPkEgcmVwb3NpdG9yeSBhbHJlYWR5IGV4aXN0cyBhdCB0aGF0IGxvY2F0aW9uLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBjcmVhdGUoVVJMIGxvY2F0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIE1hcCBwcm9wZXJ0aWVzKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogTG9hZHMgdGhlIHJlcG9zaXRvcnkgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLiAgVGhlIGxvY2F0aW9uIGlzIGV4cGVjdGVkIHRvIGNvbnRhaW4gCi0JICogZGF0YSB0aGF0IGRlc2NyaWJlcyBhIHZhbGlkIGFydGlmYWN0IHJlcG9zaXRvcnkgb2YgYSBrbm93biB0eXBlLiAgSWYgdGhpcyBtYW5hZ2VyCi0JICogYWxyZWFkeSBrbm93cyBhIHJlcG9zaXRvcnkgYXQgdGhlIGdpdmVuIGxvY2F0aW9uIHRoZW4gdGhhdCByZXBvc2l0b3J5IGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gaW4gd2hpY2ggdG8gbG9vayBmb3IgYSByZXBvc2l0b3J5IGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gYSByZXBvc2l0b3J5IG9iamVjdCBmb3IgdGhlIGdpdmVuIGxvY2F0aW9uCi0JICogQHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gaWYgdGhlIHJlcG9zaXRvcnkgY291bGQgbm90IGJlIGNyZWF0ZWQuICBSZWFzb25zIGluY2x1ZGU6Ci0JICogPHVsPgotCSAqIDxsaT5UaGVyZSBpcyBubyBleGlzdGluZyByZXBvc2l0b3J5IGF0IHRoYXQgbG9jYXRpb24uPC9saT4KLQkgKiA8bGk+VGhlIHJlcG9zaXRvcnkgYXQgdGhhdCBsb2NhdGlvbiBjb3VsZCBub3QgYmUgcmVhZC48L2xpPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIElBcnRpZmFjdFJlcG9zaXRvcnkgbG9hZChVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L1NpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9hcnRpZmFjdC9yZXBvc2l0b3J5L1NpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM5Mzg2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvYXJ0aWZhY3QvcmVwb3NpdG9yeS9TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5zaW1wbGUuU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5zaW1wbGUuU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5SU87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5IGltcGxlbWVudHMgSUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkgewotCi0JcHVibGljIElBcnRpZmFjdFJlcG9zaXRvcnkgbG9hZChVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWZpbmFsIFN0cmluZyBQUk9UT0NPTF9GSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JCWxvbmcgdGltZSA9IDA7Ci0JCWZpbmFsIFN0cmluZyBkZWJ1Z01zZyA9ICJSZXN0b3JpbmcgYXJ0aWZhY3QgcmVwb3NpdG9yeSAiOyAvLyROT04tTkxTLTEkCi0JCWlmIChUcmFjaW5nLkRFQlVHX01FVEFEQVRBX1BBUlNJTkcpIHsKLQkJCVRyYWNpbmcuZGVidWcoZGVidWdNc2cgKyBsb2NhdGlvbik7Ci0JCQl0aW1lID0gLVN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCUZpbGUgbG9jYWxGaWxlID0gbnVsbDsKLQkJYm9vbGVhbiBsb2NhbCA9IGZhbHNlOwotCQl0cnkgewotCQkJU3ViTW9uaXRvciBzdWIgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgMzAwKTsKLQkJCU91dHB1dFN0cmVhbSBhcnRpZmFjdHMgPSBudWxsOwotCQkJLy8gdHJ5IHdpdGggY29tcHJlc3NlZAotCQkJYm9vbGVhbiBjb21wcmVzcyA9IHRydWU7Ci0JCQlpZiAoUFJPVE9DT0xfRklMRS5lcXVhbHMobG9jYXRpb24uZ2V0UHJvdG9jb2woKSkpIHsKLQkJCQlsb2NhbCA9IHRydWU7Ci0JCQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5LmdldEFjdHVhbExvY2F0aW9uKGxvY2F0aW9uLCB0cnVlKS5nZXRQYXRoKCkpOwotCQkJCWlmICghbG9jYWxGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWxvY2FsRmlsZSA9IG5ldyBGaWxlKFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeS5nZXRBY3R1YWxMb2NhdGlvbihsb2NhdGlvbiwgZmFsc2UpLmdldFBhdGgoKSk7Ci0JCQkJCWNvbXByZXNzID0gZmFsc2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQkvL2Rvd25sb2FkIHRvIGxvY2FsIHRlbXAgZmlsZQotCQkJCWxvY2FsRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImFydGlmYWN0cyIsICIueG1sIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXRyeSB7Ci0JCQkJCWFydGlmYWN0cyA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShsb2NhbEZpbGUpKTsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBnZXRUcmFuc3BvcnQoKS5kb3dubG9hZChTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QWN0dWFsTG9jYXRpb24obG9jYXRpb24sIGNvbXByZXNzKS50b0V4dGVybmFsRm9ybSgpLCBhcnRpZmFjdHMsIHN1Yi5uZXdDaGlsZCgxMDApKTsKLQkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0JCQkJCQkvLyByZXRyeSB1bmNvbXByZXNzZWQKLQkJCQkJCWNvbXByZXNzID0gZmFsc2U7Ci0JCQkJCQlzdGF0dXMgPSBnZXRUcmFuc3BvcnQoKS5kb3dubG9hZChTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QWN0dWFsTG9jYXRpb24obG9jYXRpb24sIGNvbXByZXNzKS50b0V4dGVybmFsRm9ybSgpLCBhcnRpZmFjdHMsIHN1Yi5uZXdDaGlsZCgxMDApKTsKLQkJCQkJCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCQkJCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQsIHN0YXR1cy5nZXRNZXNzYWdlKCksIG51bGwpKTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWlmIChhcnRpZmFjdHMgIT0gbnVsbCkKLQkJCQkJCWFydGlmYWN0cy5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCUlucHV0U3RyZWFtIGRlc2NyaXB0b3JTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlkZXNjcmlwdG9yU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShsb2NhbEZpbGUpKTsKLQkJCQlpZiAoY29tcHJlc3MpIHsKLQkJCQkJVVJMIGFjdHVhbEZpbGUgPSBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QWN0dWFsTG9jYXRpb24obG9jYXRpb24sIGZhbHNlKTsKLQkJCQkJSmFySW5wdXRTdHJlYW0gakluU3RyZWFtID0gbmV3IEphcklucHV0U3RyZWFtKGRlc2NyaXB0b3JTdHJlYW0pOwotCQkJCQlKYXJFbnRyeSBqYXJFbnRyeSA9IGpJblN0cmVhbS5nZXROZXh0SmFyRW50cnkoKTsKLQkJCQkJU3RyaW5nIGZpbGVuYW1lID0gbmV3IFBhdGgoYWN0dWFsRmlsZS5nZXRGaWxlKCkpLmxhc3RTZWdtZW50KCk7Ci0JCQkJCXdoaWxlIChqYXJFbnRyeSAhPSBudWxsICYmICEoZmlsZW5hbWUuZXF1YWxzKGphckVudHJ5LmdldE5hbWUoKSkpKSB7Ci0JCQkJCQlqYXJFbnRyeSA9IGpJblN0cmVhbS5nZXROZXh0SmFyRW50cnkoKTsKLQkJCQkJfQotCQkJCQlpZiAoamFyRW50cnkgPT0gbnVsbCkgewotCQkJCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigiUmVwb3NpdG9yeSBub3QgZm91bmQgaW4gIiArIGFjdHVhbEZpbGUuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWRlc2NyaXB0b3JTdHJlYW0gPSBqSW5TdHJlYW07Ci0JCQkJfQotCQkJCVNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUlPIGlvID0gbmV3IFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUlPKCk7Ci0JCQkJU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5IHJlc3VsdCA9IChTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkpIGlvLnJlYWQobG9jYWxGaWxlLnRvVVJMKCksIGRlc2NyaXB0b3JTdHJlYW0sIHN1Yi5uZXdDaGlsZCgxMDApKTsKLQkJCQlyZXN1bHQuaW5pdGlhbGl6ZUFmdGVyTG9hZChsb2NhdGlvbik7Ci0JCQkJaWYgKFRyYWNpbmcuREVCVUdfTUVUQURBVEFfUEFSU0lORykgewotCQkJCQl0aW1lICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlUcmFjaW5nLmRlYnVnKGRlYnVnTXNnICsgInRpbWUgKG1zKTogIiArIHRpbWUpOyAvLyROT04tTkxTLTEkIAotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZGVzY3JpcHRvclN0cmVhbSAhPSBudWxsKQotCQkJCQlkZXNjcmlwdG9yU3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuaW9fZmFpbGVkUmVhZCwgbG9jYXRpb24pOwotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5ELCBtc2csIGUpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLmlvX2ZhaWxlZFJlYWQsIGxvY2F0aW9uKTsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0ZBSUxFRF9SRUFELCBtc2csIGUpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICghbG9jYWwgJiYgbG9jYWxGaWxlICE9IG51bGwgJiYgIWxvY2FsRmlsZS5kZWxldGUoKSkKLQkJCQlsb2NhbEZpbGUuZGVsZXRlT25FeGl0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBjcmVhdGUoVVJMIGxvY2F0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5KG5hbWUsIGxvY2F0aW9uLCBwcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwcml2YXRlIFRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoKSB7Ci0JCXJldHVybiBFQ0ZUcmFuc3BvcnQuZ2V0SW5zdGFuY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkZWI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjElRm91bmRhdGlvbi0xLjEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmYmU3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NTViNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLSNUaHUgU2VwIDEzIDIyOjAyOjQxIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjFiNmFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1Nzo0NCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYWMzYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvbnNvbGUuQWN0aXZhdG9yCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29uc29sZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzIgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtjb21tb249c3BsaXQsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5jb25maWd1cmF0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeSwKLSBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5jb25zb2xlO3ZlcnNpb249IjEuMC4wIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQ7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlcjt2ZXJzaW9uPSIxLjEuMCIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuNC4wIiwKLSBvcmcub3NnaS51dGlsLnRyYWNrZXI7dmVyc2lvbj0iMS4zLjMiCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMSwKLSBKMlNFLTEuNApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvUHJvdmlzaW9uaW5nIGNvbnNvbGUubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvUHJvdmlzaW9uaW5nIGNvbnNvbGUubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGQ4NzY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL1Byb3Zpc2lvbmluZyBjb25zb2xlLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9ImQ6XHRtcFxzZWxmaG9zdGluZyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0X2F1dG9fc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPGludEF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfc3RhcnRfbGV2ZWwiIHZhbHVlPSI0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLWNvbnNvbGUgLWNvbnNvbGVsb2ciLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InNob3dfc2VsZWN0ZWRfb25seSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idGFyZ2V0X2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCoxLjAuMTAwLnYyMDA4MDMwM0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcyozLjIuMjAwLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQsamF2YXguc2VydmxldCoyLjQuMC52MjAwNzExMDIxMDMwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeSozLjIuMjAwLnYyMDA3MDcxN0BkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSozLjQuMC52MjAwODAzMDNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuam9icyozLjMuMTAwLnYyMDA4MDIyNEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5uZXQqMS4wLjEwMC5JMjAwODAyMjZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uKjMuNC4wLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyozLjEuMjAwLnYyMDA3MTIwM0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaSozLjQuMC52MjAwODAzMDRAOixvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5hdXRoKjMuMi4xMDAudjIwMDcwNTAyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5KjMuNC4wLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSozLjMuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4qMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuc2F0NGoucGIqMi4wLjAudjIwMDgwMzA3QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyKjEuNi4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZioxLjQuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5zYXQ0ai5jb3JlKjIuMC4wLnYyMDA4MDMwN0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyKjIuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciowLjEuMC5xdWFsaWZpZXJAMTp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5KjEuMy4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjgzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWJjM2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IFByb3Zpc2lvbmluZyBDb25zb2xlCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29uc29sZS9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvbnNvbGUvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4Mzk4YTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29uc29sZS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvbnNvbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXJDdXN0b21pemVyOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yLCBTZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXIgewotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfTkFNRSA9ICJvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5jb25zb2xlLkNvbW1hbmRQcm92aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLQlwcml2YXRlIFNlcnZpY2VUcmFja2VyIHByb2ZpbGVUcmFja2VyOwotCXByaXZhdGUgUHJvdkNvbW1hbmRQcm92aWRlciBwcm92aWRlcjsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcHJvdmlkZXJSZWdpc3RyYXRpb24gPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCXB1YmxpYyBBY3RpdmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBjb250ZXh0OwotCQlib29sZWFuIHJlZ2lzdGVyQ29tbWFuZHMgPSB0cnVlOwotCQl0cnkgewotCQkJQ2xhc3MuZm9yTmFtZShQUk9WSURFUl9OQU1FKTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZWdpc3RlckNvbW1hbmRzID0gZmFsc2U7Ci0JCX0KLQotCQlpZiAocmVnaXN0ZXJDb21tYW5kcykgewotCQkJcHJvZmlsZVRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoY29udGV4dCwgSVByb2ZpbGVSZWdpc3RyeS5jbGFzcy5nZXROYW1lKCksIHRoaXMpOwotCQkJcHJvZmlsZVRyYWNrZXIub3BlbigpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwcm9maWxlVHJhY2tlci5jbG9zZSgpOwotCQlpZiAocHJvdmlkZXJSZWdpc3RyYXRpb24gIT0gbnVsbCkKLQkJCXByb3ZpZGVyUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLQkJcHJvdmlkZXJSZWdpc3RyYXRpb24gPSBudWxsOwotCQlBY3RpdmF0b3IuY29udGV4dCA9IG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBhZGRpbmdTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlKSB7Ci0JCUJ1bmRsZUNvbnRleHQgY29udGV4dCA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCk7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcmVnaXN0cnkgPSAoSVByb2ZpbGVSZWdpc3RyeSkgY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCXByb3ZpZGVyID0gbmV3IFByb3ZDb21tYW5kUHJvdmlkZXIoY29udGV4dC5nZXRQcm9wZXJ0eSgiZWNsaXBzZS5wMi5wcm9maWxlIiksIHJlZ2lzdHJ5KTsKLQkJcHJvdmlkZXJSZWdpc3RyYXRpb24gPSBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShQUk9WSURFUl9OQU1FLCBwcm92aWRlciwgbnVsbCk7Ci0JCXJldHVybiByZWdpc3RyeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZmllZFNlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UsIE9iamVjdCBzZXJ2aWNlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJaWYgKHByb3ZpZGVyUmVnaXN0cmF0aW9uICE9IG51bGwpCi0JCQlwcm92aWRlclJlZ2lzdHJhdGlvbi51bnJlZ2lzdGVyKCk7Ci0JCXByb3ZpZGVyUmVnaXN0cmF0aW9uID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvbnNvbGUvUHJvdkNvbW1hbmRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29uc29sZS9Qcm92Q29tbWFuZFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjZlZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29uc29sZS9Qcm92Q29tbWFuZFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAlCYW5kIFhJIC0gYWRkIG1vcmUgY29tbWFuZHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29uc29sZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5LklVUHJvcGVydHlRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuY29uc29sZS5Db21tYW5kSW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuY29uc29sZS5Db21tYW5kUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotLyoqCi0gKiBBbiBPU0dpIGNvbnNvbGUgY29tbWFuZCBwcm92aWRlciB0aGF0IGFkZHMgdmFyaW91cyBjb21tYW5kcyBmb3IgaW50ZXJhY3RpbmcKLSAqIHdpdGggdGhlIHByb3Zpc2lvbmluZyBzeXN0ZW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm92Q29tbWFuZFByb3ZpZGVyIGltcGxlbWVudHMgQ29tbWFuZFByb3ZpZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lMRENBUkRfQU5ZID0gIioiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0xJTkUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLy8JcHJpdmF0ZSBQcm9maWxlIHByb2ZpbGU7Ci0KLQlwdWJsaWMgUHJvdkNvbW1hbmRQcm92aWRlcihTdHJpbmcgcHJvZmlsZUlkLCBJUHJvZmlsZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCS8vIGxvb2sgdXAgdGhlIHByb2ZpbGUgd2UgYXJlIGN1cnJlbnRseSBydW5uaW5nIGFuZCB1c2UgaXQgYXMgdGhlCi0JCS8vIGRlZmF1bHQuCi0JCS8vIFRPRE8gZGVmaW5lIGEgd2F5IHRvIHNwZWMgdGhlIGRlZmF1bHQgcHJvZmlsZSB0byBtYW5hZ2UKLQkJLy8JCWlmIChwcm9maWxlSWQgIT0gbnVsbCkgewotCQkvLwkJCXByb2ZpbGUgPSByZWdpc3RyeS5nZXRQcm9maWxlKHByb2ZpbGVJZCk7Ci0JCS8vCQkJaWYgKHByb2ZpbGUgIT0gbnVsbCkKLQkJLy8JCQkJcmV0dXJuOwotCQkvLwkJfQotCQkvLwkJLy8gQSBkZWZhdWx0IHdhcyBub3QgZGVmaW5lZCBzbyBtYW5hZ2UgdGhlIGZpcnN0IHByb2ZpbGUgd2UgY2FuIGZpbmQKLQkJLy8JCVByb2ZpbGVbXSBwcm9maWxlcyA9IHJlZ2lzdHJ5LmdldFByb2ZpbGVzKCk7Ci0JCS8vCQlpZiAocHJvZmlsZXMubGVuZ3RoID4gMCkKLQkJLy8JCQlwcm9maWxlID0gcHJvZmlsZXNbMF07Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG1ldGFkYXRhIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHZvaWQgX3Byb3ZhZGRyZXBvKENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlcikgewotCQlTdHJpbmcgdXJsU3RyaW5nID0gaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCk7Ci0JCWlmICh1cmxTdHJpbmcgPT0gbnVsbCkgewotCQkJaW50ZXJwcmV0ZXIucHJpbnQoIlJlcG9zaXRvcnkgbG9jYXRpb24gbXVzdCBiZSBwcm92aWRlZCIpOwotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVVSTCByZXBvVVJMID0gdG9VUkwoaW50ZXJwcmV0ZXIsIHVybFN0cmluZyk7Ci0JCWlmIChyZXBvVVJMID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChQcm92aXNpb25pbmdIZWxwZXIuYWRkTWV0YWRhdGFSZXBvc2l0b3J5KHJlcG9VUkwpID09IG51bGwpCi0JCQlpbnRlcnByZXRlci5wcmludGxuKCJVbmFibGUgdG8gYWRkIHJlcG9zaXRvcnk6ICIgKyByZXBvVVJMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBfcHJvdmRlbHJlcG8oQ29tbWFuZEludGVycHJldGVyIGludGVycHJldGVyKSB7Ci0JCVN0cmluZyB1cmxTdHJpbmcgPSBpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKTsKLQkJaWYgKHVybFN0cmluZyA9PSBudWxsKSB7Ci0JCQlpbnRlcnByZXRlci5wcmludCgiUmVwb3NpdG9yeSBsb2NhdGlvbiBtdXN0IGJlIHByb3ZpZGVkIik7Ci0JCQlpbnRlcnByZXRlci5wcmludGxuKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVVJMIHJlcG9VUkwgPSB0b1VSTChpbnRlcnByZXRlciwgdXJsU3RyaW5nKTsKLQkJaWYgKHJlcG9VUkwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJUHJvdmlzaW9uaW5nSGVscGVyLnJlbW92ZU1ldGFkYXRhUmVwb3NpdG9yeShyZXBvVVJMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBfcHJvdmFkZGFydGlmYWN0cmVwbyhDb21tYW5kSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIpIHsKLQkJU3RyaW5nIHVybFN0cmluZyA9IGludGVycHJldGVyLm5leHRBcmd1bWVudCgpOwotCQlpZiAodXJsU3RyaW5nID09IG51bGwpIHsKLQkJCWludGVycHJldGVyLnByaW50KCJSZXBvc2l0b3J5IGxvY2F0aW9uIG11c3QgYmUgcHJvdmlkZWQiKTsKLQkJCWludGVycHJldGVyLnByaW50bG4oKTsKLQkJCXJldHVybjsKLQkJfQotCQlVUkwgcmVwb1VSTCA9IHRvVVJMKGludGVycHJldGVyLCB1cmxTdHJpbmcpOwotCQlpZiAocmVwb1VSTCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoUHJvdmlzaW9uaW5nSGVscGVyLmFkZEFydGlmYWN0UmVwb3NpdG9yeShyZXBvVVJMKSA9PSBudWxsKQotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigiVW5hYmxlIHRvIGFkZCByZXBvc2l0b3J5OiAiICsgcmVwb1VSTCk7Ci0JfQotCi0JcHVibGljIHZvaWQgX3Byb3ZkZWxhcnRpZmFjdHJlcG8oQ29tbWFuZEludGVycHJldGVyIGludGVycHJldGVyKSB7Ci0JCVN0cmluZyB1cmxTdHJpbmcgPSBpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKTsKLQkJaWYgKHVybFN0cmluZyA9PSBudWxsKSB7Ci0JCQlpbnRlcnByZXRlci5wcmludCgiUmVwb3NpdG9yeSBsb2NhdGlvbiBtdXN0IGJlIHByb3ZpZGVkIik7Ci0JCQlpbnRlcnByZXRlci5wcmludGxuKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJVVJMIHJlcG9VUkwgPSB0b1VSTChpbnRlcnByZXRlciwgdXJsU3RyaW5nKTsKLQkJaWYgKHJlcG9VUkwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJUHJvdmlzaW9uaW5nSGVscGVyLnJlbW92ZUFydGlmYWN0UmVwb3NpdG9yeShyZXBvVVJMKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnN0YWxsIGEgZ2l2ZW4gSVUgdG8gYSBnaXZlbiBwcm9maWxlIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIF9wcm92aW5zdGFsbChDb21tYW5kSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIpIHsKLQkJU3RyaW5nIGl1ID0gaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCk7Ci0JCVN0cmluZyB2ZXJzaW9uID0gaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCk7Ci0JCVN0cmluZyBwcm9maWxlSWQgPSBpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKTsKLQkJaWYgKHByb2ZpbGVJZCA9PSBudWxsIHx8IHByb2ZpbGVJZC5lcXVhbHMoInRoaXMiKSkKLQkJCXByb2ZpbGVJZCA9IElQcm9maWxlUmVnaXN0cnkuU0VMRjsKLQkJaWYgKGl1ID09IG51bGwgfHwgdmVyc2lvbiA9PSBudWxsIHx8IHByb2ZpbGVJZCA9PSBudWxsKSB7Ci0JCQlpbnRlcnByZXRlci5wcmludGxuKCJJbnN0YWxsYWJsZSB1bml0IGlkLCB2ZXJzaW9uLCBhbmQgcHJvZmlsZSBJZCBtdXN0IGJlIHByb3ZpZGVkIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0YXR1cyBzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXMgPSBQcm92aXNpb25pbmdIZWxwZXIuaW5zdGFsbChpdSwgdmVyc2lvbiwgUHJvdmlzaW9uaW5nSGVscGVyLmdldFByb2ZpbGUocHJvZmlsZUlkKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlpbnRlcnByZXRlci5wcmludGxuKCJpbnN0YWxsYXRpb24gZmFpbGVkICIpOwotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAocy5pc09LKCkpCi0JCQlpbnRlcnByZXRlci5wcmludGxuKCJpbnN0YWxsYXRpb24gY29tcGxldGUiKTsKLQkJZWxzZQotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigiaW5zdGFsbGF0aW9uIGZhaWxlZCAiICsgcy5nZXRNZXNzYWdlKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBwcm9maWxlIGdpdmVuIGFuIGlkLCBsb2NhdGlvbiwgYW5kIGZsYXZvcgotCSAqLwotCXB1YmxpYyB2b2lkIF9wcm92YWRkcHJvZmlsZShDb21tYW5kSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIpIHsKLQkJU3RyaW5nIHByb2ZpbGVJZCA9IGludGVycHJldGVyLm5leHRBcmd1bWVudCgpOwotCQlTdHJpbmcgbG9jYXRpb24gPSBpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKTsKLQkJU3RyaW5nIGZsYXZvciA9IGludGVycHJldGVyLm5leHRBcmd1bWVudCgpOwotCQlpZiAocHJvZmlsZUlkID09IG51bGwgfHwgbG9jYXRpb24gPT0gbnVsbCB8fCBmbGF2b3IgPT0gbnVsbCkgewotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigiSWQsIGxvY2F0aW9uLCBhbmQgZmxhdm9yIG11c3QgYmUgcHJvdmlkZWQiKTsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgZW52aXJvbm1lbnRzID0gaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCk7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQlwcm9wcy5zZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0lOU1RBTExfRk9MREVSLCBsb2NhdGlvbik7Ci0JCXByb3BzLnNldFByb3BlcnR5KElQcm9maWxlLlBST1BfRkxBVk9SLCBmbGF2b3IpOwotCQlpZiAoZW52aXJvbm1lbnRzICE9IG51bGwpCi0JCQlwcm9wcy5zZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0VOVklST05NRU5UUywgZW52aXJvbm1lbnRzKTsKLQotCQl0cnkgewotCQkJUHJvdmlzaW9uaW5nSGVscGVyLmFkZFByb2ZpbGUocHJvZmlsZUlkLCBwcm9wcyk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlpbnRlcnByZXRlci5wcmludGxuKCJhZGQgcHJvZmlsZSBmYWlsZWQgIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgYSBwcm9maWxlIGdpdmVuIGFuIGlkLCBsb2NhdGlvbiwgYW5kIGZsYXZvcgotCSAqLwotCXB1YmxpYyB2b2lkIF9wcm92ZGVscHJvZmlsZShDb21tYW5kSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIpIHsKLQkJU3RyaW5nIHByb2ZpbGVJZCA9IGludGVycHJldGVyLm5leHRBcmd1bWVudCgpOwotCQlpZiAocHJvZmlsZUlkID09IG51bGwpIHsKLQkJCWludGVycHJldGVyLnByaW50bG4oIklkIG11c3QgYmUgcHJvdmlkZWQiKTsKLQkJCXJldHVybjsKLQkJfQotCQlQcm92aXNpb25pbmdIZWxwZXIucmVtb3ZlUHJvZmlsZShwcm9maWxlSWQpOwotCX0KLQotCS8qKgotCSAqIExpc3RzIHRoZSBpbnN0YWxsYWJsZSB1bml0cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBVUkwsIGlkLCBhbmQvb3IgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaW50ZXJwcmV0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBfcHJvdmxpdShDb21tYW5kSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIpIHsKLQkJU3RyaW5nIHVybFN0cmluZyA9IHByb2Nlc3NBcmd1bWVudChpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKSk7Ci0JCVN0cmluZyBpZCA9IHByb2Nlc3NBcmd1bWVudChpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKSk7Ci0JCVN0cmluZyB2ZXJzaW9uID0gcHJvY2Vzc0FyZ3VtZW50KGludGVycHJldGVyLm5leHRBcmd1bWVudCgpKTsKLQkJVVJMIHJlcG9VUkwgPSBudWxsOwotCQlpZiAodXJsU3RyaW5nICE9IG51bGwgJiYgIXVybFN0cmluZy5lcXVhbHMoV0lMRENBUkRfQU5ZKSkKLQkJCXJlcG9VUkwgPSB0b1VSTChpbnRlcnByZXRlciwgdXJsU3RyaW5nKTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIHVuaXRzID0gc29ydChQcm92aXNpb25pbmdIZWxwZXIuZ2V0SW5zdGFsbGFibGVVbml0cyhyZXBvVVJMLCBuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkoaWQsIG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbikpLCBudWxsKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdW5pdHMubGVuZ3RoOyBpKyspCi0JCQlwcmludGxuKGludGVycHJldGVyLCB1bml0c1tpXSk7Ci0JfQotCi0JLyoqCi0JICogTGlzdHMgdGhlIGtub3duIG1ldGFkYXRhIHJlcG9zaXRvcmllcywgb3IgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4KLQkgKiBtZXRhZGF0YSByZXBvc2l0b3J5LgotCSAqIAotCSAqIEBwYXJhbSBpbnRlcnByZXRlcgotCSAqLwotCXB1YmxpYyB2b2lkIF9wcm92bHIoQ29tbWFuZEludGVycHJldGVyIGludGVycHJldGVyKSB7Ci0JCVN0cmluZyB1cmxTdHJpbmcgPSBwcm9jZXNzQXJndW1lbnQoaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCkpOwotCQlTdHJpbmcgaWQgPSBwcm9jZXNzQXJndW1lbnQoaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCkpOwotCQlTdHJpbmcgdmVyc2lvbiA9IHByb2Nlc3NBcmd1bWVudChpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKSk7Ci0JCWlmICh1cmxTdHJpbmcgPT0gbnVsbCkgewotCQkJVVJMW10gcmVwb3NpdG9yaWVzID0gUHJvdmlzaW9uaW5nSGVscGVyLmdldE1ldGFkYXRhUmVwb3NpdG9yaWVzKCk7Ci0JCQlpZiAocmVwb3NpdG9yaWVzICE9IG51bGwpCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXBvc2l0b3JpZXMubGVuZ3RoOyBpKyspCi0JCQkJCWludGVycHJldGVyLnByaW50bG4ocmVwb3NpdG9yaWVzW2ldKTsKLQkJCXJldHVybjsKLQkJfQotCQlVUkwgcmVwb1VSTCA9IHRvVVJMKGludGVycHJldGVyLCB1cmxTdHJpbmcpOwotCQlpZiAocmVwb1VSTCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJSW5zdGFsbGFibGVVbml0W10gdW5pdHMgPSBzb3J0KFByb3Zpc2lvbmluZ0hlbHBlci5nZXRJbnN0YWxsYWJsZVVuaXRzKHJlcG9VUkwsIG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShpZCwgbmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uKSksIG51bGwpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0cy5sZW5ndGg7IGkrKykKLQkJCXByaW50bG4oaW50ZXJwcmV0ZXIsIHVuaXRzW2ldKTsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0cyB0aGUgZ3JvdXAgSVVzIGluIGFsbCBrbm93biBtZXRhZGF0YSByZXBvc2l0b3JpZXMsIG9yIGluIHRoZSBnaXZlbgotCSAqIG1ldGFkYXRhIHJlcG9zaXRvcnkuCi0JICogCi0JICogQHBhcmFtIGludGVycHJldGVyCi0JICovCi0JcHVibGljIHZvaWQgX3Byb3ZsZyhDb21tYW5kSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIpIHsKLQkJU3RyaW5nIHVybFN0cmluZyA9IHByb2Nlc3NBcmd1bWVudChpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKSk7Ci0JCUlRdWVyeWFibGUgcXVlcnlhYmxlID0gbnVsbDsKLQkJaWYgKHVybFN0cmluZyA9PSBudWxsKSB7Ci0JCQlxdWVyeWFibGUgPSAoSVF1ZXJ5YWJsZSkgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlpZiAocXVlcnlhYmxlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQl9IGVsc2UgewotCQkJVVJMIHJlcG9VUkwgPSB0b1VSTChpbnRlcnByZXRlciwgdXJsU3RyaW5nKTsKLQkJCWlmIChyZXBvVVJMID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJcXVlcnlhYmxlID0gUHJvdmlzaW9uaW5nSGVscGVyLmdldE1ldGFkYXRhUmVwb3NpdG9yeShyZXBvVVJMKTsKLQkJCWlmIChxdWVyeWFibGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJUXVlcnkgcXVlcnkgPSBuZXcgSVVQcm9wZXJ0eVF1ZXJ5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0dST1VQLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSB1bml0cyA9IHNvcnQocXVlcnlhYmxlLnF1ZXJ5KHF1ZXJ5LCBuZXcgQ29sbGVjdG9yKCksIG51bGwpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bml0cy5sZW5ndGg7IGkrKykKLQkJCXByaW50bG4oaW50ZXJwcmV0ZXIsIHVuaXRzW2ldKTsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0cyB0aGUga25vd24gYXJ0aWZhY3QgcmVwb3NpdG9yaWVzLCBvciB0aGUgY29udGVudHMgb2YgYSBnaXZlbgotCSAqIGFydGlmYWN0IHJlcG9zaXRvcnkuCi0JICogCi0JICogQHBhcmFtIGludGVycHJldGVyCi0JICovCi0JcHVibGljIHZvaWQgX3Byb3ZsYXIoQ29tbWFuZEludGVycHJldGVyIGludGVycHJldGVyKSB7Ci0JCVN0cmluZyB1cmxTdHJpbmcgPSBwcm9jZXNzQXJndW1lbnQoaW50ZXJwcmV0ZXIubmV4dEFyZ3VtZW50KCkpOwotCQlpZiAodXJsU3RyaW5nID09IG51bGwpIHsKLQkJCVVSTFtdIHJlcG9zaXRvcmllcyA9IFByb3Zpc2lvbmluZ0hlbHBlci5nZXRBcnRpZmFjdFJlcG9zaXRvcmllcygpOwotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3NpdG9yaWVzLmxlbmd0aDsgaSsrKQotCQkJCWludGVycHJldGVyLnByaW50bG4ocmVwb3NpdG9yaWVzW2ldKTsKLQkJCXJldHVybjsKLQkJfQotCQlVUkwgcmVwb1VSTCA9IHRvVVJMKGludGVycHJldGVyLCB1cmxTdHJpbmcpOwotCQlpZiAocmVwb1VSTCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG8gPSBQcm92aXNpb25pbmdIZWxwZXIuZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KHJlcG9VUkwpOwotCQlJQXJ0aWZhY3RLZXlbXSBrZXlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWtleXMgPSAocmVwbyAhPSBudWxsKSA/IHJlcG8uZ2V0QXJ0aWZhY3RLZXlzKCkgOiBudWxsOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlpbnRlcnByZXRlci5wcmludGxuKCJSZXBvc2l0b3J5IGRvZXMgbm90IHN1cHBvcnQgbGlzdCBjb21tYW5kcy4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoa2V5cyA9PSBudWxsIHx8IGtleXMubGVuZ3RoID09IDApIHsKLQkJCWludGVycHJldGVyLnByaW50bG4oIlJlcG9zaXRvcnkgaGFzIG5vIGFydGlmYWN0cyIpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUlGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IGZpbGVSZXBvID0gKElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KSByZXBvLmdldEFkYXB0ZXIoSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkuY2xhc3MpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHJlcG8uZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhrZXlzW2ldKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yc1tqXTsKLQkJCQlGaWxlIGxvY2F0aW9uID0gbnVsbDsKLQkJCQlpZiAoZmlsZVJlcG8gIT0gbnVsbCkKLQkJCQkJbG9jYXRpb24gPSBmaWxlUmVwby5nZXRBcnRpZmFjdEZpbGUoZGVzY3JpcHRvcik7Ci0JCQkJcHJpbnRsbihpbnRlcnByZXRlciwga2V5c1tpXSwgbG9jYXRpb24pOwotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBnaXZlbiBzdHJpbmcgYXMgYW4gVVJMLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3RyaW5nCi0JICogY291bGQgbm90IGJlIGludGVycHJldGVkIGFzIGFuIFVSTC4KLQkgKi8KLQlwcml2YXRlIFVSTCB0b1VSTChDb21tYW5kSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIsIFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBuZXcgVVJMKHVybFN0cmluZyk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlpbnRlcnByZXRlci5wcmludChlLmdldE1lc3NhZ2UoKSk7Ci0JCQlpbnRlcnByZXRlci5wcmludGxuKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHByb2Nlc3NBcmd1bWVudChTdHJpbmcgYXJnKSB7Ci0JCWlmIChhcmcgPT0gbnVsbCB8fCBhcmcuZXF1YWxzKFdJTERDQVJEX0FOWSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGFyZzsKLQl9Ci0KLQkvKioKLQkgKiBMaXN0cyB0aGUga25vd24gcHJvZmlsZXMsIG9yIHRoZSBjb250ZW50cyBvZiBhIGdpdmVuIHByb2ZpbGUuCi0JICogCi0JICogQHBhcmFtIGludGVycHJldGVyCi0JICovCi0JcHVibGljIHZvaWQgX3Byb3ZscChDb21tYW5kSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIpIHsKLQkJU3RyaW5nIHByb2ZpbGVJZCA9IHByb2Nlc3NBcmd1bWVudChpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKSk7Ci0JCVN0cmluZyBpZCA9IHByb2Nlc3NBcmd1bWVudChpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKSk7Ci0JCVN0cmluZyByYW5nZSA9IHByb2Nlc3NBcmd1bWVudChpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKSk7Ci0JCWlmIChwcm9maWxlSWQgPT0gbnVsbCkgewotCQkJSVByb2ZpbGVbXSBwcm9maWxlcyA9IFByb3Zpc2lvbmluZ0hlbHBlci5nZXRQcm9maWxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9maWxlcy5sZW5ndGg7IGkrKykKLQkJCQlpbnRlcnByZXRlci5wcmludGxuKHByb2ZpbGVzW2ldLmdldFByb2ZpbGVJZCgpKTsKLQkJCXJldHVybjsKLQkJfQotCQkvLyBkZXRlcm1pbmUgd2hpY2ggcHJvZmlsZSBpcyB0byBiZSBsaXN0ZWQKLQkJSVByb2ZpbGUgdGFyZ2V0ID0gbnVsbDsKLQkJaWYgKHByb2ZpbGVJZC5lcXVhbHMoInRoaXMiKSkKLQkJCXByb2ZpbGVJZCA9IElQcm9maWxlUmVnaXN0cnkuU0VMRjsKLQkJdGFyZ2V0ID0gUHJvdmlzaW9uaW5nSGVscGVyLmdldFByb2ZpbGUocHJvZmlsZUlkKTsKLQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGxpc3QgdGhlIHByb2ZpbGUgY29udGVudHMKLQkJSUluc3RhbGxhYmxlVW5pdFtdIHJlc3VsdCA9IHNvcnQodGFyZ2V0LnF1ZXJ5KG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShpZCwgbmV3IFZlcnNpb25SYW5nZShyYW5nZSkpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0JCQlpbnRlcnByZXRlci5wcmludGxuKHJlc3VsdFtpXSk7Ci0JfQotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0W10gc29ydChDb2xsZWN0b3IgY29sbGVjdG9yKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSB1bml0cyA9IChJSW5zdGFsbGFibGVVbml0W10pIGNvbGxlY3Rvci50b0FycmF5KElJbnN0YWxsYWJsZVVuaXQuY2xhc3MpOwotCQlBcnJheXMuc29ydCh1bml0cywgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGFyZzAsIE9iamVjdCBhcmcxKSB7Ci0JCQkJcmV0dXJuIGFyZzAudG9TdHJpbmcoKS5jb21wYXJlVG8oYXJnMS50b1N0cmluZygpKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiB1bml0czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhlbHAoKSB7Ci0JCVN0cmluZ0J1ZmZlciBoZWxwID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQloZWxwLmFwcGVuZChORVdfTElORSk7Ci0JCWhlbHAuYXBwZW5kKCItLS0iKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwLmFwcGVuZCgiUHJvdmlzaW9uaW5nIENvbW1hbmRzIik7Ci0JCWhlbHAuYXBwZW5kKCItLS0iKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwLmFwcGVuZChORVdfTElORSk7Ci0JCWhlbHAuYXBwZW5kKCJcdHByb3ZsciBbPHJlcG9zaXRvcnkgVVJMPiA8aXUgaWQgfCAqPiA8dmVyc2lvbiByYW5nZSB8ICo+XSAgIC0gTGlzdHMgYWxsIG1ldGFkYXRhIHJlcG9zaXRvcmllcywgb3IgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gbWV0YWRhdGEgcmVwb3NpdG9yeSIpOwotCQloZWxwLmFwcGVuZChORVdfTElORSk7Ci0JCWhlbHAuYXBwZW5kKCJcdHByb3ZsYXIgWzxyZXBvc2l0b3J5IFVSTD5dIC0gTGlzdHMgYWxsIGFydGlmYWN0IHJlcG9zaXRvcmllcywgb3IgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gYXJ0aWZhY3QgcmVwb3NpdG9yeSIpOwotCQloZWxwLmFwcGVuZChORVdfTElORSk7Ci0JCWhlbHAuYXBwZW5kKCJcdHByb3ZsaXUgWzxyZXBvc2l0b3J5IFVSTCB8ICo+IDxpdSBpZCB8ICo+IDx2ZXJzaW9uIHJhbmdlIHwgKj5dIC0gTGlzdHMgdGhlIElVcyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuIGluIHRoZSBnaXZlbiByZXBvLiAgKiBtYXRjaGVzIGFsbCIpOwotCQloZWxwLmFwcGVuZChORVdfTElORSk7Ci0JCWhlbHAuYXBwZW5kKCJcdHByb3ZscCBbPHByb2ZpbGUgaWQgfCAqPiAtIExpc3RzIGFsbCBwcm9maWxlcywgb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSBwcm9maWxlIGF0IHRoZSBnaXZlbiBwcm9maWxlIik7Ci0JCWhlbHAuYXBwZW5kKE5FV19MSU5FKTsKLQkJaGVscC5hcHBlbmQoIlx0cHJvdmxnIFs8cmVwb3NpdG9yeSBVUkw+IDxpdSBpZCB8ICo+IDx2ZXJzaW9uIHJhbmdlIHwgKj5dIC0gTGlzdHMgYWxsIElVcyB3aXRoIGdyb3VwIGNhcGFiaWxpdGllcyBpbiB0aGUgZ2l2ZW4gcmVwbyBvciBpbiBhbGwgcmVwb3MgaWYgdGhlIFVSTCBpcyBvbWl0dGVkIik7Ci0JCWhlbHAuYXBwZW5kKE5FV19MSU5FKTsKLQkJaGVscC5hcHBlbmQoIlx0cHJvdmluc3RhbGwgPEluc3RhbGxhYmxlVW5pdD4gPHZlcnNpb24+IDxwcm9maWxlSWQ+IC0gUHJvdmlzaW9ucyBhbiBJVSB0byB0aGUgcHJvZmlsZSB3aXRoIHRoZSBnaXZlIGlkIik7Ci0JCWhlbHAuYXBwZW5kKE5FV19MSU5FKTsKLQkJaGVscC5hcHBlbmQoIlx0cHJvdmFkZHJlcG8gPHJlcG9zaXRvcnkgVVJMPiAtIEFkZHMgYSBtZXRhZGF0YSByZXBvc2l0b3J5Iik7Ci0JCWhlbHAuYXBwZW5kKE5FV19MSU5FKTsKLQkJaGVscC5hcHBlbmQoIlx0cHJvdmFkZGFydGlmYWN0cmVwbyA8cmVwb3NpdG9yeSBVUkw+IC0gQWRkcyBhbiBhcnRpZmFjdCByZXBvc2l0b3J5Iik7Ci0JCWhlbHAuYXBwZW5kKE5FV19MSU5FKTsKLQkJaGVscC5hcHBlbmQoIlx0cHJvdmFkZHByb2ZpbGUgPHByb2ZpbGVJZD4gPGxvY2F0aW9uPiA8Zmxhdm9yPiAtIEFkZHMgYSBwcm9maWxlIHdpdGggdGhlIGdpdmVuIGlkLCBsb2NhdGlvbiBhbmQgZmxhdm9yIik7Ci0JCWhlbHAuYXBwZW5kKE5FV19MSU5FKTsKLQkJcmV0dXJuIGhlbHAudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4ge0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9IHRvIHRoZQotCSAqIGl0ZXJwcmV0ZXIncyBvdXRwdXQgc3RyZWFtLgotCSAqLwotCXB1YmxpYyB2b2lkIHByaW50KENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlciwgSUluc3RhbGxhYmxlVW5pdCB1bml0KSB7Ci0JCWludGVycHJldGVyLnByaW50KHVuaXQuZ2V0SWQoKSArICcgJyArIHVuaXQuZ2V0VmVyc2lvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYW4ge0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9IHRvIHRoZQotCSAqIGl0ZXJwcmV0ZXIncyBvdXRwdXQgc3RyZWFtLCBmb2xsb3dpbmcgYnkgYSBsaW5lIHRlcm1pbmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmludGxuKENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlciwgSUluc3RhbGxhYmxlVW5pdCB1bml0KSB7Ci0JCXByaW50KGludGVycHJldGVyLCB1bml0KTsKLQkJaW50ZXJwcmV0ZXIucHJpbnRsbigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludGxuKENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlciwgSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5LCBGaWxlIGxvY2F0aW9uKSB7Ci0JCWludGVycHJldGVyLnByaW50KGFydGlmYWN0S2V5LnRvU3RyaW5nKCkgKyAnICcgKyBsb2NhdGlvbik7Ci0JCWludGVycHJldGVyLnByaW50bG4oKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29uc29sZS9Qcm92aXNpb25pbmdIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvbnNvbGUvUHJvdmlzaW9uaW5nSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmODM3OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29uc29sZS9Qcm92aXNpb25pbmdIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb25zb2xlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRJbmZvOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgUHJvdmlzaW9uaW5nSGVscGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBhZGRNZXRhZGF0YVJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uKSB7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gbWV0YWRhdGEgcmVwb3NpdG9yeSBtYW5hZ2VyIGZvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCXJldHVybiBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCBudWxsKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQotCQl9Ci0KLQkJLy8gZm9yIGNvbnZlbmllbmNlIGNyZWF0ZSBhbmQgYWRkIGEgcmVwb3NpdG9yeSBoZXJlCi0JCVN0cmluZyByZXBvc2l0b3J5TmFtZSA9IGxvY2F0aW9uICsgIiAtIG1ldGFkYXRhIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmV0dXJuIG1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShsb2NhdGlvbiwgcmVwb3NpdG9yeU5hbWUsIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlRZUEVfU0lNUExFX1JFUE9TSVRPUlksIG51bGwpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElNZXRhZGF0YVJlcG9zaXRvcnkgZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbikgewotCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIG1ldGFkYXRhIHJlcG9zaXRvcnkgbWFuYWdlciBmb3VuZCIpOwotCQl0cnkgewotCQkJcmV0dXJuIG1hbmFnZXIubG9hZFJlcG9zaXRvcnkobG9jYXRpb24sIG51bGwpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlTWV0YWRhdGFSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbikgewotCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIG1ldGFkYXRhIHJlcG9zaXRvcnkgbWFuYWdlciBmb3VuZCIpOwotCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkobG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0UmVwb3NpdG9yeSBhZGRBcnRpZmFjdFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uKSB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJLy8gVE9ETyBsb2cgaGVyZQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbWFuYWdlci5sb2FkUmVwb3NpdG9yeShsb2NhdGlvbiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2ZhbGwgdGhyb3VnaCBhbmQgY3JlYXRlIGEgbmV3IHJlcG9zaXRvcnkKLQkJfQotCQkvLyBjb3VsZCBub3QgbG9hZCBhIHJlcG8gYXQgdGhhdCBsb2NhdGlvbiBzbyBjcmVhdGUgb25lIGFzIGEgY29udmVuaWVuY2UKLQkJU3RyaW5nIHJlcG9zaXRvcnlOYW1lID0gbG9jYXRpb24gKyAiIC0gYXJ0aWZhY3RzIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmV0dXJuIG1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShsb2NhdGlvbiwgcmVwb3NpdG9yeU5hbWUsIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLlRZUEVfU0lNUExFX1JFUE9TSVRPUlksIG51bGwpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlQXJ0aWZhY3RSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbikgewotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCS8vIFRPRE8gbG9nIGhlcmUKLQkJCXJldHVybjsKLQkJbWFuYWdlci5yZW1vdmVSZXBvc2l0b3J5KGxvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9maWxlIGFkZFByb2ZpbGUoU3RyaW5nIHByb2ZpbGVJZCwgUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJSVByb2ZpbGVSZWdpc3RyeSBwcm9maWxlUmVnaXN0cnkgPSAoSVByb2ZpbGVSZWdpc3RyeSkgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKHByb2ZpbGVSZWdpc3RyeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBwcm9maWxlUmVnaXN0cnkuZ2V0UHJvZmlsZShwcm9maWxlSWQpOwotCQlpZiAocHJvZmlsZSAhPSBudWxsKQotCQkJcmV0dXJuIHByb2ZpbGU7Ci0KLQkJTWFwIHByb2ZpbGVQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvcGVydGllcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJcHJvZmlsZVByb3BlcnRpZXMucHV0KGtleSwgcHJvcGVydGllcy5nZXRQcm9wZXJ0eShrZXkpKTsKLQkJfQotCi0JCWlmIChwcm9maWxlUHJvcGVydGllcy5nZXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMpID09IG51bGwpIHsKLQkJCUVudmlyb25tZW50SW5mbyBpbmZvID0gKEVudmlyb25tZW50SW5mbykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEVudmlyb25tZW50SW5mby5jbGFzcy5nZXROYW1lKCkpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkKLQkJCQlwcm9maWxlUHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMsICJvc2dpLm9zPSIgKyBpbmZvLmdldE9TKCkgKyAiLG9zZ2kud3M9IiArIGluZm8uZ2V0V1MoKSArICIsb3NnaS5hcmNoPSIgKyBpbmZvLmdldE9TQXJjaCgpKTsKLQkJCWVsc2UKLQkJCQlwcm9maWxlUHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMsICIiKTsKLQkJfQotCi0JCXJldHVybiBwcm9maWxlUmVnaXN0cnkuYWRkUHJvZmlsZShwcm9maWxlSWQsIHByb2ZpbGVQcm9wZXJ0aWVzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVtb3ZlUHJvZmlsZShTdHJpbmcgcHJvZmlsZUlkKSB7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwcm9maWxlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJcHJvZmlsZVJlZ2lzdHJ5LnJlbW92ZVByb2ZpbGUocHJvZmlsZUlkKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9maWxlW10gZ2V0UHJvZmlsZXMoKSB7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwcm9maWxlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSVByb2ZpbGVbMF07Ci0JCXJldHVybiBwcm9maWxlUmVnaXN0cnkuZ2V0UHJvZmlsZXMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9maWxlIGdldFByb2ZpbGUoU3RyaW5nIGlkKSB7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwcm9maWxlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcHJvZmlsZVJlZ2lzdHJ5LmdldFByb2ZpbGUoaWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGxhYmxlIHVuaXRzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHF1ZXJ5Ci0JICogaW4gdGhlIGdpdmVuIG1ldGFkYXRhIHJlcG9zaXRvcnkuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgbWV0YWRhdGEgcmVwbyB0byBzZWFyY2guICA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0ZXMKLQkgKiAgICAgICAgc2VhcmNoIGFsbCBrbm93biByZXBvcy4KLQkgKiBAcGFyYW0gcXVlcnkgVGhlIHF1ZXJ5IHRvIHBlcmZvcm0KLQkgKiBAcGFyYW0gbW9uaXRvciBBIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHJldHVybiBUaGUgSVVzIHRoYXQgbWF0Y2ggdGhlIHF1ZXJ5Ci0JICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0b3IgZ2V0SW5zdGFsbGFibGVVbml0cyhVUkwgbG9jYXRpb24sIFF1ZXJ5IHF1ZXJ5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVF1ZXJ5YWJsZSBxdWVyeWFibGUgPSBudWxsOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkgewotCQkJcXVlcnlhYmxlID0gKElRdWVyeWFibGUpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQl9IGVsc2UgewotCQkJcXVlcnlhYmxlID0gZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KGxvY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gcXVlcnlhYmxlLnF1ZXJ5KHF1ZXJ5LCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMW10gZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoKSB7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJLy8gVE9ETyBsb2cgaGVyZQotCQkJcmV0dXJuIG51bGw7Ci0JCVVSTFtdIHJlcG9zID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcyhJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfQUxMKTsKLQkJaWYgKHJlcG9zLmxlbmd0aCA+IDApCi0JCQlyZXR1cm4gcmVwb3M7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc3RhbGwgdGhlIGRlc2NyaWJlZCBJVQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBpbnN0YWxsKFN0cmluZyB1bml0SWQsIFN0cmluZyB2ZXJzaW9uLCBJUHJvZmlsZSBwcm9maWxlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDb2xsZWN0b3IgdW5pdHMgPSBnZXRJbnN0YWxsYWJsZVVuaXRzKG51bGwsIG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeSh1bml0SWQsIG5ldyBWZXJzaW9uKHZlcnNpb24pKSwgcHJvZ3Jlc3MpOwotCQlpZiAodW5pdHMuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdCdWZmZXIgZXJyb3IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQllcnJvci5hcHBlbmQoIkluc3RhbGxhYmxlIHVuaXQgbm90IGZvdW5kOiAiICsgdW5pdElkICsgJyAnICsgdmVyc2lvbiArICdcbicpOwotCQkJZXJyb3IuYXBwZW5kKCJSZXBvc2l0b3JpZXMgc2VhcmNoZWQ6XG4iKTsKLQkJCVVSTFtdIHJlcG9zID0gZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoKTsKLQkJCWlmIChyZXBvcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXBvcy5sZW5ndGg7IGkrKykKLQkJCQkJZXJyb3IuYXBwZW5kKHJlcG9zW2ldICsgIlxuIik7Ci0JCQl9Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKGVycm9yLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJSVBsYW5uZXIgcGxhbm5lciA9IChJUGxhbm5lcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQbGFubmVyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwbGFubmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKCJObyBwbGFubmVyIHNlcnZpY2UgZm91bmQuIik7Ci0KLQkJSUVuZ2luZSBlbmdpbmUgPSAoSUVuZ2luZSkgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElFbmdpbmUuU0VSVklDRV9OQU1FKTsKLQkJaWYgKGVuZ2luZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbigiTm8gZGlyZWN0b3Igc2VydmljZSBmb3VuZC4iKTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIHRvSW5zdGFsbCA9IChJSW5zdGFsbGFibGVVbml0W10pIHVuaXRzLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JCVByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCA9IG5ldyBQcm92aXNpb25pbmdDb250ZXh0KCk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyh0b0luc3RhbGwpOwotCQlQcm92aXNpb25pbmdQbGFuIHJlc3VsdCA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXF1ZXN0LCBjb250ZXh0LCBwcm9ncmVzcyk7Ci0JCWlmICghcmVzdWx0LmdldFN0YXR1cygpLmlzT0soKSkKLQkJCXJldHVybiByZXN1bHQuZ2V0U3RhdHVzKCk7Ci0KLQkJcmV0dXJuIGVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcmVzdWx0LmdldE9wZXJhbmRzKCksIGNvbnRleHQsIHByb2dyZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBVbmluc3RhbGwgdGhlIGRlc2NyaWJlZCBJVQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB1bmluc3RhbGwoU3RyaW5nIHVuaXRJZCwgU3RyaW5nIHZlcnNpb24sIElQcm9maWxlIHByb2ZpbGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlJRGlyZWN0b3IgZGlyZWN0b3IgPSAoSURpcmVjdG9yKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSURpcmVjdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChkaXJlY3RvciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbigiTm8gZGlyZWN0b3Igc2VydmljZSBmb3VuZC4iKTsKLQotCQkvLyByZXR1cm4gZGlyZWN0b3IudW5pbnN0YWxsKG5ldyBJbnN0YWxsYWJsZVVuaXRbXSB7dG9JbnN0YWxsfSwgcHJvZmlsZSwKLQkJLy8gbnVsbCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBraWNrKFN0cmluZyBwcm9maWxlSWQpIHsKLQkJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IChDb25maWd1cmF0b3IpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBDb25maWd1cmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKGNvbmZpZ3VyYXRvciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAocHJvZmlsZUlkID09IG51bGwpCi0JCQl0cnkgewotCQkJCWNvbmZpZ3VyYXRvci5hcHBseUNvbmZpZ3VyYXRpb24oKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJZWxzZSB7Ci0JCQkvLyBUT0RPIGRvIHNvbWUgd29yayBoZXJlIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGtpY2sgc29tZSByYW5kb20gcHJvZmlsZQkJCQotCQkJLy8JCQkJCWNvbmZpZ3VyYXRvci5hcHBseUNvbmZpZ3VyYXRpb24oY29uZmlnVVJMKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMW10gZ2V0QXJ0aWZhY3RSZXBvc2l0b3JpZXMoKSB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJLy8gVE9ETyBsb2cgaGVyZQotCQkJcmV0dXJuIG51bGw7Ci0JCVVSTFtdIHJlcG9zID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcyhJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfQUxMKTsKLQkJaWYgKHJlcG9zLmxlbmd0aCA+IDApCi0JCQlyZXR1cm4gcmVwb3M7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0UmVwb3NpdG9yeSBnZXRBcnRpZmFjdFJlcG9zaXRvcnkoVVJMIHJlcG9VUkwpIHsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAobWFuYWdlciAhPSBudWxsKQotCQkJCXJldHVybiBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KHJlcG9VUkwsIG51bGwpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy9mb3IgY29uc29sZSwganVzdCBpZ25vcmUgcmVwb3NpdG9yaWVzIHRoYXQgY2FuJ3QgYmUgcmVhZAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmFmNDJhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSNUdXJuIG9uIGRlYnVnZ2luZyBmb3IgcDIKLW9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9kZWJ1Zz1mYWxzZQotCi0jRGV0YWlsZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWxlIHBhcnNpbmcgcDIgZGF0YSBmaWxlcwotb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL2NvcmUvcGFyc2Vwcm9ibGVtcz1mYWxzZQotCi0jRGV0YWlsZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWxlIHBhcnNpbmcgc2l0ZS54bWwgYW5kIGZlYXR1cmUueG1sIGZpbGVzIGluIHRoZSBnZW5lcmF0b3IKLW9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9nZW5lcmF0b3IvcGFyc2luZz1mYWxzZQotCi0jRGV0YWlsZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uIHdoaWxlIHNhdmluZy9yZXN0b3JpbmcgdGhlIGVuZ2luZSdzIGluc3RhbGwgcmVnaXN0cnkKLW9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9lbmdpbmUvaW5zdGFsbHJlZ2lzdHJ5PWZhbHNlCi0KLSNEZXRhaWxlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gd2hpbGUgc2F2aW5nL3Jlc3RvcmluZyBtZXRhZGF0YSByZXBvc2l0b3JpZXMKLW9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9tZXRhZGF0YS9wYXJzaW5nPWZhbHNlCi0KLSNEZXRhaWxlZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYWJvdXQgbWlycm9yIHNlbGVjdGlvbgotb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL2FydGlmYWN0cy9taXJyb3JzPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjYzE2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NGY4YjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLSNUaHUgU2VwIDEzIDE2OjIzOjQ1IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDU0MDk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1Nzo0OCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGZkMWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRvciwKLSBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5ldmVudG1ncjt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsubG9nO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnJlc29sdmVyLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb247dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJ1Zzt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gb3JnLm9zZ2kudXRpbC50cmFja2VyO3ZlcnNpb249IjEuMy4zIiwKLSBvcmcueG1sLnNheAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnM7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcCwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZG93bmxvYWQsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0LAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZXBvc2l0b3J5b3B0aW1pemVyLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkaywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci5hcHAsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24iLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2U7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbiwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIsCi0gICBvcmcuZWNsaXBzZS5wZGUucDIudWkiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1czsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGssCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeTsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24sCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4sCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcCwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3NvciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkaywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuY29yZS5yZXBvc2l0b3J5OwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNCwKLSBDREMtMS4xL0ZvdW5kYXRpb24tMS4xCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuQWN0aXZhdG9yCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjgzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzI4MzcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IFByb3Zpc2lvbmluZyBDb3JlCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZTkwM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24uQWdlbnRMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5sb2cuRnJhbWV3b3JrTG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIEFnZW50TG9jYXRpb24gYWdlbnREYXRhTG9jYXRpb24gPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0FHRU5UX0xPQ0FUSU9OID0gIi4uL3AyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBMb2NhdGlvbiBkb3dubG9hZExvY2F0aW9uID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBBY3RpdmF0b3IgaW5zdGFuY2U7Ci0JLy8gRGF0YSBtb2RlIGNvbnN0YW50cyBmb3IgdXNlciwgY29uZmlndXJhdGlvbiBhbmQgZGF0YSBsb2NhdGlvbnMuCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0RFRkFVTFQgPSAiQG5vRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9ICJAbm9uZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0FHRU5UX0RBVEFfQVJFQSA9ICJlY2xpcHNlLnAyLmRhdGEuYXJlYSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9DT05GSUdfRElSID0gIm9zZ2kuY29uZmlndXJhdGlvbi5hcmVhIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1VTRVJfRElSID0gInVzZXIuZGlyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1VTRVJfSE9NRSA9ICJ1c2VyLmhvbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFEX09OTFlfQVJFQV9TVUZGSVggPSAiLnJlYWRPbmx5IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUl9DT05GSUdfRElSID0gIkBjb25maWcuZGlyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfVVNFUl9ESVIgPSAiQHVzZXIuZGlyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQVJfVVNFUl9IT01FID0gIkB1c2VyLmhvbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gYWdlbnRMb2NhdGlvblJlZ2lzdHJhdGlvbiA9IG51bGw7Ci0JU2VydmljZVRyYWNrZXIgbG9nVHJhY2tlcjsKLQotCS8qKgotCSAqIE5PVEU6IFRoaXMgbWV0aG9kIGlzIGNvcGllZCBmcm9tIExvY2F0aW9uSGVscGVyIGluIG9yZy5lY2xpcHNlLm9zZ2kKLQkgKiBkdWUgdG8gYWNjZXNzIHJlc3RyaWN0aW9ucy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBVUkwgYWRqdXN0VHJhaWxpbmdTbGFzaChVUkwgdXJsLCBib29sZWFuIHRyYWlsaW5nU2xhc2gpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlTdHJpbmcgZmlsZSA9IHVybC5nZXRGaWxlKCk7Ci0JCWlmICh0cmFpbGluZ1NsYXNoID09IChmaWxlLmVuZHNXaXRoKCIvIikpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdXJsOwotCQlmaWxlID0gdHJhaWxpbmdTbGFzaCA/IGZpbGUgKyAiLyIgOiBmaWxlLnN1YnN0cmluZygwLCBmaWxlLmxlbmd0aCgpIC0gMSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5ldyBVUkwodXJsLmdldFByb3RvY29sKCksIHVybC5nZXRIb3N0KCksIGZpbGUpOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyBhIFVSTCB3aXRoIHRoZSBnaXZlbiBzcGVjaWZpY2F0aW9uCi0JICogTk9URTogVGhpcyBtZXRob2QgaXMgY29waWVkIGZyb20gTG9jYXRpb25IZWxwZXIgaW4gb3JnLmVjbGlwc2Uub3NnaQotCSAqIGR1ZSB0byBhY2Nlc3MgcmVzdHJpY3Rpb25zLgotCSAqIAotCSAqIEBwYXJhbSBzcGVjIHRoZSBVUkwgc3BlY2lmaWNhdGlvbgotCSAqIEBwYXJhbSB0cmFpbGluZ1NsYXNoIGZsYWcgdG8gaW5kaWNhdGUgYSB0cmFpbGluZyBzbGFzaCBvbiB0aGUgc3BlYwotCSAqIEByZXR1cm4gYSBVUkwKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBVUkwgYnVpbGRVUkwoU3RyaW5nIHNwZWMsIGJvb2xlYW4gdHJhaWxpbmdTbGFzaCkgewotCQlpZiAoc3BlYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWJvb2xlYW4gaXNGaWxlID0gc3BlYy5zdGFydHNXaXRoKCJmaWxlOiIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpZiAoaXNGaWxlKQotCQkJCXJldHVybiBhZGp1c3RUcmFpbGluZ1NsYXNoKG5ldyBGaWxlKHNwZWMuc3Vic3RyaW5nKDUpKS50b1VSTCgpLCB0cmFpbGluZ1NsYXNoKTsKLQkJCXJldHVybiBuZXcgVVJMKHNwZWMpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gaWYgd2UgZmFpbGVkIGFuZCBpdCBpcyBhIGZpbGUgc3BlYywgdGhlcmUgaXMgbm90aGluZyBtb3JlIHdlIGNhbiBkbwotCQkJLy8gb3RoZXJ3aXNlLCB0cnkgdG8gbWFrZSB0aGUgc3BlYyBpbnRvIGEgZmlsZSBVUkwuCi0JCQlpZiAoaXNGaWxlKQotCQkJCXJldHVybiBudWxsOwotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gYWRqdXN0VHJhaWxpbmdTbGFzaChuZXcgRmlsZShzcGVjKS50b1VSTCgpLCB0cmFpbGluZ1NsYXNoKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnJhbWV3b3JrIGxvZywgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlCi0JICovCi0JcHVibGljIHN0YXRpYyBGcmFtZXdvcmtMb2cgZ2V0RnJhbWV3b3JrTG9nKCkgewotCQkvL3Byb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHNodXRkb3duCi0JCUFjdGl2YXRvciBhID0gaW5zdGFuY2U7Ci0JCWlmIChhID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU2VydmljZVRyYWNrZXIgdHJhY2tlciA9IGEuZ2V0TG9nVHJhY2tlcigpOwotCQlpZiAodHJhY2tlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRnJhbWV3b3JrTG9nKSB0cmFja2VyLmdldFNlcnZpY2UoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3Vic3RpdHV0ZVZhcihTdHJpbmcgc291cmNlLCBTdHJpbmcgdmFyLCBTdHJpbmcgcHJvcCkgewotCQlTdHJpbmcgdmFsdWUgPSBBY3RpdmF0b3IuY29udGV4dC5nZXRQcm9wZXJ0eShwcm9wKTsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB2YWx1ZSArIHNvdXJjZS5zdWJzdHJpbmcodmFyLmxlbmd0aCgpKTsKLQl9Ci0KLQlwcml2YXRlIEFnZW50TG9jYXRpb24gYnVpbGRMb2NhdGlvbihTdHJpbmcgcHJvcGVydHksIFVSTCBkZWZhdWx0TG9jYXRpb24sIGJvb2xlYW4gcmVhZE9ubHlEZWZhdWx0LCBib29sZWFuIGFkZFRyYWlsaW5nU2xhc2gpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gQWN0aXZhdG9yLmNvbnRleHQuZ2V0UHJvcGVydHkocHJvcGVydHkpOwotCQkvLyB0aGUgdXNlci9wcm9kdWN0IG1heSBzcGVjaWZ5IGEgbm9uLWRlZmF1bHQgcmVhZE9ubHkgc2V0dGluZyAgIAotCQlTdHJpbmcgdXNlclJlYWRPbmx5U2V0dGluZyA9IEFjdGl2YXRvci5jb250ZXh0LmdldFByb3BlcnR5KHByb3BlcnR5ICsgUkVBRF9PTkxZX0FSRUFfU1VGRklYKTsKLQkJYm9vbGVhbiByZWFkT25seSA9ICh1c2VyUmVhZE9ubHlTZXR0aW5nID09IG51bGwgPyByZWFkT25seURlZmF1bHQgOiBCb29sZWFuLnZhbHVlT2YodXNlclJlYWRPbmx5U2V0dGluZykuYm9vbGVhblZhbHVlKCkpOwotCQkvLyBpZiB0aGUgaW5zdGFuY2UgbG9jYXRpb24gaXMgbm90IHNldCwgcHJlZGljdCB3aGVyZSB0aGUgd29ya3NwYWNlIHdpbGwgYmUgYW5kIAotCQkvLyBwdXQgdGhlIGluc3RhbmNlIGFyZWEgaW5zaWRlIHRoZSB3b3Jrc3BhY2UgbWV0YSBhcmVhLgotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQmFzaWNMb2NhdGlvbihwcm9wZXJ0eSwgZGVmYXVsdExvY2F0aW9uLCByZWFkT25seSk7Ci0JCWlmIChsb2NhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKE5PTkUpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChsb2NhdGlvbi5lcXVhbHNJZ25vcmVDYXNlKE5PX0RFRkFVTFQpKQotCQkJcmV0dXJuIG5ldyBCYXNpY0xvY2F0aW9uKHByb3BlcnR5LCBudWxsLCByZWFkT25seSk7Ci0JCWlmIChsb2NhdGlvbi5zdGFydHNXaXRoKFZBUl9VU0VSX0hPTUUpKSB7Ci0JCQlTdHJpbmcgYmFzZSA9IHN1YnN0aXR1dGVWYXIobG9jYXRpb24sIFZBUl9VU0VSX0hPTUUsIFBST1BfVVNFUl9IT01FKTsKLQkJCWxvY2F0aW9uID0gbmV3IFBhdGgoYmFzZSkudG9GaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCX0gZWxzZSBpZiAobG9jYXRpb24uc3RhcnRzV2l0aChWQVJfVVNFUl9ESVIpKSB7Ci0JCQlTdHJpbmcgYmFzZSA9IHN1YnN0aXR1dGVWYXIobG9jYXRpb24sIFZBUl9VU0VSX0RJUiwgUFJPUF9VU0VSX0RJUik7Ci0JCQlsb2NhdGlvbiA9IG5ldyBQYXRoKGJhc2UpLnRvRmlsZSgpLmdldEFic29sdXRlUGF0aCgpOwotCQl9IGVsc2UgaWYgKGxvY2F0aW9uLnN0YXJ0c1dpdGgoVkFSX0NPTkZJR19ESVIpKSB7Ci0JCQkvL25vdGUgdGhlIGNvbmZpZyBkaXIgc3lzdGVtIHByb3BlcnR5IGlzIGFscmVhZHkgYSBVUkwKLQkJCWxvY2F0aW9uID0gc3Vic3RpdHV0ZVZhcihsb2NhdGlvbiwgVkFSX0NPTkZJR19ESVIsIFBST1BfQ09ORklHX0RJUik7Ci0JCX0KLQkJVVJMIHVybCA9IGJ1aWxkVVJMKGxvY2F0aW9uLCBhZGRUcmFpbGluZ1NsYXNoKTsKLQkJQmFzaWNMb2NhdGlvbiByZXN1bHQgPSBudWxsOwotCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IG5ldyBCYXNpY0xvY2F0aW9uKHByb3BlcnR5LCBudWxsLCByZWFkT25seSk7Ci0JCQlyZXN1bHQuc2V0KHVybCwgZmFsc2UpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTZXJ2aWNlVHJhY2tlciBnZXRMb2dUcmFja2VyKCkgewotCQlpZiAobG9nVHJhY2tlciAhPSBudWxsKQotCQkJcmV0dXJuIGxvZ1RyYWNrZXI7Ci0JCS8vbGF6eSBpbml0IGlmIHRoZSBidW5kbGUgaGFzIGJlZW4gc3RhcnRlZAotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWxvZ1RyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoY29udGV4dCwgRnJhbWV3b3JrTG9nLmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7Ci0JCWxvZ1RyYWNrZXIub3BlbigpOwotCQlyZXR1cm4gbG9nVHJhY2tlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGFDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCQlBY3RpdmF0b3IuY29udGV4dCA9IGFDb250ZXh0OwotCQlVUkwgZGVmYXVsdExvY2F0aW9uID0gbmV3IFVSTChhQ29udGV4dC5nZXRQcm9wZXJ0eShQUk9QX0NPTkZJR19ESVIpICsgREVGQVVMVF9BR0VOVF9MT0NBVElPTiArICcvJyk7Ci0JCWFnZW50RGF0YUxvY2F0aW9uID0gYnVpbGRMb2NhdGlvbihQUk9QX0FHRU5UX0RBVEFfQVJFQSwgZGVmYXVsdExvY2F0aW9uLCBmYWxzZSwgdHJ1ZSk7Ci0JCURpY3Rpb25hcnkgbG9jYXRpb25Qcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpZiAoZGVmYXVsdExvY2F0aW9uICE9IG51bGwpIHsKLQkJCWxvY2F0aW9uUHJvcGVydGllcy5wdXQoInR5cGUiLCBQUk9QX0FHRU5UX0RBVEFfQVJFQSk7IC8vJE5PTi1OTFMtMSQKLQkJCWFnZW50TG9jYXRpb25SZWdpc3RyYXRpb24gPSBhQ29udGV4dC5yZWdpc3RlclNlcnZpY2UoQWdlbnRMb2NhdGlvbi5TRVJWSUNFX05BTUUsIGFnZW50RGF0YUxvY2F0aW9uLCBsb2NhdGlvblByb3BlcnRpZXMpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGFDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW5zdGFuY2UgPSBudWxsOwotCQlpZiAoYWdlbnRMb2NhdGlvblJlZ2lzdHJhdGlvbiAhPSBudWxsKQotCQkJYWdlbnRMb2NhdGlvblJlZ2lzdHJhdGlvbi51bnJlZ2lzdGVyKCk7Ci0JCWlmIChsb2dUcmFja2VyICE9IG51bGwpIHsKLQkJCWxvZ1RyYWNrZXIuY2xvc2UoKTsKLQkJCWxvZ1RyYWNrZXIgPSBudWxsOwotCQl9Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL0Jhc2ljTG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvQmFzaWNMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTVhMzM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvQmFzaWNMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5sb2NhdGlvbi5BZ2VudExvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24uTG9jYXRpb247Ci0KLS8qKgotICogSW50ZXJuYWwgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY0xvY2F0aW9uIGltcGxlbWVudHMgQWdlbnRMb2NhdGlvbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja0xvY2tlciBpbXBsZW1lbnRzIExvY2tlciB7Ci0JCXB1YmxpYyBib29sZWFuIGxvY2soKSB7Ci0JCQkvLyBsb2NraW5nIGFsd2F5cyBzdWNjZXNzZnVsCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCQkvLyBub3RoaW5nIHRvIHJlbGVhc2UKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1JlYWRPbmx5OwotCXByaXZhdGUgVVJMIGxvY2F0aW9uID0gbnVsbDsKLQlwcml2YXRlIExvY2F0aW9uIHBhcmVudDsKLQlwcml2YXRlIFVSTCBkZWZhdWx0VmFsdWU7Ci0KLQkvLyBsb2NraW5nIHJlbGF0ZWQgZmllbGRzCi0JcHJpdmF0ZSBGaWxlIGxvY2tGaWxlOwotCXByaXZhdGUgTG9ja2VyIGxvY2tlcjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX09TR0lfTE9DS0lORyA9ICJvc2dpLmxvY2tpbmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1J1bm5pbmdXaXRoTmlvKCkgewotCQl0cnkgewotCQkJQ2xhc3MuZm9yTmFtZSgiamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2siKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExvY2tlciBjcmVhdGVMb2NrZXIoRmlsZSBsb2NrLCBTdHJpbmcgbG9ja01vZGUpIHsKLQkJaWYgKGxvY2tNb2RlID09IG51bGwpCi0JCQlsb2NrTW9kZSA9IEFjdGl2YXRvci5jb250ZXh0LmdldFByb3BlcnR5KFBST1BfT1NHSV9MT0NLSU5HKTsKLQotCQlpZiAoIm5vbmUiLmVxdWFscyhsb2NrTW9kZSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgTW9ja0xvY2tlcigpOwotCi0JCWlmICgiamF2YS5pbyIuZXF1YWxzKGxvY2tNb2RlKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBMb2NrZXJfSmF2YUlvKGxvY2spOwotCi0JCWlmICgiamF2YS5uaW8iLmVxdWFscyhsb2NrTW9kZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGlzUnVubmluZ1dpdGhOaW8oKSkKLQkJCQlyZXR1cm4gbmV3IExvY2tlcl9KYXZhTmlvKGxvY2spOwotCQkJZWxzZQotCQkJCS8vIFRPRE8gc2hvdWxkIHdlIHJldHVybiBudWxsIGhlcmUuICBOSU8gd2FzIHJlcXVlc3RlZCBidXQgd2UgY291bGQgbm90IGRvIGl0Li4uCi0JCQkJcmV0dXJuIG5ldyBMb2NrZXJfSmF2YUlvKGxvY2spOwotCQl9Ci0KLQkJLy8JQmFja3VwIGNhc2UgaWYgYW4gaW52YWxpZCB2YWx1ZSBoYXMgYmVlbiBzcGVjaWZpZWQKLQkJaWYgKGlzUnVubmluZ1dpdGhOaW8oKSkKLQkJCXJldHVybiBuZXcgTG9ja2VyX0phdmFOaW8obG9jayk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgTG9ja2VyX0phdmFJbyhsb2NrKTsKLQl9Ci0KLQlwdWJsaWMgQmFzaWNMb2NhdGlvbihTdHJpbmcgcHJvcGVydHksIFVSTCBkZWZhdWx0VmFsdWUsIGJvb2xlYW4gaXNSZWFkT25seSkgewotCQlzdXBlcigpOwotCQl0aGlzLmRlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLQkJdGhpcy5pc1JlYWRPbmx5ID0gaXNSZWFkT25seTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhbGxvd3NEZWZhdWx0KCkgewotCQlyZXR1cm4gZGVmYXVsdFZhbHVlICE9IG51bGw7Ci0JfQotCi0JcHVibGljIFVSTCBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gZGVmYXVsdFZhbHVlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgTG9jYXRpb24gZ2V0UGFyZW50TG9jYXRpb24oKSB7Ci0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBVUkwgZ2V0VVJMKCkgewotCQlpZiAobG9jYXRpb24gPT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUgIT0gbnVsbCkKLQkJCXNldFVSTChkZWZhdWx0VmFsdWUsIGZhbHNlKTsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1NldCgpIHsKLQkJcmV0dXJuIGxvY2F0aW9uICE9IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJcmV0dXJuIGlzUmVhZE9ubHk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gc2V0VVJMKFVSTCB2YWx1ZSwgYm9vbGVhbiBsb2NrKSB7Ci0JCS8vCQlpZiAobG9jYXRpb24gIT0gbnVsbCkKLQkJLy8JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLkVDTElQU0VfQ0FOTk9UX0NIQU5HRV9MT0NBVElPTik7Ci0JCS8vLy8JCUZpbGUgZmlsZSA9IG51bGw7Ci0JCS8vLy8JCWlmICh2YWx1ZS5nZXRQcm90b2NvbCgpLmVxdWFsc0lnbm9yZUNhc2UoImZpbGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCS8vLy8JCQl0cnkgewotCQkvLy8vCQkJCVN0cmluZyBiYXNlUGF0aCA9IG5ldyBGaWxlKHZhbHVlLmdldEZpbGUoKSkuZ2V0Q2Fub25pY2FsUGF0aCgpOwotCQkvLy8vCQkJCXZhbHVlID0gbmV3IFVSTCgiZmlsZToiICsgYmFzZVBhdGgpOyAvLyROT04tTkxTLTEkCi0JCS8vLy8JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vLy8JCQkJLy8gZG8gbm90aGluZyBqdXN0IHVzZSB0aGUgb3JpZ2luYWwgdmFsdWUKLQkJLy8vLwkJCX0KLQkJLy8vLwkJCWZpbGUgPSBuZXcgRmlsZSh2YWx1ZS5nZXRGaWxlKCksIExPQ0tfRklMRU5BTUUpOwotCQkvLy8vCQl9Ci0JCS8vCQlsb2NrID0gbG9jayAmJiAhaXNSZWFkT25seTsKLQkJLy8JCWlmIChsb2NrKSB7Ci0JCS8vCQkJdHJ5IHsKLQkJLy8JCQkJaWYgKCFsb2NrKGZpbGUpKQotCQkvLwkJCQkJcmV0dXJuIGZhbHNlOwotCQkvLwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJLy8JCQkJcmV0dXJuIGZhbHNlOwotCQkvLwkJCX0KLQkJLy8JCX0KLQkJLy8JCWxvY2tGaWxlID0gZmlsZTsKLQkJbG9jYXRpb24gPSB2YWx1ZTsKLQkJLy8JCUxvY2F0aW9uTWFuYWdlci5idWlsZFVSTCh2YWx1ZS50b0V4dGVybmFsRm9ybSgpLCB0cnVlKTsKLQkJLy8JCWlmIChwcm9wZXJ0eSAhPSBudWxsKQotCQkvLwkJCVN5c3RlbS5zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgbG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSk7Ci0JCXJldHVybiBsb2NrOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldChVUkwgdmFsdWUsIGJvb2xlYW4gbG9jaykgewotCQlsb2NhdGlvbiA9IHZhbHVlOwotCQlyZXR1cm4gbG9jazsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UGFyZW50KExvY2F0aW9uIHZhbHVlKSB7Ci0JCXBhcmVudCA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKCFpc1NldCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbG9jayhsb2NrRmlsZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGxvY2soRmlsZSBsb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobG9jayA9PSBudWxsIHx8IGlzUmVhZE9ubHkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJRmlsZSBwYXJlbnRGaWxlID0gbmV3IEZpbGUobG9jay5nZXRQYXJlbnQoKSk7Ci0JCWlmICghcGFyZW50RmlsZS5leGlzdHMoKSkKLQkJCWlmICghcGFyZW50RmlsZS5ta2RpcnMoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJc2V0TG9ja2VyKGxvY2spOwotCQlpZiAobG9ja2VyID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJYm9vbGVhbiBsb2NrZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWxvY2tlZCA9IGxvY2tlci5sb2NrKCk7Ci0JCQlyZXR1cm4gbG9ja2VkOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKCFsb2NrZWQpCi0JCQkJbG9ja2VyID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRMb2NrZXIoRmlsZSBsb2NrKSB7Ci0JCWlmIChsb2NrZXIgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGxvY2tNb2RlID0gQWN0aXZhdG9yLmNvbnRleHQuZ2V0UHJvcGVydHkoUFJPUF9PU0dJX0xPQ0tJTkcpOwotCQlsb2NrZXIgPSBjcmVhdGVMb2NrZXIobG9jaywgbG9ja01vZGUpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlKCkgewotCQlpZiAobG9ja2VyICE9IG51bGwpCi0JCQlsb2NrZXIucmVsZWFzZSgpOwotCX0KLQotCXB1YmxpYyBVUkwgZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5VVJMKCkgewotCQkvL3RoZSBjYWNoZSBpcyBhIGNvLWxvY2F0ZWQgcmVwb3NpdG9yeQotCQlyZXR1cm4gZ2V0TWV0YWRhdGFSZXBvc2l0b3J5VVJMKCk7Ci0JfQotCi0JcHVibGljIFVSTCBnZXRNZXRhZGF0YVJlcG9zaXRvcnlVUkwoKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChnZXREYXRhQXJlYShBY3RpdmF0b3IuSUQpLCAiY2FjaGUvIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIFVSTCBnZXREYXRhQXJlYShTdHJpbmcgdG91Y2hwb2ludElkKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChnZXRVUkwoKSwgdG91Y2hwb2ludElkICsgJy8nKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9Mb2NrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvTG9ja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NzYxNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9Mb2NrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEludGVybmFsIGNsYXNzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIExvY2tlciB7Ci0JcHVibGljIGJvb2xlYW4gbG9jaygpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvTG9ja2VyX0phdmFJby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9Mb2NrZXJfSmF2YUlvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMzI1MjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9Mb2NrZXJfSmF2YUlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIEludGVybmFsIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgTG9ja2VyX0phdmFJbyBpbXBsZW1lbnRzIExvY2tlciB7Ci0JcHJpdmF0ZSBGaWxlIGxvY2tGaWxlOwotCXByaXZhdGUgUmFuZG9tQWNjZXNzRmlsZSBsb2NrUkFGOwotCi0JcHVibGljIExvY2tlcl9KYXZhSW8oRmlsZSBsb2NrRmlsZSkgewotCQl0aGlzLmxvY2tGaWxlID0gbG9ja0ZpbGU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGxvY2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvL2lmIHRoZSBsb2NrIGZpbGUgYWxyZWFkeSBleGlzdHMsIHRyeSB0byBkZWxldGUsCi0JCS8vYXNzdW1lIGZhaWx1cmUgbWVhbnMgYW5vdGhlciBlY2xpcHNlIGhhcyBpdCBvcGVuCi0JCWlmIChsb2NrRmlsZS5leGlzdHMoKSkKLQkJCWxvY2tGaWxlLmRlbGV0ZSgpOwotCQlpZiAobG9ja0ZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy9vcGVuIHRoZSBsb2NrIGZpbGUgc28gb3RoZXIgaW5zdGFuY2VzIGNhbid0IGNvLWV4aXN0Ci0JCWxvY2tSQUYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShsb2NrRmlsZSwgInJ3Iik7IC8vJE5PTi1OTFMtMSQKLQkJbG9ja1JBRi53cml0ZUJ5dGUoMCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAobG9ja1JBRiAhPSBudWxsKSB7Ci0JCQkJbG9ja1JBRi5jbG9zZSgpOwotCQkJCWxvY2tSQUYgPSBudWxsOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2Rvbid0IGNvbXBsYWluLCB3ZSdyZSBtYWtpbmcgYSBiZXN0IGVmZm9ydCB0byBjbGVhbiB1cAotCQl9Ci0JCWlmIChsb2NrRmlsZSAhPSBudWxsKQotCQkJbG9ja0ZpbGUuZGVsZXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9Mb2NrZXJfSmF2YU5pby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9Mb2NrZXJfSmF2YU5pby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjRlM2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvTG9ja2VyX0phdmFOaW8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuRmlsZUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBJbnRlcm5hbCBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIExvY2tlcl9KYXZhTmlvIGltcGxlbWVudHMgTG9ja2VyIHsKLQlwcml2YXRlIEZpbGUgbG9ja0ZpbGU7Ci0JcHJpdmF0ZSBGaWxlTG9jayBmaWxlTG9jazsKLQlwcml2YXRlIFJhbmRvbUFjY2Vzc0ZpbGUgcmFGaWxlOwotCi0JcHVibGljIExvY2tlcl9KYXZhTmlvKEZpbGUgbG9ja0ZpbGUpIHsKLQkJdGhpcy5sb2NrRmlsZSA9IGxvY2tGaWxlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBsb2NrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmFGaWxlID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUobG9ja0ZpbGUsICJydyIpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQkvLyBGaXggZm9yIGJ1ZyBodHRwOi8vYnVncy5zdW4uY29tL3ZpZXdfYnVnLmRvP2J1Z19pZD02NjI4NTc1IGFuZAotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTQ0NzM1Ci0JCQlmaWxlTG9jayA9IHJhRmlsZS5nZXRDaGFubmVsKCkudHJ5TG9jaygwLCAxLCBmYWxzZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJLy8gcHJpbnQgZXhjZXB0aW9uIGlmIGRlYnVnZ2luZwotCQkJaWYgKEJhc2ljTG9jYXRpb24uREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLmxvY2F0aW9uX2Nhbm5vdExvY2ssIGxvY2tGaWxlKSk7Ci0JCQkvLyBwcm9kdWNlIGEgbW9yZSBzcGVjaWZpYyBtZXNzYWdlIGZvciBjbGllbnRzCi0JCQlTdHJpbmcgc3BlY2lmaWNNZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMubG9jYXRpb25fY2Fubm90TG9ja05JTywgbmV3IE9iamVjdFtdIHtsb2NrRmlsZSwgaW9lLmdldE1lc3NhZ2UoKSwgIlwiLUQiICsgQmFzaWNMb2NhdGlvbi5QUk9QX09TR0lfTE9DS0lORyArICI9bm9uZVwiIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihzcGVjaWZpY01lc3NhZ2UpOwotCQl9Ci0JCWlmIChmaWxlTG9jayAhPSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJhRmlsZS5jbG9zZSgpOwotCQlyYUZpbGUgPSBudWxsOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChmaWxlTG9jayAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZpbGVMb2NrLnJlbGVhc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvL2Rvbid0IGNvbXBsYWluLCB3ZSdyZSBtYWtpbmcgYSBiZXN0IGVmZm9ydCB0byBjbGVhbiB1cAotCQkJfQotCQkJZmlsZUxvY2sgPSBudWxsOwotCQl9Ci0JCWlmIChyYUZpbGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyYUZpbGUuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvL2Rvbid0IGNvbXBsYWluLCB3ZSdyZSBtYWtpbmcgYSBiZXN0IGVmZm9ydCB0byBjbGVhbiB1cAotCQkJfQotCQkJcmFGaWxlID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzYWI3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlcwotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9jYXRpb25fY2Fubm90TG9jazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBsb2NhdGlvbl9jYW5ub3RMb2NrTklPOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvUHJvdmlzaW9uaW5nRXZlbnRCdXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvUHJvdmlzaW9uaW5nRXZlbnRCdXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmZjgwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL1Byb3Zpc2lvbmluZ0V2ZW50QnVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmV2ZW50bWdyLio7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIElQcm92aXNpb25pbmdFdmVudEJ1c30gc2VydmljZS4KLSAqLwotcHVibGljIGNsYXNzIFByb3Zpc2lvbmluZ0V2ZW50QnVzIGltcGxlbWVudHMgRXZlbnREaXNwYXRjaGVyLCBJUHJvdmlzaW9uaW5nRXZlbnRCdXMgewotCXByaXZhdGUgRXZlbnRMaXN0ZW5lcnMgc3luY0xpc3RlbmVycyA9IG5ldyBFdmVudExpc3RlbmVycygpOwotCXByaXZhdGUgRXZlbnRMaXN0ZW5lcnMgYXN5bmNMaXN0ZW5lcnMgPSBuZXcgRXZlbnRMaXN0ZW5lcnMoKTsKLQlwcml2YXRlIEV2ZW50TWFuYWdlciBldmVudE1hbmFnZXIgPSBuZXcgRXZlbnRNYW5hZ2VyKCJQcm92aXNpb25pbmcgRXZlbnQgRGlzcGF0Y2hlciIpOyAvLyROT04tTkxTLTEkCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuSVByb3Zpc2lvbmluZ0V2ZW50QnVzI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5Qcm92aXNpb25pbmdMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihQcm92aXNpb25pbmdMaXN0ZW5lciB0b0FkZCkgewotCQlpZiAodG9BZGQgaW5zdGFuY2VvZiBTeW5jaHJvbm91c1Byb3Zpc2lvbmluZ0xpc3RlbmVyKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKHN5bmNMaXN0ZW5lcnMpIHsKLQkJCQlzeW5jTGlzdGVuZXJzLmFkZExpc3RlbmVyKHRvQWRkLCB0b0FkZCk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jTGlzdGVuZXJzKSB7Ci0JCQkJYXN5bmNMaXN0ZW5lcnMuYWRkTGlzdGVuZXIodG9BZGQsIHRvQWRkKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXMjcmVtb3ZlTGlzdGVuZXIob3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLlByb3Zpc2lvbmluZ0xpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKFByb3Zpc2lvbmluZ0xpc3RlbmVyIHRvUmVtb3ZlKSB7Ci0JCWlmICh0b1JlbW92ZSBpbnN0YW5jZW9mIFN5bmNocm9ub3VzUHJvdmlzaW9uaW5nTGlzdGVuZXIpIHsKLQkJCXN5bmNocm9uaXplZCAoc3luY0xpc3RlbmVycykgewotCQkJCWlmIChzeW5jTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJc3luY0xpc3RlbmVycy5yZW1vdmVMaXN0ZW5lcih0b1JlbW92ZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJc3luY2hyb25pemVkIChhc3luY0xpc3RlbmVycykgewotCQkJCWlmIChhc3luY0xpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCWFzeW5jTGlzdGVuZXJzLnJlbW92ZUxpc3RlbmVyKHRvUmVtb3ZlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuSVByb3Zpc2lvbmluZ0V2ZW50QnVzI3B1Ymxpc2hFdmVudChqYXZhLnV0aWwuRXZlbnRPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgcHVibGlzaEV2ZW50KEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCS8qIHF1ZXVlIHRvIGhvbGQgc2V0IG9mIGxpc3RlbmVycyAqLwotCQlMaXN0ZW5lclF1ZXVlIGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lclF1ZXVlKGV2ZW50TWFuYWdlcik7Ci0KLQkJLyogc3luY2hyb25pemUgd2hpbGUgYnVpbGRpbmcgdGhlIGxpc3RlbmVyIGxpc3QgKi8KLQkJc3luY2hyb25pemVkIChzeW5jTGlzdGVuZXJzKSB7Ci0JCQkvKiBhZGQgc2V0IG9mIEJ1bmRsZUNvbnRleHRzIHcvIGxpc3RlbmVycyB0byBxdWV1ZSAqLwotCQkJbGlzdGVuZXJzLnF1ZXVlTGlzdGVuZXJzKHN5bmNMaXN0ZW5lcnMsIHRoaXMpOwotCQkJLyogc3luY2hyb25vdXNseSBkaXNwYXRjaCB0byBwb3B1bGF0ZSBsaXN0ZW5lcnMgcXVldWUgKi8KLQkJCWxpc3RlbmVycy5kaXNwYXRjaEV2ZW50U3luY2hyb25vdXMoMCwgZXZlbnQpOwotCQl9Ci0KLQkJbGlzdGVuZXJzID0gbmV3IExpc3RlbmVyUXVldWUoZXZlbnRNYW5hZ2VyKTsKLQkJc3luY2hyb25pemVkIChhc3luY0xpc3RlbmVycykgewotCQkJbGlzdGVuZXJzLnF1ZXVlTGlzdGVuZXJzKGFzeW5jTGlzdGVuZXJzLCB0aGlzKTsKLQkJCWxpc3RlbmVycy5kaXNwYXRjaEV2ZW50QXN5bmNocm9ub3VzKDAsIGV2ZW50KTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXMjZGlzcGF0Y2hFdmVudChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0LCBpbnQsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcGF0Y2hFdmVudChPYmplY3QgZXZlbnRMaXN0ZW5lciwgT2JqZWN0IGxpc3RlbmVyT2JqZWN0LCBpbnQgZXZlbnRBY3Rpb24sIE9iamVjdCBldmVudE9iamVjdCkgewotCQl0cnkgewotCQkJKChQcm92aXNpb25pbmdMaXN0ZW5lcikgZXZlbnRMaXN0ZW5lcikubm90aWZ5KChFdmVudE9iamVjdCkgZXZlbnRPYmplY3QpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCS8vVE9ETyBOZWVkIHRvIGRvIHRoZSBhcHByb3ByaWF0ZSBsb2dnaW5nCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuSVByb3Zpc2lvbmluZ0V2ZW50QnVzI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHsKLQkJZXZlbnRNYW5hZ2VyLmNsb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9TdHJpbmdQb29sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL1N0cmluZ1Bvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlMmIzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL1N0cmluZ1Bvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBBIHN0cmluZyBwb29sIGlzIHVzZWQgZm9yIHNoYXJpbmcgc3RyaW5ncyBpbiBhIHdheSB0aGF0IGVsaW1pbmF0ZXMgZHVwbGljYXRlCi0gKiBlcXVhbCBzdHJpbmdzLiAgQSBzdHJpbmcgcG9vbCBpbnN0YW5jZSBjYW4gYmUgbWFpbnRhaW5lZCBvdmVyIGEgbG9uZyBwZXJpb2QKLSAqIG9mIHRpbWUsIG9yIHVzZWQgYXMgYSB0ZW1wb3Jhcnkgc3RydWN0dXJlIGR1cmluZyBhIHN0cmluZyBzaGFyaW5nIHBhc3Mgb3ZlcgotICogYSBkYXRhIHN0cnVjdHVyZS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU3RyaW5nUG9vbCB7Ci0JcHJpdmF0ZSBpbnQgc2F2aW5nczsKLQlwcml2YXRlIGZpbmFsIEhhc2hNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc3RyaW5nIHBvb2wuCi0JICovCi0JcHVibGljIFN0cmluZ1Bvb2woKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIDxjb2RlPlN0cmluZzwvY29kZT4gdG8gdGhlIHBvb2wuICBSZXR1cm5zIGEgPGNvZGU+U3RyaW5nPC9jb2RlPgotCSAqIHRoYXQgaXMgZXF1YWwgdG8gdGhlIGFyZ3VtZW50IGJ1dCB0aGF0IGlzIHVuaXF1ZSB3aXRoaW4gdGhpcyBwb29sLgotCSAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byBhZGQgdG8gdGhlIHBvb2wKLQkgKiBAcmV0dXJuIEEgc3RyaW5nIHRoYXQgaXMgZXF1YWwgdG8gdGhlIGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgYWRkKFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKHN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIHN0cmluZzsKLQkJT2JqZWN0IHJlc3VsdCA9IG1hcC5nZXQoc3RyaW5nKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlpZiAocmVzdWx0ICE9IHN0cmluZykKLQkJCQlzYXZpbmdzICs9IDQ0ICsgMiAqIHN0cmluZy5sZW5ndGgoKTsKLQkJCXJldHVybiAoU3RyaW5nKSByZXN1bHQ7Ci0JCX0KLQkJbWFwLnB1dChzdHJpbmcsIHN0cmluZyk7Ci0JCXJldHVybiBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgc2l6ZSBpbiBieXRlcyB0aGF0IHdhcyBzYXZlZCBieSBzaGFyaW5nIHN0cmluZ3MgaW4gCi0JICogdGhlIHBvb2wuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIHJldHVybnMgdGhlIHNpemUgb2YgYWxsIHN0cmluZ3MgdGhhdCB3ZXJlIGFkZGVkIHRvIHRoZQotCSAqIHBvb2wgYWZ0ZXIgYW4gZXF1YWwgc3RyaW5nIGhhZCBhbHJlYWR5IGJlZW4gYWRkZWQuICBUaGlzIHZhbHVlIGNhbiBiZSB1c2VkCi0JICogdG8gZXN0aW1hdGUgdGhlIGVmZmVjdGl2ZW5lc3Mgb2YgYSBzdHJpbmcgc2hhcmluZyBvcGVyYXRpb24sIGluIG9yZGVyIHRvIAotCSAqIGRldGVybWluZSBpZiBvciB3aGVuIGl0IHNob3VsZCBiZSBwZXJmb3JtZWQgYWdhaW4uCi0JICogCi0JICogSW4gc29tZSBjYXNlcyB0aGlzIGRvZXMgbm90IHByZWNpc2VseSByZXByZXNlbnQgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IAotCSAqIHdlcmUgc2F2ZWQuICBGb3IgZXhhbXBsZSwgc2F5IHRoZSBwb29sIGFscmVhZHkgY29udGFpbnMgc3RyaW5nIFMxLiAgTm93IAotCSAqIHN0cmluZyBTMiwgd2hpY2ggaXMgZXF1YWwgdG8gUzEgYnV0IG5vdCBpZGVudGljYWwsIGlzIGFkZGVkIHRvIHRoZSBwb29sIGZpdmUgCi0JICogdGltZXMuIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzaXplIG9mIHN0cmluZyBTMiBtdWx0aXBsaWVkIGJ5IHRoZSAKLQkgKiBudW1iZXIgb2YgdGltZXMgaXQgd2FzIGFkZGVkLCBldmVuIHRob3VnaCB0aGUgYWN0dWFsIHNhdmluZ3MgaW4gdGhpcyBjYXNlCi0JICogaXMgb25seSB0aGUgc2l6ZSBvZiBhIHNpbmdsZSBjb3B5IG9mIFMyLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2F2ZWRTdHJpbmdDb3VudCgpIHsKLQkJcmV0dXJuIHNhdmluZ3M7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL0ZpbGVVdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL0ZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjkzMDM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9GaWxlVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlVXRpbHMgewotCi0JLyoqCi0JICogVW56aXAgZnJvbSBhIEZpbGUgdG8gYW4gb3V0cHV0IGRpcmVjdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGVbXSB1bnppcEZpbGUoRmlsZSB6aXBGaWxlLCBGaWxlIG91dHB1dERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGUpOwotCQl0cnkgewotCQkJcmV0dXJuIHVuemlwU3RyZWFtKGluLCB6aXBGaWxlLmxlbmd0aCgpLCBvdXRwdXREaXIsIG51bGwsIG51bGwpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBhZGQgdGhlIGZpbGUgbmFtZSB0byB0aGUgbWVzc2FnZQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlV0aWxfRXJyb3JfVW56aXBwaW5nLCB6aXBGaWxlLCBlLmdldE1lc3NhZ2UoKSkpOwotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVuemlwIGZyb20gYSBGaWxlIHRvIGFuIG91dHB1dCBkaXJlY3RvcnksIHdpdGggcHJvZ3Jlc3MgaW5kaWNhdGlvbi4KLQkgKiBtb25pdG9yIG1heSBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZVtdIHVuemlwRmlsZShGaWxlIHppcEZpbGUsIEZpbGUgb3V0cHV0RGlyLCBTdHJpbmcgdGFza05hbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGUpOwotCQl0cnkgewotCQkJcmV0dXJuIHVuemlwU3RyZWFtKGluLCB6aXBGaWxlLmxlbmd0aCgpLCBvdXRwdXREaXIsIHRhc2tOYW1lLCBtb25pdG9yKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gYWRkIHRoZSBmaWxlIG5hbWUgdG8gdGhlIG1lc3NhZ2UKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5VdGlsX0Vycm9yX1VuemlwcGluZywgemlwRmlsZSwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbnppcCBmcm9tIGEgVVJMIHRvIGFuIG91dHB1dCBkaXJlY3RvcnksIHdpdGggcHJvZ3Jlc3MgaW5kaWNhdGlvbi4KLQkgKiBtb25pdG9yIG1heSBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZVtdIHVuemlwVVJMKFVSTCB6aXBVUkwsIEZpbGUgb3V0cHV0RGlyLCBTdHJpbmcgdGFza05hbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHNpemUgPSB6aXBVUkwub3BlbkNvbm5lY3Rpb24oKS5nZXRDb250ZW50TGVuZ3RoKCk7Ci0JCUlucHV0U3RyZWFtIGluID0gemlwVVJMLm9wZW5TdHJlYW0oKTsKLQkJdHJ5IHsKLQkJCXJldHVybiB1bnppcFN0cmVhbShpbiwgc2l6ZSwgb3V0cHV0RGlyLCB0YXNrTmFtZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGFkZCB0aGUgVVJMIHRvIHRoZSBtZXNzYWdlCi0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuVXRpbF9FcnJvcl9VbnppcHBpbmcsIHppcFVSTCwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbnppcCBmcm9tIGFuIElucHV0U3RyZWFtIHRvIGFuIG91dHB1dCBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlW10gdW56aXBTdHJlYW0oSW5wdXRTdHJlYW0gc3RyZWFtLCBsb25nIHNpemUsIEZpbGUgb3V0cHV0RGlyLCBTdHJpbmcgdGFza05hbWUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaXMgPSBtb25pdG9yID09IG51bGwgPyBzdHJlYW0gOiBzdHJlYW07IC8vIG5ldyBQcm9ncmVzc01vbml0b3JJbnB1dFN0cmVhbShzdHJlYW0sIHNpemUsIHNpemUsIHRhc2tOYW1lLCBtb25pdG9yKTsgVE9ETyBDb21tZW50ZWQgY29kZQotCQlaaXBJbnB1dFN0cmVhbSBpbiA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpcykpOwotCQlaaXBFbnRyeSB6ZSA9IGluLmdldE5leHRFbnRyeSgpOwotCQlpZiAoemUgPT0gbnVsbCkgewotCQkJLy8gVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZW50cnkgaW4gYSB6aXAgZmlsZS4KLQkJCS8vIFdoZW4gdGhlcmUgaXNuJ3QgZ2V0TmV4dEVudHJ5IHJldHVybnMgbnVsbC4KLQkJCWluLmNsb3NlKCk7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZXMuVXRpbF9JbnZhbGlkX1ppcF9GaWxlX0Zvcm1hdCk7Ci0JCX0KLQkJQXJyYXlMaXN0IHVuemlwcGVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRvIHsKLQkJCUZpbGUgb3V0RmlsZSA9IG5ldyBGaWxlKG91dHB1dERpciwgemUuZ2V0TmFtZSgpKTsKLQkJCXVuemlwcGVkRmlsZXMuYWRkKG91dEZpbGUpOwotCQkJaWYgKHplLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlvdXRGaWxlLm1rZGlycygpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob3V0RmlsZS5leGlzdHMoKSkgewotCQkJCQlvdXRGaWxlLmRlbGV0ZSgpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW91dEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCX0KLQkJCQl0cnkgewotCQkJCQljb3B5U3RyZWFtKGluLCBmYWxzZSwgbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSksIHRydWUpOwotCQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRFTVA6IGlnbm9yZSB0aGlzIGZvciBub3cgaW4gY2FzZSB3ZSdyZSB0cnlpbmcgdG8gcmVwbGFjZQotCQkJCQkvLyBhIHJ1bm5pbmcgZWNsaXBzZS5leGUKLQkJCQl9Ci0JCQkJb3V0RmlsZS5zZXRMYXN0TW9kaWZpZWQoemUuZ2V0VGltZSgpKTsKLQkJCX0KLQkJCWluLmNsb3NlRW50cnkoKTsKLQkJfSB3aGlsZSAoKHplID0gaW4uZ2V0TmV4dEVudHJ5KCkpICE9IG51bGwpOwotCQlpbi5jbG9zZSgpOwotCi0JCXJldHVybiAoRmlsZVtdKSB1bnppcHBlZEZpbGVzLnRvQXJyYXkobmV3IEZpbGVbdW56aXBwZWRGaWxlcy5zaXplKCldKTsKLQl9Ci0KLQkvLyBEZWxldGUgZW1wdHkgZGlyZWN0b3JpZXMgdW5kZXIgZGlyLCBpbmNsdWRpbmcgZGlyIGl0c2VsZi4KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlRW1wdHlEaXJzKEZpbGUgZGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlW10gZmlsZXMgPSBkaXIubGlzdEZpbGVzKCk7Ci0JCWlmIChmaWxlcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSArPSAxKSB7Ci0JCQkJZGVsZXRlRW1wdHlEaXJzKGZpbGVzW2ldKTsKLQkJCX0KLQkJCWRpci5nZXRDYW5vbmljYWxGaWxlKCkuZGVsZXRlKCk7Ci0JCX0KLQl9Ci0KLQkvLyBEZWxldGUgdGhlIGdpdmVuIGZpbGUgd2hldGhlciBpdCBpcyBhIGZpbGUgb3IgYSBkaXJlY3RvcnkKLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlQWxsKEZpbGUgZmlsZSkgewotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IGZpbGUubGlzdEZpbGVzKCk7Ci0JCQlpZiAoZmlsZXMgIT0gbnVsbCkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKQotCQkJCQlkZWxldGVBbGwoZmlsZXNbaV0pOwotCQl9Ci0JCWZpbGUuZGVsZXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQ29weSBhbiBpbnB1dCBzdHJlYW0gdG8gYW4gb3V0cHV0IHN0cmVhbS4KLQkgKiBPcHRpb25hbGx5IGNsb3NlIHRoZSBzdHJlYW1zIHdoZW4gZG9uZS4KLQkgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNvcHlTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gY2xvc2VJbiwgT3V0cHV0U3RyZWFtIG91dCwgYm9vbGVhbiBjbG9zZU91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWludCB3cml0dGVuID0gMDsKLQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsxNiAqIDEwMjRdOwotCQkJaW50IGxlbjsKLQkJCXdoaWxlICgobGVuID0gaW4ucmVhZChidWZmZXIpKSAhPSAtMSkgewotCQkJCW91dC53cml0ZShidWZmZXIsIDAsIGxlbik7Ci0JCQkJd3JpdHRlbiArPSBsZW47Ci0JCQl9Ci0JCQlyZXR1cm4gd3JpdHRlbjsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNsb3NlSW4pIHsKLQkJCQkJaW4uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChjbG9zZU91dCkgewotCQkJCQlvdXQuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgemlwKEZpbGVbXSBzb3VyY2VGaWxlcywgRmlsZSBkZXN0aW5hdGlvbkFyY2hpdmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXppcChzb3VyY2VGaWxlcywgZGVzdGluYXRpb25BcmNoaXZlLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgemlwKEZpbGVbXSBzb3VyY2VGaWxlcywgRmlsZSBkZXN0aW5hdGlvbkFyY2hpdmUsIGJvb2xlYW4gaW5jbHVkZVJvb3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVppcE91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgWmlwT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uQXJjaGl2ZSkpOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VGaWxlcy5sZW5ndGg7IGkrKykKLQkJCQlpZiAoc291cmNlRmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkKLQkJCQkJemlwRGlyKG91dHB1dCwgc291cmNlRmlsZXNbaV0sIGluY2x1ZGVSb290ID8gbmV3IFBhdGgoc291cmNlRmlsZXNbaV0uZ2V0TmFtZSgpKSA6IG5ldyBQYXRoKCIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlCi0JCQkJCXppcEZpbGUob3V0cHV0LCBzb3VyY2VGaWxlc1tpXSwgbmV3IFBhdGgoIiIpKTsvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCS8vIE5vdGUhIFRoaXMgY2FsbCB3aWxsIGZhaWwgbWlzZXJhYmx5IGlmIG5vIGVudHJpZXMgd2VyZSBhZGRlZCB0byB0aGUgemlwIQotCQkJCS8vIFRoZSBmaWxlIGlzIGxlZnQgb3BlbiBhZnRlciBhbiBleGNlcHRpb24gaXMgdGhyb3duLgotCQkJCW91dHB1dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBaaXAgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBkaXJlY3RvcnkgaW50byB0aGUgemlwIGZpbGUgcmVwcmVzZW50ZWQgYnkKLQkgKiB0aGUgZ2l2ZW4gemlwIHN0cmVhbS4gUHJlcGVuZCB0aGUgZ2l2ZW4gcHJlZml4IHRvIHRoZSBmaWxlIHBhdGhzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgemlwRGlyKFppcE91dHB1dFN0cmVhbSBvdXRwdXQsIEZpbGUgc291cmNlLCBJUGF0aCBwcmVmaXgpIHsKLQkJRmlsZVtdIGZpbGVzID0gc291cmNlLmxpc3RGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWlmIChmaWxlc1tpXS5pc0ZpbGUoKSkKLQkJCQkJemlwRmlsZShvdXRwdXQsIGZpbGVzW2ldLCBwcmVmaXgpOwotCQkJCWVsc2UKLQkJCQkJemlwRGlyKG91dHB1dCwgZmlsZXNbaV0sIHByZWZpeC5hcHBlbmQoZmlsZXNbaV0uZ2V0TmFtZSgpKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQWRkIHRoZSBnaXZlbiBmaWxlIHRvIHRoZSB6aXAgZmlsZSByZXByZXNlbnRlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KLQkgKiBQcmVwZW5kIHRoZSBnaXZlbiBwcmVmaXggdG8gdGhlIHBhdGggb2YgdGhlIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB6aXBGaWxlKFppcE91dHB1dFN0cmVhbSBvdXRwdXQsIEZpbGUgc291cmNlRmlsZSwgSVBhdGggcHJlZml4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc291cmNlRmlsZSk7Ci0JCXRyeSB7Ci0JCQlaaXBFbnRyeSB6aXBFbnRyeSA9IG5ldyBaaXBFbnRyeShwcmVmaXguYXBwZW5kKHNvdXJjZUZpbGUuZ2V0TmFtZSgpKS50b1N0cmluZygpKTsKLQkJCXppcEVudHJ5LnNldFRpbWUoc291cmNlRmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0JCQlvdXRwdXQucHV0TmV4dEVudHJ5KHppcEVudHJ5KTsKLQkJCWNvcHlTdHJlYW0oaW5wdXQsIHRydWUsIG91dHB1dCwgZmFsc2UpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJdHJ5IHsKLQkJCQlvdXRwdXQuY2xvc2VFbnRyeSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL0hlYWRlcnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9IZWFkZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYjJmZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL0hlYWRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247Ci0KLS8qKgotICogSGVhZGVycyBjbGFzc2VzLiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBEaWN0aW9uYXJ5IHRoYXQgaGFzCi0gKiB0aGUgZm9sbG93aW5nIGJlaGF2aW91cjoKLSAqIDx1bD4KLSAqIDxsaT5wdXQgYW5kIHJlbW92ZSBjbGVhciB0aHJvdyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi4KLSAqIFRoZSBEaWN0aW9uYXJ5IGlzIHRodXMgcmVhZC1vbmx5IHRvIG90aGVycy4KLSAqIDxsaT5UaGUgU3RyaW5nIGtleXMgaW4gdGhlIERpY3Rpb25hcnkgYXJlIGNhc2UtcHJlc2VydmVkLAotICogYnV0IHRoZSBnZXQgb3BlcmF0aW9uIGlzIGNhc2UtaW5zZW5zaXRpdmUuCi0gKiA8L3VsPgotICogVE9ETzogVGhpcyBjbGFzcyBpcyBjb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5vc2dpIGR1ZSB0byBhY2Nlc3MgcmVzdHJpY3Rpb25zLiBXZQotICogY2FuJ3QgbWFrZSB0aGlzIEFQSSBzbyB3ZSBuZWVkIHRvIGZpbmQgYSBwbGFjZSBmb3IgaXQuCi0gKiBAc2luY2UgMy4xCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWFkZXJzIGV4dGVuZHMgRGljdGlvbmFyeSBpbXBsZW1lbnRzIE1hcCB7Ci0JcHJpdmF0ZSBib29sZWFuIHJlYWRPbmx5ID0gZmFsc2U7Ci0JcHJpdmF0ZSBPYmplY3RbXSBoZWFkZXJzOwotCXByaXZhdGUgT2JqZWN0W10gdmFsdWVzOwotCXByaXZhdGUgaW50IHNpemUgPSAwOwotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGVtcHR5IEhlYWRlcnMgZGljdGlvbmFyeS4KLQkgKgotCSAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgVGhlIGluaXRpYWwgY2FwYWNpdHkgb2YgdGhpcyBIZWFkZXJzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgSGVhZGVycyhpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCXN1cGVyKCk7Ci0JCWhlYWRlcnMgPSBuZXcgT2JqZWN0W2luaXRpYWxDYXBhY2l0eV07Ci0JCXZhbHVlcyA9IG5ldyBPYmplY3RbaW5pdGlhbENhcGFjaXR5XTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBIZWFkZXJzIGRpY3Rpb25hcnkgZnJvbSBhIERpY3Rpb25hcnkuCi0JICoKLQkgKiBAcGFyYW0gdmFsdWVzIFRoZSBpbml0aWFsIGRpY3Rpb25hcnkgZm9yIHRoaXMgSGVhZGVycyBvYmplY3QuCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgYSBjYXNlLXZhcmlhbnQgb2YgdGhlIGtleSBpcwotCSAqIGluIHRoZSBkaWN0aW9uYXJ5IHBhcmFtZXRlci4KLQkgKi8KLQlwdWJsaWMgSGVhZGVycyhEaWN0aW9uYXJ5IHZhbHVlcykgewotCQl0aGlzKHZhbHVlcy5zaXplKCkpOwotCQkvKiBpbml0aWFsaXplIHRoZSBoZWFkZXJzIGFuZCB2YWx1ZXMgKi8KLQkJRW51bWVyYXRpb24ga2V5cyA9IHZhbHVlcy5rZXlzKCk7Ci0JCXdoaWxlIChrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlPYmplY3Qga2V5ID0ga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJc2V0KGtleSwgdmFsdWVzLmdldChrZXkpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhc2UtcHJlc2VydmVkIGtleXMuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBFbnVtZXJhdGlvbiBrZXlzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5RW51bWVyYXRpb24oaGVhZGVycywgc2l6ZSk7Ci0JfQotCi0JLyoqCi0JICogVmFsdWVzLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7Ci0JCXJldHVybiBuZXcgQXJyYXlFbnVtZXJhdGlvbih2YWx1ZXMsIHNpemUpOwotCX0KLQotCXByaXZhdGUgaW50IGdldEluZGV4KE9iamVjdCBrZXkpIHsKLQkJYm9vbGVhbiBzdHJpbmdLZXkgPSBrZXkgaW5zdGFuY2VvZiBTdHJpbmc7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoc3RyaW5nS2V5ICYmIChoZWFkZXJzW2ldIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCWlmICgoKFN0cmluZykgaGVhZGVyc1tpXSkuZXF1YWxzSWdub3JlQ2FzZSgoU3RyaW5nKSBrZXkpKQotCQkJCQlyZXR1cm4gaTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGhlYWRlcnNbaV0uZXF1YWxzKGtleSkpCi0JCQkJCXJldHVybiBpOwotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCByZW1vdmUoaW50IHJlbW92ZSkgewotCQlPYmplY3QgcmVtb3ZlZCA9IHZhbHVlc1tyZW1vdmVdOwotCQlmb3IgKGludCBpID0gcmVtb3ZlOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAoaSA9PSBoZWFkZXJzLmxlbmd0aCAtIDEpIHsKLQkJCQloZWFkZXJzW2ldID0gbnVsbDsKLQkJCQl2YWx1ZXNbaV0gPSBudWxsOwotCQkJfSBlbHNlIHsKLQkJCQloZWFkZXJzW2ldID0gaGVhZGVyc1tpICsgMV07Ci0JCQkJdmFsdWVzW2ldID0gdmFsdWVzW2kgKyAxXTsKLQkJCX0KLQkJfQotCQlpZiAocmVtb3ZlIDwgc2l6ZSkKLQkJCXNpemUtLTsKLQkJcmV0dXJuIHJlbW92ZWQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZChPYmplY3QgaGVhZGVyLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHNpemUgPT0gaGVhZGVycy5sZW5ndGgpIHsKLQkJCS8vIGdyb3cgdGhlIGFycmF5cwotCQkJT2JqZWN0W10gbmV3SGVhZGVycyA9IG5ldyBPYmplY3RbaGVhZGVycy5sZW5ndGggKyAxMF07Ci0JCQlPYmplY3RbXSBuZXdWYWx1ZXMgPSBuZXcgT2JqZWN0W3ZhbHVlcy5sZW5ndGggKyAxMF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGhlYWRlcnMsIDAsIG5ld0hlYWRlcnMsIDAsIGhlYWRlcnMubGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkodmFsdWVzLCAwLCBuZXdWYWx1ZXMsIDAsIHZhbHVlcy5sZW5ndGgpOwotCQkJaGVhZGVycyA9IG5ld0hlYWRlcnM7Ci0JCQl2YWx1ZXMgPSBuZXdWYWx1ZXM7Ci0JCX0KLQkJaGVhZGVyc1tzaXplXSA9IGhlYWRlcjsKLQkJdmFsdWVzW3NpemVdID0gdmFsdWU7Ci0JCXNpemUrKzsKLQl9Ci0KLQkvKioKLQkgKiBTdXBwb3J0IGNhc2UtaW5zZW5zaXRpdml0eSBmb3Iga2V5cy4KLQkgKgotCSAqIEBwYXJhbSBrZXkgbmFtZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotCQlpbnQgaSA9IC0xOwotCQlpZiAoKGkgPSBnZXRJbmRleChrZXkpKSAhPSAtMSkKLQkJCXJldHVybiB2YWx1ZXNbaV07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFNldCBhIGhlYWRlciB2YWx1ZSBvciBvcHRpb25hbGx5IHJlcGxhY2UgaXQgaWYgaXQgYWxyZWFkeSBleGlzdHMuCi0JICoKLQkgKiBAcGFyYW0ga2V5IEtleSBuYW1lLgotCSAqIEBwYXJhbSB2YWx1ZSBWYWx1ZSBvZiB0aGUga2V5IG9yIG51bGwgdG8gcmVtb3ZlIGtleS4KLQkgKiBAcGFyYW0gcmVwbGFjZSBBIHZhbHVlIG9mIHRydWUgd2lsbCBhbGxvdyBhIHByZXZpb3VzCi0JICogdmFsdWUgb2YgdGhlIGtleSB0byBiZSByZXBsYWNlZC4gIEEgdmFsdWUgb2YgZmFsc2UgCi0JICogd2lsbCBjYXVzZSBhbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gdG8gYmUgdGhyb3duIAotCSAqIGlmIGEgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGtleSBleGlzdHMuCi0JICogQHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgdG8gd2hpY2ggdGhlIGtleSB3YXMgbWFwcGVkLAotCSAqIG9yIG51bGwgaWYgdGhlIGtleSBkaWQgbm90IGhhdmUgYSBwcmV2aW91cyBtYXBwaW5nLgotCSAqCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgYSBjYXNlLXZhcmlhbnQgb2YgdGhlIGtleSBpcwotCSAqIGFscmVhZHkgcHJlc2VudC4KLQkgKiBAc2luY2UgMy4yCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3Qgc2V0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSwgYm9vbGVhbiByZXBsYWNlKSB7Ci0JCWlmIChyZWFkT25seSkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQlpZiAoa2V5IGluc3RhbmNlb2YgU3RyaW5nKQotCQkJa2V5ID0gKChTdHJpbmcpIGtleSkuaW50ZXJuKCk7Ci0JCWludCBpID0gZ2V0SW5kZXgoa2V5KTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsgLyogcmVtb3ZlICovCi0JCQlpZiAoaSAhPSAtMSkKLQkJCQlyZXR1cm4gcmVtb3ZlKGkpOwotCQl9IGVsc2UgeyAvKiBwdXQgKi8KLQkJCWlmIChpICE9IC0xKSB7IC8qIGR1cGxpY2F0ZSBrZXkgKi8KLQkJCQlpZiAoIXJlcGxhY2UpCi0JCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkhFQURFUl9EVVBMSUNBVEVfS0VZX0VYQ0VQVElPTjogIiArIGtleSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlPYmplY3Qgb2xkVmFsID0gdmFsdWVzW2ldOwotCQkJCXZhbHVlc1tpXSA9IHZhbHVlOwotCQkJCXJldHVybiBvbGRWYWw7Ci0JCQl9Ci0JCQlhZGQoa2V5LCB2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU2V0IGEgaGVhZGVyIHZhbHVlLgotCSAqCi0JICogQHBhcmFtIGtleSBLZXkgbmFtZS4KLQkgKiBAcGFyYW0gdmFsdWUgVmFsdWUgb2YgdGhlIGtleSBvciBudWxsIHRvIHJlbW92ZSBrZXkuCi0JICogQHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgdG8gd2hpY2ggdGhlIGtleSB3YXMgbWFwcGVkLAotCSAqIG9yIG51bGwgaWYgdGhlIGtleSBkaWQgbm90IGhhdmUgYSBwcmV2aW91cyBtYXBwaW5nLgotCSAqCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgYSBjYXNlLXZhcmlhbnQgb2YgdGhlIGtleSBpcwotCSAqIGFscmVhZHkgcHJlc2VudC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBzZXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCXJldHVybiBzZXQoa2V5LCB2YWx1ZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRSZWFkT25seSgpIHsKLQkJcmVhZE9ubHkgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIChkaXN0aW5jdCBrZXlzKSBpbiB0aGlzIGRpY3Rpb25hcnkuCi0JICoKLQkgKiBAcmV0dXJuICB0aGUgbnVtYmVyIG9mIGtleXMgaW4gdGhpcyBkaWN0aW9uYXJ5LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHNpemUoKSB7Ci0JCXJldHVybiBzaXplOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGlmIHRoaXMgZGljdGlvbmFyeSBtYXBzIG5vIGtleXMgdG8gdmFsdWUuIFRoZSBnZW5lcmFsIGNvbnRyYWN0Ci0JICogZm9yIHRoZSA8dHQ+aXNFbXB0eTwvdHQ+IG1ldGhvZCBpcyB0aGF0IHRoZSByZXN1bHQgaXMgdHJ1ZSBpZiBhbmQgb25seQotCSAqIGlmIHRoaXMgZGljdGlvbmFyeSBjb250YWlucyBubyBlbnRyaWVzLgotCSAqCi0JICogQHJldHVybiAgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBkaWN0aW9uYXJ5IG1hcHMgbm8ga2V5cyB0byB2YWx1ZXM7Ci0JICogICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHNpemUgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiBBbHdheXMgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uLgotCSAqCi0JICogQHBhcmFtIGtleSBoZWFkZXIgbmFtZS4KLQkgKiBAcGFyYW0gdmFsdWUgaGVhZGVyIHZhbHVlLgotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmIChyZWFkT25seSkKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQlyZXR1cm4gc2V0KGtleSwgdmFsdWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEFsd2F5cyB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24uCi0JICoKLQkgKiBAcGFyYW0ga2V5IGhlYWRlciBuYW1lLgotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAodmFsdWVzLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSGVhZGVycyBwYXJzZU1hbmlmZXN0KElucHV0U3RyZWFtIGluKSB0aHJvd3MgQnVuZGxlRXhjZXB0aW9uIHsKLQkJSGVhZGVycyBoZWFkZXJzID0gbmV3IEhlYWRlcnMoMTApOwotCQl0cnkgewotCQkJTWFuaWZlc3RFbGVtZW50LnBhcnNlQnVuZGxlTWFuaWZlc3QoaW4sIGhlYWRlcnMpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQnVuZGxlRXhjZXB0aW9uKCJFcnJvciByZWFkaW5nIGJ1bmRsZSBtYW5pZmVzdCIsIGUpOwotCQl9Ci0JCWhlYWRlcnMuc2V0UmVhZE9ubHkoKTsKLQkJcmV0dXJuIGhlYWRlcnM7Ci0JfQotCi0JY2xhc3MgQXJyYXlFbnVtZXJhdGlvbiBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLQkJcHJpdmF0ZSBPYmplY3RbXSBhcnJheTsKLQkJaW50IGN1ciA9IDA7Ci0KLQkJcHVibGljIEFycmF5RW51bWVyYXRpb24oT2JqZWN0W10gYXJyYXksIGludCBzaXplKSB7Ci0JCQl0aGlzLmFycmF5ID0gbmV3IE9iamVjdFtzaXplXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIHRoaXMuYXJyYXksIDAsIHRoaXMuYXJyYXkubGVuZ3RoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJCXJldHVybiBjdXIgPCBhcnJheS5sZW5ndGg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCQkJcmV0dXJuIGFycmF5W2N1cisrXTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHJlYWRPbmx5KQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIGdldEluZGV4KGtleSkgPj0gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YXIwKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCX0KLQotCXB1YmxpYyBTZXQga2V5U2V0KCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXRBbGwoTWFwIHZhcjApIHsKLQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gdmFsdWVzKCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvTG9nSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvTG9nSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiM2ZkNjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL0xvZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsubG9nLkZyYW1ld29ya0xvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5sb2cuRnJhbWV3b3JrTG9nRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBMb2dIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIHN0YXR1cykgewotCQlGcmFtZXdvcmtMb2cgbG9nID0gQWN0aXZhdG9yLmdldEZyYW1ld29ya0xvZygpOwotCQlpZiAobG9nICE9IG51bGwpIHsKLQkJCWxvZy5sb2coZ2V0TG9nKHN0YXR1cykpOwotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCQkJaWYgKHN0YXR1cy5nZXRFeGNlcHRpb24oKSAhPSBudWxsKQotCQkJCXN0YXR1cy5nZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coUHJvdmlzaW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQlsb2cobmV3IFN0YXR1cyhleGNlcHRpb24uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSwgQWN0aXZhdG9yLklELCAiUHJvdmlzaW9uaW5nIGV4Y2VwdGlvbiIsIGV4Y2VwdGlvbikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ29waWVkIGZyb20gUGxhdGZvcm1Mb2dXcml0ZXIgaW4gY29yZSBydW50aW1lLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEZyYW1ld29ya0xvZ0VudHJ5IGdldExvZyhJU3RhdHVzIHN0YXR1cykgewotCQlUaHJvd2FibGUgdCA9IHN0YXR1cy5nZXRFeGNlcHRpb24oKTsKLQkJQXJyYXlMaXN0IGNoaWxkbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpbnQgc3RhY2tDb2RlID0gdCBpbnN0YW5jZW9mIENvcmVFeGNlcHRpb24gPyAxIDogMDsKLQkJLy8gZW5zdXJlIGEgc3Vic3RhdHVzIGluc2lkZSBhIENvcmVFeGNlcHRpb24gaXMgcHJvcGVybHkgbG9nZ2VkIAotCQlpZiAoc3RhY2tDb2RlID09IDEpIHsKLQkJCUlTdGF0dXMgY29yZVN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgdCkuZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoY29yZVN0YXR1cyAhPSBudWxsKSB7Ci0JCQkJY2hpbGRsaXN0LmFkZChnZXRMb2coY29yZVN0YXR1cykpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0YXR1cy5pc011bHRpU3RhdHVzKCkpIHsKLQkJCUlTdGF0dXNbXSBjaGlsZHJlbiA9IHN0YXR1cy5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCWNoaWxkbGlzdC5hZGQoZ2V0TG9nKGNoaWxkcmVuW2ldKSk7Ci0JCQl9Ci0JCX0KLQotCQlGcmFtZXdvcmtMb2dFbnRyeVtdIGNoaWxkcmVuID0gKEZyYW1ld29ya0xvZ0VudHJ5W10pIChjaGlsZGxpc3Quc2l6ZSgpID09IDAgPyBudWxsIDogY2hpbGRsaXN0LnRvQXJyYXkobmV3IEZyYW1ld29ya0xvZ0VudHJ5W2NoaWxkbGlzdC5zaXplKCldKSk7Ci0KLQkJcmV0dXJuIG5ldyBGcmFtZXdvcmtMb2dFbnRyeShzdGF0dXMuZ2V0UGx1Z2luKCksIHN0YXR1cy5nZXRTZXZlcml0eSgpLCBzdGF0dXMuZ2V0Q29kZSgpLCBzdGF0dXMuZ2V0TWVzc2FnZSgpLCBzdGFja0NvZGUsIHQsIGNoaWxkcmVuKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjAwYTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZSBhbmQgYXNzaWduIHRvIGZpZWxkcyBiZWxvdwotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXRpbF9JbnZhbGlkX1ppcF9GaWxlX0Zvcm1hdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVdGlsX0Vycm9yX1VuemlwcGluZzsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL09yZGVyZWRQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvT3JkZXJlZFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MyYzg1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvT3JkZXJlZFByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotLyoqCi0gKiBBIFByb3BlcnRpZXMgY29sbGVjdGlvbiB0aGF0IG1haW50YWlucyB0aGUgb3JkZXIgb2YgaW5zZXJ0aW9uLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gc3RvcmUgcHJvcGVydGllcyBzaW1pbGFyIHRvIHtAbGluayBqYXZhLnV0aWwuUHJvcGVydGllc30uCi0gKiBJbiBwYXJ0aWN1bGFyIGJvdGgga2V5cyBhbmQgdmFsdWVzIGFyZSBzdHJpbmdzIGFuZCBtdXN0IGJlIG5vdCBudWxsLgotICogSG93ZXZlciB0aGlzIGNsYXNzIGlzIHNvbWV3aGF0IHNpbXBsaWZpZWQgYW5kIGRvZXMgbm90IGltcGxlbWVudCBDbG9uZWFibGUsIAotICogU2VyaWFsaXphYmxlIGFuZCBIYXNodGFibGUuCi0gKiA8cD4KLSAqIEluIGNvbnRyYXN0IHRvIGphdmEudXRpbC5Qcm9wZXJ0aWVzIHRoaXMgY2xhc3MgbWFpbnRhaW5zIHRoZSBvcmRlciBieSB3aGljaCAKLSAqIHByb3BlcnRpZXMgYXJlIGFkZGVkLiBUaGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIGEge0BsaW5rIExpbmtlZEhhc2hNYXB9LgotICogPHA+Ci0gKiBUaGUgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBkZWZhdWx0IHByb3BlcnRpZXMgYXMgdGhleSBjYW4gYmUgZXhwcmVzc2VkIGJ5IAotICogY3JlYXRpbmcgamF2YS51dGlsLlByb3BlcnRpZXMgaGllcmFyY2hpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBPcmRlcmVkUHJvcGVydGllcyBleHRlbmRzIERpY3Rpb25hcnkgaW1wbGVtZW50cyBNYXAgewotCi0JTGlua2VkSGFzaE1hcCBwcm9wZXJ0eU1hcCA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIE9yZGVyZWRQcm9wZXJ0aWVzIHVubW9kaWZpYWJsZVByb3BlcnRpZXMoTWFwIHByb3BlcnRpZXMpIHsKLQkJcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyBPcmRlcmVkUHJvcGVydGllcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgT3JkZXJlZFByb3BlcnRpZXMoaW50IHNpemUpIHsKLQkJc3VwZXIoKTsKLQkJcHJvcGVydHlNYXAgPSBuZXcgTGlua2VkSGFzaE1hcChzaXplKTsKLQl9Ci0KLQlwdWJsaWMgT3JkZXJlZFByb3BlcnRpZXMoT3JkZXJlZFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlzdXBlcigpOwotCQlwcm9wZXJ0eU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKHByb3BlcnRpZXMuc2l6ZSgpKTsKLQkJcHV0QWxsKHByb3BlcnRpZXMpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcHJvcGVydHkgdmFsdWUuCi0JICogPHA+Ci0JICogSWYgYSBwcm9wZXJ0eSB3aXRoIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMsIHRoZSBwcmV2aW91cwotCSAqIHZhbHVlIGlzIHJlcGxhY2VkLiBPdGhlcndpc2UgYSBuZXcgcHJvcGVydHkgaXMgYWRkZWQgYXQKLQkgKiB0aGUgZW5kIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIGtleSAgIG11c3Qgbm90IGJlIG51bGwKLQkgKiBAcGFyYW0gdmFsdWUgbXVzdCBub3QgYmUgbnVsbAotCSAqIEByZXR1cm4gcHJldmlvdXMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHNwZWNpZmllZCBrZXksIG9yIDx0dD5udWxsPC90dD4KLQkgKgkgICAgICAgaWYgdGhlcmUgd2FzIG5vIG1hcHBpbmcgZm9yIGtleS4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHNldFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlpbml0KCk7Ci0JCXJldHVybiBwcm9wZXJ0eU1hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoU3RyaW5nKSAocHJvcGVydHlNYXAgPT0gbnVsbCA/IG51bGwgOiBwcm9wZXJ0eU1hcC5nZXQoa2V5KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0QWxsKE9yZGVyZWRQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJcHV0QWxsKChNYXApIHByb3BlcnRpZXMpOwotCX0KLQotCS8qKgotCSAqCUluaXRpYWxpemUgdGhlIG1hcC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdCgpIHsKLQkJaWYgKHByb3BlcnR5TWFwID09IG51bGwpIHsKLQkJCXByb3BlcnR5TWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIHByb3BlcnR5TWFwID09IG51bGwgPyAwIDogcHJvcGVydHlNYXAuc2l6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU1hcCA9PSBudWxsID8gdHJ1ZSA6IHByb3BlcnR5TWFwLmlzRW1wdHkoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgY2xlYXIoKSB7Ci0JCXByb3BlcnR5TWFwID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHB1dChPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLQkJaW5pdCgpOwotCQlyZXR1cm4gcHJvcGVydHlNYXAucHV0KGFyZzAsIGFyZzEpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKLQkJcmV0dXJuIHByb3BlcnR5TWFwICE9IG51bGwgPyBwcm9wZXJ0eU1hcC5jb250YWluc0tleShrZXkpIDogZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJcmV0dXJuIHByb3BlcnR5TWFwICE9IG51bGwgPyBwcm9wZXJ0eU1hcC5jb250YWluc1ZhbHVlKHZhbHVlKSA6IGZhbHNlOwotCX0KLQotCXB1YmxpYyBTZXQgZW50cnlTZXQoKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU1hcCAhPSBudWxsID8gcHJvcGVydHlNYXAuZW50cnlTZXQoKSA6IENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldChPYmplY3Qga2V5KSB7Ci0JCXJldHVybiBwcm9wZXJ0eU1hcCAhPSBudWxsID8gcHJvcGVydHlNYXAuZ2V0KGtleSkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBTZXQga2V5U2V0KCkgewotCQlyZXR1cm4gcHJvcGVydHlNYXAgIT0gbnVsbCA/IHByb3BlcnR5TWFwLmtleVNldCgpIDogQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQotCXB1YmxpYyB2b2lkIHB1dEFsbChNYXAgYXJnMCkgewotCQlpbml0KCk7Ci0JCXByb3BlcnR5TWFwLnB1dEFsbChhcmcwKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5KSB7Ci0JCXJldHVybiBwcm9wZXJ0eU1hcCAhPSBudWxsID8gcHJvcGVydHlNYXAucmVtb3ZlKGtleSkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLQkJcmV0dXJuIHByb3BlcnR5TWFwICE9IG51bGwgPyBwcm9wZXJ0eU1hcC52YWx1ZXMoKSA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvID09IHRoaXMpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG8gaW5zdGFuY2VvZiBPcmRlcmVkUHJvcGVydGllcykgewotCQkJT3JkZXJlZFByb3BlcnRpZXMgcmhzID0gKE9yZGVyZWRQcm9wZXJ0aWVzKSBvOwotCQkJaWYgKHJocy5wcm9wZXJ0eU1hcCA9PSB0aGlzLnByb3BlcnR5TWFwKQotCQkJCXJldHVybiB0cnVlOwotCQkJaWYgKHJocy5wcm9wZXJ0eU1hcCA9PSBudWxsIHx8IHRoaXMucHJvcGVydHlNYXAgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gcmhzLnByb3BlcnR5TWFwLmVxdWFscyh0aGlzLnByb3BlcnR5TWFwKTsKLQkJfQotCQlyZXR1cm4gcHJvcGVydHlNYXAuZXF1YWxzKG8pOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBwcm9wZXJ0eU1hcCAhPSBudWxsID8gcHJvcGVydHlNYXAuaGFzaENvZGUoKSA6IDA7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzYi5hcHBlbmQocHJvcGVydHlNYXApOwotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEVsZW1lbnRzRW51bSBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG51bGw7Ci0KLQkJcHVibGljIEVsZW1lbnRzRW51bShPcmRlcmVkUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCQlpdGVyYXRvciA9IHByb3BlcnRpZXMucHJvcGVydHlNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQkJCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCQkJcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFbnVtZXJhdGlvbiBlbGVtZW50cygpIHsKLQkJcmV0dXJuIG5ldyBFbGVtZW50c0VudW0odGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBLZXlzRW51bSBpbXBsZW1lbnRzIEVudW1lcmF0aW9uIHsKLQotCQlJdGVyYXRvciBpdGVyYXRvciA9IG51bGw7Ci0KLQkJcHVibGljIEtleXNFbnVtKE9yZGVyZWRQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJCWl0ZXJhdG9yID0gcHJvcGVydGllcy5wcm9wZXJ0eU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQkJcmV0dXJuIGl0ZXJhdG9yLmhhc05leHQoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCQlyZXR1cm4gaXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JfQotCi0JcHVibGljIEVudW1lcmF0aW9uIGtleXMoKSB7Ci0JCXJldHVybiBuZXcgS2V5c0VudW0odGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVW5tb2RpZmlhYmxlUHJvcGVydGllcyBleHRlbmRzIE9yZGVyZWRQcm9wZXJ0aWVzIHsKLQotCQlVbm1vZGlmaWFibGVQcm9wZXJ0aWVzKE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCQlzdXBlcigpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCXN1cGVyLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCByZW1vdmUoT2JqZWN0IGtleSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcHV0QWxsKE1hcCB0KSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhcigpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9TZXJ2aWNlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvU2VydmljZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDlmYjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9TZXJ2aWNlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnM7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIFNlcnZpY2VIZWxwZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHNlcnZpY2UgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBhcmd1bWVudHMuICBOb3RlIHRoYXQgdGhpcyBpcyBhIGhlbHBlciBjbGFzcwotCSAqIHRoYXQgPGI+aW1tZWRpYXRlbHk8L2I+IHVuZ2V0cyB0aGUgc2VydmljZSByZWZlcmVuY2UuICBUaGlzIHJlc3VsdHMgaW4gYSB3aW5kb3cgd2hlcmUgdGhlCi0JICogc3lzdGVtIHRoaW5rcyB0aGUgc2VydmljZSBpcyBub3QgaW4gdXNlIGJ1dCBpbmRlZWQgdGhlIGNhbGxlciBpcyBhYm91dCB0byB1c2UgdGhlIHJldHVybmVkIAotCSAqIHNlcnZpY2Ugb2JqZWN0LiAgCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcGFyYW0gbmFtZQotCSAqIEByZXR1cm4gVGhlIHJlcXVlc3RlZCBzZXJ2aWNlCi0JICovCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2VydmljZShCdW5kbGVDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lKSB7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UobmFtZSk7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlPYmplY3QgcmVzdWx0ID0gY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2VydmljZShCdW5kbGVDb250ZXh0IGNvbnRleHQsIFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsdGVyKSB7Ci0JCVNlcnZpY2VSZWZlcmVuY2VbXSByZWZlcmVuY2VzOwotCQl0cnkgewotCQkJcmVmZXJlbmNlcyA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZXMobmFtZSwgZmlsdGVyKTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAocmVmZXJlbmNlcyA9PSBudWxsIHx8IHJlZmVyZW5jZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IHJlc3VsdCA9IGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2VzWzBdKTsKLQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlc1swXSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL1RyYWNpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9UcmFjaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmODFkZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvY29yZS9oZWxwZXJzL1RyYWNpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJ1Zy5EZWJ1Z09wdGlvbnM7Ci0KLS8qKgotICogTWFuYWdlcyBkZWJ1ZyB0cmFjaW5nIG9wdGlvbnMgYW5kIHByb3ZpZGVzIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIHByaW50aW5nCi0gKiBkZWJ1ZyBzdGF0ZW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgVHJhY2luZyB7Ci0JLy9tYXN0ZXIgcDIgZGVidWcgZmxhZwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0JLy9kZWJ1ZyBjb25zdGFudHMKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfUEFSU0VfUFJPQkxFTVMgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfR0VORVJBVE9SX1BBUlNJTkcgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gREVCVUdfSU5TVEFMTF9SRUdJU1RSWSA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBERUJVR19NRVRBREFUQV9QQVJTSU5HID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHX01JUlJPUlMgPSBmYWxzZTsKLQotCXN0YXRpYyB7Ci0JCURlYnVnT3B0aW9ucyBvcHRpb25zID0gKERlYnVnT3B0aW9ucykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5jb250ZXh0LCBEZWJ1Z09wdGlvbnMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKG9wdGlvbnMgIT0gbnVsbCkgewotCQkJREVCVUcgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oQWN0aXZhdG9yLklEICsgIi9kZWJ1ZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKERFQlVHKSB7Ci0JCQkJREVCVUdfUEFSU0VfUFJPQkxFTVMgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oQWN0aXZhdG9yLklEICsgIi9jb3JlL3BhcnNlcHJvYmxlbXMiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlERUJVR19HRU5FUkFUT1JfUEFSU0lORyA9IG9wdGlvbnMuZ2V0Qm9vbGVhbk9wdGlvbihBY3RpdmF0b3IuSUQgKyAiL2dlbmVyYXRvci9wYXJzaW5nIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCQkJREVCVUdfSU5TVEFMTF9SRUdJU1RSWSA9IG9wdGlvbnMuZ2V0Qm9vbGVhbk9wdGlvbihBY3RpdmF0b3IuSUQgKyAiL2VuZ2luZS9pbnN0YWxscmVnaXN0cnkiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlERUJVR19NRVRBREFUQV9QQVJTSU5HID0gb3B0aW9ucy5nZXRCb29sZWFuT3B0aW9uKEFjdGl2YXRvci5JRCArICIvbWV0YWRhdGEvcGFyc2luZyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJCURFQlVHX01JUlJPUlMgPSBvcHRpb25zLmdldEJvb2xlYW5PcHRpb24oQWN0aXZhdG9yLklEICsgIi9hcnRpZmFjdHMvbWlycm9ycyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIGEgZGVidWcgbWVzc2FnZSBvbiBzdGRvdXQuIENhbGxlcnMgc2hvdWxkIGZpcnN0IGVuc3VyZSB0aGVpciBzcGVjaWZpYyAKLQkgKiBkZWJ1ZyBvcHRpb24gaXMgZW5hYmxlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiW3AyXSAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKG5ldyBEYXRlKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiAtIFsiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXSAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKG1lc3NhZ2UpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9VUkxVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvVVJMVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDc0ZDllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9VUkxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotLyoqCi0gKiBBIHV0aWxpdHkgY2xhc3MgZm9yIG1hbmlwdWxhdGluZyBVUkxzLiBUaGlzIGNsYXNzIHdvcmtzIGFyb3VuZCBzb21lIG9mIHRoZQotICogYnJva2VuIGJlaGF2aW9yIG9mIHRoZSBqYXZhLm5ldC5VUkwgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxVdGlsIHsKLQkvKgotCSAqIENvbXBhcmVzIHR3byBVUkwgZm9yIGVxdWFsaXR5LgotCSAqIFJldHVybiBmYWxzZSBpZiBvbmUgb2YgdGhlbSBpcyBudWxsCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHNhbWVVUkwoVVJMIHVybDEsIFVSTCB1cmwyKSB7Ci0JCWlmICh1cmwxID09IHVybDIpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKHVybDEgPT0gbnVsbCB8fCB1cmwyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh1cmwxLmVxdWFscyh1cmwyKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGNoZWNrIGlmIHdlIGhhdmUgdHdvIGxvY2FsIGZpbGUgcmVmZXJlbmNlcyB0aGF0IGFyZSBjYXNlIHZhcmlhbnRzCi0JCUZpbGUgZmlsZTEgPSB0b0ZpbGUodXJsMSk7Ci0JCXJldHVybiBmaWxlMSA9PSBudWxsID8gZmFsc2UgOiBmaWxlMS5lcXVhbHModG9GaWxlKHVybDIpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgYXMgYSBsb2NhbCBmaWxlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgZ2l2ZW4KLQkgKiBVUkwgZG9lcyBub3QgcmVwcmVzZW50IGEgbG9jYWwgZmlsZS4KLQkgKiBAcGFyYW0gdXJsIFRoZSB1cmwgdG8gcmV0dXJuIHRoZSBmaWxlIGZvcgotCSAqIEByZXR1cm4gVGhlIGxvY2FsIGZpbGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdXJsLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSB0b0ZpbGUoVVJMIHVybCkgewotCQl0cnkgewotCQkJaWYgKCEiZmlsZSIuZXF1YWxzSWdub3JlQ2FzZSh1cmwuZ2V0UHJvdG9jb2woKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCS8vYXNzdW1lIGFsbCBpbGxlZ2FsIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIHByb3Blcmx5IGVuY29kZWQsIHNvIHVzZSBVUkkgY2xhc3MgdG8gdW5lbmNvZGUKLQkJCXJldHVybiBuZXcgRmlsZShuZXcgVVJJKHVybC50b0V4dGVybmFsRm9ybSgpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL1VSTCBjb250YWlucyB1bmVuY29kZWQgY2hhcmFjdGVycwotCQkJcmV0dXJuIG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIGFzIGEgVVJJLiBUaGlzIG1ldGhvZCB3aWxsIGhhbmRsZSBicm9rZW4gVVJMcyB0aGF0IGFyZQotCSAqIG5vdCBwcm9wZXJseSBlbmNvZGVkIChmb3IgZXhhbXBsZSB0aGV5IGNvbnRhaW4gdW5lbmNvZGVkIHNwYWNlIGNoYXJhY3RlcnMpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVVJJIHRvVVJJKFVSTCB1cmwpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkkodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZSkgewotCQkJLy90cnkgbXVsdGktYXJndW1lbnQgVVJJIGNvbnN0cnVjdG9yIHRvIHBlcmZvcm0gZW5jb2RpbmcKLQkJCXJldHVybiBuZXcgVVJJKHVybC5nZXRQcm90b2NvbCgpLCB1cmwuZ2V0VXNlckluZm8oKSwgdXJsLmdldEhvc3QoKSwgdXJsLmdldFBvcnQoKSwgdXJsLmdldFBhdGgoKSwgdXJsLmdldFF1ZXJ5KCksIHVybC5nZXRSZWYoKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL2hlbHBlcnMvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQ4NWJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvaGVscGVycy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1VdGlsX0ludmFsaWRfWmlwX0ZpbGVfRm9ybWF0PUludmFsaWQgemlwIGZpbGUgZm9ybWF0Ci1VdGlsX0Vycm9yX1VuemlwcGluZz1FcnJvciB1bnppcHBpbmcgezB9OiB7MX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2NvcmUvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUyZTQwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9jb3JlL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWxvY2F0aW9uX2Nhbm5vdExvY2tOSU8gPSBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBsb2NraW5nIGZpbGUgXCJ7MH1cIjogXCJ7MX1cIi4gQSBjb21tb24gcmVhc29uIGlzIHRoYXQgdGhlIGZpbGUgc3lzdGVtIG9yIFJ1bnRpbWUgRW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCBmaWxlIGxvY2tpbmcgZm9yIHRoYXQgbG9jYXRpb24uIFBsZWFzZSBjaG9vc2UgYSBkaWZmZXJlbnQgbG9jYXRpb24sIG9yIGRpc2FibGUgZmlsZSBsb2NraW5nIHBhc3NpbmcgezJ9IGFzIGEgVk0gYXJndW1lbnQuCi1sb2NhdGlvbl9jYW5ub3RMb2NrID0gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9ja2luZyBmaWxlIFwiezB9XCIuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wZXJzaXN0ZW5jZS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcGVyc2lzdGVuY2UvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzZTAzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wZXJzaXN0ZW5jZS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2U7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2UubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUgYW5kIGFzc2lnbiB0byBmaWVsZHMgYmVsb3cKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFBhcnNlcl9Ob19TQVhfUGFyc2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFBhcnNlcl9FcnJvcl9BdF9MaW5lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFBhcnNlcl9FcnJvcl9BdF9MaW5lX0NvbHVtbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxQYXJzZXJfRXJyb3JfQXRfTmFtZV9MaW5lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFBhcnNlcl9FcnJvcl9BdF9OYW1lX0xpbmVfQ29sdW1uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFBhcnNlcl9NaXNzaW5nX1JlcXVpcmVkX0F0dHJpYnV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxQYXJzZXJfVW5leHBlY3RlZF9BdHRyaWJ1dGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MUGFyc2VyX0lsbGVnYWxfVmFsdWVfRm9yX0F0dHJpYnV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxQYXJzZXJfVW5leHBlY3RlZF9FbGVtZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFBhcnNlcl9EdXBsaWNhdGVfRWxlbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxQYXJzZXJfVW5leHBlY3RlZF9DaGFyYWN0ZXJfRGF0YTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxQYXJzZXJfRWxlbWVudF9Ob3RfQWxsb3dlZDsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcGVyc2lzdGVuY2UvWE1MQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wZXJzaXN0ZW5jZS9YTUxDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA3Yjg0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wZXJzaXN0ZW5jZS9YTUxDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBHZW51aXRlYywgTExDIC0gYWRkZWQgbGljZW5zZSBzdXBwb3J0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wZXJzaXN0ZW5jZTsKLQotcHVibGljIGludGVyZmFjZSBYTUxDb25zdGFudHMgewotCi0JLy8gQ29uc3RhbnRzIHVzZWQgaW4gZGVmaW5pbmcgYSBkZWZhdWx0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLQkvLyBpbmNsdWRpbmcgYSBjbGFzcyBuYW1lIGFuZCBhIHZlcnNpb24gb2YgdGhlIGFzc29jaWF0ZWQgWE1MCi0JLy8gZm9yIHNvbWUgY2F0ZWdvcnkgb2Ygb2JqZWN0cy4KLQkvLwllLmcuIDw/Y2F0ZWdvcnkgY2xhc3M9J2EuYi5jLlNvbWVDbGFzcycgdmVyc2lvbj0nMS4yLjMnPz4KLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX0NMQVNTX0FUVFJJQlVURSA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9WRVJTSU9OX0FUVFJJQlVURSA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gRWxlbWVudCBhbmQgYXR0cmlidXRlIG5hbWVzIGZvciBhIHN0YW5kYXJkIHByb3BlcnR5IGNvbGxlY3Rpb24uCi0JLy8JZS5nLiA8cHJvcGVydGllcyBzaXplPScxJz4KLQkvLwkJCTxwcm9wZXJ0eSBuYW1lPSdzb21lX25hbWUnIHZhbHVlPSdzb21lX3ZhbHVlJy8+Ci0JLy8JCSA8L3Byb3BlcnRpZXM+Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19FTEVNRU5UID0gInByb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRUxFTUVOVCA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FX0FUVFJJQlVURSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1ZBTFVFX0FUVFJJQlVURSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENvbnN0YW50cyBmb3IgdGhlIG5hbWVzIG9mIGNvbW1vbiBnZW5lcmFsIGF0dHJpYnV0ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9BVFRSSUJVVEUgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSRU5UX0lEX0FUVFJJQlVURSA9ICJwYXJlbnRJZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0FUVFJJQlVURSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfQVRUUklCVVRFID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9BVFRSSUJVVEUgPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1JBTkdFX0FUVFJJQlVURSA9ICJyYW5nZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfQVRUUklCVVRFID0gIm5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU0lGSUVSX0FUVFJJQlVURSA9ICJjbGFzc2lmaWVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OX0FUVFJJQlVURSA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFUl9BVFRSSUJVVEUgPSAicHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0FUVFJJQlVURSA9ICJ1cmwiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDb25zdGFudHMgZm9yIHRoZSBsaWNlbnNlIGFuZCBjb3B5cmlnaHQgZWxlbWVudHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSUNFTlNFU19FTEVNRU5UID0gImxpY2Vuc2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJQ0VOU0VfRUxFTUVOVCA9ICJsaWNlbnNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPUFlSSUdIVF9FTEVNRU5UID0gImNvcHlyaWdodCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEEgY29uc3RhbnQgZm9yIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBvZiBhIGNvbGxlY3Rpb24gb3IgYXJyYXkgZWxlbWVudAotCS8vIHNwZWNpZnlpbmcgdGhlIHNpemUgb3IgbGVuZ3RoCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MTEVDVElPTl9TSVpFX0FUVFJJQlVURSA9ICJzaXplIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQSBjb25zdGFudCBmb3IgYW4gZW1wdHkgYXJyYXkgb2YgYXR0cmlidXRlIG5hbWVzCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBub0F0dHJpYnV0ZXMgPSBuZXcgU3RyaW5nWzBdOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wZXJzaXN0ZW5jZS9YTUxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3BlcnNpc3RlbmNlL1hNTFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmUyMmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3BlcnNpc3RlbmNlL1hNTFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLlN0cmluZ1Bvb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuT3JkZXJlZFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotaW1wb3J0IG9yZy54bWwuc2F4Lio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTFBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIGltcGxlbWVudHMgWE1MQ29uc3RhbnRzIHsKLQotCS8vIEdldCB0aGUgcm9vdCBvYmplY3QgdGhhdCBpcyBiZWluZyBwYXJzZWQuCi0JcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCBnZXRSb290T2JqZWN0KCk7Ci0KLQkvLyBHZXQgYSBnZW5lcmljIHBhcnNlciBlcnJvciBtZXNzYWdlIGZvciBpbmNsdXNpb24gaW4gYW4gZXJyb3Igc3RhdHVzCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKTsKLQotCXByb3RlY3RlZCBCdW5kbGVDb250ZXh0IGNvbnRleHQ7IC8vIHBhcnNlciBjbGFzcyBidW5kbGUgY29udGV4dAotCXByb3RlY3RlZCBTdHJpbmcgYnVuZGxlSWQ7IC8vIHBhcnNlciBjbGFzcyBidW5kbGUgaWQKLQotCXByb3RlY3RlZCBYTUxSZWFkZXIgeG1sUmVhZGVyOyAvLyB0aGUgWE1MIHJlYWRlciBmb3IgdGhlIHBhcnNlcgotCi0JcHJvdGVjdGVkIE11bHRpU3RhdHVzIHN0YXR1cyA9IG51bGw7IC8vIGFjY3VtdWxhdGlvbiBvZiBub24tZmF0YWwgZXJyb3JzCi0JcHJvdGVjdGVkIExvY2F0b3IgbG9jYXRvciA9IG51bGw7IC8vIGRvY3VtZW50IGxvY2F0b3IsIGlmIHN1cHBvcnRlZCBieSB0aGUgcGFyc2VyCi0KLQlwcm90ZWN0ZWQgU3RyaW5nUG9vbCBzdHJpbmdQb29sID0gbmV3IFN0cmluZ1Bvb2woKTsvL3VzZWQgdG8gZWxpbWluYXRlIHN0cmluZyBkdXBsaWNhdGlvbgotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yOwotCi0JcHJpdmF0ZSBzdGF0aWMgU2VydmljZVRyYWNrZXIgeG1sVHJhY2tlciA9IG51bGw7Ci0KLQlwdWJsaWMgWE1MUGFyc2VyKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIHBsdWdpbklkKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JCXRoaXMuYnVuZGxlSWQgPSBwbHVnaW5JZDsKLQl9Ci0KLQkvKioKLQkgKiAgTm9uLWZhdGFsIGVycm9ycyBhY2N1bXVsYXRlZCBkdXJpbmcgcGFyc2luZy4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiAoc3RhdHVzICE9IG51bGwgPyBzdGF0dXMgOiBTdGF0dXMuT0tfU1RBVFVTKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjYW5vbmljYWwgZm9ybSBvZiBhIHN0cmluZy4gVXNlZCB0byBlbGltaW5hdGUgZHVwbGljYXRlIGVxdWFsIAotCSAqIHN0cmluZ3MuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjYW5vbmljYWxpemUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nUG9vbCA9PSBudWxsID8gc3RyaW5nIDogc3RyaW5nUG9vbC5hZGQoc3RyaW5nKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkWE1MKCkgewotCQlyZXR1cm4gKHN0YXR1cyA9PSBudWxsIHx8ICFzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SIHwgSVN0YXR1cy5DQU5DRUwpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IGFjcXVpcmVYTUxQYXJzaW5nKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotCQlpZiAoeG1sVHJhY2tlciA9PSBudWxsKSB7Ci0JCQl4bWxUcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKGNvbnRleHQsIFNBWFBhcnNlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLQkJCXhtbFRyYWNrZXIub3BlbigpOwotCQl9Ci0JCXJldHVybiAoU0FYUGFyc2VyRmFjdG9yeSkgeG1sVHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlbGVhc2VYTUxQYXJzaW5nKCkgewotCQlpZiAoeG1sVHJhY2tlciAhPSBudWxsKSB7Ci0JCQl4bWxUcmFja2VyLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU0FYUGFyc2VyIGdldFBhcnNlcigpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24gewotCQlTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBhY3F1aXJlWE1MUGFyc2luZyh0aGlzLmNvbnRleHQpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKE1lc3NhZ2VzLlhNTFBhcnNlcl9Ob19TQVhfUGFyc2VyKTsKLQkJfQotCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQlmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQl0cnkgewotCQkJZmFjdG9yeS5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvc3RyaW5nLWludGVybmluZyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzZSkgewotCQkJLy8gc29tZSBwYXJzZXJzIG1heSBub3Qgc3VwcG9ydCBzdHJpbmcgaW50ZXJuaW5nCi0JCX0KLQkJU0FYUGFyc2VyIHRoZVBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCWlmICh0aGVQYXJzZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihNZXNzYWdlcy5YTUxQYXJzZXJfTm9fU0FYX1BhcnNlcik7Ci0JCX0KLQkJeG1sUmVhZGVyID0gdGhlUGFyc2VyLmdldFhNTFJlYWRlcigpOwotCQlyZXR1cm4gdGhlUGFyc2VyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VTaW1wbGVOYW1lKFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxdWFsaWZpZWROYW1lKSB7Ci0JCWlmIChsb2NhbE5hbWUgIT0gbnVsbCAmJiBsb2NhbE5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXR1cm4gbG9jYWxOYW1lOwotCQl9Ci0JCWludCBuYW1lU3BhY2VJbmRleCA9IHF1YWxpZmllZE5hbWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAobmFtZVNwYWNlSW5kZXggPT0gLTEgPyBxdWFsaWZpZWROYW1lIDogcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcobmFtZVNwYWNlSW5kZXggKyAxKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkb2N1bWVudCBsb2NhdG9yIGZvciB0aGUgcGFyc2VyCi0JICogCi0JICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzZXREb2N1bWVudExvY2F0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBkb2NMb2NhdG9yKSB7Ci0JCWxvY2F0b3IgPSBkb2NMb2NhdG9yOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHByb2dyZXNzIG1vbml0b3IgZm9yIHRoZSBwYXJzZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRoaXMubW9uaXRvciA9IG1vbml0b3I7Ci0JfQotCi0JLyoqCi0JICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29udGVudCBoYW5kbGVycwotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlciB7Ci0KLQkJcHJvdGVjdGVkIENvbnRlbnRIYW5kbGVyIHBhcmVudEhhbmRsZXIgPSBudWxsOwotCQlwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnRIYW5kbGVkID0gbnVsbDsKLQotCQlwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIGNoYXJhY3RlcnMgPSBudWxsOyAvLyBjaGFyYWN0ZXIgZGF0YSBpbnNpZGUgYW4gZWxlbWVudAotCi0JCXB1YmxpYyBBYnN0cmFjdEhhbmRsZXIoKSB7Ci0JCQkvLyBFbXB0eSBjb25zdHJ1Y3RvciBmb3IgYSByb290IGhhbmRsZXIKLQkJfQotCi0JCXB1YmxpYyBBYnN0cmFjdEhhbmRsZXIoQ29udGVudEhhbmRsZXIgcGFyZW50SGFuZGxlcikgewotCQkJdGhpcy5wYXJlbnRIYW5kbGVyID0gcGFyZW50SGFuZGxlcjsKLQkJCXhtbFJlYWRlci5zZXRDb250ZW50SGFuZGxlcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBBYnN0cmFjdEhhbmRsZXIoQ29udGVudEhhbmRsZXIgcGFyZW50SGFuZGxlciwgU3RyaW5nIGVsZW1lbnRIYW5kbGVkKSB7Ci0JCQl0aGlzLnBhcmVudEhhbmRsZXIgPSBwYXJlbnRIYW5kbGVyOwotCQkJeG1sUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHRoaXMpOwotCQkJdGhpcy5lbGVtZW50SGFuZGxlZCA9IGVsZW1lbnRIYW5kbGVkOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldCB0aGUgZG9jdW1lbnQgbG9jYXRvciBmb3IgdGhlIHBhcnNlcgotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNzZXREb2N1bWVudExvY2F0b3IKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGRvY0xvY2F0b3IpIHsKLQkJCWxvY2F0b3IgPSBkb2NMb2NhdG9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCWZpbmlzaENoYXJhY3RlcnMoKTsKLQkJCVN0cmluZyBuYW1lID0gbWFrZVNpbXBsZU5hbWUobG9jYWxOYW1lLCBxTmFtZSk7Ci0JCQl0cmFjZShuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCXN0YXJ0RWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJfQotCi0JCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uOwotCi0JCXB1YmxpYyB2b2lkIGludmFsaWRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXVuZXhwZWN0ZWRFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJbmV3IElnbm9yaW5nSGFuZGxlcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB7Ci0JCQkvLyBUT0RPOiB0aHJvdyBhIGJhZCBzdGF0ZSBlcnJvciBpZiBtYWtlU2ltcGxlTmFtZShsb2NhbE5hbWUsIHFOYW1lKSAhPSBlbGVtZW50SGFuZGxlZAotCQkJZmluaXNoQ2hhcmFjdGVycygpOwotCQkJZmluaXNoZWQoKTsKLQkJCS8vIFJlc3RvcmUgdGhlIHBhcmVudCBjb250ZW50IGhhbmRsZXIKLQkJCXhtbFJlYWRlci5zZXRDb250ZW50SGFuZGxlcihwYXJlbnRIYW5kbGVyKTsKLQkJfQotCi0JCS8qKgotCQkgKiAJQW4gaW1wbGVtZW50YXRpb24gZm9yIHN0YXJ0RWxlbWVudCB3aGVuIHRoZXJlIGFyZSBubyBzdWItZWxlbWVudHMKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIG5vU3ViRWxlbWVudHMoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJdW5leHBlY3RlZEVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkvLyBDcmVhdGUgYSBuZXcgaGFuZGxlciB0byBpZ25vcmUgc3Vic2VxdWVudCBuZXN0ZWQgZWxlbWVudHMJCQkKLQkJCW5ldyBJZ25vcmluZ0hhbmRsZXIodGhpcyk7Ci0JCX0KLQotCQkvKgotCQkgKiBTYXZlIHVwIGNoYXJhY3RlciBkYXRhIHVudGlsIGVuZEVsZW1lbnQgb3IgbmVzdGVkIHN0YXJ0RWxlbWVudAotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlciNjaGFyYWN0ZXJzCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaGFycywgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCQlpZiAodGhpcy5jaGFyYWN0ZXJzID09IG51bGwpIHsKLQkJCQl0aGlzLmNoYXJhY3RlcnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl9Ci0JCQl0aGlzLmNoYXJhY3RlcnMuYXBwZW5kKGNoYXJzLCBzdGFydCwgbGVuZ3RoKTsKLQkJfQotCi0JCS8vIENvbnN1bWUgdGhlIGNoYXJhY3RlcnMgYWNjdW11bGF0ZWQgaW4gdGhpcy5jaGFyYWN0ZXJzLgotCQkvLyBDYWxsZWQgYmVmb3JlIHN0YXJ0RWxlbWVudCBvciBlbmRFbGVtZW50Ci0JCXByaXZhdGUgU3RyaW5nIGZpbmlzaENoYXJhY3RlcnMoKSB7Ci0JCQkvLyBjb21tb24gY2FzZSAtLSBubyBjaGFyYWN0ZXJzIG9yIG9ubHkgd2hpdGVzcGFjZQotCQkJaWYgKHRoaXMuY2hhcmFjdGVycyA9PSBudWxsIHx8IHRoaXMuY2hhcmFjdGVycy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlpZiAoYWxsV2hpdGVTcGFjZSh0aGlzLmNoYXJhY3RlcnMpKSB7Ci0JCQkJdGhpcy5jaGFyYWN0ZXJzLnNldExlbmd0aCgwKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gcHJvY2VzcyB0aGUgY2hhcmFjdGVycwotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdHJpbW1lZENoYXJzID0gdGhpcy5jaGFyYWN0ZXJzLnRvU3RyaW5nKCkudHJpbSgpOwotCQkJCWlmICh0cmltbWVkQ2hhcnMubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkvLyB0aGlzIHNob3VsZG4ndCBoYXBwZW4gZHVlIHRvIHRoZSB0ZXN0IGZvciBhbGxXaGl0ZVNwYWNlIGFib3ZlCi0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVW5leHBlY3RlZCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzOiAiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIHRyaW1tZWRDaGFycyk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlwcm9jZXNzQ2hhcmFjdGVycyh0cmltbWVkQ2hhcnMpOwotCQkJCXJldHVybiB0cmltbWVkQ2hhcnM7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRoaXMuY2hhcmFjdGVycy5zZXRMZW5ndGgoMCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBNZXRob2QgdG8gb3ZlcnJpZGUgaW4gdGhlIGhhbmRsZXIgb2YgYW4gZWxlbWVudCB3aXRoIENEQVRBLiAKLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0NoYXJhY3RlcnMoU3RyaW5nIGRhdGEpIHsKLQkJCWlmIChkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJCXVuZXhwZWN0ZWRDaGFyYWN0ZXJEYXRhKHRoaXMsIGRhdGEpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGFsbFdoaXRlU3BhY2UoU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCQlpbnQgbGVuZ3RoID0gc2IubGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHNiLmNoYXJBdChpKSkpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAlDYWxsZWQgd2hlbiB0aGlzIGVsZW1lbnQgYW5kIGFsbCBlbGVtZW50cyBuZXN0ZWQgaW50byBpdCBoYXZlIGJlZW4KLQkJICogCWhhbmRsZWQuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZCgpIHsKLQkJCS8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdAotCQl9Ci0KLQkJLyoKLQkJICogCUEgbmFtZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBoYW5kbGVyLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIChlbGVtZW50SGFuZGxlZCAhPSBudWxsID8gZWxlbWVudEhhbmRsZWQgOiAiTm9OYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qKgotCQkgKiBQYXJzZSB0aGUgYXR0cmlidXRlcyBvZiBhbiBlbGVtZW50IHdpdGggdHdvIHJlcXVpcmVkIGF0dHJpYnV0ZXMuCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RyaW5nW10gcGFyc2VSZXF1aXJlZEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBTdHJpbmcgbmFtZTEsIFN0cmluZyBuYW1lMikgewotCQkJcmV0dXJuIHBhcnNlUmVxdWlyZWRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG5ldyBTdHJpbmdbXSB7bmFtZTEsIG5hbWUyfSk7Ci0JCX0KLQotCQkvKioKLQkJICogUGFyc2UgdGhlIGF0dHJpYnV0ZXMgb2YgYW4gZWxlbWVudCB3aXRoIG9ubHkgcmVxdWlyZWQgYXR0cmlidXRlcy4KLQkJICovCi0JCXByb3RlY3RlZCBTdHJpbmdbXSBwYXJzZVJlcXVpcmVkQXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIFN0cmluZ1tdIHJlcXVpcmVkKSB7Ci0JCQlyZXR1cm4gcGFyc2VBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHJlcXVpcmVkLCBub0F0dHJpYnV0ZXMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFBhcnNlIHRoZSBhdHRyaWJ1dGVzIG9mIGFuIGVsZW1lbnQgd2l0aCBhIHNpbmdsZSBvcHRpb25hbCBhdHRyaWJ1dGUuCi0JCSAqLwotCQlwcm90ZWN0ZWQgU3RyaW5nIHBhcnNlT3B0aW9uYWxBdHRyaWJ1dGUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIHBhcnNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBub0F0dHJpYnV0ZXMsIG5ldyBTdHJpbmdbXSB7bmFtZX0pWzBdOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFBhcnNlIHRoZSBhdHRyaWJ1dGVzIG9mIGFuIGVsZW1lbnQsIGdpdmVuIHRoZSBsaXN0IG9mIHJlcXVpcmVkIGFuZCBvcHRpb25hbCBvbmVzLgotCQkgKiBSZXR1cm4gdmFsdWVzIGluIHNhbWUgb3JkZXIsIG51bGwgZm9yIHRob3NlIG5vdCBwcmVzZW50LgotCQkgKiBMb2cgd2FybmluZ3MgZm9yIGV4dHJhIGF0dHJpYnV0ZXMgb3IgbWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGVzLgotCQkgKi8KLQkJcHJvdGVjdGVkIFN0cmluZ1tdIHBhcnNlQXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIFN0cmluZ1tdIHJlcXVpcmVkLCBTdHJpbmdbXSBvcHRpb25hbCkgewotCQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tyZXF1aXJlZC5sZW5ndGggKyBvcHRpb25hbC5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpICs9IDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGF0dHJpYnV0ZXMuZ2V0TG9jYWxOYW1lKGkpOwotCQkJCVN0cmluZyB2YWx1ZSA9IGNhbm9uaWNhbGl6ZShhdHRyaWJ1dGVzLmdldFZhbHVlKGkpLnRyaW0oKSk7Ci0JCQkJaW50IGo7Ci0JCQkJaWYgKChqID0gaW5kZXhPZihyZXF1aXJlZCwgbmFtZSkpID49IDApIHsKLQkJCQkJcmVzdWx0W2pdID0gdmFsdWU7Ci0JCQkJfSBlbHNlIGlmICgoaiA9IGluZGV4T2Yob3B0aW9uYWwsIG5hbWUpKSA+PSAwKSB7Ci0JCQkJCXJlc3VsdFtyZXF1aXJlZC5sZW5ndGggKyBqXSA9IHZhbHVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXVuZXhwZWN0ZWRBdHRyaWJ1dGUoZWxlbWVudEhhbmRsZWQsIG5hbWUsIHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXVpcmVkLmxlbmd0aDsgaSArPSAxKSB7Ci0JCQkJY2hlY2tSZXF1aXJlZEF0dHJpYnV0ZShlbGVtZW50SGFuZGxlZCwgcmVxdWlyZWRbaV0sIHJlc3VsdFtpXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKglIYW5kbGVyIGZvciBhbiBYTUwgZG9jdW1lbnQuCi0JICoKLQkgKglVc2luZyB0aGUgaW5lbGVnYW50IG5hbWUgJ0RvY0hhbmRsZXInIHRvIGNsZWFybHkgZGlzdGluZ3Vpc2gKLQkgKgl0aGlzIGNsYXNzIGZyb20gdGhlIGRlcHJlY2F0ZWQgb3JnLnhtbC5zYXguRG9jdW1lbnRIYW5kbGVyLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBEb2NIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCQlSb290SGFuZGxlciByb290SGFuZGxlcjsKLQotCQlwdWJsaWMgRG9jSGFuZGxlcihTdHJpbmcgcm9vdE5hbWUsIFJvb3RIYW5kbGVyIHJvb3RIYW5kbGVyKSB7Ci0JCQlzdXBlcihudWxsLCByb290TmFtZSk7Ci0JCQl0aGlzLnJvb3RIYW5kbGVyID0gcm9vdEhhbmRsZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKGVsZW1lbnRIYW5kbGVkKSkgewotCQkJCXJvb3RIYW5kbGVyLmluaXRpYWxpemUodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJeG1sUmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKHJvb3RIYW5kbGVyKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5ub1N1YkVsZW1lbnRzKG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiAJQWJzdHJhY3QgaGFuZGxlciBmb3IgdGhlIHJvb3QgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgY2xhc3MgUm9vdEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCXB1YmxpYyBSb290SGFuZGxlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKERvY0hhbmRsZXIgZG9jdW1lbnQsIFN0cmluZyByb290TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQl0aGlzLnBhcmVudEhhbmRsZXIgPSBkb2N1bWVudDsKLQkJCXRoaXMuZWxlbWVudEhhbmRsZWQgPSByb290TmFtZTsKLQkJCWhhbmRsZVJvb3RBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaGFuZGxlUm9vdEF0dHJpYnV0ZXMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqIAlIYW5kbGVyIGZvciBhbiBvcmRlcmVkIHByb3BlcnRpZXMgY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgUHJvcGVydGllc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCXByaXZhdGUgT3JkZXJlZFByb3BlcnRpZXMgcHJvcGVydGllczsKLQotCQlwdWJsaWMgUHJvcGVydGllc0hhbmRsZXIoQ29udGVudEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBQUk9QRVJUSUVTX0VMRU1FTlQpOwotCQkJU3RyaW5nIHNpemUgPSBwYXJzZU9wdGlvbmFsQXR0cmlidXRlKGF0dHJpYnV0ZXMsIENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUpOwotCQkJcHJvcGVydGllcyA9IChzaXplICE9IG51bGwgPyBuZXcgT3JkZXJlZFByb3BlcnRpZXMobmV3IEludGVnZXIoc2l6ZSkuaW50VmFsdWUoKSkgOiBuZXcgT3JkZXJlZFByb3BlcnRpZXMoKSk7Ci0JCX0KLQotCQlwdWJsaWMgT3JkZXJlZFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpIHsKLQkJCXJldHVybiBwcm9wZXJ0aWVzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCWlmIChuYW1lLmVxdWFscyhQUk9QRVJUWV9FTEVNRU5UKSkgewotCQkJCW5ldyBQcm9wZXJ0eUhhbmRsZXIodGhpcywgYXR0cmlidXRlcywgcHJvcGVydGllcyk7Ci0JCQl9IGVsc2UgewotCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiAJSGFuZGxlciBmb3IgYSBwcm9wZXJ0eSBpbiBhbiBvcmRlcmVkIHByb3BlcnRpZXMgY29sbGVjdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgUHJvcGVydHlIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCQlwdWJsaWMgUHJvcGVydHlIYW5kbGVyKENvbnRlbnRIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgT3JkZXJlZFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgUFJPUEVSVFlfRUxFTUVOVCk7Ci0JCQlTdHJpbmdbXSBwcm9wZXJ0eSA9IHBhcnNlUHJvcGVydHkoYXR0cmlidXRlcyk7Ci0JCQlpZiAoaXNWYWxpZFByb3BlcnR5KHByb3BlcnR5KSkgewotCQkJCXByb3BlcnRpZXMuc2V0UHJvcGVydHkocHJvcGVydHlbMF0sIHByb3BlcnR5WzFdKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nW10gcGFyc2VQcm9wZXJ0eShBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXJldHVybiBwYXJzZVJlcXVpcmVkQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBQUk9QRVJUWV9OQU1FX0FUVFJJQlVURSwgUFJPUEVSVFlfVkFMVUVfQVRUUklCVVRFKTsKLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUHJvcGVydHkoU3RyaW5nW10gcHJvcGVydHkpIHsKLQkJCXJldHVybiAocHJvcGVydHkubGVuZ3RoID09IDIgJiYgcHJvcGVydHlbMF0gIT0gbnVsbCAmJiBwcm9wZXJ0eVsxXSAhPSBudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAlIYW5kbGVyIGZvciBhbiBlbGVtZW50IHdpdGggb25seSBjZGF0YSBhbmQgbm8gc3ViLWVsZW1lbnRzLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBUZXh0SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgdGV4dCA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBMaXN0IHRleHRzID0gbnVsbDsKLQotCQkvLyBDb25zdHJ1Y3RvciBmb3IgYSBzdWJjbGFzcyB0aGF0IHByb2Nlc3NlcyB0aGUgYXR0cmlidXRlcwotCQlwdWJsaWMgVGV4dEhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudCwgU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCQlzdXBlcihwYXJlbnQsIGVsZW1lbnROYW1lKTsKLQkJfQotCi0JCS8vIENvbnN0cnVjdG9yIGZvciBhIHN1YmNsYXNzIHdpdGggbm8gYXR0cmlidXRlcwotCQlwdWJsaWMgVGV4dEhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudCwgU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXN1cGVyKHBhcmVudCwgZWxlbWVudE5hbWUpOwotCQkJcGFyc2VBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG5vQXR0cmlidXRlcywgbm9BdHRyaWJ1dGVzKTsKLQkJfQotCi0JCXB1YmxpYyBUZXh0SGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50LCBTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdCB0ZXh0cykgewotCQkJc3VwZXIocGFyZW50LCBlbGVtZW50TmFtZSk7Ci0JCQlwYXJzZUF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbm9BdHRyaWJ1dGVzLCBub0F0dHJpYnV0ZXMpOwotCQkJdGhpcy50ZXh0cyA9IHRleHRzOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQkJcmV0dXJuICh0ZXh0ICE9IG51bGwgPyB0ZXh0IDogIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ2hhcmFjdGVycyhTdHJpbmcgZGF0YSkgewotCQkJdGhpcy50ZXh0ID0gZGF0YTsKLQkJCWlmICh0ZXh0cyAhPSBudWxsKSB7Ci0JCQkJdGV4dHMuYWRkKGdldFRleHQoKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIAlIYW5kbGVyIGZvciBpZ25vcmluZyBjb250ZW50LgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBJZ25vcmluZ0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCXB1YmxpYyBJZ25vcmluZ0hhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50KTsKLQkJCXRoaXMuZWxlbWVudEhhbmRsZWQgPSAiSWdub3JpbmdBbGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJbm9TdWJFbGVtZW50cyhuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJfQotCi0JfQotCi0JLy8gSGVscGVycyBmb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgdGhhdCBpbmNsdWRlIGEgQ2xhc3MgYW5kL29yIGEgVmVyc2lvbi4KLQotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdFBJQ2xhc3MoU3RyaW5nIGRhdGEpIHsKLQkJcmV0dXJuIGV4dHJhY3RQSUF0dHJpYnV0ZShkYXRhLCBQSV9DTEFTU19BVFRSSUJVVEUpOwotCX0KLQotCXB1YmxpYyBWZXJzaW9uIGV4dHJhY3RQSVZlcnNpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpIHsKLQkJcmV0dXJuIGNoZWNrVmVyc2lvbih0YXJnZXQsIFBJX1ZFUlNJT05fQVRUUklCVVRFLCBleHRyYWN0UElBdHRyaWJ1dGUoZGF0YSwgUElfVkVSU0lPTl9BVFRSSUJVVEUpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBleHRyYWN0UElBdHRyaWJ1dGUoU3RyaW5nIGRhdGEsIFN0cmluZyBrZXkpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHBpVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihkYXRhLCAiIFwnXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSB0b2tlbnMgPSBuZXcgU3RyaW5nW3BpVG9rZW5pemVyLmNvdW50VG9rZW5zKCldOwotCQlpbnQgaW5kZXggPSAwOwotCQlpbnQgdmFsdWVJbmRleCA9IC0xOwotCQl3aGlsZSAocGlUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpICYmIGluZGV4IDwgdG9rZW5zLmxlbmd0aCkgewotCQkJdG9rZW5zW2luZGV4XSA9IHBpVG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaWYgKHRva2Vuc1tpbmRleF0uZXF1YWxzKGtleSArICc9JykgJiYgaW5kZXggPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJdmFsdWVJbmRleCA9IGluZGV4ICsgMTsKLQkJCX0KLQkJCWluZGV4Kys7Ci0JCX0KLQkJcmV0dXJuICh2YWx1ZUluZGV4ID49IDAgPyB0b2tlbnNbdmFsdWVJbmRleF0gOiAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleCkgewotCQlhZGRFcnJvcihJU3RhdHVzLldBUk5JTkcsIGV4LmdldE1lc3NhZ2UoKSwgZXgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJYWRkRXJyb3IoSVN0YXR1cy5FUlJPUiwgZXguZ2V0TWVzc2FnZSgpLCBleCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvclByZWZpeCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvclN1ZmZpeCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29sbGVjdHMgYW4gZXJyb3Igb3Igd2FybmluZyB0aGF0IG9jY3VycmVkIGR1cmluZyBwYXJzaW5nLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZEVycm9yKGludCBzZXZlcml0eSwgU3RyaW5nIG1zZywgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpbnQgbGluZSA9IDA7Ci0JCWludCBjb2x1bW4gPSAwOwotCQlTdHJpbmcga2V5ID0gbXNnOwotCQlPYmplY3RbXSBhcmdzID0gbmV3IE9iamVjdFtdIHt9OwotCQlTdHJpbmcgcm9vdCA9IChnZXRSb290T2JqZWN0KCkgPT0gbnVsbCA/ICIiIC8vJE5PTi1OTFMtMSQKLQkJCQk6ICIgKCIgKyBnZXRSb290T2JqZWN0KCkgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKHRoaXMubG9jYXRvciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHRoaXMubG9jYXRvci5nZXRTeXN0ZW1JZCgpOwotCQkJbGluZSA9IHRoaXMubG9jYXRvci5nZXRMaW5lTnVtYmVyKCk7Ci0JCQljb2x1bW4gPSB0aGlzLmxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCk7Ci0JCQlpZiAobGluZSA+IDApIHsKLQkJCQlhcmdzID0gbmV3IE9iamVjdFtdIHttc2csIHJvb3QsIG5hbWUsIG5ldyBJbnRlZ2VyKGxpbmUpLCBuZXcgSW50ZWdlcihjb2x1bW4pfTsKLQkJCQlpZiAoY29sdW1uID4gMCkgewotCQkJCQlrZXkgPSAobmFtZSAhPSBudWxsID8gTWVzc2FnZXMuWE1MUGFyc2VyX0Vycm9yX0F0X05hbWVfTGluZV9Db2x1bW4gLy8KLQkJCQkJCQk6IE1lc3NhZ2VzLlhNTFBhcnNlcl9FcnJvcl9BdF9MaW5lX0NvbHVtbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJa2V5ID0gKG5hbWUgIT0gbnVsbCA/IE1lc3NhZ2VzLlhNTFBhcnNlcl9FcnJvcl9BdF9OYW1lX0xpbmUgLy8KLQkJCQkJCQk6IE1lc3NhZ2VzLlhNTFBhcnNlcl9FcnJvcl9BdF9MaW5lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGVyck1zZyA9IE5MUy5iaW5kKGtleSwgYXJncyk7Ci0JCVN0cmluZyBwcmVmaXggPSBnZXRFcnJvclByZWZpeCgpOwotCQlTdHJpbmcgc3VmZml4ID0gZ2V0RXJyb3JTdWZmaXgoKTsKLQkJaWYgKHByZWZpeCAhPSBudWxsKSB7Ci0JCQllcnJNc2cgPSBwcmVmaXggKyBlcnJNc2c7Ci0JCX0KLQkJaWYgKHN1ZmZpeCAhPSBudWxsKSB7Ci0JCQllcnJNc2cgPSBlcnJNc2cgKyBzdWZmaXg7Ci0JCX0KLQkJSVN0YXR1cyBjdXJyU3RhdHVzID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgQWN0aXZhdG9yLklELCBlcnJNc2csIGV4Y2VwdGlvbik7Ci0JCWlmICh0aGlzLnN0YXR1cyA9PSBudWxsKSB7Ci0JCQl0aGlzLnN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhidW5kbGVJZCwgSVN0YXR1cy5PSywgbmV3IElTdGF0dXNbXSB7Y3VyclN0YXR1c30sIGdldEVycm9yTWVzc2FnZSgpLCBudWxsKTsKLQkJfSBlbHNlIHsKLQkJCXRoaXMuc3RhdHVzLmFkZChjdXJyU3RhdHVzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRyYWNlKFN0cmluZyBlbGVtZW50LCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJLy8gVE9ETzogc3VwcG9ydCBsb2dnaW5nCi0JCS8vCQlpZiAoIWdldExvZ2dlcigpLmlzRGVidWdMb2dnYWJsZSgpKSB7Ci0JCS8vCQkJcmV0dXJuOwotCQkvLwkJfQotCQkvLwkJaW50IGluZGVudFNpemUgPSAodGhpcy5zdGF0ZVN0YWNrICE9IG51bGwgPyB0aGlzLnN0YXRlU3RhY2suc2l6ZSgpIC0gMSA6IDEpOwotCQkvLwkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkvLwkJCWluZGVudFNpemUgLT0gMTsKLQkJLy8JCX0KLQkJLy8JCWNoYXJbXSBpbmRlbnQgPSBuZXcgY2hhclsyICogaW5kZW50U2l6ZV07Ci0JCS8vCQlBcnJheXMuZmlsbChpbmRlbnQsICcgJyk7Ci0JCS8vCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vCQlzYi5hcHBlbmQoaW5kZW50KTsKLQkJLy8JCXNiLmFwcGVuZCgnPCcpOwotCQkvLwkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkvLwkJCXNiLmFwcGVuZChlbGVtZW50KTsKLQkJLy8JCQl0b1N0cmluZyhzYiwgYXR0cmlidXRlcyk7Ci0JCS8vCQl9IGVsc2UgewotCQkvLwkJCXNiLmFwcGVuZCgnLycpLmFwcGVuZChlbGVtZW50KTsKLQkJLy8JCX0KLQkJLy8JCXNiLmFwcGVuZCgnPicpOwotCQkvLwkJZ2V0TG9nZ2VyKCkuZGVidWcoc2IudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvU3RyaW5nKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0b1N0cmluZyhyZXN1bHQsIGF0dHJpYnV0ZXMpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB0b1N0cmluZyhTdHJpbmdCdWZmZXIgc2IsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkgKz0gMSkgewotCQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzLmdldExvY2FsTmFtZShpKTsKLQkJCVN0cmluZyB2YWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSkudHJpbSgpOwotCQkJc2IuYXBwZW5kKCcgJykuYXBwZW5kKG5hbWUpOwotCQkJc2IuYXBwZW5kKCc9JykuYXBwZW5kKCciJyk7Ci0JCQlzYi5hcHBlbmQodmFsdWUpOwotCQkJc2IuYXBwZW5kKCciJyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGVja1JlcXVpcmVkQXR0cmlidXRlKFN0cmluZyBlbGVtZW50LCBTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlhZGRFcnJvcihJU3RhdHVzLldBUk5JTkcsIE5MUy5iaW5kKE1lc3NhZ2VzLlhNTFBhcnNlcl9NaXNzaW5nX1JlcXVpcmVkX0F0dHJpYnV0ZSwgZWxlbWVudCwgbmFtZSksIG51bGwpOwotCQl9Ci0JfQotCi0JLy8gQ2hlY2sgdGhlIGZvcm1hdCBvZiBhIHJlcXVpcmVkIGJvb2xlYW4gYXR0cmlidXRlCi0JcHVibGljIEJvb2xlYW4gY2hlY2tCb29sZWFuKFN0cmluZyBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBCb29sZWFuLnZhbHVlT2YodmFsdWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlpbnZhbGlkQXR0cmlidXRlVmFsdWUoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgewotCQkJaW52YWxpZEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIGF0dHJpYnV0ZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIEJvb2xlYW4uRkFMU0U7Ci0JfQotCi0JLy8gQ2hlY2sgdGhlIGZvcm1hdCBvZiBhbiBvcHRpb25hbCBib29sZWFuIGF0dHJpYnV0ZQotCXB1YmxpYyBCb29sZWFuIGNoZWNrQm9vbGVhbihTdHJpbmcgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZSwgU3RyaW5nIHZhbHVlLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotCQlCb29sZWFuIHJlc3VsdCA9IChkZWZhdWx0VmFsdWUgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQkJaW52YWxpZEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIGF0dHJpYnV0ZSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gQ2hlY2sgdGhlIGZvcm1hdCBvZiBhIHJlcXVpcmVkIGludGVnZXIgYXR0cmlidXRlCi0JcHVibGljIGludCBjaGVja0ludGVnZXIoU3RyaW5nIGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyB2YWx1ZSkgewotCQl0cnkgewotCQkJcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmFsdWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlpbnZhbGlkQXR0cmlidXRlVmFsdWUoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIHZvaWQgY2hlY2tDYW5jZWwoKSB7Ci0JCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIHZlcnNpb24gc3RyaW5nIHRvIGEgVmVyc2lvbiBvYmplY3QuIFJldHVybnMgdGhlIHZlcnNpb24gb2JqZWN0LAotCSAqIG9yIHtAbGluayBWZXJzaW9uI2VtcHR5VmVyc2lvbn0gaWYgdGhlIHZhbHVlIHdhcyBub3QgYSB2YWxpZCB2ZXJzaW9uLgotCSAqLwotCXB1YmxpYyBWZXJzaW9uIGNoZWNrVmVyc2lvbihTdHJpbmcgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFZlcnNpb24odmFsdWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlpbnZhbGlkQXR0cmlidXRlVmFsdWUoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgewotCQkJaW52YWxpZEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIGF0dHJpYnV0ZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFZlcnNpb24uZW1wdHlWZXJzaW9uOwotCX0KLQotCXB1YmxpYyBWZXJzaW9uUmFuZ2UgY2hlY2tWZXJzaW9uUmFuZ2UoU3RyaW5nIGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyB2YWx1ZSkgewotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBWZXJzaW9uUmFuZ2UodmFsdWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7Ci0JCQlpbnZhbGlkQXR0cmlidXRlVmFsdWUoZWxlbWVudCwgYXR0cmlidXRlLCB2YWx1ZSk7Ci0JCX0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgewotCQkJaW52YWxpZEF0dHJpYnV0ZVZhbHVlKGVsZW1lbnQsIGF0dHJpYnV0ZSwgbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZXhwZWN0ZWRBdHRyaWJ1dGUoU3RyaW5nIGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoVHJhY2luZy5ERUJVR19QQVJTRV9QUk9CTEVNUykKLQkJCVRyYWNpbmcuZGVidWcoIlVuZXhwZWN0ZWQgYXR0cmlidXRlIGZvciBlbGVtZW50ICIgKyBlbGVtZW50ICsgIjogIiArIGF0dHJpYnV0ZSArICc9JyArIHZhbHVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHZvaWQgaW52YWxpZEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBlbGVtZW50LCBTdHJpbmcgYXR0cmlidXRlLCBTdHJpbmcgdmFsdWUpIHsKLQkJYWRkRXJyb3IoSVN0YXR1cy5XQVJOSU5HLCBOTFMuYmluZChNZXNzYWdlcy5YTUxQYXJzZXJfSWxsZWdhbF9WYWx1ZV9Gb3JfQXR0cmlidXRlLCBuZXcgT2JqZWN0W10ge2F0dHJpYnV0ZSwgZWxlbWVudCwgdmFsdWV9KSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5leHBlY3RlZEVsZW1lbnQoQWJzdHJhY3RIYW5kbGVyIGhhbmRsZXIsIFN0cmluZyBlbGVtZW50LCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJaWYgKFRyYWNpbmcuREVCVUdfUEFSU0VfUFJPQkxFTVMpCi0JCQlUcmFjaW5nLmRlYnVnKCJVbmV4cGVjdGVkIGVsZW1lbnQgaW4gZWxlbWVudCAiICsgaGFuZGxlci5nZXROYW1lKCkgKyAiOiA8IiArIGVsZW1lbnQgKyB0b1N0cmluZyhhdHRyaWJ1dGVzKSArICc+Jyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIGR1cGxpY2F0ZUVsZW1lbnQoQWJzdHJhY3RIYW5kbGVyIGhhbmRsZXIsIFN0cmluZyBlbGVtZW50LCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJYWRkRXJyb3IoSVN0YXR1cy5XQVJOSU5HLCBOTFMuYmluZChNZXNzYWdlcy5YTUxQYXJzZXJfRHVwbGljYXRlX0VsZW1lbnQsIG5ldyBPYmplY3RbXSB7aGFuZGxlci5nZXROYW1lKCksIGVsZW1lbnQsIHRvU3RyaW5nKGF0dHJpYnV0ZXMpfSksIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZXhwZWN0ZWRDaGFyYWN0ZXJEYXRhKEFic3RyYWN0SGFuZGxlciBoYW5kbGVyLCBTdHJpbmcgY2RhdGEpIHsKLQkJaWYgKFRyYWNpbmcuREVCVUdfUEFSU0VfUFJPQkxFTVMpCi0JCQlUcmFjaW5nLmRlYnVnKCJVbmV4cGVjdGVkIGNoYXJhY3RlciBkYXRhIGluIGVsZW1lbnQgIiArIGhhbmRsZXIuZ2V0TmFtZSgpICsgIjogIiArIGNkYXRhLnRyaW0oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIG9iamVjdCBpbiBhcnJheSwgb3IgLTEuCi0JICogVXNlIEFycmF5cy5iaW5hcnlTZWFyY2ggaWYgYXJyYXkgaXMgYmlnIGFuZCBzb3J0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBpbnQgaW5kZXhPZihTdHJpbmdbXSBhcnJheSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpICs9IDEpIHsKLQkJCWlmICh2YWx1ZSA9PSBudWxsID8gYXJyYXlbaV0gPT0gbnVsbCA6IHZhbHVlLmVxdWFscyhhcnJheVtpXSkpIHsKLQkJCQlyZXR1cm4gaTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLy8JcHVibGljIGNsYXNzIEJhZFN0YXRlRXJyb3IgZXh0ZW5kcyBBc3NlcnRpb25FcnJvciB7Ci0JLy8JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOyAvLyBub3Qgc2VyaWFsaXplZAotCS8vCi0JLy8JCXB1YmxpYyBCYWRTdGF0ZUVycm9yKCkgewotCS8vCQkJc3VwZXIoInVuZXhwZWN0ZWQgc3RhdGUiICsgLy8kTk9OLU5MUy0xJAotCS8vCQkJCQkoWE1MUGFyc2VyLnRoaXMuc3RhdGVTdGFjayAhPSBudWxsID8gIjogIiArIFhNTFBhcnNlci50aGlzLnN0YXRlU3RhY2sgLy8kTk9OLU5MUy0xJAotCS8vCQkJCQk6ICIiKSk7IC8vJE5PTi1OTFMtMSQKLQkvLwkJfQotCS8vCi0JLy8JCXB1YmxpYyBCYWRTdGF0ZUVycm9yKFN0cmluZyBlbGVtZW50KSB7Ci0JLy8JCQlzdXBlcigidW5leHBlY3RlZCBzdGF0ZSBmb3IgIiArIGVsZW1lbnQgKyAvLyROT04tTkxTLTEkCi0JLy8JCQkJCShYTUxQYXJzZXIudGhpcy5zdGF0ZVN0YWNrICE9IG51bGwgPyAiOiAiICsgWE1MUGFyc2VyLnRoaXMuc3RhdGVTdGFjayAvLyROT04tTkxTLTEkCi0JLy8JCQkJCTogIiIpKTsgLy8kTk9OLU5MUy0xJAotCS8vCQl9Ci0JLy8JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wZXJzaXN0ZW5jZS9YTUxXcml0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3BlcnNpc3RlbmNlL1hNTFdyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODU3NDkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3BlcnNpc3RlbmNlL1hNTFdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnBlcnNpc3RlbmNlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgWE1MV3JpdGVyIGltcGxlbWVudHMgWE1MQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHsKLQotCQlwcml2YXRlIFN0cmluZyB0YXJnZXQ7Ci0JCXByaXZhdGUgU3RyaW5nW10gZGF0YTsKLQotCQkvLyBUaGUgc3RhbmRhcmQgVVRGLTggcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVVRGOCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PiI7IC8vJE5PTi1OTFMtMSQKLQotCQlwdWJsaWMgUHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZ1tdIGF0dHJzLCBTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJCS8vIExlbmd0aHMgb2YgYXR0cmlidXRlcyBhbmQgdmFsdWVzIG11c3QgYmUgdGhlIHNhbWUKLQkJCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCQkJdGhpcy5kYXRhID0gbmV3IFN0cmluZ1thdHRycy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5sZW5ndGg7IGkrKykgewotCQkJCWRhdGFbaV0gPSBhdHRyaWJ1dGVJbWFnZShhdHRyc1tpXSwgdmFsdWVzW2ldKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBzdGF0aWMgUHJvY2Vzc2luZ0luc3RydWN0aW9uIG1ha2VDbGFzc1ZlcnNpb25JbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBDbGFzcyBjbGF6eiwgVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCQlyZXR1cm4gbmV3IFByb2Nlc3NpbmdJbnN0cnVjdGlvbih0YXJnZXQsIG5ldyBTdHJpbmdbXSB7UElfQ0xBU1NfQVRUUklCVVRFLCBQSV9WRVJTSU9OX0FUVFJJQlVURX0sIG5ldyBTdHJpbmdbXSB7Y2xhenouZ2V0TmFtZSgpLCB2ZXJzaW9uLnRvU3RyaW5nKCl9KTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCI8PyIpOyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQodGhpcy50YXJnZXQpLmFwcGVuZCgnICcpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2IuYXBwZW5kKHRoaXMuZGF0YVtpXSk7Ci0JCQkJaWYgKGkgPCBkYXRhLmxlbmd0aCAtIDEpIHsKLQkJCQkJc2IuYXBwZW5kKCcgJyk7Ci0JCQkJfQotCQkJfQotCQkJc2IuYXBwZW5kKCI/PiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RhY2sgZWxlbWVudHM7IC8vIFhNTCBlbGVtZW50cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGNsb3NlZAotCXByaXZhdGUgYm9vbGVhbiBvcGVuOyAvLyBDYW4gYXR0cmlidXRlcyBiZSBhZGRlZCB0byB0aGUgY3VycmVudCBlbGVtZW50PwotCXByaXZhdGUgU3RyaW5nIGluZGVudDsgLy8gdXNlZCBmb3IgZWFjaCBsZXZlbCBvZiBpbmRlbnRhdGlvbgotCi0JcHJpdmF0ZSBQcmludFdyaXRlciBwdzsKLQotCXB1YmxpYyBYTUxXcml0ZXIoT3V0cHV0U3RyZWFtIG91dHB1dCwgUHJvY2Vzc2luZ0luc3RydWN0aW9uW10gcGlFbGVtZW50cykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCQl0aGlzLnB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0LCAiVVRGOCIpLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJcHJpbnRsbihQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24uWE1MX1VURjgpOwotCQl0aGlzLmVsZW1lbnRzID0gbmV3IFN0YWNrKCk7Ci0JCXRoaXMub3BlbiA9IGZhbHNlOwotCQl0aGlzLmluZGVudCA9ICIgICI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHBpRWxlbWVudHMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwaUVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcHJpbnRsbihwaUVsZW1lbnRzW2ldLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gc3RhcnQgYSBuZXcgZWxlbWVudAotCXB1YmxpYyB2b2lkIHN0YXJ0KFN0cmluZyBuYW1lKSB7Ci0JCWlmICh0aGlzLm9wZW4pIHsKLQkJCXByaW50bG4oJz4nKTsKLQkJfQotCQlpbmRlbnQoKTsKLQkJcHJpbnQoJzwnKTsKLQkJcHJpbnQobmFtZSk7Ci0JCXRoaXMuZWxlbWVudHMucHVzaChuYW1lKTsKLQkJdGhpcy5vcGVuID0gdHJ1ZTsKLQl9Ci0KLQkvLyBlbmQgdGhlIG1vc3QgcmVjZW50IGVsZW1lbnQgd2l0aCB0aGlzIG5hbWUKLQlwdWJsaWMgdm9pZCBlbmQoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKHRoaXMuZWxlbWVudHMuZW1wdHkoKSkgewotCQkJdGhyb3cgbmV3IEVuZFdpdGhvdXRTdGFydEVycm9yKCk7Ci0JCX0KLQkJaW50IGluZGV4ID0gdGhpcy5lbGVtZW50cy5zZWFyY2gobmFtZSk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJdGhyb3cgbmV3IEVuZFdpdGhvdXRTdGFydEVycm9yKG5hbWUpOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXg7IGkgKz0gMSkgewotCQkJZW5kKCk7Ci0JCX0KLQl9Ci0KLQkvLyBlbmQgdGhlIGN1cnJlbnQgZWxlbWVudAotCXB1YmxpYyB2b2lkIGVuZCgpIHsKLQkJaWYgKHRoaXMuZWxlbWVudHMuZW1wdHkoKSkgewotCQkJdGhyb3cgbmV3IEVuZFdpdGhvdXRTdGFydEVycm9yKCk7Ci0JCX0KLQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSB0aGlzLmVsZW1lbnRzLnBvcCgpOwotCQlpZiAodGhpcy5vcGVuKSB7Ci0JCQlwcmludGxuKCIvPiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlwcmludGxuSW5kZW50ZWQoIjwvIiArIG5hbWUgKyAnPicsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMub3BlbiA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZShTdHJpbmcgdHh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHR4dC5sZW5ndGgoKTsgKytpKSB7Ci0JCQlTdHJpbmcgcmVwbGFjZTsKLQkJCWNoYXIgYyA9IHR4dC5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGMpIHsKLQkJCQljYXNlICc8JyA6Ci0JCQkJCXJlcGxhY2UgPSAiJmx0OyI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPicgOgotCQkJCQlyZXBsYWNlID0gIiZndDsiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInIDoKLQkJCQkJcmVwbGFjZSA9ICImcXVvdDsiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJ1wnJyA6Ci0JCQkJCXJlcGxhY2UgPSAiJmFwb3M7IjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlICcmJyA6Ci0JCQkJCXJlcGxhY2UgPSAiJmFtcDsiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlpZiAoYnVmZmVyICE9IG51bGwpCi0JCQkJCQlidWZmZXIuYXBwZW5kKGMpOwotCQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChidWZmZXIgPT0gbnVsbCkgewotCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIodHh0Lmxlbmd0aCgpICsgMTYpOwotCQkJCWJ1ZmZlci5hcHBlbmQodHh0LnN1YnN0cmluZygwLCBpKSk7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKHJlcGxhY2UpOwotCQl9Ci0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIHR4dDsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gd3JpdGUgYSBib29sZWFuIGF0dHJpYnV0ZSBpZiBpdCBkb2Vzbid0IGhhdmUgdGhlIGRlZmF1bHQgdmFsdWUKLQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBkZWZhdWx0VmFsdWUpIHsKLQkJCWF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmFsdWUpIHsKLQkJYXR0cmlidXRlKG5hbWUsIEJvb2xlYW4udG9TdHJpbmcodmFsdWUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotCQlhdHRyaWJ1dGUobmFtZSwgSW50ZWdlci50b1N0cmluZyh2YWx1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGF0dHJpYnV0ZU9wdGlvbmFsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlhdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYXR0cmlidXRlKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKCF0aGlzLm9wZW4pIHsKLQkJCXRocm93IG5ldyBBdHRyaWJ1dGVBZnRlck5lc3RlZENvbnRlbnRFcnJvcigpOwotCQl9Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47IC8vIG9wdGlvbmFsIGF0dHJpYnV0ZSB3aXRoIG5vIHZhbHVlCi0JCX0KLQkJcHJpbnQoJyAnKTsKLQkJcHJpbnQobmFtZSk7Ci0JCXByaW50KCI9JyIpOyAvLyROT04tTkxTLTEkCi0JCXByaW50KGVzY2FwZSh2YWx1ZS50b1N0cmluZygpKSk7Ci0JCXByaW50KCdcJycpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNkYXRhKFN0cmluZyBkYXRhKSB7Ci0JCWNkYXRhKGRhdGEsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNkYXRhKFN0cmluZyBkYXRhLCBib29sZWFuIGVzY2FwZSkgewotCQlpZiAodGhpcy5vcGVuKSB7Ci0JCQlwcmludGxuKCc+Jyk7Ci0JCQl0aGlzLm9wZW4gPSBmYWxzZTsKLQkJfQotCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQlwcmludGxuSW5kZW50ZWQoZGF0YSwgZXNjYXBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZsdXNoKCkgewotCQl0aGlzLnB3LmZsdXNoKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0aWVzKE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCXdyaXRlUHJvcGVydGllcyhQUk9QRVJUSUVTX0VMRU1FTlQsIHByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydGllcyhTdHJpbmcgcHJvcGVydGllc0VsZW1lbnQsIE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcy5zaXplKCkgPiAwKSB7Ci0JCQlzdGFydChwcm9wZXJ0aWVzRWxlbWVudCk7Ci0JCQlhdHRyaWJ1dGUoQ09MTEVDVElPTl9TSVpFX0FUVFJJQlVURSwgcHJvcGVydGllcy5zaXplKCkpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvcGVydGllcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCXdyaXRlUHJvcGVydHkobmFtZSwgKFN0cmluZykgcHJvcGVydGllcy5nZXQobmFtZSkpOwotCQkJfQotCQkJZW5kKHByb3BlcnRpZXNFbGVtZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlzdGFydChQUk9QRVJUWV9FTEVNRU5UKTsKLQkJYXR0cmlidXRlKFBST1BFUlRZX05BTUVfQVRUUklCVVRFLCBuYW1lKTsKLQkJYXR0cmlidXRlKFBST1BFUlRZX1ZBTFVFX0FUVFJJQlVURSwgdmFsdWUpOwotCQllbmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBhdHRyaWJ1dGVJbWFnZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gIiI7IC8vIG9wdGlvbmFsIGF0dHJpYnV0ZSB3aXRoIG5vIHZhbHVlCi0JCX0KLQkJcmV0dXJuIG5hbWUgKyAiPSciICsgZXNjYXBlKHZhbHVlKSArICdcJyc7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRsbihjaGFyIGMpIHsKLQkJdGhpcy5wdy5wcmludGxuKGMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludGxuKFN0cmluZyBzKSB7Ci0JCXRoaXMucHcucHJpbnRsbihzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRsbigpIHsKLQkJdGhpcy5wdy5wcmludGxuKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50KGNoYXIgYykgewotCQl0aGlzLnB3LnByaW50KGMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludChTdHJpbmcgcykgewotCQl0aGlzLnB3LnByaW50KHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludGxuSW5kZW50ZWQoU3RyaW5nIHMsIGJvb2xlYW4gZXNjYXBlKSB7Ci0JCWlmIChzLmxlbmd0aCgpID09IDApIHsKLQkJCXByaW50bG4oKTsKLQkJfSBlbHNlIHsKLQkJCWluZGVudCgpOwotCQkJcHJpbnRsbihlc2NhcGUgPyBlc2NhcGUocykgOiBzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbmRlbnQoKSB7Ci0JCWZvciAoaW50IGkgPSB0aGlzLmVsZW1lbnRzLnNpemUoKTsgaSA+IDA7IGkgLT0gMSkgewotCQkJcHJpbnQodGhpcy5pbmRlbnQpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBdHRyaWJ1dGVBZnRlck5lc3RlZENvbnRlbnRFcnJvciBleHRlbmRzIEVycm9yIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7IC8vIG5vdCBzZXJpYWxpemVkCi0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBFbmRXaXRob3V0U3RhcnRFcnJvciBleHRlbmRzIEVycm9yIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7IC8vIG5vdCBzZXJpYWxpemVkCi0JCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkJcHVibGljIEVuZFdpdGhvdXRTdGFydEVycm9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBFbmRXaXRob3V0U3RhcnRFcnJvcihTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMubmFtZSA9IG5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wZXJzaXN0ZW5jZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcGVyc2lzdGVuY2UvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkyOGMwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wZXJzaXN0ZW5jZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIEFsbCB0aGVzZSBlcnJvcnMgYXJlIGJvdW5kIHRvIDUgYXJnczogMC1tc2csIDEtcm9vdCwgMi1uYW1lLCAzLWxpbmUsIDQtY29sdW1uCi1YTUxQYXJzZXJfRXJyb3JfQXRfTGluZT1FcnJvciBhdCBsaW5lIHszfXsxfTogezB9Ci1YTUxQYXJzZXJfRXJyb3JfQXRfTGluZV9Db2x1bW49RXJyb3IgYXQgbGluZSB7M30sIGNvbHVtbiB7NH17MX06IHswfQotWE1MUGFyc2VyX0Vycm9yX0F0X05hbWVfTGluZT1FcnJvciBpbiB7Mn0gYXQgbGluZSB7M306IHswfQotWE1MUGFyc2VyX0Vycm9yX0F0X05hbWVfTGluZV9Db2x1bW49RXJyb3IgaW4gezJ9IGF0IGxpbmUgezN9LCBjb2x1bW4gezR9OiB7MH0KLQotWE1MUGFyc2VyX05vX1NBWF9QYXJzZXI9VW5hYmxlIHRvIGFjcXVpcmUgYSBTQVggcGFyc2VyIHNlcnZpY2UuCi1YTUxQYXJzZXJfTWlzc2luZ19SZXF1aXJlZF9BdHRyaWJ1dGU9TWlzc2luZyByZXF1aXJlZCBhdHRyaWJ1dGUgaW4gInswfSI6IHsxfQotWE1MUGFyc2VyX1VuZXhwZWN0ZWRfQXR0cmlidXRlPVVuZXhwZWN0ZWQgYXR0cmlidXRlIGZvciBlbGVtZW50ICJ7MH0iOiB7MX09InsyfSIKLVhNTFBhcnNlcl9JbGxlZ2FsX1ZhbHVlX0Zvcl9BdHRyaWJ1dGU9SWxsZWdhbCB2YWx1ZSBmb3IgYXR0cmlidXRlICJ7MH0iIG9mIGVsZW1lbnQgInsxfSI6IHsyfQotWE1MUGFyc2VyX1VuZXhwZWN0ZWRfRWxlbWVudD1VbmV4cGVjdGVkIGVsZW1lbnQgaW4gZWxlbWVudCAiezB9IjogPHsxfXsyfT4KLVhNTFBhcnNlcl9EdXBsaWNhdGVfRWxlbWVudD1EdXBsaWNhdGUgc2luZ2xldG9uIGVsZW1lbnQgaW4gZWxlbWVudCAiezB9IjogPHsxfXsyfT4KLVhNTFBhcnNlcl9VbmV4cGVjdGVkX0NoYXJhY3Rlcl9EYXRhPVVuZXhwZWN0ZWQgY2hhcmFjdGVyIGRhdGEgaW4gZWxlbWVudCAiezB9IjogezF9Ci1YTUxQYXJzZXJfRWxlbWVudF9Ob3RfQWxsb3dlZD1FbGVtZW50ICJ7MH0iIGlzIG5vdCBhbGxvd2VkIHdpdGhpbiBlbGVtZW50ICJ7MX0iCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL0lTZXJ2aWNlVUkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvSVNlcnZpY2VVSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWM2MWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvSVNlcnZpY2VVSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZTsKLQotaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKLQotLyoqCi0gKiBDYWxsYmFjayBBUEkgZm9yIHByb21wdGluZyBmb3IgdXNlciBpbmZvcm1hdGlvbiBmcm9tIHdpdGhpbiBsb3dlciBsZXZlbCBjb2RlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZXJ2aWNlVUkgewotCS8qKgotCSAqIEF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIHJldHVybmVkIGZyb20gYW4gYXV0aGVudGljYXRpb24gcHJvbXB0IHJlcXVlc3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBBdXRoZW50aWNhdGlvbkluZm8gewotCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2F2ZTsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXNlck5hbWU7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nIHBhc3N3b3JkOwotCi0JCXB1YmxpYyBBdXRoZW50aWNhdGlvbkluZm8oU3RyaW5nIHVzZXJOYW1lLCBTdHJpbmcgcGFzc3dvcmQsIGJvb2xlYW4gc2F2ZVJlc3VsdCkgewotCQkJdGhpcy51c2VyTmFtZSA9IHVzZXJOYW1lOwotCQkJdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOwotCQkJdGhpcy5zYXZlID0gc2F2ZVJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNhdmVSZXN1bHQoKSB7Ci0JCQlyZXR1cm4gc2F2ZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKSB7Ci0JCQlyZXR1cm4gdXNlck5hbWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgewotCQkJcmV0dXJuIHBhc3N3b3JkOwotCQl9Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgYSBVSSBwcm9tcHQgZm9yIGF1dGhlbnRpY2F0aW9uIGRldGFpbHMKLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gLSB0aGUgbG9jYXRpb24gcmVxdWlyaW5nIGxvZ2luIGRldGFpbHMsIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIFRoZSBhdXRoZW50aWNhdGlvbiByZXN1bHQKLQkgKi8KLQlwdWJsaWMgQXV0aGVudGljYXRpb25JbmZvIGdldFVzZXJuYW1lUGFzc3dvcmQoU3RyaW5nIGxvY2F0aW9uKTsKLQotCS8qKgotCSAqIERpc3BsYXlzIGEgbGlzdCBvZiBjZXJ0aWZpY2F0ZXMgdG8gdGhlIHVzZXIuCi0JICogIAotCSAqIEBwYXJhbSBjZXJ0aWZpY2F0ZXMgLSBhIGxpc3Qgb2YgY2VydGlmaWNhdGVzIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIKLQkgKiBAcmV0dXJuIEFuIGFycmF5IG9mIGNlcnRpZmljYXRlcyB0aGF0IGhhdmUgYmVlbiBhY2NlcHRlZC4KLQkgKi8KLQlwdWJsaWMgQ2VydGlmaWNhdGVbXSBzaG93Q2VydGlmaWNhdGVzKENlcnRpZmljYXRlW11bXSBjZXJ0aWZpY2F0ZXMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvUHJvdmlzaW9uRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZTEzOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9Qcm92aXNpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLkFjdGl2YXRvcjsKLQotLyoqCi0gKiBBIGNoZWNrZWQgZXhjZXB0aW9uIGluZGljYXRpbmcgYSByZWNvdmVyYWJsZSBlcnJvciBvY2N1cnJlZCB3aGlsZSBwcm92aXNpb25pbmcuCi0gKiBUaGUgc3RhdHVzIHByb3ZpZGVzIGEgZnVydGhlciBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvYmxlbS4KLSAqIDxwPgotICogVGhpcyBleGNlcHRpb24gY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFByb3Zpc2lvbkV4Y2VwdGlvbiBleHRlbmRzIENvcmVFeGNlcHRpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLy9HZW5lcmFsIGFuZCBjb3JlIHN0YXR1cyBjb2RlcyBbMC0xMDAwXQotCS8qKgotCSAqIFN0YXR1cyBjb2RlIGNvbnN0YW50ICh2YWx1ZSAxKSBmb3IgYW4gdW5jYXRlZ29yaXplZCBlcnJvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFUk5BTF9FUlJPUiA9IDE7Ci0KLQkvL1JlcG9zaXRvcnkgc3RhdHVzIGNvZGVzIFsxMDAwLTE5OTldCi0JLy9HZW5lcmFsIHJlcG9zaXRvcnkgY29kZXMgWzEwMDAtMTA5OV0KLQkvKiogCi0JICogU3RhdHVzIGNvZGUgY29uc3RhbnQgKHZhbHVlIDEwMDApIGluZGljYXRpbmcgYSByZXBvc2l0b3J5Ci0JICogdW5leHBlY3RlZGx5IGRvZXMgbm90IGV4aXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9TSVRPUllfTk9UX0ZPVU5EID0gMTAwMDsKLQotCS8qKiAKLQkgKiBTdGF0dXMgY29kZSBjb25zdGFudCAodmFsdWUgMTAwMSkgaW5kaWNhdGluZyBhIHJlcG9zaXRvcnkKLQkgKiB1bmV4cGVjdGVkbHkgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9TSVRPUllfRVhJU1RTID0gMTAwMTsKLQotCS8qKiAKLQkgKiBTdGF0dXMgY29kZSBjb25zdGFudCAodmFsdWUgMTAwMikgaW5kaWNhdGluZyBhIHJlcG9zaXRvcnkKLQkgKiBjb3VsZCBub3QgYmUgcmVhZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9TSVRPUllfRkFJTEVEX1JFQUQgPSAxMDAyOwotCi0JLyoqIAotCSAqIFN0YXR1cyBjb2RlIGNvbnN0YW50ICh2YWx1ZSAxMDAzKSBpbmRpY2F0aW5nIGEgZmFpbHVyZSBvY2N1cnJlZAotCSAqIHdoaWxlIHdyaXRpbmcgdG8gYSByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9TSVRPUllfRkFJTEVEX1dSSVRFID0gMTAwMzsKLQotCS8qKiAKLQkgKiBTdGF0dXMgY29kZSBjb25zdGFudCAodmFsdWUgMTAwNCkgaW5kaWNhdGluZyBhIHJlcG9zaXRvcnkKLQkgKiBjb3VsZCBub3QgYmUgd3JpdHRlbiBiZWNhdXNlIGl0IGlzIGEgcmVhZC1vbmx5IHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1NJVE9SWV9SRUFEX09OTFkgPSAxMDA0OwotCi0JLyoqIAotCSAqIFN0YXR1cyBjb2RlIGNvbnN0YW50ICh2YWx1ZSAxMDA1KSBpbmRpY2F0aW5nIGFuIGF0dGVtcHQgd2FzCi0JICogbWFkZSB0byBjcmVhdGUgb3IgYWNjZXNzIGEgcmVwb3NpdG9yeSBvZiB1bmtub3duIHR5cGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1NJVE9SWV9VTktOT1dOX1RZUEUgPSAxMDA1OwotCS8qKiAKLQkgKiBTdGF0dXMgY29kZSBjb25zdGFudCAodmFsdWUgMTAwNikgaW5kaWNhdGluZyB0aGF0IGEgc3BlY2lmaWVkCi0JICogcmVwb3NpdG9yeSBsb2NhdGlvbiBpcyBub3QgdmFsaWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1NJVE9SWV9JTlZBTElEX0xPQ0FUSU9OID0gMTAwNjsKLQotCS8qKiAKLQkgKiBTdGF0dXMgY29kZSBjb25zdGFudCAodmFsdWUgMTAwNykgaW5kaWNhdGluZyB0aGF0IHRoZXJlIHdhcwotCSAqIGFuIGF1dGhlbnRpY2F0aW9uIGVycm9yIHdoaWxlIHJlYWRpbmcgYSByZXBvc2l0b3J5Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1NJVE9SWV9GQUlMRURfQVVUSEVOVElDQVRJT04gPSAxMDA3OwotCi0JLy9NZXRhZGF0YSByZXBvc2l0b3J5IGNvZGVzIFsxMTAwLTExOTldCi0KLQkvL0FydGlmYWN0IHJlcG9zaXRvcnkgY29kZXMgWzEyMDAtMTI5OV0KLQotCS8qKiAKLQkgKiBTdGF0dXMgY29kZSBjb25zdGFudCAodmFsdWUgMTIwMCkgaW5kaWNhdGluZyBhbiBhcnRpZmFjdCB1bmV4cGVjdGVkbHkKLQkgKiBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBUlRJRkFDVF9OT1RfRk9VTkQgPSAxMjAwOwotCi0JLyoqIAotCSAqIFN0YXR1cyBjb2RlIGNvbnN0YW50ICh2YWx1ZSAxMjAxKSBpbmRpY2F0aW5nIGFuIGFydGlmYWN0IHVuZXhwZWN0ZWRseQotCSAqIGFscmVhZHkgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFSVElGQUNUX0VYSVNUUyA9IDEyMDE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBzdGF0dXMgb2JqZWN0LiAgVGhlIG1lc3NhZ2UKLQkgKiBvZiB0aGUgZ2l2ZW4gc3RhdHVzIGlzIHVzZWQgYXMgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLgotCSAqCi0JICogQHBhcmFtIHN0YXR1cyB0aGUgc3RhdHVzIG9iamVjdCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBleGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgUHJvdmlzaW9uRXhjZXB0aW9uKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXN1cGVyKHN0YXR1cyk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSBhbmQgYSBzZXZlcml0eSBvZiAKLQkgKiB7QGxpbmsgSVN0YXR1cyNFUlJPUn0uCi0JICoKLQkgKiBAcGFyYW0gbWVzc2FnZSBUaGUgaHVtYW4tcmVhZGFibGUgcHJvYmxlbSBtZXNzYWdlCi0JICovCi0JcHVibGljIFByb3Zpc2lvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgbWVzc2FnZSkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGNhdXNlLCBhbmQKLQkgKiBhIHNldmVyaXR5IG9mIHtAbGluayBJU3RhdHVzI0VSUk9SfS4KLQkgKgotCSAqIEBwYXJhbSBtZXNzYWdlIFRoZSBodW1hbi1yZWFkYWJsZSBwcm9ibGVtIG1lc3NhZ2UKLQkgKiBAcGFyYW0gY2F1c2UgVGhlIHVuZGVybHlpbmcgY2F1c2Ugb2YgdGhlIGV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBQcm92aXNpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgbWVzc2FnZSwgY2F1c2UpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvZXZlbnRidXMvSVByb3Zpc2lvbmluZ0V2ZW50QnVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL2V2ZW50YnVzL0lQcm92aXNpb25pbmdFdmVudEJ1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmY2Y2UzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvZXZlbnRidXMvSVByb3Zpc2lvbmluZ0V2ZW50QnVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1czsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5ldmVudG1nci5FdmVudERpc3BhdGNoZXI7Ci0KLS8qKgotICogVGhlIGJ1cyBmb3IgZXZlbnRzIHJlbGF0ZWQgdG8gcHJvdmlzaW9uaW5nLiBUaGlzIHNlcnZpY2UgY2FuIGJlIHVzZWQgdG8gcmVnaXN0ZXIKLSAqIGEgbGlzdGVuZXIgdG8gcmVjZWl2ZSBwcm92aXNpb25pbmcgZXZlbnRzLCBvciB0byBicm9hZGNhc3QgZXZlbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm92aXNpb25pbmdFdmVudEJ1cyBleHRlbmRzIEV2ZW50RGlzcGF0Y2hlciB7Ci0JLyoqCi0JICogVGhlIG5hbWUgdXNlZCBmb3Igb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBldmVudCBidXMgc2VydmljZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUUgPSBJUHJvdmlzaW9uaW5nRXZlbnRCdXMuY2xhc3MuZ2V0TmFtZSgpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgYWRkTGlzdGVuZXIoUHJvdmlzaW9uaW5nTGlzdGVuZXIgdG9BZGQpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcmVtb3ZlTGlzdGVuZXIoUHJvdmlzaW9uaW5nTGlzdGVuZXIgdG9SZW1vdmUpOwotCi0JcHVibGljIGFic3RyYWN0IHZvaWQgcHVibGlzaEV2ZW50KEV2ZW50T2JqZWN0IGV2ZW50KTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGNsb3NlKCk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL2V2ZW50YnVzL1Byb3Zpc2lvbmluZ0xpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL2V2ZW50YnVzL1Byb3Zpc2lvbmluZ0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNzY0MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9ldmVudGJ1cy9Qcm92aXNpb25pbmdMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1czsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudExpc3RlbmVyOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci0KLS8qKgotICogQSBsaXN0ZW5lciB0aGF0IGlzIG5vdGlmaWVkIGFib3V0IGV2ZW50cyByZWxhdGVkIHRvIHByb3Zpc2lvbmluZy4KLSAqIEBzZWUgUHJvdmlzaW9uaW5nRXZlbnRCdXMKLSAqLwotcHVibGljIGludGVyZmFjZSBQcm92aXNpb25pbmdMaXN0ZW5lciBleHRlbmRzIEV2ZW50TGlzdGVuZXIgewotCS8vVE9ETzogcmVuYW1lIHRoaXMgaW50ZXJmYWNlIHRvIG1hdGNoIGVjbGlwc2UgY29udmVudGlvbnMgKElQcm92aXNpb25pbmdMaXN0ZW5lcikKLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBsaXN0ZW5lciBhYm91dCBhIHByb3Zpc2lvbmluZyBldmVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnkoRXZlbnRPYmplY3Qgbyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL2V2ZW50YnVzL1N5bmNocm9ub3VzUHJvdmlzaW9uaW5nTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvZXZlbnRidXMvU3luY2hyb25vdXNQcm92aXNpb25pbmdMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGYyYzg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvZXZlbnRidXMvU3luY2hyb25vdXNQcm92aXNpb25pbmdMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1czsKLQotcHVibGljIGludGVyZmFjZSBTeW5jaHJvbm91c1Byb3Zpc2lvbmluZ0xpc3RlbmVyIGV4dGVuZHMgUHJvdmlzaW9uaW5nTGlzdGVuZXIgewotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL2xvY2F0aW9uL0FnZW50TG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvbG9jYXRpb24vQWdlbnRMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTBkZjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvbG9jYXRpb24vQWdlbnRMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5sb2NhdGlvbjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotcHVibGljIGludGVyZmFjZSBBZ2VudExvY2F0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUUgPSBBZ2VudExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKTsKLQotCXB1YmxpYyBVUkwgZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5VVJMKCk7Ci0KLQlwdWJsaWMgVVJMIGdldE1ldGFkYXRhUmVwb3NpdG9yeVVSTCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGJ1bmRsZSB3aXRoIHRoZSBnaXZlbiBuYW1lc3BhY2UKLQkgKiBtYXkgd3JpdGUgaXRzIGFnZW50LXJlbGF0ZWQgZGF0YS4KLQkgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBuYW1lc3BhY2Ugb2YgdGhlIGJ1bmRsZSBzdG9yaW5nIHRoZSBkYXRhCi0JICogQHJldHVybiBUaGUgZGF0YSBsb2NhdGlvbgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0RGF0YUFyZWEoU3RyaW5nIG5hbWVzcGFjZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3R1YWwge0BsaW5rIFVSTH0gb2YgdGhpcyBsb2NhdGlvbi4gIElmIHRoZSBsb2NhdGlvbidzIHZhbHVlIGhhcyBiZWVuIHNldCwgCi0JICogdGhhdCB2YWx1ZSBpcyByZXR1cm5lZC4gIElmIHRoZSB2YWx1ZSBpcyBub3Qgc2V0IGFuZCB0aGUgbG9jYXRpb24gYWxsb3dzIGRlZmF1bHRzLCAKLQkgKiB0aGUgdmFsdWUgaXMgc2V0IHRvIHRoZSBkZWZhdWx0IGFuZCByZXR1cm5lZC4gIEluIGFsbCBvdGhlciBjYXNlcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIFVSTCBmb3IgdGhpcyBsb2NhdGlvbiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvY29yZS9yZXBvc2l0b3J5L0lSZXBvc2l0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL3JlcG9zaXRvcnkvSVJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiOTZlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL3JlcG9zaXRvcnkvSVJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLQotLyoqCi0gKiBCYXNlIGludGVyZmFjZSB0aGF0IGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgdGhhdCBtYXkgYmUgcHJvdmlkZWQgYnkgCi0gKiB2YXJpb3VzIGtpbmRzIG9mIHJlcG9zaXRvcmllcy4KLSAqIAotICogQG5vaW1wbGVtZW50IFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZXBvc2l0b3J5IGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0JLyoqIAotCSAqIFRoZSBrZXkgZm9yIGEgYm9vbGVhbiBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcG9zaXRvcnkKLQkgKiBpcyBhIHN5c3RlbSByZXBvc2l0b3J5LiAgU3lzdGVtIHJlcG9zaXRvcmllcyBhcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscwotCSAqIHRoYXQgYXJlIG5vdCBzdWJqZWN0IHRvIGdlbmVyYWwgYWNjZXNzLCBoaWRkZW4gZnJvbSB0aGUgdHlwaWNhbCB1c2VyLCBldGMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TWVNURU0gPSAicDIuc3lzdGVtIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGtleSBmb3IgYSBib29sZWFuIHByb3BlcnR5IGluZGljYXRpbmcgdGhhdCByZXBvc2l0b3J5IG1ldGFkYXRhIGlzCi0JICogc3RvcmVkIGluIGNvbXByZXNzZWQgZm9ybS4gIEEgY29tcHJlc3NlZCByZXBvc2l0b3J5IHdpbGwgaGF2ZSBsb3dlcgotCSAqIGJhbmR3aWR0aCBjb3N0IHRvIHJlYWQgd2hlbiByZW1vdGUsIGJ1dCBoaWdoZXIgcHJvY2Vzc2luZyBjb3N0IHRvCi0JICogdW5jb21wcmVzcyB3aGVuIHJlYWRpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9DT01QUkVTU0VEID0gInAyLmNvbXByZXNzZWQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUga2V5IGZvciBhIHN0cmluZyBwcm9wZXJ0eSBwcm92aWRpbmcgYSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciB0aGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIGEgc3RyaW5nIHByb3BlcnR5IHByb3ZpZGluZyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciB0aGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGtleSBmb3IgYSBzdHJpbmcgcHJvcGVydHkgcHJvdmlkaW5nIGEgVVJMIHRoYXQgY2FuIHJldHVybiBtaXJyb3JzIG9mIHRoaXMKLQkgKiByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTUlSUk9SU19VUkwgPSAicDIubWlycm9yc1VSTCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBrZXkgZm9yIGEgc3RyaW5nIHByb3BlcnR5IGNvbnRhaW5pbmcgdGhlIHRpbWUgd2hlbiB0aGUgcmVwb3NpdG9yeSB3YXMgbGFzdCBtb2RpZmllZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1RJTUVTVEFNUCA9ICJwMi50aW1lc3RhbXAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUga2V5IGZvciBhIHN0cmluZyBwcm9wZXJ0eSBwcm92aWRpbmcgdGhlIHVzZXIgbmFtZSB0byBhbiBhdXRoZW50aWNhdGVkCi0JICogVVJMLiAgVGhpcyBrZXkgaXMgdXNlZCBpbiB0aGUgc2VjdXJlIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHJlcG9zaXRvcnkgZGF0YS4KLQkgKiBAc2VlICNQUkVGRVJFTkNFX05PREUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1VTRVJOQU1FID0gInVzZXJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGtleSBmb3IgYSBzdHJpbmcgcHJvcGVydHkgcHJvdmlkaW5nIHRoZSBwYXNzd29yZCB0byBhbiBhdXRoZW50aWNhdGVkCi0JICogVVJMLiAgVGhpcyBrZXkgaXMgdXNlZCBpbiB0aGUgc2VjdXJlIHByZWZlcmVuY2Ugc3RvcmUgZm9yIHJlcG9zaXRvcnkgZGF0YS4KLQkgKiBAc2VlICNQUkVGRVJFTkNFX05PREUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BBU1NXT1JEID0gInBhc3N3b3JkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIG5vZGUgaWRlbnRpZmllciBmb3IgcmVwb3NpdG9yeSBzZWN1cmUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGRVJFTkNFX05PREUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZXBvc2l0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSByZXBvc2l0b3J5IHR5cGUgY29uc3RhbnQgKHZhbHVlIDApIHJlcHJlc2VudGluZyBhIG1ldGFkYXRhIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9NRVRBREFUQSA9IDA7Ci0KLQkvKioKLQkgKiBBIHJlcG9zaXRvcnkgdHlwZSBjb25zdGFudCAodmFsdWUgMSkgcmVwcmVzZW50aW5nIGFuIGFydGlmYWN0IHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9BUlRJRkFDVCA9IDE7Ci0KLQkvKiogCi0JICogR2VuZXJhbCBwdXJwb3NlIHplcm8tdmFsdWVkIGJpdCBtYXNrIGNvbnN0YW50LiBVc2VmdWwgd2hlbmV2ZXIgeW91IG5lZWQgdG8KLQkgKiBzdXBwbHkgYSBiaXQgbWFzayB3aXRoIG5vIGJpdHMgc2V0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotCi0JLyoqCi0JICogQW4gb3B0aW9uIGZsYWcgY29uc3RhbnQgKHZhbHVlIDEpIGluZGljYXRpbmcgYW4gZW5hYmxlZCByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOQUJMRUQgPSAxOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJMIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqIFRPRE86IFNob3VsZCB3ZSB1c2UgVVJMIG9yIFVSST8gVVJMIHJlcXVpcmVzIGEgcHJvdG9jb2wgaGFuZGxlcgotCSAqIHRvIGJlIGluc3RhbGxlZCBpbiBKYXZhLiAgQ2FuIHRoZSBVUkwgaGF2ZSBhbnkgcHJvdG9jb2w/Ci0JICogQHJldHVybiB0aGUgVVJMIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0eXBlIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdmVyc2lvbiBmb3IgdGhlIHJlcG9zaXRvcnkgdHlwZS4KLQkgKiBAcmV0dXJuIHRoZSB2ZXJzaW9uIG9mIHRoZSB0eXBlIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGJyaWVmIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqIEByZXR1cm4gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHByb3ZpZGVyIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIG9mIHRoaXMgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3ZpZGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcmVhZC1vbmx5IGNvbGxlY3Rpb24gb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICogQHJldHVybiB0aGUgcHJvcGVydGllcyBvZiB0aGlzIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIE1hcCBnZXRQcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcmVwb3NpdG9yeSBjYW4gYmUgbW9kaWZpZWQuCi0JICogQHJldHVybiB3aGV0aGVyIG9yIG5vdCB0aGlzIHJlcG9zaXRvcnkgY2FuIGJlIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIG5hbWUgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGggdGhlIGdpdmVuIGtleS4gUmV0dXJucyB0aGUgb2xkIHByb3BlcnR5Ci0JICogYXNzb2NpYXRlZCB3aXRoIHRoYXQga2V5LCBpZiBhbnkuICBTZXR0aW5nIGEgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4gd2lsbAotCSAqIHJlbW92ZSB0aGUgY29ycmVzcG9uZGluZyBrZXkgZnJvbSB0aGUgcHJvcGVydGllcyBvZiB0aGlzIHJlcG9zaXRvcnkuCi0JICogCi0JICogQHBhcmFtIGtleSBUaGUgcHJvcGVydHkga2V5Ci0JICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgcHJvcGVydHkgdmFsdWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIHJlbW92ZSB0aGUga2V5Ci0JICogQHJldHVybiBUaGUgb2xkIHByb3BlcnR5IHZhbHVlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSB3YXMgbm8gb2xkIHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgcHJvdmlkZXIgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvdmlkZXIoU3RyaW5nIHByb3ZpZGVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvcmVwb3NpdG9yeS9SZXBvc2l0b3J5Q3JlYXRpb25FeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvcmVwb3NpdG9yeS9SZXBvc2l0b3J5Q3JlYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiNWE2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL3JlcG9zaXRvcnkvUmVwb3NpdG9yeUNyZWF0aW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnk7Ci0KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5Q3JlYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU2NDgzODIxMjE5NjMzMTcxMDBMOwotCi0JcHVibGljIFJlcG9zaXRvcnlDcmVhdGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgZSkgewotCQlzdXBlcihlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvcmVwb3NpdG9yeS9SZXBvc2l0b3J5RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2NvcmUvcmVwb3NpdG9yeS9SZXBvc2l0b3J5RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhNTFjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9jb3JlL3JlcG9zaXRvcnkvUmVwb3NpdG9yeUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLS8qKgotICogQW4gZXZlbnQgaW5kaWNhdGluZyBhIHJlcG9zaXRvcnkgd2FzIGFkZGVkLCByZW1vdmVkLCBjaGFuZ2VkLAotICogb3IgZGlzY292ZXJlZC4KLSAqIAotICogQG5vZXh0ZW5kIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGNsYXNzIFJlcG9zaXRvcnlFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMDgyNDAyOTIwNjE3MjgxNzY1TDsKLQotCS8qKgotCSAqIEEgY2hhbmdlIGtpbmQgY29uc3RhbnQgKHZhbHVlIDApLCBpbmRpY2F0aW5nIGEgcmVwb3NpdG9yeSB3YXMgYWRkZWQgdG8gdGhlIAotCSAqIGxpc3Qgb2YgcmVwb3NpdG9yaWVzIGtub3duIHRvIGEgcmVwb3NpdG9yeSBtYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEREVEID0gMDsKLQotCS8qKgotCSAqIEEgY2hhbmdlIGtpbmQgY29uc3RhbnQgKHZhbHVlIDEpLCBpbmRpY2F0aW5nIGEgcmVwb3NpdG9yeSB3YXMgcmVtb3ZlZCBmcm9tIAotCSAqIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyBrbm93biB0byBhIHJlcG9zaXRvcnkgbWFuYWdlci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkVEID0gMTsKLQotCS8qKgotCSAqIEEgY2hhbmdlIGtpbmQgY29uc3RhbnQgKHZhbHVlIDIpLCBpbmRpY2F0aW5nIGEgcmVwb3NpdG9yeSBrbm93biB0byBhIAotCSAqIHJlcG9zaXRvcnkgbWFuYWdlciB3YXMgbW9kaWZpZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFRCA9IDI7Ci0KLQkvKioKLQkgKiBBIGNoYW5nZSBraW5kIGNvbnN0YW50ICh2YWx1ZSA0KSwgaW5kaWNhdGluZyBhIG5ldyByZXBvc2l0b3J5IHdhcyBkaXNjb3ZlcmVkLgotCSAqIFRoaXMgZXZlbnQgaXMgYSB3YXkgdG8gbm90aWZ5IHJlcG9zaXRvcnkgbWFuYWdlcnMgaW4gYSBnZW5lcmljIHdheSBhYm91dAotCSAqIGEgbmV3bHkgZGlzY292ZXJlZCByZXBvc2l0b3J5LiBUaGUgcmVwb3NpdG9yeSBtYW5hZ2VyIHdpbGwgdHlwaWNhbGx5IHJlY2VpdmUKLQkgKiB0aGlzIGV2ZW50LCBhZGQgdGhlIHJlcG9zaXRvcnkgdG8gaXRzIGxpc3Qgb2Yga25vd24gcmVwb3NpdG9yaWVzLCBhbmQgaXNzdWUKLQkgKiBhIHN1YnNlcXVlbnQge0BsaW5rICNBRERFRH0gZXZlbnQuIE90aGVyIGNsaWVudHMgc2hvdWxkIG5vdCB0eXBpY2FsbHkKLQkgKiBsaXN0ZW4gZm9yIHRoaXMga2luZCBvZiBldmVudC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBESVNDT1ZFUkVEID0gNDsKLQotCXByaXZhdGUgZmluYWwgaW50IGtpbmQsIHR5cGU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyByZXBvc2l0b3J5IGV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkgdGhhdCBjaGFuZ2VkLgotCSAqIEBwYXJhbSByZXBvc2l0b3J5VHlwZSB0aGUgdHlwZSBvZiByZXBvc2l0b3J5IHRoYXQgd2FzIGNoYW5nZWQKLQkgKiBAcGFyYW0ga2luZCB0aGUga2luZCBvZiBjaGFuZ2UgdGhhdCBvY2N1cnJlZC4KLQkgKiBAcGFyYW0gZW5hYmxlZCB3aGV0aGVyIHRoZSByZXBvc2l0b3J5IGlzIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgUmVwb3NpdG9yeUV2ZW50KFVSTCBsb2NhdGlvbiwgaW50IHJlcG9zaXRvcnlUeXBlLCBpbnQga2luZCwgYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyKGxvY2F0aW9uKTsKLQkJdGhpcy5raW5kID0ga2luZDsKLQkJdGhpcy50eXBlID0gcmVwb3NpdG9yeVR5cGU7Ci0JCWlzRW5hYmxlZCA9IGVuYWJsZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUga2luZCBvZiBjaGFuZ2UgdGhhdCBvY2N1cnJlZC4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGtpbmQgb2YgY2hhbmdlIHRoYXQgb2NjdXJyZWQuCi0JICogQHNlZSAjQURERUQKLQkgKiBAc2VlICNSRU1PVkVECi0JICogQHNlZSAjQ0hBTkdFRAotCSAqIEBzZWUgI0RJU0NPVkVSRUQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEtpbmQoKSB7Ci0JCXJldHVybiBraW5kOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXBvc2l0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSByZXBvc2l0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0UmVwb3NpdG9yeUxvY2F0aW9uKCkgewotCQlyZXR1cm4gKFVSTCkgZ2V0U291cmNlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiByZXBvc2l0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV2ZW50LiBDbGllbnRzCi0JICogc2hvdWxkIG5vdCBhc3N1bWUgdGhhdCB0aGUgc2V0IG9mIHBvc3NpYmxlIHJlcG9zaXRvcnkgdHlwZXMgaXMgY2xvc2VkOwotCSAqIGNsaWVudHMgc2hvdWxkIGlnbm9yZSBldmVudHMgZnJvbSByZXBvc2l0b3J5IHR5cGVzIHRoZXkgZG9uJ3Qga25vdyBhYm91dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHJlcG9zaXRvcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZXZlbnQuCi0JICogICh7QGxpbmsgSVJlcG9zaXRvcnkjVFlQRV9NRVRBREFUQX0gb3Ige0BsaW5rIElSZXBvc2l0b3J5I1RZUEVfQVJUSUZBQ1R9KS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlcG9zaXRvcnlUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFmZmVjdGVkIHJlcG9zaXRvcnkgaXMgZW5hYmxlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXBvc2l0b3J5IGlzIGVuYWJsZWQsCi0JICogYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXBvc2l0b3J5RW5hYmxlZCgpIHsKLQkJcmV0dXJuIGlzRW5hYmxlZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3F1ZXJ5L0NvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvcXVlcnkvQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5N2FmYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvcXVlcnkvQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQSBjb2xsZWN0b3IgaXMgYSBnZW5lcmljIHZpc2l0b3IgdGhhdCBjb2xsZWN0cyBvYmplY3RzIHBhc3NlZCB0byBpdCwKLSAqIGFuZCBjYW4gdGhlbiBleHByZXNzIHRoZSByZXN1bHQgb2YgdGhlIHZpc2l0IGluIHZhcmlvdXMgZm9ybXMuIFRoZSBjb2xsZWN0b3IKLSAqIGNhbiBhbHNvIHNob3J0LWNpcmN1aXQgYSB0cmF2ZXJzYWwgYnkgcmV0dXJuaW5nIDxjb2RlPmZhbHNlPC9jb2RlPiBmcm9tCi0gKiBpdHMge0BsaW5rICNhY2NlcHQoT2JqZWN0KX0gbWV0aG9kLgotICogPHA+Ci0gKiBUaGlzIGRlZmF1bHQgY29sbGVjdG9yIGp1c3QgYWNjZXB0cyBhbGwgb2JqZWN0cyBwYXNzZWQgdG8gaXQuICBDbGllbnRzIG1heSBzdWJjbGFzcwotICogdG8gcGVyZm9ybSBkaWZmZXJlbnQgcHJvY2Vzc2luZyBvbiB0aGUgb2JqZWN0cyBwYXNzZWQgdG8gaXQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xsZWN0b3IgewotCXByaXZhdGUgQXJyYXlMaXN0IGNvbGxlY3RlZCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvbGxlY3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFjY2VwdHMgYW4gb2JqZWN0LgotCSAqIDxwPgotCSAqIFRoaXMgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhZGRzIHRoZSBvYmplY3RzIHRvIGEgbGlzdC4gQ2xpZW50cyBtYXkKLQkgKiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIGFkZGl0aW9uYWwgZmlsdGVyaW5nLCBhZGQgZGlmZmVyZW50IG9iamVjdHMgCi0JICogdG8gdGhlIGxpc3QsIHNob3J0LWNpcmN1aXQgdGhlIHRyYXZlcnNhbCwgb3IgcHJvY2VzcyB0aGUgb2JqZWN0cyBkaXJlY3RseSB3aXRob3V0IAotCSAqIGNvbGxlY3RpbmcgdGhlbS4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0IHRoZSBvYmplY3QgdG8gY29sbGVjdCBvciB2aXNpdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHRyYXZlcnNhbCBzaG91bGQgY29udGludWUsCi0JICogb3IgPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGluZGljYXRlIHRoZSB0cmF2ZXJzYWwgc2hvdWxkIHN0b3AuCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmplY3QpIHsKLQkJZ2V0TGlzdCgpLmFkZChvYmplY3QpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IHRoYXQgaXMgYmVpbmcgdXNlZCB0byBjb2xsZWN0IHJlc3VsdHMuCi0JICogQHJldHVybiB0aGUgbGlzdCBiZWluZyB1c2VkIHRvIGNvbGxlY3QgcmVzdWx0cy4KLQkgKi8KLQlwcm90ZWN0ZWQgTGlzdCBnZXRMaXN0KCkgewotCQlpZiAoY29sbGVjdGVkID09IG51bGwpCi0JCQljb2xsZWN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBjb2xsZWN0ZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgY29sbGVjdG9yIGlzIGVtcHR5LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjb2xsZWN0b3IgaGFzIGFjY2VwdGVkIGFueSByZXN1bHRzLAotCSAqIGFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBjb2xsZWN0ZWQgPT0gbnVsbCB8fCBjb2xsZWN0ZWQuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3Igb24gdGhlIGNvbGxlY3RlZCBvYmplY3RzLgotCSAqIAotCSAqIEByZXR1cm4gYW4gaXRlcmF0b3Igb2YgdGhlIGNvbGxlY3RlZCBvYmplY3RzLgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIGNvbGxlY3RlZCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC5pdGVyYXRvcigpIDogY29sbGVjdGVkLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNvbGxlY3RlZCBvYmplY3RzLgotCSAqLwotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGNvbGxlY3RlZCA9PSBudWxsID8gMCA6IGNvbGxlY3RlZC5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29sbGVjdGVkIG9iamVjdHMgYXMgYW4gYXJyYXkKLQkgKiAKLQkgKiBAcGFyYW0gY2xhenogVGhlIHR5cGUgb2YgYXJyYXkgdG8gcmV0dXJuCi0JICogQHJldHVybiBUaGUgYXJyYXkgb2YgcmVzdWx0cwotCSAqIEB0aHJvd3MgQXJyYXlTdG9yZUV4Y2VwdGlvbiB0aGUgcnVudGltZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgYXJyYXkgaXMKLQkgKiAgICAgICAgIG5vdCBhIHN1cGVydHlwZSBvZiB0aGUgcnVudGltZSB0eXBlIG9mIGV2ZXJ5IGNvbGxlY3RlZCBvYmplY3QKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gdG9BcnJheShDbGFzcyBjbGF6eikgewotCQlpbnQgc2l6ZSA9IGNvbGxlY3RlZCA9PSBudWxsID8gMCA6IGNvbGxlY3RlZC5zaXplKCk7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UoY2xhenosIHNpemUpOwotCQlpZiAoc2l6ZSAhPSAwKQotCQkJY29sbGVjdGVkLnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiB0b0NvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBjb2xsZWN0ZWQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QgOiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGNvbGxlY3RlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvcXVlcnkvQ29tcG91bmRRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvcXVlcnkvQ29tcG91bmRRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjM3NzBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3F1ZXJ5L0NvbXBvdW5kUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5OwotCi0vKioKLSAqIEEgcXVlcnkgdGhhdCBjb21iaW5lcyBhIGdyb3VwIG9mIG90aGVyIHF1ZXJpZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21wb3VuZFF1ZXJ5IGV4dGVuZHMgUXVlcnkgewotCXByaXZhdGUgYm9vbGVhbiBhbmQ7Ci0JcHJpdmF0ZSBRdWVyeVtdIHF1ZXJpZXM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgY29tcG91bmQgcXVlcnkgdGhhdCBjb21iaW5lcyB0aGUgZ2l2ZW4gcXVlcmllcy4gVGhlIHF1ZXJpZXMKLQkgKiB3aWxsIGJlIHBlcmZvcm1lZCBieSB0aGUgY29tcG91bmQgcXVlcnkgaW4gdGhlIGdpdmVuIG9yZGVyLiBUaGlzIG1ldGhvZAotCSAqIG1pZ2h0IG5vdCBwZXJmb3JtIGFsbCBxdWVyaWVzIGlmIGl0IGNhbiBkZXRlcm1pbmUgdGhlIHJlc3VsdCBvZiB0aGUgY29tcG91bmQKLQkgKiBleHByZXNzaW9uIHdpdGhvdXQgZG9pbmcgc28uCi0JICogCi0JICogQHBhcmFtIHF1ZXJpZXMgVGhlIHF1ZXJpZXMgdG8gcGVyZm9ybQotCSAqIEBwYXJhbSBhbmQgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBxdWVyeSByZXByZXNlbnRzIGEgbG9naWNhbCAnYW5kJywgYW5kCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIHRoaXMgcXVlcnkgcmVwcmVzZW50cyBhIGxvZ2ljYWwgJ29yJy4KLQkgKi8KLQlwdWJsaWMgQ29tcG91bmRRdWVyeShRdWVyeVtdIHF1ZXJpZXMsIGJvb2xlYW4gYW5kKSB7Ci0JCXRoaXMucXVlcmllcyA9IHF1ZXJpZXM7Ci0JCXRoaXMuYW5kID0gYW5kOwotCX0KLQotCXB1YmxpYyBRdWVyeVtdIGdldFF1ZXJpZXMoKSB7Ci0JCXJldHVybiBxdWVyaWVzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIGNvbXBvdW5kIHF1ZXJ5IGNvbWJpbmVzIGl0cyBxdWVyaWVzIHdpdGggYSBsb2dpY2FsCi0JICogJ2FuZCcgb3IgJ29yJy4KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcXVlcnkgcmVwcmVzZW50cyBhIGxvZ2ljYWwgJ2FuZCcsIGFuZAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGlzIHF1ZXJ5IHJlcHJlc2VudHMgYSBsb2dpY2FsICdvcicuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBbmQoKSB7Ci0JCXJldHVybiBhbmQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5xdWVyeTIuUXVlcnkjaXNNYXRjaChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWF0Y2goT2JqZWN0IGNhbmRpZGF0ZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHF1ZXJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gdmFsaWQgPSBxdWVyaWVzW2ldLmlzTWF0Y2goY2FuZGlkYXRlKTsKLQkJCS8vIGlmIHdlIGFyZSBPUidpbmcgdGhlbiB0aGUgZmlyc3QgdGltZSB3ZSBmaW5kIGEgcmVxdWlyZW1lbnQgdGhhdCBpcyBtZXQsIHJldHVybiBzdWNjZXNzCi0JCQlpZiAodmFsaWQgJiYgIWFuZCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vIGlmIHdlIGFyZSBBTkQnaW5nIHRoZW4gdGhlIGZpcnN0IHRpbWUgd2UgZmluZCBhIHJlcXVpcmVtZW50IHRoYXQgaXMgTk9UIG1ldCwgcmV0dXJuIGZhaWx1cmUKLQkJCWlmICghdmFsaWQgJiYgYW5kKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBpZiB3ZSBnZXQgcGFzdCB0aGUgcmVxdWlyZW1lbnRzIGNoZWNrIGFuZCB3ZSBhcmUgQU5EJ2luZyB0aGVuIHJldHVybiB0cnVlIAotCQkvLyBzaW5jZSBhbGwgcmVxdWlyZW1lbnRzIG11c3QgaGF2ZSBiZWVuIG1ldC4gIElmIHdlIGFyZSBPUidpbmcgdGhlbiByZXR1cm4gZmFsc2UgCi0JCS8vIHNpbmNlIG5vbmUgb2YgdGhlIHJlcXVpcmVtZW50cyB3ZXJlIG1ldC4KLQkJcmV0dXJuIGFuZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9xdWVyeS9JUXVlcnlhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9xdWVyeS9JUXVlcnlhYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjYjc2ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvcXVlcnkvSVF1ZXJ5YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLQotLyoqCi0gKiBBbiBJUXVlcnlhYmxlIGNvbnRhaW5zIG9iamVjdHMsIGFuZCBpcyBhYmxlIHRvIHBlcmZvcm0gcXVlcmllcyBvbiB0aG9zZSBvYmplY3RzLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJUXVlcnlhYmxlIHsKLQkvKioKLQkgKiBQZXJmb3JtcyBhIHF1ZXJ5LCBwYXNzaW5nIGFueSBvYmplY3RzIHRoYXQgc2F0aXNmeSB0aGUKLQkgKiBxdWVyeSB0byB0aGUgcHJvdmlkZWQgY29sbGVjdG9yLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGxvbmctcnVubmluZzsgcHJvZ3Jlc3MgYW5kIGNhbmNlbGxhdGlvbiBhcmUgcHJvdmlkZWQKLQkgKiBieSB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvci4gCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBxdWVyeSBUaGUgcXVlcnkgdG8gcGVyZm9ybQotCSAqIEBwYXJhbSBjb2xsZWN0b3IgQ29sbGVjdHMgdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gVGhlIGNvbGxlY3RvciBhcmd1bWVudAotCSAqLwotCXB1YmxpYyBDb2xsZWN0b3IgcXVlcnkoUXVlcnkgcXVlcnksIENvbGxlY3RvciBjb2xsZWN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9xdWVyeS9RdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvcXVlcnkvUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUwNjY0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9xdWVyeS9RdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogVGhlIHN1cGVyY2xhc3Mgb2YgYWxsIHF1ZXJpZXMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGFuIHtAbGluayBJUXVlcnlhYmxlfS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBtYXkgYmUgc3ViY2xhc3NlZCBieSBjbGllbnRzLiBTdWJjbGFzc2VzIHNob3VsZCBzcGVjaWZ5IHRoZSB0eXBlCi0gKiBvZiBvYmplY3QgdGhleSBzdXBwb3J0IHF1ZXJ5aW5nIG9uLiBTdWJjbGFzc2VzIGFyZSBhbHNvIGVuY291cmFnZWQgdG8gY2xlYXJseQotICogc3BlY2lmeSB0aGVpciBtYXRjaCBhbGdvcml0aG0sIGFuZCBleHBvc2UgdGhlIHBhcmFtZXRlcnMgaW52b2x2ZWQgaW4gdGhlIG1hdGNoCi0gKiBjb21wdXRhdGlvbiwgdG8gYWxsb3cge0BsaW5rIElRdWVyeWFibGV9IGltcGxlbWVudGF0aW9ucyB0byBvcHRpbWl6ZSB0aGVpcgotICogZXhlY3V0aW9uIG9mIHRoZSBxdWVyeS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFF1ZXJ5IHsKLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHF1ZXJ5LgotCSAqLwotCXB1YmxpYyBRdWVyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIG9iamVjdCBzYXRpc2ZpZXMgdGhlIHBhcmFtZXRlcnMgb2YgdGhpcyBxdWVyeS4KLQkgKiAKLQkgKiBAcGFyYW0gY2FuZGlkYXRlIFRoZSBvYmplY3QgdG8gcGVyZm9ybSB0aGUgcXVlcnkgYWdhaW5zdAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHVuaXQgc2F0aXNmaWVzIHRoZSBwYXJhbWV0ZXJzCi0JICogb2YgdGhpcyBxdWVyeSwgYW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc01hdGNoKE9iamVjdCBjYW5kaWRhdGUpOwotCi0JLyoqCi0JICogUGVyZm9ybXMgdGhpcyBxdWVyeSBvbiB0aGUgZ2l2ZW4gaXRlcmF0b3IsIHBhc3NpbmcgYWxsIG9iamVjdHMgaW4gdGhlIGl0ZXJhdG9yIAotCSAqIHRoYXQgbWF0Y2ggdGhlIGNyaXRlcmlhIG9mIHRoaXMgcXVlcnkgdG8gdGhlIGdpdmVuIHJlc3VsdC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdG9yIHBlcmZvcm0oSXRlcmF0b3IgaXRlcmF0b3IsIENvbGxlY3RvciByZXN1bHQpIHsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJT2JqZWN0IGNhbmRpZGF0ZSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpc01hdGNoKGNhbmRpZGF0ZSkpCi0JCQkJcmVzdWx0LmFjY2VwdChjYW5kaWRhdGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL2NvcmUvcmVwb3NpdG9yeS9BYnN0cmFjdFJlcG9zaXRvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9jb3JlL3JlcG9zaXRvcnkvQWJzdHJhY3RSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNTI1NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL2NvcmUvcmVwb3NpdG9yeS9BYnN0cmFjdFJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuY29yZS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLk9yZGVyZWRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotCi0vKioKLSogQWJzdHJhY3RSZXBvc2l0b3J5IGRlZmluZXMgY29tbW9uIHByb3BlcnRpZXMgdGhhdCBtYXkgYmUgcHJvdmlkZWQgYnkgdmFyaW91cyBraW5kcwotKiBvZiByZXBvc2l0b3JpZXMuCi0qIDxwPgotKiBDbGllbnRzIG1heSBleHRlbmQgdGhpcyBjbGFzcy4KLSogPC9wPgotKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlcG9zaXRvcnkgZXh0ZW5kcyBQbGF0Zm9ybU9iamVjdCBpbXBsZW1lbnRzIElSZXBvc2l0b3J5IHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByb3RlY3RlZCB0cmFuc2llbnQgVVJMIGxvY2F0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgbmFtZTsKLQlwcm90ZWN0ZWQgTWFwIHByb3BlcnRpZXMgPSBuZXcgT3JkZXJlZFByb3BlcnRpZXMoKTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHByb3ZpZGVyOwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb247Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RSZXBvc2l0b3J5KFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZlcnNpb24sIFVSTCBsb2NhdGlvbiwgU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgcHJvdmlkZXIsIE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uID09IG51bGwgPyAiIiA6IGRlc2NyaXB0aW9uOyAvLyROT04tTkxTLTEkCi0JCXRoaXMucHJvdmlkZXIgPSBwcm92aWRlciA9PSBudWxsID8gIiIgOiBwcm92aWRlcjsgLy8kTk9OLU5MUy0xJAotCQlpZiAocHJvcGVydGllcyAhPSBudWxsKQotCQkJdGhpcy5wcm9wZXJ0aWVzLnB1dEFsbChwcm9wZXJ0aWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhpcyByZXBvc2l0b3J5IGlzIG1vZGlmaWFibGUsIHRocm93aW5nIGEgcnVudGltZSBleGNlcHRpb24gaWYKLQkgKiBpdCBpcyBub3QuIFRoaXMgaXMgc3VpdGFibGUgZm9yIHVzZSBieSBzdWJjbGFzc2VzIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlCi0JICogdG8gd3JpdGUgdG8gYSByZXBvc2l0b3J5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFzc2VydE1vZGlmaWFibGUoKSB7Ci0JCWlmICghaXNNb2RpZmlhYmxlKCkpCi0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJlcG9zaXRvcnkgbm90IG1vZGlmaWFibGU6ICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIHJlcG9zaXRvcnkuCi0JICogQHJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGlzIHJlcG9zaXRvcnkuCi0JICogVE9ETzogU2hvdWxkIHdlIHVzZSBVUkwgb3IgVVJJPyBVUkwgcmVxdWlyZXMgYSBwcm90b2NvbCBoYW5kbGVyCi0JICogdG8gYmUgaW5zdGFsbGVkIGluIEphdmEuICBDYW4gdGhlIFVSTCBoYXZlIGFueSBwcm90b2NvbD8KLQkgKiBAcmV0dXJuIHRoZSBVUkwgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIFVSTCBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcmVhZC1vbmx5IGNvbGxlY3Rpb24gb2YgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJlcG9zaXRvcnkuCi0JICogQHJldHVybiB0aGUgcHJvcGVydGllcyBvZiB0aGlzIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIE1hcCBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gT3JkZXJlZFByb3BlcnRpZXMudW5tb2RpZmlhYmxlUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm92aWRlciBvZiB0aGUgcmVwb3NpdG9yeS4KLQkgKiBAcmV0dXJuIHRoZSBwcm92aWRlciBvZiB0aGlzIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgZ2V0UHJvdmlkZXIoKSB7Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiB0aGUgcmVwb3NpdG9yeS4KLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHZlcnNpb24gZm9yIHRoZSByZXBvc2l0b3J5IHR5cGUuCi0JICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgdHlwZSBvZiB0aGUgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgewotCQl0aGlzLm5hbWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHNldFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlhc3NlcnRNb2RpZmlhYmxlKCk7Ci0JCXJldHVybiAoU3RyaW5nKSAodmFsdWUgPT0gbnVsbCA/IHByb3BlcnRpZXMucmVtb3ZlKGtleSkgOiBwcm9wZXJ0aWVzLnB1dChrZXksIHZhbHVlKSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFByb3ZpZGVyKFN0cmluZyBwcm92aWRlcikgewotCQl0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2RkY2NlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjX2FudCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvQ0RDLTEuMCVGb3VuZGF0aW9uLTEuMCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNWQxZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4KLWFudF90YXNrcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIERpcmVjdG9yIEFudCBUYXNrcy5sYXVuY2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBEaXJlY3RvciBBbnQgVGFza3MubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2EwOTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIERpcmVjdG9yIEFudCBUYXNrcy5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9UQVJHRVRTX1VQREFURUQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5ERUZBVUxUX1ZNX0lOU1RBTEwiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHtwcm9qZWN0fSIvPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvc2NyaXB0cy9idWlsZEV4dHJhSkFSLnhtbCIvPgotPC9saXN0QXR0cmlidXRlPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9UWVBFUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIxIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLnVpLkFUVFJfTEFVTkNIX0lOX0JBQ0tHUk9VTkQiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuQ0xBU1NQQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LnVpLkFudENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuREVGQVVMVF9DTEFTU1BBVEgiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9KRUNUX0FUVFIiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfQlVJTERFUl9FTkFCTEVEIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWx9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9ImZ1bGwsaW5jcmVtZW50YWwsIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9UUklHR0VSU19DT05GSUdVUkVEIiB2YWx1ZT0idHJ1ZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNjNkM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xCdWlsZGVyPC9uYW1lPgotCQkJPHRyaWdnZXJzPmZ1bGwsaW5jcmVtZW50YWwsPC90cmlnZ2Vycz4KLQkJCTxhcmd1bWVudHM+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+TGF1bmNoQ29uZmlnSGFuZGxlPC9rZXk+Ci0JCQkJCTx2YWx1ZT4mbHQ7cHJvamVjdCZndDsvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIERpcmVjdG9yIEFudCBUYXNrcy5sYXVuY2g8L3ZhbHVlPgotCQkJCTwvZGljdGlvbmFyeT4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODUyM2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLSNUaHUgQXVnIDE2IDExOjAwOjU5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNDUwMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1N1biBTZXAgMjMgMTE6NTc6NTQgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9ZmFsc2UKLXNwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTEzZDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZjI3NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHA7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29uc29sZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUucGhhc2VzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeSwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcub3NnaS5mcmFtZXdvcmsKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuYXBwLkFjdGl2YXRvcgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLAotIEoyU0UtMS40Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24sCi0gb3JnLmVjbGlwc2Uub3NnaTtidW5kbGUtdmVyc2lvbj0iMy40LjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3Rvci5hcHA7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNTUwN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1zb3VyY2UuYW50X3Rhc2tzL2RpcmVjdG9yLWFudC5qYXI9c3JjX2FudC8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhbnRfdGFza3MvZGlyZWN0b3ItYW50LmphcixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXI9LixhbnRfdGFza3MvZGlyZWN0b3ItYW50LmphcgotZXh0cmEuYW50X3Rhc2tzL2RpcmVjdG9yLWFudC5qYXIgPSBwbGF0Zm9ybTovcGx1Z2luL29yZy5hcGFjaGUuYW50Ci1qYXJzLmV4dHJhLmNsYXNzcGF0aCA9IHBsYXRmb3JtOi9wbHVnaW4vb3JnLmFwYWNoZS5hbnQvbGliL2FudC5qYXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvY29uZmlnLmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvY29uZmlnLmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTlhZjU0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL2NvbmZpZy5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0jIEVjbGlwc2UgcnVudGltZSBjb25maWd1cmF0aW9uIGZpbGUKLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIGtleS92YWx1ZSBwYWlycyB0aGF0IGFyZSBtZXJnZWQgaW50byB0aGUgCi0jIFN5c3RlbSBwcm9wZXJ0aWVzIG9uIHN5c3RlbSBzdGFydHVwLiAgVGhlIHZhbHVlcyBjb250cm9sIHRoZSB3YXkgdGhlIAotIyBydW50aW1lIGlzIHN0cnVjdHVyZWQgYW5kIHJ1bnMuCi0KLSMgTm90ZTogIE9ubHkgcGxhdGZvcm06L2Jhc2UvIGFuZCBmaWxlOiBVUkxzIGFyZSBzdXBwb3J0ZWQuICBJbiBnZW5lcmFsIHRoZSAKLSMgVVJMcyBnaXZlbiBtYXkgaW5jbHVkZSBhIHZlcnNpb24gbnVtYmVyIChlLmcuLCAuLi4vbG9jYXRpb25fMS4yLjMpLiAgCi0jIElmIGEgdmVyc2lvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc3lzdGVtIGJpbmRzCi0jIHRvIHRoZSBsb2NhdGlvbiB3aGljaCBtYXRjaGVzIGV4YWN0bHkgb3IgdG8gdGhlIHZlcnNpb25lZCBsb2NhdGlvbiB3aXRoIHRoZQotIyBsYXRlc3QgdmVyc2lvbiBudW1iZXIuICBJZiBhIHZlcnNpb24gbnVtYmVyIGlzIGdpdmVuIHRoZW4gb25seSBleGFjdCBtYXRjaGVzCi0jIGFyZSBjb25zaWRlcmVkLgotCi0jIFRoZSBVUkwgZm9yIHRoZSBydW50aW1lIGVudHJ5IHBvaW50LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSMgcGxhdGZvcm06L2Jhc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5vc2dpIAotI29zZ2kuZnJhbWV3b3JrPXBsYXRmb3JtOi9iYXNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaQotCi0jIFRoZSBjbGFzc3BhdGggZm9yIHRoZSBmcmFtZXdvcmsgZm91bmQgYXQgdGhlIG9zZ2kuZnJhbWV3b3JrIGxvY2F0aW9uLiAgVGhpcyAKLSMgY29tbWEtc2VwYXJhdGVkIGxpc3QgY29udGFpbnMgZWl0aGVyIFVSTHMgb3Igc2ltcGxlIGVsZW1lbnQgbmFtZXMuICBTaW1wbGUKLSMgbmFtZXMgYXJlIGFzc3VtZWQgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGZyYW1ld29yaydzIGluc3RhbGwgZGlyZWN0b3J5LiAgCi0jIFR5cGljYWxseSB0aGlzIHZhbHVlIG5lZWQgbm90IGJlIHNldCBhcyBpdCBpcyBpbml0aWFsaXplZCBieSB0aGUgZnJhbWV3b3JrIGl0c2VsZi4KLSMgVmVyc2lvbiBtYXRjaCBzZWFyY2hpbmcgaXMgbm90IGRvbmUgZm9yIFVSTHMgbGlzdGVkIGhlcmUuCi0jb3NnaS5mcmFtZXdvcmtDbGFzc1BhdGggPQotCi0jIFRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgdG8gc2VhcmNoIGZvciB0aGUgc3BsYXNoIHNjcmVlbiBmaWxlIChzcGxhc2guYm1wKS4KLSMgRm9yIGVhY2ggbGlzdCBlbGVtZW50IGEgc3ViZGlyZWN0b3J5IHN0cnVjdHVyZSBiYXNlZCBvbiB0aGUgcGF0dGVybiBubC88bG9jYWxlPiBpcyBzZWFyY2hlZC4KLSMgVGhlIHN5c3RlbSBiaW5kcyB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgZmlsZS4gIFRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUuCi0jb3NnaS5zcGxhc2hQYXRoPQotCi0jIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3BsYXNoIHNjcmVlbiBmaWxlLiAgSWYgdGhpcyB2YWx1ZSBpcyBzZXQgYXQgc3lzdGVtIHN0YXJ0dXAgaXQgaXMgdXNlZCAKLSMgaW4gZmF2b3VyIG9mIHRoZSBvc2dpLnNwbGFzaFBhdGggc2VhcmNoaW5nIG91dGxpbmVkIGFib3ZlLiAgSWYgdGhlIHZhbHVlIGlzIG5vdCBzZXQgCi0jIHRoZSBzZWFyY2hpbmcgaXMgZG9uZSBhbmQgdGhpcyBrZXkgaXMgYm91bmQgdG8gdGhlIHJlc3VsdCBvZiB0aGUgc2VhcmNoLgotI29zZ2kuc3BsYXNoTG9jYXRpb24gPQotCi0jIFRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBidW5kbGVzIHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCBhbmQgb3B0aW9uYWxseSBzdGFydGVkCi0jIG9uY2UgdGhlIHN5c3RlbSBpcyB1cCBhbmQgcnVubmluZy4gIEVhY2ggZW50cnkgaWYgb2YgdGhlIGZvcm0KLSMgICAgIDxVUkwgfCBzaW1wbGUgYnVuZGxlIGxvY2F0aW9uPltAIFs8c3RhcnRsZXZlbD5dIFsiOnN0YXJ0Il1dCi0jIElmIHRoZSBzdGFydGxldmVsIGlzIG9taXR0ZWQgdGhlbiB0aGUgZnJhbWV3b3JrIHdpbGwgdXNlIHRoZSBkZWZhdWx0IHN0YXJ0IGxldmVsIGZvciB0aGUgYnVuZGxlLgotIyBJZiB0aGUgInN0YXJ0IiB0YWcgaXMgYWRkZWQgdGhlbiB0aGUgYnVuZGxlIHdpbGwgYmUgbWFya2VkIGFzIHN0YXJ0ZWQgYWZ0ZXIgYmVpbmcgaW5zdGFsbGVkLgotIyBTaW1wbGUgYnVuZGxlIGxvY2F0aW9ucyBhcmUgaW50ZXJlcHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoZSBmcmFtZXdvcmsncyBwYXJlbnQgZGlyZWN0b3J5LgotIyBUaGUgc3RhcnRsZXZlbCBpbmRpY2F0ZXMgdGhlIE9TR2kgc3RhcnQgbGV2ZWwgYXQgd2hpY2ggdGhlIGJ1bmRsZSBzaG91bGQgcnVuLgotb3NnaS5idW5kbGVzPVwKLQlvcmcuZWNsaXBzZS5jb3JlLmpvYnMsXAotCW9yZy5lY2xpcHNlLmVjZixcCi0Jb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlcixcCi0Jb3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5LFwKLQlvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LmFwcEBzdGFydCxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24sXAotCW9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4sXAotCW9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veEBzdGFydCxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvcixcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuZG93bmxvYWQsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwQHN0YXJ0LFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIub3BlcmF0aW9ucyxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5LFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvcixcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3JAc3RhcnQsXAotCW9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMsXAotCW9yZy5zYXQ0ai5jb3JlLFwKLQlvcmcuc2F0NGoucGIKLQotb3JnLmVjbGlwc2UudXBkYXRlLnJlY29uY2lsZT1mYWxzZQotCi0jIFRoZSBwcm9kdWN0IHRvIHJ1bi4gIEEgZ2l2ZW4gRWNsaXBzZSBjb25maWd1cmF0aW9uIG1heSBjb250YWluIG1hbnkgcHJvZHVjdHMuCi0jIFRoZSBwcm9kdWN0IGlkZW50aWZpZWQgd2lsbCBzdXBwbHkgdGhlIGJyYW5kaW5nICh3aW5kb3cgaWNvbnMsIHRpdGxlIGJhciB0ZXh0KSBldGMgCi0jIGFzIHdlbGwgYXMgZGVmaW5lIHRoZSBkZWZhdWx0IGFwcGxpY2F0aW9uIHRvIHJ1bi4gIAotI2VjbGlwc2UucHJvZHVjdD0KLQotIyBUaGUgYXBwbGljYXRpb24gdG8gcnVuLiAgVGhlIHZhbHVlIHNwZWNpZmllZCBoZXJlIGlzIHRoZSBpZCBvZiB0aGUgYXBwbGljYXRpb24gZXh0ZW5zaW9uCi0jIHRoZSBydW50aW1lIHdpbGwgZmluZCwgaW5zdGFudGlhdGUgYW5kIGV4ZWN1dGUgb25jZSB0aGUgc3lzdGVtIGlzIHVwLiAgTm90ZSB0aGF0IHR5cGljYWxseSAKLSMgdGhlIGlkZW50aWZpZWQgZWNsaXBzZS5wcm9kdWN0IGRlZmluZXMgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gdG8gcnVuLgotI2VjbGlwc2UuYXBwbGljYXRpb249Ci0KLSMgVGhlIGJ1aWxkIGlkZW50aWZpZXIKLWVjbGlwc2UuYnVpbGRJZD1AYnVpbGRACi0KLSMgRW5kIG9mIGZpbGUgbWFya2VyIC0gbXVzdCBiZSBoZXJlCi1lb2Y9ZW9mClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9kaXJlY3RvciBhcHAubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9kaXJlY3RvciBhcHAubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDgxYzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvZGlyZWN0b3IgYXBwLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuRXF1aW5veExhdW5jaGVyIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNvbmZpZ0xvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmUvZGlyZWN0b3IgYXBwIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfYXV0b19zdGFydCIgdmFsdWU9ImZhbHNlIi8+Ci08aW50QXR0cmlidXRlIGtleT0iZGVmYXVsdF9zdGFydF9sZXZlbCIgdmFsdWU9IjQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iaW5jbHVkZU9wdGlvbmFsIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLWNvbnNvbGUgLWNvbnNvbGVsb2cgLWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLmFwcGxpY2F0aW9uJiMxMzsmIzEwOy1tZXRhZGF0YVJlcG9zaXRvcnkgZmlsZTpkOi90bXAvY2R0L3NpdGUueG1sIC1hcnRpZmFjdFJlcG9zaXRvcnkgZmlsZTpkOi90bXAvY2R0L3NpdGUueG1sIC1pbnN0YWxsSVUgb3JnLmVjbGlwc2UuY2R0LmZlYXR1cmUuZ3JvdXAgLWRlc3RpbmF0aW9uIGQ6L3RtcC9yZW1vdGVJbnN0YWxsL2VjbGlwc2UvIC1wcm9maWxlIFNES1Byb2ZpbGUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5WTV9BUkdVTUVOVFMiIHZhbHVlPSItRGVjbGlwc2UucDIuZGF0YS5hcmVhPWQ6L3RtcC9yZW1vdGVJbnN0YWxsL2VjbGlwc2UvcDIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuYW50LmNvcmVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guYXBwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWVAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkud2luMzIueDg2KjEuMC4wLnYyMDA4MDQzMC0xNzAwQGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2lAOixvcmcuZWNsaXBzZS5jb3JlLmpvYnNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LnJlZ2lzdHJ5QGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb25AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXNAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlTmFtZWRKUkUiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJvcmcuc2F0NGouY29yZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3hAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXBAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW5AZGVmYXVsdDpkZWZhdWx0LG9yZy5zYXQ0ai5wYkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3JAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2VAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnlAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL2RpcmVjdG9yLnByb2R1Y3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL2RpcmVjdG9yLnByb2R1Y3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYTZlOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9kaXJlY3Rvci5wcm9kdWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/cGRlIHZlcnNpb249IjMuMSI/PgotCi08cHJvZHVjdCBuYW1lPSJFcXVpbm94IFByb3Zpc2lvbmluZyBEaXJlY3RvciIgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLnByb2R1Y3QiIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC5hcHBsaWNhdGlvbiIgdXNlRmVhdHVyZXM9InRydWUiPgotCi0gICA8Y29uZmlnSW5pIHVzZT0iY3VzdG9tIiBwYXRoPSIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvY29uZmlnLmluaSIvPgotCi0gICA8bGF1bmNoZXJBcmdzPgotICAgICAgPHZtQXJnc01hYz4tWHN0YXJ0T25GaXJzdFRocmVhZCAtRG9yZy5lY2xpcHNlLnN3dC5pbnRlcm5hbC5jYXJib24uc21hbGxGb250czwvdm1BcmdzTWFjPgotICAgPC9sYXVuY2hlckFyZ3M+Ci0KLSAgIDxsYXVuY2hlciBuYW1lPSJlY2xpcHNlIj4KLSAgICAgIDxzb2xhcmlzLz4KLSAgICAgIDx3aW4gdXNlSWNvPSJmYWxzZSI+Ci0gICAgICAgICA8Ym1wLz4KLSAgICAgIDwvd2luPgotICAgPC9sYXVuY2hlcj4KLQotICAgPHZtPgotICAgPC92bT4KLQotICAgPHBsdWdpbnM+Ci0gICA8L3BsdWdpbnM+Ci0KLSAgIDxmZWF0dXJlcz4KLSAgICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmZlYXR1cmUiIHZlcnNpb249IjAuMC4wIi8+Ci0gICAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucmNwIiB2ZXJzaW9uPSIwLjAuMCIvPgotICAgPC9mZWF0dXJlcz4KLQotPC9wcm9kdWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OTNhZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBQcm92aXNpb25pbmcgRGlyZWN0b3IgQXBwbGljYXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NjBjMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0JPGV4dGVuc2lvbiBpZD0iYXBwbGljYXRpb24iIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4gCi0gICAgICA8YXBwbGljYXRpb24+IAotICAgICAgICAgPHJ1biBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3Rvci5hcHAuQXBwbGljYXRpb24iLz4gCi0gICAgICA8L2FwcGxpY2F0aW9uPiAKLSAgIDwvZXh0ZW5zaW9uPgotIDxleHRlbnNpb24KLSAgICAgICBpZD0icHJvZHVjdCIKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByb2R1Y3RzIj4KLSAgICA8cHJvZHVjdAotICAgICAgICAgIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC5hcHBsaWNhdGlvbiIKLSAgICAgICAgICBuYW1lPSJFcXVpbm94IFByb3Zpc2lvbmluZyBEaXJlY3RvciI+Ci0gICAgPC9wcm9kdWN0PgotIDwvZXh0ZW5zaW9uPiAKLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmFudFRhc2tzIj4KLQkJPGFudFRhc2sKLQkJCWxpYnJhcnk9ImFudF90YXNrcy9kaXJlY3Rvci1hbnQuamFyIgotCQkJbmFtZT0icDIuZGlyZWN0b3IiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAuYW50LkRpcmVjdG9yVGFzayI+Ci0JCTwvYW50VGFzaz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlLmV4dHJhQ2xhc3NwYXRoRW50cmllcyI+Ci0JCTxleHRyYUNsYXNzcGF0aEVudHJ5IGxpYnJhcnk9ImFudF90YXNrcy9kaXJlY3Rvci1hbnQuamFyIi8+Ci0JPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9zY3JpcHRzL2J1aWxkRXh0cmFKQVIueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9zY3JpcHRzL2J1aWxkRXh0cmFKQVIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGRmMWQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvc2NyaXB0cy9idWlsZEV4dHJhSkFSLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyIgZGVmYXVsdD0ibWFpbiIgYmFzZWRpcj0iLi4iPgotCi0JPHRhcmdldCBuYW1lPSJtYWluIiBkZXBlbmRzPSJjbGVhbiwgYW50X3Rhc2tzL2RpcmVjdG9yLWFudC5qYXIiPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJwcm9wZXJ0aWVzIj4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZW1wLmZvbGRlciIgdmFsdWU9IiR7YmFzZWRpcn0vdGVtcC5mb2xkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbi5kZXN0aW5hdGlvbiIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJ1aWxkLnJlc3VsdC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L2FudF90YXNrcyIvPgotCQk8cHJvcGVydHkgbmFtZT0idmVyc2lvbi5zdWZmaXgiIHZhbHVlPSJfMy4xLjAiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icHJvcGVydGllcyIgaWY9ImVjbGlwc2UucnVubmluZyI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5jb21waWxlciIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLkpEVENvbXBpbGVyQWRhcHRlciIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJhbnRfdGFza3MvZGlyZWN0b3ItYW50LmphciIgZGVwZW5kcz0iaW5pdCIgdW5sZXNzPSJhbnRfdGFza3MvZGlyZWN0b3ItYW50LmphciI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iJHt0ZW1wLmZvbGRlcn0vYW50X3Rhc2tzL2RpcmVjdG9yLWFudC5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZGlyZWN0b3ItYW50Lmphci5iaW4iLz4KLQkJPG1rZGlyIGRpcj0iJHt0ZW1wLmZvbGRlcn0vYW50X3Rhc2tzL2RpcmVjdG9yLWFudC5qYXIuYmluIi8+Ci0JCTwhLS0gY29tcGlsZSB0aGUgc291cmNlIGNvZGUgLS0+Ci0JCTxqYXZhYyBkZXN0ZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZGlyZWN0b3ItYW50Lmphci5iaW4iIGZhaWxvbmVycm9yPSJ0cnVlIiB2ZXJib3NlPSJ0cnVlIiBkZWJ1Zz0ib24iPgotCQkJPGNsYXNzcGF0aD4KLQkJCQk8ZGlyc2V0IGRpcj0iJHtiYXNlZGlyfS8uLiI+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL2JpbiIvPgotCQkJCQk8aW5jbHVkZSBuYW1lPSJvcmcuZWNsaXBzZS5vc2dpL2JpbiIvPgotCQkJCTwvZGlyc2V0PgotCQkJCTxmaWxlc2V0IGRpcj0iJHtlY2xpcHNlLmhvbWV9Ij4KLQkJCQkJPGluY2x1ZGUgbmFtZT0icGx1Z2lucy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcCouamFyIi8+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9InBsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaSouamFyIi8+Ci0JCQkJPC9maWxlc2V0PgotCQkJPC9jbGFzc3BhdGg+Ci0JCQk8c3JjIHBhdGg9InNyY19hbnQvIi8+Ci0JCTwvamF2YWM+Ci0JCTwhLS0gY29weSBuZWNlc3NhcnkgcmVzb3VyY2VzIC0tPgotCQk8Y29weSB0b2Rpcj0iJHt0ZW1wLmZvbGRlcn0vYW50X3Rhc2tzL2RpcmVjdG9yLWFudC5qYXIuYmluIj4KLQkJCTxmaWxlc2V0IGRpcj0ic3JjX2FudC8iIGV4Y2x1ZGVzPSIqKi8qLmphdmEiLz4KLQkJPC9jb3B5PgotCQk8bWtkaXIgZGlyPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9Ii8+Ci0JCTxqYXIgamFyZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9kaXJlY3Rvci1hbnQuamFyIiBiYXNlZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZGlyZWN0b3ItYW50Lmphci5iaW4iLz4KLQkJPGRlbGV0ZSBkaXI9IiR7dGVtcC5mb2xkZXJ9L2FudF90YXNrcy9kaXJlY3Rvci1hbnQuamFyLmJpbiIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiPgotCQk8ZGVsZXRlIGZpbGU9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0vZGlyZWN0b3ItYW50LmphciIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL2FwcC9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvYXBwL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTA0MDNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvYXBwL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuYXBwOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0OwotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBidW5kbGVDb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1bmRsZUNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVuZGxlQ29udGV4dCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9hcHAvQXBwbGljYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvYXBwL0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NDgxMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9hcHAvQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQ2xvdWRzbWl0aCAtIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjY0MDEKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLmFwcDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb25zb2xlLlByb3Zpc2lvbmluZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb24gaW1wbGVtZW50cyBJQXBwbGljYXRpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIEludGVnZXIgRVhJVF9FUlJPUiA9IG5ldyBJbnRlZ2VyKDEzKTsKLQlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgRkxBVk9SX0RFRkFVTFQgPSAidG9vbGluZyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgRVhFTVBMQVJZX1NFVFVQID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NQU5EX0lOU1RBTEwgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1BTkRfVU5JTlNUQUxMID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NQU5EX0xJU1QgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT01NQU5EX05BTUVTID0geyItaW5zdGFsbElVIiwgIi11bmluc3RhbGxJVSIsICItbGlzdCJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JLy8JcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIGRpcmVjdG9yUmVnaXN0cmF0aW9uOwotCS8vCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiBwbGFubmVyUmVnaXN0cmF0aW9uOwotCS8vCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiBlbmdpbmVSZWdpc3RyYXRpb247Ci0JLy8JcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIGJ1c1JlZ2lzdHJhdGlvbjsKLQkvLwlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gbWV0YWRhdGFNYW5hZ2VyUmVnaXN0cmF0aW9uOwotCS8vCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiBhcnRpZmFjdE1hbmFnZXJSZWdpc3RyYXRpb247Ci0JLy8JcHJpdmF0ZSBJUHJvdmlzaW9uaW5nRXZlbnRCdXMgYnVzOwotCi0JcHJpdmF0ZSBQYXRoIGRlc3RpbmF0aW9uOwotCi0JcHJpdmF0ZSBVUkwgYXJ0aWZhY3RSZXBvc2l0b3J5TG9jYXRpb247Ci0KLQlwcml2YXRlIFVSTCBtZXRhZGF0YVJlcG9zaXRvcnlMb2NhdGlvbjsKLQotCXByaXZhdGUgU3RyaW5nIHJvb3Q7Ci0JcHJpdmF0ZSBWZXJzaW9uIHZlcnNpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZsYXZvcjsKLQlwcml2YXRlIFN0cmluZyBwcm9maWxlSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvZmlsZVByb3BlcnRpZXM7IC8vIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcHJvcGVydHkgcGFpcnMgInRhZz12YWx1ZSIKLQlwcml2YXRlIFN0cmluZyBidW5kbGVQb29sID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBubDsKLQlwcml2YXRlIFN0cmluZyBvczsKLQlwcml2YXRlIFN0cmluZyBhcmNoOwotCXByaXZhdGUgU3RyaW5nIHdzOwotCXByaXZhdGUgYm9vbGVhbiByb2FtaW5nUHJvZmlsZSA9IGZhbHNlOwotCXByaXZhdGUgSVBsYW5uZXIgcGxhbm5lcjsKLQlwcml2YXRlIElFbmdpbmUgZW5naW5lOwotCi0JcHJpdmF0ZSBpbnQgY29tbWFuZCA9IC0xOwotCi0JcHJpdmF0ZSBTZXJ2aWNlUmVmZXJlbmNlIHBhY2thZ2VBZG1pblJlZjsKLQlwcml2YXRlIFBhY2thZ2VBZG1pbiBwYWNrYWdlQWRtaW47Ci0JcHJpdmF0ZSBib29sZWFuIG5lZWRzVG9VcGRhdGVSb2FtaW5nVmFsdWVzID0gZmFsc2U7Ci0KLQlwcml2YXRlIHZvaWQgYW1iaWdvdXNDb21tYW5kKGludCBjbWQxLCBpbnQgY21kMikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuQW1iaWdvdXNfQ29tbWFuZCwgbmV3IE9iamVjdFtdIHtDT01NQU5EX05BTUVTW2NtZDFdLCBDT01NQU5EX05BTUVTW2NtZDJdfSkpKTsKLQl9Ci0KLQlwcml2YXRlIFByb2ZpbGVDaGFuZ2VSZXF1ZXN0IGJ1aWxkUHJvdmlzaW9uaW5nUmVxdWVzdChJUHJvZmlsZSBwcm9maWxlLCBDb2xsZWN0b3Igcm9vdHMsIGJvb2xlYW4gaW5zdGFsbCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQltYXJrUm9vdHMocmVxdWVzdCwgcm9vdHMpOwotCQlpZiAoaW5zdGFsbCkgewotCQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKChJSW5zdGFsbGFibGVVbml0W10pIHJvb3RzLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcykpOwotCQl9IGVsc2UgewotCQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKChJSW5zdGFsbGFibGVVbml0W10pIHJvb3RzLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcykpOwotCQl9Ci0JCXJldHVybiByZXF1ZXN0OwotCX0KLQotCXN5bmNocm9uaXplZCBCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJaWYgKHBhY2thZ2VBZG1pbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQnVuZGxlW10gYnVuZGxlcyA9IHBhY2thZ2VBZG1pbi5nZXRCdW5kbGVzKHN5bWJvbGljTmFtZSwgbnVsbCk7Ci0JCWlmIChidW5kbGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy9SZXR1cm4gdGhlIGZpcnN0IGJ1bmRsZSB0aGF0IGlzIG5vdCBpbnN0YWxsZWQgb3IgdW5pbnN0YWxsZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoKGJ1bmRsZXNbaV0uZ2V0U3RhdGUoKSAmIChCdW5kbGUuSU5TVEFMTEVEIHwgQnVuZGxlLlVOSU5TVEFMTEVEKSkgPT0gMCkgewotCQkJCXJldHVybiBidW5kbGVzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEVudmlyb25tZW50UHJvcGVydHkoKSB7Ci0JCVByb3BlcnRpZXMgdmFsdWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJaWYgKG9zICE9IG51bGwpCi0JCQl2YWx1ZXMucHV0KCJvc2dpLm9zIiwgb3MpOyAvLyROT04tTkxTLTEkCi0JCWlmIChubCAhPSBudWxsKQotCQkJdmFsdWVzLnB1dCgib3NnaS5ubCIsIG5sKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAod3MgIT0gbnVsbCkKLQkJCXZhbHVlcy5wdXQoIm9zZ2kud3MiLCB3cyk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGFyY2ggIT0gbnVsbCkKLQkJCXZhbHVlcy5wdXQoIm9zZ2kuYXJjaCIsIGFyY2gpOyAvLyROT04tTkxTLTEkCi0JCWlmICh2YWx1ZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0b1N0cmluZyh2YWx1ZXMpOwotCX0KLQotCXByaXZhdGUgSVByb2ZpbGUgaW5pdGlhbGl6ZVByb2ZpbGUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9maWxlSWQgPT0gbnVsbCkKLQkJCXByb2ZpbGVJZCA9IElQcm9maWxlUmVnaXN0cnkuU0VMRjsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IFByb3Zpc2lvbmluZ0hlbHBlci5nZXRQcm9maWxlKHByb2ZpbGVJZCk7Ci0JCWlmIChwcm9maWxlICE9IG51bGwgJiYgKFByb3Zpc2lvbmluZ0hlbHBlci5nZXRQcm9maWxlKElQcm9maWxlUmVnaXN0cnkuU0VMRikgIT0gbnVsbCAmJiAhcHJvZmlsZS5nZXRQcm9maWxlSWQoKS5lcXVhbHMoUHJvdmlzaW9uaW5nSGVscGVyLmdldFByb2ZpbGUoSVByb2ZpbGVSZWdpc3RyeS5TRUxGKS5nZXRQcm9maWxlSWQoKSkpKQotCQkJbmVlZHNUb1VwZGF0ZVJvYW1pbmdWYWx1ZXMgPSB0cnVlOwotCQlpZiAocHJvZmlsZSA9PSBudWxsKSB7Ci0JCQlpZiAoZGVzdGluYXRpb24gPT0gbnVsbCkKLQkJCQltaXNzaW5nQXJndW1lbnQoImRlc3RpbmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChmbGF2b3IgPT0gbnVsbCkKLQkJCQlmbGF2b3IgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImVjbGlwc2UucDIuY29uZmlndXJhdGlvbkZsYXZvciIsIEZMQVZPUl9ERUZBVUxUKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXByb3BzLnNldFByb3BlcnR5KElQcm9maWxlLlBST1BfSU5TVEFMTF9GT0xERVIsIGRlc3RpbmF0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCQlwcm9wcy5zZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0ZMQVZPUiwgZmxhdm9yKTsKLQkJCWlmIChidW5kbGVQb29sICE9IG51bGwpCi0JCQkJaWYgKGJ1bmRsZVBvb2wuZXF1YWxzKE1lc3NhZ2VzLmRlc3RpbmF0aW9uX2NvbW1hbmRsaW5lKSkKLQkJCQkJcHJvcHMuc2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9DQUNIRSwgZGVzdGluYXRpb24udG9PU1N0cmluZygpKTsKLQkJCQllbHNlCi0JCQkJCXByb3BzLnNldFByb3BlcnR5KElQcm9maWxlLlBST1BfQ0FDSEUsIGJ1bmRsZVBvb2wpOwotCQkJaWYgKHJvYW1pbmdQcm9maWxlKQotCQkJCXByb3BzLnNldFByb3BlcnR5KElQcm9maWxlLlBST1BfUk9BTUlORywgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCi0JCQlTdHJpbmcgZW52ID0gZ2V0RW52aXJvbm1lbnRQcm9wZXJ0eSgpOwotCQkJaWYgKGVudiAhPSBudWxsKQotCQkJCXByb3BzLnNldFByb3BlcnR5KElQcm9maWxlLlBST1BfRU5WSVJPTk1FTlRTLCBlbnYpOwotCQkJaWYgKHByb2ZpbGVQcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCQlwdXRQcm9wZXJ0aWVzKHByb2ZpbGVQcm9wZXJ0aWVzLCBwcm9wcyk7Ci0JCQl9Ci0JCQlwcm9maWxlID0gUHJvdmlzaW9uaW5nSGVscGVyLmFkZFByb2ZpbGUocHJvZmlsZUlkLCBwcm9wcyk7Ci0JCQlTdHJpbmcgY3VycmVudEZsYXZvciA9IHByb2ZpbGUuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9GTEFWT1IpOwotCQkJaWYgKGN1cnJlbnRGbGF2b3IgIT0gbnVsbCAmJiAhY3VycmVudEZsYXZvci5lbmRzV2l0aChmbGF2b3IpKQotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKE1lc3NhZ2VzLkluY29uc2lzdGVudF9mbGF2b3IpOwotCQl9Ci0JCXJldHVybiBwcm9maWxlOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUmVwb3NpdG9yaWVzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoYXJ0aWZhY3RSZXBvc2l0b3J5TG9jYXRpb24gPT0gbnVsbCkKLQkJCW1pc3NpbmdBcmd1bWVudCgiYXJ0aWZhY3RSZXBvc2l0b3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG1ldGFkYXRhUmVwb3NpdG9yeUxvY2F0aW9uID09IG51bGwpCi0JCQltaXNzaW5nQXJndW1lbnQoIm1ldGFkYXRhUmVwb3NpdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCVByb3Zpc2lvbmluZ0hlbHBlci5hZGRBcnRpZmFjdFJlcG9zaXRvcnkoYXJ0aWZhY3RSZXBvc2l0b3J5TG9jYXRpb24pOwotCQlQcm92aXNpb25pbmdIZWxwZXIuYWRkTWV0YWRhdGFSZXBvc2l0b3J5KG1ldGFkYXRhUmVwb3NpdG9yeUxvY2F0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNlcnZpY2VzKCkgewotCQlJRGlyZWN0b3IgZGlyZWN0b3IgPSAoSURpcmVjdG9yKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSURpcmVjdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChkaXJlY3RvciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTWVzc2FnZXMuTWlzc2luZ19kaXJlY3Rvcik7Ci0KLQkJcGxhbm5lciA9IChJUGxhbm5lcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQbGFubmVyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwbGFubmVyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihNZXNzYWdlcy5NaXNzaW5nX3BsYW5uZXIpOwotCi0JCWVuZ2luZSA9IChJRW5naW5lKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSUVuZ2luZS5TRVJWSUNFX05BTUUpOwotCQlpZiAoZW5naW5lID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihNZXNzYWdlcy5NaXNzaW5nX0VuZ2luZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1hcmtSb290cyhQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0LCBDb2xsZWN0b3Igcm9vdHMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJvb3RzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCXJlcXVlc3Quc2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCksIElJbnN0YWxsYWJsZVVuaXQuUFJPUF9QUk9GSUxFX1JPT1RfSVUsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBtaXNzaW5nQXJndW1lbnQoU3RyaW5nIGFyZ3VtZW50TmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuTWlzc2luZ19SZXF1aXJlZF9Bcmd1bWVudCwgYXJndW1lbnROYW1lKSkpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBwbGFuQW5kRXhlY3V0ZShJUHJvZmlsZSBwcm9maWxlLCBQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQsIFByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJUHJvdmlzaW9uaW5nUGxhbiByZXN1bHQ7Ci0JCUlTdGF0dXMgb3BlcmF0aW9uU3RhdHVzOwotCQlyZXN1bHQgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxdWVzdCwgY29udGV4dCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWlmICghcmVzdWx0LmdldFN0YXR1cygpLmlzT0soKSkKLQkJCW9wZXJhdGlvblN0YXR1cyA9IHJlc3VsdC5nZXRTdGF0dXMoKTsKLQkJZWxzZSB7Ci0JCQlvcGVyYXRpb25TdGF0dXMgPSBlbmdpbmUucGVyZm9ybShwcm9maWxlLCBuZXcgRGVmYXVsdFBoYXNlU2V0KCksIHJlc3VsdC5nZXRPcGVyYW5kcygpLCBjb250ZXh0LCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfQotCQlyZXR1cm4gb3BlcmF0aW9uU3RhdHVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmludFJlcXVlc3QoUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCkgewotCQlJSW5zdGFsbGFibGVVbml0W10gdG9BZGQgPSByZXF1ZXN0LmdldEFkZGVkSW5zdGFsbGFibGVVbml0cygpOwotCQlJSW5zdGFsbGFibGVVbml0W10gdG9SZW1vdmUgPSByZXF1ZXN0LmdldFJlbW92ZWRJbnN0YWxsYWJsZVVuaXRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9BZGQubGVuZ3RoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5JbnN0YWxsaW5nLCB0b0FkZFtpXS5nZXRJZCgpLCB0b0FkZFtpXS5nZXRWZXJzaW9uKCkpKTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvUmVtb3ZlLmxlbmd0aDsgaSsrKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMuVW5pbnN0YWxsaW5nLCB0b1JlbW92ZVtpXS5nZXRJZCgpLCB0b1JlbW92ZVtpXS5nZXRWZXJzaW9uKCkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHByb2Nlc3NBcmd1bWVudHMoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhcmdzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCi0JCQlTdHJpbmcgb3B0ID0gYXJnc1tpXTsKLQkJCWlmIChvcHQuZXF1YWxzKCItcm9hbWluZyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyb2FtaW5nUHJvZmlsZSA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChvcHQuZXF1YWxzKENPTU1BTkRfTkFNRVNbQ09NTUFORF9MSVNUXSkpIHsKLQkJCQlpZiAoY29tbWFuZCAhPSAtMSkKLQkJCQkJYW1iaWdvdXNDb21tYW5kKENPTU1BTkRfTElTVCwgY29tbWFuZCk7Ci0JCQkJY29tbWFuZCA9IENPTU1BTkRfTElTVDsKLQkJCX0KLQotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aG91dCBwYXJhbWV0ZXJzIChpLmUuLCBhIGZsYWcgYXJnKQotCi0JCQkvLyBjaGVjayBmb3IgYXJncyB3aXRoIHBhcmFtZXRlcnMuIElmIHdlIGFyZSBhdCB0aGUgbGFzdAotCQkJLy8gYXJndW1lbnQgb3IKLQkJCS8vIGlmIHRoZSBuZXh0IG9uZQotCQkJLy8gaGFzIGEgJy0nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIsIHRoZW4gd2UgY2FuJ3QgaGF2ZSBhbiBhcmcKLQkJCS8vIHdpdGgKLQkJCS8vIGEgcGFybSBzbyBjb250aW51ZS4KLQkJCWlmIChpID09IGFyZ3MubGVuZ3RoIC0gMSB8fCBhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbKytpXTsKLQotCQkJaWYgKG9wdC5lcXVhbHNJZ25vcmVDYXNlKCItcHJvZmlsZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJcHJvZmlsZUlkID0gYXJnOwotCi0JCQlpZiAob3B0LmVxdWFsc0lnbm9yZUNhc2UoIi1wcm9maWxlUHJvcGVydGllcyIpIHx8IG9wdC5lcXVhbHNJZ25vcmVDYXNlKCItcHJvcHMiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcHJvZmlsZVByb3BlcnRpZXMgPSBhcmc7Ci0KLQkJCS8vIHdlIGNyZWF0ZSBhIHBhdGggb2JqZWN0IGhlcmUgdG8gaGFuZGxlIC4uLyBlbnRyaWVzIGluIHRoZSBtaWRkbGUgb2YgcGF0aHMKLQkJCWlmIChvcHQuZXF1YWxzSWdub3JlQ2FzZSgiLWRlc3RpbmF0aW9uIikgfHwgb3B0LmVxdWFsc0lnbm9yZUNhc2UoIi1kZXN0IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWRlc3RpbmF0aW9uID0gbmV3IFBhdGgoYXJnKTsKLQotCQkJLy8gd2UgY3JlYXRlIGEgcGF0aCBvYmplY3QgaGVyZSB0byBoYW5kbGUgLi4vIGVudHJpZXMgaW4gdGhlIG1pZGRsZSBvZiBwYXRocwotCQkJaWYgKG9wdC5lcXVhbHNJZ25vcmVDYXNlKCItYnVuZGxlcG9vbCIpIHx8IG9wdC5lcXVhbHNJZ25vcmVDYXNlKCItYnAiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYnVuZGxlUG9vbCA9IG5ldyBQYXRoKGFyZykudG9PU1N0cmluZygpOwotCi0JCQlpZiAob3B0LmVxdWFsc0lnbm9yZUNhc2UoIi1tZXRhZGF0YVJlcG9zaXRvcnkiKSB8fCBvcHQuZXF1YWxzSWdub3JlQ2FzZSgiLW1yIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW1ldGFkYXRhUmVwb3NpdG9yeUxvY2F0aW9uID0gbmV3IFVSTChhcmcpOwotCi0JCQlpZiAob3B0LmVxdWFsc0lnbm9yZUNhc2UoIi1hcnRpZmFjdFJlcG9zaXRvcnkiKSB8fCBvcHQuZXF1YWxzSWdub3JlQ2FzZSgiLWFyIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWFydGlmYWN0UmVwb3NpdG9yeUxvY2F0aW9uID0gbmV3IFVSTChhcmcpOwotCi0JCQlpZiAob3B0LmVxdWFsc0lnbm9yZUNhc2UoIi1mbGF2b3IiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWZsYXZvciA9IGFyZzsKLQotCQkJaWYgKG9wdC5lcXVhbHNJZ25vcmVDYXNlKENPTU1BTkRfTkFNRVNbQ09NTUFORF9JTlNUQUxMXSkpIHsKLQkJCQlpZiAoY29tbWFuZCAhPSAtMSkKLQkJCQkJYW1iaWdvdXNDb21tYW5kKENPTU1BTkRfSU5TVEFMTCwgY29tbWFuZCk7Ci0JCQkJcm9vdCA9IGFyZzsKLQkJCQljb21tYW5kID0gQ09NTUFORF9JTlNUQUxMOwotCQkJfQotCi0JCQlpZiAob3B0LmVxdWFsc0lnbm9yZUNhc2UoIi12ZXJzaW9uIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZlcnNpb24gPSBuZXcgVmVyc2lvbihhcmcpOwotCQkJfQotCi0JCQlpZiAob3B0LmVxdWFsc0lnbm9yZUNhc2UoQ09NTUFORF9OQU1FU1tDT01NQU5EX1VOSU5TVEFMTF0pKSB7Ci0JCQkJaWYgKGNvbW1hbmQgIT0gLTEpCi0JCQkJCWFtYmlnb3VzQ29tbWFuZChDT01NQU5EX1VOSU5TVEFMTCwgY29tbWFuZCk7Ci0JCQkJcm9vdCA9IGFyZzsKLQkJCQljb21tYW5kID0gQ09NTUFORF9VTklOU1RBTEw7Ci0JCQl9Ci0KLQkJCWlmIChvcHQuZXF1YWxzSWdub3JlQ2FzZSgiLXAyLm9zIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW9zID0gYXJnOwotCQkJfQotCQkJaWYgKG9wdC5lcXVhbHNJZ25vcmVDYXNlKCItcDIud3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJd3MgPSBhcmc7Ci0JCQl9Ci0JCQlpZiAob3B0LmVxdWFsc0lnbm9yZUNhc2UoIi1wMi5ubCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlubCA9IGFyZzsKLQkJCX0KLQkJCWlmIChvcHQuZXF1YWxzSWdub3JlQ2FzZSgiLXAyLmFyY2giKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJYXJjaCA9IGFyZzsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhaXJzCWEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGFnPXZhbHVlIHBhaXJzCi0JICogQHBhcmFtIHByb3BlcnRpZXMgdGhlIGNvbGxlY3Rpb24gaW50byB3aGljaCB0aGUgcGFpcnMgYXJlIHB1dAotCSAqLwotCXByaXZhdGUgdm9pZCBwdXRQcm9wZXJ0aWVzKFN0cmluZyBwYWlycywgUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2sgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhaXJzLCAiLCIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2suaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgbmV4dCA9IHRvay5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlpbnQgaSA9IG5leHQuaW5kZXhPZignPScpOwotCQkJaWYgKGkgPiAwICYmIGkgPCBuZXh0Lmxlbmd0aCgpIC0gMSkgewotCQkJCVN0cmluZyB0YWcgPSBuZXh0LnN1YnN0cmluZygwLCBpKS50cmltKCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gbmV4dC5zdWJzdHJpbmcoaSArIDEsIG5leHQubGVuZ3RoKCkpLnRyaW0oKTsKLQkJCQlpZiAodGFnLmxlbmd0aCgpID4gMCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJcHJvcGVydGllcy5wdXQodGFnLCB2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBydW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWxvbmcgdGltZSA9IC1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJaW5pdGlhbGl6ZVNlcnZpY2VzKCk7Ci0JCXByb2Nlc3NBcmd1bWVudHMoYXJncyk7Ci0KLQkJSVN0YXR1cyBvcGVyYXRpb25TdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlJbnN0YWxsYWJsZVVuaXRRdWVyeSBxdWVyeTsKLQkJQ29sbGVjdG9yIHJvb3RzOwotCQlzd2l0Y2ggKGNvbW1hbmQpIHsKLQkJCWNhc2UgQ09NTUFORF9JTlNUQUxMIDoKLQkJCWNhc2UgQ09NTUFORF9VTklOU1RBTEwgOgotCQkJCUlQcm9maWxlIHByb2ZpbGUgPSBpbml0aWFsaXplUHJvZmlsZSgpOwotCQkJCWluaXRpYWxpemVSZXBvc2l0b3JpZXMoKTsKLQotCQkJCXF1ZXJ5ID0gbmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KHJvb3QsIHZlcnNpb24gPT0gbnVsbCA/IFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlIDogbmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCB2ZXJzaW9uLCB0cnVlKSk7Ci0JCQkJcm9vdHMgPSBQcm92aXNpb25pbmdIZWxwZXIuZ2V0SW5zdGFsbGFibGVVbml0cyhudWxsLCBxdWVyeSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJaWYgKHJvb3RzLnNpemUoKSA8PSAwKQotCQkJCQlyb290cyA9IHByb2ZpbGUucXVlcnkocXVlcnksIHJvb3RzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQlpZiAocm9vdHMuc2l6ZSgpIDw9IDApIHsKLQkJCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuTWlzc2luZ19JVSwgcm9vdCkpKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLk1pc3NpbmdfSVUsIHJvb3QpKTsKLQkJCQkJcmV0dXJuIEVYSVRfRVJST1I7Ci0JCQkJfQotCQkJCWlmICghdXBkYXRlUm9hbWluZ1Byb3BlcnRpZXMocHJvZmlsZSkuaXNPSygpKSB7Ci0JCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLkNhbnRfY2hhbmdlX3JvYW1pbmcsIHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpKSk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5DYW50X2NoYW5nZV9yb2FtaW5nLCBwcm9maWxlLmdldFByb2ZpbGVJZCgpKSk7Ci0JCQkJCXJldHVybiBFWElUX0VSUk9SOwotCQkJCX0KLQkJCQlQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQgPSBuZXcgUHJvdmlzaW9uaW5nQ29udGV4dCgpOwotCQkJCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBidWlsZFByb3Zpc2lvbmluZ1JlcXVlc3QocHJvZmlsZSwgcm9vdHMsIGNvbW1hbmQgPT0gQ09NTUFORF9JTlNUQUxMKTsKLQkJCQlwcmludFJlcXVlc3QocmVxdWVzdCk7Ci0JCQkJb3BlcmF0aW9uU3RhdHVzID0gcGxhbkFuZEV4ZWN1dGUocHJvZmlsZSwgY29udGV4dCwgcmVxdWVzdCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIENPTU1BTkRfTElTVCA6Ci0JCQkJcXVlcnkgPSBuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkobnVsbCwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UpOwotCQkJCWlmIChtZXRhZGF0YVJlcG9zaXRvcnlMb2NhdGlvbiA9PSBudWxsKQotCQkJCQltaXNzaW5nQXJndW1lbnQoIm1ldGFkYXRhUmVwb3NpdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCQkJcm9vdHMgPSBQcm92aXNpb25pbmdIZWxwZXIuZ2V0SW5zdGFsbGFibGVVbml0cyhtZXRhZGF0YVJlcG9zaXRvcnlMb2NhdGlvbiwgcXVlcnksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCQkJSXRlcmF0b3IgdW5pdEl0ZXJhdG9yID0gcm9vdHMuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAodW5pdEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHVuaXRJdGVyYXRvci5uZXh0KCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihpdS5nZXRJZCgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQl0aW1lICs9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlpZiAob3BlcmF0aW9uU3RhdHVzLmlzT0soKSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihOTFMuYmluZChNZXNzYWdlcy5PcGVyYXRpb25fY29tcGxldGUsIG5ldyBMb25nKHRpbWUpKSk7Ci0JCWVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKE1lc3NhZ2VzLk9wZXJhdGlvbl9mYWlsZWQpOwotCQkJTG9nSGVscGVyLmxvZyhvcGVyYXRpb25TdGF0dXMpOwotCQkJcmV0dXJuIEVYSVRfRVJST1I7Ci0JCX0KLQkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX09LOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgc2V0UGFja2FnZUFkbWluKFBhY2thZ2VBZG1pbiBzZXJ2aWNlKSB7Ci0JCXBhY2thZ2VBZG1pbiA9IHNlcnZpY2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN0YXJ0RWFybHkoU3RyaW5nIGJ1bmRsZU5hbWUpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOwotCQlpZiAoYnVuZGxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWJ1bmRsZS5zdGFydChCdW5kbGUuU1RBUlRfVFJBTlNJRU5UKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIE9iamVjdCBzdGFydChJQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwYWNrYWdlQWRtaW5SZWYgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2VSZWZlcmVuY2UoUGFja2FnZUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXNldFBhY2thZ2VBZG1pbigoUGFja2FnZUFkbWluKSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UocGFja2FnZUFkbWluUmVmKSk7Ci0JCWlmICghc3RhcnRFYXJseShFWEVNUExBUllfU0VUVVApKSB7Ci0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5NaXNzaW5nX2J1bmRsZSwgRVhFTVBMQVJZX1NFVFVQKSkpOwotCQkJcmV0dXJuIEVYSVRfRVJST1I7Ci0JCX0KLQkJcmV0dXJuIHJ1bigoU3RyaW5nW10pIGNvbnRleHQuZ2V0QXJndW1lbnRzKCkuZ2V0KCJhcHBsaWNhdGlvbi5hcmdzIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJc2V0UGFja2FnZUFkbWluKG51bGwpOwotCQlBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnVuZ2V0U2VydmljZShwYWNrYWdlQWRtaW5SZWYpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIHRvU3RyaW5nKFByb3BlcnRpZXMgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEVudW1lcmF0aW9uIGl0ZXIgPSBjb250ZXh0LmtleXMoKTsgaXRlci5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHRFbGVtZW50KCk7Ci0JCQlyZXN1bHQuYXBwZW5kKGtleSk7Ci0JCQlyZXN1bHQuYXBwZW5kKCc9Jyk7Ci0JCQlyZXN1bHQuYXBwZW5kKGNvbnRleHQuZ2V0KGtleSkpOwotCQkJaWYgKGl0ZXIuaGFzTW9yZUVsZW1lbnRzKCkpCi0JCQkJcmVzdWx0LmFwcGVuZCgnLCcpOwotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdXBkYXRlUm9hbWluZ1Byb3BlcnRpZXMoSVByb2ZpbGUgcHJvZmlsZSkgewotCQlpZiAoIW5lZWRzVG9VcGRhdGVSb2FtaW5nVmFsdWVzKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCWlmICghQm9vbGVhbi52YWx1ZU9mKHByb2ZpbGUuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9ST0FNSU5HKSkuYm9vbGVhblZhbHVlKCkpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJaWYgKCFkZXN0aW5hdGlvbi5lcXVhbHMobmV3IEZpbGUocHJvZmlsZS5nZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0lOU1RBTExfRk9MREVSKSkpKSB7Ci0JCQlyZXF1ZXN0LnNldFByb2ZpbGVQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0lOU1RBTExfRk9MREVSLCBkZXN0aW5hdGlvbi50b09TU3RyaW5nKCkpOwotCQl9Ci0JCWlmICghZGVzdGluYXRpb24uZXF1YWxzKG5ldyBGaWxlKHByb2ZpbGUuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9DQUNIRSkpKSkgewotCQkJcmVxdWVzdC5zZXRQcm9maWxlUHJvcGVydHkoSVByb2ZpbGUuUFJPUF9DQUNIRSwgZGVzdGluYXRpb24udG9PU1N0cmluZygpKTsKLQkJfQotCQlpZiAocmVxdWVzdC5nZXRQcm9maWxlUHJvcGVydGllcygpLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkJUHJvdmlzaW9uaW5nUGxhbiByZXN1bHQgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxdWVzdCwgbmV3IFByb3Zpc2lvbmluZ0NvbnRleHQoKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWlmICghcmVzdWx0LmdldFN0YXR1cygpLmlzT0soKSkKLQkJCXJldHVybiByZXN1bHQuZ2V0U3RhdHVzKCk7Ci0KLQkJcmV0dXJuIGVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcmVzdWx0LmdldE9wZXJhbmRzKCksIG5ldyBQcm92aXNpb25pbmdDb250ZXh0KCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvYXBwL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL2FwcC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDI0NWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvYXBwL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogCUlCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCUNsb3Vkc21pdGggLSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI2NDAxCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLmFwcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuYXBwLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc3RpbmF0aW9uX2NvbW1hbmRsaW5lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluY29uc2lzdGVudF9mbGF2b3I7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVyYXRpb25fY29tcGxldGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlcmF0aW9uX2ZhaWxlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYW50X2NoYW5nZV9yb2FtaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19idW5kbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19kaXJlY3RvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX0VuZ2luZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX0lVOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfcGxhbm5lcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExpc3Rpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW1iaWdvdXNfQ29tbWFuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX1JlcXVpcmVkX0FyZ3VtZW50OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zdGFsbGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmluc3RhbGxpbmc7Ci0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vZW1wdHkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL2FwcC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9hcHAvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhOGEwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL2FwcC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIwkgICBDbG91ZHNtaXRoIC0gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNjQwMQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotZGVzdGluYXRpb25fY29tbWFuZGxpbmU9PGRlc3RpbmF0aW9uPgotSW5jb25zaXN0ZW50X2ZsYXZvcj1JbnN0YWxsIGZsYXZvciBub3QgY29uc2lzdGVudCB3aXRoIHByb2ZpbGUgZmxhdm9yCi0KLU9wZXJhdGlvbl9jb21wbGV0ZT1PcGVyYXRpb24gY29tcGxldGVkIGluIHswfSBtcy4KLU9wZXJhdGlvbl9mYWlsZWQ9SW5zdGFsbGF0aW9uIGZhaWxlZC4KLUNhbnRfY2hhbmdlX3JvYW1pbmc9UHJvYmxlbSB3aGlsZSB1cGRhZGluZyB0aGUgcHJvZmlsZSB7MH0uCi0KLQotTWlzc2luZ19kaXJlY3Rvcj1EaXJlY3RvciBjb3VsZCBub3QgYmUgbG9hZGVkLgotTWlzc2luZ19FbmdpbmU9RW5naW5lIGNvdWxkIG5vdCBiZSBsb2FkZWQuCi1NaXNzaW5nX2J1bmRsZT1UaGUgJyd7MH0nJyBidW5kbGUgaXMgbWlzc2luZy4KLU1pc3NpbmdfcGxhbm5lcj1QbGFubmVyIGNvdWxkIG5vdCBiZSBsb2FkZWQuCi1NaXNzaW5nX0lVPVRoZSBpbnN0YWxsYWJsZSB1bml0IHswfSBoYXMgbm90IGJlZW4gZm91bmQuCi1NaXNzaW5nX1JlcXVpcmVkX0FyZ3VtZW50PU1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQgLXswfS4KLUFtYmlnb3VzX0NvbW1hbmQ9Q2Fubm90IGV4ZWN1dGUgYm90aCB7MH0gYW5kIHsxfSBpbiBvbmUgaW52b2NhdGlvbgotTGlzdGluZz1MaXN0aW5nIEluc3RhbGxhYmxlIFVuaXRzIGZyb20gezB9Ci1JbnN0YWxsaW5nPUluc3RhbGxpbmcgezB9IHsxfS4KLVVuaW5zdGFsbGluZz1Vbmluc3RhbGluZyB7MH0gezF9LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvc3JjX2FudC9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL2RpcmVjdG9yL2FwcC9hbnQvRGlyZWN0b3JUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9kaXJlY3Rvci9hcHAvYW50L0RpcmVjdG9yVGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTNlZDMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAvc3JjX2FudC9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL2RpcmVjdG9yL2FwcC9hbnQvRGlyZWN0b3JUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAuYW50OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuYXBwLkFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIEFuIEFudCB0YXNrIHRvIGNhbGwgdGhlIHAyIERpcmVjdG9yIGFwcGxpY2F0aW9uLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEaXJlY3RvclRhc2sgZXh0ZW5kcyBUYXNrIHsKLQotCWJvb2xlYW4gcm9hbWluZzsKLQlib29sZWFuIGxpc3Q7Ci0JU3RyaW5nIHByb2ZpbGUsIGZsYXZvciwgb3MsIHdzLCBubCwgYXJjaCwgaW5zdGFsbElVLCB1bmluc3RhbGxJVTsKLQlGaWxlIGRlc3RpbmF0aW9uLCBidW5kbGVQb29sOwotCVVSTCBtZXRhZGF0YVJlcG9zaXRvcnksIGFydGlmYWN0UmVwb3NpdG9yeTsKLQlWZXJzaW9uIHZlcnNpb247Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQkvLyBjb2xsZWN0IHRoZSBhcmd1bWVudHMgYW5kIGNhbGwgdGhlIGFwcGxpY2F0aW9uCi0JCQluZXcgQXBwbGljYXRpb24oKS5ydW4oZ2V0QXJndW1lbnRzKCkpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgY2FsbGluZyB0aGUgZGlyZWN0b3IgdGFzay4iLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0QXJndW1lbnRzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHJvYW1pbmcpCi0JCQlyZXN1bHQuYWRkKCItcm9hbWluZyIpOwotCQlpZiAocHJvZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuYWRkKCItcHJvZmlsZSIpOwotCQkJcmVzdWx0LmFkZChwcm9maWxlKTsKLQkJfQotCQlpZiAoZGVzdGluYXRpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZCgiLWRlc3RpbmF0aW9uIik7Ci0JCQlyZXN1bHQuYWRkKGRlc3RpbmF0aW9uLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQlpZiAoYnVuZGxlUG9vbCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuYWRkKCItYnVuZGxlUG9vbCIpOwotCQkJcmVzdWx0LmFkZChidW5kbGVQb29sLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQlpZiAobWV0YWRhdGFSZXBvc2l0b3J5ICE9IG51bGwpIHsKLQkJCXJlc3VsdC5hZGQoIi1tZXRhZGF0YVJlcG9zaXRvcnkiKTsKLQkJCXJlc3VsdC5hZGQobWV0YWRhdGFSZXBvc2l0b3J5LnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl9Ci0JCWlmIChhcnRpZmFjdFJlcG9zaXRvcnkgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZCgiLWFydGlmYWN0UmVwb3NpdG9yeSIpOwotCQkJcmVzdWx0LmFkZChhcnRpZmFjdFJlcG9zaXRvcnkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCX0KLQkJaWYgKGZsYXZvciAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuYWRkKCItZmxhdm9yIik7Ci0JCQlyZXN1bHQuYWRkKGZsYXZvcik7Ci0JCX0KLQkJaWYgKHZlcnNpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZCgiLXZlcnNpb24iKTsKLQkJCXJlc3VsdC5hZGQodmVyc2lvbi50b1N0cmluZygpKTsKLQkJfQotCQlpZiAob3MgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZCgiLXAyLm9zIik7Ci0JCQlyZXN1bHQuYWRkKG9zKTsKLQkJfQotCQlpZiAod3MgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZCgiLXAyLndzIik7Ci0JCQlyZXN1bHQuYWRkKHdzKTsKLQkJfQotCQlpZiAoYXJjaCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuYWRkKCItcDIuYXJjaCIpOwotCQkJcmVzdWx0LmFkZChhcmNoKTsKLQkJfQotCQlpZiAobmwgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZCgiLXAyLm5sIik7Ci0JCQlyZXN1bHQuYWRkKG5sKTsKLQkJfQotCQlpZiAobGlzdCkgewotCQkJcmVzdWx0LmFkZChBcHBsaWNhdGlvbi5DT01NQU5EX05BTUVTW0FwcGxpY2F0aW9uLkNPTU1BTkRfTElTVF0pOwotCQl9Ci0JCWlmIChpbnN0YWxsSVUgIT0gbnVsbCkgewotCQkJcmVzdWx0LmFkZChBcHBsaWNhdGlvbi5DT01NQU5EX05BTUVTW0FwcGxpY2F0aW9uLkNPTU1BTkRfSU5TVEFMTF0pOwotCQkJcmVzdWx0LmFkZChpbnN0YWxsSVUpOwotCQl9Ci0JCWlmICh1bmluc3RhbGxJVSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuYWRkKEFwcGxpY2F0aW9uLkNPTU1BTkRfTkFNRVNbQXBwbGljYXRpb24uQ09NTUFORF9VTklOU1RBTExdKTsKLQkJCXJlc3VsdC5hZGQodW5pbnN0YWxsSVUpOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFyY2goU3RyaW5nIHZhbHVlKSB7Ci0JCWFyY2ggPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFJlcG9zaXRvcnkoU3RyaW5nIHZhbHVlKSB7Ci0JCXRyeSB7Ci0JCQlhcnRpZmFjdFJlcG9zaXRvcnkgPSBuZXcgVVJMKHZhbHVlKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWxvZygiRXJyb3Igc2V0dGluZyB0aGUgYXJ0aWZhY3QgcmVwb3NpdG9yeS4iLCBlLCBQcm9qZWN0Lk1TR19FUlIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnVuZGxlUG9vbChTdHJpbmcgdmFsdWUpIHsKLQkJYnVuZGxlUG9vbCA9IG5ldyBGaWxlKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvbihTdHJpbmcgdmFsdWUpIHsKLQkJZGVzdGluYXRpb24gPSBuZXcgRmlsZSh2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rmxhdm9yKFN0cmluZyB2YWx1ZSkgewotCQlmbGF2b3IgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsSVUoU3RyaW5nIHZhbHVlKSB7Ci0JCWluc3RhbGxJVSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpc3QoU3RyaW5nIHZhbHVlKSB7Ci0JCWxpc3QgPSBCb29sZWFuLnZhbHVlT2YodmFsdWUpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGFkYXRhUmVwb3NpdG9yeShTdHJpbmcgdmFsdWUpIHsKLQkJdHJ5IHsKLQkJCW1ldGFkYXRhUmVwb3NpdG9yeSA9IG5ldyBVUkwodmFsdWUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJbG9nKCJFcnJvciBzZXR0aW5nIHRoZSBtZXRhZGF0YSByZXBvc2l0b3J5LiIsIGUsIFByb2plY3QuTVNHX0VSUik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRObChTdHJpbmcgdmFsdWUpIHsKLQkJbmwgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPcyhTdHJpbmcgdmFsdWUpIHsKLQkJb3MgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9maWxlKFN0cmluZyB2YWx1ZSkgewotCQlwcm9maWxlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9hbWluZyhTdHJpbmcgdmFsdWUpIHsKLQkJcm9hbWluZyA9IEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5pbnN0YWxsSVUoU3RyaW5nIHZhbHVlKSB7Ci0JCXVuaW5zdGFsbElVID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihTdHJpbmcgdmFsdWUpIHsKLQkJdmVyc2lvbiA9IG5ldyBWZXJzaW9uKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXcyhTdHJpbmcgdmFsdWUpIHsKLQkJd3MgPSB2YWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2RlYjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjElRm91bmRhdGlvbi0xLjEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVmMzdhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODUyM2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotI1RodSBBdWcgMTYgMTE6MDA6NTkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNDUwMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1Nzo1NCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTEzZDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMmNlYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5sb2NhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXI7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudXRpbDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yb2xsYmFjazt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yOwotICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGssCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcCwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLAotICAgb3JnLmVjbGlwc2UucGRlLnAyLnVpIgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3Rvci5EaXJlY3RvckFjdGl2YXRvcgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4xL0ZvdW5kYXRpb24tMS4xLAotIEoyU0UtMS40Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24sCi0gb3JnLnNhdDRqLmNvcmU7YnVuZGxlLXZlcnNpb249IjIuMC4wIiwKLSBvcmcuc2F0NGoucGI7YnVuZGxlLXZlcnNpb249IjIuMC4wIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmI4MzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzZDlhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggUHJvdmlzaW9uaW5nIERpcmVjdG9yCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0FwcGxpY2FibGVQYXRjaFF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvQXBwbGljYWJsZVBhdGNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0ZDI1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvQXBwbGljYWJsZVBhdGNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhYmxlUGF0Y2hRdWVyeSBleHRlbmRzIFF1ZXJ5IHsKLQlJSW5zdGFsbGFibGVVbml0IGl1OwotCi0JcHVibGljIEFwcGxpY2FibGVQYXRjaFF1ZXJ5KElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJdGhpcy5pdSA9IGl1OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWF0Y2goT2JqZWN0IGNhbmRpZGF0ZSkgewotCQlpZiAoIShjYW5kaWRhdGUgaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVVbml0UGF0Y2gpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJSW5zdGFsbGFibGVVbml0UGF0Y2ggcGF0Y2hJVSA9IChJSW5zdGFsbGFibGVVbml0UGF0Y2gpIGNhbmRpZGF0ZTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W11bXSBzY29wZURlc2NyaXB0aW9uID0gcGF0Y2hJVS5nZXRBcHBsaWNhYmlsaXR5U2NvcGUoKTsKLQkJaWYgKHNjb3BlRGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHNjb3BlRGVzY3JpcHRpb24ubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBjYXAgPSBpdS5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNjb3BlRGVzY3JpcHRpb24ubGVuZ3RoOyBpKyspIHsKLQkJCWludCBtYXRjaGVkU2NvcGVFbnRyeSA9IHNjb3BlRGVzY3JpcHRpb25baV0ubGVuZ3RoOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzY29wZURlc2NyaXB0aW9uW2ldLmxlbmd0aDsgaisrKSB7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBjYXAubGVuZ3RoOyBrKyspIHsKLQkJCQkJaWYgKGNhcFtrXS5pc1NhdGlzZmllZEJ5KHNjb3BlRGVzY3JpcHRpb25baV1bal0pKSB7Ci0JCQkJCQltYXRjaGVkU2NvcGVFbnRyeS0tOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWF0Y2hlZFNjb3BlRW50cnkgPT0gMCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0Jhc2ljSVVGaWx0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9CYXNpY0lVRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGIzMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0Jhc2ljSVVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotCi1wdWJsaWMgY2xhc3MgQmFzaWNJVUZpbHRlciBleHRlbmRzIElVRmlsdGVyIHsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXRbXSBhY2NlcHRlZDsKLQotCXB1YmxpYyBCYXNpY0lVRmlsdGVyKElJbnN0YWxsYWJsZVVuaXRbXSBhY2NlcHRlZCkgewotCQl0aGlzLmFjY2VwdGVkID0gYWNjZXB0ZWQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NlcHRlZC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFjY2VwdGVkW2ldLmVxdWFscyhpdSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0RpcmVjdG9yQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvRGlyZWN0b3JBY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkMjBiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvRGlyZWN0b3JBY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIERpcmVjdG9yQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9ESVJFQ1RPUiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjdHgpIHRocm93cyBFeGNlcHRpb24gewotCQljb250ZXh0ID0gY3R4OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjdHgpIHRocm93cyBFeGNlcHRpb24gewotCQlEaXJlY3RvckFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9IYXNNYXRjaENvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0hhc01hdGNoQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ODlkODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0hhc01hdGNoQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotCi0vKioKLSAqIEEgY29sbGVjdG9yIHRoYXQgc2hvcnQtY2lyY3VpdHMgb24gdGhlIGZpcnN0IG1hdGNoLgotICovCi1wdWJsaWMgY2xhc3MgSGFzTWF0Y2hDb2xsZWN0b3IgZXh0ZW5kcyBDb2xsZWN0b3IgewotCXByaXZhdGUgYm9vbGVhbiBoYXNNYXRjaCA9IGZhbHNlOwotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KE9iamVjdCBvYmplY3QpIHsKLQkJaGFzTWF0Y2ggPSB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuICFoYXNNYXRjaDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9JVUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0lVRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NDVhYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0lVRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIElVRmlsdGVyIHsKLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhY2NlcHQoSUluc3RhbGxhYmxlVW5pdCBpdSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvSVVUcmFuc2Zvcm1hdGlvbkhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL0lVVHJhbnNmb3JtYXRpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1NDFkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvSVVUcmFuc2Zvcm1hdGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotcHVibGljIGNsYXNzIElVVHJhbnNmb3JtYXRpb25IZWxwZXIgewotCXN0YXRpYyBwdWJsaWMgUmVxdWlyZWRDYXBhYmlsaXR5W10gdG9SZXF1aXJlbWVudHMoSXRlcmF0b3IgaXVzLCBib29sZWFuIG9wdGlvbmFsKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlIChpdXMuaGFzTmV4dCgpKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGN1cnJlbnQgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXVzLm5leHQoKTsKLQkJCXJlc3VsdC5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgY3VycmVudC5nZXRJZCgpLCBuZXcgVmVyc2lvblJhbmdlKGN1cnJlbnQuZ2V0VmVyc2lvbigpLCB0cnVlLCBjdXJyZW50LmdldFZlcnNpb24oKSwgdHJ1ZSksIG51bGwsIG9wdGlvbmFsLCBmYWxzZSkpOwotCQl9Ci0JCXJldHVybiAoUmVxdWlyZWRDYXBhYmlsaXR5W10pIHJlc3VsdC50b0FycmF5KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXN0YXRpYyBwdWJsaWMgUmVxdWlyZWRDYXBhYmlsaXR5W10gdG9SZXF1aXJlbWVudHMoSUluc3RhbGxhYmxlVW5pdFtdIGl1cywgYm9vbGVhbiBvcHRpb25hbCkgewotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXN1bHQgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W2l1cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBjdXJyZW50ID0gaXVzW2ldOwotCQkJcmVzdWx0W2ldID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgY3VycmVudC5nZXRJZCgpLCBuZXcgVmVyc2lvblJhbmdlKGN1cnJlbnQuZ2V0VmVyc2lvbigpLCB0cnVlLCBjdXJyZW50LmdldFZlcnNpb24oKSwgdHJ1ZSksIG51bGwsIG9wdGlvbmFsLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTdhMGJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGVzCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3Rvcl9SZXZlcnRfUHJvYmxlbXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0b3JfVW5leHBlY3RlZF9JVTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3Rvcl9UYXNrX0luc3RhbGxpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0b3JfVGFza19VcGRhdGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXJlY3Rvcl9UYXNrX1Jlc29sdmluZ19EZXBlbmRlbmNpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlyZWN0b3JfVW5zYXRpc2ZpZWRfRGVwZW5kZW5jaWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpcmVjdG9yX1Vuc2F0aXNmaWVkX0RlcGVuZGVuY3k7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGFubmVyX0Vycm9yX3NhdmluZ19vcGJmaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsYW5uZXJfRm9ybWF0X2Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsYW5uZXJfTWlzc2luZ19vcGJfZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGFubmVyX1RpbWVvdXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGxhbm5lcl9Qcm9ibGVtc19yZXNvbHZpbmdfcGxhbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGFubmVyX1RyaXZpYWxfZXhjZXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsYW5uZXJfVW5zYXRpc2ZpYWJsZV9wcm9ibGVtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBsYW5uZXJfVW5zYXRpc2ZpZWRfZGVwZW5kZW5jeTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9sZF9SZXNvbHZlcl9TZXZlcmFsX1ZlcnNpb25zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9sZF9SZXNvbHZlcl9JbmNvbXBhdGlibGVfVmVyc2lvbnM7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9OZXdEZXBlbmRlbmN5RXhwYW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9OZXdEZXBlbmRlbmN5RXhwYW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2ZWNmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvTmV3RGVwZW5kZW5jeUV4cGFuZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAlHZW51aXRlYywgTExDIC0gYWRkZWQgbGljZW5zZSBzdXBwb3J0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uLlJlc29sdXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uLlVuc2F0aXNmaWVkQ2FwYWJpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5DYXBhYmlsaXR5UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5JbnZhbGlkU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFRoaXMgY29kZSBpcyBrZXB0IHRvIHJlcG9ydCBlcnJvcnMuIFRoZSByZWFsIHJlc29sdXRpb24gaXMgZG9uZSBpbiBjbGFzc2VzIHtAbGluayBTbGljZXJ9IGFuZCB7QGxpbmsgUHJvamVjdG9yfS4gCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdEZXBlbmRlbmN5RXhwYW5kZXIgewotCi0JcHJpdmF0ZSBjbGFzcyBNYXRjaCB7Ci0JCS8qKgotCQkgKiBUaGUge0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9cyBzYXRpc2Z5aW5nIHRoaXMgcmVxdWlyZW1lbnQuCi0JCSAqLwotCQlTZXQgY2FuZGlkYXRlczsKLQkJLyoqCi0JCSAqIFRoZSBlbnZpcm9ubWVudCBhZ2FpbnN0IHdoaWNoIGNhcGFiaWxpdHkgZmlsdGVycyBhcmUgZXZhbHVhdGVkIGZvciB0aGlzIG1hdGNoLgotCQkgKi8KLQkJRGljdGlvbmFyeSBlbnY7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSByZXE7Ci0KLQkJcHVibGljIE1hdGNoKFJlcXVpcmVkQ2FwYWJpbGl0eSByYW5nZSwgRGljdGlvbmFyeSBlbnZpcm9ubWVudCkgewotCQkJdGhpcy5yZXEgPSByYW5nZTsKLQkJCXRoaXMuZW52ID0gZW52aXJvbm1lbnQ7Ci0JCQljYW5kaWRhdGVzID0gbmV3IEhhc2hTZXQoMik7Ci0JCX0KLQotCQkvKioKLQkJICogRm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5Ci0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJNYXRjaFsiICsgcmVxICsgJ10nOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXByZXNlbnRzIGEgcmVxdWlyZW1lbnQgbmFtZSBpbiB0aGUgbWFwIG9mIHJlcXVpcmVkIGNhcGFiaWxpdGllcy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIE1hdGNoS2V5IHsKLQkJU3RyaW5nIG5hbWU7Ci0JCVN0cmluZyBuYW1lc3BhY2U7Ci0KLQkJTWF0Y2hLZXkoUmVxdWlyZWRDYXBhYmlsaXR5IGNhcGFiaWxpdHkpIHsKLQkJCXRoaXMubmFtZXNwYWNlID0gY2FwYWJpbGl0eS5nZXROYW1lc3BhY2UoKTsKLQkJCXRoaXMubmFtZSA9IGNhcGFiaWxpdHkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQkJCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIE1hdGNoS2V5KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlNYXRjaEtleSB0aGF0ID0gKE1hdGNoS2V5KSBvYmplY3Q7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2UuZXF1YWxzKHRoYXQubmFtZXNwYWNlKSAmJiB0aGlzLm5hbWUuZXF1YWxzKHRoYXQubmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIDMxICogbmFtZXNwYWNlLmhhc2hDb2RlKCkgKyBuYW1lLmhhc2hDb2RlKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJNYXRjaEtleSgiICsgbmFtZXNwYWNlICsgJy8nICsgbmFtZSArICcpJzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLy8gSW5zdGFsbGFibGUgdW5pdHMgdGhhdCBhcmUgb3B0aW9uYWwgaGF2ZSBhIGRlcGVuZGVuY3kgb24gdGhlbXNlbHZlcy4KLQlwcml2YXRlIGNsYXNzIE9wdGlvbmFsSW5zdGFsbGFibGVVbml0IGltcGxlbWVudHMgSUluc3RhbGxhYmxlVW5pdCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBvcHRpb25hbFJlcXM7Ci0JCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCB3cmFwcGVkOwotCi0JCU9wdGlvbmFsSW5zdGFsbGFibGVVbml0KElJbnN0YWxsYWJsZVVuaXQgaXUsIGJvb2xlYW4gZ2VuZXJhdGVPcHRpb25hbFJlcXMpIHsKLQkJCXdyYXBwZWQgPSBpdTsKLQkJCW9wdGlvbmFsUmVxcyA9IGdlbmVyYXRlT3B0aW9uYWxSZXFzOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRGaWx0ZXIoKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZC5nZXRGaWx0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZC5nZXRJZCgpOwotCQl9Ci0KLQkJcHVibGljIFZlcnNpb24gZ2V0VmVyc2lvbigpIHsKLQkJCXJldHVybiB3cmFwcGVkLmdldFZlcnNpb24oKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgewotCQkJcmV0dXJuIHdyYXBwZWQuZ2V0UHJvcGVydHkoa2V5KTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAodGhpcyA9PSBvYmopCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoIXN1cGVyLmVxdWFscyhvYmopKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWZpbmFsIE9wdGlvbmFsSW5zdGFsbGFibGVVbml0IG90aGVyID0gKE9wdGlvbmFsSW5zdGFsbGFibGVVbml0KSBvYmo7Ci0JCQlpZiAod3JhcHBlZCA9PSBudWxsKSB7Ci0JCQkJaWYgKG90aGVyLndyYXBwZWQgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfSBlbHNlIGlmICghd3JhcHBlZC5lcXVhbHMob3RoZXIud3JhcHBlZCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgUmVxdWlyZWRDYXBhYmlsaXR5W10gZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSB7Ci0JCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gY2FwcyA9IHdyYXBwZWQuZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2Fwcy5sZW5ndGg7IGkrKykgewotCQkJCXJlc3VsdC5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShjYXBzW2ldLmdldE5hbWVzcGFjZSgpLCBjYXBzW2ldLmdldE5hbWUoKSwgbmV3IFZlcnNpb25SYW5nZShjYXBzW2ldLmdldFZlcnNpb24oKSwgdHJ1ZSwgY2Fwc1tpXS5nZXRWZXJzaW9uKCksIHRydWUpLCB3cmFwcGVkLmdldEZpbHRlcigpLCBvcHRpb25hbFJlcXMsIGZhbHNlKSk7Ci0JCQl9Ci0JCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3Qod3JhcHBlZC5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpKSk7Ci0JCQlyZXR1cm4gKFJlcXVpcmVkQ2FwYWJpbGl0eVtdKSByZXN1bHQudG9BcnJheShuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W3Jlc3VsdC5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLQkJCWludCByZXN1bHQgPSBzdXBlci5oYXNoQ29kZSgpOwotCQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKHdyYXBwZWQgPT0gbnVsbCkgPyAwIDogd3JhcHBlZC5oYXNoQ29kZSgpKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHdyYXBwZWQudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBJQXJ0aWZhY3RLZXlbXSBnZXRBcnRpZmFjdHMoKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZC5nZXRBcnRpZmFjdHMoKTsKLQkJfQotCi0JCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcygpIHsKLQkJCXJldHVybiB3cmFwcGVkLmdldFByb3BlcnRpZXMoKTsKLQkJfQotCi0JCXB1YmxpYyBQcm92aWRlZENhcGFiaWxpdHlbXSBnZXRQcm92aWRlZENhcGFiaWxpdGllcygpIHsKLQkJCXJldHVybiB3cmFwcGVkLmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgVG91Y2hwb2ludERhdGFbXSBnZXRUb3VjaHBvaW50RGF0YSgpIHsKLQkJCXJldHVybiB3cmFwcGVkLmdldFRvdWNocG9pbnREYXRhKCk7Ci0JCX0KLQotCQlwdWJsaWMgVG91Y2hwb2ludFR5cGUgZ2V0VG91Y2hwb2ludFR5cGUoKSB7Ci0JCQlyZXR1cm4gd3JhcHBlZC5nZXRUb3VjaHBvaW50VHlwZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNGcmFnbWVudCgpIHsKLQkJCXJldHVybiB3cmFwcGVkLmlzRnJhZ21lbnQoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzU2luZ2xldG9uKCkgewotCQkJcmV0dXJuIHdyYXBwZWQuaXNTaW5nbGV0b24oKTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgY29tcGFyZVRvKE9iamVjdCBhcmcpIHsKLQkJCXJldHVybiB3cmFwcGVkLmNvbXBhcmVUbyhhcmcpOwotCQl9Ci0KLQkJcHVibGljIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFtdIGdldEZyYWdtZW50cygpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IHVucmVzb2x2ZWQoKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCXB1YmxpYyBJVXBkYXRlRGVzY3JpcHRvciBnZXRVcGRhdGVEZXNjcmlwdG9yKCkgewotCQkJcmV0dXJuIHdyYXBwZWQuZ2V0VXBkYXRlRGVzY3JpcHRvcigpOwotCQl9Ci0KLQkJcHVibGljIExpY2Vuc2UgZ2V0TGljZW5zZSgpIHsKLQkJCXJldHVybiB3cmFwcGVkLmdldExpY2Vuc2UoKTsKLQkJfQotCi0JCXB1YmxpYyBDb3B5cmlnaHQgZ2V0Q29weXJpZ2h0KCkgewotCQkJcmV0dXJuIHdyYXBwZWQuZ2V0Q29weXJpZ2h0KCk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgZmluYWwgaW50IE9wZXJhdGlvbldvcmsgPSAxMDA7Ci0KLQlwcml2YXRlIGZpbmFsIFNldCBhbHJlYWR5SW5zdGFsbGVkID0gbmV3IEhhc2hTZXQoKTsKLQotCXByaXZhdGUgYm9vbGVhbiBpbmNsdWRlT3B0aW9uYWw7Ci0KLQkvKioKLQkgKiBBIG1hcCBvZiBhbGwgdGhlIHJlcXVpcmVtZW50cyBldmVyIGVuY291bnRlcmVkIGluIHRoZSBzeXN0ZW0uIFRoZSBrZXkgaXMKLQkgKiBhIE1hdGNoS2V5IGFuZCB0aGUgdmFsdWUgaXMgYSBMaXN0IG9mIE1hdGNoIG9iamVjdHMuCi0JICovCi0JcHJpdmF0ZSBNYXAgbXVzdCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBQaWNrZXIgcGlja2VyOwotCi0JcHJpdmF0ZSBEaWN0aW9uYXJ5IHNlbGVjdGlvbkNvbnRleHQ7Ci0KLQlwcml2YXRlIFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvciByZWNvbW1lbmRhdGlvbnM7Ci0KLQlwcml2YXRlIFJlc29sdXRpb25IZWxwZXIgcmVzb2x2ZXI7Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXRbXSByb290czsKLQotCXByaXZhdGUgQ29sbGVjdGlvbiBzb2x1dGlvbjsKLQotCXB1YmxpYyBOZXdEZXBlbmRlbmN5RXhwYW5kZXIoSUluc3RhbGxhYmxlVW5pdFtdIHIsIElJbnN0YWxsYWJsZVVuaXRbXSBhbHJlYWR5SW5zdGFsbGVkLCBJSW5zdGFsbGFibGVVbml0W10gYXZhaWxhYmxlSVVzLCBEaWN0aW9uYXJ5IHNlbGVjdGlvbkNvbnRleHQsIGJvb2xlYW4gaW5jbHVkZU9wdGlvbmFsKSB7Ci0JCXRoaXMucm9vdHMgPSAociA9PSBudWxsKSA/IG5ldyBJSW5zdGFsbGFibGVVbml0WzBdIDogcjsKLQkJdGhpcy5pbmNsdWRlT3B0aW9uYWwgPSBpbmNsdWRlT3B0aW9uYWw7Ci0JCWFscmVhZHlJbnN0YWxsZWQgPSBhbHJlYWR5SW5zdGFsbGVkID09IG51bGwgPyBuZXcgSUluc3RhbGxhYmxlVW5pdFswXSA6IGFscmVhZHlJbnN0YWxsZWQ7Ci0JCXRoaXMuYWxyZWFkeUluc3RhbGxlZC5hZGRBbGwoQXJyYXlzLmFzTGlzdChhbHJlYWR5SW5zdGFsbGVkKSk7Ci0JCXRoaXMuc2VsZWN0aW9uQ29udGV4dCA9IHNlbGVjdGlvbkNvbnRleHQ7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdFtdIHJlc3VsdCA9IG5ldyBJSW5zdGFsbGFibGVVbml0W3Jvb3RzLmxlbmd0aCArIGFscmVhZHlJbnN0YWxsZWQubGVuZ3RoICsgYXZhaWxhYmxlSVVzLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkocm9vdHMsIDAsIHJlc3VsdCwgMCwgcm9vdHMubGVuZ3RoKTsKLQkJU3lzdGVtLmFycmF5Y29weShhbHJlYWR5SW5zdGFsbGVkLCAwLCByZXN1bHQsIHJvb3RzLmxlbmd0aCwgYWxyZWFkeUluc3RhbGxlZC5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KGF2YWlsYWJsZUlVcywgMCwgcmVzdWx0LCByb290cy5sZW5ndGggKyBhbHJlYWR5SW5zdGFsbGVkLmxlbmd0aCwgYXZhaWxhYmxlSVVzLmxlbmd0aCk7Ci0JCXBpY2tlciA9IG5ldyBQaWNrZXIocmVzdWx0LCBuZXcgUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yKG5ldyBIYXNoU2V0KCkpKTsKLQkJQ29sbGVjdGlvbiBmaWx0ZXJGb3JSb290ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAociAhPSBudWxsICYmIHIubGVuZ3RoID4gMCkgewotCQkJZmlsdGVyRm9yUm9vdC5hZGQobmV3IEJhc2ljSVVGaWx0ZXIocikpOwotCQkJZmlsdGVyRm9yUm9vdC5hZGQobmV3IFJlcXVpcmVtZW50QmFzZWRGaWx0ZXIoclswXS5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpKSk7Ci0JCX0KLQkJcGlja2VyLnByZWZlcihmaWx0ZXJGb3JSb290KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcHJvYmxlbSBzdGF0dXMgZm9yIHRoZSBnaXZlbiB1bnNhdGlzZmllZCBkZXBlbmRlbmN5LgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRVbnNhdGlzZmllZChSZXF1aXJlZENhcGFiaWxpdHkgcmVxLCBDb2xsZWN0aW9uIHRvQWRkLCBNdWx0aVN0YXR1cyBwcm9ibGVtcykgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdG9BZGQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCB1bml0ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0Lm5leHQoKTsKLQkJCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkID0gdW5pdC5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChyZXF1aXJlZFtpXS5lcXVhbHMocmVxKSkgewotCQkJCQlVbnNhdGlzZmllZENhcGFiaWxpdHkgdW5zYXRpc2ZpZWQgPSBuZXcgVW5zYXRpc2ZpZWRDYXBhYmlsaXR5KHJlcSwgdW5pdCk7Ci0JCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5EaXJlY3Rvcl9VbnNhdGlzZmllZF9EZXBlbmRlbmN5LCB1bnNhdGlzZmllZCk7Ci0JCQkJCXByb2JsZW1zLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCBtc2cpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWxnbyhTdWJNb25pdG9yIHAsIE11bHRpU3RhdHVzIHByb2JsZW1zKSB7Ci0JCS8vRmlyc3Qgd2UgY3JlYXRlIGRlcGVuZGVuY2llcyBvbiB0aGUgcm9vdCB0aGVtc2VsdmVzLiBUaGUgZmlyc3QgaXRlcmF0aW9uIHdpbGwgbW9zdGx5IGNvbnNpc3QgaW4gcmVkaXNjb3ZlcmluZyB0aGUgcm9vdHMuCi0JCUNvbGxlY3Rpb24gdG9BZGQgPSBhc09wdGlvbmFsSVVzKEFycmF5cy5hc0xpc3Qocm9vdHMpLCBmYWxzZSk7Ci0JCXRvQWRkLmFkZEFsbChhbHJlYWR5SW5zdGFsbGVkKTsKLQkJZG8gewotCQkJLy9yZXNldCB3b3JrIGF0IGVhY2ggaXRlcmF0aW9uLCB0aGVuIHVzZSB1cCBhIHRoaXJkLiBUaGlzIHJlc3VsdHMgaW4gYW4gaW5maW5pdGUgc2VyaWVzIHdoZXJlIHJlbWFpbmluZyB0aWNrcyBnZXRzIHN0ZWFkaWx5IHNtYWxsZXIKLQkJCXAuc2V0V29ya1JlbWFpbmluZygxMDApOwotCQkJZXh0cmFjdFZpc2liaWxpdHlEYXRhKHRvQWRkKTsKLQkJCWV4dHJhY3RSZXF1aXJlbWVudHModG9BZGQpOwotCQkJdG9BZGQgPSBjb2xsZWN0TWF0Y2hlcyh0b0FkZCwgcHJvYmxlbXMpOwotCQkJcC53b3JrZWQoMzMpOwotCQl9IHdoaWxlICh0b0FkZC5zaXplKCkgIT0gMCk7Ci0KLQkJLy9kb24ndCBib3RoZXIgaW52b2tpbmcgdGhlIHJlc29sdmVyIGlmIHdlIGFscmVhZHkgaGF2ZSBwcm9ibGVtcwotCQkvLwkJaWYgKCFwcm9ibGVtcy5pc09LKCkpCi0JCS8vCQkJcmV0dXJuOwotCQlpbnZva2VSZXNvbHZlcihwcm9ibGVtcyk7Ci0JCS8vCQlpZiAocHJvYmxlbXMuaXNPSygpKQotCQlleHRyYWN0U29sdXRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXh0cmFjdFZpc2liaWxpdHlEYXRhKENvbGxlY3Rpb24gaXVzKSB7Ci0JCUNvbGxlY3Rpb24gZmlsdGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGl1cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShpdS5nZXRQcm9wZXJ0eSgibGluZVVwIikpKSB7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJZmlsdGVycy5hZGQobmV3IFJlcXVpcmVtZW50QmFzZWRGaWx0ZXIoaXUuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSkpOwotCQkJfQotCQl9Ci0JCXBpY2tlci5wcmVmZXIoZmlsdGVycyk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGFzT3B0aW9uYWxJVXMoQ29sbGVjdGlvbiBhc0xpc3QsIGJvb2xlYW4gZ2VuZXJhdGVPcHRpb25hbFJlcXMpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFzTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlyZXN1bHQuYWRkKG5ldyBPcHRpb25hbEluc3RhbGxhYmxlVW5pdCgoKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKSksIGdlbmVyYXRlT3B0aW9uYWxSZXFzKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gY29sbGVjdEZsYXZvclByb3ZpZGVycyhDb2xsZWN0aW9uIHRvU2VhcmNoRm9yKSB7Ci0JCVN0cmluZyBmbGF2b3IgPSAoU3RyaW5nKSBzZWxlY3Rpb25Db250ZXh0LmdldChJUHJvZmlsZS5QUk9QX0VOVklST05NRU5UUyk7Ci0JCWlmIChmbGF2b3IgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSGFzaFNldCgpOwotCQlJSW5zdGFsbGFibGVVbml0W11bXSBwaWNrZWQgPSBwaWNrZXIuZmluZEluc3RhbGxhYmxlVW5pdChudWxsLCBudWxsLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfRkxBVk9SLCBmbGF2b3IsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UpfSwgdHJ1ZSAvKiBmcmFnbWVudHNPbmx5ICovKTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIGl1czsKLQkJaWYgKHBpY2tlZFswXS5sZW5ndGggPiAwKQotCQkJaXVzID0gcGlja2VkWzBdOwotCQllbHNlCi0JCQlpdXMgPSBwaWNrZWRbMV07Ci0JCVNldCByZXN1bHRzID0gbmV3IEhhc2hTZXQoaXVzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IHRtcCA9IG1hdGNoKHRvU2VhcmNoRm9yLCBpdXNbaV0pOwotCQkJaWYgKHRtcCAhPSBudWxsKQotCQkJCXJlc3VsdHMuYWRkKG5ldyBPcHRpb25hbEluc3RhbGxhYmxlVW5pdCh0bXAsIGZhbHNlKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGNvbGxlY3RJbnN0YWxsYWJsZVVuaXRGcmFnbWVudHMoQ29sbGVjdGlvbiBpdXMpIHsKLQkJU2V0IHBpY2tlZCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpdXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBjdXJyZW50ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUlJbnN0YWxsYWJsZVVuaXRbXVtdIGNhbmRpZGF0ZXMgPSBwaWNrZXIuZmluZEluc3RhbGxhYmxlVW5pdChudWxsLCBudWxsLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoImZyYWdtZW50IiwgY3VycmVudC5nZXRJZCgpLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgdHJ1ZSwgZmFsc2UpfSwgZmFsc2UgLyogbm90IGZyYWdtZW50c09ubHkgKi8pOyAvLyROT04tTkxTLTEkCi0JCQlJSW5zdGFsbGFibGVVbml0W10gbWF0Y2hlcyA9IGNhbmRpZGF0ZXNbMF0ubGVuZ3RoID4gMCA/IGNhbmRpZGF0ZXNbMF0gOiBjYW5kaWRhdGVzWzFdOwotCQkJaWYgKG1hdGNoZXMubGVuZ3RoID4gMCkgeyAvL1RPRE8gSGVyZSB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBmaWx0ZXIgb2YgdGhlIGZvdW5kIGl1Ci0JCQkJaWYgKG1hdGNoZXMubGVuZ3RoID09IDEpIHsKLQkJCQkJcGlja2VkLmFkZChtYXRjaGVzWzBdKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vdmVyaWZ5IHRoYXQgZWFjaCBJVSByZXF1aXJlcyB0aGUgY3VycmVudCBpdQotCQkJCVByb3ZpZGVkQ2FwYWJpbGl0eSBjYXBGb3JDdXJyZW50ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgY3VycmVudC5nZXRJZCgpLCBjdXJyZW50LmdldFZlcnNpb24oKSk7Ci0JCQkJTWFwIHRvQWRkID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1hdGNoZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxcyA9IG1hdGNoZXNbaV0uZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKTsKLQkJCQkJYm9vbGVhbiBpc1JlYWxseUFGcmFnbWVudCA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlcXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlzUmVhbGx5QUZyYWdtZW50ID0gY2FwRm9yQ3VycmVudC5pc1NhdGlzZmllZEJ5KHJlcXNbal0pOwotCQkJCQl9Ci0JCQkJCWlmICghaXNSZWFsbHlBRnJhZ21lbnQpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJSUluc3RhbGxhYmxlVW5pdCBtYXRjaCA9IChJSW5zdGFsbGFibGVVbml0KSB0b0FkZC5nZXQobWF0Y2hlc1tpXS5nZXRJZCgpKTsKLQkJCQkJaWYgKG1hdGNoID09IG51bGwgfHwgbWF0Y2guZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyhtYXRjaGVzW2ldLmdldFZlcnNpb24oKSkgPCAwKQotCQkJCQkJdG9BZGQucHV0KG1hdGNoZXNbaV0uZ2V0SWQoKSwgbWF0Y2hlc1tpXSk7Ci0JCQkJfQotCQkJCXBpY2tlZC5hZGRBbGwodG9BZGQudmFsdWVzKCkpOwotCQkJCS8vaW4gdGhlIHJlbWluZGVyLCBjaGVjayBpZiBtb3JlIHRoYW4gb25lIGlzIGdvb2QsIHRoZW4gcGljayB0aGUgaGlnaGVzdCBvbmUuCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBpY2tlZDsKLQl9Ci0KLQkvLyBGb3IgZWFjaCByZXF1aXJlbWVudCwgZmluZCB0aGUgcG90ZW50aWFsIElVcwotCXByaXZhdGUgQ29sbGVjdGlvbiBjb2xsZWN0TWF0Y2hlcyhDb2xsZWN0aW9uIHRvQWRkLCBNdWx0aVN0YXR1cyBwcm9ibGVtcykgewotCQlDb2xsZWN0aW9uIHRoaW5nc0FkZGVkID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG11c3QudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJTGlzdCBhbGwgPSAoTGlzdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBtYXRjaGVzID0gYWxsLml0ZXJhdG9yKCk7IG1hdGNoZXMuaGFzTmV4dCgpOykgewotCQkJCU1hdGNoIGN1cnJlbnQgPSAoTWF0Y2gpIG1hdGNoZXMubmV4dCgpOwotCQkJCUNvbGxlY3Rpb25bXSBwaWNrZWQgPSBwaWNrZXIuZmluZEluc3RhbGxhYmxlVW5pdChudWxsLCBudWxsLCBjdXJyZW50LnJlcSk7Ci0JCQkJQ29sbGVjdGlvbiBmb3VuZCA9IHBpY2tlZFswXS5zaXplKCkgPiAwID8gcGlja2VkWzBdIDogcGlja2VkWzFdOwotCQkJCWlmIChjdXJyZW50LmNhbmRpZGF0ZXMuYWRkQWxsKGZvdW5kKSkgewotCQkJCQl0aGluZ3NBZGRlZC5hZGRBbGwoZm91bmQpOwotCQkJCQl0aGluZ3NBZGRlZC5hZGRBbGwoY29sbGVjdE9wdGlvbmFsSW5zdGFsbGFibGVVbml0cyhmb3VuZCkpOwotCQkJCX0KLQkJCQlpZiAoY3VycmVudC5jYW5kaWRhdGVzLnNpemUoKSA9PSAwICYmIHJlcXVpcmVtZW50RW5hYmxlZChjdXJyZW50LnJlcSkpCi0JCQkJCWFkZFVuc2F0aXNmaWVkKGN1cnJlbnQucmVxLCB0b0FkZCwgcHJvYmxlbXMpOwotCQkJfQotCQkJaWYgKGFsbC5zaXplKCkgPiAyKSB7Ci0JCQkJTWF0Y2hbXSBjb25mbGljdGluZ01hdGNoZXMgPSAoTWF0Y2hbXSkgYWxsLnRvQXJyYXkobmV3IE1hdGNoW2FsbC5zaXplKCldKTsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLk9sZF9SZXNvbHZlcl9TZXZlcmFsX1ZlcnNpb25zLCBjb25mbGljdGluZ01hdGNoZXMpKTsKLQkJCX0KLQkJCWlmIChhbGwuc2l6ZSgpID4gMSkgewotCQkJCS8vVE9ETyBUaGlzIGFsZ29yaXRobSBuZWVkcyB0byBiZSBnZW5lcmFsaXplZCB0byBjb25zaWRlciBhbGwgdGhlIHBvdGVudGlhbCBjYW5kaWRhdGVzLgotCQkJCVNldCBzZXQxID0gKChNYXRjaCkgYWxsLmdldCgwKSkuY2FuZGlkYXRlczsKLQkJCQlTZXQgc2V0MiA9ICgoTWF0Y2gpIGFsbC5nZXQoMSkpLmNhbmRpZGF0ZXM7Ci0JCQkJYm9vbGVhbiBwb3RlbnRpYWxTb2x1dGlvbiA9IGZhbHNlOwotCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3JTZXQxID0gc2V0MS5pdGVyYXRvcigpOyBpdGVyYXRvclNldDEuaGFzTmV4dCgpICYmICFwb3RlbnRpYWxTb2x1dGlvbjspIHsKLQkJCQkJSUluc3RhbGxhYmxlVW5pdCBpdGVtU2V0MSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvclNldDEubmV4dCgpOwotCQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yU2V0MiA9IHNldDIuaXRlcmF0b3IoKTsgaXRlcmF0b3JTZXQyLmhhc05leHQoKSAmJiAhcG90ZW50aWFsU29sdXRpb247KSB7Ci0JCQkJCQlJSW5zdGFsbGFibGVVbml0IGl0ZW1TZXQyID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yU2V0Mi5uZXh0KCk7Ci0JCQkJCQlpZiAoaXRlbVNldDEuZ2V0SWQoKS5lcXVhbHMoaXRlbVNldDIuZ2V0SWQoKSkgJiYgKChpdGVtU2V0MS5pc1NpbmdsZXRvbigpID09IHRydWUgJiYgaXRlbVNldDEuaXNTaW5nbGV0b24oKSA9PSBpdGVtU2V0Mi5pc1NpbmdsZXRvbigpKSB8fCBpdGVtU2V0MS5pc1NpbmdsZXRvbigpICE9IGl0ZW1TZXQyLmlzU2luZ2xldG9uKCkpKSB7Ci0JCQkJCQkJY29udGludWU7IC8vVGhpcyBjb21iaW5hdGlvbiB3b3VsZCBub3Qgd29yay4gS2VlcCBvbiBzZWFyY2hpbmcKLQkJCQkJCX0KLQkJCQkJCXBvdGVudGlhbFNvbHV0aW9uID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAocG90ZW50aWFsU29sdXRpb24gPT0gZmFsc2UpIHsKLQkJCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLk9sZF9SZXNvbHZlcl9JbmNvbXBhdGlibGVfVmVyc2lvbnMsIGFsbC5nZXQoMCksIGFsbC5nZXQoMSkpOwotCQkJCQlwcm9ibGVtcy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgbXNnKSk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJcmV0dXJuIHRoaW5nc0FkZGVkOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBjb2xsZWN0T3B0aW9uYWxJbnN0YWxsYWJsZVVuaXRzKENvbGxlY3Rpb24gb3B0aW9uYWxGb3IpIHsKLQkJaWYgKCFpbmNsdWRlT3B0aW9uYWwpCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBjb2xsZWN0Rmxhdm9yUHJvdmlkZXJzKG9wdGlvbmFsRm9yKTsKLQkJcmVzdWx0LmFkZEFsbChjb2xsZWN0SW5zdGFsbGFibGVVbml0RnJhZ21lbnRzKG9wdGlvbmFsRm9yKSk7Ci0JCS8vCQlpZiAocmVzdWx0LnNpemUoKSAhPSAwKSB7Ly9GaW5kIHRoZSBvcHRpb25hbCBwaWVjZXMgb2YgdGhlIG9wdGlvbmFsIHBpZWNlcy4gVE9ETyBJIHRoaW5rIHRoZXJlIGNhbiBiZSBjYXNlcyB3aGVyZSB3ZSB3b3VsZCBjeWNsZSBpbmZpbml0ZWx5Ci0JCS8vCQkJcmVzdWx0LmFkZEFsbChjb2xsZWN0T3B0aW9uYWxJbnN0YWxsYWJsZVVuaXRzKHJlc3VsdCkpOwotCQkvLwkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEVsaW1pbmF0ZSBmYWxzZSBwb3NpdGl2ZXMgZnJvbSB0aGUgc2V0IG9mIHVuc2F0aXNmaWVkIGNhcGFiaWxpdGllcyByZXR1cm5lZAotCSAqIGJ5IHRoZSByZXNvbHZlci4gIFRoaXMgaW5jbHVkZXMgb3B0aW9uYWwgZGVwZW5kZW5jaWVzLCBhbmQgZGVwZW5kZW5jaWVzIGZvcgotCSAqIHdoaWNoIHdlIGhhdmUgYW4gYXZhaWxhYmxlIGluc3RhbGxhYmxlIHVuaXQuCi0JICovCi0JcHJpdmF0ZSBVbnNhdGlzZmllZENhcGFiaWxpdHlbXSBjb2xsZWN0VW5zYXRpc2ZpZWREZXBlbmRlbmNpZXMoVW5zYXRpc2ZpZWRDYXBhYmlsaXR5W10gdW5yZXNvbHZlZCkgewotCQlBcnJheUxpc3QgcmVhbGx5VW5zYXRpc2ZpZWQgPSBuZXcgQXJyYXlMaXN0KHVucmVzb2x2ZWQubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bnJlc29sdmVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlMaXN0IGFsbCA9IChMaXN0KSBtdXN0LmdldChuZXcgTWF0Y2hLZXkodW5yZXNvbHZlZFtpXS5nZXRSZXF1aXJlZENhcGFiaWxpdHkoKSkpOwotCQkJaWYgKGFsbCAhPSBudWxsKSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCU1hdGNoIG0gPSAoTWF0Y2gpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKHJlcXVpcmVtZW50RW5hYmxlZChtLnJlcSkgJiYgIW9uZVJlc29sdmVkKG0uY2FuZGlkYXRlcykpCi0JCQkJCQlyZWFsbHlVbnNhdGlzZmllZC5hZGQodW5yZXNvbHZlZFtpXSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQltdXN0LmdldChuZXcgTWF0Y2hLZXkodW5yZXNvbHZlZFtpXS5nZXRSZXF1aXJlZENhcGFiaWxpdHkoKSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoVW5zYXRpc2ZpZWRDYXBhYmlsaXR5W10pIHJlYWxseVVuc2F0aXNmaWVkLnRvQXJyYXkobmV3IFVuc2F0aXNmaWVkQ2FwYWJpbGl0eVtyZWFsbHlVbnNhdGlzZmllZC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgY3JlYXRlTGlzdChNYXRjaCBtKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJcmVzdWx0LmFkZChtKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBleHBhbmQoSVByb2dyZXNzTW9uaXRvciBwKSB7Ci0JCU11bHRpU3RhdHVzIHJlc3VsdCA9IG5ldyBNdWx0aVN0YXR1cyhEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgMSwgTWVzc2FnZXMuRGlyZWN0b3JfVW5zYXRpc2ZpZWRfRGVwZW5kZW5jaWVzLCBudWxsKTsKLQkJdHJ5IHsKLQkJCWFsZ28oU3ViTW9uaXRvci5jb252ZXJ0KHAsICJSZXNvbHZpbmciLCAxMCksIHJlc3VsdCk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgMSwgZS5nZXRNZXNzYWdlKCksIG51bGwpOwotCQl9Ci0JCWlmIChyZXN1bHQuaXNPSygpKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gcmV0dXJuIGEgbWFwIGZyb20gYSByZXF1aXJlbWVudCB0byB0aGUgc2V0IG9mIGluc3RhbGxhYmxlIHVuaXRzCi0JLy8gCQkgIGRlcGVuZGluZyBvbiB0aGF0IHJlcXVpcmVtZW50Ci0JcHJpdmF0ZSB2b2lkIGV4dHJhY3RSZXF1aXJlbWVudHMoQ29sbGVjdGlvbiBpdXMpIHsKLQkJLy9tYXAgb2YgTWF0Y2hLZXktPk1hdGNoCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBpdXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBjdXJyZW50VW5pdCA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlSZXF1aXJlZENhcGFiaWxpdHlbXSB0b0FkZCA9IGN1cnJlbnRVbml0LmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCk7Ci0JCQlvdXRlcjogZm9yIChpbnQgaSA9IDA7IGkgPCB0b0FkZC5sZW5ndGg7IGkrKykgewotCQkJCVJlcXVpcmVkQ2FwYWJpbGl0eSBjdXJyZW50ID0gdG9BZGRbaV07Ci0JCQkJaWYgKGlzQXBwbGljYWJsZShjdXJyZW50KSAmJiAhaXNNZXRhKGN1cnJlbnQpICYmICFjdXJyZW50LmlzT3B0aW9uYWwoKSkgewotCQkJCQlNYXRjaEtleSBrZXkgPSBuZXcgTWF0Y2hLZXkoY3VycmVudCk7Ci0JCQkJCUxpc3QgbWF0Y2ggPSAoTGlzdCkgbXVzdC5nZXQoa2V5KTsKLQkJCQkJaWYgKG1hdGNoID09IG51bGwpIHsKLQkJCQkJCS8vV2UndmUgbmV2ZXIgc2VlbiBhIHJlcXVpcmVtZW50IGxpa2UgdGhpcy4gTWFrZSBhIG5ldyBtYXRjaAotCQkJCQkJbXVzdC5wdXQoa2V5LCBjcmVhdGVMaXN0KG5ldyBNYXRjaChjdXJyZW50LCBzZWxlY3Rpb25Db250ZXh0KSkpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy9sb29rIGZvciBhbiBleGlzdGluZyBtYXRjaCB3aG9zZSB2ZXJzaW9uIHJhbmdlIGlzIG92ZXJsYXBwaW5nIHRoZSBuZXcgb25lCi0JCQkJCQlmb3IgKEl0ZXJhdG9yIG1hdGNoZXMgPSBtYXRjaC5pdGVyYXRvcigpOyBtYXRjaGVzLmhhc05leHQoKTspIHsKLQkJCQkJCQlNYXRjaCBjdXJyZW50TWF0Y2ggPSAoTWF0Y2gpIG1hdGNoZXMubmV4dCgpOwotCQkJCQkJCVZlcnNpb25SYW5nZSBuZXdSYW5nZSA9IGludGVyc2VjdChjdXJyZW50TWF0Y2gucmVxLmdldFJhbmdlKCksIGN1cnJlbnQuZ2V0UmFuZ2UoKSk7Ci0JCQkJCQkJaWYgKG5ld1JhbmdlICE9IG51bGwpIHsKLQkJCQkJCQkJLy9tZXJnZSB2ZXJzaW9uIHJhbmdlIGFuZCBlbnZpcm9ubWVudCB3aXRoIGV4aXN0aW5nIG1hdGNoCi0JCQkJCQkJCWN1cnJlbnRNYXRjaC5yZXEgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KGN1cnJlbnQuZ2V0TmFtZXNwYWNlKCksIGN1cnJlbnQuZ2V0TmFtZSgpLCBuZXdSYW5nZSwgY3VycmVudC5nZXRGaWx0ZXIoKSwgY3VycmVudE1hdGNoLnJlcS5pc09wdGlvbmFsKCkgJiYgY3VycmVudC5pc09wdGlvbmFsKCksIGZhbHNlKTsKLQkJCQkJCQkJY3VycmVudE1hdGNoLmVudiA9IG1lcmdlRW52aXJvbm1lbnRzKGN1cnJlbnRNYXRjaC5lbnYsIGN1cnJlbnQpOwotCQkJCQkJCQljb250aW51ZSBvdXRlcjsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvL3RoZSBuZXcgbWF0Y2ggaXMgZGlzam9pbnQgZnJvbSBleGlzdGluZyBvbmVzLCBzbyBhZGQgYSBuZXcgbWF0Y2ggdG8gdGhlIGxpc3QKLQkJCQkJCW1hdGNoLmFkZChuZXcgTWF0Y2goY3VycmVudCwgc2VsZWN0aW9uQ29udGV4dCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4dHJhY3RTb2x1dGlvbigpIHsKLQkJc29sdXRpb24gPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKHJlc29sdmVyLmdldEFsbFJlc29sdmVkKCkpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFsbEluc3RhbGxhYmxlVW5pdHMoKSB7Ci0JCWlmIChzb2x1dGlvbiA9PSBudWxsKQotCQkJc29sdXRpb24gPSBuZXcgQXJyYXlMaXN0KDApOwotCQlyZXR1cm4gc29sdXRpb247Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0TmV3SW5zdGFsbGFibGVVbml0cygpIHsKLQkJSGFzaFNldCBuZXdJVXMgPSBuZXcgSGFzaFNldChnZXRBbGxJbnN0YWxsYWJsZVVuaXRzKCkpOwotCQluZXdJVXMucmVtb3ZlQWxsKGFscmVhZHlJbnN0YWxsZWQpOwotCQlyZXR1cm4gbmV3SVVzOwotCX0KLQotCXB1YmxpYyBSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IgZ2V0UmVjb21tZW5kYXRpb25zKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgVmVyc2lvblJhbmdlIGludGVyc2VjdChWZXJzaW9uUmFuZ2UgcjEsIFZlcnNpb25SYW5nZSByMikgewotCQlWZXJzaW9uIHJlc3VsdE1pbiA9IG51bGw7Ci0JCWJvb2xlYW4gcmVzdWx0TWluSW5jbHVkZWQgPSBmYWxzZTsKLQkJVmVyc2lvbiByZXN1bHRNYXggPSBudWxsOwotCQlib29sZWFuIHJlc3VsdE1heEluY2x1ZGVkID0gZmFsc2U7Ci0KLQkJaW50IG1pbkNvbXBhcmUgPSByMS5nZXRNaW5pbXVtKCkuY29tcGFyZVRvKHIyLmdldE1pbmltdW0oKSk7Ci0JCWlmIChtaW5Db21wYXJlIDwgMCkgewotCQkJcmVzdWx0TWluID0gcjIuZ2V0TWluaW11bSgpOwotCQkJcmVzdWx0TWluSW5jbHVkZWQgPSByMi5nZXRJbmNsdWRlTWluaW11bSgpOwotCQl9IGVsc2UgaWYgKG1pbkNvbXBhcmUgPiAwKSB7Ci0JCQlyZXN1bHRNaW4gPSByMS5nZXRNaW5pbXVtKCk7Ci0JCQlyZXN1bHRNaW5JbmNsdWRlZCA9IHIxLmdldEluY2x1ZGVNaW5pbXVtKCk7Ci0JCX0gZWxzZSB7Ly9taW5Db21wYXJlID09IDAKLQkJCXJlc3VsdE1pbiA9IHIxLmdldE1pbmltdW0oKTsKLQkJCXJlc3VsdE1pbkluY2x1ZGVkID0gcjEuZ2V0SW5jbHVkZU1pbmltdW0oKSAmJiByMi5nZXRJbmNsdWRlTWluaW11bSgpOwotCQl9Ci0KLQkJaW50IG1heENvbXBhcmUgPSByMS5nZXRNYXhpbXVtKCkuY29tcGFyZVRvKHIyLmdldE1heGltdW0oKSk7Ci0JCWlmIChtYXhDb21wYXJlID4gMCkgewotCQkJcmVzdWx0TWF4ID0gcjIuZ2V0TWF4aW11bSgpOwotCQkJcmVzdWx0TWF4SW5jbHVkZWQgPSByMi5nZXRJbmNsdWRlTWF4aW11bSgpOwotCQl9IGVsc2UgaWYgKG1heENvbXBhcmUgPCAwKSB7Ci0JCQlyZXN1bHRNYXggPSByMS5nZXRNYXhpbXVtKCk7Ci0JCQlyZXN1bHRNYXhJbmNsdWRlZCA9IHIxLmdldEluY2x1ZGVNYXhpbXVtKCk7Ci0JCX0gZWxzZSB7Ly9tYXhDb21wYXJlID09IDAKLQkJCXJlc3VsdE1heCA9IHIxLmdldE1heGltdW0oKTsKLQkJCXJlc3VsdE1heEluY2x1ZGVkID0gcjEuZ2V0SW5jbHVkZU1heGltdW0oKSAmJiByMi5nZXRJbmNsdWRlTWF4aW11bSgpOwotCQl9Ci0KLQkJaW50IHJlc3VsdFJhbmdlQ29tcGFyaXNvbiA9IHJlc3VsdE1pbi5jb21wYXJlVG8ocmVzdWx0TWF4KTsKLQkJaWYgKHJlc3VsdFJhbmdlQ29tcGFyaXNvbiA8IDApCi0JCQlyZXR1cm4gbmV3IFZlcnNpb25SYW5nZShyZXN1bHRNaW4sIHJlc3VsdE1pbkluY2x1ZGVkLCByZXN1bHRNYXgsIHJlc3VsdE1heEluY2x1ZGVkKTsKLQkJZWxzZSBpZiAocmVzdWx0UmFuZ2VDb21wYXJpc29uID09IDAgJiYgcmVzdWx0TWluSW5jbHVkZWQgPT0gcmVzdWx0TWF4SW5jbHVkZWQpIHsKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHJlc3VsdE1pbiwgcmVzdWx0TWluSW5jbHVkZWQsIHJlc3VsdE1heCwgcmVzdWx0TWF4SW5jbHVkZWQpOwotCQl9IGVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnZva2VSZXNvbHZlcihNdWx0aVN0YXR1cyBwcm9ibGVtcykgewotCQlyZXNvbHZlciA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKHNlbGVjdGlvbkNvbnRleHQsIHJlY29tbWVuZGF0aW9ucyk7Ci0JCVNldCB0b0luc3RhbGwgPSBuZXcgSGFzaFNldChtdXN0LnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBtdXN0LnZhbHVlcygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUxpc3QgYWxsTWF0Y2hlcyA9IChMaXN0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIG1hdGNoZXMgPSBhbGxNYXRjaGVzLml0ZXJhdG9yKCk7IG1hdGNoZXMuaGFzTmV4dCgpOykgewotCQkJCU1hdGNoIGN1cnJlbnQgPSAoTWF0Y2gpIG1hdGNoZXMubmV4dCgpOwotCQkJCXRvSW5zdGFsbC5hZGRBbGwoY3VycmVudC5jYW5kaWRhdGVzKTsKLQkJCX0KLQkJfQotCQl0b0luc3RhbGwucmVtb3ZlQWxsKGFscmVhZHlJbnN0YWxsZWQpOwotCQlVbnNhdGlzZmllZENhcGFiaWxpdHlbXSB1bnNhdGlzZmllZCA9IGNvbGxlY3RVbnNhdGlzZmllZERlcGVuZGVuY2llcyhyZXNvbHZlci5pbnN0YWxsKHRvSW5zdGFsbCwgYWxyZWFkeUluc3RhbGxlZCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuc2F0aXNmaWVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9ibGVtcy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgTkxTLmJpbmQoTWVzc2FnZXMuRGlyZWN0b3JfVW5zYXRpc2ZpZWRfRGVwZW5kZW5jeSwgdW5zYXRpc2ZpZWRbaV0pKSk7Ci0JCX0KLQl9Ci0KLQkvLyBDaGVjayB3aGV0aGVyIHRoZSByZXF1aXJlbWVudCBpcyBhcHBsaWNhYmxlCi0JcHJpdmF0ZSBib29sZWFuIGlzQXBwbGljYWJsZShSZXF1aXJlZENhcGFiaWxpdHkgcmVxKSB7Ci0JCVN0cmluZyBmaWx0ZXIgPSByZXEuZ2V0RmlsdGVyKCk7Ci0JCWlmIChmaWx0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQl0cnkgewotCQkJcmV0dXJuIERpcmVjdG9yQWN0aXZhdG9yLmNvbnRleHQuY3JlYXRlRmlsdGVyKGZpbHRlcikubWF0Y2goc2VsZWN0aW9uQ29udGV4dCk7Ci0JCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQmVjYXVzZSBpbmZvcm1hdGlvbiB0byBkaXNjb3ZlciBhZGRpdGlvbmFsIHRoaW5ncyB0byBpbnN0YWxsIGlzIG1peGVkIHdpdGggaW5mb3JtYXRpb24gCi0JICogYWJvdXQgaW50ZXItY29tcG9uZW50IGRlcGVuZGVuY2llcywgd2UgZW5kIHVwIGhhdmluZyBkZXBlbmRlbmNpZXMgdGhhdCBjYXVzZQotCSAqIHRoZSB3aG9sZSB3b3JsZCB0byBiZSBzZWxlY3RlZC4gV2UgYXJlIGhlcmUgZmlsdGVyaW5nIHRoZW0gb3V0LgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc01ldGEoUmVxdWlyZWRDYXBhYmlsaXR5IHJlcXVpcmVkQ2FwYWJpbGl0eSkgewotCQlTdHJpbmcgbmFtZXNwYWNlID0gcmVxdWlyZWRDYXBhYmlsaXR5LmdldE5hbWVzcGFjZSgpOwotCQkvL1RPRE8gU2hvdWxkIG5vdCByZWZlcmVuY2UgT1NHaSB0b3VjaHBvaW50IGNvbmNlcHRzIGhlcmUKLQkJcmV0dXJuIG5hbWVzcGFjZS5lcXVhbHMoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlIikgfHwgbmFtZXNwYWNlLmVxdWFscyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9GTEFWT1IpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IG1hdGNoKENvbGxlY3Rpb24gY2xvc2UsIElJbnN0YWxsYWJsZVVuaXQgcGlja2VkKSB7Ci0JCUNvbGxlY3RvciByZXN1bHQgPSBuZXcgSGFzTWF0Y2hDb2xsZWN0b3IoKTsKLQkJbmV3IENhcGFiaWxpdHlRdWVyeShwaWNrZWQuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSkucGVyZm9ybShjbG9zZS5pdGVyYXRvcigpLCByZXN1bHQpOwotCQlpZiAoIXJlc3VsdC5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gcGlja2VkOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIERpY3Rpb25hcnkgbWVyZ2VFbnZpcm9ubWVudHMoRGljdGlvbmFyeSBjb250ZXh0LCBSZXF1aXJlZENhcGFiaWxpdHkgbmV3Q2FwYWJpbGl0eSkgewotCQlTdHJpbmdbXSBuZXdTZWxlY3RvcnMgPSBuZXdDYXBhYmlsaXR5LmdldFNlbGVjdG9ycygpOwotCQlpZiAobmV3U2VsZWN0b3JzID09IG51bGwgfHwgbmV3U2VsZWN0b3JzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGNvbnRleHQ7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQljb250ZXh0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQlTdHJpbmcgdHJ1ZVN0cmluZyA9IEJvb2xlYW4uVFJVRS50b1N0cmluZygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1NlbGVjdG9ycy5sZW5ndGg7IGkrKykgewotCQkJY29udGV4dC5wdXQobmV3U2VsZWN0b3JzW2ldLCB0cnVlU3RyaW5nKTsKLQkJfQotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gb25lUmVzb2x2ZWQoQ29sbGVjdGlvbiBpdXMpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGl1cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlpZiAocmVzb2x2ZXIuaXNSZXNvbHZlZCgoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHJlcXVpcmVtZW50RW5hYmxlZChSZXF1aXJlZENhcGFiaWxpdHkgcmVxKSB7Ci0JCWlmIChyZXEuaXNPcHRpb25hbCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaXNBcHBsaWNhYmxlKHJlcSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL09wZXJhdGlvbkdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL09wZXJhdGlvbkdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWE4YTU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9PcGVyYXRpb25HZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLkluc3RhbGxhYmxlVW5pdE9wZXJhbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBPcGVyYXRpb25HZW5lcmF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElJbnN0YWxsYWJsZVVuaXQgTlVMTF9JVSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXNvbHZlZEluc3RhbGxhYmxlVW5pdChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KG5ldyBJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpKSwgbmV3IElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFswXSk7Ci0KLQlwdWJsaWMgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIGdlbmVyYXRlT3BlcmF0aW9uKENvbGxlY3Rpb24gZnJvbV8sIENvbGxlY3Rpb24gdG9fKSB7Ci0JCUxpc3QgZnJvbSA9IG5ldyBBcnJheUxpc3QoZnJvbV8pOwotCQlDb2xsZWN0aW9ucy5zb3J0KGZyb20pOwotCi0JCUxpc3QgdG8gPSBuZXcgQXJyYXlMaXN0KHRvXyk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQodG8pOwotCi0JCUFycmF5TGlzdCBvcGVyYXRpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlnZW5lcmF0ZVVwZGF0ZXMoZnJvbSwgdG8sIG9wZXJhdGlvbnMpOwotCQlnZW5lcmF0ZUluc3RhbGxVbmluc3RhbGwoZnJvbSwgdG8sIG9wZXJhdGlvbnMpOwotCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10gb3BzID0gKEluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSkgb3BlcmF0aW9ucy50b0FycmF5KG5ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW29wZXJhdGlvbnMuc2l6ZSgpXSk7Ci0JCXJldHVybiBvcHM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlSW5zdGFsbFVuaW5zdGFsbChMaXN0IGZyb20sIExpc3QgdG8sIEFycmF5TGlzdCBvcGVyYXRpb25zKSB7Ci0JCWludCB0b0lkeCA9IDA7Ci0JCWludCBmcm9tSWR4ID0gMDsKLQkJd2hpbGUgKGZyb21JZHggIT0gZnJvbS5zaXplKCkgJiYgdG9JZHggIT0gdG8uc2l6ZSgpKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGZyb21JVSA9IChJSW5zdGFsbGFibGVVbml0KSBmcm9tLmdldChmcm9tSWR4KTsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgdG9JVSA9IChJSW5zdGFsbGFibGVVbml0KSB0by5nZXQodG9JZHgpOwotCQkJaW50IGNvbXBhcmlzb24gPSB0b0lVLmNvbXBhcmVUbyhmcm9tSVUpOwotCQkJaWYgKGNvbXBhcmlzb24gPCAwKSB7Ci0JCQkJb3BlcmF0aW9ucy5hZGQoY3JlYXRlSW5zdGFsbE9wZXJhdGlvbih0b0lVKSk7Ci0JCQkJdG9JZHgrKzsKLQkJCX0gZWxzZSBpZiAoY29tcGFyaXNvbiA9PSAwKSB7Ci0JCQkJdG9JZHgrKzsKLQkJCQlmcm9tSWR4Kys7Ci0JCQkJLy8JCQkJU3lzdGVtLm91dC5wcmludGxuKCJzYW1lICIgKyBmcm9tSVUpOwotCQkJfSBlbHNlIHsKLQkJCQlvcGVyYXRpb25zLmFkZChjcmVhdGVVbmluc3RhbGxPcGVyYXRpb24oZnJvbUlVKSk7Ci0JCQkJZnJvbUlkeCsrOwotCQkJfQotCQl9Ci0JCWlmIChmcm9tSWR4ICE9IGZyb20uc2l6ZSgpKSB7Ci0JCQlmb3IgKGludCBpID0gZnJvbUlkeDsgaSA8IGZyb20uc2l6ZSgpOyBpKyspIHsKLQkJCQlvcGVyYXRpb25zLmFkZChjcmVhdGVVbmluc3RhbGxPcGVyYXRpb24oKElJbnN0YWxsYWJsZVVuaXQpIGZyb20uZ2V0KGkpKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRvSWR4ICE9IHRvLnNpemUoKSkgewotCQkJZm9yIChpbnQgaSA9IHRvSWR4OyBpIDwgdG8uc2l6ZSgpOyBpKyspIHsKLQkJCQlvcGVyYXRpb25zLmFkZChjcmVhdGVJbnN0YWxsT3BlcmF0aW9uKChJSW5zdGFsbGFibGVVbml0KSB0by5nZXQoaSkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZVVwZGF0ZXMoTGlzdCBmcm9tLCBMaXN0IHRvLCBBcnJheUxpc3Qgb3BlcmF0aW9ucykgewotCQlTZXQgcHJvY2Vzc2VkID0gbmV3IEhhc2hTZXQoKTsKLQkJU2V0IHJlbW92ZWRGcm9tVG8gPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKGludCB0b0lkeCA9IDA7IHRvSWR4IDwgdG8uc2l6ZSgpOyB0b0lkeCsrKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1VG8gPSAoSUluc3RhbGxhYmxlVW5pdCkgdG8uZ2V0KHRvSWR4KTsKLQkJCWlmIChpdVRvLmdldElkKCkuZXF1YWxzKG5leHQoZnJvbSwgdG9JZHgpLmdldElkKCkpKSB7Ci0JCQkJdG9JZHggPSBza2lwKHRvLCBpdVRvLCB0b0lkeCkgLSAxOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJDYW4ndCB1cGRhdGUgIiArIGl1VG8gKyAiIGJlY2F1c2UgYW5vdGhlciBpdSB3aXRoIHNhbWUgaWQgaXMgaW4gdGhlIHRhcmdldCBzdGF0ZSIpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGl1VG8uZ2V0VXBkYXRlRGVzY3JpcHRvcigpID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQkvL3doZW4gdGhlIHVpIHdlIHVwZGF0ZSBmcm9tIGlzIGluIHRoZSBuZXcgc3RhdGUsIHNraXAgKGZvciBleGFtcGxlIEZST00gaXMgQSwgQywgQiAmIFRPIGlzIEMgKHVwZGF0ZSBvZiAKLQkJCUluc3RhbGxhYmxlVW5pdFF1ZXJ5IHVwZGF0ZVF1ZXJ5ID0gbmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KGl1VG8uZ2V0VXBkYXRlRGVzY3JpcHRvcigpLmdldElkKCksIGl1VG8uZ2V0VXBkYXRlRGVzY3JpcHRvcigpLmdldFJhbmdlKCkpOwotCQkJSXRlcmF0b3IgdXBkYXRlcyA9IHVwZGF0ZVF1ZXJ5LnBlcmZvcm0oZnJvbS5pdGVyYXRvcigpLCBuZXcgQ29sbGVjdG9yKCkpLml0ZXJhdG9yKCk7Ci0KLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXVGcm9tOwotCQkJaWYgKCF1cGRhdGVzLmhhc05leHQoKSkgeyAvL05vdGhpbmcgdG8gdXBkYXRlIGZyb20uCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpdUZyb20gPSAoSUluc3RhbGxhYmxlVW5pdCkgdXBkYXRlcy5uZXh0KCk7Ci0JCQlpZiAodXBkYXRlcy5oYXNOZXh0KCkpIHsgLy9UaGVyZSBhcmUgbXVsdGlwbGUgSVVzIHRvIHVwZGF0ZSBmcm9tCi0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oIkNhbid0IHVwZGF0ZSAgIiArIGl1VG8gKyAiIGJlY2F1c2UgdGhlcmUgYXJlIG11bHRpcGxlIElVcyB0byB1cGRhdGUgZnJvbSAoIiArIHRvU3RyaW5nKGl1c0Zyb20pICsgJyknKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChpdVRvLmVxdWFscyhpdUZyb20pKSB7Ci0JCQkJZnJvbS5yZW1vdmUoaXVGcm9tKTsKLQkJCQlyZW1vdmVkRnJvbVRvLmFkZChpdVRvKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCW9wZXJhdGlvbnMuYWRkKGNyZWF0ZVVwZGF0ZU9wZXJhdGlvbihpdUZyb20sIGl1VG8pKTsKLQkJCWZyb20ucmVtb3ZlKGl1RnJvbSk7Ci0JCQlwcm9jZXNzZWQuYWRkKGl1VG8pOwotCQl9Ci0JCXRvLnJlbW92ZUFsbChwcm9jZXNzZWQpOwotCQl0by5yZW1vdmVBbGwocmVtb3ZlZEZyb21Ubyk7Ci0JfQotCi0JcHJpdmF0ZSBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIGNyZWF0ZVVuaW5zdGFsbE9wZXJhdGlvbihJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCXJldHVybiBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZChpdSwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIGNyZWF0ZUluc3RhbGxPcGVyYXRpb24oSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlyZXR1cm4gbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmQobnVsbCwgaXUpOwotCX0KLQotCXByaXZhdGUgSW5zdGFsbGFibGVVbml0T3BlcmFuZCBjcmVhdGVVcGRhdGVPcGVyYXRpb24oSUluc3RhbGxhYmxlVW5pdCBmcm9tLCBJSW5zdGFsbGFibGVVbml0IHRvKSB7Ci0JCXJldHVybiBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZChmcm9tLCB0byk7Ci0JfQotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IG5leHQoTGlzdCBsLCBpbnQgaSkgewotCQlpKys7Ci0JCWlmIChpID49IGwuc2l6ZSgpKQotCQkJcmV0dXJuIE5VTExfSVU7Ci0JCXJldHVybiAoSUluc3RhbGxhYmxlVW5pdCkgbC5nZXQoaSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgc2tpcChMaXN0IGMsIElJbnN0YWxsYWJsZVVuaXQgaWQsIGludCBpZHgpIHsKLQkJaW50IGkgPSBpZHg7Ci0JCWZvciAoOyBpIDwgYy5zaXplKCk7IGkrKykgewotCQkJaWYgKCFpZC5nZXRJZCgpLmVxdWFscygoKElJbnN0YWxsYWJsZVVuaXQpIGMuZ2V0KGlkeCkpLmdldElkKCkpKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiBpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9QYXRjaGluZ0lVLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUGF0Y2hpbmdJVS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzI4Zjk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9QYXRjaGluZ0lVLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5SZXF1aXJlZENhcGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLQotcHVibGljIGNsYXNzIFBhdGNoaW5nSVUgZXh0ZW5kcyBRdWVyeSB7Ci0KLQlwdWJsaWMgUGF0Y2hpbmdJVShSZXF1aXJlZENhcGFiaWxpdHkgcmVxKSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNYXRjaChPYmplY3QgY2FuZGlkYXRlKSB7Ci0JCWlmICghKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIElJbnN0YWxsYWJsZVVuaXQpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgY2FuZGlkYXRlOwotCQlpZiAoaXUuZ2V0UHJvcGVydHkoInBhdGNoIikuZXF1YWxzKCJ0cnVlIikpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGhhc0FwcGxpY2FibGVQYXRjaChpdSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc0FwcGxpY2FibGVQYXRjaChJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCS8vaXUuZ2V0UGF0Y2hlcwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUGlja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUGlja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYjcxNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1BpY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci0KLS8vVGhlIHBpY2tlcnMgZ29hbCBpcyB0byBmaW5kIGFuIGluc3RhbGxhYmxlIHVuaXQgdGhhdCBzYXRpc2ZpZXMgYSBzZWFyY2ggY3JpdGVyaWEgCi0vL1RPRE8gd2UgbWF5IG5lZWQgYWRkaXRpb25hbCB2YXJpYXRpb25zIG9mIHRoZXNlIG1ldGhvZCB3aGVyZSB2ZXJzaW9uIGNhbiBiZSBudWxsLCBvciB3aGVyZSB0aGUgc2VhcmNoIHJldHVybnMgYWxsIHRoZSBtYXRjaCwgbm90IGp1c3QgdGhlIGZpcnN0IG9uZQotLy9UT0RPIGRvIHdlIHdhbnQgYSBmYWNpbGl0eSB0byBsaW1pdCB0aGUgc2VhcmNoaW5nIHNwYWNlLCBvciBkbyB3ZSBhc3N1bWUgdGhhdCB0aGUgdW5pdHNUb1BpY2tGcm9tIGhhcyBhbHJlYWR5IGJlZW4gc2NvcGVkIAotcHVibGljIGNsYXNzIFBpY2tlciB7Ci0JLy9UT0RPIHdlJ2xsIGxpa2VseSBuZWVkIGJldHRlciBpbmRleGluZyBjYXBhYmlsaXRpZXMKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXRbXSBwcmVmZXJyZWRTZXQ7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0W10gY29tcGxldGVTZXQ7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0W10gc2Vjb25kQ2hvaWNlU2V0OwotCXByaXZhdGUgUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yIHJlY29tbWVuZGF0aW9uczsKLQotCXByaXZhdGUgTGlzdCBmaWx0ZXJzOwotCi0JcHVibGljIFBpY2tlcihJSW5zdGFsbGFibGVVbml0W10gdW5pdHNUb1BpY2tGcm9tLCBSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IgcmVjb21tZW5kYXRpb25zKSB7Ci0JCWlmICh1bml0c1RvUGlja0Zyb20gIT0gbnVsbCkKLQkJCWNvbXBsZXRlU2V0ID0gdW5pdHNUb1BpY2tGcm9tOwotCQllbHNlCi0JCQljb21wbGV0ZVNldCA9IG5ldyBJSW5zdGFsbGFibGVVbml0WzBdOwotCQl0aGlzLnNlY29uZENob2ljZVNldCA9IGNvbXBsZXRlU2V0OwotCQl0aGlzLnJlY29tbWVuZGF0aW9ucyA9IHJlY29tbWVuZGF0aW9uczsKLQkJdGhpcy5maWx0ZXJzID0gbmV3IEFycmF5TGlzdCgyKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbltdIGZpbmRJbnN0YWxsYWJsZVVuaXQoU3RyaW5nIGlkLCBWZXJzaW9uUmFuZ2UgcmFuZ2UsIFJlcXVpcmVkQ2FwYWJpbGl0eSBzZWFyY2hlZENhcGFiaWxpdHkpIHsKLQkJSUluc3RhbGxhYmxlVW5pdFtdW10gdG1wID0gZmluZEluc3RhbGxhYmxlVW5pdChpZCwgcmFuZ2UsIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7c2VhcmNoZWRDYXBhYmlsaXR5fSwgZmFsc2UpOwotCQlyZXR1cm4gbmV3IENvbGxlY3Rpb25bXSB7QXJyYXlzLmFzTGlzdCh0bXBbMF0pLCBBcnJheXMuYXNMaXN0KHRtcFsxXSl9OwotCX0KLQotCXB1YmxpYyB2b2lkIHByZWZlcihDb2xsZWN0aW9uIGZpbHRlcnNUb0FkZCkgewotCQlpZiAoIWZpbHRlcnMuYWRkQWxsKGZpbHRlcnNUb0FkZCkpCi0JCQlyZXR1cm47Ci0JCWlmIChmaWx0ZXJzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuOwotCQlTZXQgcHJlZmVycmVkSVVzID0gbmV3IEhhc2hTZXQoY29tcGxldGVTZXQubGVuZ3RoKTsKLQkJU2V0IHNlY29uZENob2ljZSA9IG5ldyBIYXNoU2V0KGNvbXBsZXRlU2V0Lmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29tcGxldGVTZXQubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBmaWx0ZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlpZiAoKChJVUZpbHRlcikgaXRlcmF0b3IubmV4dCgpKS5hY2NlcHQoY29tcGxldGVTZXRbaV0pKSB7Ci0JCQkJCXByZWZlcnJlZElVcy5hZGQoY29tcGxldGVTZXRbaV0pOwotCQkJCQljb250aW51ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlzZWNvbmRDaG9pY2UuYWRkKGNvbXBsZXRlU2V0W2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHJlZmVycmVkU2V0ID0gKElJbnN0YWxsYWJsZVVuaXRbXSkgcHJlZmVycmVkSVVzLnRvQXJyYXkobmV3IElJbnN0YWxsYWJsZVVuaXRbcHJlZmVycmVkSVVzLnNpemUoKV0pOwotCQlzZWNvbmRDaG9pY2VTZXQgPSAoSUluc3RhbGxhYmxlVW5pdFtdKSBzZWNvbmRDaG9pY2UudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFtzZWNvbmRDaG9pY2Uuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXRbXVtdIGZpbmRJbnN0YWxsYWJsZVVuaXQoU3RyaW5nIGlkLCBWZXJzaW9uUmFuZ2UgcmFuZ2UsIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHNlYXJjaGVkQ2FwYWJpbGl0eSwgYm9vbGVhbiBmcmFnbWVudHNPbmx5KSB7Ci0JCXJldHVybiBuZXcgSUluc3RhbGxhYmxlVW5pdFtdW10ge2ZpbmRJbnN0YWxsYWJsZVVuaXQocHJlZmVycmVkU2V0LCBpZCwgcmFuZ2UsIHNlYXJjaGVkQ2FwYWJpbGl0eSwgZnJhZ21lbnRzT25seSksIGZpbmRJbnN0YWxsYWJsZVVuaXQoc2Vjb25kQ2hvaWNlU2V0LCBpZCwgcmFuZ2UsIHNlYXJjaGVkQ2FwYWJpbGl0eSwgZnJhZ21lbnRzT25seSl9OwotCX0KLQotCS8vVE9ETyB3aGF0IHNob3VsZCBiZSB0aGUgcmV0dXJuIHZhbHVlIHdoZW4gYWxsIHRoZSBwYXJhbWV0ZXJzIGFyZSBudWxsLiBJcyBpdCBldmVuIGEgdmFsaWQgY2FsbD8KLQkvL1RPRE8gQSBsb3Qgb2YgaW1wcm92ZW1lbnQgY291bGQgYmUgZG9uZSBvbiB0aGlzIGFsZ29yaXRobSwgZm9yIGV4YW1wbGUKLQkvLyAtIHJlbW92ZSBmcm9tIHRoZSBzZXQgb2Ygc2VhcmNoZWRDYXBhYmlsaXR5IHRoZSBvbmUgdGhhdCBhcmUgZm91bmQKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXRbXSBmaW5kSW5zdGFsbGFibGVVbml0KElJbnN0YWxsYWJsZVVuaXRbXSBwb29sLCBTdHJpbmcgaWQsIFZlcnNpb25SYW5nZSByYW5nZSwgUmVxdWlyZWRDYXBhYmlsaXR5W10gc2VhcmNoZWRDYXBhYmlsaXR5LCBib29sZWFuIGZyYWdtZW50c09ubHkpIHsKLQkJaWYgKHBvb2wgPT0gbnVsbCB8fCBwb29sLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIG5ldyBJSW5zdGFsbGFibGVVbml0WzBdOwotCQlTZXQgY2FuZGlkYXRlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJLy9GaWx0ZXIgb24gcGx1Z2luIGlkIGFuZCByYW5nZQotCQlpZiAoaWQgIT0gbnVsbCAmJiByYW5nZSAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBvb2wubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocG9vbFtpXS5nZXRJZCgpLmVxdWFscyhpZCkgJiYgcmFuZ2UuaXNJbmNsdWRlZChwb29sW2ldLmdldFZlcnNpb24oKSkpCi0JCQkJCWNhbmRpZGF0ZXMuYWRkKHBvb2xbaV0pOwotCQkJfQotCQkJcG9vbCA9IChJSW5zdGFsbGFibGVVbml0W10pIGNhbmRpZGF0ZXMudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFtjYW5kaWRhdGVzLnNpemUoKV0pOwotCQl9Ci0KLQkJLy9GaWx0ZXIgb24gY2FwYWJpbGl0aWVzLgotCQlpZiAoc2VhcmNoZWRDYXBhYmlsaXR5ICE9IG51bGwpIHsKLQkJCXNlYXJjaGVkQ2FwYWJpbGl0eSA9IHJld3JpdGUoc2VhcmNoZWRDYXBhYmlsaXR5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcG9vbC5sZW5ndGg7IGkrKykgewotCQkJCUlJbnN0YWxsYWJsZVVuaXQgY2FuZGlkYXRlID0gcG9vbFtpXTsKLQkJCQlmb3IgKGludCBrID0gMDsgayA8IHNlYXJjaGVkQ2FwYWJpbGl0eS5sZW5ndGg7IGsrKykgewotCQkJCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCQkJCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIGNhcGFiaWxpdGllcyA9IGNhbmRpZGF0ZS5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpOwotCQkJCQlpZiAoY2FwYWJpbGl0aWVzLmxlbmd0aCA9PSAwKQotCQkJCQkJdmFsaWQgPSBmYWxzZTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjYXBhYmlsaXRpZXMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCWlmICgoc2VhcmNoZWRDYXBhYmlsaXR5W2tdLmdldE5hbWUoKS5lcXVhbHMoY2FwYWJpbGl0aWVzW2pdLmdldE5hbWUoKSkgJiYgc2VhcmNoZWRDYXBhYmlsaXR5W2tdLmdldE5hbWVzcGFjZSgpLmVxdWFscyhjYXBhYmlsaXRpZXNbal0uZ2V0TmFtZXNwYWNlKCkpICYmIChzZWFyY2hlZENhcGFiaWxpdHlba10uZ2V0UmFuZ2UoKSA9PSBudWxsID8gdHJ1ZSA6IHNlYXJjaGVkQ2FwYWJpbGl0eVtrXS5nZXRSYW5nZSgpLmlzSW5jbHVkZWQoY2FwYWJpbGl0aWVzW2pdLmdldFZlcnNpb24oKSkpKSkgeyAvL1RPRE8gTmVlZCB0byBkZWFsIHdpdGggb3B0aW9uCi0JCQkJCQkJdmFsaWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICh2YWxpZCAmJiAoIWZyYWdtZW50c09ubHkgfHwgY2FuZGlkYXRlLmlzRnJhZ21lbnQoKSkpIHsKLQkJCQkJCWNhbmRpZGF0ZXMuYWRkKGNhbmRpZGF0ZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlwb29sID0gKElJbnN0YWxsYWJsZVVuaXRbXSkgY2FuZGlkYXRlcy50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W2NhbmRpZGF0ZXMuc2l6ZSgpXSk7Ci0JCX0KLQotCQlyZXR1cm4gcG9vbDsKLQl9Ci0KLQlwcml2YXRlIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJld3JpdGUoUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZWRDYXBhYmlsaXRpZXMpIHsKLQkJaWYgKHJlY29tbWVuZGF0aW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIHJlcXVpcmVkQ2FwYWJpbGl0aWVzOwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXN1bHQgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W3JlcXVpcmVkQ2FwYWJpbGl0aWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWlyZWRDYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IGdldFJlY29tbWVuZGF0aW9uKHJlcXVpcmVkQ2FwYWJpbGl0aWVzW2ldKTsKLQkJCWlmIChyZXN1bHRbaV0gPT0gbnVsbCkKLQkJCQlyZXN1bHRbaV0gPSByZXF1aXJlZENhcGFiaWxpdGllc1tpXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgUmVxdWlyZWRDYXBhYmlsaXR5IGdldFJlY29tbWVuZGF0aW9uKFJlcXVpcmVkQ2FwYWJpbGl0eSBtYXRjaCkgewotCQlSZWNvbW1lbmRhdGlvbiBmb3VuZFJlY29tbWVuZGF0aW9uID0gcmVjb21tZW5kYXRpb25zLmZpbmRSZWNvbW1lbmRhdGlvbihtYXRjaCk7Ci0JCXJldHVybiBmb3VuZFJlY29tbWVuZGF0aW9uICE9IG51bGwgPyBmb3VuZFJlY29tbWVuZGF0aW9uLm5ld1ZhbHVlKCkgOiBtYXRjaDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUHJvamVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUHJvamVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZDA0NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1Byb2plY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJRGFuaWVsIExlIEJlcnJlIC0gRml4IGluIHRoZSBlbmNvZGluZyBhbmQgdGhlIG9wdGltaXphdGlvbiBmdW5jdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5LkNhcGFiaWxpdHlRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuSVF1ZXJ5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5JbnZhbGlkU3ludGF4RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zYXQ0ai5wYi5JUEJTb2x2ZXI7Ci1pbXBvcnQgb3JnLnNhdDRqLnBiLlNvbHZlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnNhdDRqLnBiLnJlYWRlci5PUEJFY2xpcHNlUmVhZGVyMjAwNzsKLWltcG9ydCBvcmcuc2F0NGoucmVhZGVyLlBhcnNlRm9ybWF0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5zYXQ0ai5zcGVjcy4qOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIFNBVDRKIGFuZCB0aGUgcGxhbm5lci4gSXQgcHJvZHVjZXMgYQotICogYm9vbGVhbiBzYXRpc2ZpYWJpbGl0eSBwcm9ibGVtLCBpbnZva2VzIHRoZSBzb2x2ZXIsIGFuZCBjb252ZXJ0cyB0aGUgc29sdmVyIHJlc3VsdAotICogYmFjayBpbnRvIGluZm9ybWF0aW9uIHVuZGVyc3RhbmRhYmxlIGJ5IHRoZSBwbGFubmVyLgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJpdmF0ZSBJUXVlcnlhYmxlIHBpY2tlcjsKLQotCXByaXZhdGUgTWFwIHZhcmlhYmxlczsgLy9rZXkgSVUsIHZhbHVlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgaW4gdGhlIHByb2JsZW0KLQlwcml2YXRlIE1hcCBub29wVmFyaWFibGVzOyAvL2tleSBJVSwgdmFsdWUgY29ycmVzcG9uZGluZyBubyBvcHRpb25hbGl0eSB2YXJpYWJsZSBpbiB0aGUgcHJvYmxlbSwgCi0JcHJpdmF0ZSBMaXN0IGFic3RyYWN0VmFyaWFibGVzOwotCXByaXZhdGUgTGlzdCBhYnN0cmFjdFZhcnNGb3JQYXRjaGVzOwotCi0JcHJpdmF0ZSBUd29UaWVyTWFwIHNsaWNlOyAvL1RoZSBJVXMgdGhhdCBoYXZlIGJlZW4gY29uc2lkZXJlZCB0byBiZSBwYXJ0IG9mIHRoZSBwcm9ibGVtCi0KLQlwcml2YXRlIERpY3Rpb25hcnkgc2VsZWN0aW9uQ29udGV4dDsKLQotCXByaXZhdGUgaW50IHZhckNvdW50ID0gMTsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGNvbnN0cmFpbnRzOwotCXByaXZhdGUgQXJyYXlMaXN0IGRlcGVuZGVuY2llczsKLQlwcml2YXRlIEFycmF5TGlzdCB0YXV0b2xvZ2llczsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBvYmplY3RpdmU7Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZXhwbGFuYXRpb24gPSBuZXcgU3RyaW5nQnVmZmVyKCJleHBsYWluOiAiKTsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgQ29sbGVjdGlvbiBzb2x1dGlvbjsKLQotCXByaXZhdGUgRmlsZSBwcm9ibGVtRmlsZTsKLQlwcml2YXRlIE11bHRpU3RhdHVzIHJlc3VsdDsKLQotCXByaXZhdGUgaW50IGNvbW1lbnRzQ291bnQgPSAwOwotCi0JcHVibGljIFByb2plY3RvcihJUXVlcnlhYmxlIHEsIERpY3Rpb25hcnkgY29udGV4dCkgewotCQlwaWNrZXIgPSBxOwotCQl2YXJpYWJsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlub29wVmFyaWFibGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJc2xpY2UgPSBuZXcgVHdvVGllck1hcCgpOwotCQljb25zdHJhaW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJdGF1dG9sb2dpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWRlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJc2VsZWN0aW9uQ29udGV4dCA9IGNvbnRleHQ7Ci0JCWFic3RyYWN0VmFyaWFibGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlhYnN0cmFjdFZhcnNGb3JQYXRjaGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMoRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIElTdGF0dXMuT0ssIE1lc3NhZ2VzLlBsYW5uZXJfUHJvYmxlbXNfcmVzb2x2aW5nX3BsYW4sIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuY29kZShJSW5zdGFsbGFibGVVbml0W10gaXVzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWxvbmcgc3RhcnQgPSAwOwotCQkJaWYgKERFQlVHKSB7Ci0JCQkJc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0IHByb2plY3Rpb246ICIgKyBzdGFydCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJSXRlcmF0b3IgaXVzVG9FbmNvZGUgPSBwaWNrZXIucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLml0ZXJhdG9yKCk7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlMaXN0IGl1c1RvT3JkZXIgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJd2hpbGUgKGl1c1RvRW5jb2RlLmhhc05leHQoKSkgewotCQkJCQlpdXNUb09yZGVyLmFkZChpdXNUb0VuY29kZS5uZXh0KCkpOwotCQkJCX0KLQkJCQlDb2xsZWN0aW9ucy5zb3J0KGl1c1RvT3JkZXIpOwotCQkJCWl1c1RvRW5jb2RlID0gaXVzVG9PcmRlci5pdGVyYXRvcigpOwotCQkJfQotCQkJd2hpbGUgKGl1c1RvRW5jb2RlLmhhc05leHQoKSkgewotCQkJCXByb2Nlc3NJVSgoSUluc3RhbGxhYmxlVW5pdCkgaXVzVG9FbmNvZGUubmV4dCgpKTsKLQkJCX0KLQkJCWNyZWF0ZUNvbnN0cmFpbnRzRm9yU2luZ2xldG9uKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl1cy5sZW5ndGg7IGkrKykgewotCQkJCWNyZWF0ZU11c3RIYXZlcyhpdXNbaV0pOwotCQkJfQotCQkJY3JlYXRlT3B0aW1pemF0aW9uRnVuY3Rpb24oKTsKLQkJCXBlcnNpc3QoKTsKLQkJCWlmIChERUJVRykgewotCQkJCWxvbmcgc3RvcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvamVjdGlvbiBjb21wbGV0ZTogIiArIChzdG9wIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQl9Ci0JfQotCi0JLy8gdHJhbnNsYXRlcyBhIC0+IC1iIGludG8gcHNldWRvIGJvb2xlYW4KLQlwcml2YXRlIFN0cmluZyBpbXBsaWVzTm8oU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCXJldHVybiAiLTEgIiArIGEgKyAiIC0xICIgKyBiICsgIj49IC0xIDsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXByaXZhdGUgU3RyaW5nIGltcGxpZXMoU3RyaW5nIGEsIFN0cmluZyBiKSB7Ci0JCXJldHVybiAiLTEgIiArIGEgKyAiICsxICIgKyBiICsgIj49IC0xIDsiOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JLy9DcmVhdGUgYW4gb3B0aW1pemF0aW9uIGZ1bmN0aW9uIGZhdm9yaW5nIHRoZSBoaWdoZXN0IHZlcnNpb24gb2YgZWFjaCBJVSAgCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU9wdGltaXphdGlvbkZ1bmN0aW9uKCkgewotCQlmaW5hbCBTdHJpbmcgTUlOX1NUUiA9ICJtaW46IjsgLy8kTk9OLU5MUy0xJAotCi0JCW9iamVjdGl2ZSA9IG5ldyBTdHJpbmdCdWZmZXIoTUlOX1NUUik7Ci0JCVNldCBzID0gc2xpY2UuZW50cnlTZXQoKTsKLQkJZmluYWwgaW50IFBPV0VSID0gMjsKLQotCQlsb25nIG1heFdlaWdodCA9IFBPV0VSOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlIYXNoTWFwIGNvbmZsaWN0aW5nRW50cmllcyA9IChIYXNoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKGNvbmZsaWN0aW5nRW50cmllcy5zaXplKCkgPT0gMSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJTGlzdCB0b1NvcnQgPSBuZXcgQXJyYXlMaXN0KGNvbmZsaWN0aW5nRW50cmllcy52YWx1ZXMoKSk7Ci0JCQlDb2xsZWN0aW9ucy5zb3J0KHRvU29ydCwgQ29sbGVjdGlvbnMucmV2ZXJzZU9yZGVyKCkpOwotCQkJbG9uZyB3ZWlnaHQgPSBQT1dFUjsKLQkJCWludCBjb3VudCA9IHRvU29ydC5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlvYmplY3RpdmUuYXBwZW5kKCcgJykuYXBwZW5kKHdlaWdodCkuYXBwZW5kKCcgJykuYXBwZW5kKGdldFZhcmlhYmxlKChJSW5zdGFsbGFibGVVbml0KSB0b1NvcnQuZ2V0KGkpKSk7Ci0JCQkJd2VpZ2h0ICo9IFBPV0VSOwotCQkJfQotCQkJaWYgKHdlaWdodCA+IG1heFdlaWdodCkKLQkJCQltYXhXZWlnaHQgPSB3ZWlnaHQ7Ci0JCX0KLQotCQltYXhXZWlnaHQgKj0gUE9XRVI7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5vb3BWYXJpYWJsZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJb2JqZWN0aXZlLmFwcGVuZCgnICcpLmFwcGVuZChtYXhXZWlnaHQpLmFwcGVuZCgnICcpLmFwcGVuZChpdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQltYXhXZWlnaHQgKj0gUE9XRVI7Ci0KLQkJLy9BZGQgdGhlIGFic3RyYWN0IHZhcmlhYmxlcwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWJzdHJhY3RWYXJpYWJsZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJb2JqZWN0aXZlLmFwcGVuZCgiIC0iKS5hcHBlbmQobWF4V2VpZ2h0KS5hcHBlbmQoIiAiKS5hcHBlbmQoKFN0cmluZykgaXRlcmF0b3IubmV4dCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlpZiAoTUlOX1NUUi5lcXVhbHMob2JqZWN0aXZlLnRvU3RyaW5nKCkpKSB7Ci0JCQlvYmplY3RpdmUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlvYmplY3RpdmUuYXBwZW5kKCIgOyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTXVzdEhhdmVzKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJdGF1dG9sb2dpZXMuYWRkKCIgKzEgIiArIGdldFZhcmlhYmxlKGl1KSArICIgPSAxOyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTmVnYXRpb24oSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQljcmVhdGVOZWdhdGlvbihnZXRWYXJpYWJsZShpdSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVOZWdhdGlvbihTdHJpbmcgdmFyKSB7Ci0JCXRhdXRvbG9naWVzLmFkZCgiICsxIiArIHZhciArICIgPSAwOyIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCX0KLQotCS8vIENoZWNrIHdoZXRoZXIgdGhlIHJlcXVpcmVtZW50IGlzIGFwcGxpY2FibGUKLQlwcml2YXRlIGJvb2xlYW4gaXNBcHBsaWNhYmxlKFJlcXVpcmVkQ2FwYWJpbGl0eSByZXEpIHsKLQkJU3RyaW5nIGZpbHRlciA9IHJlcS5nZXRGaWx0ZXIoKTsKLQkJaWYgKGZpbHRlciA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dC5jcmVhdGVGaWx0ZXIoZmlsdGVyKS5tYXRjaChzZWxlY3Rpb25Db250ZXh0KTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvL1dyaXRlIHRoZSBwcm9ibGVtIGdlbmVyYXRlZCBpbnRvIGEgdGVtcG9yYXJ5IGZpbGUKLQlwcml2YXRlIHZvaWQgcGVyc2lzdCgpIHsKLQkJdHJ5IHsKLQkJCXByb2JsZW1GaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgicDJFbmNvZGluZyIsICIub3BiIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQlCdWZmZXJlZFdyaXRlciB3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKHByb2JsZW1GaWxlKSk7Ci0JCQlpbnQgY2xhdXNlQ291bnQgPSB0YXV0b2xvZ2llcy5zaXplKCkgKyBkZXBlbmRlbmNpZXMuc2l6ZSgpICsgY29uc3RyYWludHMuc2l6ZSgpIC0gY29tbWVudHNDb3VudDsKLQotCQkJdy53cml0ZSgiKiAjdmFyaWFibGU9ICIgKyB2YXJDb3VudCArICIgI2NvbnN0cmFpbnQ9ICIgKyBjbGF1c2VDb3VudCArICIgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJdy5uZXdMaW5lKCk7Ci0JCQl3LndyaXRlKCIqIik7IC8vJE5PTi1OTFMtMSQKLQkJCXcubmV3TGluZSgpOwotCQkJZGlzcGxheU1hcHBpbmdJbkNvbW1lbnRzKHcpOwotCQkJaWYgKGNsYXVzZUNvdW50ID09IDApIHsKLQkJCQl3LmNsb3NlKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJdy53cml0ZShvYmplY3RpdmUudG9TdHJpbmcoKSk7Ci0JCQl3Lm5ld0xpbmUoKTsKLQkJCXcubmV3TGluZSgpOwotCQkJdy53cml0ZShleHBsYW5hdGlvbiArICIgOyIpOyAvLyROT04tTkxTLTEkCi0JCQl3Lm5ld0xpbmUoKTsKLQkJCXcubmV3TGluZSgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGVwZW5kZW5jaWVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQl3LndyaXRlKChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKSk7Ci0JCQkJdy5uZXdMaW5lKCk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29uc3RyYWludHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCXcud3JpdGUoKFN0cmluZykgaXRlcmF0b3IubmV4dCgpKTsKLQkJCQl3Lm5ld0xpbmUoKTsKLQkJCX0KLQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0YXV0b2xvZ2llcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJdy53cml0ZSgoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCkpOwotCQkJCXcubmV3TGluZSgpOwotCQkJfQotCQkJdy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIE5MUy5iaW5kKE1lc3NhZ2VzLlBsYW5uZXJfRXJyb3Jfc2F2aW5nX29wYmZpbGUsIHByb2JsZW1GaWxlKSwgZSkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlNYXBwaW5nSW5Db21tZW50cyhCdWZmZXJlZFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoIURFQlVHKQotCQkJcmV0dXJuOwotCQlMaXN0IHZhcnMgPSBuZXcgQXJyYXlMaXN0KHZhcmlhYmxlcy5rZXlTZXQoKSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQodmFycyk7Ci0JCXcud3JpdGUoIiogSVVzIHZhcmlhYmxlcyIpOyAvLyROT04tTkxTLTEkCi0JCXcubmV3TGluZSgpOwotCQl3LndyaXRlKCIqICIpOyAvLyROT04tTkxTLTEkCi0JCXcubmV3TGluZSgpOwotCQlJdGVyYXRvciBpdGVyYXRvciA9IHZhcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdy53cml0ZSgiKiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJT2JqZWN0IGtleSA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCXcud3JpdGUoa2V5LnRvU3RyaW5nKCkpOwotCQkJdy53cml0ZSgiPT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJdy53cml0ZSh2YXJpYWJsZXMuZ2V0KGtleSkudG9TdHJpbmcoKSk7Ci0JCQl3Lm5ld0xpbmUoKTsKLQkJfQotCQl3LndyaXRlKCIqICIpOyAvLyROT04tTkxTLTEkCi0JCXcubmV3TGluZSgpOwotCQl3LndyaXRlKCIqIEFic3RyYWN0IHZhcmlhYmxlcyIpOyAvLyROT04tTkxTLTEkCi0JCXcubmV3TGluZSgpOwotCQl3LndyaXRlKCIqICIpOyAvLyROT04tTkxTLTEkCi0JCXcubmV3TGluZSgpOwotCQlpdGVyYXRvciA9IGFic3RyYWN0VmFyaWFibGVzLml0ZXJhdG9yKCk7Ci0JCXcud3JpdGUoIiogIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJdy53cml0ZShpdGVyYXRvci5uZXh0KCkudG9TdHJpbmcoKSk7Ci0JCQl3LndyaXRlKCcgJyk7Ci0JCX0KLQkJdy5uZXdMaW5lKCk7Ci0JCXcud3JpdGUoIiogIik7IC8vJE5PTi1OTFMtMSQKLQkJdy5uZXdMaW5lKCk7Ci0JCXcud3JpdGUoIiogTm9PcCB2YXJpYWJsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl3Lm5ld0xpbmUoKTsKLQkJdy53cml0ZSgiKiAiKTsgLy8kTk9OLU5MUy0xJAotCQl3Lm5ld0xpbmUoKTsKLQkJaXRlcmF0b3IgPSBub29wVmFyaWFibGVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCXcud3JpdGUoIiogIik7IC8vJE5PTi1OTFMtMSQKLQkJCU9iamVjdCBrZXkgPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl3LndyaXRlKGtleS50b1N0cmluZygpKTsKLQkJCXcud3JpdGUoIj0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCXcud3JpdGUobm9vcFZhcmlhYmxlcy5nZXQoa2V5KS50b1N0cmluZygpKTsKLQkJCXcubmV3TGluZSgpOwotCQl9Ci0JCXcud3JpdGUoIiogIik7IC8vJE5PTi1OTFMtMSQKLQkJdy5uZXdMaW5lKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQXBwbGljYWJsZShJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCVN0cmluZyBlbmFibGVtZW50RmlsdGVyID0gaXUuZ2V0RmlsdGVyKCk7Ci0JCWlmIChlbmFibGVtZW50RmlsdGVyID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXJldHVybiBEaXJlY3RvckFjdGl2YXRvci5jb250ZXh0LmNyZWF0ZUZpbHRlcihlbmFibGVtZW50RmlsdGVyKS5tYXRjaChzZWxlY3Rpb25Db250ZXh0KTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9jZXNzSVUoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlzbGljZS5wdXQoaXUuZ2V0SWQoKSwgaXUuZ2V0VmVyc2lvbigpLCBpdSk7Ci0JCWV4cGxhbmF0aW9uLmFwcGVuZCgiICIpLmFwcGVuZChnZXRWYXJpYWJsZShpdSkpOyAvLyROT04tTkxTLTEkCi0JCWlmICghaXNBcHBsaWNhYmxlKGl1KSkgewotCQkJY3JlYXRlTmVnYXRpb24oaXUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJQ29sbGVjdG9yIHBhdGNoZXMgPSBnZXRBcHBsaWNhYmxlUGF0Y2hlcyhpdSk7Ci0JCS8vTm8gcGF0Y2hlcyBhcHBseSwgbm9ybWFsIGNvZGUgcGF0aAotCQlpZiAocGF0Y2hlcy5zaXplKCkgPT0gMCkgewotCQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxcyA9IGl1LmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCk7Ci0JCQlpZiAocmVxcy5sZW5ndGggPT0gMCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICghaXNBcHBsaWNhYmxlKHJlcXNbaV0pKQotCQkJCQljb250aW51ZTsKLQotCQkJCWV4cGFuZFJlcXVpcmVtZW50KG51bGwsIGl1LCByZXFzW2ldKTsKLQkJCX0KLQkJCWFkZE9wdGlvbmFsaXR5RXhwcmVzc2lvbigpOwotCQl9IGVsc2UgewotCQkJLy9QYXRjaGVzIGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBJVQotCi0JCQkvL1VubW9kaWZpZWQgZGVwZW5kZW5jaWVzCi0JCQlNYXAgYWxsUmVxdWlyZW1lbnRzID0gbmV3IEhhc2hNYXAoaXUuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKS5sZW5ndGgpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGF0Y2hlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdFBhdGNoIHBhdGNoID0gKElJbnN0YWxsYWJsZVVuaXRQYXRjaCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCVJlcXVpcmVkQ2FwYWJpbGl0eVtdW10gcmVxcyA9IG1lcmdlUmVxdWlyZW1lbnRzKGl1LCBwYXRjaCk7Ci0JCQkJaWYgKHJlcXMubGVuZ3RoID09IDApCi0JCQkJCXJldHVybjsKLQotCQkJCUxpc3QgdmFyaWFibGVzUmVzdWx0aW5nRnJvbVBhdGNoQXBwbGljYXRpb24gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJaW50IGNvdW50ID0gLTE7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChyZXFzW2ldWzBdID09IHJlcXNbaV1bMV0pIC8vVGhlIHJlcXVpcmVtZW50IGhhcyBub3QgY2hhbmdlZAotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmICghaXNBcHBsaWNhYmxlKHJlcXNbaV1bMV0pKSAvL1RPRE8gV2UgbWF5IGhhdmUgdG8gZG8gc29tZXRoaW5nIGhlcmUKLQkJCQkJCWNvbnRpbnVlOwotCi0JCQkJCS8vY3JlYXRlIElVICYgUGF0Y2ggLT4gcmVxVmFyCi0JCQkJCVN0cmluZyBhcHBsaWVkUGF0Y2hWYXIgPSBnZXRWYXJpYWJsZUZvckFwcGxpZWRQYXRjaGVzKGl1LCBwYXRjaCwgcmVxc1tpXVswXSk7Ci0JCQkJCWNvbW1lbnRzQ291bnQrKzsKLQkJCQkJZGVwZW5kZW5jaWVzLmFkZCgiKiAiICsgaXUgKyAiICYgIiArIHBhdGNoICsgIi0+IiArIGFwcGxpZWRQYXRjaFZhcik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJAotCQkJCQlkZXBlbmRlbmNpZXMuYWRkKCItMSAiICsgZ2V0VmFyaWFibGUoaXUpICsgIiAtMSIgKyBnZXRWYXJpYWJsZShwYXRjaCkgKyAiICsxICIgKyBhcHBsaWVkUGF0Y2hWYXIgKyAiID0gLTE7Iik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtNCQKLQotCQkJCQl2YXJpYWJsZXNSZXN1bHRpbmdGcm9tUGF0Y2hBcHBsaWNhdGlvbi5hZGQoYXBwbGllZFBhdGNoVmFyKTsKLQkJCQkJLy9Db2xsZWN0IHZhcmlhYmxlIHVzZWQgdG8gcGF0Y2ggdGhlIHJlcXVpcmVtZW50Ci0JCQkJCUxpc3QgYXBwbGllZFBhdGNoZXNWYXJGb3JSZXF1aXJlbWVudCA9IChMaXN0KSBhbGxSZXF1aXJlbWVudHMuZ2V0KHJlcXNbaV1bMF0pOwotCQkJCQlpZiAoYXBwbGllZFBhdGNoZXNWYXJGb3JSZXF1aXJlbWVudCA9PSBudWxsKSB7Ci0JCQkJCQlhcHBsaWVkUGF0Y2hlc1ZhckZvclJlcXVpcmVtZW50ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQkJYWxsUmVxdWlyZW1lbnRzLnB1dChyZXFzW2ldWzBdLCBhcHBsaWVkUGF0Y2hlc1ZhckZvclJlcXVpcmVtZW50KTsKLQkJCQkJfQotCQkJCQlhcHBsaWVkUGF0Y2hlc1ZhckZvclJlcXVpcmVtZW50LmFkZChhcHBsaWVkUGF0Y2hWYXIpOwotCi0JCQkJCWV4cGFuZFJlcXVpcmVtZW50KGFwcGxpZWRQYXRjaFZhciwgaXUsIHJlcXNbaV1bMV0pOwotCQkJCQljb3VudCsrOwotCQkJCX0KLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMiA9IHZhcmlhYmxlc1Jlc3VsdGluZ0Zyb21QYXRjaEFwcGxpY2F0aW9uLml0ZXJhdG9yKCk7IGl0ZXJhdG9yMi5oYXNOZXh0KCk7KSB7Ci0JCQkJCVN0cmluZyB2YXIgPSAoU3RyaW5nKSBpdGVyYXRvcjIubmV4dCgpOwotCQkJCQljb21tZW50c0NvdW50Kys7Ci0JCQkJCWRlcGVuZGVuY2llcy5hZGQoIiogIiArIHBhdGNoICsgIiAtPiAiICsgdmFyKTsKLQkJCQkJZGVwZW5kZW5jaWVzLmFkZChpbXBsaWVzKGdldFZhcmlhYmxlKHBhdGNoKSwgdmFyKSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvL0dlbmVyYXRlIGV4cHJlc3Npb25zIGZvciByZXF1aXJlbWVudHMgdGhhdCBoYXZlIG5vdCBiZWVuIHBhdGNoZWQgCi0JCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFzID0gaXUuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKTsKLQkJCWlmIChyZXFzLmxlbmd0aCA9PSAwKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCFpc0FwcGxpY2FibGUocmVxc1tpXSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVN0cmluZyB2YXJGb3JBbGxQYXRjaGVkUmVxdWlyZW1lbnQgPSBudWxsOwotCQkJCWlmIChhbGxSZXF1aXJlbWVudHMuZ2V0KHJlcXNbaV0pICE9IG51bGwpIHsKLQkJCQkJLy9nZW5lcmF0ZSB0aGUgbm8gcGF0Y2ggZXhwcmVzc2lvbiBzdW1taW5nIGFsbCB0aGUgcmVxIGFwcGxpY2F0aW9ucyBhbmQgZ2VuZXJhdGUgYSBuZXcgdmFyaWFibGUKLQkJCQkJLy9BICYgIWFsbFJlcXVpc3NzcyAtPiBBYnNjdFZhcgotCQkJCQlTdHJpbmcgZXhwcmVzc2lvbiA9ICItMSAiICsgZ2V0VmFyaWFibGUoaXUpOyAvLyROT04tTkxTLTEkCi0JCQkJCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSAoKEFycmF5TGlzdCkgYWxsUmVxdWlyZW1lbnRzLmdldChyZXFzW2ldKSkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJCQkJZXhwcmVzc2lvbiArPSAiICsxICIgKyAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQl2YXJGb3JBbGxQYXRjaGVkUmVxdWlyZW1lbnQgPSBnZXRWYXJpYWJsZUZvckFwcGxpZWRQYXRjaGVzKG51bGwsIG51bGwsIG51bGwpOwotCQkJCQljb21tZW50c0NvdW50Kys7Ci0JCQkJCWRlcGVuZGVuY2llcy5hZGQoIiogIiArIGl1ICsgIiAmICFyZXFzdmFycyAtPiIgKyB2YXJGb3JBbGxQYXRjaGVkUmVxdWlyZW1lbnQpOwotCQkJCQlleHByZXNzaW9uICs9ICIgKzEgIiArIHZhckZvckFsbFBhdGNoZWRSZXF1aXJlbWVudCArICIgPj0gLTEgOyI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVwZW5kZW5jaWVzLmFkZChleHByZXNzaW9uKTsKLQkJCQl9Ci0KLQkJCQlleHBhbmRSZXF1aXJlbWVudCh2YXJGb3JBbGxQYXRjaGVkUmVxdWlyZW1lbnQsIGl1LCByZXFzW2ldKTsKLQkJCX0KLQkJCWFkZE9wdGlvbmFsaXR5RXhwcmVzc2lvbigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFyaWFibGVGb3JBcHBsaWVkUGF0Y2hlcyhJSW5zdGFsbGFibGVVbml0IGl1MSwgSUluc3RhbGxhYmxlVW5pdCBpdTIsIFJlcXVpcmVkQ2FwYWJpbGl0eSByZXEpIHsKLQkJU3RyaW5nIG5ld1ZhciA9IG5ldyBTdHJpbmcoIngiICsgdmFyQ291bnQrKyk7IC8vJE5PTi1OTFMtMSQKLQkJYWJzdHJhY3RWYXJzRm9yUGF0Y2hlcy5hZGQobmV3VmFyKTsKLQkJcmV0dXJuIG5ld1ZhcjsKLQl9Ci0KLQkvL1JldHVybiBhIG5ldyBhcnJheSBvZiByZXF1aXJlbWVudHMgcmVwcmVzZW50aW5nIHRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgcGF0Y2gKLQlwcml2YXRlIFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10gbWVyZ2VSZXF1aXJlbWVudHMoSUluc3RhbGxhYmxlVW5pdCBpdSwgSUluc3RhbGxhYmxlVW5pdFBhdGNoIHBhdGNoKSB7Ci0JCWlmIChwYXRjaCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVJlcXVpcmVtZW50Q2hhbmdlW10gY2hhbmdlcyA9IHBhdGNoLmdldFJlcXVpcmVtZW50c0NoYW5nZSgpOwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSBvcmlnaW5hbFJlcXVpcmVtZW50cyA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbaXUuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKS5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGl1LmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCksIDAsIG9yaWdpbmFsUmVxdWlyZW1lbnRzLCAwLCBvcmlnaW5hbFJlcXVpcmVtZW50cy5sZW5ndGgpOwotCQlMaXN0IHJyciA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgb3JpZ2luYWxSZXF1aXJlbWVudHMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAob3JpZ2luYWxSZXF1aXJlbWVudHNbal0gIT0gbnVsbCAmJiBjaGFuZ2VzW2ldLm1hdGNoZXMob3JpZ2luYWxSZXF1aXJlbWVudHNbal0pKSB7Ci0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJaWYgKGNoYW5nZXNbaV0ubmV3VmFsdWUoKSAhPSBudWxsKQotCQkJCQkJcnJyLmFkZChuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge29yaWdpbmFsUmVxdWlyZW1lbnRzW2pdLCBjaGFuZ2VzW2ldLm5ld1ZhbHVlKCl9KTsKLQkJCQkJZWxzZQotCQkJCQkJLy8gY2FzZSB3aGVyZSBhIHJlcXVpcmVtZW50IGlzIHJlbW92ZWQKLQkJCQkJCXJyci5hZGQobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtvcmlnaW5hbFJlcXVpcmVtZW50c1tqXSwgbnVsbH0pOwotCQkJCQlvcmlnaW5hbFJlcXVpcmVtZW50c1tqXSA9IG51bGw7Ci0JCQkJfQotCQkJCS8vCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKCFmb3VuZCAmJiBjaGFuZ2VzW2ldLmFwcGx5T24oKSA9PSBudWxsICYmIGNoYW5nZXNbaV0ubmV3VmFsdWUoKSAhPSBudWxsKSAvL0Nhc2Ugd2hlcmUgYSBuZXcgcmVxdWlyZW1lbnQgaXMgYWRkZWQKLQkJCQlycnIuYWRkKG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7bnVsbCwgY2hhbmdlc1tpXS5uZXdWYWx1ZSgpfSk7Ci0JCX0KLQkJLy9BZGQgYWxsIHRoZSB1bm1vZGlmaWVkIHJlcXVpcmVtZW50cyB0byB0aGUgcmVzdWx0Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3JpZ2luYWxSZXF1aXJlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcmlnaW5hbFJlcXVpcmVtZW50c1tpXSAhPSBudWxsKQotCQkJCXJyci5hZGQobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtvcmlnaW5hbFJlcXVpcmVtZW50c1tpXSwgb3JpZ2luYWxSZXF1aXJlbWVudHNbaV19KTsKLQkJfQotCQlyZXR1cm4gKFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10pIHJyci50b0FycmF5KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbcnJyLnNpemUoKV1bXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE9wdGlvbmFsaXR5RXhwcmVzc2lvbigpIHsKLQkJaWYgKG9wdGlvbmFsaXR5RXhwcmVzc2lvbiAhPSBudWxsICYmIGNvdW50T3B0aW9uYWxJVXMgPiAwKQotCQkJZGVwZW5kZW5jaWVzLmFkZChvcHRpb25hbGl0eUV4cHJlc3Npb24gKyAiID49IDA7Iik7IC8vJE5PTi1OTFMtMSQKLQkJb3B0aW9uYWxpdHlFeHByZXNzaW9uID0gbnVsbDsKLQkJY291bnRPcHRpb25hbElVcyA9IDA7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgb3B0aW9uYWxpdHlFeHByZXNzaW9uID0gbnVsbDsKLQlwcml2YXRlIGludCBjb3VudE9wdGlvbmFsSVVzID0gMDsKLQotCXByaXZhdGUgdm9pZCBleHBhbmRPcHRpb25hbFJlcXVpcmVtZW50KFN0cmluZyBpdVZhciwgSUluc3RhbGxhYmxlVW5pdCBpdSwgUmVxdWlyZWRDYXBhYmlsaXR5IHJlcSkgewotCQlpZiAoaXVWYXIgPT0gbnVsbCkKLQkJCWl1VmFyID0gZ2V0VmFyaWFibGUoaXUpOwotCQlTdHJpbmcgYWJzdHJhY3RWYXIgPSBnZXRBYnN0cmFjdFZhcmlhYmxlKCk7Ci0JCVN0cmluZyBleHByZXNzaW9uID0gIiAtMSAiICsgYWJzdHJhY3RWYXI7IC8vJE5PTi1OTFMtMSQKLQkJQ29sbGVjdG9yIG1hdGNoZXMgPSBwaWNrZXIucXVlcnkobmV3IENhcGFiaWxpdHlRdWVyeShyZXEpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCQlpZiAob3B0aW9uYWxpdHlFeHByZXNzaW9uID09IG51bGwpCi0JCQlvcHRpb25hbGl0eUV4cHJlc3Npb24gPSAiIC0xICIgKyBpdVZhciArICIgMSAiICsgZ2V0Tm9PcGVyYXRpb25WYXJpYWJsZShpdSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQkJU3RyaW5nQnVmZmVyIGNvbW1lbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNvbW1lbnQuYXBwZW5kKCIqICIpOwotCQljb21tZW50LmFwcGVuZChpdS50b1N0cmluZygpKTsKLQkJY29tbWVudC5hcHBlbmQoIiByZXF1aXJlcyBvcHRpb25hbHkgZWl0aGVyICIpOwotCQlpbnQgY291bnRNYXRjaGVzID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hdGNoZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBtYXRjaCA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaXNBcHBsaWNhYmxlKG1hdGNoKSkgewotCQkJCWNvdW50TWF0Y2hlcysrOwotCQkJCWV4cHJlc3Npb24gKz0gIiAxICIgKyBnZXRWYXJpYWJsZShtYXRjaCk7IC8vJE5PTi1OTFMtMSQKLQkJCQljb21tZW50LmFwcGVuZChtYXRjaC50b1N0cmluZygpKTsKLQkJCQljb21tZW50LmFwcGVuZCgnICcpOwotCQkJfQotCQl9Ci0JCWNvdW50T3B0aW9uYWxJVXMgKz0gY291bnRNYXRjaGVzOwotCQlpZiAoY291bnRNYXRjaGVzID4gMCkgewotCQkJZGVwZW5kZW5jaWVzLmFkZChjb21tZW50LnRvU3RyaW5nKCkpOwotCQkJY29tbWVudHNDb3VudCsrOwotCQkJZGVwZW5kZW5jaWVzLmFkZChpbXBsaWVzTm8oZ2V0Tm9PcGVyYXRpb25WYXJpYWJsZShpdSksIGFic3RyYWN0VmFyKSk7Ci0JCQlkZXBlbmRlbmNpZXMuYWRkKGV4cHJlc3Npb24gKyAiID49IDA7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCW9wdGlvbmFsaXR5RXhwcmVzc2lvbiArPSAiIDEgIiArIGFic3RyYWN0VmFyOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIElVIGZvdW5kIHRvIHNhdGlzZnkgb3B0aW9uYWwgZGVwZW5kZW5jeSBvZiAiICsgaXUgKyAiIHJlcSAiICsgcmVxKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhwYW5kTm9ybWFsUmVxdWlyZW1lbnQoU3RyaW5nIHZhckl1LCBJSW5zdGFsbGFibGVVbml0IGl1LCBSZXF1aXJlZENhcGFiaWxpdHkgcmVxKSB7Ci0JCS8vR2VuZXJhdGUgdGhlIHJlZ3VsYXIgcmVxdWlyZW1lbnQKLQkJaWYgKHZhckl1ID09IG51bGwpCi0JCQl2YXJJdSA9IGdldFZhcmlhYmxlKGl1KTsKLQkJU3RyaW5nIGV4cHJlc3Npb24gPSAiLTEgIiArIHZhckl1OyAvLyROT04tTkxTLTEkCi0JCUNvbGxlY3RvciBtYXRjaGVzID0gcGlja2VyLnF1ZXJ5KG5ldyBDYXBhYmlsaXR5UXVlcnkocmVxKSwgbmV3IENvbGxlY3RvcigpLCBudWxsKTsKLQkJU3RyaW5nQnVmZmVyIGNvbW1lbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNvbW1lbnQuYXBwZW5kKCIqICIpOwotCQljb21tZW50LmFwcGVuZChpdS50b1N0cmluZygpKTsKLQkJY29tbWVudC5hcHBlbmQoIiByZXF1aXJlcyBlaXRoZXIgIik7Ci0JCWludCBjb3VudE1hdGNoZXMgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWF0Y2hlcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IG1hdGNoID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpc0FwcGxpY2FibGUobWF0Y2gpKSB7Ci0JCQkJY291bnRNYXRjaGVzKys7Ci0JCQkJZXhwcmVzc2lvbiArPSAiICsxICIgKyBnZXRWYXJpYWJsZShtYXRjaCk7IC8vJE5PTi1OTFMtMSQKLQkJCQljb21tZW50LmFwcGVuZChtYXRjaC50b1N0cmluZygpKTsKLQkJCQljb21tZW50LmFwcGVuZCgnICcpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGNvdW50TWF0Y2hlcyA+IDApIHsKLQkJCWRlcGVuZGVuY2llcy5hZGQoY29tbWVudC50b1N0cmluZygpKTsKLQkJCWNvbW1lbnRzQ291bnQrKzsKLQkJCWRlcGVuZGVuY2llcy5hZGQoZXhwcmVzc2lvbiArICIgPj0gMDsiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIE5MUy5iaW5kKE1lc3NhZ2VzLlBsYW5uZXJfVW5zYXRpc2ZpZWRfZGVwZW5kZW5jeSwgaXUsIHJlcSkpKTsKLQkJCWNyZWF0ZU5lZ2F0aW9uKHZhckl1KTsKLQkJfQotCX0KLQotCS8vUmV0dXJuIElVUGF0Y2hlcyB0aGF0IGFyZSBhcHBsaWNhYmxlIGZvciB0aGUgZ2l2ZW4gaXUKLQlwcml2YXRlIENvbGxlY3RvciBnZXRBcHBsaWNhYmxlUGF0Y2hlcyhJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCXJldHVybiBwaWNrZXIucXVlcnkobmV3IEFwcGxpY2FibGVQYXRjaFF1ZXJ5KGl1KSwgbmV3IENvbGxlY3RvcigpLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhwYW5kUmVxdWlyZW1lbnQoU3RyaW5nIHZhciwgSUluc3RhbGxhYmxlVW5pdCBpdSwgUmVxdWlyZWRDYXBhYmlsaXR5IHJlcSkgewotCQlpZiAocmVxLmlzT3B0aW9uYWwoKSkKLQkJCWV4cGFuZE9wdGlvbmFsUmVxdWlyZW1lbnQodmFyLCBpdSwgcmVxKTsKLQkJZWxzZQotCQkJZXhwYW5kTm9ybWFsUmVxdWlyZW1lbnQodmFyLCBpdSwgcmVxKTsKLQl9Ci0KLQkvL0NyZWF0ZSBjb25zdHJhaW50cyB0byBkZWFsIHdpdGggc2luZ2xldG9uCi0JLy9XaGVuIHRoZXJlIGlzIGEgbWl4IG9mIHNpbmdsZXRvbiBhbmQgbm9uIHNpbmdsZXRvbiwgc2V2ZXJhbCBjb25zdHJhaW50cyBhcmUgZ2VuZXJhdGVkIAotCXByaXZhdGUgdm9pZCBjcmVhdGVDb25zdHJhaW50c0ZvclNpbmdsZXRvbigpIHsKLQkJU2V0IHMgPSBzbGljZS5lbnRyeVNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlIYXNoTWFwIGNvbmZsaWN0aW5nRW50cmllcyA9IChIYXNoTWFwKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJaWYgKGNvbmZsaWN0aW5nRW50cmllcy5zaXplKCkgPCAyKQotCQkJCWNvbnRpbnVlOwotCi0JCQlDb2xsZWN0aW9uIGNvbmZsaWN0aW5nVmVyc2lvbnMgPSBjb25mbGljdGluZ0VudHJpZXMudmFsdWVzKCk7Ci0JCQlTdHJpbmcgc2luZ2xldG9uUnVsZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlBcnJheUxpc3Qgbm9uU2luZ2xldG9uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaW50IGNvdW50U2luZ2xldG9uID0gMDsKLQkJCWZvciAoSXRlcmF0b3IgY29uZmxpY3RJdGVyYXRvciA9IGNvbmZsaWN0aW5nVmVyc2lvbnMuaXRlcmF0b3IoKTsgY29uZmxpY3RJdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdCBjb25mbGljdEVsdCA9IChJSW5zdGFsbGFibGVVbml0KSBjb25mbGljdEl0ZXJhdG9yLm5leHQoKTsKLQkJCQlpZiAoY29uZmxpY3RFbHQuaXNTaW5nbGV0b24oKSkgewotCQkJCQlzaW5nbGV0b25SdWxlICs9ICIgLTEgIiArIGdldFZhcmlhYmxlKGNvbmZsaWN0RWx0KTsgLy8kTk9OLU5MUy0xJAotCQkJCQljb3VudFNpbmdsZXRvbisrOwotCQkJCX0gZWxzZSB7Ci0JCQkJCW5vblNpbmdsZXRvbi5hZGQoY29uZmxpY3RFbHQpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChjb3VudFNpbmdsZXRvbiA9PSAwKQotCQkJCWNvbnRpbnVlOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yMiA9IG5vblNpbmdsZXRvbi5pdGVyYXRvcigpOyBpdGVyYXRvcjIuaGFzTmV4dCgpOykgewotCQkJCWNvbnN0cmFpbnRzLmFkZChzaW5nbGV0b25SdWxlICsgIiAtMSAiICsgZ2V0VmFyaWFibGUoKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yMi5uZXh0KCkpICsgIiA+PSAtMTsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlzaW5nbGV0b25SdWxlICs9ICIgPj0gLTE7IjsgLy8kTk9OLU5MUy0xJAotCQkJY29uc3RyYWludHMuYWRkKHNpbmdsZXRvblJ1bGUpOwotCQl9Ci0JfQotCi0JLy9SZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgdmFyaWFibGUgCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFyaWFibGUoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlTdHJpbmcgdiA9IChTdHJpbmcpIHZhcmlhYmxlcy5nZXQoaXUpOwotCQlpZiAodiA9PSBudWxsKSB7Ci0JCQl2ID0gbmV3IFN0cmluZygieCIgKyB2YXJDb3VudCsrKTsgLy8kTk9OLU5MUy0xJAotCQkJdmFyaWFibGVzLnB1dChpdSwgdik7Ci0JCX0KLQkJcmV0dXJuIHY7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QWJzdHJhY3RWYXJpYWJsZSgpIHsKLQkJU3RyaW5nIG5ld1ZhciA9IG5ldyBTdHJpbmcoIngiICsgdmFyQ291bnQrKyk7IC8vJE5PTi1OTFMtMSQKLQkJYWJzdHJhY3RWYXJpYWJsZXMuYWRkKG5ld1Zhcik7Ci0JCXJldHVybiBuZXdWYXI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Tm9PcGVyYXRpb25WYXJpYWJsZShJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCVN0cmluZyB2ID0gKFN0cmluZykgbm9vcFZhcmlhYmxlcy5nZXQoaXUpOwotCQlpZiAodiA9PSBudWxsKSB7Ci0JCQl2ID0gbmV3IFN0cmluZygieCIgKyB2YXJDb3VudCsrKTsgLy8kTk9OLU5MUy0xJAotCQkJbm9vcFZhcmlhYmxlcy5wdXQoaXUsIHYpOwotCQl9Ci0JCXJldHVybiB2OwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGludm9rZVNvbHZlcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKHJlc3VsdC5nZXRTZXZlcml0eSgpID09IElTdGF0dXMuRVJST1IpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlJUEJTb2x2ZXIgc29sdmVyID0gU29sdmVyRmFjdG9yeS5uZXdFY2xpcHNlUDIoKTsKLQkJc29sdmVyLnNldFRpbWVvdXRPbkNvbmZsaWN0cygxMDAwKTsKLQkJT1BCRWNsaXBzZVJlYWRlcjIwMDcgcmVhZGVyID0gbmV3IE9QQkVjbGlwc2VSZWFkZXIyMDA3KHNvbHZlcik7Ci0JCS8vIENORiBmaWxlbmFtZSBpcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lIAotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW52b2tpbmcgc29sdmVyOiAiICsgc3RhcnQpOyAvLyROT04tTkxTLTEkCi0JCUZpbGVSZWFkZXIgZnIgPSBudWxsOwotCQl0cnkgewotCQkJZnIgPSBuZXcgRmlsZVJlYWRlcihwcm9ibGVtRmlsZSk7Ci0JCQlJUHJvYmxlbSBwcm9ibGVtID0gcmVhZGVyLnBhcnNlSW5zdGFuY2UoZnIpOwotCQkJaWYgKHByb2JsZW0uaXNTYXRpc2ZpYWJsZSgpKSB7Ci0JCQkJLy8JCQkJcHJvYmxlbS5tb2RlbCgpOwotCQkJCWlmIChERUJVRykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNhdGlzZmlhYmxlICEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVhZGVyLmRlY29kZShwcm9ibGVtLm1vZGVsKCkpKTsKLQkJCQl9Ci0JCQkJYmFja1RvSVUocHJvYmxlbSk7Ci0JCQkJbG9uZyBzdG9wID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNvbHZlciBzb2x1dGlvbiBmb3VuZDogIiArIChzdG9wIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVW5zYXRpc2ZpYWJsZSAhIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQubWVyZ2UobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgTkxTLmJpbmQoTWVzc2FnZXMuUGxhbm5lcl9VbnNhdGlzZmlhYmxlX3Byb2JsZW0sIHByb2JsZW1GaWxlKSkpOwotCQkJfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCBOTFMuYmluZChNZXNzYWdlcy5QbGFubmVyX01pc3Npbmdfb3BiX2ZpbGUsIHByb2JsZW1GaWxlKSkpOwotCQl9IGNhdGNoIChQYXJzZUZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIE5MUy5iaW5kKE1lc3NhZ2VzLlBsYW5uZXJfRm9ybWF0X2Vycm9yLCBwcm9ibGVtRmlsZSkpKTsKLQkJfSBjYXRjaCAoQ29udHJhZGljdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQubWVyZ2UobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgTkxTLmJpbmQoTWVzc2FnZXMuUGxhbm5lcl9Ucml2aWFsX2V4Y2VwdGlvbiwgcHJvYmxlbUZpbGUpKSk7Ci0JCX0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0Lm1lcmdlKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIE5MUy5iaW5kKE1lc3NhZ2VzLlBsYW5uZXJfVGltZW91dCwgcHJvYmxlbUZpbGUpKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZnIgIT0gbnVsbCkKLQkJCQkJZnIuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvL2lnbm9yZQotCQkJfQotCQkJcHJvYmxlbUZpbGUuZGVsZXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmFja1RvSVUoSVByb2JsZW0gcHJvYmxlbSkgewotCQlzb2x1dGlvbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBhbGxJVXMgPSB2YXJpYWJsZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBhbGxJVXMuaGFzTmV4dCgpOykgewotCQkJRW50cnkgZW50cnkgPSAoRW50cnkpIGFsbElVcy5uZXh0KCk7Ci0JCQlpbnQgbWF0Y2ggPSBJbnRlZ2VyLnBhcnNlSW50KCgoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpKS5zdWJzdHJpbmcoMSkpOwotCQkJaWYgKHByb2JsZW0ubW9kZWwobWF0Y2gpKSB7Ci0JCQkJc29sdXRpb24uYWRkKCgoSUluc3RhbGxhYmxlVW5pdCkgZW50cnkuZ2V0S2V5KCkpLnVucmVzb2x2ZWQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJpbnRTb2x1dGlvbihDb2xsZWN0aW9uIHN0YXRlKSB7Ci0JCUFycmF5TGlzdCBsID0gbmV3IEFycmF5TGlzdChzdGF0ZSk7Ci0JCUNvbGxlY3Rpb25zLnNvcnQobCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiTnVtYmVycyBvZiBJVXMgc2VsZWN0ZWQ6IiArIGwuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGV4dHJhY3RTb2x1dGlvbigpIHsKLQkJaWYgKERFQlVHKQotCQkJcHJpbnRTb2x1dGlvbihzb2x1dGlvbik7Ci0JCXJldHVybiBzb2x1dGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUXVlcnlhYmxlQXJyYXkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9RdWVyeWFibGVBcnJheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGNjNTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9RdWVyeWFibGVBcnJheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuQ2FwYWJpbGl0eVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuKjsKLQotcHVibGljIGNsYXNzIFF1ZXJ5YWJsZUFycmF5IGltcGxlbWVudHMgSVF1ZXJ5YWJsZSB7Ci0Jc3RhdGljIGNsYXNzIElVQ2FwYWJpbGl0eSB7Ci0JCWZpbmFsIElJbnN0YWxsYWJsZVVuaXQgaXU7Ci0JCWZpbmFsIFByb3ZpZGVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5OwotCi0JCXB1YmxpYyBJVUNhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdCBpdSwgUHJvdmlkZWRDYXBhYmlsaXR5IGNhcGFiaWxpdHkpIHsKLQkJCXRoaXMuaXUgPSBpdTsKLQkJCXRoaXMuY2FwYWJpbGl0eSA9IGNhcGFiaWxpdHk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIExpc3QgZGF0YVNldDsKLQlwcml2YXRlIE1hcCBuYW1lZENhcGFiaWxpdHlJbmRleDsKLQotCXB1YmxpYyBRdWVyeWFibGVBcnJheShJSW5zdGFsbGFibGVVbml0W10gaXVzKSB7Ci0JCWRhdGFTZXQgPSBBcnJheXMuYXNMaXN0KGl1cyk7Ci0JfQotCi0JcHVibGljIENvbGxlY3RvciBxdWVyeShRdWVyeSBxdWVyeSwgQ29sbGVjdG9yIGNvbGxlY3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWlmIChxdWVyeSBpbnN0YW5jZW9mIENhcGFiaWxpdHlRdWVyeSkKLQkJCXJldHVybiBxdWVyeUNhcGFiaWxpdHkoKENhcGFiaWxpdHlRdWVyeSkgcXVlcnksIGNvbGxlY3RvciwgbW9uaXRvcik7Ci0JCXJldHVybiBxdWVyeS5wZXJmb3JtKGRhdGFTZXQuaXRlcmF0b3IoKSwgY29sbGVjdG9yKTsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3RvciBxdWVyeUNhcGFiaWxpdHkoQ2FwYWJpbGl0eVF1ZXJ5IHF1ZXJ5LCBDb2xsZWN0b3IgY29sbGVjdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZ2VuZXJhdGVOYW1lZENhcGFiaWxpdHlJbmRleCgpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkQ2FwYWJpbGl0aWVzID0gcXVlcnkuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKTsKLQkJQ29sbGVjdGlvbiByZXN1bHRJVXMgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXVpcmVkQ2FwYWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlDb2xsZWN0aW9uIG1hdGNoaW5nSVVzID0gZmluZE1hdGNoaW5nSVVzKHJlcXVpcmVkQ2FwYWJpbGl0aWVzW2ldKTsKLQkJCWlmIChtYXRjaGluZ0lVcyA9PSBudWxsKQotCQkJCXJldHVybiBjb2xsZWN0b3I7Ci0JCQlpZiAocmVzdWx0SVVzID09IG51bGwpCi0JCQkJcmVzdWx0SVVzID0gbWF0Y2hpbmdJVXM7Ci0JCQllbHNlCi0JCQkJcmVzdWx0SVVzLnJldGFpbkFsbChtYXRjaGluZ0lVcyk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzdWx0SVVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0JCQljb2xsZWN0b3IuYWNjZXB0KGl0ZXJhdG9yLm5leHQoKSk7Ci0KLQkJcmV0dXJuIGNvbGxlY3RvcjsKLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZmluZE1hdGNoaW5nSVVzKFJlcXVpcmVkQ2FwYWJpbGl0eSByZXF1aXJlZENhcGFiaWxpdHkpIHsKLQkJTGlzdCBpdUNhcGFiaWxpdGllcyA9IChMaXN0KSBuYW1lZENhcGFiaWxpdHlJbmRleC5nZXQocmVxdWlyZWRDYXBhYmlsaXR5LmdldE5hbWUoKSk7Ci0JCWlmIChpdUNhcGFiaWxpdGllcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU2V0IG1hdGNoaW5nSVVzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGl1Q2FwYWJpbGl0aWVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlVQ2FwYWJpbGl0eSBpdUNhcGFiaWxpdHkgPSAoSVVDYXBhYmlsaXR5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaXVDYXBhYmlsaXR5LmNhcGFiaWxpdHkuaXNTYXRpc2ZpZWRCeShyZXF1aXJlZENhcGFiaWxpdHkpKQotCQkJCW1hdGNoaW5nSVVzLmFkZChpdUNhcGFiaWxpdHkuaXUpOwotCQl9Ci0JCXJldHVybiBtYXRjaGluZ0lVczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVOYW1lZENhcGFiaWxpdHlJbmRleCgpIHsKLQkJaWYgKG5hbWVkQ2FwYWJpbGl0eUluZGV4ICE9IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJbmFtZWRDYXBhYmlsaXR5SW5kZXggPSBuZXcgSGFzaE1hcCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gZGF0YVNldC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQotCQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdmlkZWRDYXBhYmlsaXRpZXMgPSBpdS5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlZENhcGFiaWxpdGllcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gcHJvdmlkZWRDYXBhYmlsaXRpZXNbaV0uZ2V0TmFtZSgpOwotCQkJCUxpc3QgaXVDYXBhYmlsaXRpZXMgPSAoTGlzdCkgbmFtZWRDYXBhYmlsaXR5SW5kZXguZ2V0KG5hbWUpOwotCQkJCWlmIChpdUNhcGFiaWxpdGllcyA9PSBudWxsKSB7Ci0JCQkJCWl1Q2FwYWJpbGl0aWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQluYW1lZENhcGFiaWxpdHlJbmRleC5wdXQobmFtZSwgaXVDYXBhYmlsaXRpZXMpOwotCQkJCX0KLQkJCQlpdUNhcGFiaWxpdGllcy5hZGQobmV3IElVQ2FwYWJpbGl0eShpdSwgcHJvdmlkZWRDYXBhYmlsaXRpZXNbaV0pKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9SZWNvbW1lbmRhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1JlY29tbWVuZGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMTUzMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1JlY29tbWVuZGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLlJlcXVpcmVkQ2FwYWJpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgUmVjb21tZW5kYXRpb24gewotCXByaXZhdGUgUmVxdWlyZWRDYXBhYmlsaXR5IGFwcGx5T247Ci0JcHJpdmF0ZSBSZXF1aXJlZENhcGFiaWxpdHkgbmV3VmFsdWU7Ci0KLQlwdWJsaWMgUmVjb21tZW5kYXRpb24oUmVxdWlyZWRDYXBhYmlsaXR5IGFwcGx5T24yLCBSZXF1aXJlZENhcGFiaWxpdHkgbmV3VmFsdWUyKSB7Ci0JCXRoaXMuYXBwbHlPbiA9IGFwcGx5T24yOwotCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWUyOwotCX0KLQotCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHkgYXBwbHlPbigpIHsKLQkJcmV0dXJuIGFwcGx5T247Ci0JfQotCi0JcHVibGljIFJlcXVpcmVkQ2FwYWJpbGl0eSBuZXdWYWx1ZSgpIHsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoUmVxdWlyZWRDYXBhYmlsaXR5IHRvTWF0Y2gpIHsKLQkJaWYgKCF0b01hdGNoLmdldE5hbWVzcGFjZSgpLmVxdWFscyhhcHBseU9uLmdldE5hbWVzcGFjZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCF0b01hdGNoLmdldE5hbWUoKS5lcXVhbHMoYXBwbHlPbi5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodG9NYXRjaC5nZXRSYW5nZSgpLmVxdWFscyhhcHBseU9uLmdldFJhbmdlKCkpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJLy9UT0RPIEhlcmUsIGluIHRoZSBsb25nIHJ1biB3ZSB3YW50IHRvIGJlIHNtYXJ0ZXIgLmZvciBleGFtcGxlIHdlIGNvdWxkIGNoZWNrIHRoYXQgdGhlIHJhbmdlIG9mIHRoZSBtYXRjaCBpcyBhIHN1YnNldCBvZiB0aGUgcmFuZ2Ugc3BlY2lmaWVkIG9uIGFwcGx5T24uCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlib29sZWFuIG1hdGNoZXMoUmVjb21tZW5kYXRpb24gdG9NYXRjaCkgewotCQlyZXR1cm4gbWF0Y2hlcyh0b01hdGNoLmFwcGx5T24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlY29tbWVuZGF0aW9uIG1lcmdlKFJlY29tbWVuZGF0aW9uIHIyKSB7Ci0JCVZlcnNpb25SYW5nZSByZXN1bHQgPSBpbnRlcnNlY3QobmV3VmFsdWUoKS5nZXRSYW5nZSgpLCByMi5uZXdWYWx1ZSgpLmdldFJhbmdlKCkpOwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBSZWNvbW1lbmRhdGlvbihhcHBseU9uLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KGFwcGx5T24uZ2V0TmFtZXNwYWNlKCksIGFwcGx5T24uZ2V0TmFtZSgpLCByZXN1bHQsIG51bGwsIGZhbHNlLCBmYWxzZSkpOwotCX0KLQotCXByaXZhdGUgVmVyc2lvblJhbmdlIGludGVyc2VjdChWZXJzaW9uUmFuZ2UgcjEsIFZlcnNpb25SYW5nZSByMikgewotCQlWZXJzaW9uIHJlc3VsdE1pbiA9IG51bGw7Ci0JCWJvb2xlYW4gcmVzdWx0TWluSW5jbHVkZWQgPSBmYWxzZTsKLQkJVmVyc2lvbiByZXN1bHRNYXggPSBudWxsOwotCQlib29sZWFuIHJlc3VsdE1heEluY2x1ZGVkID0gZmFsc2U7Ci0KLQkJaW50IG1pbkNvbXBhcmUgPSByMS5nZXRNaW5pbXVtKCkuY29tcGFyZVRvKHIyLmdldE1pbmltdW0oKSk7Ci0JCWlmIChtaW5Db21wYXJlIDwgMCkgewotCQkJcmVzdWx0TWluID0gcjIuZ2V0TWluaW11bSgpOwotCQkJcmVzdWx0TWluSW5jbHVkZWQgPSByMi5nZXRJbmNsdWRlTWluaW11bSgpOwotCQl9IGVsc2UgaWYgKG1pbkNvbXBhcmUgPiAwKSB7Ci0JCQlyZXN1bHRNaW4gPSByMS5nZXRNaW5pbXVtKCk7Ci0JCQlyZXN1bHRNaW5JbmNsdWRlZCA9IHIxLmdldEluY2x1ZGVNaW5pbXVtKCk7Ci0JCX0gZWxzZSBpZiAobWluQ29tcGFyZSA9PSAwKSB7Ci0JCQlyZXN1bHRNaW4gPSByMS5nZXRNaW5pbXVtKCk7Ci0JCQlyZXN1bHRNaW5JbmNsdWRlZCA9IHIxLmdldEluY2x1ZGVNaW5pbXVtKCkgJiYgcjIuZ2V0SW5jbHVkZU1pbmltdW0oKTsKLQkJfQotCi0JCWludCBtYXhDb21wYXJlID0gcjEuZ2V0TWF4aW11bSgpLmNvbXBhcmVUbyhyMi5nZXRNYXhpbXVtKCkpOwotCQlpZiAobWF4Q29tcGFyZSA+IDApIHsKLQkJCXJlc3VsdE1heCA9IHIyLmdldE1heGltdW0oKTsKLQkJCXJlc3VsdE1heEluY2x1ZGVkID0gcjIuZ2V0SW5jbHVkZU1heGltdW0oKTsKLQkJfSBlbHNlIGlmIChtYXhDb21wYXJlIDwgMCkgewotCQkJcmVzdWx0TWF4ID0gcjEuZ2V0TWF4aW11bSgpOwotCQkJcmVzdWx0TWF4SW5jbHVkZWQgPSByMS5nZXRJbmNsdWRlTWF4aW11bSgpOwotCQl9IGVsc2UgaWYgKG1heENvbXBhcmUgPT0gMCkgewotCQkJcmVzdWx0TWF4ID0gcjEuZ2V0TWF4aW11bSgpOwotCQkJcmVzdWx0TWF4SW5jbHVkZWQgPSByMS5nZXRJbmNsdWRlTWF4aW11bSgpICYmIHIyLmdldEluY2x1ZGVNYXhpbXVtKCk7Ci0JCX0KLQotCQlpbnQgcmVzdWx0UmFuZ2VDb21wYXJpc29uID0gcmVzdWx0TWluLmNvbXBhcmVUbyhyZXN1bHRNYXgpOwotCQlpZiAocmVzdWx0UmFuZ2VDb21wYXJpc29uIDwgMCkKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHJlc3VsdE1pbiwgcmVzdWx0TWluSW5jbHVkZWQsIHJlc3VsdE1heCwgcmVzdWx0TWF4SW5jbHVkZWQpOwotCQllbHNlIGlmIChyZXN1bHRSYW5nZUNvbXBhcmlzb24gPT0gMCAmJiByZXN1bHRNaW5JbmNsdWRlZCA9PSByZXN1bHRNYXhJbmNsdWRlZCkKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHJlc3VsdE1pbiwgcmVzdWx0TWluSW5jbHVkZWQsIHJlc3VsdE1heCwgcmVzdWx0TWF4SW5jbHVkZWQpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGUoUmVjb21tZW5kYXRpb24gb3RoZXIpIHsKLQkJcmV0dXJuIGludGVyc2VjdChuZXdWYWx1ZS5nZXRSYW5nZSgpLCBvdGhlci5uZXdWYWx1ZS5nZXRSYW5nZSgpKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWZpbmFsIGludCBwcmltZSA9IDMxOwotCQlpbnQgcmVzdWx0ID0gMTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGFwcGx5T24gPT0gbnVsbCkgPyAwIDogYXBwbHlPbi5oYXNoQ29kZSgpKTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG5ld1ZhbHVlID09IG51bGwpID8gMCA6IG5ld1ZhbHVlLmhhc2hDb2RlKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmaW5hbCBSZWNvbW1lbmRhdGlvbiBvdGhlciA9IChSZWNvbW1lbmRhdGlvbikgb2JqOwotCQlpZiAoYXBwbHlPbiA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIuYXBwbHlPbiAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghYXBwbHlPbi5lcXVhbHMob3RoZXIuYXBwbHlPbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIubmV3VmFsdWUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIW5ld1ZhbHVlLmVxdWFscyhvdGhlci5uZXdWYWx1ZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1MDRmMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1JlY29tbWVuZGF0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5SZXF1aXJlZENhcGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotcHVibGljIGNsYXNzIFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9VQ0hQT0lOVF9EQVRBX0tFWSA9ICJyZWNvbW1lbmRhdGlvbnMiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtJTkQgPSAicmVjb21tZW5kYXRpb24iOwotCi0JcHJpdmF0ZSBTZXQgcmVjb21tZW5kYXRpb25zOwotCi0JcHVibGljIFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvcihTZXQgcmVjb21tZW5kYXRpb25zKSB7Ci0JCXRoaXMucmVjb21tZW5kYXRpb25zID0gcmVjb21tZW5kYXRpb25zOwotCX0KLQotCXB1YmxpYyBTZXQgZ2V0UmVjb21tZW5kYXRpb25zKCkgewotCQlyZXR1cm4gcmVjb21tZW5kYXRpb25zOwotCX0KLQotCXB1YmxpYyBSZWNvbW1lbmRhdGlvbiBmaW5kUmVjb21tZW5kYXRpb24oUmVxdWlyZWRDYXBhYmlsaXR5IHRvTWF0Y2gpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlY29tbWVuZGF0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSZWNvbW1lbmRhdGlvbiBuYW1lID0gKFJlY29tbWVuZGF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobmFtZS5tYXRjaGVzKHRvTWF0Y2gpKQotCQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBSZWNvbW1lbmRhdGlvbiBmaW5kUmVjb21tZW5kYXRpb24oUmVjb21tZW5kYXRpb24gdG9NYXRjaCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVjb21tZW5kYXRpb25zLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVJlY29tbWVuZGF0aW9uIG5hbWUgPSAoUmVjb21tZW5kYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChuYW1lLm1hdGNoZXModG9NYXRjaCkpCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy9NZXJnZSB0aGUgb3RoZXIgZGVzY3JpcHRvciBpbnRvIHRoaXMgb25lLiBSZXR1cm4gYW4gT0sgU3RhdHVzIGlzIHRoZSBtZXJnZWQgc3VjY2VlZGVkLCBvdGhlcndpc2UgcmV0dXJuIGFuIElORk8gU3RhdHVzCi0JcHVibGljIElTdGF0dXMgbWVyZ2UoUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yIG90aGVyKSB7Ci0JCU11bHRpU3RhdHVzIHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBvdGhlci5yZWNvbW1lbmRhdGlvbnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUmVjb21tZW5kYXRpb24gb3RoZXJSZWNvbW1lbmRhdGlvbiA9IChSZWNvbW1lbmRhdGlvbikgaXQubmV4dCgpOwotCQkJUmVjb21tZW5kYXRpb24gbWF0Y2hJblRoaXMgPSBmaW5kUmVjb21tZW5kYXRpb24ob3RoZXJSZWNvbW1lbmRhdGlvbik7Ci0JCQlpZiAobWF0Y2hJblRoaXMgPT0gbnVsbCkgewotCQkJCXJlY29tbWVuZGF0aW9ucy5hZGQob3RoZXJSZWNvbW1lbmRhdGlvbik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlSZWNvbW1lbmRhdGlvbiBuZXdSZWMgPSBvdGhlclJlY29tbWVuZGF0aW9uLm1lcmdlKG1hdGNoSW5UaGlzKTsKLQkJCWlmIChuZXdSZWMgIT0gbnVsbCkgewotCQkJCXJlY29tbWVuZGF0aW9ucy5yZW1vdmUobWF0Y2hJblRoaXMpOwotCQkJCXJlY29tbWVuZGF0aW9ucy5hZGQobmV3UmVjKTsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQlyZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMoRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIDAsICJDb25mbGljdCBiZXR3ZWVuIHJlY29tbWVuZGF0aW9ucyIsIG51bGwpOwotCQkJCXJlc3VsdC5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCAiY2FuJ3QgbWVyZ2UgIiArIG90aGVyUmVjb21tZW5kYXRpb24gKyAiIHdpdGggIiArIG1hdGNoSW5UaGlzKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvciBwYXJzZShTdHJpbmcgZGVzY3JpcHRvcikgewotCQlTdHJpbmdUb2tlbml6ZXIgZW50cmllcyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZGVzY3JpcHRvciwgIlxuIik7Ci0JCVNldCByZWNvbW1lbmRhdGlvbnMgPSBuZXcgSGFzaFNldChlbnRyaWVzLmNvdW50VG9rZW5zKCkpOwotCQl3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nVG9rZW5pemVyIG9uZVJlYyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoKFN0cmluZykgZW50cmllcy5uZXh0RWxlbWVudCgpLCAiLyIpOwotCQkJaWYgKG9uZVJlYy5jb3VudFRva2VucygpICE9IDQpIHsKLQkJCQkvL2Zvcm1hdCBlcnJvciwgaWdub3JlIGFuZCBjb250aW51ZQotCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgbnMgPSBvbmVSZWMubmV4dFRva2VuKCkudHJpbSgpOwotCQkJU3RyaW5nIG5hbWUgPSBvbmVSZWMubmV4dFRva2VuKCkudHJpbSgpOwotCQkJU3RyaW5nIG9sZFJhbmdlID0gb25lUmVjLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCVN0cmluZyBuZXdSYW5nZSA9IG9uZVJlYy5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlyZWNvbW1lbmRhdGlvbnMuYWRkKG5ldyBSZWNvbW1lbmRhdGlvbihNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KG5zLCBuYW1lLCBuZXcgVmVyc2lvblJhbmdlKG9sZFJhbmdlKSwgbnVsbCwgZmFsc2UsIGZhbHNlKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShucywgbmFtZSwgbmV3IFZlcnNpb25SYW5nZShuZXdSYW5nZSksIG51bGwsIGZhbHNlLCBmYWxzZSkpKTsKLQkJfQotCQlyZXR1cm4gbmV3IFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvcihyZWNvbW1lbmRhdGlvbnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHNlcmlhbGl6ZShSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IgdG9TZXJpYWxpemUpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRvU2VyaWFsaXplLnJlY29tbWVuZGF0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlSZWNvbW1lbmRhdGlvbiBlbnRyeSA9IChSZWNvbW1lbmRhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotCQkJcmVzdWx0LmFwcGVuZChlbnRyeS5hcHBseU9uKCkuZ2V0TmFtZXNwYWNlKCkgKyAnLycgKyBlbnRyeS5hcHBseU9uKCkuZ2V0TmFtZSgpICsgJy8nICsgZW50cnkuYXBwbHlPbigpLmdldFJhbmdlKCkudG9TdHJpbmcoKSArICcvJyArIGVudHJ5Lm5ld1ZhbHVlKCkuZ2V0UmFuZ2UoKS50b1N0cmluZygpICsgJ1xuJyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZShSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3Igb3RoZXIpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IG90aGVyLnJlY29tbWVuZGF0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlSZWNvbW1lbmRhdGlvbiBvdGhlclJlY29tbWVuZGF0aW9uID0gKFJlY29tbWVuZGF0aW9uKSBpdC5uZXh0KCk7Ci0JCQlSZWNvbW1lbmRhdGlvbiBtYXRjaEluVGhpcyA9IGZpbmRSZWNvbW1lbmRhdGlvbihvdGhlclJlY29tbWVuZGF0aW9uKTsKLQkJCWlmIChtYXRjaEluVGhpcyA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIW90aGVyUmVjb21tZW5kYXRpb24uaXNDb21wYXRpYmxlKG1hdGNoSW5UaGlzKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUmVxdWlyZW1lbnRCYXNlZEZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1JlcXVpcmVtZW50QmFzZWRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4YjgxMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvUmVxdWlyZW1lbnRCYXNlZEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5SZXF1aXJlZENhcGFiaWxpdHk7Ci0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlbWVudEJhc2VkRmlsdGVyIGV4dGVuZHMgSVVGaWx0ZXIgewotCXByaXZhdGUgUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxczsKLQotCXB1YmxpYyBSZXF1aXJlbWVudEJhc2VkRmlsdGVyKFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHRvRmlsdGVyT24pIHsKLQkJcmVxcyA9IHRvRmlsdGVyT247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWNjZXB0KElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXFzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVxc1tpXS5nZXROYW1lc3BhY2UoKS5lcXVhbHMoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQpICYmIHJlcXNbaV0uZ2V0TmFtZSgpLmVxdWFscyhpdS5nZXRJZCgpKSAmJiByZXFzW2ldLmdldFJhbmdlKCkuaXNJbmNsdWRlZChpdS5nZXRWZXJzaW9uKCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvU2ltcGxlRGlyZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9TaW1wbGVEaXJlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTM0ODkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9TaW1wbGVEaXJlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yb2xsYmFjay5Gb3JtZXJTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24uQWdlbnRMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFNpbXBsZURpcmVjdG9yIGltcGxlbWVudHMgSURpcmVjdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9MTEJBQ0tfTE9DQVRJT04gPSAicm9sbGJhY2siOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIGludCBQbGFuV29yayA9IDEwOwotCXN0YXRpYyBmaW5hbCBpbnQgRW5naW5lV29yayA9IDEwMDsKLQlwcml2YXRlIElFbmdpbmUgZW5naW5lOwotCXByaXZhdGUgSVBsYW5uZXIgcGxhbm5lcjsKLQotCXB1YmxpYyBTaW1wbGVEaXJlY3RvcigpIHsKLQkJaW5pdGlhbGl6ZVJvbGxiYWNrUmVwb3NpdG9yeSgpOwotCQllbmdpbmUgPSAoSUVuZ2luZSkgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKERpcmVjdG9yQWN0aXZhdG9yLmNvbnRleHQsIElFbmdpbmUuU0VSVklDRV9OQU1FKTsKLQkJaWYgKGVuZ2luZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUHJvdmlzaW9uaW5nIGVuZ2luZSBpcyBub3QgcmVnaXN0ZXJlZCIpOyAvLyROT04tTkxTLTEkCi0JCXBsYW5uZXIgPSAoSVBsYW5uZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShEaXJlY3RvckFjdGl2YXRvci5jb250ZXh0LCBJUGxhbm5lci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAocGxhbm5lciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGZpbmQgcHJvdmlzaW9uaW5nIHBsYW5uZXIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUm9sbGJhY2tSZXBvc2l0b3J5KCkgewotCQluZXcgRm9ybWVyU3RhdGUoZ2V0Um9sbGJhY2tSZXBvc2l0b3J5TG9jYXRpb24oKSk7Ci0JfQotCi0JcHVibGljIFVSTCBnZXRSb2xsYmFja1JlcG9zaXRvcnlMb2NhdGlvbigpIHsKLQkJQWdlbnRMb2NhdGlvbiBhZ2VudExvY2F0aW9uID0gKEFnZW50TG9jYXRpb24pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShEaXJlY3RvckFjdGl2YXRvci5jb250ZXh0LCBBZ2VudExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChhZ2VudExvY2F0aW9uLmdldERhdGFBcmVhKERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SKSwgUk9MTEJBQ0tfTE9DQVRJT04pOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy93ZSBrbm93IHRoaXMgY2FuJ3QgaGFwcGVuIGJlY2F1c2UgdGhlIGFib3ZlIFVSTCBpcyB3ZWxsLWZvcm1lZAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyByZXZlcnQoSUluc3RhbGxhYmxlVW5pdCB0YXJnZXQsIElQcm9maWxlIHByb2ZpbGUsIFByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN1Yk1vbml0b3Igc3ViID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIE1lc3NhZ2VzLkRpcmVjdG9yX1Rhc2tfVXBkYXRpbmcsIFBsYW5Xb3JrICsgRW5naW5lV29yayk7Ci0JCXRyeSB7Ci0JCQlQcm92aXNpb25pbmdQbGFuIHBsYW4gPSBwbGFubmVyLmdldFJldmVydFBsYW4odGFyZ2V0LCBjb250ZXh0LCBzdWIubmV3Q2hpbGQoUGxhbldvcmspKTsKLQkJCWlmICghcGxhbi5nZXRTdGF0dXMoKS5pc09LKCkpCi0JCQkJcmV0dXJuIHBsYW4uZ2V0U3RhdHVzKCk7Ci0JCQlyZXR1cm4gZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgbmV3IERlZmF1bHRQaGFzZVNldCgpLCBwbGFuLmdldE9wZXJhbmRzKCksIGNvbnRleHQsIHN1Yi5uZXdDaGlsZChFbmdpbmVXb3JrKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWIuZG9uZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcHJvdmlzaW9uKFByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QsIFByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN0cmluZyB0YXNrTmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLkRpcmVjdG9yX1Rhc2tfSW5zdGFsbGluZywgcmVxdWVzdC5nZXRQcm9maWxlKCkuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9JTlNUQUxMX0ZPTERFUikpOwotCQlTdWJNb25pdG9yIHN1YiA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCB0YXNrTmFtZSwgUGxhbldvcmsgKyBFbmdpbmVXb3JrKTsKLQkJdHJ5IHsKLQkJCUlJbnN0YWxsYWJsZVVuaXRbXSBpbnN0YWxsUm9vdHMgPSByZXF1ZXN0LmdldEFkZGVkSW5zdGFsbGFibGVVbml0cygpOwotCQkJLy8gbWFyayB0aGUgcm9vdHMgYXMgc3VjaAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0YWxsUm9vdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZXF1ZXN0LnNldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0eShpbnN0YWxsUm9vdHNbaV0sIElJbnN0YWxsYWJsZVVuaXQuUFJPUF9QUk9GSUxFX1JPT1RfSVUsIEJvb2xlYW4udG9TdHJpbmcodHJ1ZSkpOwotCQkJfQotCQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcXVlc3QsIGNvbnRleHQsIHN1Yi5uZXdDaGlsZChQbGFuV29yaykpOwotCQkJaWYgKCFwbGFuLmdldFN0YXR1cygpLmlzT0soKSkKLQkJCQlyZXR1cm4gcGxhbi5nZXRTdGF0dXMoKTsKLQotCQkJSVN0YXR1cyBlbmdpbmVSZXN1bHQgPSBlbmdpbmUucGVyZm9ybShyZXF1ZXN0LmdldFByb2ZpbGUoKSwgbmV3IERlZmF1bHRQaGFzZVNldCgpLCBwbGFuLmdldE9wZXJhbmRzKCksIGNvbnRleHQsIHN1Yi5uZXdDaGlsZChFbmdpbmVXb3JrKSk7Ci0JCQlyZXR1cm4gZW5naW5lUmVzdWx0OwotCQl9IGZpbmFsbHkgewotCQkJc3ViLmRvbmUoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9TaW1wbGVQbGFubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvU2ltcGxlUGxhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTkwMTE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9TaW1wbGVQbGFubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAlHZW51aXRlYyAtIGJ1ZyBmaXhlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlc29sdXRpb24uUmVzb2x1dGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJvbGxiYWNrLkZvcm1lclN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5VcGRhdGVRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZVBsYW5uZXIgaW1wbGVtZW50cyBJUGxhbm5lciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEV4cGFuZFdvcmsgPSAxMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBTk5FUl9NQVJLRVIgPSAicHJpdmF0ZS5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnBsYW5uZXIuaW5zdGFsbGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVU0lPTl9SVUxFUyA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmludGVybmFsLmluY2x1c2lvbi5ydWxlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVByb2ZpbGUgZ2V0UHJvZmlsZShTdHJpbmcgcHJvZmlsZUlkKSB7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShEaXJlY3RvckFjdGl2YXRvci5jb250ZXh0LCBJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwcm9maWxlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcHJvZmlsZVJlZ2lzdHJ5LmdldFByb2ZpbGUocHJvZmlsZUlkKTsKLQl9Ci0KLQlwcml2YXRlIFByb3Zpc2lvbmluZ1BsYW4gZ2VuZXJhdGVQcm92aXNpb25pbmdQbGFuKElTdGF0dXMgc3RhdHVzLCBDb2xsZWN0aW9uIGZyb21TdGF0ZSwgQ29sbGVjdGlvbiB0b1N0YXRlLCBQcm9maWxlQ2hhbmdlUmVxdWVzdCBjaGFuZ2VSZXF1ZXN0KSB7Ci0JCUluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSBpdU9wZXJhbmRzID0gZ2VuZXJhdGVPcGVyYXRpb25zKGZyb21TdGF0ZSwgdG9TdGF0ZSk7Ci0JCVByb3BlcnR5T3BlcmFuZFtdIHByb3BlcnR5T3BlcmFuZHMgPSBnZW5lcmF0ZVByb3BlcnR5T3BlcmF0aW9ucyhjaGFuZ2VSZXF1ZXN0KTsKLQotCQlPcGVyYW5kW10gb3BlcmFuZHMgPSBuZXcgT3BlcmFuZFtpdU9wZXJhbmRzLmxlbmd0aCArIHByb3BlcnR5T3BlcmFuZHMubGVuZ3RoXTsKLQkJU3lzdGVtLmFycmF5Y29weShpdU9wZXJhbmRzLCAwLCBvcGVyYW5kcywgMCwgaXVPcGVyYW5kcy5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHByb3BlcnR5T3BlcmFuZHMsIDAsIG9wZXJhbmRzLCBpdU9wZXJhbmRzLmxlbmd0aCwgcHJvcGVydHlPcGVyYW5kcy5sZW5ndGgpOwotCi0JCWlmIChzdGF0dXMgPT0gbnVsbCkKLQkJCXN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nUGxhbihzdGF0dXMsIG9wZXJhbmRzKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5T3BlcmFuZFtdIGdlbmVyYXRlUHJvcGVydHlPcGVyYXRpb25zKFByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHByb2ZpbGVDaGFuZ2VSZXF1ZXN0KSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBwcm9maWxlQ2hhbmdlUmVxdWVzdC5nZXRQcm9maWxlKCk7Ci0JCUxpc3Qgb3BlcmFuZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIEZpcnN0IGRlYWwgd2l0aCBwcm9maWxlIHByb3BlcnRpZXMgdG8gcmVtb3ZlLiAgT25seSBnZW5lcmF0ZSBhbiBvcGVyYW5kIGlmIHRoZSBwcm9wZXJ0eSB3YXMgdGhlcmUgaW4gdGhlIGZpcnN0IHBsYWNlCi0JCVN0cmluZ1tdIHRvUmVtb3ZlID0gcHJvZmlsZUNoYW5nZVJlcXVlc3QuZ2V0UHJvcGVydGllc1RvUmVtb3ZlKCk7Ci0JCU1hcCBleGlzdGluZ1Byb3BlcnRpZXMgPSBwcm9maWxlLmdldFByb3BlcnRpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b1JlbW92ZS5sZW5ndGg7IGkrKykgewotCQkJaWYgKGV4aXN0aW5nUHJvcGVydGllcy5jb250YWluc0tleSh0b1JlbW92ZVtpXSkpCi0JCQkJb3BlcmFuZHMuYWRkKG5ldyBQcm9wZXJ0eU9wZXJhbmQodG9SZW1vdmVbaV0sIGV4aXN0aW5nUHJvcGVydGllcy5nZXQodG9SZW1vdmVbaV0pLCBudWxsKSk7Ci0JCX0KLQkJLy8gTm93IGRlYWwgd2l0aCBwcm9maWxlIHByb3BlcnR5IGNoYW5nZXMvYWRkaXRpb25zCi0JCU1hcCBwcm9wZXJ0eUNoYW5nZXMgPSBwcm9maWxlQ2hhbmdlUmVxdWVzdC5nZXRQcm9wZXJ0aWVzVG9BZGQoKTsKLQkJSXRlcmF0b3IgaXRlciA9IHByb3BlcnR5Q2hhbmdlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCW9wZXJhbmRzLmFkZChuZXcgUHJvcGVydHlPcGVyYW5kKGtleSwgZXhpc3RpbmdQcm9wZXJ0aWVzLmdldChrZXkpLCBwcm9wZXJ0eUNoYW5nZXMuZ2V0KGtleSkpKTsKLQkJfQotCQkvLyBOb3cgZGVhbCB3aXRoIGl1IHByb3BlcnR5IGNoYW5nZXMvYWRkaXRpb25zLiAgCi0JCS8vIFRPRE8gd2UgYXJlbid0IHlldCBjaGVja2luZyB0aGF0IHRoZSBJVSB3aWxsIGV4aXN0IGluIHRoZSBmaW5hbCBwcm9maWxlLCB3aWxsIHRoZSBlbmdpbmUgZG8gdGhpcz8KLQkJTWFwIGFsbElVUHJvcGVydHlDaGFuZ2VzID0gcHJvZmlsZUNoYW5nZVJlcXVlc3QuZ2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnRpZXNUb0FkZCgpOwotCQlpdGVyID0gYWxsSVVQcm9wZXJ0eUNoYW5nZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXIubmV4dCgpOwotCQkJTWFwIGl1UHJvcGVydHlDaGFuZ2VzID0gKE1hcCkgYWxsSVVQcm9wZXJ0eUNoYW5nZXMuZ2V0KGl1KTsKLQkJCUl0ZXJhdG9yIGl1UHJvcEl0ZXIgPSBpdVByb3BlcnR5Q2hhbmdlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl1UHJvcEl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl1UHJvcEl0ZXIubmV4dCgpOwotCQkJCU9iamVjdCBvbGRWYWx1ZSA9IHByb2ZpbGUuZ2V0SW5zdGFsbGFibGVVbml0UHJvcGVydHkoaXUsIGtleSk7Ci0JCQkJb3BlcmFuZHMuYWRkKG5ldyBJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eU9wZXJhbmQoaXUsIGtleSwgb2xkVmFsdWUsIGl1UHJvcGVydHlDaGFuZ2VzLmdldChrZXkpKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gTm93IGRlYWwgd2l0aCBpdSBwcm9wZXJ0eSByZW1vdmFscy4KLQkJLy8gVE9ETyB3ZSBjb3VsZCBvcHRpbWl6ZSBieSBub3QgZ2VuZXJhdGluZyBwcm9wZXJ0eSByZW1vdmFscyBmb3IgSVUncyB0aGF0IGFyZW4ndCB0aGVyZSBvciB3b24ndCBiZSB0aGVyZS4gIAotCQlNYXAgYWxsSVVQcm9wZXJ0eURlbGV0aW9ucyA9IHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0aWVzVG9SZW1vdmUoKTsKLQkJaXRlciA9IGFsbElVUHJvcGVydHlEZWxldGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXIubmV4dCgpOwotCQkJTWFwIGV4aXN0aW5nSVVQcm9wZXJ0aWVzID0gcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKGl1KTsKLQkJCUxpc3QgaXVQcm9wZXJ0eVJlbW92YWxzID0gKExpc3QpIGFsbElVUHJvcGVydHlEZWxldGlvbnMuZ2V0KGl1KTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdVByb3BlcnR5UmVtb3ZhbHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGV4aXN0aW5nSVVQcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KGtleSkpCi0JCQkJCW9wZXJhbmRzLmFkZChuZXcgSW5zdGFsbGFibGVVbml0UHJvcGVydHlPcGVyYW5kKGl1LCBrZXksIGV4aXN0aW5nSVVQcm9wZXJ0aWVzLmdldChrZXkpLCBudWxsKSk7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gKFByb3BlcnR5T3BlcmFuZFtdKSBvcGVyYW5kcy50b0FycmF5KG5ldyBQcm9wZXJ0eU9wZXJhbmRbb3BlcmFuZHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10gZ2VuZXJhdGVPcGVyYXRpb25zKENvbGxlY3Rpb24gZnJvbVN0YXRlLCBDb2xsZWN0aW9uIHRvU3RhdGUpIHsKLQkJcmV0dXJuIG5ldyBPcGVyYXRpb25HZW5lcmF0b3IoKS5nZW5lcmF0ZU9wZXJhdGlvbihmcm9tU3RhdGUsIHRvU3RhdGUpOwotCX0KLQotCXB1YmxpYyBQcm92aXNpb25pbmdQbGFuIGdldFJldmVydFBsYW4oSUluc3RhbGxhYmxlVW5pdCBwcm9maWxlU25hcHNob3QsIFByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCVN1Yk1vbml0b3Igc3ViID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIEV4cGFuZFdvcmspOwotCQlzdWIuc2V0VGFza05hbWUoTWVzc2FnZXMuRGlyZWN0b3JfVGFza19SZXNvbHZpbmdfRGVwZW5kZW5jaWVzKTsKLQkJdHJ5IHsKLQkJCU11bHRpU3RhdHVzIHJlc3VsdCA9IG5ldyBNdWx0aVN0YXR1cyhEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgMSwgTWVzc2FnZXMuRGlyZWN0b3JfUmV2ZXJ0X1Byb2JsZW1zLCBudWxsKTsKLQotCQkJaWYgKCFCb29sZWFuLnZhbHVlT2YocHJvZmlsZVNuYXBzaG90LmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX1BST0ZJTEUpKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCXJlc3VsdC5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgTkxTLmJpbmQoTWVzc2FnZXMuRGlyZWN0b3JfVW5leHBlY3RlZF9JVSwgcHJvZmlsZVNuYXBzaG90LmdldElkKCkpKSk7Ci0JCQkJcmV0dXJuIG5ldyBQcm92aXNpb25pbmdQbGFuKHJlc3VsdCk7Ci0JCQl9Ci0JCQlJUHJvZmlsZSBwcm9maWxlID0gZ2V0UHJvZmlsZShwcm9maWxlU25hcHNob3QuZ2V0SWQoKSk7Ci0JCQlpZiAocHJvZmlsZSA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCBOTFMuYmluZChNZXNzYWdlcy5EaXJlY3Rvcl9VbmV4cGVjdGVkX0lVLCBwcm9maWxlU25hcHNob3QuZ2V0SWQoKSkpKTsKLQkJCQlyZXR1cm4gbmV3IFByb3Zpc2lvbmluZ1BsYW4ocmVzdWx0KTsKLQkJCX0KLQkJCUlQcm9maWxlIHJldmVydFByb2ZpbGUgPSBGb3JtZXJTdGF0ZS5JVVRvUHJvZmlsZShwcm9maWxlU25hcHNob3QsIHByb2ZpbGUsIGNvbnRleHQsIHN1Yi5uZXdDaGlsZChFeHBhbmRXb3JrIC8gMikpOwotCi0JCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCBwcm9maWxlQ2hhbmdlUmVxdWVzdCA9IEZvcm1lclN0YXRlLmdlbmVyYXRlUHJvZmlsZURlbHRhQ2hhbmdlUmVxdWVzdChwcm9maWxlLCByZXZlcnRQcm9maWxlKTsKLQkJCXJldHVybiBnZXRQcm92aXNpb25pbmdQbGFuKHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LCBjb250ZXh0LCBzdWIubmV3Q2hpbGQoRXhwYW5kV29yayAvIDIpKTsKLQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nUGxhbihlLmdldFN0YXR1cygpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXN1Yi5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXRbXSBmaW5kUGxhbm5lck1hcmtlZElVcyhmaW5hbCBJUHJvZmlsZSBwcm9maWxlKSB7Ci0JCVF1ZXJ5IG1hcmtlclF1ZXJ5ID0gbmV3IFF1ZXJ5KCkgewotCQkJcHVibGljIGJvb2xlYW4gaXNNYXRjaChPYmplY3QgY2FuZGlkYXRlKSB7Ci0JCQkJaWYgKCEoY2FuZGlkYXRlIGluc3RhbmNlb2YgSUluc3RhbGxhYmxlVW5pdCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgY2FuZGlkYXRlOwotCi0JCQkJLy8gVE9ETzogcmVtb3ZlIG1hcmtlciAtLSB0ZW1wb3JhcnkgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgb25seQotCQkJCVN0cmluZyBtYXJrZXIgPSBwcm9maWxlLmdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGl1LCBQTEFOTkVSX01BUktFUik7Ci0JCQkJaWYgKG1hcmtlciAhPSBudWxsICYmIEJvb2xlYW4udmFsdWVPZihtYXJrZXIpLmJvb2xlYW5WYWx1ZSgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJCVN0cmluZyBpbmNsdXNpb24gPSBwcm9maWxlLmdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGl1LCBJTkNMVVNJT05fUlVMRVMpOwotCQkJCXJldHVybiAoaW5jbHVzaW9uICE9IG51bGwpOwotCQkJfQotCQl9OwotCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXRbXSkgcHJvZmlsZS5xdWVyeShtYXJrZXJRdWVyeSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS50b0FycmF5KElJbnN0YWxsYWJsZVVuaXQuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGljdGlvbmFyeSBjcmVhdGVTZWxlY3Rpb25Db250ZXh0KE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCUhhc2h0YWJsZSByZXN1bHQgPSBuZXcgSGFzaHRhYmxlKHByb3BlcnRpZXMpOwotCQlTdHJpbmcgZW52aXJvbm1lbnRzID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMpOwotCQlpZiAoZW52aXJvbm1lbnRzID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQlmb3IgKFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVudmlyb25tZW50cywgIiwiKTsgdG9rZW5pemVyLmhhc01vcmVFbGVtZW50cygpOykgeyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZW50cnkgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpbnQgaSA9IGVudHJ5LmluZGV4T2YoJz0nKTsKLQkJCVN0cmluZyBrZXkgPSBlbnRyeS5zdWJzdHJpbmcoMCwgaSkudHJpbSgpOwotCQkJU3RyaW5nIHZhbHVlID0gZW50cnkuc3Vic3RyaW5nKGkgKyAxKS50cmltKCk7Ci0JCQlyZXN1bHQucHV0KGtleSwgdmFsdWUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0W10gZ2F0aGVyQXZhaWxhYmxlSW5zdGFsbGFibGVVbml0cyhJSW5zdGFsbGFibGVVbml0W10gYWRkaXRpb25hbFNvdXJjZSwgVVJMW10gcmVwb3NpdG9yaWVzLCBQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlNYXAgcmVzdWx0c01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChhZGRpdGlvbmFsU291cmNlICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbFNvdXJjZS5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBrZXkgPSBhZGRpdGlvbmFsU291cmNlW2ldLmdldElkKCkgKyAiXyIgKyBhZGRpdGlvbmFsU291cmNlW2ldLmdldFZlcnNpb24oKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0c01hcC5wdXQoa2V5LCBhZGRpdGlvbmFsU291cmNlW2ldKTsKLQkJCX0KLQkJfQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBjb250ZXh0LmdldEV4dHJhSVVzKCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyLm5leHQoKTsKLQkJCQlTdHJpbmcga2V5ID0gaXUuZ2V0SWQoKSArICdfJyArIGl1LmdldFZlcnNpb24oKS50b1N0cmluZygpOwotCQkJCXJlc3VsdHNNYXAucHV0KGtleSwgaXUpOwotCQkJfQotCQl9Ci0KLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgcmVwb01nciA9IChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKERpcmVjdG9yQWN0aXZhdG9yLmNvbnRleHQsIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChyZXBvc2l0b3JpZXMgPT0gbnVsbCkKLQkJCXJlcG9zaXRvcmllcyA9IHJlcG9NZ3IuZ2V0S25vd25SZXBvc2l0b3JpZXMoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX0FMTCk7Ci0KLQkJU3ViTW9uaXRvciBzdWIgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgcmVwb3NpdG9yaWVzLmxlbmd0aCAqIDIwMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3NpdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IHJlcG9NZ3IubG9hZFJlcG9zaXRvcnkocmVwb3NpdG9yaWVzW2ldLCBzdWIubmV3Q2hpbGQoMTAwKSk7Ci0JCQkJQ29sbGVjdG9yIG1hdGNoZXMgPSByZXBvc2l0b3J5LnF1ZXJ5KG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShudWxsLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSksIG5ldyBDb2xsZWN0b3IoKSwgc3ViLm5ld0NoaWxkKDEwMCkpOwotCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBtYXRjaGVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdC5uZXh0KCk7Ci0JCQkJCVN0cmluZyBrZXkgPSBpdS5nZXRJZCgpICsgIl8iICsgaXUuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSUluc3RhbGxhYmxlVW5pdCBjdXJyZW50SVUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcmVzdWx0c01hcC5nZXQoa2V5KTsKLQkJCQkJaWYgKGN1cnJlbnRJVSA9PSBudWxsIHx8IGhhc0hpZ2hlckZpZGVsaXR5KGl1LCBjdXJyZW50SVUpKQotCQkJCQkJcmVzdWx0c01hcC5wdXQoa2V5LCBpdSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvL3NraXAgdW5yZWFkYWJsZSByZXBvc2l0b3JpZXMKLQkJCX0KLQkJfQotCQlzdWIuZG9uZSgpOwotCQlDb2xsZWN0aW9uIHJlc3VsdHMgPSByZXN1bHRzTWFwLnZhbHVlcygpOwotCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXRbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNIaWdoZXJGaWRlbGl0eShJSW5zdGFsbGFibGVVbml0IGl1LCBJSW5zdGFsbGFibGVVbml0IGN1cnJlbnRJVSkgewotCQlpZiAoQm9vbGVhbi52YWx1ZU9mKGN1cnJlbnRJVS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfUEFSVElBTF9JVSkpLmJvb2xlYW5WYWx1ZSgpICYmICFCb29sZWFuLnZhbHVlT2YoaXUuZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BBUlRJQUxfSVUpKS5ib29sZWFuVmFsdWUoKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFByb3Zpc2lvbmluZ1BsYW4gZ2V0UHJvdmlzaW9uaW5nUGxhbihQcm9maWxlQ2hhbmdlUmVxdWVzdCBwcm9maWxlQ2hhbmdlUmVxdWVzdCwgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJU3ViTW9uaXRvciBzdWIgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgRXhwYW5kV29yayk7Ci0JCXN1Yi5zZXRUYXNrTmFtZShNZXNzYWdlcy5EaXJlY3Rvcl9UYXNrX1Jlc29sdmluZ19EZXBlbmRlbmNpZXMpOwotCQl0cnkgewotCQkJSVByb2ZpbGUgcHJvZmlsZSA9IHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldFByb2ZpbGUoKTsKLQotCQkJSUluc3RhbGxhYmxlVW5pdFtdIGFsbElVcyA9IHVwZGF0ZVBsYW5uZXJJbmZvKHByb2ZpbGVDaGFuZ2VSZXF1ZXN0KTsKLQotCQkJVVJMW10gbWV0YWRhdGFSZXBvc2l0b3JpZXMgPSAoY29udGV4dCAhPSBudWxsKSA/IGNvbnRleHQuZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoKSA6IG51bGw7Ci0JCQlEaWN0aW9uYXJ5IG5ld1NlbGVjdGlvbkNvbnRleHQgPSBjcmVhdGVTZWxlY3Rpb25Db250ZXh0KHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldFByb2ZpbGVQcm9wZXJ0aWVzKCkpOwotCi0JCQlMaXN0IGV4dHJhSVVzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldEFkZGVkSW5zdGFsbGFibGVVbml0cygpKSk7Ci0JCQlleHRyYUlVcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm9maWxlQ2hhbmdlUmVxdWVzdC5nZXRSZW1vdmVkSW5zdGFsbGFibGVVbml0cygpKSk7Ci0JCQlleHRyYUlVcy5hZGRBbGwocHJvZmlsZS5hdmFpbGFibGUoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQ29sbGVjdGlvbigpKTsKLQotCQkJSUluc3RhbGxhYmxlVW5pdFtdIGF2YWlsYWJsZUlVcyA9IGdhdGhlckF2YWlsYWJsZUluc3RhbGxhYmxlVW5pdHMoKElJbnN0YWxsYWJsZVVuaXRbXSkgZXh0cmFJVXMudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFtleHRyYUlVcy5zaXplKCldKSwgbWV0YWRhdGFSZXBvc2l0b3JpZXMsIGNvbnRleHQsIHN1Yi5uZXdDaGlsZChFeHBhbmRXb3JrIC8gNCkpOwotCi0JCQlTbGljZXIgc2xpY2VyID0gbmV3IFNsaWNlcihhbGxJVXMsIGF2YWlsYWJsZUlVcywgbmV3U2VsZWN0aW9uQ29udGV4dCk7Ci0JCQlJUXVlcnlhYmxlIHNsaWNlID0gc2xpY2VyLnNsaWNlKGFsbElVcywgbW9uaXRvcik7Ci0JCQlpZiAoc2xpY2UgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFByb3Zpc2lvbmluZ1BsYW4oc2xpY2VyLmdldFN0YXR1cygpKTsKLQkJCVByb2plY3RvciBwcm9qZWN0b3IgPSBuZXcgUHJvamVjdG9yKHNsaWNlLCBuZXdTZWxlY3Rpb25Db250ZXh0KTsKLQkJCXByb2plY3Rvci5lbmNvZGUoYWxsSVVzLCBzdWIubmV3Q2hpbGQoRXhwYW5kV29yayAvIDQpKTsKLQkJCUlTdGF0dXMgcyA9IHByb2plY3Rvci5pbnZva2VTb2x2ZXIoc3ViLm5ld0NoaWxkKEV4cGFuZFdvcmsgLyA0KSk7Ci0KLQkJCWlmIChzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCS8vbG9nIHRoZSBlcnJvciBmcm9tIHRoZSBuZXcgc29sdmVyIHNvIGl0IGlzIG5vdCBsb3N0Ci0JCQkJTG9nSGVscGVyLmxvZyhzKTsKLQkJCQlpZiAoISJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGNvbnRleHQgPT0gbnVsbCA/IG51bGwgOiBjb250ZXh0LmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpc2FibGUuZXJyb3IucmVwb3J0aW5nIikpKSB7Ci0JCQkJCS8vV2UgaW52b2tlIHRoZSBvbGQgcmVzb2x2ZXIgdG8gZ2V0IGV4cGxhbmF0aW9ucyBmb3Igbm93Ci0JCQkJCUlTdGF0dXMgb2xkUmVzb2x2ZXJTdGF0dXMgPSBuZXcgTmV3RGVwZW5kZW5jeUV4cGFuZGVyKGFsbElVcywgbnVsbCwgYXZhaWxhYmxlSVVzLCBuZXdTZWxlY3Rpb25Db250ZXh0LCBmYWxzZSkuZXhwYW5kKHN1Yi5uZXdDaGlsZChFeHBhbmRXb3JrIC8gNCkpOwotCQkJCQlpZiAoIW9sZFJlc29sdmVyU3RhdHVzLmlzT0soKSkKLQkJCQkJCXMgPSBvbGRSZXNvbHZlclN0YXR1czsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBQcm92aXNpb25pbmdQbGFuKHMpOwotCQkJfQotCQkJQ29sbGVjdGlvbiBuZXdTdGF0ZSA9IHByb2plY3Rvci5leHRyYWN0U29sdXRpb24oKTsKLQkJCW5ld1N0YXRlLnJlbW92ZShhbGxJVXNbMF0pOwotCi0JCQlSZXNvbHV0aW9uSGVscGVyIG5ld1N0YXRlSGVscGVyID0gbmV3IFJlc29sdXRpb25IZWxwZXIobmV3U2VsZWN0aW9uQ29udGV4dCwgbnVsbCk7Ci0JCQluZXdTdGF0ZSA9IG5ld1N0YXRlSGVscGVyLmF0dGFjaENVcyhuZXdTdGF0ZSk7Ci0KLQkJCVJlc29sdXRpb25IZWxwZXIgb2xkU3RhdGVIZWxwZXIgPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihjcmVhdGVTZWxlY3Rpb25Db250ZXh0KHByb2ZpbGUuZ2V0UHJvcGVydGllcygpKSwgbnVsbCk7Ci0JCQlDb2xsZWN0aW9uIG9sZFN0YXRlID0gb2xkU3RhdGVIZWxwZXIuYXR0YWNoQ1VzKHByb2ZpbGUucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQ29sbGVjdGlvbigpKTsKLQotCQkJcmV0dXJuIGdlbmVyYXRlUHJvdmlzaW9uaW5nUGxhbihzLCBvbGRTdGF0ZSwgbmV3U3RhdGUsIHByb2ZpbGVDaGFuZ2VSZXF1ZXN0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCXN1Yi5kb25lKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlSVVSZXByZXNlbnRpbmdUaGVQcm9maWxlKEFycmF5TGlzdCBhbGxSZXF1aXJlbWVudHMpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXVkID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgdGltZSA9IExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOwotCQlpdWQuc2V0SWQodGltZSk7Ci0JCWl1ZC5zZXRWZXJzaW9uKG5ldyBWZXJzaW9uKDAsIDAsIDAsIHRpbWUpKTsKLQkJaXVkLnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKChSZXF1aXJlZENhcGFiaWxpdHlbXSkgYWxsUmVxdWlyZW1lbnRzLnRvQXJyYXkobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVthbGxSZXF1aXJlbWVudHMuc2l6ZSgpXSkpOwotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdWQpOwotCX0KLQotCS8vVGhlIHBsYW5uZXIgdXNlcyBpbnN0YWxsYWJsZSB1bml0IHByb3BlcnRpZXMgdG8ga2VlcCB0cmFjayBvZiB3aGF0IGl0IGhhcyBiZWVuIGFza2VkIHRvIGluc3RhbGwuIFRoaXMgdXBkYXRlcyB0aGlzIGluZm9ybWF0aW9uCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0W10gdXBkYXRlUGxhbm5lckluZm8oUHJvZmlsZUNoYW5nZVJlcXVlc3QgcHJvZmlsZUNoYW5nZVJlcXVlc3QpIHsKLQkJLy9TdXBwb3J0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBDb252ZXJ0IHBsYW5uZXJfbWFya2VyIHByb3BlcnRpZXMgaW50byBzdHJpY3QgaW5jbHVzaW9uIHJ1bGVzCi0JCUNvbGxlY3RvciBwcmV2aW91c01hcmtlcnMgPSBwcm9maWxlQ2hhbmdlUmVxdWVzdC5nZXRQcm9maWxlKCkucXVlcnkobmV3IElVUHJvZmlsZVByb3BlcnR5UXVlcnkocHJvZmlsZUNoYW5nZVJlcXVlc3QuZ2V0UHJvZmlsZSgpLCBQTEFOTkVSX01BUktFUiwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJldmlvdXNNYXJrZXJzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJcHJvZmlsZUNoYW5nZVJlcXVlc3Quc2V0SW5zdGFsbGFibGVVbml0SW5jbHVzaW9uUnVsZXMoaXUsIFBsYW5uZXJIZWxwZXIuY3JlYXRlU3RyaWN0SW5jbHVzaW9uUnVsZShpdSkpOwotCQkJcHJvZmlsZUNoYW5nZVJlcXVlc3QucmVtb3ZlSW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KGl1LCBQTEFOTkVSX01BUktFUik7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIGluY2x1ZGVkSVVzID0gcHJvZmlsZUNoYW5nZVJlcXVlc3QuZ2V0UHJvZmlsZSgpLnF1ZXJ5KG5ldyBJVVByb2ZpbGVQcm9wZXJ0eVF1ZXJ5KHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldFByb2ZpbGUoKSwgSU5DTFVTSU9OX1JVTEVTLCBudWxsKSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS50b0NvbGxlY3Rpb24oKTsKLQkJQ29sbGVjdGlvbiBhbHJlYWR5SW5zdGFsbGVkID0gbmV3IEhhc2hTZXQoaW5jbHVkZWRJVXMpOwotCQlhbHJlYWR5SW5zdGFsbGVkLmFkZEFsbChwcmV2aW91c01hcmtlcnMudG9Db2xsZWN0aW9uKCkpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXRbXSBhZGRlZCA9IHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldEFkZGVkSW5zdGFsbGFibGVVbml0cygpOwotCQlJSW5zdGFsbGFibGVVbml0W10gcmVtb3ZlZCA9IHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldFJlbW92ZWRJbnN0YWxsYWJsZVVuaXRzKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0aWVzVG9SZW1vdmUoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBvYmplY3QgPSAoTWFwLkVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoKChMaXN0KSBvYmplY3QuZ2V0VmFsdWUoKSkuY29udGFpbnMoSU5DTFVTSU9OX1JVTEVTKSkKLQkJCQlwcm9maWxlQ2hhbmdlUmVxdWVzdC5zZXRJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydHkoKElJbnN0YWxsYWJsZVVuaXQpIG9iamVjdC5nZXRLZXkoKSwgSU5DTFVTSU9OX1JVTEVTLCBQbGFubmVySGVscGVyLmNyZWF0ZVN0cmljdEluY2x1c2lvblJ1bGUoKElJbnN0YWxsYWJsZVVuaXQpIG9iamVjdC5nZXRLZXkoKSkpOwotCQl9Ci0JCS8vUmVtb3ZlIHRoZSBpdSBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgdG8gdGhlIGl1cyByZW1vdmVkIGFuZCB0aGUgaXUgcHJvcGVydGllcyBiZWluZyByZW1vdmVkIGFzIHdlbGwKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFscmVhZHlJbnN0YWxsZWQuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlbW92ZWQubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaXUuZXF1YWxzKHJlbW92ZWRbaV0pKSB7Ci0JCQkJCXByb2ZpbGVDaGFuZ2VSZXF1ZXN0LnJlbW92ZUluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0eShyZW1vdmVkW2ldLCBJTkNMVVNJT05fUlVMRVMpOwotCQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQXJyYXlMaXN0IGdhdGhlcmVkUmVxdWlyZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vUHJvY2VzcyBhbGwgdGhlIElVcyBiZWluZyBhZGRlZAotCQlNYXAgaXVQcm9wZXJ0aWVzVG9BZGQgPSBwcm9maWxlQ2hhbmdlUmVxdWVzdC5nZXRJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydGllc1RvQWRkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkZWQubGVuZ3RoOyBpKyspIHsKLQkJCU1hcCBwcm9wZXJ0aWVzRm9ySVUgPSAoTWFwKSBpdVByb3BlcnRpZXNUb0FkZC5nZXQoYWRkZWRbaV0pOwotCQkJUmVxdWlyZWRDYXBhYmlsaXR5IHByb2ZpbGVSZXF1aXJlbWVudCA9IG51bGw7Ci0JCQlpZiAocHJvcGVydGllc0ZvcklVICE9IG51bGwpIHsKLQkJCQlwcm9maWxlUmVxdWlyZW1lbnQgPSBjcmVhdGVSZXF1aXJlbWVudChhZGRlZFtpXSwgKFN0cmluZykgcHJvcGVydGllc0ZvcklVLmdldChJTkNMVVNJT05fUlVMRVMpKTsKLQkJCX0KLQkJCWlmIChwcm9maWxlUmVxdWlyZW1lbnQgPT0gbnVsbCkgewotCQkJCXByb2ZpbGVDaGFuZ2VSZXF1ZXN0LnNldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0eShhZGRlZFtpXSwgSU5DTFVTSU9OX1JVTEVTLCBQbGFubmVySGVscGVyLmNyZWF0ZVN0cmljdEluY2x1c2lvblJ1bGUoYWRkZWRbaV0pKTsKLQkJCQlwcm9maWxlUmVxdWlyZW1lbnQgPSBjcmVhdGVTdHJpY3RSZXF1aXJlbWVudChhZGRlZFtpXSk7Ci0JCQl9Ci0JCQlnYXRoZXJlZFJlcXVpcmVtZW50cy5hZGQocHJvZmlsZVJlcXVpcmVtZW50KTsKLQkJfQotCi0JCS8vUHJvY2VzcyB0aGUgSVVzIHRoYXQgd2VyZSBhbHJlYWR5IHRoZXJlCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhbHJlYWR5SW5zdGFsbGVkLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJTWFwIHByb3BlcnRpZXNGb3JJVSA9IChNYXApIGl1UHJvcGVydGllc1RvQWRkLmdldChpdSk7Ci0JCQlSZXF1aXJlZENhcGFiaWxpdHkgcHJvZmlsZVJlcXVpcmVtZW50ID0gbnVsbDsKLQkJCS8vVGVzdCBpZiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQKLQkJCWlmIChwcm9wZXJ0aWVzRm9ySVUgIT0gbnVsbCkgewotCQkJCXByb2ZpbGVSZXF1aXJlbWVudCA9IGNyZWF0ZVJlcXVpcmVtZW50KGl1LCAoU3RyaW5nKSBwcm9wZXJ0aWVzRm9ySVUuZ2V0KElOQ0xVU0lPTl9SVUxFUykpOwotCQkJfQotCQkJaWYgKHByb2ZpbGVSZXF1aXJlbWVudCA9PSBudWxsKSB7Ci0JCQkJcHJvZmlsZVJlcXVpcmVtZW50ID0gY3JlYXRlUmVxdWlyZW1lbnQoaXUsIHByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmdldFByb2ZpbGUoKS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShpdSwgSU5DTFVTSU9OX1JVTEVTKSk7Ci0JCQl9Ci0JCQlnYXRoZXJlZFJlcXVpcmVtZW50cy5hZGQocHJvZmlsZVJlcXVpcmVtZW50KTsKLQkJfQotCQlyZXR1cm4gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7Y3JlYXRlSVVSZXByZXNlbnRpbmdUaGVQcm9maWxlKGdhdGhlcmVkUmVxdWlyZW1lbnRzKX07Ci0JfQotCi0JcHJpdmF0ZSBSZXF1aXJlZENhcGFiaWxpdHkgY3JlYXRlUmVxdWlyZW1lbnQoSUluc3RhbGxhYmxlVW5pdCBpdSwgU3RyaW5nIHJ1bGUpIHsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAocnVsZS5lcXVhbHMoUGxhbm5lckhlbHBlci5jcmVhdGVTdHJpY3RJbmNsdXNpb25SdWxlKGl1KSkpIHsKLQkJCXJldHVybiBjcmVhdGVTdHJpY3RSZXF1aXJlbWVudChpdSk7Ci0JCX0KLQkJaWYgKHJ1bGUuZXF1YWxzKFBsYW5uZXJIZWxwZXIuY3JlYXRlT3B0aW9uYWxJbmNsdXNpb25SdWxlKGl1KSkpIHsKLQkJCXJldHVybiBjcmVhdGVPcHRpb25hbFJlcXVpcmVtZW50KGl1KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFJlcXVpcmVkQ2FwYWJpbGl0eSBjcmVhdGVPcHRpb25hbFJlcXVpcmVtZW50KElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGl1LmdldElkKCksIG5ldyBWZXJzaW9uUmFuZ2UoaXUuZ2V0VmVyc2lvbigpLCB0cnVlLCBpdS5nZXRWZXJzaW9uKCksIHRydWUpLCBudWxsLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBSZXF1aXJlZENhcGFiaWxpdHkgY3JlYXRlU3RyaWN0UmVxdWlyZW1lbnQoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgaXUuZ2V0SWQoKSwgbmV3IFZlcnNpb25SYW5nZShpdS5nZXRWZXJzaW9uKCksIHRydWUsIGl1LmdldFZlcnNpb24oKSwgdHJ1ZSksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXRbXSB1cGRhdGVzRm9yKElJbnN0YWxsYWJsZVVuaXQgdG9VcGRhdGUsIFByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCU1hcCByZXN1bHRzTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciByZXBvTWdyID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dCwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJVVJMW10gcmVwb3NpdG9yaWVzID0gY29udGV4dC5nZXRNZXRhZGF0YVJlcG9zaXRvcmllcygpOwotCQlpZiAocmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQlyZXBvc2l0b3JpZXMgPSByZXBvTWdyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19BTEwpOwotCi0JCVN1Yk1vbml0b3Igc3ViID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIHJlcG9zaXRvcmllcy5sZW5ndGggKiAyMDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcG9zaXRvcmllcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSByZXBvTWdyLmxvYWRSZXBvc2l0b3J5KHJlcG9zaXRvcmllc1tpXSwgc3ViLm5ld0NoaWxkKDEwMCkpOwotCQkJCUNvbGxlY3RvciBtYXRjaGVzID0gcmVwb3NpdG9yeS5xdWVyeShuZXcgVXBkYXRlUXVlcnkodG9VcGRhdGUpLCBuZXcgQ29sbGVjdG9yKCksIHN1Yi5uZXdDaGlsZCgxMDApKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbWF0Y2hlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXQubmV4dCgpOwotCQkJCQlTdHJpbmcga2V5ID0gaXUuZ2V0SWQoKSArICJfIiArIGl1LmdldFZlcnNpb24oKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQkJCUlJbnN0YWxsYWJsZVVuaXQgY3VycmVudElVID0gKElJbnN0YWxsYWJsZVVuaXQpIHJlc3VsdHNNYXAuZ2V0KGtleSk7Ci0JCQkJCWlmIChjdXJyZW50SVUgPT0gbnVsbCB8fCBoYXNIaWdoZXJGaWRlbGl0eShpdSwgY3VycmVudElVKSkKLQkJCQkJCXJlc3VsdHNNYXAucHV0KGtleSwgaXUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9za2lwIHVucmVhZGFibGUgcmVwb3NpdG9yaWVzCi0JCQl9Ci0JCX0KLQkJc3ViLmRvbmUoKTsKLQkJQ29sbGVjdGlvbiByZXN1bHRzID0gcmVzdWx0c01hcC52YWx1ZXMoKTsKLQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0W10pIHJlc3VsdHMudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFtyZXN1bHRzLnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9TbGljZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9TbGljZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlZTE5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZGlyZWN0b3IvU2xpY2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuQ2FwYWJpbGl0eVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuSVF1ZXJ5YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5JbnZhbGlkU3ludGF4RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2xpY2VyIHsKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJpdmF0ZSBJUXVlcnlhYmxlIHBvc3NpYmlsaXRlczsKLQotCXByaXZhdGUgTGlua2VkTGlzdCB0b1Byb2Nlc3M7Ci0JcHJpdmF0ZSBTZXQgY29uc2lkZXJlZDsgLy9JVXMgdG8gYWRkIHRvIHRoZSBzbGljZQotCXByaXZhdGUgVHdvVGllck1hcCBzbGljZTsgLy9UaGUgSVVzIHRoYXQgaGF2ZSBiZWVuIGNvbnNpZGVyZWQgdG8gYmUgcGFydCBvZiB0aGUgcHJvYmxlbQotCi0JcHJpdmF0ZSBEaWN0aW9uYXJ5IHNlbGVjdGlvbkNvbnRleHQ7Ci0JcHJpdmF0ZSBNdWx0aVN0YXR1cyByZXN1bHQ7Ci0KLQlwdWJsaWMgU2xpY2VyKElRdWVyeWFibGUgaW5wdXQsIERpY3Rpb25hcnkgY29udGV4dCkgewotCQlwb3NzaWJpbGl0ZXMgPSBpbnB1dDsKLQkJc2xpY2UgPSBuZXcgVHdvVGllck1hcCgpOwotCQlzZWxlY3Rpb25Db250ZXh0ID0gY29udGV4dDsKLQkJcmVzdWx0ID0gbmV3IE11bHRpU3RhdHVzKERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SLCBJU3RhdHVzLk9LLCBNZXNzYWdlcy5QbGFubmVyX1Byb2JsZW1zX3Jlc29sdmluZ19wbGFuLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgU2xpY2VyKElJbnN0YWxsYWJsZVVuaXRbXSBpbnN0YWxsUm9vdHMsIElJbnN0YWxsYWJsZVVuaXRbXSBnYXRoZXJBdmFpbGFibGVJbnN0YWxsYWJsZVVuaXRzLCBEaWN0aW9uYXJ5IHNlbGVjdGlvbkNvbnRleHQpIHsKLQkJdGhpcyhuZXcgUXVlcnlhYmxlQXJyYXkoZ2F0aGVyQXZhaWxhYmxlSW5zdGFsbGFibGVVbml0cyksIHNlbGVjdGlvbkNvbnRleHQpOwotCX0KLQotCXB1YmxpYyBJUXVlcnlhYmxlIHNsaWNlKElJbnN0YWxsYWJsZVVuaXRbXSBpdXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJbG9uZyBzdGFydCA9IDA7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnQgc2xpY2luZzogIiArIHN0YXJ0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQl2YWxpZGF0ZUlucHV0KGl1cyk7Ci0JCQljb25zaWRlcmVkID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChpdXMpKTsKLQkJCXRvUHJvY2VzcyA9IG5ldyBMaW5rZWRMaXN0KGNvbnNpZGVyZWQpOwotCQkJd2hpbGUgKCF0b1Byb2Nlc3MuaXNFbXB0eSgpKQotCQkJCXByb2Nlc3NJVSgoSUluc3RhbGxhYmxlVW5pdCkgdG9Qcm9jZXNzLnJlbW92ZUZpcnN0KCkpOwotCi0JCQlpZiAoREVCVUcpIHsKLQkJCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNsaWNpbmcgY29tcGxldGU6ICIgKyAoc3RvcCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdC5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBEaXJlY3RvckFjdGl2YXRvci5QSV9ESVJFQ1RPUiwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJfQotCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQlMb2dIZWxwZXIubG9nKHJlc3VsdCk7Ci0JCWlmIChyZXN1bHQuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgUXVlcnlhYmxlQXJyYXkoKElJbnN0YWxsYWJsZVVuaXRbXSkgY29uc2lkZXJlZC50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W2NvbnNpZGVyZWQuc2l6ZSgpXSkpOwotCX0KLQotCXB1YmxpYyBNdWx0aVN0YXR1cyBnZXRTdGF0dXMoKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy9UaGlzIGlzIGEgc2hvcnRjdXQgdG8gc2ltcGxpZnkgdGhlIGVycm9yIHJlcG9ydGluZyB3aGVuIHRoZSBmaWx0ZXIgb2YgdGhlIGl1cyB3ZSBhcmUgYmVpbmcgYXNrZWQgdG8gaW5zdGFsbCBkb2VzIG5vdCBwYXNzIAotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUlucHV0KElJbnN0YWxsYWJsZVVuaXRbXSBpdXMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghaXNBcHBsaWNhYmxlKGl1c1tpXSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIElVICIgKyBpdXNbaV0gKyAiIGNhbid0IGJlIGluc3RhbGxlZCBpbiB0aGlzIGVudmlyb25tZW50IGJlY2F1c2UgaXRzIGZpbHRlciBkb2VzIG5vdCBtYXRjaC4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8vIENoZWNrIHdoZXRoZXIgdGhlIHJlcXVpcmVtZW50IGlzIGFwcGxpY2FibGUKLQlwcml2YXRlIGJvb2xlYW4gaXNBcHBsaWNhYmxlKFJlcXVpcmVkQ2FwYWJpbGl0eSByZXEpIHsKLQkJU3RyaW5nIGZpbHRlciA9IHJlcS5nZXRGaWx0ZXIoKTsKLQkJaWYgKGZpbHRlciA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dC5jcmVhdGVGaWx0ZXIoZmlsdGVyKS5tYXRjaChzZWxlY3Rpb25Db250ZXh0KTsKLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNBcHBsaWNhYmxlKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJU3RyaW5nIGVuYWJsZW1lbnRGaWx0ZXIgPSBpdS5nZXRGaWx0ZXIoKTsKLQkJaWYgKGVuYWJsZW1lbnRGaWx0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQl0cnkgewotCQkJcmV0dXJuIERpcmVjdG9yQWN0aXZhdG9yLmNvbnRleHQuY3JlYXRlRmlsdGVyKGVuYWJsZW1lbnRGaWx0ZXIpLm1hdGNoKHNlbGVjdGlvbkNvbnRleHQpOwotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzSVUoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlzbGljZS5wdXQoaXUuZ2V0SWQoKSwgaXUuZ2V0VmVyc2lvbigpLCBpdSk7Ci0JCWlmICghaXNBcHBsaWNhYmxlKGl1KSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxcyA9IGdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKGl1KTsKLQkJaWYgKHJlcXMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghaXNBcHBsaWNhYmxlKHJlcXNbaV0pKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoIXJlcXNbaV0uaXNHcmVlZHkoKSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlleHBhbmRSZXF1aXJlbWVudChpdSwgcmVxc1tpXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJaWYgKCEoaXUgaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVVbml0UGF0Y2gpKSB7Ci0JCQlyZXR1cm4gaXUuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKTsKLQkJfQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSBhZ2dyZWdhdGVkQ2FwYWJpbGl0aWVzOwotCQlJSW5zdGFsbGFibGVVbml0UGF0Y2ggcGF0Y2hJVSA9IChJSW5zdGFsbGFibGVVbml0UGF0Y2gpIGl1OwotCQlSZXF1aXJlbWVudENoYW5nZVtdIGNoYW5nZXMgPSBwYXRjaElVLmdldFJlcXVpcmVtZW50c0NoYW5nZSgpOwotCQlpbnQgaW5pdGlhbFJlcXVpcmVtZW50Q291bnQgPSBpdS5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpLmxlbmd0aDsKLQkJYWdncmVnYXRlZENhcGFiaWxpdGllcyA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbaW5pdGlhbFJlcXVpcmVtZW50Q291bnQgKyBjaGFuZ2VzLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoaXUuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSwgMCwgYWdncmVnYXRlZENhcGFiaWxpdGllcywgMCwgaW5pdGlhbFJlcXVpcmVtZW50Q291bnQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJCWFnZ3JlZ2F0ZWRDYXBhYmlsaXRpZXNbaW5pdGlhbFJlcXVpcmVtZW50Q291bnQrK10gPSBjaGFuZ2VzW2ldLm5ld1ZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGFnZ3JlZ2F0ZWRDYXBhYmlsaXRpZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFJlcXVpcmVtZW50KElJbnN0YWxsYWJsZVVuaXQgaXUsIFJlcXVpcmVkQ2FwYWJpbGl0eSByZXEpIHsKLQkJQ29sbGVjdG9yIG1hdGNoZXMgPSBwb3NzaWJpbGl0ZXMucXVlcnkobmV3IENhcGFiaWxpdHlRdWVyeShyZXEpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCQlpbnQgdmFsaWRNYXRjaGVzID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG1hdGNoZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBtYXRjaCA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIWlzQXBwbGljYWJsZShtYXRjaCkpCi0JCQkJY29udGludWU7Ci0JCQl2YWxpZE1hdGNoZXMrKzsKLQkJCWlmICghc2xpY2UuY29udGFpbnNLZXkobWF0Y2guZ2V0SWQoKSwgbWF0Y2guZ2V0VmVyc2lvbigpKSkKLQkJCQljb25zaWRlcihtYXRjaCk7Ci0JCX0KLQotCQlpZiAodmFsaWRNYXRjaGVzID09IDApIHsKLQkJCWlmIChyZXEuaXNPcHRpb25hbCgpKSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vIElVIGZvdW5kIHRvIHNhdGlzZnkgb3B0aW9uYWwgZGVwZW5kZW5jeSBvZiAiICsgaXUgKyAiIG9uIHJlcSAiICsgcmVxKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsIE5MUy5iaW5kKE1lc3NhZ2VzLlBsYW5uZXJfVW5zYXRpc2ZpZWRfZGVwZW5kZW5jeSwgaXUsIHJlcSkpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb25zaWRlcihJSW5zdGFsbGFibGVVbml0IG1hdGNoKSB7Ci0JCWlmIChjb25zaWRlcmVkLmFkZChtYXRjaCkpCi0JCQl0b1Byb2Nlc3MuYWRkTGFzdChtYXRjaCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1R3b1RpZXJNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9Ud29UaWVyTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMDc5OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL1R3b1RpZXJNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBwcm92aWRlIGEgdHdvLXRpZXIgbWFwLgotICogTWFwT2Yoa2V5MSA9PiBNYXBPZihrZXkyID0+IHZhbHVlKSkuCi0gKiBFdmVuIHRob3VnaCB0aGlzIGNsYXNzIGltcGxlbWVudHMgTWFwIHRoZSBiZWhhdmlvciBvZgotICogdGhlIG1ldGhvZHMgYXJlbid0IGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhhdCBvZiBhIHJlYWwKLSAqIE1hcCAtIGVzcGVjaWFsbHksIGVudHJ5U2V0KCksIGtleVNldCgpIGV0Yy4gd29ya3Mgb2ZmCi0gKiB0aGUgb3V0ZXIgbWFwIHdoaWxlIHZhbHVlcygpIHJldHVybnMgYWxsIHRoZSB2YWx1ZXMgb2YKLSAqIGFsbCB0aGUgaW5uZXIgbWFwcy4KLSAqLwotcHVibGljIGNsYXNzIFR3b1RpZXJNYXAgaW1wbGVtZW50cyBNYXAsIFNlcmlhbGl6YWJsZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzNjI0OTc3MjA4NzMxODYyNjVMOwotCi0JcHJpdmF0ZSBNYXAgb3V0ZXJNYXA7Ci0JcHJpdmF0ZSBpbnQgcG9saWN5OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUE9MSUNZX05PTkUgPSAwLCBQT0xJQ1lfQk9USF9NQVBTX1BSRVNFUlZFX09SREVSSU5HID0gMSA8PCAwLCBQT0xJQ1lfSU5ORVJfTUFQX1BSRVNFUlZFX0VYSVNUSU5HID0gMSA8PCAxLCBQT0xJQ1lfSU5ORVJfTUFQX1NPUlRFRF9BU0NFTkRJTkcgPSAxIDw8IDIsIFBPTElDWV9JTk5FUl9NQVBfU09SVEVEX0RFU0NFTkRJTkcgPSAxIDw8IDMsIFBPTElDWV9JTk5FUl9NQVBfRU5TVVJFX1NJTkdMRVRPTiA9IDEgPDwgNDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT0xJQ1lfSU5ORVJfTUFQX1NPUlRFRF9NQVNLID0gUE9MSUNZX0lOTkVSX01BUF9TT1JURURfQVNDRU5ESU5HIHwgUE9MSUNZX0lOTkVSX01BUF9TT1JURURfREVTQ0VORElORzsKLQotCXB1YmxpYyBUd29UaWVyTWFwKCkgewotCQl0aGlzKDgsIFBPTElDWV9OT05FKTsKLQl9Ci0KLQlwdWJsaWMgVHdvVGllck1hcChpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0JCXRoaXMoaW5pdGlhbENhcGFjaXR5LCBQT0xJQ1lfTk9ORSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHR3by10aWVyIG1hcCB3aXRoIHRoZSBzcGVjaWZpZWQKLQkgKiBpbml0aWFsQ2FwYWNpdHkgYW5kIHBvbGljeS4gVGhlIHBvbGljeSBkZXRlcm1pbmVzCi0JICogd2hldGhlciB0aGUgb3V0ZXIgbWFwIGlzIG9yZGVyZWQsIGlubmVyIG1hcCBpcwotCSAqIHNvcnRlZCwgY2xvYmJlciB2YWx1ZXMgb2YgaW5uZXIgbWFwIGV0Yy4KLQkgKi8KLQlwdWJsaWMgVHdvVGllck1hcChpbnQgaW5pdGlhbENhcGFjaXR5LCBpbnQgcG9saWN5KSB7Ci0JCXRoaXMucG9saWN5ID0gcG9saWN5OwotCQl0aGlzLm91dGVyTWFwID0gc2hvdWxkVXNlT3JkZXJlZE1hcCgpID8gbmV3IExpbmtlZEhhc2hNYXAoaW5pdGlhbENhcGFjaXR5KSA6IG5ldyBIYXNoTWFwKGluaXRpYWxDYXBhY2l0eSk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSB2YWx1ZSB3aXRoIGtleSBrZXkxIGludG8gdGhlIGlubmVyIG1hcCAKLQkgKiB0aGF0IGlzIG9idGFpbmVkIGZyb20gdGhlIG91dGVyIG1hcCB3aXRoIGtleSBrZXkyLgotCSAqIElmIHlvdSBoYXZlIHNldCBQT0xJQ1lfSU5ORVJfTUFQX1BSRVNFUlZFX0VYSVNUSU5HCi0JICogYXQgdGhlIHRpbWUgb2YgY3JlYXRpbmcgdGhpcywgaXQgd2lsbCBub3Qgb3ZlcndyaXRlCi0JICogaWYgdGhlcmUgaXMgYWxyZWFkeSBhIG5vbi1udWxsIHZhbHVlIGF0IGtleTIuIAotCSAqIFRoZSBvdGhlciBQT0xJQ1lfSU5ORVJfTUFQXyogcG9saWNpZXMgZGV0ZXJtaW5lIAotCSAqIHdoYXQga2luZCBvZiBpbm5lciBtYXAgaXMgY3JlYXRlZC4KLQkgKiBAcGFyYW0ga2V5MSBUaGUga2V5IGZvciBvdXRlciBtYXAuCi0JICogQHBhcmFtIGtleTIgVGhlIGtleSBmb3IgaW5uZXIgbWFwLgotCSAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUuCi0JICogQHJldHVybiBFeGlzdGluZyB2YWx1ZSBpZiBhbnksIG90aGVyd2lzZSBudWxsLgotCSAqLwotCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MiwgT2JqZWN0IHZhbHVlKSB7Ci0JCU1hcCBpbm5lck1hcCA9IChNYXApIHRoaXMub3V0ZXJNYXAuZ2V0KGtleTEpOwotCQlpZiAoaW5uZXJNYXAgPT0gbnVsbCkgewotCQkJaWYgKHNob3VsZFVzZVNpbmdsZXRvbklubmVyTWFwKCkpIHsKLQkJCQl0aGlzLm91dGVyTWFwLnB1dChrZXkxLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoa2V5MiwgdmFsdWUpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWlubmVyTWFwID0gY3JlYXRlSW5uZXJNYXAoKTsKLQkJCXRoaXMub3V0ZXJNYXAucHV0KGtleTEsIGlubmVyTWFwKTsKLQkJfQotCQkvLyBJdCBpcyBmYXN0ZXIgdG8gY2hlY2sgZm9yIGFscmVhZHkgZXhpc3RpbmcgZW50cnkgCi0JCS8vIHRoaXMgd2F5IGluc3RlYWQgb2YgY29udGFpbnNLZXkoKSBjaGVjay4gT2YgY291cnNlLAotCQkvLyB0aGlzIHdpbGwgcHJldmVudCB1cyBmcm9tIHJlY29nbml6aW5nIGEgbnVsbCBlbnRyeSwgCi0JCS8vIHdoaWNoIEkgdGhpbmsgc2hvdWxkbid0IGJlIGEgcHJvYmxlbS4KLQkJT2JqZWN0IGV4aXN0aW5nID0gaW5uZXJNYXAucHV0KGtleTIsIHZhbHVlKTsKLQkJaWYgKGV4aXN0aW5nICE9IG51bGwgJiYgc2hvdWxkUHJlc2VydmVFeGlzdGluZygpKSB7Ci0JCQlpbm5lck1hcC5wdXQoa2V5MiwgZXhpc3RpbmcpOwotCQl9Ci0JCXJldHVybiBleGlzdGluZzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIG9iamVjdCBzdG9yZWQgaW4gdGhlIGlubmVyIG1hcCB1c2luZyBrZXkyCi0JICogYXMga2V5IHdoZXJlIHRoZSBpbm5lciBtYXAgaXMgb2J0YWluZWQgZnJvbSB0aGUgCi0JICogb3V0ZXIgbWFwIHVzaW5nIGtleTEuCi0JICogQHBhcmFtIGtleTEgVGhlIGtleSBmb3Igb3V0ZXIgbWFwLgotCSAqIEBwYXJhbSBrZXkyIFRoZSBrZXkgZm9yIGlubmVyIG1hcC4KLQkgKiBAcmV0dXJuIFRoZSBvYmplY3QgZm9yIGtleTIgaW4gaW5uZXIgbWFwIGZvciBrZXkxIAotCSAqIGluIHRoZSBvdXRlciBtYXAuIAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MikgewotCQlpZiAoa2V5MSA9PSBudWxsIHx8IGtleTIgPT0gbnVsbCkKLQkJCXJldHVybiBnZXRBbGwoa2V5MSk7Ci0JCU1hcCBpbm5lck1hcCA9IChNYXApIHRoaXMub3V0ZXJNYXAuZ2V0KGtleTEpOwotCQlPYmplY3QgdmFsdWUgPSBpbm5lck1hcCA9PSBudWxsID8gbnVsbCA6IGlubmVyTWFwLmdldChrZXkyKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGwgdGhlIHZhbHVlcyBpbiB0aGUgaW5uZXIgbWFwIGZvciBrZXkxIGluCi0JICogdGhlIG91dGVyIG1hcC4KLQkgKiBAcGFyYW0ga2V5MSBUaGUga2V5IGZvciBvdXRlciBtYXAuCi0JICogQHJldHVybiBDb2xsZWN0aW9uIG9mIHZhbHVlcyBpbiB0aGUgaW5uZXIgbWFwLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFsbChPYmplY3Qga2V5MSkgewotCQlpZiAoa2V5MSA9PSBudWxsKQotCQkJLy8gcmV0dXJuIGFsbAotCQkJcmV0dXJuIHZhbHVlcygpOwotCQlNYXAgaW5uZXJNYXAgPSAoTWFwKSB0aGlzLm91dGVyTWFwLmdldChrZXkxKTsKLQkJcmV0dXJuIGlubmVyTWFwID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihpbm5lck1hcC52YWx1ZXMoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShPYmplY3Qga2V5MSwgT2JqZWN0IGtleTIpIHsKLQkJaWYgKGtleTEgPT0gbnVsbCB8fCBrZXkyID09IG51bGwpCi0JCQlyZXR1cm4gcmVtb3ZlQWxsKGtleTEpOwotCQlNYXAgaW5uZXJNYXAgPSAoTWFwKSB0aGlzLm91dGVyTWFwLmdldChrZXkxKTsKLQkJaWYgKGlubmVyTWFwID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHNob3VsZFVzZVNpbmdsZXRvbklubmVyTWFwKCkpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBpbm5lck1hcC5nZXQoa2V5Mik7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQl0aGlzLm91dGVyTWFwLnJlbW92ZShrZXkxKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJT2JqZWN0IHJlc3VsdCA9IChpbm5lck1hcCA9PSBudWxsKSA/IG51bGwgOiBpbm5lck1hcC5yZW1vdmUoa2V5Mik7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCAmJiBpbm5lck1hcC5pc0VtcHR5KCkpIHsKLQkJCXRoaXMub3V0ZXJNYXAucmVtb3ZlKGtleTEpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gcmVtb3ZlQWxsKE9iamVjdCBrZXkxKSB7Ci0JCWlmIChrZXkxID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJTWFwIGlubmVyTWFwID0gKE1hcCkgdGhpcy5vdXRlck1hcC5yZW1vdmUoa2V5MSk7Ci0JCXJldHVybiBpbm5lck1hcCA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfTElTVCA6IGlubmVyTWFwLnZhbHVlcygpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSB3aGV0aGVyIHRoZXJlIGV4aXN0cyBhIHZhbGlkIG9iamVjdCBmb3IKLQkgKiBrZXkyIGluIHRoZSBpbm5lciBtYXAgZm9yIGtleTEgaW4gdGhlIG91dGVyIG1hcC4KLQkgKiBAcGFyYW0ga2V5MSBUaGUga2V5IGZvciBvdXRlciBtYXAuCi0JICogQHBhcmFtIGtleTIgVGhlIGtleSBmb3IgaW5uZXIgbWFwLgotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhIG5vbi1udWxsIG9iamVjdCBleGlzdHM7IG90aGVyd2lzZQotCSAqIGZhbHNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkxLCBPYmplY3Qga2V5MikgewotCQlpZiAoa2V5MSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoa2V5MiA9PSBudWxsKQotCQkJcmV0dXJuIGNvbnRhaW5zS2V5KGtleTEpOwotCQlyZXR1cm4gZ2V0KGtleTEsIGtleTIpICE9IG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS51dGlsLk1hcCNjbGVhcigpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCXRoaXMub3V0ZXJNYXAuY2xlYXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLnV0aWwuTWFwI2NvbnRhaW5zS2V5KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotCQlyZXR1cm4gdGhpcy5vdXRlck1hcC5jb250YWluc0tleShrZXkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEudXRpbC5NYXAjY29udGFpbnNWYWx1ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBlbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU1hcC5FbnRyeSBlbnRyeSA9IChNYXAuRW50cnkpIGl0Lm5leHQoKTsKLQkJCU1hcCBpbm5lck1hcCA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlpZiAoaW5uZXJNYXAuY29udGFpbnNWYWx1ZSh2YWx1ZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEudXRpbC5NYXAjc2l6ZSgpCi0JICovCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gdGhpcy5vdXRlck1hcC5zaXplKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS51dGlsLk1hcCNpc0VtcHR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gdGhpcy5zaXplKCkgPT0gMDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLnV0aWwuTWFwI2VudHJ5U2V0KCkKLQkgKi8KLQlwdWJsaWMgU2V0IGVudHJ5U2V0KCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHRoaXMub3V0ZXJNYXAuZW50cnlTZXQoKSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS51dGlsLk1hcCN2YWx1ZXMoKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIHZhbHVlcygpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Qoc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHRoaXMub3V0ZXJNYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IGtleSA9IGl0Lm5leHQoKTsKLQkJCS8vIEEgbnVsbCBrZXkgd2lsbCBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24hCi0JCQlpZiAoa2V5ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQuYWRkQWxsKGdldEFsbChrZXkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEudXRpbC5NYXAjZ2V0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXQoT2JqZWN0IGtleSkgewotCQlpZiAoa2V5IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLQkJCU9iamVjdFtdIGtleXMgPSAoT2JqZWN0W10pIGtleTsKLQkJCXJldHVybiBnZXQoa2V5c1swXSwga2V5c1sxXSk7Ci0JCX0gZWxzZQotCQkJcmV0dXJuIGdldEFsbChrZXkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEudXRpbC5NYXAja2V5U2V0KCkKLQkgKi8KLQlwdWJsaWMgU2V0IGtleVNldCgpIHsKLQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCh0aGlzLm91dGVyTWFwLmtleVNldCgpKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLnV0aWwuTWFwI3B1dChqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgcHV0KE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoa2V5IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLQkJCU9iamVjdFtdIGtleXMgPSAoT2JqZWN0W10pIGtleTsKLQkJCXJldHVybiBwdXQoa2V5c1swXSwga2V5c1sxXSwgdmFsdWUpOwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpcnN0IGFyZyBzaG91bGQgYmUgYW4gYXJyYXkhIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLnV0aWwuTWFwI3B1dEFsbChqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dEFsbChNYXAgdCkgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLnV0aWwuTWFwI3JlbW92ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBPYmplY3QgcmVtb3ZlKE9iamVjdCBrZXkpIHsKLQkJaWYgKGtleSBpbnN0YW5jZW9mIE9iamVjdFtdKSB7Ci0JCQlPYmplY3RbXSBrZXlzID0gKE9iamVjdFtdKSBrZXk7Ci0JCQlyZXR1cm4gcmVtb3ZlKGtleXNbMF0sIGtleXNbMV0pOwotCQl9IGVsc2UKLQkJCXJldHVybiByZW1vdmVBbGwoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmICh0aGlzLm91dGVyTWFwLmlzRW1wdHkoKSkgewotCQkJc2IuYXBwZW5kKCIgIChFbXB0eSkiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHRoaXMub3V0ZXJNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXQubmV4dCgpOwotCQkJCXNiLmFwcGVuZCgiICAiKS5hcHBlbmQoZW50cnkuZ2V0S2V5KCkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoIiA9ICIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCS5hcHBlbmQoZW50cnkuZ2V0VmFsdWUoKSkuYXBwZW5kKCdcbicpOwotCQkJfQotCQkJc2Iuc2V0TGVuZ3RoKHNiLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZHVtcChQcmludFN0cmVhbSBwcykgewotCQlpZiAocHMgPT0gbnVsbCkgewotCQkJcHMgPSBTeXN0ZW0ub3V0OwotCQl9Ci0JCXBzLnByaW50bG4odGhpcy50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIE1hcCBjcmVhdGVJbm5lck1hcCgpIHsKLQkJTWFwIGlubmVyTWFwOwotCQlpZiAoc2hvdWxkVXNlU29ydGVkSW5uZXJNYXAoKSkgewotCQkJaW5uZXJNYXAgPSBuZXcgVHJlZU1hcChuZXcgVmFsdWVDb21wYXJhdG9yKHNob3VsZFNvcnRJbkFzY2VuZGluZ09yZGVyKCkpKTsKLQkJfSBlbHNlIGlmIChzaG91bGRVc2VPcmRlcmVkTWFwKCkpIHsKLQkJCWlubmVyTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoMik7Ci0JCX0gZWxzZSB7Ci0JCQlpbm5lck1hcCA9IG5ldyBIYXNoTWFwKDIpOwotCQl9Ci0JCXJldHVybiBpbm5lck1hcDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkUHJlc2VydmVFeGlzdGluZygpIHsKLQkJcmV0dXJuICh0aGlzLnBvbGljeSAmIFBPTElDWV9JTk5FUl9NQVBfUFJFU0VSVkVfRVhJU1RJTkcpID09IFBPTElDWV9JTk5FUl9NQVBfUFJFU0VSVkVfRVhJU1RJTkc7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFVzZU9yZGVyZWRNYXAoKSB7Ci0JCXJldHVybiAodGhpcy5wb2xpY3kgJiBQT0xJQ1lfQk9USF9NQVBTX1BSRVNFUlZFX09SREVSSU5HKSA9PSBQT0xJQ1lfQk9USF9NQVBTX1BSRVNFUlZFX09SREVSSU5HOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRVc2VTb3J0ZWRJbm5lck1hcCgpIHsKLQkJcmV0dXJuICh0aGlzLnBvbGljeSAmIFBPTElDWV9JTk5FUl9NQVBfU09SVEVEX01BU0spICE9IDA7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFNvcnRJbkFzY2VuZGluZ09yZGVyKCkgewotCQlyZXR1cm4gKHRoaXMucG9saWN5ICYgUE9MSUNZX0lOTkVSX01BUF9TT1JURURfTUFTSykgPT0gUE9MSUNZX0lOTkVSX01BUF9TT1JURURfQVNDRU5ESU5HOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRVc2VTaW5nbGV0b25Jbm5lck1hcCgpIHsKLQkJcmV0dXJuICh0aGlzLnBvbGljeSAmIFBPTElDWV9JTk5FUl9NQVBfRU5TVVJFX1NJTkdMRVRPTikgPT0gUE9MSUNZX0lOTkVSX01BUF9FTlNVUkVfU0lOR0xFVE9OOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFZhbHVlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IsIFNlcmlhbGl6YWJsZSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM2MjQ5NzcyMDg3MzE4NjI2Nkw7Ci0JCXByaXZhdGUgYm9vbGVhbiBhc2NlbmRpbmc7Ci0KLQkJcHVibGljIFZhbHVlQ29tcGFyYXRvcihib29sZWFuIGFzY2VuZGluZykgewotCQkJdGhpcy5hc2NlbmRpbmcgPSBhc2NlbmRpbmc7Ci0JCX0KLQotCQkvKiAobm9uLUphdmFkb2MpCi0JCSAqIEBzZWUgamF2YS51dGlsLkNvbXBhcmF0b3IjY29tcGFyZShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQl0cnkgewotCQkJCWlmIChvMSBpbnN0YW5jZW9mIENvbXBhcmFibGUpIHsKLQkJCQkJaW50IGNtcCA9ICgoQ29tcGFyYWJsZSkgbzEpLmNvbXBhcmVUbyhvMik7Ci0JCQkJCXJldHVybiB0aGlzLmFzY2VuZGluZyA/IGNtcCA6ICgwIC0gY21wKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIElnbm9yZQotCQkJfQotCQkJcmV0dXJuIDE7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9kaXJlY3Rvci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMzY3YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2RpcmVjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLURpcmVjdG9yX1JldmVydF9Qcm9ibGVtcz1Qcm9ibGVtcyBvY2N1cnJlZCB3aGlsZSByZXZlcnRpbmcgdGhlIGluc3RhbGwuCi1EaXJlY3Rvcl9VbmV4cGVjdGVkX0lVPVRoZSBpbnN0YWxsYWJsZSB1bml0IHswfSBjYW4gbm90IGJlIHVzZWQgaGVyZS4KLURpcmVjdG9yX1Rhc2tfSW5zdGFsbGluZz1JbnN0YWxsaW5nIGludG8gezB9Ci1EaXJlY3Rvcl9UYXNrX1VwZGF0aW5nPVVwZGF0aW5nCi1EaXJlY3Rvcl9UYXNrX1Jlc29sdmluZ19EZXBlbmRlbmNpZXM9UmVzb2x2aW5nIGRlcGVuZGVuY2llcwotCi1EaXJlY3Rvcl9VbnNhdGlzZmllZF9EZXBlbmRlbmNpZXM9XAotQ2Fubm90IGNvbXBsZXRlIHRoZSBpbnN0YWxsIGJlY2F1c2Ugc29tZSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBzYXRpc2ZpYWJsZQotRGlyZWN0b3JfVW5zYXRpc2ZpZWRfRGVwZW5kZW5jeT1cCi1VbnNhdGlzZmllZCBkZXBlbmRlbmN5OiB7MH0KLVBsYW5uZXJfRXJyb3Jfc2F2aW5nX29wYmZpbGU9RXhjZXB0aW9uIHdyaXRpbmcgcHJvYmxlbSBmaWxlIGluOiB7MH0uCi1QbGFubmVyX0Zvcm1hdF9lcnJvcj1Gb3JtYXQgZXJyb3IgaW4gZmlsZTogezB9LgotUGxhbm5lcl9NaXNzaW5nX29wYl9maWxlPU1pc3NpbmcgZmlsZTogezB9LgotUGxhbm5lcl9UaW1lb3V0PVRoZSBzb2x2ZXIgdGltZWQgb3V0IG9uIHByb2JsZW0gezB9LgotUGxhbm5lcl9Qcm9ibGVtc19yZXNvbHZpbmdfcGxhbj1Qcm9ibGVtcyByZXNvbHZpbmcgcHJvdmlzaW9uaW5nIHBsYW4uCi1QbGFubmVyX1RyaXZpYWxfZXhjZXB0aW9uPU5vIHNvbHV0aW9uIGZvdW5kIGJlY2F1c2Ugb2YgYSB0cml2aWFsIGNvbnRyYWRpY3Rpb24gaW4gezB9LgotUGxhbm5lcl9VbnNhdGlzZmlhYmxlX3Byb2JsZW09Tm8gc29sdXRpb24gZm91bmQgYmVjYXVzZSB0aGUgcHJvYmxlbSBpbiB7MH0gaXMgdW5zYXRpc2ZpYWJsZS4KLVBsYW5uZXJfVW5zYXRpc2ZpZWRfZGVwZW5kZW5jeT1ObyBJVSBmb3VuZCB0byBzYXRpc2Z5IGRlcGVuZGVuY3kgZnJvbSB7MH0gdG8gezF9LgotCi1PbGRfUmVzb2x2ZXJfU2V2ZXJhbF9WZXJzaW9ucz1DYW5ub3QgZmluZCBhIHNvbHV0aW9uIHNhdGlzZnlpbmcgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgezB9LgotT2xkX1Jlc29sdmVyX0luY29tcGF0aWJsZV9WZXJzaW9ucz1DYW5ub3QgZmluZCBhIHNvbHV0aW9uIHdoZXJlIGJvdGggezB9IGFuZCB7MX0gY2FuIGJlIHNhdGlzZmllZC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVzb2x1dGlvbi9SZXNvbHV0aW9uSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVzb2x1dGlvbi9SZXNvbHV0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiN2E4ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Jlc29sdXRpb24vUmVzb2x1dGlvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlc29sdXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLkRpcmVjdG9yQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIFJlc29sdXRpb25IZWxwZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFtdIE5PX0ZSQUdNRU5UUyA9IG5ldyBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnRbMF07Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLQlwcml2YXRlIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyOwotCXByaXZhdGUgU3RhdGUgc3RhdGU7Ci0JcHJpdmF0ZSBEaWN0aW9uYXJ5IHNlbGVjdGlvbkNvbnRleHQ7Ci0JcHJpdmF0ZSBSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IgcmVjb21tZW5kYXRpb25zOwotCS8qKgotCSAqIE1hcCBvZiBJSW5zdGFsbGFibGVVbml0LT4oSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50KSByZXByZXNlbnRpbmcgdGhlIAotCSAqIG1hcHBpbmcgb2YgSVVzIHRvIHRoZSBmcmFnbWVudCB0aGV5IGFyZSBib3VuZCB0by4KLQkgKi8KLQlwcml2YXRlIE1hcCBmcmFnbWVudEJpbmRpbmdzOwotCi0JcHVibGljIFJlc29sdXRpb25IZWxwZXIoRGljdGlvbmFyeSBzZWxlY3Rpb25Db250ZXh0LCBSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IgcmVjb21tZW5kYXRpb25zKSB7Ci0JCXRoaXMuc2VsZWN0aW9uQ29udGV4dCA9IHNlbGVjdGlvbkNvbnRleHQ7Ci0JCXRoaXMucmVjb21tZW5kYXRpb25zID0gcmVjb21tZW5kYXRpb25zOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlTZXJ2aWNlUmVmZXJlbmNlIHNyID0gRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKFBsYXRmb3JtQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJUGxhdGZvcm1BZG1pbiBwYSA9IChQbGF0Zm9ybUFkbWluKSBEaXJlY3RvckFjdGl2YXRvci5jb250ZXh0LmdldFNlcnZpY2Uoc3IpOwotCQl0cmFuc2Zvcm1lciA9IG5ldyBUcmFuc2Zvcm1lcihwYS5nZXRGYWN0b3J5KCksIHNlbGVjdGlvbkNvbnRleHQsIHJlY29tbWVuZGF0aW9ucyk7Ci0JCXN0YXRlID0gcGEuZ2V0RmFjdG9yeSgpLmNyZWF0ZVN0YXRlKHRydWUpOwotCQlmcmFnbWVudEJpbmRpbmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJaWYgKHNlbGVjdGlvbkNvbnRleHQgIT0gbnVsbCkKLQkJCXN0YXRlLnNldFBsYXRmb3JtUHJvcGVydGllcyhzZWxlY3Rpb25Db250ZXh0KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVG9TdGF0ZShCdW5kbGVEZXNjcmlwdGlvbiBiZCkgewotCQlzdGF0ZS5hZGRCdW5kbGUoYmQpOwotCX0KLQotCXByaXZhdGUgQnVuZGxlRGVzY3JpcHRpb24gYWRkSW5SZXNvbHV0aW9uKElJbnN0YWxsYWJsZVVuaXQgdG9BZGQpIHsKLQkJdHJhbnNmb3JtZXIudmlzaXRJbnN0YWxsYWJsZVVuaXQodG9BZGQpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBkZXNjcmlwdGlvblRvQWRkID0gdHJhbnNmb3JtZXIuZ2V0UmVzdWx0KCk7Ci0JCS8vCQlidW5kbGVEZXNjcmlwdGlvblRvSVUucHV0KGRlc2NyaXB0aW9uVG9BZGQsIHRvQWRkKTsKLQkJYWRkVG9TdGF0ZShkZXNjcmlwdGlvblRvQWRkKTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uVG9BZGQ7Ci0JfQotCi0JLyoqIAotCSAqIEluZGljYXRlcyBpZiB0aGUgaW5zdGFsbGFibGUgdW5pdCB0byBpbnN0YWxsIHdpbGwgaGF2ZSBhbGwgdGhlaXIgY29uc3RyYWludHMgc2F0aXNmaWVkIHdoZW4gaW5zdGFsbGVkIHdpdGggb3RoZXIgaW5zdGFsbGFibGUgdW5pdHMuCi0JICogQHBhcmFtIHRvSW5zdGFsbCB0aGUgaW5zdGFsbGFibGUgdW5pdHMgdG8gaW5zdGFsbAotCSAqIEBwYXJhbSBleGlzdGluZ1N0YXRlIHRoZSBvdGhlciBpbnN0YWxsYWJsZSB1bml0cyB0byByZXNvbHZlIGFnYWluc3QKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGluc3RhbGxhYmxlIHVuaXQgdG8gaW5zdGFsbCByZXNvbHZlcywgcmV0dXJuIGZhbHNlIG90aGVyd2lzZS4gCi0JICovCi0JcHVibGljIFVuc2F0aXNmaWVkQ2FwYWJpbGl0eVtdIGluc3RhbGwoU2V0IHRvSW5zdGFsbCwgU2V0IGV4aXN0aW5nU3RhdGUpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGFkZGVkQnVuZGxlID0gbmV3IEJ1bmRsZURlc2NyaXB0aW9uW3RvSW5zdGFsbC5zaXplKCldOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0b0luc3RhbGwuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJYWRkZWRCdW5kbGVbaisrXSA9IGFkZEluUmVzb2x1dGlvbigoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBleGlzdGluZ1N0YXRlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCWFkZEluUmVzb2x1dGlvbigoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpKTsKLQkJfQotCi0JCXN0YXRlLnJlc29sdmUoKTsgLy9XZSBtYXkgd2FudCB0byByZXNvbHZlIGluIHR3byB0aW1lcy4gZmlyc3QgdGhlIGV4aXN0aW5nIHN0YXRlLCB0aGVuIGFkZCB0aGUgdG9JbnN0YWxsLiBUaGlzIHdvdWxkIGFsbG93IHRvIHNlZSB3aGF0IGNoYW5nZXMgd2hlbiBkcm9wcGluZyB0aGUgbmV3IGl1LgotCQkvL0Fsc28gaXQgY291bGQgYWxsb3cgdXMgdG8gZG8gYW4gaW5jcmVtZW50YWwgcmVzb2x1dGlvbi4gaG93ZXZlciB0aGUgcmVzdWx0cyBtYXkgZGlmZmVyCi0KLQkJQXJyYXlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkZWRCdW5kbGUubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdHMuYWRkQWxsKGNyZWF0ZVVuc2F0aXNmaWVkQ2FwYWJpbGl0aWVzKHN0YXRlLmdldFN0YXRlSGVscGVyKCkuZ2V0VW5zYXRpc2ZpZWRDb25zdHJhaW50cyhhZGRlZEJ1bmRsZVtpXSksIGFkZGVkQnVuZGxlW2ldKSk7Ci0JCX0KLQkJcmV0dXJuIChVbnNhdGlzZmllZENhcGFiaWxpdHlbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBVbnNhdGlzZmllZENhcGFiaWxpdHlbcmVzdWx0cy5zaXplKCldKTsKLQotCX0KLQotCXByaXZhdGUgQXJyYXlMaXN0IGNyZWF0ZVVuc2F0aXNmaWVkQ2FwYWJpbGl0aWVzKFZlcnNpb25Db25zdHJhaW50W10gdW5zYXRpc2ZpZWQsIEJ1bmRsZURlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCUFycmF5TGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHVuc2F0aXNmaWVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlSZXF1aXJlZENhcGFiaWxpdHkgb3JpZ2luYWxEZXBlbmRlbmN5ID0gKFJlcXVpcmVkQ2FwYWJpbGl0eSkgKChTdGF0ZU1ldGFkYXRhTWFwKSBkZXNjcmlwdGlvbi5nZXRVc2VyT2JqZWN0KCkpLmdldEdlbmVyaWNTcGVjaWZpY2F0aW9ucygpLmdldCh1bnNhdGlzZmllZFtpXSk7Ci0JCQlyZXN1bHRzLmFkZChuZXcgVW5zYXRpc2ZpZWRDYXBhYmlsaXR5KG9yaWdpbmFsRGVwZW5kZW5jeSwgKChTdGF0ZU1ldGFkYXRhTWFwKSBkZXNjcmlwdGlvbi5nZXRVc2VyT2JqZWN0KCkpLmdldFVuaXQoKSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIEFzc29jaWF0ZXMgaW5zdGFsbGFibGUgdW5pdCBmcmFnbWVudHMgdG8gZWFjaCBJVSBiZWluZyBpbnN0YWxsZWQuCi0JICogCi0JICogVE9ETzogVGhpcyBtZXRob2Qgc2hvdWxkIHByb2JhYmx5IGJlIHJlbmFtZWQgdG8gYXR0YWNoRnJhZ21lbnRzCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gYXR0YWNoQ1VzKENvbGxlY3Rpb24gdG9BdHRhY2gpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gdG9BdHRhY2guaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaXUgIT0gbnVsbCkKLQkJCQlhZGRJblJlc29sdXRpb24oaXUpOwotCQl9Ci0JCXN0YXRlLnJlc29sdmUoKTsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBiZHMgPSBzdGF0ZS5nZXRCdW5kbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlSZXNvbHZlckVycm9yW10gcmUgPSBzdGF0ZS5nZXRSZXNvbHZlckVycm9ycyhiZHNbaV0pOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmUubGVuZ3RoOyBqKyspIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKHJlW2pdKTsKLQkJCQl9Ci0JCQl9Ci0JCQlCdW5kbGVEZXNjcmlwdGlvbltdIHBvdGVudGlhbElVRnJhZ21lbnRzID0gc3RhdGUuZ2V0U3RhdGVIZWxwZXIoKS5nZXREZXBlbmRlbnRCdW5kbGVzKG5ldyBCdW5kbGVEZXNjcmlwdGlvbltdIHtiZHNbaV19KTsKLQkJCS8vIFRPRE86IFdlIG5lZWQgdG8gZGVmaW5lIGEgd2F5IHRvIGFsbG93IElVRnJhZ21lbnRzIHRvIHdvcmsgdG9nZXRoZXIgdG8gZG8gY29uZmlndXJhdGlvbiB3b3JrLgotCQkJLy8gRm9yIG5vdyB3ZSB3aWxsIHNlbGVjdCBqdXN0IG9uZSBmcmFnbWVudCBieSBwcmVmZXJyaW5nIGEgZnJhZ21lbnQgdGhhdCBtYXRjaGVzIHRoZSBob3N0Ci0KLQkJCUlJbnN0YWxsYWJsZVVuaXQgaG9zdElVID0gKChTdGF0ZU1ldGFkYXRhTWFwKSBiZHNbaV0uZ2V0VXNlck9iamVjdCgpKS5nZXRVbml0KCk7Ci0JCQlBcnJheUxpc3QgYXBwbGljYWJsZUZyYWdtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgcG90ZW50aWFsSVVGcmFnbWVudHMubGVuZ3RoOyBrKyspIHsKLQkJCQlJSW5zdGFsbGFibGVVbml0IGRlcGVuZGVudElVID0gKChTdGF0ZU1ldGFkYXRhTWFwKSBwb3RlbnRpYWxJVUZyYWdtZW50c1trXS5nZXRVc2VyT2JqZWN0KCkpLmdldFVuaXQoKTsKLQkJCQlpZiAoaG9zdElVLmVxdWFscyhkZXBlbmRlbnRJVSkgfHwgIWRlcGVuZGVudElVLmlzRnJhZ21lbnQoKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgcG90ZW50aWFsRnJhZ21lbnQgPSAoSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50KSBkZXBlbmRlbnRJVTsKLQotCQkJCS8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgaG9zdCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoZSBmcmFnbWVudAotCQkJCVJlcXVpcmVkQ2FwYWJpbGl0eSByZXFzRnJvbUZyYWdtZW50W10gPSBwb3RlbnRpYWxGcmFnbWVudC5nZXRIb3N0KCk7Ci0JCQkJUHJvdmlkZWRDYXBhYmlsaXR5IGhvc3RDYXBhYmlsaXRpZXNbXSA9IGhvc3RJVS5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpOwotCQkJCWJvb2xlYW4gbWF0Y2ggPSB0cnVlOwotCQkJCWJvb2xlYW4gcmVxdWlyZW1lbnRNYXRjaGVkID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgbCA9IDA7IGwgPCByZXFzRnJvbUZyYWdtZW50Lmxlbmd0aCAmJiBtYXRjaCA9PSB0cnVlOyBsKyspIHsKLQkJCQkJcmVxdWlyZW1lbnRNYXRjaGVkID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IG0gPSAwOyBtIDwgaG9zdENhcGFiaWxpdGllcy5sZW5ndGg7IG0rKykgewotCQkJCQkJaWYgKGhvc3RDYXBhYmlsaXRpZXNbbV0uaXNTYXRpc2ZpZWRCeShyZXFzRnJvbUZyYWdtZW50W2xdKSkgewotCQkJCQkJCXJlcXVpcmVtZW50TWF0Y2hlZCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHJlcXVpcmVtZW50TWF0Y2hlZCA9PSBmYWxzZSkgewotCQkJCQkJbWF0Y2ggPSBmYWxzZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQkJaWYgKG1hdGNoKSB7Ci0JCQkJCWFwcGxpY2FibGVGcmFnbWVudHMuYWRkKHBvdGVudGlhbEZyYWdtZW50KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCB0aGVGcmFnbWVudCA9IG51bGw7Ci0JCQlpbnQgc3BlY2lmaWNpdHlMZXZlbCA9IDA7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXBwbGljYWJsZUZyYWdtZW50cy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50IGZyYWdtZW50ID0gKElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChmcmFnbWVudC5nZXRIb3N0KCkubGVuZ3RoID4gc3BlY2lmaWNpdHlMZXZlbCkgewotCQkJCQl0aGVGcmFnbWVudCA9IGZyYWdtZW50OwotCQkJCQlzcGVjaWZpY2l0eUxldmVsID0gZnJhZ21lbnQuZ2V0SG9zdCgpLmxlbmd0aDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodGhlRnJhZ21lbnQgIT0gbnVsbCkKLQkJCQlmcmFnbWVudEJpbmRpbmdzLnB1dChob3N0SVUsIHRoZUZyYWdtZW50KTsKLQkJfQotCQkvL2J1aWxkIHRoZSBjb2xsZWN0aW9uIG9mIHJlc29sdmVkIElVcwotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBIYXNoU2V0KHRvQXR0YWNoLnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0b0F0dGFjaC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpdSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJLy9qdXN0IHJldHVybiBmcmFnbWVudHMgYXMgdGhleSBhcmUKLQkJCWlmIChpdS5pc0ZyYWdtZW50KCkpIHsKLQkJCQlyZXN1bHQuYWRkKGl1KTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCS8vcmV0dXJuIGEgbmV3IElVIHRoYXQgY29tYmluZXMgdGhlIElVIHdpdGggaXRzIGJvdW5kIGZyYWdtZW50cwotCQkJSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50IGZyYWdtZW50ID0gKElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCkgZnJhZ21lbnRCaW5kaW5ncy5nZXQoaXUpOwotCQkJSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50W10gZnJhZ21lbnRzOwotCQkJaWYgKGZyYWdtZW50ID09IG51bGwpCi0JCQkJZnJhZ21lbnRzID0gTk9fRlJBR01FTlRTOwotCQkJZWxzZQotCQkJCWZyYWdtZW50cyA9IG5ldyBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnRbXSB7ZnJhZ21lbnR9OwotCQkJcmVzdWx0LmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVzb2x2ZWRJbnN0YWxsYWJsZVVuaXQoaXUsIGZyYWdtZW50cykpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZChJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCXJldHVybiBzdGF0ZS5nZXRCdW5kbGUoaXUuZ2V0SWQoKSwgaXUuZ2V0VmVyc2lvbigpKS5pc1Jlc29sdmVkKCk7Ci0JfQotCi0JcHVibGljIEFycmF5TGlzdCBnZXRBbGxSZXNvbHZlZCgpIHsKLQkJQnVuZGxlRGVzY3JpcHRpb25bXSBiZCA9IHN0YXRlLmdldFJlc29sdmVkQnVuZGxlcygpOwotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChiZC5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJkLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHQuYWRkKGV4dHJhY3RJVShiZFtpXSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGV4dHJhY3RJVShCdW5kbGVEZXNjcmlwdGlvbiBiZCkgewotCQlyZXR1cm4gKChTdGF0ZU1ldGFkYXRhTWFwKSBiZC5nZXRVc2VyT2JqZWN0KCkpLmdldFVuaXQoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRTb3J0ZWQoKSB7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uW10gdG9Tb3J0ID0gc3RhdGUuZ2V0UmVzb2x2ZWRCdW5kbGVzKCk7Ci0JCXN0YXRlLmdldFN0YXRlSGVscGVyKCkuc29ydEJ1bmRsZXModG9Tb3J0KTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KHRvU29ydC5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvU29ydC5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0LmFkZChleHRyYWN0SVUodG9Tb3J0W2ldKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVzb2x1dGlvbi9TdGF0ZU1ldGFkYXRhTWFwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVzb2x1dGlvbi9TdGF0ZU1ldGFkYXRhTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMjk0YWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Jlc29sdXRpb24vU3RhdGVNZXRhZGF0YU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVzb2x1dGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotCi0vL0luc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZSBzdG9yZWQgaW4gdGhlIHVzZXIgb2JqZWN0IHNsb3Qgb2YgYnVuZGxlc2NyaXB0aW9ucyB0byBlYXNlIG5hdmlnYXRpb24gYmV0d2VlbiB0aGUgdHdvIG1vZGVscy4KLXB1YmxpYyBjbGFzcyBTdGF0ZU1ldGFkYXRhTWFwIHsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgdW5pdDsKLQlwcml2YXRlIE1hcCBjb3JyZXNwb25kaW5nU3BlY2lmaWNhdGlvbnM7IC8vaW5kZXhlcyBpbiB0aGlzIGFycmF5IG1hcHMgdG8gdGhlIG9uZXMgaW4gdGhlIGRlcGVuZGVuY2llcyBhcnJheS4gVGhpcyBpcyBncm9zcy4gVE9ETwotCi0JcHVibGljIFN0YXRlTWV0YWRhdGFNYXAoSUluc3RhbGxhYmxlVW5pdCB1bml0LCBNYXAgY29ycmVzcG9uZGluZ1NwZWNpZmljYXRpb25zKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMudW5pdCA9IHVuaXQ7Ci0JCXRoaXMuY29ycmVzcG9uZGluZ1NwZWNpZmljYXRpb25zID0gY29ycmVzcG9uZGluZ1NwZWNpZmljYXRpb25zOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IGdldFVuaXQoKSB7Ci0JCXJldHVybiB1bml0OwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0R2VuZXJpY1NwZWNpZmljYXRpb25zKCkgewotCQlyZXR1cm4gY29ycmVzcG9uZGluZ1NwZWNpZmljYXRpb25zOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZXNvbHV0aW9uL1RyYW5zZm9ybWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVzb2x1dGlvbi9UcmFuc2Zvcm1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzZhYzlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZXNvbHV0aW9uL1RyYW5zZm9ybWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVzb2x1dGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkludmFsaWRTeW50YXhFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBUcmFuc2Zvcm1lciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBJVV9LSU5EID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVVfTkFNRVNQQUNFID0gIml1Lm5hbWVzcGFjZSI7Ci0Jc3RhdGljIGxvbmcgaXVJbnRlcm5hbElkID0gMDsKLQotCXByaXZhdGUgRGljdGlvbmFyeSBjb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIFN0YXRlT2JqZWN0RmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQlwcml2YXRlIEFycmF5TGlzdCBpdUNhcGFiaWxpdGllczsKLQlwcml2YXRlIE1hcCBpdURlcGVuZGVuY2llczsKLQlwcml2YXRlIGJ5dGUga2luZCA9IElVX0tJTkQ7Ci0KLQlwcml2YXRlIEJ1bmRsZURlc2NyaXB0aW9uIHJlc3VsdCA9IG51bGw7Ci0KLQlwcml2YXRlIFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvciByZWNvbW1lbmRhdGlvbnMgPSBudWxsOwotCi0JcHVibGljIFRyYW5zZm9ybWVyKFN0YXRlT2JqZWN0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXRoaXMoZmFjdG9yeSwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIFRyYW5zZm9ybWVyKFN0YXRlT2JqZWN0RmFjdG9yeSBmYWN0b3J5LCBEaWN0aW9uYXJ5IGNvbnRleHQsIFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvciByZWNvbW1lbmRhdGlvbnMpIHsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQkJdGhpcy5jb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy5yZWNvbW1lbmRhdGlvbnMgPSByZWNvbW1lbmRhdGlvbnM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkgewotCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCWNhc2UgSVVfS0lORCA6Ci0JCQkJcmV0dXJuIElVX05BTUVTUEFDRTsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVua25vd24ga2luZCIpOyAvL1RoaXMgc2hvdWxkIG5vdCBoYXBwZW4KLQkJfQotCX0KLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZChSZXF1aXJlZENhcGFiaWxpdHkgY2FwYWJpbGl0eSkgewotCQkvLyBJZiB0aGVyZSBpcyBubyBjb250ZXh0IHRoZW4gYmUgb3B0aW1pc3RpYwotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCVN0cmluZyBmaWx0ZXIgPSBjYXBhYmlsaXR5LmdldEZpbHRlcigpOwotCQlpZiAoZmlsdGVyID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJdHJ5IHsKLQkJCXJldHVybiBEaXJlY3RvckFjdGl2YXRvci5jb250ZXh0LmNyZWF0ZUZpbHRlcihmaWx0ZXIpLm1hdGNoKGNvbnRleHQpOwotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCS8vIElmIHdlIGZhaWwgdG8gcGFyc2UgdGhlIGZpbHRlciB0cmVhdCBpdCBhcyBpbnZhbGlkIGFuZCBiZSBvcHRpbWlzdGljCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHRvRmlsdGVyKFZlcnNpb25SYW5nZSByYW5nZSkgewotCQlpZiAocmFuZ2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCIoJiIpOyAvLyROT04tTkxTLTEkCi0JCWJ1Zi5hcHBlbmQoIih2ZXJzaW9uPj0iKS5hcHBlbmQocmFuZ2UuZ2V0TWluaW11bSgpLnRvU3RyaW5nKCkpLmFwcGVuZCgnKScpOyAvLyROT04tTkxTLTEkCi0JCWlmICghcmFuZ2UuZ2V0SW5jbHVkZU1pbmltdW0oKSkKLQkJCWJ1Zi5hcHBlbmQoIighKHZlcnNpb249IikuYXBwZW5kKHJhbmdlLmdldE1pbmltdW0oKS50b1N0cmluZygpKS5hcHBlbmQoIikpIik7Ci0JCWJ1Zi5hcHBlbmQoIih2ZXJzaW9uPD0iKS5hcHBlbmQocmFuZ2UuZ2V0TWF4aW11bSgpLnRvU3RyaW5nKCkpLmFwcGVuZCgnKScpOyAvLyROT04tTkxTLTEkCi0JCWlmICghcmFuZ2UuZ2V0SW5jbHVkZU1heGltdW0oKSkKLQkJCWJ1Zi5hcHBlbmQoIighKHZlcnNpb249IikuYXBwZW5kKHJhbmdlLmdldE1heGltdW0oKS50b1N0cmluZygpKS5hcHBlbmQoIikpIik7Ci0JCWJ1Zi5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q2FwYWJpbGl0eShQcm92aWRlZENhcGFiaWxpdHkgY2FwYWJpbGl0eSkgewotCQlpdUNhcGFiaWxpdGllcy5hZGQoZmFjdG9yeS5jcmVhdGVHZW5lcmljRGVzY3JpcHRpb24oY2FwYWJpbGl0eS5nZXROYW1lKCksIGNhcGFiaWxpdHkuZ2V0TmFtZXNwYWNlKCksIGNhcGFiaWxpdHkuZ2V0VmVyc2lvbigpLCBudWxsKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRJbnN0YWxsYWJsZVVuaXQoSUluc3RhbGxhYmxlVW5pdCB0b1RyYW5zZm9ybSkgewotCQlraW5kID0gSVVfS0lORDsKLQotCQkvL1N0YXJ0IHdpdGggdGhlIGRlcGVuZGVuY2llcwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlcyA9IHRvVHJhbnNmb3JtLmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCk7Ci0JCWl1RGVwZW5kZW5jaWVzID0gbmV3IEhhc2hNYXAocmVxdWlyZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlcy5sZW5ndGg7IGkrKykgewotCQkJdmlzaXRSZXF1aXJlZENhcGFiaWxpdHkocmVxdWlyZXNbaV0pOwotCQl9Ci0KLQkJLy9EbyB0aGUgY2FwYWJpbGl0aWVzCi0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIGNhcGFiaWxpdGllcyA9IHRvVHJhbnNmb3JtLmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCk7Ci0JCWl1Q2FwYWJpbGl0aWVzID0gbmV3IEFycmF5TGlzdChyZXF1aXJlcy5sZW5ndGggKyAxKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCXZpc2l0Q2FwYWJpbGl0eShjYXBhYmlsaXRpZXNbaV0pOwotCQl9Ci0KLQkJLy9BZGQgYSBjYXBhYmlsaXR5IHJlcHJlc2VudGluZyB0aGUgSVUgaXRzZWxmCi0JCWl1Q2FwYWJpbGl0aWVzLmFkZChmYWN0b3J5LmNyZWF0ZUdlbmVyaWNEZXNjcmlwdGlvbih0b1RyYW5zZm9ybS5nZXRJZCgpLCBnZXROYW1lc3BhY2UoKSwgdG9UcmFuc2Zvcm0uZ2V0VmVyc2lvbigpLCBudWxsKSk7Ci0KLQkJR2VuZXJpY1NwZWNpZmljYXRpb25bXSBnZW5lcmljU3BlY2lmaWNhdGlvbnMgPSBuZXcgR2VuZXJpY1NwZWNpZmljYXRpb25baXVEZXBlbmRlbmNpZXMuc2l6ZSgpXTsKLQkJaXVEZXBlbmRlbmNpZXMua2V5U2V0KCkudG9BcnJheShnZW5lcmljU3BlY2lmaWNhdGlvbnMpOwotCi0JCUdlbmVyaWNEZXNjcmlwdGlvbltdIGdlbmVyaWNEZXNjcmlwdGlvbnMgPSBuZXcgR2VuZXJpY0Rlc2NyaXB0aW9uW2l1Q2FwYWJpbGl0aWVzLnNpemUoKV07Ci0JCWl1Q2FwYWJpbGl0aWVzLnRvQXJyYXkoZ2VuZXJpY0Rlc2NyaXB0aW9ucyk7Ci0KLQkJLy9GaW5hbGx5IGNyZWF0ZSB0aGUgYnVuZGxlIGRlc2NyaXB0aW9uCi0JCS8vVE9ETyBOZWVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZvciB0aGUgSVUgaXRzZWxmCi0JCXJlc3VsdCA9IGZhY3RvcnkuY3JlYXRlQnVuZGxlRGVzY3JpcHRpb24oaXVJbnRlcm5hbElkKyssIHRvVHJhbnNmb3JtLmdldElkKCksIHRvVHJhbnNmb3JtLmdldFZlcnNpb24oKSwgKFN0cmluZykgbnVsbCwgKEJ1bmRsZVNwZWNpZmljYXRpb25bXSkgbnVsbCwgKEhvc3RTcGVjaWZpY2F0aW9uKSBudWxsLCAoSW1wb3J0UGFja2FnZVNwZWNpZmljYXRpb25bXSkgbnVsbCwgKEV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbltdKSBudWxsLCB0b1RyYW5zZm9ybS5pc1NpbmdsZXRvbigpLCB0cnVlLCB0cnVlLCB0b1RyYW5zZm9ybS5nZXRGaWx0ZXIoKSwgKFN0cmluZ1tdKSBudWxsLCBnZW5lcmljU3BlY2lmaWNhdGlvbnMsIGdlbmVyaWNEZXNjcmlwdGlvbnMpOwotCQlyZXN1bHQuc2V0VXNlck9iamVjdChuZXcgU3RhdGVNZXRhZGF0YU1hcCh0b1RyYW5zZm9ybSwgaXVEZXBlbmRlbmNpZXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFJlcXVpcmVkQ2FwYWJpbGl0eShSZXF1aXJlZENhcGFiaWxpdHkgY2FwYWJpbGl0eSkgewotCQl0cnkgewotCQkJaWYgKGlzRW5hYmxlZChjYXBhYmlsaXR5KSkgewotCQkJCWNhcGFiaWxpdHkgPSByZXdyaXRlKGNhcGFiaWxpdHkpOwotCQkJCWl1RGVwZW5kZW5jaWVzLnB1dChmYWN0b3J5LmNyZWF0ZUdlbmVyaWNTcGVjaWZpY2F0aW9uKGNhcGFiaWxpdHkuZ2V0TmFtZSgpLCBjYXBhYmlsaXR5LmdldE5hbWVzcGFjZSgpLCB0b0ZpbHRlcihjYXBhYmlsaXR5LmdldFJhbmdlKCkpLCBjYXBhYmlsaXR5LmlzT3B0aW9uYWwoKSwgY2FwYWJpbGl0eS5pc011bHRpcGxlKCkpLCBjYXBhYmlsaXR5KTsKLQkJCX0KLQkJfSBjYXRjaCAoSW52YWxpZFN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsICJJbnZhbGlkIGZpbHRlcjogIiArIGUuZ2V0RmlsdGVyKCksIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSZXF1aXJlZENhcGFiaWxpdHkgcmV3cml0ZShSZXF1aXJlZENhcGFiaWxpdHkgbWF0Y2gpIHsKLQkJaWYgKHJlY29tbWVuZGF0aW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG1hdGNoOwotCQlSZWNvbW1lbmRhdGlvbiBmb3VuZFJlY29tbWVuZGF0aW9uID0gcmVjb21tZW5kYXRpb25zLmZpbmRSZWNvbW1lbmRhdGlvbihtYXRjaCk7Ci0JCXJldHVybiBmb3VuZFJlY29tbWVuZGF0aW9uICE9IG51bGwgPyBmb3VuZFJlY29tbWVuZGF0aW9uLm5ld1ZhbHVlKCkgOiBtYXRjaDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVzb2x1dGlvbi9VbnNhdGlzZmllZENhcGFiaWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZXNvbHV0aW9uL1Vuc2F0aXNmaWVkQ2FwYWJpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTgwMjM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZXNvbHV0aW9uL1Vuc2F0aXNmaWVkQ2FwYWJpbGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVzb2x1dGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLlJlcXVpcmVkQ2FwYWJpbGl0eTsKLQotLyoqCi0gKiBSZXByZXNlbnRzIGEgcHJvdmlzaW9uaW5nIGRlcGVuZGVuY3kgdGhhdCB3YXMgbm90IHNhdGlzZmllZCBkdXJpbmcKLSAqIHJlc29sdXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBVbnNhdGlzZmllZENhcGFiaWxpdHkgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBvd25lcjsKLQlwcml2YXRlIFJlcXVpcmVkQ2FwYWJpbGl0eSByZXF1aXJlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyB1bnJlc29sdmVkIGRlcGVuZGVuY3kKLQkgKiBAcGFyYW0gcmVxdWlyZWQgVGhlIGRlcGVuZGVuY3kgdGhhdCB3YXMgbm90IHNhdGlzZmllZC4KLQkgKiBAcGFyYW0gb3duZXIgVGhlIGluc3RhbGxhYmxlIHVuaXQgd2hvc2UgZGVwZW5kZW5jeSB3YXMgbm90IHNhdGlzZmllZC4KLQkgKi8KLQlwdWJsaWMgVW5zYXRpc2ZpZWRDYXBhYmlsaXR5KFJlcXVpcmVkQ2FwYWJpbGl0eSByZXF1aXJlZCwgSUluc3RhbGxhYmxlVW5pdCBvd25lcikgewotCQl0aGlzLnJlcXVpcmUgPSByZXF1aXJlZDsKLQkJdGhpcy5vd25lciA9IG93bmVyOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IGdldE93bmVyKCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3BlY2lmaWMgZGVwZW5kZW5jeSB0aGF0IHdhcyBub3Qgc2F0aXNmaWVkLgotCSAqLwotCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHkgZ2V0UmVxdWlyZWRDYXBhYmlsaXR5KCkgewotCQlyZXR1cm4gcmVxdWlyZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbnN0YWxsYWJsZSB1bml0IHdob3NlIGRlcGVuZGVuY3kgd2FzIG5vdCBzYXRpc2ZpZWQuCi0JICovCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXQgZ2V0VW5zYXRpc2ZpZWRVbml0KCkgewotCQlyZXR1cm4gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogRm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiWyIgKyBvd25lciArICJdICIgKyByZXF1aXJlLnRvU3RyaW5nKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yb2xsYmFjay9Gb3JtZXJTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JvbGxiYWNrL0Zvcm1lclN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOWNmZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JvbGxiYWNrL0Zvcm1lclN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucm9sbGJhY2s7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuSVByb3Zpc2lvbmluZ0V2ZW50QnVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5TeW5jaHJvbm91c1Byb3Zpc2lvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgRm9ybWVyU3RhdGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVVQUk9QX1BSRUZJWCA9ICItLS1JVVBST1BFUlRZLS0tIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElVUFJPUF9QT1NURklYID0gIi0tLUlVUFJPUEVSVFlLRVktLS0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgbG9uZyBsYXN0VGltZXN0YW1wOwotCVVSTCBsb2NhdGlvbiA9IG51bGw7Ci0KLQlIYXNodGFibGUgZ2VuZXJhdGVkSVVzID0gbmV3IEhhc2h0YWJsZSgpOyAvL2tleSBwcm9maWxlIGlkLCB2YWx1ZSB0aGUgaXUgcmVwcmVzZW50aW5nIHRoaXMgcHJvZmlsZQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIGxvbmcgdW5pcXVlVGltZXN0YW1wKCkgewotCQlsb25nIHRpbWV3YWl0ZWQgPSAwOwotCQlsb25nIHRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl3aGlsZSAodGltZXN0YW1wID09IGxhc3RUaW1lc3RhbXApIHsKLQkJCWlmICh0aW1ld2FpdGVkID4gMTAwMCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmlxdWV0aW1lc3RhbXAgZmFpbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJVGhyZWFkLnNsZWVwKDEwKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyByZXNldCBpbnRlcnJ1cHRlZCBzdGF0dXMKLQkJCQlUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOwotCQkJfQotCQkJdGltZXdhaXRlZCArPSAxMDsKLQkJCXRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWxhc3RUaW1lc3RhbXAgPSB0aW1lc3RhbXA7Ci0JCXJldHVybiB0aW1lc3RhbXA7Ci0JfQotCi0JcHVibGljIEZvcm1lclN0YXRlKFVSTCByZXBvTG9jYXRpb24pIHsKLQkJaWYgKHJlcG9Mb2NhdGlvbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVwb3NpdG9yeSBsb2NhdGlvbiBjYW4ndCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJSVByb3Zpc2lvbmluZ0V2ZW50QnVzIGV2ZW50QnVzID0gKElQcm92aXNpb25pbmdFdmVudEJ1cykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKERpcmVjdG9yQWN0aXZhdG9yLmNvbnRleHQsIElQcm92aXNpb25pbmdFdmVudEJ1cy5TRVJWSUNFX05BTUUpOwotCQlsb2NhdGlvbiA9IHJlcG9Mb2NhdGlvbjsKLQotCQkvL2xpc3RlbiBmb3IgcHJlLWV2ZW50LiB0byBzbmFwc2hvdCB0aGUgcHJvZmlsZQotCQlldmVudEJ1cy5hZGRMaXN0ZW5lcihuZXcgU3luY2hyb25vdXNQcm92aXNpb25pbmdMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG5vdGlmeShFdmVudE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBCZWdpbk9wZXJhdGlvbkV2ZW50KSB7Ci0JCQkJCUJlZ2luT3BlcmF0aW9uRXZlbnQgZXZlbnQgPSAoQmVnaW5PcGVyYXRpb25FdmVudCkgbzsKLQkJCQkJSUluc3RhbGxhYmxlVW5pdCBpdUZvclByb2ZpbGUgPSBwcm9maWxlVG9JVShldmVudC5nZXRQcm9maWxlKCkpOwotCQkJCQlnZW5lcmF0ZWRJVXMucHV0KGV2ZW50LmdldFByb2ZpbGUoKS5nZXRQcm9maWxlSWQoKSwgaXVGb3JQcm9maWxlKTsKLQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBQcm9maWxlRXZlbnQpIHsKLQkJCQkJUHJvZmlsZUV2ZW50IGV2ZW50ID0gKFByb2ZpbGVFdmVudCkgbzsKLQkJCQkJaWYgKGV2ZW50LmdldFJlYXNvbigpID09IFByb2ZpbGVFdmVudC5DSEFOR0VEKQotCQkJCQkJZ2V0UmVwb3NpdG9yeSgpLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7KElJbnN0YWxsYWJsZVVuaXQpIGdlbmVyYXRlZElVcy5nZXQoZXZlbnQuZ2V0UHJvZmlsZUlkKCkpfSk7Ci0JCQkJCXJldHVybjsKLQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSb2xsYmFja09wZXJhdGlvbkV2ZW50KSB7Ci0JCQkJCVJvbGxiYWNrT3BlcmF0aW9uRXZlbnQgZXZlbnQgPSAoUm9sbGJhY2tPcGVyYXRpb25FdmVudCkgbzsKLQkJCQkJZ2VuZXJhdGVkSVVzLnJlbW92ZShldmVudC5nZXRQcm9maWxlKCkuZ2V0UHJvZmlsZUlkKCkpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCS8vVE9ETyBXZSBuZWVkIHRvIGRlY2lkZSB3aGF0IHRvIGRvIG9uIHByb2ZpbGUgcmVtb3ZhbAkJCQkKLQkJCQkvLwkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgUHJvZmlsZUV2ZW50KSB7Ci0JCQkJLy8JCQkJCVByb2ZpbGVFdmVudCBwZSA9IChQcm9maWxlRXZlbnQpIG87Ci0JCQkJLy8JCQkJCWlmIChwZS5nZXRSZWFzb24oKSA9PSBQcm9maWxlRXZlbnQuUkVNT1ZFRCkgewotCQkJCS8vCQkJCQkJcHJvZmlsZVJlZ2lzdHJpZXMucmVtb3ZlKHBlLmdldFByb2ZpbGUoKS5nZXRQcm9maWxlSWQoKSk7Ci0JCQkJLy8JCQkJCQlwZXJzaXN0KCk7Ci0JCQkJLy8JCQkJCX0KLQkJCQkvLwkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0JfQotCi0JSU1ldGFkYXRhUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgewotCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoRGlyZWN0b3JBY3RpdmF0b3IuY29udGV4dCwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCBudWxsKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQotCQl9Ci0JCXRyeSB7Ci0JCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKDEpOwotCQkJcHJvcGVydGllcy5wdXQoSVJlcG9zaXRvcnkuUFJPUF9TWVNURU0sIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJCXJldHVybiBtYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkobG9jYXRpb24sICJBZ2VudCByb2xsYmFjayByZXBvc2l0b3J5IiwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuVFlQRV9TSU1QTEVfUkVQT1NJVE9SWSwgcHJvcGVydGllcyk7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2coZSk7Ci0JCX0KLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIG9wZW4gb3IgY3JlYXRlIEFnZW50J3Mgcm9sbGJhY2sgcmVwb3NpdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IHByb2ZpbGVUb0lVKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gcmVzdWx0ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlyZXN1bHQuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfUFJPRklMRSwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuc2V0SWQocHJvZmlsZS5nZXRQcm9maWxlSWQoKSk7Ci0JCXJlc3VsdC5zZXRWZXJzaW9uKG5ldyBWZXJzaW9uKDAsIDAsIDAsIExvbmcudG9TdHJpbmcodW5pcXVlVGltZXN0YW1wKCkpKSk7Ci0JCXJlc3VsdC5zZXRSZXF1aXJlZENhcGFiaWxpdGllcyhJVVRyYW5zZm9ybWF0aW9uSGVscGVyLnRvUmVxdWlyZW1lbnRzKHByb2ZpbGUucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLml0ZXJhdG9yKCksIGZhbHNlKSk7Ci0JCS8vIFNhdmUgdGhlIHByb2ZpbGUgcHJvcGVydGllcwotCQkvLyBUT0RPIHdlIGFyZW4ndCBtYXJraW5nIHRoZXNlIHByb3BlcnRpZXMgaW4gYW55IHNwZWNpYWwgd2F5IHRvIGluZGljYXRlIHRoZXkgY2FtZSBmcm9tIHByb2ZpbGUgcHJvcGVydGllcy4gIFNob3VsZCB3ZT8KLQkJTWFwIHByb3BlcnRpZXMgPSBwcm9maWxlLmdldFByb3BlcnRpZXMoKTsKLQkJSXRlcmF0b3IgaXRlciA9IHByb3BlcnRpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQlyZXN1bHQuc2V0UHJvcGVydHkoa2V5LCAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChrZXkpKTsKLQkJfQotCQkvLyBTYXZlIHRoZSBJVSBwcm9maWxlIHByb3BlcnRpZXMKLQkJSXRlcmF0b3IgYWxsSVVzID0gcHJvZmlsZS5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFsbElVcy5oYXNOZXh0KCkpIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgYWxsSVVzLm5leHQoKTsKLQkJCXByb3BlcnRpZXMgPSBwcm9maWxlLmdldEluc3RhbGxhYmxlVW5pdFByb3BlcnRpZXMoaXUpOwotCQkJaXRlciA9IHByb3BlcnRpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCQlyZXN1bHQuc2V0UHJvcGVydHkoSVVQUk9QX1BSRUZJWCArIGl1LmdldElkKCkgKyBJVVBST1BfUE9TVEZJWCArIGtleSwgKFN0cmluZykgcHJvcGVydGllcy5nZXQoa2V5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQocmVzdWx0KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElQcm9maWxlIElVVG9Qcm9maWxlKElJbnN0YWxsYWJsZVVuaXQgcHJvZmlsZUlVLCBJUHJvZmlsZSBwcm9maWxlLCBQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IEZvcm1lclN0YXRlUHJvZmlsZShwcm9maWxlSVUsIHByb2ZpbGUsIGNvbnRleHQpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvZmlsZUNoYW5nZVJlcXVlc3QgZ2VuZXJhdGVQcm9maWxlRGVsdGFDaGFuZ2VSZXF1ZXN0KElQcm9maWxlIGN1cnJlbnQsIElQcm9maWxlIHRhcmdldCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KGN1cnJlbnQpOwotCi0JCXN5bmNocm9uaXplUHJvZmlsZVByb3BlcnRpZXMocmVxdWVzdCwgY3VycmVudCwgdGFyZ2V0KTsKLQkJc3luY2hyb25pemVNYXJrZWRJVXMocmVxdWVzdCwgY3VycmVudCwgdGFyZ2V0KTsKLQkJc3luY2hyb25pemVBbGxJVVByb3BlcnRpZXMocmVxdWVzdCwgY3VycmVudCwgdGFyZ2V0KTsKLQotCQlyZXR1cm4gcmVxdWVzdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHN5bmNocm9uaXplQWxsSVVQcm9wZXJ0aWVzKFByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QsIElQcm9maWxlIGN1cnJlbnQsIElQcm9maWxlIHRhcmdldCkgewotCQlDb2xsZWN0aW9uIGN1cnJlbnRJVXMgPSBjdXJyZW50LnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS50b0NvbGxlY3Rpb24oKTsKLQkJQ29sbGVjdGlvbiB0YXJnZXRJVXMgPSB0YXJnZXQucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQ29sbGVjdGlvbigpOwotCQlMaXN0IGl1c1RvQWRkID0gbmV3IEFycmF5TGlzdCh0YXJnZXRJVXMpOwotCQlpdXNUb0FkZC5yZW1vdmUoY3VycmVudElVcyk7Ci0KLQkJLy9hZGRpdGlvbnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGl1c1RvQWRkLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHRhcmdldC5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKGl1KS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFbnRyeSBlbnRyeSA9IChFbnRyeSkgaXQubmV4dCgpOwotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCXJlcXVlc3Quc2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KGl1LCBrZXksIHZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCS8vIHVwZGF0ZXMKLQkJTGlzdCBpdXNUb1VwZGF0ZSA9IG5ldyBBcnJheUxpc3QodGFyZ2V0SVVzKTsKLQkJaXVzVG9VcGRhdGUucmVtb3ZlKGl1c1RvQWRkKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGl1c1RvVXBkYXRlLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJTWFwIHByb3BlcnRpZXNUb1NldCA9IG5ldyBIYXNoTWFwKHRhcmdldC5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKGl1KSk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY3VycmVudC5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKGl1KS5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFbnRyeSBlbnRyeSA9IChFbnRyeSkgaXQubmV4dCgpOwotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlTdHJpbmcgbmV3VmFsdWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzVG9TZXQuZ2V0KGtleSk7Ci0JCQkJaWYgKG5ld1ZhbHVlID09IG51bGwpIHsKLQkJCQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydHkoaXUsIGtleSk7Ci0JCQkJfSBlbHNlIGlmIChuZXdWYWx1ZS5lcXVhbHMoZW50cnkuZ2V0VmFsdWUoKSkpCi0JCQkJCXByb3BlcnRpZXNUb1NldC5yZW1vdmUoa2V5KTsKLQkJCX0KLQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHByb3BlcnRpZXNUb1NldC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlFbnRyeSBlbnRyeSA9IChFbnRyeSkgaXQubmV4dCgpOwotCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCXJlcXVlc3Quc2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KGl1LCBrZXksIHZhbHVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc3luY2hyb25pemVNYXJrZWRJVXMoUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCwgSVByb2ZpbGUgY3VycmVudCwgSVByb2ZpbGUgdGFyZ2V0KSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSBjdXJyZW50UGxhbm5lck1hcmtlZElVcyA9IFNpbXBsZVBsYW5uZXIuZmluZFBsYW5uZXJNYXJrZWRJVXMoY3VycmVudCk7Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSB0YXJnZXRQbGFubmVyTWFya2VkSVVzID0gU2ltcGxlUGxhbm5lci5maW5kUGxhbm5lck1hcmtlZElVcyh0YXJnZXQpOwotCi0JCS8vYWRkaXRpb25zCi0JCUxpc3QgbWFya2VkSVVzVG9BZGQgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodGFyZ2V0UGxhbm5lck1hcmtlZElVcykpOwotCQltYXJrZWRJVXNUb0FkZC5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChjdXJyZW50UGxhbm5lck1hcmtlZElVcykpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMoKElJbnN0YWxsYWJsZVVuaXRbXSkgbWFya2VkSVVzVG9BZGQudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFttYXJrZWRJVXNUb0FkZC5zaXplKCldKSk7Ci0KLQkJLy8gcmVtb3ZlcwotCQlMaXN0IG1hcmtlZElVc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGN1cnJlbnRQbGFubmVyTWFya2VkSVVzKSk7Ci0JCW1hcmtlZElVc1RvUmVtb3ZlLnJlbW92ZUFsbChBcnJheXMuYXNMaXN0KHRhcmdldFBsYW5uZXJNYXJrZWRJVXMpKTsKLQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKChJSW5zdGFsbGFibGVVbml0W10pIG1hcmtlZElVc1RvUmVtb3ZlLnRvQXJyYXkobmV3IElJbnN0YWxsYWJsZVVuaXRbbWFya2VkSVVzVG9SZW1vdmUuc2l6ZSgpXSkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc3luY2hyb25pemVQcm9maWxlUHJvcGVydGllcyhQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0LCBJUHJvZmlsZSBjdXJyZW50LCBJUHJvZmlsZSB0YXJnZXQpIHsKLQkJTWFwIHByb2ZpbGVQcm9wZXJ0aWVzVG9TZXQgPSBuZXcgSGFzaE1hcCh0YXJnZXQuZ2V0UHJvcGVydGllcygpKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGN1cnJlbnQuZ2V0UHJvcGVydGllcygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRW50cnkgZW50cnkgPSAoRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQotCQkJU3RyaW5nIG5ld1ZhbHVlID0gKFN0cmluZykgcHJvZmlsZVByb3BlcnRpZXNUb1NldC5nZXQoa2V5KTsKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmVxdWVzdC5yZW1vdmVQcm9maWxlUHJvcGVydHkoa2V5KTsKLQkJCX0gZWxzZSBpZiAobmV3VmFsdWUuZXF1YWxzKGVudHJ5LmdldFZhbHVlKCkpKQotCQkJCXByb2ZpbGVQcm9wZXJ0aWVzVG9TZXQucmVtb3ZlKGtleSk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvZmlsZVByb3BlcnRpZXNUb1NldC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJcmVxdWVzdC5zZXRQcm9maWxlUHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1lclN0YXRlUHJvZmlsZSBpbXBsZW1lbnRzIElQcm9maWxlIHsKLQotCQlwcml2YXRlIFN0cmluZyBwcm9maWxlSWQ7Ci0JCXByaXZhdGUgSGFzaE1hcCBwcm9maWxlUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXByaXZhdGUgSGFzaE1hcCBpdVByb2ZpbGVQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcHJpdmF0ZSBTZXQgaXVzID0gbmV3IEhhc2hTZXQoKTsKLQotCQlwdWJsaWMgRm9ybWVyU3RhdGVQcm9maWxlKElJbnN0YWxsYWJsZVVuaXQgcHJvZmlsZUlVLCBJUHJvZmlsZSBwcm9maWxlLCBQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCi0JCQlTdHJpbmcgcHJvZmlsZVR5cGVQcm9wZXJ0eSA9IHByb2ZpbGVJVS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9QUk9GSUxFKTsKLQkJCWlmIChwcm9maWxlVHlwZVByb3BlcnR5ID09IG51bGwgfHwgIUJvb2xlYW4udmFsdWVPZihwcm9maWxlVHlwZVByb3BlcnR5KS5ib29sZWFuVmFsdWUoKSkKLQkJCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRGlyZWN0b3JBY3RpdmF0b3IuUElfRElSRUNUT1IsICJOb3QgYSBwcm9maWxlIHR5cGUgSVUiKSk7Ci0KLQkJCXByb2ZpbGVJZCA9IHByb2ZpbGVJVS5nZXRJZCgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2ZpbGVJVS5nZXRQcm9wZXJ0aWVzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJRW50cnkgZW50cnkgPSAoRW50cnkpIGl0Lm5leHQoKTsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZW50cnkuZ2V0S2V5KCk7Ci0JCQkJaWYgKGtleS5zdGFydHNXaXRoKElVUFJPUF9QUkVGSVgpKSB7Ci0JCQkJCWludCBwb3N0SW5kZXggPSBrZXkuaW5kZXhPZihGb3JtZXJTdGF0ZS5JVVBST1BfUE9TVEZJWCwgRm9ybWVyU3RhdGUuSVVQUk9QX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQkJCVN0cmluZyBpdUlkID0ga2V5LnN1YnN0cmluZyhGb3JtZXJTdGF0ZS5JVVBST1BfUFJFRklYLmxlbmd0aCgpLCBwb3N0SW5kZXgpOwotCQkJCQlNYXAgaXVQcm9wZXJ0aWVzID0gKE1hcCkgaXVQcm9maWxlUHJvcGVydGllcy5nZXQoaXVJZCk7Ci0JCQkJCWlmIChpdVByb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJCQkJaXVQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJCWl1UHJvZmlsZVByb3BlcnRpZXMucHV0KGl1SWQsIGl1UHJvcGVydGllcyk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIGl1UHJvcGVydHlLZXkgPSBrZXkuc3Vic3RyaW5nKHBvc3RJbmRleCArIEZvcm1lclN0YXRlLklVUFJPUF9QT1NURklYLmxlbmd0aCgpKTsKLQkJCQkJaXVQcm9wZXJ0aWVzLnB1dChpdVByb3BlcnR5S2V5LCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9IGVsc2UgewotCQkJCQlwcm9maWxlUHJvcGVydGllcy5wdXQoa2V5LCBlbnRyeS5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlwcm9maWxlUHJvcGVydGllcy5yZW1vdmUoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfUFJPRklMRSk7Ci0KLQkJCUxpc3QgZXh0cmFJVXMgPSBuZXcgQXJyYXlMaXN0KHByb2ZpbGUuYXZhaWxhYmxlKEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS50b0NvbGxlY3Rpb24oKSk7Ci0JCQlleHRyYUlVcy5hZGQocHJvZmlsZUlVKTsKLQotCQkJSUluc3RhbGxhYmxlVW5pdFtdIGF2YWlsYWJsZUlVcyA9IFNpbXBsZVBsYW5uZXIuZ2F0aGVyQXZhaWxhYmxlSW5zdGFsbGFibGVVbml0cygoSUluc3RhbGxhYmxlVW5pdFtdKSBleHRyYUlVcy50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W2V4dHJhSVVzLnNpemUoKV0pLCBjb250ZXh0LmdldE1ldGFkYXRhUmVwb3NpdG9yaWVzKCksIGNvbnRleHQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCQlEaWN0aW9uYXJ5IHNuYXBzaG90U2VsZWN0aW9uQ29udGV4dCA9IFNpbXBsZVBsYW5uZXIuY3JlYXRlU2VsZWN0aW9uQ29udGV4dChwcm9maWxlUHJvcGVydGllcyk7Ci0JCQlJSW5zdGFsbGFibGVVbml0W10gYWxsSVVzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cHJvZmlsZUlVfTsKLQkJCVNsaWNlciBzbGljZXIgPSBuZXcgU2xpY2VyKGFsbElVcywgYXZhaWxhYmxlSVVzLCBzbmFwc2hvdFNlbGVjdGlvbkNvbnRleHQpOwotCQkJSVF1ZXJ5YWJsZSBzbGljZSA9IHNsaWNlci5zbGljZShhbGxJVXMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJaWYgKHNsaWNlID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihzbGljZXIuZ2V0U3RhdHVzKCkpOwotCi0JCQlQcm9qZWN0b3IgcHJvamVjdG9yID0gbmV3IFByb2plY3RvcihzbGljZSwgc25hcHNob3RTZWxlY3Rpb25Db250ZXh0KTsKLQkJCXByb2plY3Rvci5lbmNvZGUoYWxsSVVzLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCUlTdGF0dXMgcyA9IHByb2plY3Rvci5pbnZva2VTb2x2ZXIobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJCWlmIChzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUikgewotCQkJCS8vbG9nIHRoZSBlcnJvciBmcm9tIHRoZSBuZXcgc29sdmVyIHNvIGl0IGlzIG5vdCBsb3N0Ci0JCQkJTG9nSGVscGVyLmxvZyhzKTsKLQkJCQlpZiAoISJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGNvbnRleHQgPT0gbnVsbCA/IG51bGwgOiBjb250ZXh0LmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpc2FibGUuZXJyb3IucmVwb3J0aW5nIikpKSB7Ci0JCQkJCS8vV2UgaW52b2tlIHRoZSBvbGQgcmVzb2x2ZXIgdG8gZ2V0IGV4cGxhbmF0aW9ucyBmb3Igbm93Ci0JCQkJCUlTdGF0dXMgb2xkUmVzb2x2ZXJTdGF0dXMgPSBuZXcgTmV3RGVwZW5kZW5jeUV4cGFuZGVyKGFsbElVcywgbnVsbCwgYXZhaWxhYmxlSVVzLCBzbmFwc2hvdFNlbGVjdGlvbkNvbnRleHQsIGZhbHNlKS5leHBhbmQobmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCWlmICghb2xkUmVzb2x2ZXJTdGF0dXMuaXNPSygpKQotCQkJCQkJcyA9IG9sZFJlc29sdmVyU3RhdHVzOwotCQkJCX0KLQkJCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKHMpOwotCQkJfQotCQkJaXVzLmFkZEFsbChwcm9qZWN0b3IuZXh0cmFjdFNvbHV0aW9uKCkpOwotCQkJaXVzLnJlbW92ZShwcm9maWxlSVUpOwotCQl9Ci0KLQkJcHVibGljIE1hcCBnZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJCU1hcCBpdVByb3BlcnRpZXMgPSAoTWFwKSBpdVByb2ZpbGVQcm9wZXJ0aWVzLmdldChpdS5nZXRJZCgpKTsKLQkJCWlmIChpdVByb3BlcnRpZXMgPT0gbnVsbCkgewotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9NQVA7Ci0JCQl9Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGl1UHJvcGVydGllcyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyBrZXkpIHsKLQkJCXJldHVybiAoU3RyaW5nKSBnZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKGl1KS5nZXQoa2V5KTsKLQkJfQotCi0JCXB1YmxpYyBNYXAgZ2V0TG9jYWxQcm9wZXJ0aWVzKCkgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChwcm9maWxlUHJvcGVydGllcyk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2FsUHJvcGVydHkoU3RyaW5nIGtleSkgewotCQkJcmV0dXJuIChTdHJpbmcpIHByb2ZpbGVQcm9wZXJ0aWVzLmdldChrZXkpOwotCQl9Ci0KLQkJcHVibGljIElQcm9maWxlIGdldFBhcmVudFByb2ZpbGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZUlkKCkgewotCQkJcmV0dXJuIHByb2ZpbGVJZDsKLQkJfQotCi0JCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcygpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocHJvZmlsZVByb3BlcnRpZXMpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgcHJvZmlsZVByb3BlcnRpZXMuZ2V0KGtleSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nW10gZ2V0U3ViUHJvZmlsZUlkcygpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNTdWJQcm9maWxlcygpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUm9vdFByb2ZpbGUoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBDb2xsZWN0b3IgcXVlcnkoUXVlcnkgcXVlcnksIENvbGxlY3RvciBjb2xsZWN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJcmV0dXJuIHF1ZXJ5LnBlcmZvcm0oaXVzLml0ZXJhdG9yKCksIGNvbGxlY3Rvcik7Ci0JCX0KLQotCQlwdWJsaWMgQ29sbGVjdG9yIGF2YWlsYWJsZShRdWVyeSBxdWVyeSwgQ29sbGVjdG9yIGNvbGxlY3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlyZXR1cm4gcXVlcnkocXVlcnksIGNvbGxlY3RvciwgbW9uaXRvcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3IvSURpcmVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3IvSURpcmVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlODQ0ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yL0lEaXJlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3I7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci0KLS8qKgotICogRGlyZWN0b3JzIGFyZSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgd2hhdCBzaG91bGQgYmUgZG9uZSB0byBhIGdpdmVuIAotICogcHJvZmlsZSB0byByZXNoYXBlIGl0IGFzIHJlcXVlc3RlZC4gVGhhdCBpcywgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSAKLSAqIHByb2ZpbGUsIGEgZGVzY3JpcHRpb24gb2YgdGhlIGRlc2lyZWQgZW5kIHN0YXRlIG9mIHRoYXQgcHJvZmlsZSBhbmQgbWV0YWRhdGEgCi0gKiBkZXNjcmliaW5nIHRoZSBhdmFpbGFibGUgSVVzLCBhIGRpcmVjdG9yIHByb2R1Y2VzIGEgbGlzdCBvZiBwcm92aXNpb25pbmcgCi0gKiBvcGVyYXRpb25zIChlLmcuLCBpbnN0YWxsLCB1cGRhdGUgb3IgdW5pbnN0YWxsKSB0byBwZXJmb3JtIG9uIHRoZSByZWxhdGVkIElVcy4gCi0gKiBEaXJlY3RvcnMgYXJlIGFsc28gYWJsZSB0byB2YWxpZGF0ZSBwcm9maWxlcyBhbmQgYXNzaXN0IGluIHRoZSBkaWFnbm9zaXMgb2YgCi0gKiBjb25maWd1cmF0aW9uIGVycm9ycy4gTm90ZSB0aGF0IGRpcmVjdG9ycyBtYXkgcmFuZ2UgaW4gY29tcGxleGl0eSBmcm9tIAotICogdmVyeSBzaW1wbGUgKGUuZy4sIHJlYWRpbmcgYSBsaXN0IG9mIGJ1bmRsZXMgZnJvbSBhIHN0YXRpYyBmaWxlKSB0byB2ZXJ5IGNvbXBsZXguIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEaXJlY3RvciB7Ci0KLQkvKioKLQkgKiBwZXJmb3JtcyB0aGUgY2hhbmdlIHJlcXVlc3Qgd2l0aCB0aGUgZ2l2ZW4gY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvZmlsZUNoYW5nZVJlcXVlc3QgVGhlIGNoYW5nZSByZXF1ZXN0Ci0JICogQHBhcmFtIGNvbnRleHQgVGhlIHByb3Zpc2lvbmluZyBjb250ZXh0IHVzZWQgZm9yIGZpbmRpbmcgcmVzb3VyY2VzCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyBub3QgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHByb3Zpc2lvbihQcm9maWxlQ2hhbmdlUmVxdWVzdCBwcm9maWxlQ2hhbmdlUmVxdWVzdCwgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV2ZXJ0cyB0aGUgcHJvZmlsZSB0byBhIHByZXZpb3VzIHN0YXRlIGRlc2NyaWJlZCBpbiB0aGUgZ2l2ZSBJbnN0YWxsYWJsZVVuaXQuCi0JICogCi0JICogQHBhcmFtIHByZXZpb3VzIFRoZSBpbnN0YWxsYWJsZSB1bml0IHRoYXQgZGVzY3JpYmVzIHRoZSBwcmV2aW91cyBzdGF0ZSBvZiB0aGUgcHJvZmlsZQotCSAqIEBwYXJhbSBwcm9maWxlIFRoZSBwcm9maWxlIHRvIHJldmVydAotCSAqIEBwYXJhbSBjb250ZXh0IFRoZSBwcm92aXNpb25pbmcgY29udGV4dCB1c2VkIGZvciBmaW5kaW5nIHJlc291cmNlcwotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyByZXZlcnQoSUluc3RhbGxhYmxlVW5pdCBwcmV2aW91cywgSVByb2ZpbGUgcHJvZmlsZSwgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbG9jYXRpb24gb2YgdGhlIGRpcmVjdG9yJ3Mgcm9sbGJhY2sgcmVwb3NpdG9yeSwgd2hlcmUgaW5mb3JtYXRpb24gYWJvdXQKLQkgKiBwcmV2aW91cyBwcm9maWxlIHN0YXRlcyBpcyBzdG9yZWQuCi0JICovCi0JcHVibGljIFVSTCBnZXRSb2xsYmFja1JlcG9zaXRvcnlMb2NhdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yL0lQbGFubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3IvSVBsYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1ZmJhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3IvSVBsYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci0KLS8qKgotICogUGxhbm5lcnMgYXJlIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB3aGF0IHNob3VsZCBiZSBkb25lIHRvIGEgZ2l2ZW4gCi0gKiBwcm9maWxlIHRvIHJlc2hhcGUgaXQgYXMgcmVxdWVzdGVkLiBUaGF0IGlzLCBnaXZlbiB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIAotICogcHJvZmlsZSwgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVzaXJlZCBlbmQgc3RhdGUgb2YgdGhhdCBwcm9maWxlIGFuZCBtZXRhZGF0YSAKLSAqIGRlc2NyaWJpbmcgdGhlIGF2YWlsYWJsZSBJVXMsIGEgcGxhbm5lciBwcm9kdWNlcyBhIHBsYW4gdGhhdCBsaXN0cyB0aGUKLSAqIHByb3Zpc2lvbmluZyBvcGVyYW5kcyB0aGF0IHRoZSBlbmdpbmUgc2hvdWxkIHBlcmZvcm0uICAKLSAqLwotcHVibGljIGludGVyZmFjZSBJUGxhbm5lciB7Ci0JcHVibGljIFByb3Zpc2lvbmluZ1BsYW4gZ2V0UHJvdmlzaW9uaW5nUGxhbihQcm9maWxlQ2hhbmdlUmVxdWVzdCBwcm9maWxlQ2hhbmdlUmVxdWVzdCwgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JcHVibGljIFByb3Zpc2lvbmluZ1BsYW4gZ2V0UmV2ZXJ0UGxhbihJSW5zdGFsbGFibGVVbml0IHByb2ZpbGVTbmFwc2hvdCwgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXRbXSB1cGRhdGVzRm9yKElJbnN0YWxsYWJsZVVuaXQgdG9VcGRhdGUsIFByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yL0lVUHJvZmlsZVByb3BlcnR5UXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9kaXJlY3Rvci9JVVByb2ZpbGVQcm9wZXJ0eVF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMzZjZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yL0lVUHJvZmlsZVByb3BlcnR5UXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSVVQcm9wZXJ0eVF1ZXJ5OwotCi0vKioKLSAqIEEgcXVlcnkgdGhhdCBzZWFyY2hlcyBmb3Ige0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9IGluc3RhbmNlcyB0aGF0IGhhdmUKLSAqIGEgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvZmlsZSwgd2hvc2UgdmFsdWUgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgdmFsdWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBJVVByb2ZpbGVQcm9wZXJ0eVF1ZXJ5IGV4dGVuZHMgSVVQcm9wZXJ0eVF1ZXJ5IHsKLQlwcml2YXRlIElQcm9maWxlIHByb2ZpbGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHF1ZXJ5IG9uIHRoZSBnaXZlbiBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZS4KLQkgKiBCZWNhdXNlIHRoZSBxdWVyeWFibGUgZm9yIHRoaXMgcXVlcnkgaXMgdHlwaWNhbGx5IHRoZSBwcm9maWxlCi0JICogaW5zdGFuY2UsIHdlIHVzZSBhIHJlZmVyZW5jZSB0byB0aGUgcHJvZmlsZSByYXRoZXIgdGhhbiB0aGUKLQkgKiBwcm9maWxlIGlkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgotCSAqLwotCXB1YmxpYyBJVVByb2ZpbGVQcm9wZXJ0eVF1ZXJ5KElQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXN1cGVyKHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCXRoaXMucHJvZmlsZSA9IHByb2ZpbGU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0IGl1LCBTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShpdSwgbmFtZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yL1BsYW5uZXJIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9kaXJlY3Rvci9QbGFubmVySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhY2M5YjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yL1BsYW5uZXJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotCi1wdWJsaWMgY2xhc3MgUGxhbm5lckhlbHBlciB7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlT3B0aW9uYWxJbmNsdXNpb25SdWxlKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJcmV0dXJuICJPUFRJT05BTCI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlU3RyaWN0SW5jbHVzaW9uUnVsZShJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCXJldHVybiAiU1RSSUNUIjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3IvUHJvZmlsZUNoYW5nZVJlcXVlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9kaXJlY3Rvci9Qcm9maWxlQ2hhbmdlUmVxdWVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGFiMmMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9kaXJlY3Rvci9Qcm9maWxlQ2hhbmdlUmVxdWVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLkRpcmVjdG9yQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuU2ltcGxlUGxhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLQotcHVibGljIGNsYXNzIFByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHsKLQotCXByaXZhdGUgZmluYWwgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIEFycmF5TGlzdCBpdXNUb1JlbW92ZSA9IG51bGw7IC8vIGxpc3Qgb2YgaXVzIHRvIHJlbW92ZQotCXByaXZhdGUgQXJyYXlMaXN0IGl1c1RvQWRkID0gbnVsbDsgLy8gbGlzdCBvZiBpdXMgdG8gYWRkCi0JcHJpdmF0ZSBBcnJheUxpc3QgcHJvcGVydGllc1RvUmVtb3ZlID0gbnVsbDsgLy8gbGlzdCBvZiBrZXlzIGZvciBwcm9wZXJ0aWVzIHRvIGJlIHJlbW92ZWQKLQlwcml2YXRlIEhhc2hNYXAgcHJvcGVydGllc1RvQWRkID0gbnVsbDsgLy8gbWFwIG9mIGtleS0+dmFsdWUgZm9yIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQKLQlwcml2YXRlIE1hcCBpdVByb3BlcnRpZXNUb0FkZCA9IG51bGw7IC8vIG1hcCBpdS0+bWFwIG9mIGtleS0+dmFsdWUgcGFpcnMgZm9yIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgZm9yIGFuIGl1Ci0JcHJpdmF0ZSBNYXAgaXVQcm9wZXJ0aWVzVG9SZW1vdmUgPSBudWxsOyAvLyBtYXAgb2YgaXUtPmxpc3Qgb2YgcHJvcGVydHkga2V5cyB0byBiZSByZW1vdmVkIGZvciBhbiBpdQotCi0JcHVibGljIHN0YXRpYyBQcm9maWxlQ2hhbmdlUmVxdWVzdCBjcmVhdGVCeVByb2ZpbGVJZChTdHJpbmcgcHJvZmlsZUlkKSB7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShEaXJlY3RvckFjdGl2YXRvci5jb250ZXh0LCBJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwcm9maWxlUmVnaXN0cnkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2ZpbGVSZWdpc3RyeSB1bmF2YWlsYWJsZSIpOwotCQlJUHJvZmlsZSBwcm9maWxlID0gcHJvZmlsZVJlZ2lzdHJ5LmdldFByb2ZpbGUocHJvZmlsZUlkKTsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2ZpbGUgaWQgIiArIHByb2ZpbGVJZCArICIgaXMgbm90IHJlZ2lzdGVyZWQuIik7Ci0JCXJldHVybiBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JfQotCi0JcHVibGljIFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KElQcm9maWxlIHByb2ZpbGUpIHsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlByb2ZpbGUgY2Fubm90IGJlIG51bGwuIik7Ci0JCXRoaXMucHJvZmlsZSA9IHByb2ZpbGU7Ci0JfQotCi0JcHVibGljIElQcm9maWxlIGdldFByb2ZpbGUoKSB7Ci0JCXJldHVybiBwcm9maWxlOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0UHJvZmlsZVByb3BlcnRpZXMoKSB7Ci0JCU1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcChwcm9maWxlLmdldFByb3BlcnRpZXMoKSk7Ci0JCWlmIChwcm9wZXJ0aWVzVG9SZW1vdmUgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdCA9IHByb3BlcnRpZXNUb1JlbW92ZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJcmVzdWx0LnJlbW92ZShpdC5uZXh0KCkpOwotCQkJfQotCQl9Ci0JCWlmIChwcm9wZXJ0aWVzVG9BZGQgIT0gbnVsbCkKLQkJCXJlc3VsdC5wdXRBbGwocHJvcGVydGllc1RvQWRkKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZVByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldFByb2ZpbGVQcm9wZXJ0aWVzKCkuZ2V0KGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSW5zdGFsbGFibGVVbml0cyhJSW5zdGFsbGFibGVVbml0W10gdG9JbnN0YWxsKSB7Ci0JCWlmIChpdXNUb0FkZCA9PSBudWxsKQotCQkJaXVzVG9BZGQgPSBuZXcgQXJyYXlMaXN0KHRvSW5zdGFsbC5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRvSW5zdGFsbC5sZW5ndGg7IGkrKykKLQkJCWl1c1RvQWRkLmFkZCh0b0luc3RhbGxbaV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUluc3RhbGxhYmxlVW5pdHMoSUluc3RhbGxhYmxlVW5pdFtdIHRvVW5pbnN0YWxsKSB7Ci0JCWlmIChpdXNUb1JlbW92ZSA9PSBudWxsKQotCQkJaXVzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KHRvVW5pbnN0YWxsLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9Vbmluc3RhbGwubGVuZ3RoOyBpKyspCi0JCQlpdXNUb1JlbW92ZS5hZGQodG9Vbmluc3RhbGxbaV0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb2ZpbGVQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHByb3BlcnRpZXNUb0FkZCA9PSBudWxsKQotCQkJcHJvcGVydGllc1RvQWRkID0gbmV3IEhhc2hNYXAoKTsKLQkJcHJvcGVydGllc1RvQWRkLnB1dChrZXksIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9maWxlUHJvcGVydHkoU3RyaW5nIGtleSkgewotCQlpZiAocHJvcGVydGllc1RvUmVtb3ZlID09IG51bGwpCi0JCQlwcm9wZXJ0aWVzVG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlwcm9wZXJ0aWVzVG9SZW1vdmUuYWRkKGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoaXVQcm9wZXJ0aWVzVG9BZGQgPT0gbnVsbCkKLQkJCWl1UHJvcGVydGllc1RvQWRkID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIHByb3BlcnRpZXMgPSAoTWFwKSBpdVByb3BlcnRpZXNUb0FkZC5nZXQoaXUpOwotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWl1UHJvcGVydGllc1RvQWRkLnB1dChpdSwgcHJvcGVydGllcyk7Ci0JCX0KLQkJcHJvcGVydGllcy5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlSW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyBrZXkpIHsKLQkJaWYgKGl1UHJvcGVydGllc1RvUmVtb3ZlID09IG51bGwpCi0JCQlpdVByb3BlcnRpZXNUb1JlbW92ZSA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3Qga2V5cyA9IChMaXN0KSBpdVByb3BlcnRpZXNUb1JlbW92ZS5nZXQoaXUpOwotCQlpZiAoa2V5cyA9PSBudWxsKSB7Ci0JCQlrZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaXVQcm9wZXJ0aWVzVG9SZW1vdmUucHV0KGl1LCBrZXlzKTsKLQkJfQotCQlrZXlzLmFkZChrZXkpOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0W10gZ2V0UmVtb3ZlZEluc3RhbGxhYmxlVW5pdHMoKSB7Ci0JCWlmIChpdXNUb1JlbW92ZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJSW5zdGFsbGFibGVVbml0WzBdOwotCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXRbXSkgaXVzVG9SZW1vdmUudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFtpdXNUb1JlbW92ZS5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdFtdIGdldEFkZGVkSW5zdGFsbGFibGVVbml0cygpIHsKLQkJaWYgKGl1c1RvQWRkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElJbnN0YWxsYWJsZVVuaXRbMF07Ci0JCXJldHVybiAoSUluc3RhbGxhYmxlVW5pdFtdKSBpdXNUb0FkZC50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W2l1c1RvQWRkLnNpemUoKV0pOwotCX0KLQotCS8vIFN0cmluZyBba2V5LCBrZXksIGtleV0gbmFtZXMgb2YgcHJvcGVydGllcyB0byByZW1vdmUKLQlwdWJsaWMgU3RyaW5nW10gZ2V0UHJvcGVydGllc1RvUmVtb3ZlKCkgewotCQlpZiAocHJvcGVydGllc1RvUmVtb3ZlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJcmV0dXJuIChTdHJpbmdbXSkgcHJvcGVydGllc1RvUmVtb3ZlLnRvQXJyYXkobmV3IFN0cmluZ1twcm9wZXJ0aWVzVG9SZW1vdmUuc2l6ZSgpXSk7Ci0JfQotCi0JLy8gbWFwIG9mIGtleSB2YWx1ZSBwYWlycwotCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllc1RvQWRkKCkgewotCQlpZiAocHJvcGVydGllc1RvQWRkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIHByb3BlcnRpZXNUb0FkZDsKLQl9Ci0KLQkvLyBtYXAgb2YgaXUtPmxpc3Qgb2YgcHJvcGVydHkga2V5cyB0byBiZSByZW1vdmVkIGZvciBhbiBpdQkKLQlwdWJsaWMgTWFwIGdldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0aWVzVG9SZW1vdmUoKSB7Ci0JCWlmIChpdVByb3BlcnRpZXNUb1JlbW92ZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBpdVByb3BlcnRpZXNUb1JlbW92ZTsKLQl9Ci0KLQkvLyBUT0RPIFRoaXMgY2FuIGJlIHJlcHJlc2VudGVkIGFuZCByZXR1cm5lZCBpbiB3aGF0ZXZlciB3YXkgbWFrZXMgbW9zdCBzZW5zZSBmb3IgcGxhbm5lci9lbmdpbmUKLQkvLyBtYXAgaXUtPm1hcCBvZiBrZXktPnZhbHVlIHBhaXJzIGZvciBwcm9wZXJ0aWVzIHRvIGJlIGFkZGVkIGZvciBhbiBpdQotCXB1YmxpYyBNYXAgZ2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnRpZXNUb0FkZCgpIHsKLQkJaWYgKGl1UHJvcGVydGllc1RvQWRkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGl1UHJvcGVydGllc1RvQWRkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc3RhbGxhYmxlVW5pdEluY2x1c2lvblJ1bGVzKElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoaXVQcm9wZXJ0aWVzVG9BZGQgPT0gbnVsbCkKLQkJCWl1UHJvcGVydGllc1RvQWRkID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIHByb3BlcnRpZXMgPSAoTWFwKSBpdVByb3BlcnRpZXNUb0FkZC5nZXQoaXUpOwotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWl1UHJvcGVydGllc1RvQWRkLnB1dChpdSwgcHJvcGVydGllcyk7Ci0JCX0KLQkJcHJvcGVydGllcy5wdXQoU2ltcGxlUGxhbm5lci5JTkNMVVNJT05fUlVMRVMsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVJbnN0YWxsYWJsZVVuaXRJbmNsdXNpb25SdWxlcyhJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCWlmIChpdVByb3BlcnRpZXNUb1JlbW92ZSA9PSBudWxsKQotCQkJaXVQcm9wZXJ0aWVzVG9SZW1vdmUgPSBuZXcgSGFzaE1hcCgpOwotCQlMaXN0IGtleXMgPSAoTGlzdCkgaXVQcm9wZXJ0aWVzVG9SZW1vdmUuZ2V0KGl1KTsKLQkJaWYgKGtleXMgPT0gbnVsbCkgewotCQkJa2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWl1UHJvcGVydGllc1RvUmVtb3ZlLnB1dChpdSwga2V5cyk7Ci0JCX0KLQkJa2V5cy5hZGQoU2ltcGxlUGxhbm5lci5JTkNMVVNJT05fUlVMRVMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9kaXJlY3Rvci9Qcm92aXNpb25pbmdQbGFuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3IvUHJvdmlzaW9uaW5nUGxhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmEyNDc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9kaXJlY3Rvci9Qcm92aXNpb25pbmdQbGFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLk9wZXJhbmQ7Ci0KLXB1YmxpYyBjbGFzcyBQcm92aXNpb25pbmdQbGFuIHsKLQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCXByaXZhdGUgT3BlcmFuZFtdIG9wZXJhbmRzOwotCi0JcHVibGljIFByb3Zpc2lvbmluZ1BsYW4oSVN0YXR1cyBzdGF0dXMpIHsKLQkJdGhpcyhzdGF0dXMsIG5ldyBPcGVyYW5kWzBdKTsKLQl9Ci0KLQlwdWJsaWMgUHJvdmlzaW9uaW5nUGxhbihJU3RhdHVzIHN0YXR1cywgT3BlcmFuZFtdIG9wZXJhbmRzKSB7Ci0JCXRoaXMuc3RhdHVzID0gc3RhdHVzOwotCQl0aGlzLm9wZXJhbmRzID0gb3BlcmFuZHM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKiAKLQkgKiBUaGUgb3BlcmFuZHMgdG8gcGFzcyB0byB0aGUgZW5naW5lLgotCSAqIEByZXR1cm4gdGhlIG9wZXJhbmRzIHRvIGJlIGV4ZWN1dGVkLiBUaGlzIG1heSBiZSBhbiBlbXB0eSBhcnJheSBpZiB0aGUKLQkgKiBwbGFuIGhhcyBlcnJvcnMgb3IgaWYgdGhlcmUgaXMgbm90aGluZyB0byBkby4KLQkgKi8KLQlwdWJsaWMgT3BlcmFuZFtdIGdldE9wZXJhbmRzKCkgewotCQlyZXR1cm4gb3BlcmFuZHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UwYzdhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjAlRm91bmRhdGlvbi0xLjAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI2YTkwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTIzY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLSNUaHUgQXVnIDE2IDExOjAwOjU5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0NmQ4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotI1R1ZSBBdWcgMjEgMTE6Mjc6NDggQ0RUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPXVzZXIKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD05OQotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTA0YmQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1NhdCBBdWcgMTEgMjA6MTc6NTIgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIyNDVhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5mZWF0dXJlcywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnksCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWwsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuNC4wIiwKLSBvcmcub3NnaS5zZXJ2aWNlLmNtO3ZlcnNpb249IjEuMi4wIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbjt2ZXJzaW9uPSIxLjIuMCIsCi0gb3JnLm9zZ2kudXRpbC50cmFja2VyO3ZlcnNpb249IjEuMy4wIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjAvRm91bmRhdGlvbi0xLjAsCi0gSjJTRS0xLjMKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbiIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzMuMy4wLDQuMCkiCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuQWN0aXZhdG9yCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2Mjc4NWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLQkJPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotCQk8cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgCi0JCWRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgZm9sbG93aW5nIGlzIHByb3ZpZGVkIAotCQlmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5LCBhbmQgeW91IHNob3VsZCBsb29rIHRvIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSBmb3IgCi0JCXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLQkJPGg0PkZpbGVJbnN0YWxsIDEuMDwvaDQ+IAotCQk8cD5UaGUgYnVuZGxlIGluY2x1ZGVzIGRlcml2YXRpdmUgd29ya3Mgb2Ygc29mdHdhcmUgb3JpZ2luYWxseSBkZXZlbG9wZWQgYnkgUGV0ZXIgS3JpZW5zIChhUXV0ZSkuCi0JCVRoYXQgb3JpZ2luYWwgd29yayB3YXMgbGljZW5zZWQgdW5kZXIgdGhlIEVQTCB2MS4wIGFuZCB0aGlzIGRlcml2YXRpdmUgd29yayBpcyBzaW1pbGFybHkgbGljZW5zZWQuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNzdiOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGI2OWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IFByb3Zpc2lvbmluZyBEaXJlY3RvcnkgV2F0Y2hlcgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yeXdhdGNoZXIvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9kaXJlY3Rvcnl3YXRjaGVyL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2JmMmM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yeXdhdGNoZXIvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlcjsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogQnVuZGxlIGFjdGl2YXRvciBmb3IgZGlyZWN0b3J5IHdhdGNoZXIgYnVuZGxlLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGFDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJY29udGV4dCA9IGFDb250ZXh0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQljb250ZXh0ID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yeXdhdGNoZXIvRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yeXdhdGNoZXIvRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk1ZDFiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9kaXJlY3Rvcnl3YXRjaGVyL0RpcmVjdG9yeUNoYW5nZUxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBpZGVhcyAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qCi0gKiBBYnN0cmFjdCBjbGFzcyB3aGljaCBjb250YWlucyBzdHViIG1ldGhvZHMuIFN1Yi1jbGFzc2VzIHRvIG92ZXItcmlkZQotICogbWV0aG9kcyB3aGljaCB0aGV5IGFyZSBpbnRlcmVzdGVkIGluLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHVibGljIHZvaWQgc3RhcnRQb2xsKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgc3RvcFBvbGwoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZXN0ZWQoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGRlZChGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlbW92ZWQoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjaGFuZ2VkKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIExvbmcgZ2V0U2VlbkZpbGUoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yeXdhdGNoZXIvRGlyZWN0b3J5V2F0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3J5d2F0Y2hlci9EaXJlY3RvcnlXYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYmQ2ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3J5d2F0Y2hlci9EaXJlY3RvcnlXYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBhUXV0ZSwgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIGFRdXRlIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgaWRlYXMgCi0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGFkYXB0YXRpb24gdG8gRXF1aW5veCBwcm92aXNpb25pbmcgdXNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBEaXJlY3RvcnlXYXRjaGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMX0VYVCA9ICIuZGVsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGNsYXNzIFdhdGNoZXJUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCi0JCXByaXZhdGUgZmluYWwgbG9uZyBwb2xsRnJlcXVlbmN5OwotCQlwcml2YXRlIGJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCi0JCXB1YmxpYyBXYXRjaGVyVGhyZWFkKGxvbmcgcG9sbEZyZXF1ZW5jeSkgewotCQkJc3VwZXIoIkRpcmVjdG9yeSBXYXRjaGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMucG9sbEZyZXF1ZW5jeSA9IHBvbGxGcmVxdWVuY3k7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlkbyB7Ci0JCQkJdHJ5IHsKLQkJCQkJcG9sbCgpOwotCQkJCQlzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLQkJCQkJCXdhaXQocG9sbEZyZXF1ZW5jeSk7Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCWxvZyhNZXNzYWdlcy5lcnJvcl9tYWluX2xvb3AsIGUpOwotCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9IHdoaWxlICghZG9uZSk7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZG9uZSgpIHsKLQkJCWRvbmUgPSB0cnVlOwotCQkJbm90aWZ5KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQT0xMID0gImVjbGlwc2UucDIuZGlyZWN0b3J5LndhdGNoZXIucG9sbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESVIgPSAiZWNsaXBzZS5wMi5kaXJlY3Rvcnkud2F0Y2hlci5kaXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1BPTExfRlJFUVVFTkNZID0gMjAwMDsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIHN0cmluZywgVGhyb3dhYmxlIGUpIHsKLQkJU3lzdGVtLmVyci5wcmludGxuKHN0cmluZyArICI6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCWZpbmFsIEZpbGVbXSBkaXJlY3RvcmllczsKLQotCWxvbmcgcG9sbCA9IDIwMDA7Ci0JcHJpdmF0ZSBTZXQgbGlzdGVuZXJzID0gbmV3IEhhc2hTZXQoKTsKLQlwcml2YXRlIEhhc2hTZXQgc2Nhbm5lZEZpbGVzID0gbmV3IEhhc2hTZXQoKTsKLQlwcml2YXRlIEhhc2hTZXQgcmVtb3ZhbHM7Ci0JcHJpdmF0ZSBTZXQgcGVuZGluZ0RlbGV0aW9uczsKLQlwcml2YXRlIFdhdGNoZXJUaHJlYWQgd2F0Y2hlcjsKLQotCXB1YmxpYyBEaXJlY3RvcnlXYXRjaGVyKERpY3Rpb25hcnkgcHJvcGVydGllcywgQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZyBkaXIgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChESVIpOwotCQlpZiAoZGlyID09IG51bGwpCi0JCQlkaXIgPSAiLi9sb2FkIjsgLy8kTk9OLU5MUy0xJAotCi0JCUZpbGUgdGFyZ2V0RGlyZWN0b3J5ID0gbmV3IEZpbGUoZGlyKTsKLQkJdGFyZ2V0RGlyZWN0b3J5Lm1rZGlycygpOwotCQlkaXJlY3RvcmllcyA9IG5ldyBGaWxlW10ge3RhcmdldERpcmVjdG9yeX07Ci0JfQotCi0JcHVibGljIERpcmVjdG9yeVdhdGNoZXIoRmlsZSBkaXJlY3RvcnkpIHsKLQkJaWYgKGRpcmVjdG9yeSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5udWxsX2ZvbGRlcik7Ci0KLQkJdGhpcy5kaXJlY3RvcmllcyA9IG5ldyBGaWxlW10ge2RpcmVjdG9yeX07Ci0JfQotCi0JcHVibGljIERpcmVjdG9yeVdhdGNoZXIoRmlsZVtdIGRpcmVjdG9yaWVzKSB7Ci0JCWlmIChkaXJlY3RvcmllcyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5udWxsX2ZvbGRlcik7Ci0JCXRoaXMuZGlyZWN0b3JpZXMgPSBkaXJlY3RvcmllczsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTGlzdGVuZXIoRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUxpc3RlbmVyKERpcmVjdG9yeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KCkgewotCQlzdGFydChERUZBVUxUX1BPTExfRlJFUVVFTkNZKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcG9sbCgpIHsKLQkJc3RhcnRQb2xsKCk7Ci0JCXNjYW5EaXJlY3RvcmllcygpOwotCQlzdG9wUG9sbCgpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydChmaW5hbCBsb25nIHBvbGxGcmVxdWVuY3kpIHsKLQkJaWYgKHdhdGNoZXIgIT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMudGhyZWFkX3N0YXJ0ZWQpOwotCi0JCXdhdGNoZXIgPSBuZXcgV2F0Y2hlclRocmVhZChwb2xsRnJlcXVlbmN5KTsKLQkJd2F0Y2hlci5zdGFydCgpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQlpZiAod2F0Y2hlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy50aHJlYWRfbm90X3N0YXJ0ZWQpOwotCi0JCXdhdGNoZXIuZG9uZSgpOwotCQl3YXRjaGVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRmlsZVtdIGdldERpcmVjdG9yaWVzKCkgewotCQlyZXR1cm4gZGlyZWN0b3JpZXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0UG9sbCgpIHsKLQkJcmVtb3ZhbHMgPSBzY2FubmVkRmlsZXM7Ci0JCXNjYW5uZWRGaWxlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXBlbmRpbmdEZWxldGlvbnMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQkJKChEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lcikgaS5uZXh0KCkpLnN0YXJ0UG9sbCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzY2FuRGlyZWN0b3JpZXMoKSB7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBkaXJlY3Rvcmllcy5sZW5ndGg7IGluZGV4KyspIHsKLQkJCUZpbGUgZGlyZWN0b3J5ID0gZGlyZWN0b3JpZXNbaW5kZXhdOwotCQkJRmlsZSBsaXN0W10gPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmlsZSBmaWxlID0gbGlzdFtpXTsKLQkJCQkvLyBpZiB0aGlzIGlzIGEgZGVsZXRpb24gbWFya2VyIHRoZW4gYWRkIHRvIHRoZSBsaXN0IG9mIHBlbmRpbmcgZGVsZXRpb25zLgotCQkJCWlmIChsaXN0W2ldLmdldFBhdGgoKS5lbmRzV2l0aChERUxfRVhUKSkgewotCQkJCQlGaWxlIHRhcmdldCA9IG5ldyBGaWxlKGZpbGUuZ2V0UGF0aCgpLnN1YnN0cmluZygwLCBmaWxlLmdldFBhdGgoKS5sZW5ndGgoKSAtIDQpKTsKLQkJCQkJcmVtb3ZhbHMuYWRkKHRhcmdldCk7Ci0JCQkJCXBlbmRpbmdEZWxldGlvbnMuYWRkKHRhcmdldCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZWxzZSByZW1lbWJlciB0aGF0IHdlIHNhdyB0aGUgZmlsZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhpcyBsaXN0IG9mIGZpbGVzIHRvIGJlIAotCQkJCQkvLyByZW1vdmVkIGF0IHRoZSBlbmQuICBUaGVuIG5vdGlmeSBhbGwgdGhlIGxpc3RlbmVycyBhcyBuZWVkZWQuCi0JCQkJCXNjYW5uZWRGaWxlcy5hZGQoZmlsZSk7Ci0JCQkJCXJlbW92YWxzLnJlbW92ZShmaWxlKTsKLQkJCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGxpc3RlbmVycy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCQlEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IChEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lcikgaXRlcmF0b3IubmV4dCgpOwotCQkJCQkJaWYgKGlzSW50ZXJlc3RlZChsaXN0ZW5lciwgZmlsZSkpCi0JCQkJCQkJcHJvY2Vzc0ZpbGUoZmlsZSwgbGlzdGVuZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3BQb2xsKCkgewotCQlub3RpZnlSZW1vdmFscygpOwotCQlyZW1vdmFscyA9IHNjYW5uZWRGaWxlczsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCSgoRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIpIGkubmV4dCgpKS5zdG9wUG9sbCgpOwotCQlwcm9jZXNzUGVuZGluZ0RlbGV0aW9ucygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0ludGVyZXN0ZWQoRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIsIEZpbGUgZmlsZSkgewotCQlyZXR1cm4gbGlzdGVuZXIuaXNJbnRlcmVzdGVkKGZpbGUpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmeSB0aGUgbGlzdGVuZXJzIG9mIHRoZSBmaWxlcyB0aGF0IGhhdmUgYmVlbiBkZWxldGVkIG9yIG1hcmtlZCBmb3IgZGVsZXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVJlbW92YWxzKCkgewotCQlTZXQgcmVtb3ZlZCA9IHJlbW92YWxzOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lciA9IChEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lcikgaS5uZXh0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGogPSByZW1vdmVkLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykgewotCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBqLm5leHQoKTsKLQkJCQlpZiAoaXNJbnRlcmVzdGVkKGxpc3RlbmVyLCBmaWxlKSkKLQkJCQkJbGlzdGVuZXIucmVtb3ZlZChmaWxlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRmlsZShGaWxlIGZpbGUsIERpcmVjdG9yeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRyeSB7Ci0JCQlMb25nIG9sZFRpbWVzdGFtcCA9IGxpc3RlbmVyLmdldFNlZW5GaWxlKGZpbGUpOwotCQkJaWYgKG9sZFRpbWVzdGFtcCA9PSBudWxsKSB7Ci0JCQkJLy8gVGhlIGZpbGUgaXMgbmV3Ci0JCQkJbGlzdGVuZXIuYWRkZWQoZmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFRoZSBmaWxlIGlzIG5vdCBuZXcgYnV0IG1heSBoYXZlIGNoYW5nZWQKLQkJCQlsb25nIGxhc3RNb2RpZmllZCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCQkJaWYgKG9sZFRpbWVzdGFtcC5sb25nVmFsdWUoKSAhPSBsYXN0TW9kaWZpZWQpCi0JCQkJCWxpc3RlbmVyLmNoYW5nZWQoZmlsZSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2coTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JfcHJvY2Vzc2luZywgbGlzdGVuZXIpLCBlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRyeSB0byByZW1vdmUgdGhlIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIG1hcmtlZCBmb3IgZGVsZXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQZW5kaW5nRGVsZXRpb25zKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcGVuZGluZ0RlbGV0aW9ucy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlGaWxlIGZpbGUgPSAoRmlsZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCFmaWxlLmV4aXN0cygpIHx8IGZpbGUuZGVsZXRlKCkpCi0JCQkJaXRlcmF0b3IucmVtb3ZlKCk7Ci0JCQluZXcgRmlsZShmaWxlLmdldFBhdGgoKSArIERFTF9FWFQpLmRlbGV0ZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9kaXJlY3Rvcnl3YXRjaGVyL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9kaXJlY3Rvcnl3YXRjaGVyL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNWRlZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3J5d2F0Y2hlci9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfcmVwb19tYW5hZ2VyX25vdF9yZWdpc3RlcmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX21haW5fbG9vcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9wcm9jZXNzaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhaWxlZF9jcmVhdGVfYXJ0aWZhY3RfcmVwbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmYWlsZWRfY3JlYXRlX21ldGFkYXRhX3JlcG87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0YWRhdGFfcmVwb19tYW5hZ2VyX25vdF9yZWdpc3RlcmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG11bHRpcGxlX2J1bmRsZV9pdXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbnVsbF9mb2xkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGxhdGZvcm1hZG1pbl9ub3RfcmVnaXN0ZXJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0aHJlYWRfbm90X3N0YXJ0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdGhyZWFkX3N0YXJ0ZWQ7Ci0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3J5d2F0Y2hlci9SZXBvc2l0b3J5TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2RpcmVjdG9yeXdhdGNoZXIvUmVwb3NpdG9yeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YzA1ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3J5d2F0Y2hlci9SZXBvc2l0b3J5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLAotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBhbmQgaWRlYXMgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLmZlYXR1cmVzLkZlYXR1cmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuSVByb3Zpc2lvbmluZ0V2ZW50QnVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgUmVwb3NpdG9yeUxpc3RlbmVyIGV4dGVuZHMgRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9GT0xERVIgPSAiYXJ0aWZhY3QuZm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9SRUZFUkVOQ0UgPSAiYXJ0aWZhY3QucmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX0xBU1RfTU9ESUZJRUQgPSAiZmlsZS5sYXN0TW9kaWZpZWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfTkFNRSA9ICJmaWxlLm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBJTWV0YWRhdGFSZXBvc2l0b3J5IG1ldGFkYXRhUmVwb3NpdG9yeTsKLQlwcml2YXRlIGZpbmFsIElBcnRpZmFjdFJlcG9zaXRvcnkgYXJ0aWZhY3RSZXBvc2l0b3J5OwotCXByaXZhdGUgZmluYWwgQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5IGJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeTsKLQlwcml2YXRlIGZpbmFsIE1hcCBjdXJyZW50RmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgcmVwb3NpdG9yeSBsaXN0ZW5lciB0aGF0IHdhdGNoZXMgdGhlIHNwZWNpZmllZCBmb2xkZXIgYW5kIGdlbmVyYXRlcyByZXBvc2l0b3JpZXMKLQkgKiBmb3IgaXRzIGNvbnRlbnQuCi0JICogQHBhcmFtIGNvbnRleHQgdGhlIGJ1bmRsZSBjb250ZXh0Ci0JICogQHBhcmFtIHJlcG9zaXRvcnlOYW1lIHRoZSByZXBvc2l0b3J5IG5hbWUgdG8gdXNlIGZvciB0aGUgcmVwb3NpdG9yeQotCSAqIEBwYXJhbSByZXBvc2l0b3J5Rm9sZGVyIHRoZSB0YXJnZXQgZm9sZGVyIGZvciB0aGUgcmVwb3NpdG9yeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgYSBmb2xkZXIgYmFzZWQgb24gdGhlCi0JICogYnVuZGxlJ3MgZGF0YSBsb2NhdGlvbiBzaG91bGQgYmUgdXNlZC4KLQkgKiBAcGFyYW0gaGlkZGVuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSByZXBvc2l0b3J5IHNob3VsZCBiZSBoaWRkZW4sIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiBub3QuCi0JICovCi0JcHVibGljIFJlcG9zaXRvcnlMaXN0ZW5lcihCdW5kbGVDb250ZXh0IGNvbnRleHQsIFN0cmluZyByZXBvc2l0b3J5TmFtZSwgRmlsZSByZXBvc2l0b3J5Rm9sZGVyLCBib29sZWFuIGhpZGRlbikgewotCQlGaWxlIHN0YXRlRGlyOwotCQlpZiAocmVwb3NpdG9yeUZvbGRlciA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgc3RhdGVEaXJOYW1lID0gImxpc3RlbmVyXyIgKyByZXBvc2l0b3J5TmFtZS5oYXNoQ29kZSgpOyAvLyROT04tTkxTLTEkCi0JCQlzdGF0ZURpciA9IGNvbnRleHQuZ2V0RGF0YUZpbGUoc3RhdGVEaXJOYW1lKTsKLQkJCXN0YXRlRGlyLm1rZGlycygpOwotCQl9IGVsc2UgewotCQkJc3RhdGVEaXIgPSByZXBvc2l0b3J5Rm9sZGVyOwotCQl9Ci0KLQkJVVJMIHN0YXRlRGlyVVJMOwotCQl0cnkgewotCQkJc3RhdGVEaXJVUkwgPSBzdGF0ZURpci50b1VSTCgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQotCQltZXRhZGF0YVJlcG9zaXRvcnkgPSBpbml0aWFsaXplTWV0YWRhdGFSZXBvc2l0b3J5KGNvbnRleHQsIHJlcG9zaXRvcnlOYW1lLCBzdGF0ZURpclVSTCwgaGlkZGVuKTsKLQkJYXJ0aWZhY3RSZXBvc2l0b3J5ID0gaW5pdGlhbGl6ZUFydGlmYWN0UmVwb3NpdG9yeShjb250ZXh0LCByZXBvc2l0b3J5TmFtZSwgc3RhdGVEaXJVUkwsIGhpZGRlbik7Ci0JCWJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeSA9IGluaXRpYWxpemVCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkoY29udGV4dCk7Ci0JfQotCi0JcHVibGljIFJlcG9zaXRvcnlMaXN0ZW5lcihCdW5kbGVDb250ZXh0IGNvbnRleHQsIElNZXRhZGF0YVJlcG9zaXRvcnkgbWV0YWRhdGFSZXBvc2l0b3J5LCBJQXJ0aWZhY3RSZXBvc2l0b3J5IGFydGlmYWN0UmVwb3NpdG9yeSkgewotCQl0aGlzLmFydGlmYWN0UmVwb3NpdG9yeSA9IGFydGlmYWN0UmVwb3NpdG9yeTsKLQkJdGhpcy5tZXRhZGF0YVJlcG9zaXRvcnkgPSBtZXRhZGF0YVJlcG9zaXRvcnk7Ci0JCWJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeSA9IGluaXRpYWxpemVCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQnJvYWRjYXN0IGV2ZW50cyBmb3IgYW55IGRpc2NvdmVyeSBzaXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGZlYXR1cmUKLQkgKiBzbyB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VycyBhZGQgdGhlbSB0byB0aGVpciBsaXN0IG9mIGtub3duIHJlcG9zaXRvcmllcy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHVibGlzaFNpdGVzKEZlYXR1cmUgZmVhdHVyZSkgewotCQlJUHJvdmlzaW9uaW5nRXZlbnRCdXMgYnVzID0gKElQcm92aXNpb25pbmdFdmVudEJ1cykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm92aXNpb25pbmdFdmVudEJ1cy5TRVJWSUNFX05BTUUpOwotCQlpZiAoYnVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVVSTEVudHJ5W10gZGlzY292ZXJ5U2l0ZXMgPSBmZWF0dXJlLmdldERpc2NvdmVyeVNpdGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGlzY292ZXJ5U2l0ZXMubGVuZ3RoOyBpKyspCi0JCQlwdWJsaXNoU2l0ZShmZWF0dXJlLCBidXMsIGRpc2NvdmVyeVNpdGVzW2ldLmdldFVSTCgpLCBmYWxzZSk7Ci0JCVN0cmluZyB1cGRhdGVTaXRlID0gZmVhdHVyZS5nZXRVcGRhdGVTaXRlVVJMKCk7Ci0JCWlmICh1cGRhdGVTaXRlICE9IG51bGwpCi0JCQlwdWJsaXNoU2l0ZShmZWF0dXJlLCBidXMsIHVwZGF0ZVNpdGUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEJyb2FkY2FzdCBhIGRpc2NvdmVyeSBldmVudCBmb3IgdGhlIGdpdmVuIHJlcG9zaXRvcnkgbG9jYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHB1Ymxpc2hTaXRlKEZlYXR1cmUgZmVhdHVyZSwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzIGJ1cywgU3RyaW5nIGxvY2F0aW9uU3RyaW5nLCBib29sZWFuIGlzRW5hYmxlZCkgewotCQl0cnkgewotCQkJVVJMIGxvY2F0aW9uID0gbmV3IFVSTChsb2NhdGlvblN0cmluZyk7Ci0JCQlidXMucHVibGlzaEV2ZW50KG5ldyBSZXBvc2l0b3J5RXZlbnQobG9jYXRpb24sIElSZXBvc2l0b3J5LlRZUEVfTUVUQURBVEEsIFJlcG9zaXRvcnlFdmVudC5ESVNDT1ZFUkVELCBpc0VuYWJsZWQpKTsKLQkJCWJ1cy5wdWJsaXNoRXZlbnQobmV3IFJlcG9zaXRvcnlFdmVudChsb2NhdGlvbiwgSVJlcG9zaXRvcnkuVFlQRV9BUlRJRkFDVCwgUmVwb3NpdG9yeUV2ZW50LkRJU0NPVkVSRUQsIGlzRW5hYmxlZCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQWN0aXZhdG9yLklELCAiRmVhdHVyZSByZWZlcmVuY2VzIGludmFsaWQgc2l0ZTogIiArIGZlYXR1cmUuZ2V0SWQoKSwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeSBpbml0aWFsaXplQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShQbGF0Zm9ybUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMucGxhdGZvcm1hZG1pbl9ub3RfcmVnaXN0ZXJlZCk7Ci0JCVBsYXRmb3JtQWRtaW4gcGxhdGZvcm1BZG1pbiA9IChQbGF0Zm9ybUFkbWluKSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJaWYgKHBsYXRmb3JtQWRtaW4gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMucGxhdGZvcm1hZG1pbl9ub3RfcmVnaXN0ZXJlZCk7Ci0KLQkJdHJ5IHsKLQkJCVN0YXRlT2JqZWN0RmFjdG9yeSBzdGF0ZU9iamVjdEZhY3RvcnkgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQkJCXJldHVybiBuZXcgQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5KHN0YXRlT2JqZWN0RmFjdG9yeSwgbnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQXJ0aWZhY3RSZXBvc2l0b3J5IGluaXRpYWxpemVBcnRpZmFjdFJlcG9zaXRvcnkoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeU5hbWUsIFVSTCBzdGF0ZURpclVSTCwgYm9vbGVhbiBoaWRkZW4pIHsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IG51bGw7Ci0JCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkKLQkJCW1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5hcnRpZmFjdF9yZXBvX21hbmFnZXJfbm90X3JlZ2lzdGVyZWQpOwotCi0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KHN0YXRlRGlyVVJMLCBudWxsKTsKLQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9mYWxsIHRocm91Z2ggYW5kIGNyZWF0ZSBhIG5ldyByZXBvc2l0b3J5Ci0JCQl9Ci0JCQl0cnkgewotCQkJCVN0cmluZyBuYW1lID0gcmVwb3NpdG9yeU5hbWU7Ci0JCQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgxKTsKLQkJCQlpZiAoaGlkZGVuKSB7Ci0JCQkJCXByb3BlcnRpZXMucHV0KElSZXBvc2l0b3J5LlBST1BfU1lTVEVNLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCQkJCW5hbWUgPSAiYXJ0aWZhY3QgbGlzdGVuZXIgIiArIHJlcG9zaXRvcnlOYW1lOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybiBtYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkoc3RhdGVEaXJVUkwsIG5hbWUsIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLlRZUEVfU0lNUExFX1JFUE9TSVRPUlksIHByb3BlcnRpZXMpOwotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dIZWxwZXIubG9nKGUpOwotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZmFpbGVkX2NyZWF0ZV9hcnRpZmFjdF9yZXBvLCBzdGF0ZURpclVSTCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSU1ldGFkYXRhUmVwb3NpdG9yeSBpbml0aWFsaXplTWV0YWRhdGFSZXBvc2l0b3J5KEJ1bmRsZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIHJlcG9zaXRvcnlOYW1lLCBVUkwgc3RhdGVEaXJVUkwsIGJvb2xlYW4gaGlkZGVuKSB7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSBudWxsOwotCQlpZiAocmVmZXJlbmNlICE9IG51bGwpCi0JCQltYW5hZ2VyID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMubWV0YWRhdGFfcmVwb19tYW5hZ2VyX25vdF9yZWdpc3RlcmVkKTsKLQotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbWFuYWdlci5sb2FkUmVwb3NpdG9yeShzdGF0ZURpclVSTCwgbnVsbCk7Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCS8vZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgbmV3IHJlcG9zaXRvcnkKLQkJCX0KLQkJCVN0cmluZyBuYW1lID0gcmVwb3NpdG9yeU5hbWU7Ci0JCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKDEpOwotCQkJaWYgKGhpZGRlbikgewotCQkJCXByb3BlcnRpZXMucHV0KElSZXBvc2l0b3J5LlBST1BfU1lTVEVNLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCQkJbmFtZSA9ICJtZXRhZGF0YSBsaXN0ZW5lciAiICsgcmVwb3NpdG9yeU5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBtYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkoc3RhdGVEaXJVUkwsIG5hbWUsIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlRZUEVfU0lNUExFX1JFUE9TSVRPUlksIHByb3BlcnRpZXMpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJTG9nSGVscGVyLmxvZyhlKTsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZmFpbGVkX2NyZWF0ZV9tZXRhZGF0YV9yZXBvLCBzdGF0ZURpclVSTCkpOwotCQl9IGZpbmFsbHkgewotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5JRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIjYWRkZWQoamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZGVkKEZpbGUgZmlsZSkgewotCQlpZiAoaXNGZWF0dXJlKGZpbGUpIHx8IGlzQnVuZGxlKGZpbGUpKSB7Ci0JCQljdXJyZW50RmlsZXMucHV0KGZpbGUsIG5ldyBMb25nKGZpbGUubGFzdE1vZGlmaWVkKCkpKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuSURpcmVjdG9yeUNoYW5nZUxpc3RlbmVyI2NoYW5nZWQoamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNoYW5nZWQoRmlsZSBmaWxlKSB7Ci0JCWlmIChpc0ZlYXR1cmUoZmlsZSkgfHwgaXNCdW5kbGUoZmlsZSkpIHsKLQkJCWN1cnJlbnRGaWxlcy5wdXQoZmlsZSwgbmV3IExvbmcoZmlsZS5sYXN0TW9kaWZpZWQoKSkpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5JRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIjcmVtb3ZlZChqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlZChGaWxlIGZpbGUpIHsKLQkJLy8gbm90ZSB0aGF0IHdlIGNhbid0IGNhbGwgI2lzSW50ZXJlc3RpbmcgaGVyZSBiZWNhdXNlIHdlIGNhbid0IHRlbGwgaWYgdGhlIGZpbGUgaGFuZGxlCi0JCS8vIHBvaW50cyB0byBhIGRpcmVjdG9yeSBiZWNhdXNlIGl0cyBhbHJlYWR5IGJlZW4gcmVtb3ZlZC4KLQkJY3VycmVudEZpbGVzLnJlbW92ZShmaWxlKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQnVuZGxlKEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpIHx8IGZpbGUuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlRGVzY3JpcHRpb24gPSBidW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkuZ2V0QnVuZGxlRGVzY3JpcHRpb24oZmlsZSk7Ci0JCQlyZXR1cm4gYnVuZGxlRGVzY3JpcHRpb24gIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JYm9vbGVhbiBpc0ZlYXR1cmUoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBmaWxlLmlzRGlyZWN0b3J5KCkgJiYgZmlsZS5nZXRQYXJlbnRGaWxlKCkgIT0gbnVsbCAmJiBmaWxlLmdldFBhcmVudEZpbGUoKS5nZXROYW1lKCkuZXF1YWxzKCJmZWF0dXJlcyIpICYmIG5ldyBGaWxlKGZpbGUsICJmZWF0dXJlLnhtbCIpLmV4aXN0cygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIjaXNJbnRlcmVzdGVkKGphdmEuaW8uRmlsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZXN0ZWQoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5JRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIjZ2V0U2VlbkZpbGUoamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyBMb25nIGdldFNlZW5GaWxlKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gKExvbmcpIGN1cnJlbnRGaWxlcy5nZXQoZmlsZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLklEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciNzdGFydFBvbGwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0UG9sbCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5JRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIjc3RvcFBvbGwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3BQb2xsKCkgewotCQlpZiAobWV0YWRhdGFSZXBvc2l0b3J5ICE9IG51bGwpCi0JCQlzeW5jaHJvbml6ZU1ldGFkYXRhUmVwb3NpdG9yeSgpOwotCi0JCWlmIChhcnRpZmFjdFJlcG9zaXRvcnkgIT0gbnVsbCkKLQkJCXN5bmNocm9uaXplQXJ0aWZhY3RSZXBvc2l0b3J5KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNocm9uaXplTWV0YWRhdGFSZXBvc2l0b3J5KCkgewotCQlmaW5hbCBNYXAgc25hcHNob3QgPSBuZXcgSGFzaE1hcChjdXJyZW50RmlsZXMpOwotCQlmaW5hbCBMaXN0IGZlYXR1cmVGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJUXVlcnkgcmVtb3ZlUXVlcnkgPSBuZXcgUXVlcnkoKSB7Ci0JCQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoKE9iamVjdCBjYW5kaWRhdGUpIHsKLQkJCQlpZiAoIShjYW5kaWRhdGUgaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVVbml0KSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgY2FuZGlkYXRlOwotCQkJCUZpbGUgaXVGaWxlID0gbmV3IEZpbGUoaXUuZ2V0UHJvcGVydHkoRklMRV9OQU1FKSk7Ci0JCQkJLy8gZmVhdHVyZSBmaWxlcyBnZW5lcmF0ZSB0d28gaXVzIChncm91cCwgamFyKQotCQkJCS8vIGNoZWNrIGlmIGZlYXR1cmUgZmlsZSBhbHJlYWR5IG1hdGNoZWQgCi0JCQkJaWYgKGZlYXR1cmVGaWxlcy5jb250YWlucyhpdUZpbGUpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJTG9uZyBpdUxhc3RNb2RpZmllZCA9IG5ldyBMb25nKGl1LmdldFByb3BlcnR5KEZJTEVfTEFTVF9NT0RJRklFRCkpOwotCQkJCUxvbmcgc25hcHNob3RMYXN0TW9kaWZpZWQgPSAoTG9uZykgc25hcHNob3QuZ2V0KGl1RmlsZSk7Ci0JCQkJaWYgKHNuYXBzaG90TGFzdE1vZGlmaWVkID09IG51bGwgfHwgIXNuYXBzaG90TGFzdE1vZGlmaWVkLmVxdWFscyhpdUxhc3RNb2RpZmllZCkpCi0JCQkJCXJldHVybiB0cnVlOwotCi0JCQkJLy8gZmlsZSBmb3VuZC4gUmVtb3ZlIGZyb20gc25hcHNob3QgdG8gcHJldmVudCBpdCBmcm9tIGJlaW5nIHJlLWFkZGVkLgotCQkJCXNuYXBzaG90LnJlbW92ZShpdUZpbGUpOwotCi0JCQkJaWYgKGlzRmVhdHVyZShpdUZpbGUpKQotCQkJCQlmZWF0dXJlRmlsZXMuYWRkKGl1RmlsZSk7Ci0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCW1ldGFkYXRhUmVwb3NpdG9yeS5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKHJlbW92ZVF1ZXJ5LCBudWxsKTsKLQotCQlpZiAoIXNuYXBzaG90LmlzRW1wdHkoKSkgewotCQkJSUluc3RhbGxhYmxlVW5pdFtdIGl1c1RvQWRkID0gZ2VuZXJhdGVJVXMoc25hcHNob3Qua2V5U2V0KCkpOwotCQkJaWYgKGl1c1RvQWRkLmxlbmd0aCAhPSAwKQotCQkJCW1ldGFkYXRhUmVwb3NpdG9yeS5hZGRJbnN0YWxsYWJsZVVuaXRzKGl1c1RvQWRkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzeW5jaHJvbml6ZUFydGlmYWN0UmVwb3NpdG9yeSgpIHsKLQkJZmluYWwgTWFwIHNuYXBzaG90ID0gbmV3IEhhc2hNYXAoY3VycmVudEZpbGVzKTsKLQkJZmluYWwgTGlzdCBrZXlzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdEtleXMoKSkpOwotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBrZXlzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlBcnRpZmFjdEtleSBrZXkgPSAoSUFydGlmYWN0S2V5KSBpdC5uZXh0KCk7Ci0JCQlJQXJ0aWZhY3REZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBhcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhrZXkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKEFydGlmYWN0RGVzY3JpcHRvcikgZGVzY3JpcHRvcnNbaV07Ci0JCQkJRmlsZSBhcnRpZmFjdEZpbGUgPSBuZXcgRmlsZShkZXNjcmlwdG9yLmdldFJlcG9zaXRvcnlQcm9wZXJ0eShGSUxFX05BTUUpKTsKLQkJCQlMb25nIGFydGlmYWN0TGFzdE1vZGlmaWVkID0gbmV3IExvbmcoZGVzY3JpcHRvci5nZXRSZXBvc2l0b3J5UHJvcGVydHkoRklMRV9MQVNUX01PRElGSUVEKSk7Ci0JCQkJTG9uZyBzbmFwc2hvdExhc3RNb2RpZmllZCA9IChMb25nKSBzbmFwc2hvdC5nZXQoYXJ0aWZhY3RGaWxlKTsKLQkJCQlpZiAoc25hcHNob3RMYXN0TW9kaWZpZWQgPT0gbnVsbCB8fCAhc25hcHNob3RMYXN0TW9kaWZpZWQuZXF1YWxzKGFydGlmYWN0TGFzdE1vZGlmaWVkKSkKLQkJCQkJYXJ0aWZhY3RSZXBvc2l0b3J5LnJlbW92ZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCQkJZWxzZQotCQkJCQlzbmFwc2hvdC5yZW1vdmUoYXJ0aWZhY3RGaWxlKTsKLQkJCX0KLQkJfQotCi0JCWlmICghc25hcHNob3QuaXNFbXB0eSgpKSB7Ci0JCQlMaXN0IGRlc2NyaXB0b3JzVG9BZGQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gc25hcHNob3Qua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCUZpbGUgZmlsZSA9IChGaWxlKSBpdC5uZXh0KCk7Ci0JCQkJSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2VuZXJhdGVBcnRpZmFjdERlc2NyaXB0b3IoZmlsZSk7Ci0JCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCQkJZGVzY3JpcHRvcnNUb0FkZC5hZGQoZGVzY3JpcHRvcik7Ci0JCQl9Ci0JCQlpZiAoIWRlc2NyaXB0b3JzVG9BZGQuaXNFbXB0eSgpKQotCQkJCWFydGlmYWN0UmVwb3NpdG9yeS5hZGREZXNjcmlwdG9ycygoSUFydGlmYWN0RGVzY3JpcHRvcltdKSBkZXNjcmlwdG9yc1RvQWRkLnRvQXJyYXkobmV3IElBcnRpZmFjdERlc2NyaXB0b3JbZGVzY3JpcHRvcnNUb0FkZC5zaXplKCldKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUFydGlmYWN0RGVzY3JpcHRvciBnZW5lcmF0ZUFydGlmYWN0RGVzY3JpcHRvcihGaWxlIGNhbmRpZGF0ZSkgewotCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGJhc2ljRGVzY3JpcHRvciA9IGdlbmVyYXRlQmFzaWNEZXNjcmlwdG9yKGNhbmRpZGF0ZSk7Ci0JCWlmIChiYXNpY0Rlc2NyaXB0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUFydGlmYWN0RGVzY3JpcHRvciBwYXRoRGVzY3JpcHRvciA9IG5ldyBBcnRpZmFjdERlc2NyaXB0b3IoYmFzaWNEZXNjcmlwdG9yKTsKLQkJdHJ5IHsKLQkJCXBhdGhEZXNjcmlwdG9yLnNldFJlcG9zaXRvcnlQcm9wZXJ0eShBUlRJRkFDVF9SRUZFUkVOQ0UsIGNhbmRpZGF0ZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gdW5leHBlY3RlZAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChjYW5kaWRhdGUuaXNEaXJlY3RvcnkoKSkKLQkJCXBhdGhEZXNjcmlwdG9yLnNldFJlcG9zaXRvcnlQcm9wZXJ0eShBUlRJRkFDVF9GT0xERVIsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQotCQlwYXRoRGVzY3JpcHRvci5zZXRSZXBvc2l0b3J5UHJvcGVydHkoRklMRV9OQU1FLCBjYW5kaWRhdGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlwYXRoRGVzY3JpcHRvci5zZXRSZXBvc2l0b3J5UHJvcGVydHkoRklMRV9MQVNUX01PRElGSUVELCBMb25nLnRvU3RyaW5nKGNhbmRpZGF0ZS5sYXN0TW9kaWZpZWQoKSkpOwotCi0JCXJldHVybiBwYXRoRGVzY3JpcHRvcjsKLQl9Ci0KLQlwcml2YXRlIElBcnRpZmFjdERlc2NyaXB0b3IgZ2VuZXJhdGVCYXNpY0Rlc2NyaXB0b3IoRmlsZSBjYW5kaWRhdGUpIHsKLQkJaWYgKGlzRmVhdHVyZShjYW5kaWRhdGUpKSB7Ci0JCQlGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBGZWF0dXJlUGFyc2VyKCk7Ci0JCQlGZWF0dXJlIGZlYXR1cmUgPSBwYXJzZXIucGFyc2UoY2FuZGlkYXRlKTsKLQkJCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlJQXJ0aWZhY3RLZXkgZmVhdHVyZUtleSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUZlYXR1cmVBcnRpZmFjdEtleShmZWF0dXJlLmdldElkKCksIGZlYXR1cmUuZ2V0VmVyc2lvbigpKTsKLQkJCXJldHVybiBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGZlYXR1cmVLZXkpOwotCQl9Ci0KLQkJQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlRGVzY3JpcHRpb24gPSBidW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkuZ2V0QnVuZGxlRGVzY3JpcHRpb24oY2FuZGlkYXRlKTsKLQkJaWYgKGJ1bmRsZURlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUFydGlmYWN0S2V5IGtleSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUJ1bmRsZUFydGlmYWN0S2V5KGJ1bmRsZURlc2NyaXB0aW9uLmdldFN5bWJvbGljTmFtZSgpLCBidW5kbGVEZXNjcmlwdGlvbi5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVBcnRpZmFjdERlc2NyaXB0b3Ioa2V5LCBjYW5kaWRhdGUsIHRydWUsIGZhbHNlKTsKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXRbXSBnZW5lcmF0ZUlVcyhDb2xsZWN0aW9uIGZpbGVzKSB7Ci0JCUxpc3QgaXVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZmlsZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRmlsZSBjYW5kaWRhdGUgPSAoRmlsZSkgaXQubmV4dCgpOwotCi0JCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCXByb3BzLnNldFByb3BlcnR5KEZJTEVfTkFNRSwgY2FuZGlkYXRlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCXByb3BzLnNldFByb3BlcnR5KEZJTEVfTEFTVF9NT0RJRklFRCwgTG9uZy50b1N0cmluZyhjYW5kaWRhdGUubGFzdE1vZGlmaWVkKCkpKTsKLQotCQkJaWYgKGlzRmVhdHVyZShjYW5kaWRhdGUpKSB7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdFtdIGZlYXR1cmVJVXMgPSBnZW5lcmF0ZUZlYXR1cmVJVXMoY2FuZGlkYXRlLCBwcm9wcyk7Ci0JCQkJaWYgKGZlYXR1cmVJVXMgIT0gbnVsbCkKLQkJCQkJaXVzLmFkZEFsbChBcnJheXMuYXNMaXN0KGZlYXR1cmVJVXMpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdFtdIGJ1bmRsZUlVcyA9IGdlbmVyYXRlQnVuZGxlSVUoY2FuZGlkYXRlLCBwcm9wcyk7Ci0JCQkJaWYgKGJ1bmRsZUlVcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlSVVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpdXMuYWRkKGJ1bmRsZUlVc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0W10pIGl1cy50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W2l1cy5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXRbXSBnZW5lcmF0ZUZlYXR1cmVJVXMoRmlsZSBmZWF0dXJlRmlsZSwgUHJvcGVydGllcyBwcm9wcykgewotCQlGZWF0dXJlUGFyc2VyIHBhcnNlciA9IG5ldyBGZWF0dXJlUGFyc2VyKCk7Ci0JCUZlYXR1cmUgZmVhdHVyZSA9IHBhcnNlci5wYXJzZShmZWF0dXJlRmlsZSk7Ci0JCWlmIChmZWF0dXJlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlwdWJsaXNoU2l0ZXMoZmVhdHVyZSk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlSVUgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVGZWF0dXJlSmFySVUoZmVhdHVyZSwgdHJ1ZSwgcHJvcHMpOwotCQlJSW5zdGFsbGFibGVVbml0IGdyb3VwSVUgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVHcm91cElVKGZlYXR1cmUsIGZlYXR1cmVJVSwgcHJvcHMpOwotCQlyZXR1cm4gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZmVhdHVyZUlVLCBncm91cElVfTsKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXRbXSBnZW5lcmF0ZUJ1bmRsZUlVKEZpbGUgYnVuZGxlRmlsZSwgUHJvcGVydGllcyBwcm9wcykgewotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVEZXNjcmlwdGlvbiA9IGJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeS5nZXRCdW5kbGVEZXNjcmlwdGlvbihidW5kbGVGaWxlKTsKLQkJaWYgKGJ1bmRsZURlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJQXJ0aWZhY3RLZXkga2V5ID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlQnVuZGxlQXJ0aWZhY3RLZXkoYnVuZGxlRGVzY3JpcHRpb24uZ2V0U3ltYm9saWNOYW1lKCksIGJ1bmRsZURlc2NyaXB0aW9uLmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIGl1cyA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUVjbGlwc2VJVShidW5kbGVEZXNjcmlwdGlvbiwgKE1hcCkgYnVuZGxlRGVzY3JpcHRpb24uZ2V0VXNlck9iamVjdCgpLCBidW5kbGVGaWxlLmlzRGlyZWN0b3J5KCksIGtleSwgcHJvcHMpOwotCi0JCS8vIHNlZSBidWcgMjIyMzcwCQkKLQkJLy8gd2Ugb25seSB3YW50IHRvIHJldHVybiB0aGUgYnVuZGxlIElVCi0JCS8vIGV4Y2x1ZGUgYWxsIGZyYWdtZW50IElVcwotCQlpZiAoaXVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIGl1czsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGl1cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFpdXNbaV0uaXNGcmFnbWVudCgpKQotCQkJCXJldHVybiBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtpdXNbaV19OwotCQl9Ci0JCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMubXVsdGlwbGVfYnVuZGxlX2l1cyk7Ci0JfQotCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KCkgewotCQlyZXR1cm4gbWV0YWRhdGFSZXBvc2l0b3J5OwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGdldEFydGlmYWN0UmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9kaXJlY3Rvcnl3YXRjaGVyL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9kaXJlY3Rvcnl3YXRjaGVyL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ODgwN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZGlyZWN0b3J5d2F0Y2hlci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotYXJ0aWZhY3RfcmVwb19tYW5hZ2VyX25vdF9yZWdpc3RlcmVkPUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbm90IHJlZ2lzdGVyZWQuCi1lcnJvcl9tYWluX2xvb3A9RXJyb3IgaW4gd2F0Y2hlciB0aHJlYWQgbWFpbiBsb29wLgotZXJyb3JfcHJvY2Vzc2luZz1FcnJvciBQcm9jZXNzaW5nOiB7MH0KLWZhaWxlZF9jcmVhdGVfYXJ0aWZhY3RfcmVwbz1Db3VsZCBub3QgY3JlYXRlIGFydGlmYWN0IHJlcG9zaXRvcnkgZm9yOiB7MH0KLWZhaWxlZF9jcmVhdGVfbWV0YWRhdGFfcmVwbz1Db3VsZCBub3QgY3JlYXRlIG1ldGFkYXRhIHJlcG9zaXRvcnkgZm9yOiB7MH0KLW1ldGFkYXRhX3JlcG9fbWFuYWdlcl9ub3RfcmVnaXN0ZXJlZD1NZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG5vdCByZWdpc3RlcmVkLgotbXVsdGlwbGVfYnVuZGxlX2l1cz1UaGVyZSBzaG91bGQgYmUgZXhhY3RseSBvbmUgQnVuZGxlIElVCi1udWxsX2ZvbGRlcj1Gb2xkZXIgbXVzdCBub3QgYmUgbnVsbAotcGxhdGZvcm1hZG1pbl9ub3RfcmVnaXN0ZXJlZD1QbGF0Zm9ybUFkbWluIG5vdCByZWdpc3RlcmVkLgotdGhyZWFkX25vdF9zdGFydGVkPVdhdGNoZXIgdGhyZWFkIG5vdCBTdGFydGVkCi10aHJlYWRfc3RhcnRlZD1XYXRjaGVyIHRocmVhZCBhbHJlYWR5IFN0YXJ0ZWQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiYjdhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyN2I5MTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5OGM5ODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotI0ZyaSBGZWIgMjIgMDk6MTk6MDEgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJjYzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNTdW4gU2VwIDIzIDExOjU4OjA3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcy8+Ci1zcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLXNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODc0ODgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmU7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24sCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IsCi0gICBvcmcuZWNsaXBzZS5wZGUucDIudWkiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLnBoYXNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpIgotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5wYXJzZXJzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5pbywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnBlcnNpc3RlbmNlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5sb2NhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbjt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnNpZ25lZGNvbnRlbnQ7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudXRpbDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIiwKLSBvcmcub3NnaS51dGlsLnRyYWNrZXI7dmVyc2lvbj0iMS4zLjMiLAotIG9yZy54bWwuc2F4Ci1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZS5FbmdpbmVBY3RpdmF0b3IKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FY2xpcHNlLVJlZ2lzdGVyQnVkZHk6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LAotIENEQy0xLjEvRm91bmRhdGlvbi0xLjEKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5LAotIG9yZy5lY2xpcHNlLm9zZ2kKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTU4NWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmIwZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBQcm92aXNpb25pbmcgRW5naW5lCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjA2OTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTxwbHVnaW4+Ci08ZXh0ZW5zaW9uLXBvaW50IAotCQlpZD0idG91Y2hwb2ludHMiIAotCQluYW1lPSJUb3VjaHBvaW50cyIgCi0JCXNjaGVtYT0ic2NoZW1hL3RvdWNocG9pbnRzLmV4c2QiLz4KLQkJCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUudG91Y2hwb2ludHMiIGlkPSJudWxsIiBuYW1lPSJOdWxsIFRvdWNocG9pbnQiPgotCQk8dG91Y2hwb2ludCAKLQkJCXR5cGU9Im51bGwiIAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lLk51bGxUb3VjaHBvaW50IgotCQkJdmVyc2lvbj0iMS4wLjAiLz4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zY2hlbWEvdG91Y2hwb2ludHMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc2NoZW1hL3RvdWNocG9pbnRzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NDhhODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zY2hlbWEvdG91Y2hwb2ludHMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUiIGlkPSJ0b3VjaHBvaW50cyIgbmFtZT0iVG91Y2hwb2ludHMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGRlc2NyaXB0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idG91Y2hwb2ludCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZGF0YSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ0b3VjaHBvaW50Ij4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiIGJhc2VkT249Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLklUb3VjaHBvaW50Ii8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZGF0YSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgdGhlIGZpcnN0IHJlbGVhc2UgaW4gd2hpY2ggdGhpcyBleHRlbnNpb24gcG9pbnQgYXBwZWFycy5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwJmd0OwotICAgJmx0O3ByZSZndDsKLSAmbHQ7ZXh0ZW5zaW9uIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLmluc3RhbGxBZGFwdG9ycyZxdW90OyBpZD0mcXVvdDtlY2xpcHNlJnF1b3Q7IG5hbWU9JnF1b3Q7RWNsaXBzZSBJbnN0YWxsIEFkYXB0b3ImcXVvdDsmZ3Q7Ci0gICZsdDtpbnN0YWxsQWRhcHRvciAKLSAgIHR5cGU9JnF1b3Q7ZWNsaXBzZSZxdW90OyAKLSAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZWNsaXBzZUFkYXB0b3IuRWNsaXBzZUluc3RhbGxBZGFwdG9yJnF1b3Q7Ci0gICB2ZXJzaW9uPSZxdW90OzEuMC4wJnF1b3Q7LyZndDsKLSAmbHQ7L2V4dGVuc2lvbiZndDsKLSAgICZsdDsvcHJlJmd0OwotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9Eb3dubG9hZE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL0Rvd25sb2FkTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWFlODBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL0Rvd25sb2FkTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBXaW5kUml2ZXIgLSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjI3MzcyCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0NvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBEb3dubG9hZE1hbmFnZXIgewotCXByaXZhdGUgUHJvdmlzaW9uaW5nQ29udGV4dCBwcm92Q29udGV4dCA9IG51bGw7Ci0JQXJyYXlMaXN0IHJlcXVlc3RzVG9Qcm9jZXNzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoaXMgQ29tcGFyYXRvciBzb3J0cyB0aGUgcmVwb3NpdG9yaWVzIHN1Y2ggdGhhdCC0bG9jYWy0IHJlcG9zaXRvcmllcyBhcmUgZmlyc3QgCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBMT0NBTF9GSVJTVF9DT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3IoKSB7Ci0KLQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSkgewotCQkJQXNzZXJ0LmlzVHJ1ZShhcmcwIGluc3RhbmNlb2YgVVJMKTsKLQkJCUFzc2VydC5pc1RydWUoYXJnMSBpbnN0YW5jZW9mIFVSTCk7Ci0KLQkJCVN0cmluZyBwcm90b2NvbDAgPSAoKFVSTCkgYXJnMCkuZ2V0UHJvdG9jb2woKTsKLQkJCVN0cmluZyBwcm90b2NvbDEgPSAoKFVSTCkgYXJnMSkuZ2V0UHJvdG9jb2woKTsKLQotCQkJaWYgKHByb3RvY29sMC5lcXVhbHMoRklMRV9QUk9UT0NPTCkgJiYgIXByb3RvY29sMS5lcXVhbHMoRklMRV9QUk9UT0NPTCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJaWYgKCFwcm90b2NvbDAuZXF1YWxzKEZJTEVfUFJPVE9DT0wpICYmIHByb3RvY29sMS5lcXVhbHMoRklMRV9QUk9UT0NPTCkpCi0JCQkJcmV0dXJuIDE7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCX07Ci0KLQlwdWJsaWMgRG93bmxvYWRNYW5hZ2VyKFByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCkgewotCQlwcm92Q29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JLyoKLQkgKiBBZGQgdGhlIGdpdmVuIGFydGlmYWN0IHRvIHRoZSBkb3dubG9hZCBxdWV1ZS4gV2hlbiBpdCAKLQkgKiBpcyBkb3dubG9hZGVkLCBwdXQgaXQgaW4gdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoSUFydGlmYWN0UmVxdWVzdCB0b0FkZCkgewotCQlyZXF1ZXN0c1RvUHJvY2Vzcy5hZGQodG9BZGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChJQXJ0aWZhY3RSZXF1ZXN0W10gdG9BZGQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b0FkZC5sZW5ndGg7IGkrKykgewotCQkJYWRkKHRvQWRkW2ldKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmaWx0ZXJVbmZldGNoZWQoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXF1ZXN0c1RvUHJvY2Vzcy5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJQXJ0aWZhY3RSZXF1ZXN0IHJlcXVlc3QgPSAoSUFydGlmYWN0UmVxdWVzdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKHJlcXVlc3QuZ2V0UmVzdWx0KCkgIT0gbnVsbCAmJiByZXF1ZXN0LmdldFJlc3VsdCgpLmlzT0soKSkgewotCQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBTdGFydCB0aGUgZG93bmxvYWRzLiBSZXR1cm4gYSBzdGF0dXMgbWVzc2FnZSBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBvZiB0aGUgb3ZlcmFsbCBvcGVyYXRpb24KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBzdGFydChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJU3ViTW9uaXRvciBzdWJNb25pdG9yID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIE1lc3NhZ2VzLmRvd25sb2FkX2FydGlmYWN0LCByZXF1ZXN0c1RvUHJvY2Vzcy5zaXplKCkpOwotCQl0cnkgewotCQkJaWYgKHJlcXVlc3RzVG9Qcm9jZXNzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01nciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEVuZ2luZUFjdGl2YXRvci5nZXRDb250ZXh0KCksIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlVUkxbXSByZXBvc2l0b3JpZXMgPSBudWxsOwotCQkJaWYgKHByb3ZDb250ZXh0ID09IG51bGwgfHwgcHJvdkNvbnRleHQuZ2V0QXJ0aWZhY3RSZXBvc2l0b3JpZXMoKSA9PSBudWxsKQotCQkJCXJlcG9zaXRvcmllcyA9IHJlcG9NZ3IuZ2V0S25vd25SZXBvc2l0b3JpZXMoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX0FMTCk7Ci0JCQllbHNlCi0JCQkJcmVwb3NpdG9yaWVzID0gcHJvdkNvbnRleHQuZ2V0QXJ0aWZhY3RSZXBvc2l0b3JpZXMoKTsKLQkJCWlmIChyZXBvc2l0b3JpZXMubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRW5naW5lQWN0aXZhdG9yLklELCBNZXNzYWdlcy5kb3dubG9hZF9ub19yZXBvc2l0b3J5KTsKLQkJCUFycmF5cy5zb3J0KHJlcG9zaXRvcmllcywgTE9DQUxfRklSU1RfQ09NUEFSQVRPUik7Ci0JCQlmZXRjaChyZXBvTWdyLCByZXBvc2l0b3JpZXMsIHN1Yk1vbml0b3IpOwotCQkJcmV0dXJuIG92ZXJhbGxTdGF0dXMobW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWJNb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBmZXRjaChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciByZXBvTWdyLCBVUkxbXSByZXBvc2l0b3JpZXMsIFN1Yk1vbml0b3IgbW9uaXRvcikgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcG9zaXRvcmllcy5sZW5ndGggJiYgIXJlcXVlc3RzVG9Qcm9jZXNzLmlzRW1wdHkoKSAmJiAhbW9uaXRvci5pc0NhbmNlbGVkKCk7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IGN1cnJlbnQgPSByZXBvTWdyLmxvYWRSZXBvc2l0b3J5KHJlcG9zaXRvcmllc1tpXSwgbW9uaXRvci5uZXdDaGlsZCgwKSk7Ci0JCQkJSUFydGlmYWN0UmVxdWVzdFtdIHJlcXVlc3RzID0gZ2V0UmVxdWVzdHNGb3JSZXBvc2l0b3J5KGN1cnJlbnQpOwotCQkJCUlTdGF0dXMgZGxTdGF0dXMgPSBjdXJyZW50LmdldEFydGlmYWN0cyhyZXF1ZXN0cywgbW9uaXRvci5uZXdDaGlsZChyZXF1ZXN0cy5sZW5ndGgpKTsKLQkJCQlpZiAoZGxTdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkNBTkNFTCkKLQkJCQkJcmV0dXJuOwotCQkJCWZpbHRlclVuZmV0Y2hlZCgpOwotCQkJCW1vbml0b3Iuc2V0V29ya1JlbWFpbmluZyhyZXF1ZXN0c1RvUHJvY2Vzcy5zaXplKCkpOwotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvL3NraXAgdW5yZWFjaGFibGUgcmVwb3NpdG9yaWVzCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElBcnRpZmFjdFJlcXVlc3RbXSBnZXRSZXF1ZXN0c0ZvclJlcG9zaXRvcnkoSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCUFycmF5TGlzdCBhcHBsaWNhYmxlID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVxdWVzdHNUb1Byb2Nlc3MuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUFydGlmYWN0UmVxdWVzdCByZXF1ZXN0ID0gKElBcnRpZmFjdFJlcXVlc3QpIGl0Lm5leHQoKTsKLQkJCWlmIChyZXBvc2l0b3J5LmNvbnRhaW5zKHJlcXVlc3QuZ2V0QXJ0aWZhY3RLZXkoKSkpCi0JCQkJYXBwbGljYWJsZS5hZGQocmVxdWVzdCk7Ci0JCX0KLQkJcmV0dXJuIChJQXJ0aWZhY3RSZXF1ZXN0W10pIGFwcGxpY2FibGUudG9BcnJheShuZXcgSUFydGlmYWN0UmVxdWVzdFthcHBsaWNhYmxlLnNpemUoKV0pOwotCX0KLQotCS8vCXByaXZhdGUgdm9pZCBub3RpZnlGZXRjaGVkKCkgewotCS8vCQlQcm92aXNpb25pbmdFdmVudEJ1cyBidXMgPSAoUHJvdmlzaW9uaW5nRXZlbnRCdXMpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShEb3dubG9hZEFjdGl2YXRvci5jb250ZXh0LCBQcm92aXNpb25pbmdFdmVudEJ1cy5jbGFzcyk7Ci0JLy8JCWJ1cy5wdWJsaXNoRXZlbnQoKTsKLQkvLwl9Ci0KLQlwcml2YXRlIElTdGF0dXMgb3ZlcmFsbFN0YXR1cyhJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCi0JCWlmIChyZXF1ZXN0c1RvUHJvY2Vzcy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCU11bHRpU3RhdHVzIHJlc3VsdCA9IG5ldyBNdWx0aVN0YXR1cyhFbmdpbmVBY3RpdmF0b3IuSUQsIElTdGF0dXMuT0ssIG51bGwsIG51bGwpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVxdWVzdHNUb1Byb2Nlc3MuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSVN0YXR1cyBmYWlsZWQgPSAoKElBcnRpZmFjdFJlcXVlc3QpIGl0ZXJhdG9yLm5leHQoKSkuZ2V0UmVzdWx0KCk7Ci0JCQlpZiAoZmFpbGVkICE9IG51bGwgJiYgIWZhaWxlZC5pc09LKCkpCi0JCQkJcmVzdWx0LmFkZChmYWlsZWQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvRW5naW5lQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9FbmdpbmVBY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNhYjFlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9FbmdpbmVBY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuRW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklFbmdpbmU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlckN1c3RvbWl6ZXI7Ci0KLXB1YmxpYyBjbGFzcyBFbmdpbmVBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IsIFNlcnZpY2VUcmFja2VyQ3VzdG9taXplciB7Ci0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbjsKLQotCXByaXZhdGUgU2VydmljZVRyYWNrZXIgdHJhY2tlcjsKLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGFkZGluZ1NlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UpIHsKLQkJaWYgKHJlZ2lzdHJhdGlvbiA9PSBudWxsKSB7Ci0JCQlJUHJvdmlzaW9uaW5nRXZlbnRCdXMgZXZlbnRCdXMgPSAoSVByb3Zpc2lvbmluZ0V2ZW50QnVzKSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJCXJlZ2lzdHJhdGlvbiA9IGNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKElFbmdpbmUuU0VSVklDRV9OQU1FLCBuZXcgRW5naW5lKGV2ZW50QnVzKSwgbnVsbCk7Ci0JCQlyZXR1cm4gZXZlbnRCdXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZpZWRTZXJ2aWNlKFNlcnZpY2VSZWZlcmVuY2UgcmVmZXJlbmNlLCBPYmplY3Qgc2VydmljZSkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlZFNlcnZpY2UoU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UsIE9iamVjdCBzZXJ2aWNlKSB7Ci0JCWlmIChyZWdpc3RyYXRpb24gIT0gbnVsbCkgewotCQkJcmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLQkJCXJlZ2lzdHJhdGlvbiA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGFDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRW5naW5lQWN0aXZhdG9yLmNvbnRleHQgPSBhQ29udGV4dDsKLQkJdHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihhQ29udGV4dCwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLlNFUlZJQ0VfTkFNRSwgdGhpcyk7Ci0JCXRyYWNrZXIub3BlbigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBhQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyYWNrZXIuY2xvc2UoKTsKLQkJdHJhY2tlciA9IG51bGw7Ci0KLQkJRW5naW5lQWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvSW5zdHJ1Y3Rpb25QYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL0luc3RydWN0aW9uUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0N2Y2ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvSW5zdHJ1Y3Rpb25QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSW5zdHJ1Y3Rpb25QYXJzZXIgewotCi0JSW5zdGFsbGFibGVVbml0UGhhc2UgcGhhc2U7Ci0JVG91Y2hwb2ludCB0b3VjaHBvaW50OwotCi0JcHVibGljIEluc3RydWN0aW9uUGFyc2VyKEluc3RhbGxhYmxlVW5pdFBoYXNlIHBoYXNlLCBUb3VjaHBvaW50IHRvdWNocG9pbnQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChwaGFzZSk7Ci0JCUFzc2VydC5pc05vdE51bGwodG91Y2hwb2ludCk7Ci0JCXRoaXMucGhhc2UgPSBwaGFzZTsKLQkJdGhpcy50b3VjaHBvaW50ID0gdG91Y2hwb2ludDsKLQl9Ci0KLQlwdWJsaWMgUHJvdmlzaW9uaW5nQWN0aW9uW10gcGFyc2VBY3Rpb25zKFN0cmluZyBpbnN0cnVjdGlvbikgewotCQlMaXN0IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluc3RydWN0aW9uLCAiOyIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlhY3Rpb25zLmFkZChwYXJzZUFjdGlvbih0b2tlbml6ZXIubmV4dFRva2VuKCkpKTsKLQkJfQotCi0JCXJldHVybiAoUHJvdmlzaW9uaW5nQWN0aW9uW10pIGFjdGlvbnMudG9BcnJheShuZXcgUHJvdmlzaW9uaW5nQWN0aW9uW2FjdGlvbnMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBQcm92aXNpb25pbmdBY3Rpb24gcGFyc2VBY3Rpb24oU3RyaW5nIHN0YXRlbWVudCkgewotCQlpbnQgb3BlbkJyYWNrZXQgPSBzdGF0ZW1lbnQuaW5kZXhPZignKCcpOwotCQlpbnQgY2xvc2VCcmFja2V0ID0gc3RhdGVtZW50Lmxhc3RJbmRleE9mKCcpJyk7Ci0JCVN0cmluZyBhY3Rpb25OYW1lID0gc3RhdGVtZW50LnN1YnN0cmluZygwLCBvcGVuQnJhY2tldCkudHJpbSgpOwotCQlQcm92aXNpb25pbmdBY3Rpb24gYWN0aW9uID0gbG9va3VwQWN0aW9uKGFjdGlvbk5hbWUpOwotCi0JCVN0cmluZyBuYW1lVmFsdWVQYWlycyA9IHN0YXRlbWVudC5zdWJzdHJpbmcob3BlbkJyYWNrZXQgKyAxLCBjbG9zZUJyYWNrZXQpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihuYW1lVmFsdWVQYWlycywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQlNYXAgcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgbmFtZVZhbHVlUGFpciA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCWludCBjb2xvbkluZGV4ID0gbmFtZVZhbHVlUGFpci5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBuYW1lID0gbmFtZVZhbHVlUGFpci5zdWJzdHJpbmcoMCwgY29sb25JbmRleCkudHJpbSgpOwotCQkJU3RyaW5nIHZhbHVlID0gbmFtZVZhbHVlUGFpci5zdWJzdHJpbmcoY29sb25JbmRleCArIDEpLnRyaW0oKTsKLQkJCXBhcmFtZXRlcnMucHV0KG5hbWUsIHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gbmV3IFBhcmFtZXRlcml6ZWRQcm92aXNpb25pbmdBY3Rpb24oYWN0aW9uLCBwYXJhbWV0ZXJzKTsKLQl9Ci0KLQlwcml2YXRlIFByb3Zpc2lvbmluZ0FjdGlvbiBsb29rdXBBY3Rpb24oU3RyaW5nIGFjdGlvbklkKSB7Ci0KLQkJUHJvdmlzaW9uaW5nQWN0aW9uIGFjdGlvbiA9IHBoYXNlLmdldEFjdGlvbihhY3Rpb25JZCk7Ci0JCWlmIChhY3Rpb24gPT0gbnVsbCkKLQkJCWFjdGlvbiA9IHRvdWNocG9pbnQuZ2V0QWN0aW9uKGFjdGlvbklkKTsKLQotCQlpZiAoYWN0aW9uID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmFjdGlvbl9ub3RfZm91bmQsIGFjdGlvbklkKSk7Ci0KLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwNDEwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFjdGlvbl9ub3RfZm91bmQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb3dubG9hZF9hcnRpZmFjdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb3dubG9hZF9ub19yZXBvc2l0b3J5OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfcGFyc2luZ19wcm9maWxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfcGVyc2lzdGluZ19wcm9maWxlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmFpbGVkX2NyZWF0aW5nX21ldGFkYXRhX2NhY2hlOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGFyYW1ldGVyaXplZFByb3Zpc2lvbmluZ0FjdGlvbl9hY3Rpb25fb3JfcGFyYW1ldGVyc19udWxsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcHJvZmlsZV9kb2VzX25vdF9leGlzdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2ZpbGVfbm90X2N1cnJlbnQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9maWxlX25vdF9yZWdpc3RlcmVkOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZV9EdXBsaWNhdGVfUm9vdF9Qcm9maWxlX0lkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVfTnVsbF9Qcm9maWxlX0lkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVfUGFyZW50X05vdF9Gb3VuZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZ19kaXJfbm90X2F2YWlsYWJsZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNpbXBsZVByb2ZpbGVSZWdpc3RyeV9QYXJzZXJfRXJyb3JfUGFyc2luZ19SZWdpc3RyeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaW1wbGVQcm9maWxlUmVnaXN0cnlfUGFyc2VyX0hhc19JbmNvbXBhdGlibGVfVmVyc2lvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRocmVhZF9ub3Rfb3duZXI7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb3VjaHBvaW50TWFuYWdlcl9BdHRyaWJ1dGVfTm90X1NwZWNpZmllZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb3VjaHBvaW50TWFuYWdlcl9Db25mbGljdGluZ19Ub3VjaHBvaW50X1R5cGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvdWNocG9pbnRNYW5hZ2VyX0V4Y2VwdGlvbl9DcmVhdGluZ19Ub3VjaHBvaW50X0V4dGVuc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb3VjaHBvaW50TWFuYWdlcl9JbmNvcnJlY3RseV9OYW1lZF9FeHRlbnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG91Y2hwb2ludE1hbmFnZXJfTm9fRXh0ZW5zaW9uX1BvaW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvdWNocG9pbnRNYW5hZ2VyX051bGxfQ3JlYXRpbmdfVG91Y2hwb2ludF9FeHRlbnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG91Y2hwb2ludE1hbmFnZXJfTnVsbF9Ub3VjaHBvaW50X1R5cGVfQXJndW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG91Y2hwb2ludE1hbmFnZXJfUmVxdWlyZWRfVG91Y2hwb2ludF9Ob3RfRm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG91Y2hwb2ludE1hbmFnZXJfVG91Y2hwb2ludF9UeXBlX01pc21hdGNoOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc2hhcmVkX3Byb2ZpbGVfbm90X2ZvdW5kOwotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGVzCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL01ldGFkYXRhQ2FjaGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL01ldGFkYXRhQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1YjUyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9NZXRhZGF0YUNhY2hlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuSVByb3Zpc2lvbmluZ0V2ZW50QnVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5Qcm92aXNpb25pbmdMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24uQWdlbnRMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBNZXRhZGF0YUNhY2hlIHsKLQlzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgUkVQT1NJVE9SWV9OQU1FID0gIkFnZW50IE1ldGFkYXRhIENhY2hlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU2VydmljZVJlZmVyZW5jZSBidXNSZWZlcmVuY2U7Ci0JcHJpdmF0ZSBJUHJvdmlzaW9uaW5nRXZlbnRCdXMgYnVzOwotCXByaXZhdGUgVVJMIGxvY2F0aW9uOwotCS8vdHJhY2tzIHRoZSBJVXMgdGhhdCBoYXZlIGJlZW4gaW5zdGFsbGVkIGJ1dCBub3QgeWV0IGNvbW1pdHRlZAotCS8vVE9ETzogVGhpcyB3aWxsIHdvcmsgaWYgYSBzaW5nbGUgcHJvZmlsZSBpcyBiZWluZyBtb2RpZmllZCBidXQgd2Ugc2hvdWxkIGNvbnNpZGVyIGhvdyB0byBoYW5kbGUgbXVsdGlwbGUgY29uY3VycmVudCBwcm9maWxlIGNoYW5nZXMuT0QKLQlmaW5hbCBBcnJheUxpc3QgdG9BZGQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgTWV0YWRhdGFDYWNoZSgpIHsKLQkJQWdlbnRMb2NhdGlvbiBhZ2VudExvY2F0aW9uID0gKEFnZW50TG9jYXRpb24pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShFbmdpbmVBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBBZ2VudExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWxvY2F0aW9uID0gKGFnZW50TG9jYXRpb24gIT0gbnVsbCA/IGFnZW50TG9jYXRpb24uZ2V0TWV0YWRhdGFSZXBvc2l0b3J5VVJMKCkgOiBudWxsKTsKLQkJaG9va0xpc3RlbmVyKCk7Ci0JfQotCi0JSU1ldGFkYXRhUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgewotCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoRW5naW5lQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCBudWxsKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQotCQl9Ci0JCXRyeSB7Ci0JCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKDEpOwotCQkJcHJvcGVydGllcy5wdXQoSVJlcG9zaXRvcnkuUFJPUF9TWVNURU0sIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJCXJldHVybiBtYW5hZ2VyLmNyZWF0ZVJlcG9zaXRvcnkobG9jYXRpb24sIFJFUE9TSVRPUllfTkFNRSwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuVFlQRV9TSU1QTEVfUkVQT1NJVE9SWSwgcHJvcGVydGllcyk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dIZWxwZXIubG9nKGUpOwotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5mYWlsZWRfY3JlYXRpbmdfbWV0YWRhdGFfY2FjaGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhvb2tMaXN0ZW5lcigpIHsKLQkJLy8gVE9ETzogV2Ugc2hvdWxkIGNoZWNrIGZvciB3cml0aW5nIHBlcm1pc3Npb24gaGVyZSwgb3RoZXJ3aXNlIGl0IG1heSBiZSB0b28gbGF0ZQotCQlidXNSZWZlcmVuY2UgPSBFbmdpbmVBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2VSZWZlcmVuY2UoSVByb3Zpc2lvbmluZ0V2ZW50QnVzLlNFUlZJQ0VfTkFNRSk7Ci0JCWJ1cyA9IChJUHJvdmlzaW9uaW5nRXZlbnRCdXMpIEVuZ2luZUFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZShidXNSZWZlcmVuY2UpOwotCQlidXMuYWRkTGlzdGVuZXIobmV3IFByb3Zpc2lvbmluZ0xpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgbm90aWZ5KEV2ZW50T2JqZWN0IG8pIHsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIEluc3RhbGxhYmxlVW5pdEV2ZW50KSB7IC8vVE9ETyBUaGlzIGRlcGVuZGVuY3kgb24gSW5zdGFsbGFibGVVbml0RXZlbnQgaXMgbm90IGdyZWF0Ci0JCQkJCUluc3RhbGxhYmxlVW5pdEV2ZW50IGV2ZW50ID0gKEluc3RhbGxhYmxlVW5pdEV2ZW50KSBvOwotCQkJCQlpZiAoZXZlbnQuaXNQcmUoKSkKLQkJCQkJCXJldHVybjsKLQkJCQkJLy8gVE9ETzogd2hhdCBhYm91dCB1bmluc3RhbGw/PwotCQkJCQlpZiAoZXZlbnQuaXNQb3N0KCkgJiYgZXZlbnQuZ2V0UmVzdWx0KCkuaXNPSygpICYmIGV2ZW50LmlzSW5zdGFsbCgpKSB7Ci0JCQkJCQlJSW5zdGFsbGFibGVVbml0IGluc3RhbGxlZElVID0gZXZlbnQuZ2V0T3BlcmFuZCgpLnNlY29uZCgpOwotCQkJCQkJaWYgKGluc3RhbGxlZElVICE9IG51bGwpCi0JCQkJCQkJdG9BZGQuYWRkKGluc3RhbGxlZElVLnVucmVzb2x2ZWQoKSk7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBDb21taXRPcGVyYXRpb25FdmVudCkgewotCQkJCQlJSW5zdGFsbGFibGVVbml0W10gdG9BZGRBcnJheSA9IChJSW5zdGFsbGFibGVVbml0W10pIHRvQWRkLnRvQXJyYXkobmV3IElJbnN0YWxsYWJsZVVuaXRbdG9BZGQuc2l6ZSgpXSk7Ci0JCQkJCXRvQWRkLmNsZWFyKCk7Ci0JCQkJCWdldFJlcG9zaXRvcnkoKS5hZGRJbnN0YWxsYWJsZVVuaXRzKHRvQWRkQXJyYXkpOwotCQkJCX0KLQkJCQlpZiAobyBpbnN0YW5jZW9mIFJvbGxiYWNrT3BlcmF0aW9uRXZlbnQpCi0JCQkJCXRvQWRkLmNsZWFyKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvTnVsbFRvdWNocG9pbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL051bGxUb3VjaHBvaW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZGUxZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvTnVsbFRvdWNocG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuVG91Y2hwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLlRvdWNocG9pbnRUeXBlOwotCi0vKioKLSAqIEEgdG91Y2hwb2ludCB0aGF0IHBlcmZvcm1zIG5vIHByb2Nlc3NpbmcuCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsVG91Y2hwb2ludCBleHRlbmRzIFRvdWNocG9pbnQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgVG91Y2hwb2ludCBJTlNUQU5DRSA9IG5ldyBOdWxsVG91Y2hwb2ludCgpOwotCi0JLyoqCi0JICogUHVibGljIGNvbnN0cnVjdG9yIG9ubHkgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGJ5IGV4dGVuc2lvbiByZWdpc3RyeS4KLQkgKi8KLQlwdWJsaWMgTnVsbFRvdWNocG9pbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRvdWNocG9pbnRUeXBlIGdldFRvdWNocG9pbnRUeXBlKCkgewotCQlyZXR1cm4gVG91Y2hwb2ludFR5cGUuTk9ORTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcGhhc2VJZCkgewotCQlpZiAocGhhc2VJZC5lcXVhbHMoImluc3RhbGwiKSB8fCBwaGFzZUlkLmVxdWFscygidW5pbnN0YWxsIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgUHJvdmlzaW9uaW5nQWN0aW9uIGdldEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsKLQkJcmV0dXJuIG5ldyBQcm92aXNpb25pbmdBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9QYXJhbWV0ZXJpemVkUHJvdmlzaW9uaW5nQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9QYXJhbWV0ZXJpemVkUHJvdmlzaW9uaW5nQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMTZiMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvUGFyYW1ldGVyaXplZFByb3Zpc2lvbmluZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXJhbWV0ZXJpemVkUHJvdmlzaW9uaW5nQWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQotCXByaXZhdGUgUHJvdmlzaW9uaW5nQWN0aW9uIGFjdGlvbjsKLQlwcml2YXRlIE1hcCBhY3Rpb25QYXJhbWV0ZXJzOwotCi0JcHVibGljIFBhcmFtZXRlcml6ZWRQcm92aXNpb25pbmdBY3Rpb24oUHJvdmlzaW9uaW5nQWN0aW9uIGFjdGlvbiwgTWFwIGFjdGlvblBhcmFtZXRlcnMpIHsKLQkJaWYgKGFjdGlvbiA9PSBudWxsIHx8IGFjdGlvblBhcmFtZXRlcnMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMuUGFyYW1ldGVyaXplZFByb3Zpc2lvbmluZ0FjdGlvbl9hY3Rpb25fb3JfcGFyYW1ldGVyc19udWxsKTsKLQkJdGhpcy5hY3Rpb24gPSBhY3Rpb247Ci0JCXRoaXMuYWN0aW9uUGFyYW1ldGVycyA9IGFjdGlvblBhcmFtZXRlcnM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlwYXJhbWV0ZXJzID0gcHJvY2Vzc0FjdGlvblBhcmFtZXRlcnMocGFyYW1ldGVycyk7Ci0JCXJldHVybiBhY3Rpb24uZXhlY3V0ZShwYXJhbWV0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCXBhcmFtZXRlcnMgPSBwcm9jZXNzQWN0aW9uUGFyYW1ldGVycyhwYXJhbWV0ZXJzKTsKLQkJcmV0dXJuIGFjdGlvbi51bmRvKHBhcmFtZXRlcnMpOwotCX0KLQotCXByaXZhdGUgTWFwIHByb2Nlc3NBY3Rpb25QYXJhbWV0ZXJzKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCU1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcChwYXJhbWV0ZXJzKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGFjdGlvblBhcmFtZXRlcnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFbnRyeSBlbnRyeSA9IChFbnRyeSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCVN0cmluZyB2YWx1ZSA9IHByb2Nlc3NWYXJpYWJsZXMoKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKSwgcGFyYW1ldGVycyk7Ci0JCQlyZXN1bHQucHV0KG5hbWUsIHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHJlc3VsdCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc1ZhcmlhYmxlcyhTdHJpbmcgcGFyYW1ldGVyVmFsdWUsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0KLQkJaW50IHZhcmlhYmxlQmVnaW5JbmRleCA9IHBhcmFtZXRlclZhbHVlLmluZGV4T2YoIiR7Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHZhcmlhYmxlQmVnaW5JbmRleCA9PSAtMSkKLQkJCXJldHVybiBwYXJhbWV0ZXJWYWx1ZTsKLQotCQlpbnQgdmFyaWFibGVFbmRJbmRleCA9IHBhcmFtZXRlclZhbHVlLmluZGV4T2YoJ30nLCB2YXJpYWJsZUJlZ2luSW5kZXggKyAyKTsKLQkJaWYgKHZhcmlhYmxlRW5kSW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gcGFyYW1ldGVyVmFsdWU7Ci0KLQkJU3RyaW5nIHByZVZhcmlhYmxlID0gcGFyYW1ldGVyVmFsdWUuc3Vic3RyaW5nKDAsIHZhcmlhYmxlQmVnaW5JbmRleCk7Ci0JCVN0cmluZyB2YXJpYWJsZU5hbWUgPSBwYXJhbWV0ZXJWYWx1ZS5zdWJzdHJpbmcodmFyaWFibGVCZWdpbkluZGV4ICsgMiwgdmFyaWFibGVFbmRJbmRleCk7Ci0JCU9iamVjdCB2YWx1ZSA9IHBhcmFtZXRlcnMuZ2V0KHZhcmlhYmxlTmFtZSk7Ci0JCVN0cmluZyB2YXJpYWJsZVZhbHVlID0gdmFsdWUgPT0gbnVsbCA/ICIiIDogdmFsdWUudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcG9zdFZhcmlhYmxlID0gcHJvY2Vzc1ZhcmlhYmxlcyhwYXJhbWV0ZXJWYWx1ZS5zdWJzdHJpbmcodmFyaWFibGVFbmRJbmRleCArIDEpLCBwYXJhbWV0ZXJzKTsKLQkJcmV0dXJuIHByZVZhcmlhYmxlICsgdmFyaWFibGVWYWx1ZSArIHBvc3RWYXJpYWJsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9Qcm9maWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9Qcm9maWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0N2M2ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuT3JkZXJlZFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVN1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFByb2ZpbGUgaW1wbGVtZW50cyBJUXVlcnlhYmxlLCBJUHJvZmlsZSB7Ci0KLQkvL0ludGVybmFsIGlkIG9mIHRoZSBwcm9maWxlCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvZmlsZUlkOwotCi0JcHJpdmF0ZSBQcm9maWxlIHBhcmVudFByb2ZpbGU7Ci0KLQkvKioKLQkgKiAJQSBjb2xsZWN0aW9uIG9mIGNoaWxkIHByb2ZpbGVzLgotCSAqLwotCXByaXZhdGUgTGlzdCBzdWJQcm9maWxlSWRzOyAvLyBjaGlsZCBwcm9maWxlIGlkcwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbm9TdWJQcm9maWxlcyA9IG5ldyBTdHJpbmdbMF07Ci0JLyoqCi0JICogVGhpcyBzdG9yYWdlIGlzIHRvIGJlIHVzZWQgYnkgdGhlIHRvdWNocG9pbnRzIHRvIHN0b3JlIGRhdGEuCi0JICovCi0JcHJpdmF0ZSBPcmRlcmVkUHJvcGVydGllcyBzdG9yYWdlID0gbmV3IE9yZGVyZWRQcm9wZXJ0aWVzKCk7Ci0KLQlwcml2YXRlIFNldCBpdXMgPSBuZXcgSGFzaFNldCgpOwotCXByaXZhdGUgTWFwIGl1UHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQotCXByaXZhdGUgbG9uZyB0aW1lc3RhbXA7Ci0JcHJpdmF0ZSBJU3Vycm9nYXRlUHJvZmlsZUhhbmRsZXIgc3Vycm9nYXRlUHJvZmlsZUhhbmRsZXI7Ci0KLQlwdWJsaWMgUHJvZmlsZShTdHJpbmcgcHJvZmlsZUlkLCBQcm9maWxlIHBhcmVudCwgTWFwIHByb3BlcnRpZXMpIHsKLQkJaWYgKHByb2ZpbGVJZCA9PSBudWxsIHx8IHByb2ZpbGVJZC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlByb2ZpbGVfTnVsbF9Qcm9maWxlX0lkLCBudWxsKSk7Ci0JCX0KLQkJdGhpcy5wcm9maWxlSWQgPSBwcm9maWxlSWQ7Ci0JCXNldFBhcmVudChwYXJlbnQpOwotCQlpZiAocHJvcGVydGllcyAhPSBudWxsKQotCQkJc3RvcmFnZS5wdXRBbGwocHJvcGVydGllcyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGUjZ2V0UHJvZmlsZUlkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVJZCgpIHsKLQkJcmV0dXJuIHByb2ZpbGVJZDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZSNnZXRQYXJlbnRQcm9maWxlKCkKLQkgKi8KLQlwdWJsaWMgSVByb2ZpbGUgZ2V0UGFyZW50UHJvZmlsZSgpIHsKLQkJcmV0dXJuIHBhcmVudFByb2ZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50KFByb2ZpbGUgcHJvZmlsZSkgewotCQlpZiAocHJvZmlsZSA9PSBwYXJlbnRQcm9maWxlKQotCQkJcmV0dXJuOwotCi0JCWlmIChwYXJlbnRQcm9maWxlICE9IG51bGwpCi0JCQlwYXJlbnRQcm9maWxlLnJlbW92ZVN1YlByb2ZpbGUocHJvZmlsZUlkKTsKLQotCQlwYXJlbnRQcm9maWxlID0gcHJvZmlsZTsKLQkJaWYgKHBhcmVudFByb2ZpbGUgIT0gbnVsbCkKLQkJCXBhcmVudFByb2ZpbGUuYWRkU3ViUHJvZmlsZShwcm9maWxlSWQpOwotCX0KLQotCS8qCi0JICogCUEgcHJvZmlsZSBpcyBhIHJvb3QgcHJvZmlsZSBpZiBpdCBpcyBub3QgYSBzdWItcHJvZmlsZQotCSAqIAlvZiBhbm90aGVyIHByb2ZpbGUuCi0JICovCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGUjaXNSb290UHJvZmlsZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb290UHJvZmlsZSgpIHsKLQkJcmV0dXJuIHBhcmVudFByb2ZpbGUgPT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTdWJQcm9maWxlKFN0cmluZyBzdWJQcm9maWxlSWQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlpZiAoc3ViUHJvZmlsZUlkcyA9PSBudWxsKQotCQkJc3ViUHJvZmlsZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAoIXN1YlByb2ZpbGVJZHMuY29udGFpbnMoc3ViUHJvZmlsZUlkKSkKLQkJCXN1YlByb2ZpbGVJZHMuYWRkKHN1YlByb2ZpbGVJZCk7Ci0KLQkJLy8JCWlmICghc3ViUHJvZmlsZUlkcy5hZGQoc3ViUHJvZmlsZUlkKSkKLQkJLy8JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLlByb2ZpbGVfRHVwbGljYXRlX0NoaWxkX1Byb2ZpbGVfSWQsIG5ldyBTdHJpbmdbXSB7c3ViUHJvZmlsZUlkLCB0aGlzLmdldFByb2ZpbGVJZCgpfSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVN1YlByb2ZpbGUoU3RyaW5nIHN1YlByb2ZpbGVJZCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0JCWlmIChzdWJQcm9maWxlSWRzICE9IG51bGwpCi0JCQlzdWJQcm9maWxlSWRzLnJlbW92ZShzdWJQcm9maWxlSWQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlI2hhc1N1YlByb2ZpbGVzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTdWJQcm9maWxlcygpIHsKLQkJcmV0dXJuIHN1YlByb2ZpbGVJZHMgPT0gbnVsbCB8fCBzdWJQcm9maWxlSWRzLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZSNnZXRTdWJQcm9maWxlSWRzKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0U3ViUHJvZmlsZUlkcygpIHsKLQkJaWYgKHN1YlByb2ZpbGVJZHMgPT0gbnVsbCkKLQkJCXJldHVybiBub1N1YlByb2ZpbGVzOwotCi0JCXJldHVybiAoU3RyaW5nW10pIHN1YlByb2ZpbGVJZHMudG9BcnJheShuZXcgU3RyaW5nW3N1YlByb2ZpbGVJZHMuc2l6ZSgpXSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGUjZ2V0UHJvcGVydHkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJU3RyaW5nIHZhbHVlID0gc3RvcmFnZS5nZXRQcm9wZXJ0eShrZXkpOwotCQlpZiAodmFsdWUgPT0gbnVsbCAmJiBwYXJlbnRQcm9maWxlICE9IG51bGwpIHsKLQkJCXZhbHVlID0gcGFyZW50UHJvZmlsZS5nZXRQcm9wZXJ0eShrZXkpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZSNnZXRMb2NhbFByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIHN0b3JhZ2UuZ2V0UHJvcGVydHkoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiAJQXNzb2NpYXRlIHRoZSBnaXZlbiB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBrZXkKLQkgKiAJaW4gdGhlIGxvY2FsIHN0b3JhZ2Ugb2YgdGhpcyBwcm9maWxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlzdG9yYWdlLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCQljaGFuZ2VkID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCXN0b3JhZ2UucmVtb3ZlKGtleSk7Ci0JCWNoYW5nZWQgPSB0cnVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlI3F1ZXJ5KG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnksIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ29sbGVjdG9yIHF1ZXJ5KFF1ZXJ5IHF1ZXJ5LCBDb2xsZWN0b3IgY29sbGVjdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIHF1ZXJ5LnBlcmZvcm0oaXVzLml0ZXJhdG9yKCksIGNvbGxlY3Rvcik7Ci0JfQotCi0JcHVibGljIENvbGxlY3RvciBhdmFpbGFibGUoUXVlcnkgcXVlcnksIENvbGxlY3RvciBjb2xsZWN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoc3Vycm9nYXRlUHJvZmlsZUhhbmRsZXIgIT0gbnVsbCkKLQkJCXJldHVybiBzdXJyb2dhdGVQcm9maWxlSGFuZGxlci5xdWVyeVByb2ZpbGUodGhpcywgcXVlcnksIGNvbGxlY3RvciwgbW9uaXRvcik7Ci0JCXJldHVybiBxdWVyeS5wZXJmb3JtKGl1cy5pdGVyYXRvcigpLCBjb2xsZWN0b3IpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlI2dldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyBrZXkpIHsKLQkJT3JkZXJlZFByb3BlcnRpZXMgcHJvcGVydGllcyA9IChPcmRlcmVkUHJvcGVydGllcykgaXVQcm9wZXJ0aWVzLmdldChjcmVhdGVJVUtleShpdSkpOwotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJcmV0dXJuIHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHNldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlTdHJpbmcgaXVLZXkgPSBjcmVhdGVJVUtleShpdSk7Ci0JCU9yZGVyZWRQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSAoT3JkZXJlZFByb3BlcnRpZXMpIGl1UHJvcGVydGllcy5nZXQoaXVLZXkpOwotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKSB7Ci0JCQlwcm9wZXJ0aWVzID0gbmV3IE9yZGVyZWRQcm9wZXJ0aWVzKCk7Ci0JCQlpdVByb3BlcnRpZXMucHV0KGl1S2V5LCBwcm9wZXJ0aWVzKTsKLQkJfQotCi0JCWNoYW5nZWQgPSB0cnVlOwotCQlyZXR1cm4gKFN0cmluZykgcHJvcGVydGllcy5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlbW92ZUluc3RhbGxhYmxlVW5pdFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyBrZXkpIHsKLQkJU3RyaW5nIGl1S2V5ID0gY3JlYXRlSVVLZXkoaXUpOwotCQlPcmRlcmVkUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gKE9yZGVyZWRQcm9wZXJ0aWVzKSBpdVByb3BlcnRpZXMuZ2V0KGl1S2V5KTsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBvbGRWYWx1ZSA9IChTdHJpbmcpIHByb3BlcnRpZXMucmVtb3ZlKGtleSk7Ci0JCWlmIChwcm9wZXJ0aWVzLmlzRW1wdHkoKSkKLQkJCWl1UHJvcGVydGllcy5yZW1vdmUoaXVLZXkpOwotCi0JCWNoYW5nZWQgPSB0cnVlOwotCQlyZXR1cm4gb2xkVmFsdWU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZUlVS2V5KElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJcmV0dXJuIGl1LmdldElkKCkgKyAiXyIgKyBpdS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlI2dldExvY2FsUHJvcGVydGllcygpCi0JICovCi0JcHVibGljIE1hcCBnZXRMb2NhbFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBPcmRlcmVkUHJvcGVydGllcy51bm1vZGlmaWFibGVQcm9wZXJ0aWVzKHN0b3JhZ2UpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlI2dldFByb3BlcnRpZXMoKQotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcygpIHsKLQkJaWYgKHBhcmVudFByb2ZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBnZXRMb2NhbFByb3BlcnRpZXMoKTsKLQotCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKHBhcmVudFByb2ZpbGUuZ2V0UHJvcGVydGllcygpKTsKLQkJcHJvcGVydGllcy5wdXRBbGwoc3RvcmFnZSk7Ci0JCXJldHVybiBPcmRlcmVkUHJvcGVydGllcy51bm1vZGlmaWFibGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCX0KLQotCS8qKgotCSAqIAlBZGQgYWxsIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBtYXAgdG8gdGhlIGxvY2FsIHByb3BlcnRpZXMKLQkgKiAJb2YgdGhlIHByb2ZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydGllcyhNYXAgcHJvcGVydGllcykgewotCQlzdG9yYWdlLnB1dEFsbChwcm9wZXJ0aWVzKTsKLQkJY2hhbmdlZCA9IHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSW5zdGFsbGFibGVVbml0KElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJaWYgKGl1cy5jb250YWlucyhpdSkpCi0JCQlyZXR1cm47Ci0KLQkJaXVzLmFkZChpdSk7Ci0JCWNoYW5nZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUluc3RhbGxhYmxlVW5pdChJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCWl1cy5yZW1vdmUoaXUpOwotCQljaGFuZ2VkID0gdHJ1ZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZSNnZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdCkKLQkgKi8KLQlwdWJsaWMgTWFwIGdldEluc3RhbGxhYmxlVW5pdFByb3BlcnRpZXMoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlPcmRlcmVkUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gKE9yZGVyZWRQcm9wZXJ0aWVzKSBpdVByb3BlcnRpZXMuZ2V0KGNyZWF0ZUlVS2V5KGl1KSk7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCQlwcm9wZXJ0aWVzID0gbmV3IE9yZGVyZWRQcm9wZXJ0aWVzKCk7Ci0KLQkJcmV0dXJuIE9yZGVyZWRQcm9wZXJ0aWVzLnVubW9kaWZpYWJsZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJMb2NhbFByb3BlcnRpZXMoKSB7Ci0JCXN0b3JhZ2UuY2xlYXIoKTsKLQkJY2hhbmdlZCA9IHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDaGFuZ2VkKCkgewotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDaGFuZ2VkKGJvb2xlYW4gaXNDaGFuZ2VkKSB7Ci0JCWNoYW5nZWQgPSBpc0NoYW5nZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJJbnN0YWxsYWJsZVVuaXRzKCkgewotCQlpdXMuY2xlYXIoKTsKLQkJaXVQcm9wZXJ0aWVzLmNsZWFyKCk7Ci0JCWNoYW5nZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyBQcm9maWxlIHNuYXBzaG90KCkgewotCQlQcm9maWxlIHBhcmVudFNuYXBzaG90ID0gbnVsbDsKLQkJaWYgKHBhcmVudFByb2ZpbGUgIT0gbnVsbCkKLQkJCXBhcmVudFNuYXBzaG90ID0gcGFyZW50UHJvZmlsZS5zbmFwc2hvdCgpOwotCi0JCVByb2ZpbGUgc25hcHNob3QgPSBuZXcgUHJvZmlsZShwcm9maWxlSWQsIHBhcmVudFNuYXBzaG90LCBzdG9yYWdlKTsKLQkJaWYgKHN1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyICE9IG51bGwpCi0JCQlzbmFwc2hvdC5zZXRTdXJyb2dhdGVQcm9maWxlSGFuZGxlcihzdXJyb2dhdGVQcm9maWxlSGFuZGxlcik7Ci0JCXNuYXBzaG90LnNldFRpbWVzdGFtcCh0aW1lc3RhbXApOwotCi0JCWlmIChzdWJQcm9maWxlSWRzICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBzdWJQcm9maWxlSWRzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlTdHJpbmcgc3ViUHJvZmlsZUlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJCXNuYXBzaG90LmFkZFN1YlByb2ZpbGUoc3ViUHJvZmlsZUlkKTsKLQkJCX0KLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBpdXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdC5uZXh0KCk7Ci0JCQlzbmFwc2hvdC5hZGRJbnN0YWxsYWJsZVVuaXQoaXUpOwotCQkJTWFwIHByb3BlcnRpZXMgPSBnZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKGl1KTsKLQkJCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpCi0JCQkJc25hcHNob3QuYWRkSW5zdGFsbGFibGVVbml0UHJvcGVydGllcyhpdSwgcHJvcGVydGllcyk7Ci0JCX0KLQkJc25hcHNob3Quc2V0Q2hhbmdlZChmYWxzZSk7Ci0JCXJldHVybiBzbmFwc2hvdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKElJbnN0YWxsYWJsZVVuaXQgaXUsIE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9wZXJ0aWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRW50cnkgZW50cnkgPSAoRW50cnkpIGl0Lm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQlzZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShpdSwga2V5LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhckluc3RhbGxhYmxlVW5pdFByb3BlcnRpZXMoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlpdVByb3BlcnRpZXMucmVtb3ZlKGNyZWF0ZUlVS2V5KGl1KSk7Ci0JCWNoYW5nZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLQkJcmV0dXJuIHRpbWVzdGFtcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUaW1lc3RhbXAobG9uZyBtaWxsaXMpIHsKLQkJdGltZXN0YW1wID0gbWlsbGlzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyKElTdXJyb2dhdGVQcm9maWxlSGFuZGxlciBzdXJyb2dhdGVQcm9maWxlSGFuZGxlcikgewotCQl0aGlzLnN1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyID0gc3Vycm9nYXRlUHJvZmlsZUhhbmRsZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvUHJvZmlsZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvUHJvZmlsZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDUwN2ZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL1Byb2ZpbGVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5pby5NZXRhZGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotLyoqCi0gKglBbiBhYnN0cmFjdCBYTUwgcGFyc2VyIGNsYXNzIGZvciBwYXJzaW5nIHByb2ZpbGVzIGFzIHdyaXR0ZW4gYnkgdGhlIFByb2ZpbGVXcml0ZXIuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQcm9maWxlUGFyc2VyIGV4dGVuZHMgTWV0YWRhdGFQYXJzZXIgaW1wbGVtZW50cyBQcm9maWxlWE1MQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBQcm9maWxlUGFyc2VyKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIGJ1bmRsZUlkKSB7Ci0JCXN1cGVyKGNvbnRleHQsIGJ1bmRsZUlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUHJvZmlsZUhhbmRsZXIgZXh0ZW5kcyBSb290SGFuZGxlciB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSByZXF1aXJlZCA9IG5ldyBTdHJpbmdbXSB7SURfQVRUUklCVVRFfTsKLQotCQlwcml2YXRlIFN0cmluZyBwcm9maWxlSWQ7Ci0JCXByaXZhdGUgU3RyaW5nIHBhcmVudElkOwotCQlwcml2YXRlIFN0cmluZyB0aW1lc3RhbXA7Ci0JCXByaXZhdGUgUHJvcGVydGllc0hhbmRsZXIgcHJvcGVydGllc0hhbmRsZXI7Ci0JCXByaXZhdGUgSW5zdGFsbGFibGVVbml0c0hhbmRsZXIgdW5pdHNIYW5kbGVyOwotCQlwcml2YXRlIElVc1Byb3BlcnRpZXNIYW5kbGVyIGl1c1Byb3BlcnRpZXNIYW5kbGVyOwotCi0JCXB1YmxpYyBQcm9maWxlSGFuZGxlcigpIHsKLQkJCS8vIGRlZmF1bHQKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJvb3RBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJcHJvZmlsZUlkID0gcGFyc2VSZXF1aXJlZEF0dHJpYnV0ZXMoYXR0cmlidXRlcywgcmVxdWlyZWQpWzBdOwotCQkJcGFyZW50SWQgPSBwYXJzZU9wdGlvbmFsQXR0cmlidXRlKGF0dHJpYnV0ZXMsIFBBUkVOVF9JRF9BVFRSSUJVVEUpOwotCQkJdGltZXN0YW1wID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBUSU1FU1RBTVBfQVRUUklCVVRFKTsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCWlmIChQUk9QRVJUSUVTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJaWYgKHByb3BlcnRpZXNIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJcHJvcGVydGllc0hhbmRsZXIgPSBuZXcgUHJvcGVydGllc0hhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKElOU1RBTExBQkxFX1VOSVRTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJaWYgKHVuaXRzSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCXVuaXRzSGFuZGxlciA9IG5ldyBJbnN0YWxsYWJsZVVuaXRzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoSVVTX1BST1BFUlRJRVNfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQlpZiAoaXVzUHJvcGVydGllc0hhbmRsZXIgPT0gbnVsbCkgewotCQkJCQlpdXNQcm9wZXJ0aWVzSGFuZGxlciA9IG5ldyBJVXNQcm9wZXJ0aWVzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVJZCgpIHsKLQkJCXJldHVybiBwcm9maWxlSWQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFBhcmVudElkKCkgewotCQkJcmV0dXJuIHBhcmVudElkOwotCQl9Ci0KLQkJcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkgewotCQkJaWYgKHRpbWVzdGFtcCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIExvbmcucGFyc2VMb25nKHRpbWVzdGFtcCk7Ci0JCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gVE9ETzogbG9nCi0JCQkJfQotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKSB7Ci0JCQlpZiAocHJvcGVydGllc0hhbmRsZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBwcm9wZXJ0aWVzSGFuZGxlci5nZXRQcm9wZXJ0aWVzKCk7Ci0JCX0KLQotCQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdFtdIGdldEluc3RhbGxhYmxlVW5pdHMoKSB7Ci0JCQlpZiAodW5pdHNIYW5kbGVyID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gdW5pdHNIYW5kbGVyLmdldFVuaXRzKCk7Ci0JCX0KLQotCQlwdWJsaWMgTWFwIGdldElVUHJvcGVydGllcyhJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCQlpZiAoaXVzUHJvcGVydGllc0hhbmRsZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJTWFwIGl1c1Byb3BlcnRpZXNNYXAgPSBpdXNQcm9wZXJ0aWVzSGFuZGxlci5nZXRJVXNQcm9wZXJ0aWVzTWFwKCk7Ci0JCQlpZiAoaXVzUHJvcGVydGllc01hcCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlTdHJpbmcgaXVJZGVudGl0eSA9IGl1LmdldElkKCkgKyAiXyIgKyBpdS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIChNYXApIGl1c1Byb3BlcnRpZXNNYXAuZ2V0KGl1SWRlbnRpdHkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIElVUHJvcGVydGllc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gcmVxdWlyZWQgPSBuZXcgU3RyaW5nW10ge0lEX0FUVFJJQlVURSwgVkVSU0lPTl9BVFRSSUJVVEV9OwotCi0JCXByaXZhdGUgU3RyaW5nIGl1SWRlbnRpdHk7Ci0JCXByaXZhdGUgTWFwIGl1c1Byb3BlcnRpZXNNYXA7Ci0JCXByaXZhdGUgUHJvcGVydGllc0hhbmRsZXIgcHJvcGVydGllc0hhbmRsZXI7Ci0KLQkJcHVibGljIElVUHJvcGVydGllc0hhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTWFwIGl1c1Byb3BlcnRpZXNNYXApIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIElVX1BST1BFUlRJRVNfRUxFTUVOVCk7Ci0JCQl0aGlzLml1c1Byb3BlcnRpZXNNYXAgPSBpdXNQcm9wZXJ0aWVzTWFwOwotCi0JCQlTdHJpbmcgdmFsdWVzW10gPSBwYXJzZVJlcXVpcmVkQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCByZXF1aXJlZCk7Ci0JCQlTdHJpbmcgaWQgPSB2YWx1ZXNbMF07Ci0JCQlWZXJzaW9uIHZlcnNpb24gPSBjaGVja1ZlcnNpb24oSVVfUFJPUEVSVElFU19FTEVNRU5ULCBWRVJTSU9OX0FUVFJJQlVURSwgdmFsdWVzWzFdKTsKLQkJCWl1SWRlbnRpdHkgPSBpZCArICJfIiArIHZlcnNpb24udG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSB7Ci0JCQlpZiAoaXNWYWxpZFhNTCgpICYmIGl1SWRlbnRpdHkgIT0gbnVsbCAmJiBwcm9wZXJ0aWVzSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJaXVzUHJvcGVydGllc01hcC5wdXQoaXVJZGVudGl0eSwgcHJvcGVydGllc0hhbmRsZXIuZ2V0UHJvcGVydGllcygpKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUFJPUEVSVElFU19FTEVNRU5UKSkgewotCQkJCXByb3BlcnRpZXNIYW5kbGVyID0gbmV3IFByb3BlcnRpZXNIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBJVXNQcm9wZXJ0aWVzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJcHJpdmF0ZSBNYXAgaXVzUHJvcGVydGllc01hcDsKLQotCQlwdWJsaWMgSVVzUHJvcGVydGllc0hhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgSVVTX1BST1BFUlRJRVNfRUxFTUVOVCk7Ci0JCQlTdHJpbmcgc2l6ZSA9IHBhcnNlT3B0aW9uYWxBdHRyaWJ1dGUoYXR0cmlidXRlcywgQ09MTEVDVElPTl9TSVpFX0FUVFJJQlVURSk7Ci0JCQlpdXNQcm9wZXJ0aWVzTWFwID0gKHNpemUgIT0gbnVsbCA/IG5ldyBMaW5rZWRIYXNoTWFwKG5ldyBJbnRlZ2VyKHNpemUpLmludFZhbHVlKCkpIDogbmV3IExpbmtlZEhhc2hNYXAoNCkpOwotCQl9Ci0KLQkJcHVibGljIE1hcCBnZXRJVXNQcm9wZXJ0aWVzTWFwKCkgewotCQkJcmV0dXJuIGl1c1Byb3BlcnRpZXNNYXA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKElVX1BST1BFUlRJRVNfRUxFTUVOVCkpIHsKLQkJCQluZXcgSVVQcm9wZXJ0aWVzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCBpdXNQcm9wZXJ0aWVzTWFwKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9Qcm9maWxlV3JpdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9Qcm9maWxlV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NDRmYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvUHJvZmlsZVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuaW8uTWV0YWRhdGFXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBQcm9maWxlV3JpdGVyIGV4dGVuZHMgTWV0YWRhdGFXcml0ZXIgaW1wbGVtZW50cyBQcm9maWxlWE1MQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBQcm9maWxlV3JpdGVyKE91dHB1dFN0cmVhbSBvdXRwdXQsIFByb2Nlc3NpbmdJbnN0cnVjdGlvbltdIHByb2Nlc3NpbmdJbnN0cnVjdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyKG91dHB1dCwgcHJvY2Vzc2luZ0luc3RydWN0aW9ucyk7Ci0JfQotCi0JcHVibGljIHZvaWQgd3JpdGVQcm9maWxlKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJc3RhcnQoUFJPRklMRV9FTEVNRU5UKTsKLQkJYXR0cmlidXRlKElEX0FUVFJJQlVURSwgcHJvZmlsZS5nZXRQcm9maWxlSWQoKSk7Ci0JCWF0dHJpYnV0ZShUSU1FU1RBTVBfQVRUUklCVVRFLCBMb25nLnRvU3RyaW5nKHByb2ZpbGUuZ2V0VGltZXN0YW1wKCkpKTsKLQkJSVByb2ZpbGUgcGFyZW50UHJvZmlsZSA9IHByb2ZpbGUuZ2V0UGFyZW50UHJvZmlsZSgpOwotCQlpZiAocGFyZW50UHJvZmlsZSAhPSBudWxsKQotCQkJYXR0cmlidXRlKFBBUkVOVF9JRF9BVFRSSUJVVEUsIHBhcmVudFByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpOwotCQl3cml0ZVByb3BlcnRpZXMocHJvZmlsZS5nZXRMb2NhbFByb3BlcnRpZXMoKSk7Ci0JCUNvbGxlY3RvciBjb2xsZWN0b3IgPSBwcm9maWxlLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKTsKLQkJd3JpdGVJbnN0YWxsYWJsZVVuaXRzKGNvbGxlY3Rvci5pdGVyYXRvcigpLCBjb2xsZWN0b3Iuc2l6ZSgpKTsKLQkJd3JpdGVJbnN0YWxsYWJsZVVuaXRzUHJvcGVydGllcyhjb2xsZWN0b3IuaXRlcmF0b3IoKSwgY29sbGVjdG9yLnNpemUoKSwgcHJvZmlsZSk7Ci0JCWVuZChQUk9GSUxFX0VMRU1FTlQpOwotCQlmbHVzaCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUluc3RhbGxhYmxlVW5pdHNQcm9wZXJ0aWVzKEl0ZXJhdG9yIGl0LCBpbnQgc2l6ZSwgSVByb2ZpbGUgcHJvZmlsZSkgewotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuOwotCQlzdGFydChJVVNfUFJPUEVSVElFU19FTEVNRU5UKTsKLQkJYXR0cmlidXRlKENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUsIHNpemUpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0Lm5leHQoKTsKLQkJCU1hcCBwcm9wZXJ0aWVzID0gcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKGl1KTsKLQkJCWlmIChwcm9wZXJ0aWVzLmlzRW1wdHkoKSkKLQkJCQljb250aW51ZTsKLQotCQkJc3RhcnQoSVVfUFJPUEVSVElFU19FTEVNRU5UKTsKLQkJCWF0dHJpYnV0ZShJRF9BVFRSSUJVVEUsIGl1LmdldElkKCkpOwotCQkJYXR0cmlidXRlKFZFUlNJT05fQVRUUklCVVRFLCBpdS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0JCQl3cml0ZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCQllbmQoSVVfUFJPUEVSVElFU19FTEVNRU5UKTsKLQkJfQotCQllbmQoSVVTX1BST1BFUlRJRVNfRUxFTUVOVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvUHJvZmlsZVhNTENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvUHJvZmlsZVhNTENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjYxMDI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL1Byb2ZpbGVYTUxDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2UuWE1MQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICoJQ29uc3RhbnRzIGRlZmluaW5nIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIFhNTCBmb3IgYSBQcm9maWxlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvZmlsZVhNTENvbnN0YW50cyBleHRlbmRzIFhNTENvbnN0YW50cyB7Ci0KLQkvLyBBIGZvcm1hdCB2ZXJzaW9uIG51bWJlciBmb3IgcHJvZmlsZSBYTUwuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBWZXJzaW9uIENVUlJFTlRfVkVSU0lPTiA9IG5ldyBWZXJzaW9uKDAsIDAsIDIpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmVyc2lvbiBDT01QQVRJQkxFX1ZFUlNJT04gPSBuZXcgVmVyc2lvbigwLCAwLCAxKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZlcnNpb25SYW5nZSBYTUxfVE9MRVJBTkNFID0gbmV3IFZlcnNpb25SYW5nZShDT01QQVRJQkxFX1ZFUlNJT04sIHRydWUsIG5ldyBWZXJzaW9uKDIsIDAsIDApLCBmYWxzZSk7Ci0KLQkvLyBDb25zdGFudHMgZm9yIHByb2ZpbGUgZWxlbWVudHMKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfRUxFTUVOVCA9ICJwcm9maWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTVEFNUF9BVFRSSUJVVEUgPSAidGltZXN0YW1wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElVU19QUk9QRVJUSUVTX0VMRU1FTlQgPSAiaXVzUHJvcGVydGllcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVV9QUk9QRVJUSUVTX0VMRU1FTlQgPSAiaXVQcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfVEFSR0VUID0gInByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9TaW1wbGVQcm9maWxlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL1NpbXBsZVByb2ZpbGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzc2NDViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL1NpbXBsZVByb2ZpbGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLmxhbmcucmVmLlNvZnRSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLklQcm92aXNpb25pbmdFdmVudEJ1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24uQWdlbnRMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVQcm9maWxlUmVnaXN0cnkgaW1wbGVtZW50cyBJUHJvZmlsZVJlZ2lzdHJ5IHsKLQotCXN0YXRpYyBjbGFzcyBMb2NrIHsKLQotCQlwcml2YXRlIFRocmVhZCBsb2NrSG9sZGVyOwotCQlwcml2YXRlIGludCBsb2NrZWRDb3VudDsKLQotCQlwcm90ZWN0ZWQgdm9pZCBsb2NrKE9iamVjdCBtb25pdG9yKSB7Ci0JCQlUaHJlYWQgY3VycmVudCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0JCQlpZiAobG9ja0hvbGRlciAhPSBjdXJyZW50KSB7Ci0JCQkJYm9vbGVhbiBpbnRlcnJ1cHRlZCA9IGZhbHNlOwotCQkJCXRyeSB7Ci0JCQkJCXdoaWxlIChsb2NrZWRDb3VudCAhPSAwKQotCQkJCQkJdHJ5IHsKLQkJCQkJCQltb25pdG9yLndhaXQoKTsKLQkJCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBhbHRob3VnaCB3ZSBkb24ndCBoYW5kbGUgYW4gaW50ZXJydXB0IHdlIHNob3VsZCBzdGlsbCAKLQkJCQkJCQkvLyBzYXZlIGFuZCByZXN0b3JlIHRoZSBpbnRlcnJ1cHQgZm9yIG90aGVycyBmdXJ0aGVyIHVwIHRoZSBzdGFjawotCQkJCQkJCWludGVycnVwdGVkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoaW50ZXJydXB0ZWQpCi0JCQkJCQljdXJyZW50LmludGVycnVwdCgpOyAvLyByZXN0b3JlIGludGVycnVwdGVkIHN0YXR1cwotCQkJCX0KLQkJCX0KLQkJCWxvY2tlZENvdW50Kys7Ci0JCQlsb2NrSG9sZGVyID0gY3VycmVudDsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHVubG9jayhPYmplY3QgbW9uaXRvcikgewotCQkJVGhyZWFkIGN1cnJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCQkJaWYgKGxvY2tIb2xkZXIgIT0gY3VycmVudCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLnRocmVhZF9ub3Rfb3duZXIpOwotCi0JCQlsb2NrZWRDb3VudC0tOwotCQkJaWYgKGxvY2tlZENvdW50ID09IDApIHsKLQkJCQlsb2NrSG9sZGVyID0gbnVsbDsKLQkJCQltb25pdG9yLm5vdGlmeUFsbCgpOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGNoZWNrTG9ja2VkKCkgewotCQkJVGhyZWFkIGN1cnJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotCQkJaWYgKGxvY2tIb2xkZXIgIT0gY3VycmVudCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLnRocmVhZF9ub3Rfb3duZXIpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRklMRV9FWFQgPSAiLnByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TVE9SQUdFX0RJUiA9ICJwcm9maWxlUmVnaXN0cnkiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUmVmZXJlbmNlIHRvIE1hcCBvZiBTdHJpbmcoUHJvZmlsZSBpZCktPlByb2ZpbGUuIAotCSAqLwotCXByaXZhdGUgU29mdFJlZmVyZW5jZSBwcm9maWxlczsKLQlwcml2YXRlIE1hcCBwcm9maWxlTG9ja3MgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBTdHJpbmcgc2VsZjsKLQotCS8vV2hldGhlciB0aGUgcmVnaXN0cnkgaGFzIGJlZW4gbG9hZGVkIGF0IGFsbCBpbiB0aGlzIHNlc3Npb24KLQlwcml2YXRlIGJvb2xlYW4gaGFzQmVlblJlc3RvcmVkID0gZmFsc2U7Ci0KLQlwcml2YXRlIEZpbGUgc3RvcmU7Ci0KLQlJU3Vycm9nYXRlUHJvZmlsZUhhbmRsZXIgc3Vycm9nYXRlUHJvZmlsZUhhbmRsZXI7Ci0KLQlwdWJsaWMgU2ltcGxlUHJvZmlsZVJlZ2lzdHJ5KEZpbGUgcmVnaXN0cnlEaXJlY3RvcnksIElTdXJyb2dhdGVQcm9maWxlSGFuZGxlciBoYW5kbGVyKSB7Ci0JCXN0b3JlID0gKHJlZ2lzdHJ5RGlyZWN0b3J5ICE9IG51bGwpID8gcmVnaXN0cnlEaXJlY3RvcnkgOiBnZXREZWZhdWx0UmVnaXN0cnlEaXJlY3RvcnkoKTsKLQkJc3Vycm9nYXRlUHJvZmlsZUhhbmRsZXIgPSBoYW5kbGVyOwotCQlzZWxmID0gRW5naW5lQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eSgiZWNsaXBzZS5wMi5wcm9maWxlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU2ltcGxlUHJvZmlsZVJlZ2lzdHJ5KCkgewotCQlzdG9yZSA9IGdldERlZmF1bHRSZWdpc3RyeURpcmVjdG9yeSgpOwotCQlzdXJyb2dhdGVQcm9maWxlSGFuZGxlciA9IG5ldyBTdXJyb2dhdGVQcm9maWxlSGFuZGxlcigpOwotCQlzZWxmID0gRW5naW5lQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRQcm9wZXJ0eSgiZWNsaXBzZS5wMi5wcm9maWxlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlIGdldERlZmF1bHRSZWdpc3RyeURpcmVjdG9yeSgpIHsKLQkJRmlsZSByZWdpc3RyeURpcmVjdG9yeSA9IG51bGw7Ci0JCUFnZW50TG9jYXRpb24gYWdlbnQgPSAoQWdlbnRMb2NhdGlvbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEVuZ2luZUFjdGl2YXRvci5nZXRDb250ZXh0KCksIEFnZW50TG9jYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJdHJ5IHsKLQkJCVVSTCByZWdpc3RyeVVSTCA9IG5ldyBVUkwoYWdlbnQuZ2V0RGF0YUFyZWEoRW5naW5lQWN0aXZhdG9yLklEKSwgREVGQVVMVF9TVE9SQUdFX0RJUik7Ci0JCQlyZWdpc3RyeURpcmVjdG9yeSA9IG5ldyBGaWxlKHJlZ2lzdHJ5VVJMLmdldFBhdGgoKSk7Ci0JCQlyZWdpc3RyeURpcmVjdG9yeS5ta2RpcnMoKTsKLQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy90aGlzIGlzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIHdlIGtub3cgdGhlIGFib3ZlIFVSTCBpcyB2YWxpZAotCQl9Ci0JCXJldHVybiByZWdpc3RyeURpcmVjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGUgY3VycmVudCBwcm9maWxlIGZvciBzZWxmIGlzIG1hcmtlZCBhcyBhIHJvYW1pbmcgcHJvZmlsZSwgd2UgbmVlZAotCSAqIHRvIHVwZGF0ZSBpdHMgaW5zdGFsbCBhbmQgYnVuZGxlIHBvb2wgbG9jYXRpb25zLgotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVTZWxmUHJvZmlsZShNYXAgcHJvZmlsZU1hcCkgewotCQlpZiAocHJvZmlsZU1hcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlQcm9maWxlIHNlbGZQcm9maWxlID0gKFByb2ZpbGUpIHByb2ZpbGVNYXAuZ2V0KHNlbGYpOwotCQlpZiAoc2VsZlByb2ZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJLy9vbmx5IHVwZGF0ZSBpZiBzZWxmIGlzIGEgcm9hbWluZyBwcm9maWxlCi0JCWlmIChCb29sZWFuLnZhbHVlT2Yoc2VsZlByb2ZpbGUuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9ST0FNSU5HKSkuYm9vbGVhblZhbHVlKCkpCi0JCQljaGFuZ2VkID0gdXBkYXRlUm9hbWluZ1Byb2ZpbGUoc2VsZlByb2ZpbGUpOwotCi0JCWlmIChzdXJyb2dhdGVQcm9maWxlSGFuZGxlciAhPSBudWxsICYmIHN1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyLmlzU3Vycm9nYXRlKHNlbGZQcm9maWxlKSkKLQkJCWNoYW5nZWQgPSBjaGFuZ2VkIHx8IHN1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyLnVwZGF0ZVByb2ZpbGUoc2VsZlByb2ZpbGUpOwotCi0JCWlmIChjaGFuZ2VkKQotCQkJc2F2ZVByb2ZpbGUoc2VsZlByb2ZpbGUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB1cGRhdGVSb2FtaW5nUHJvZmlsZShQcm9maWxlIHNlbGZQcm9maWxlKSB7Ci0JCUxvY2F0aW9uIGluc3RhbGxMb2NhdGlvbiA9IChMb2NhdGlvbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEVuZ2luZUFjdGl2YXRvci5nZXRDb250ZXh0KCksIExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwgTG9jYXRpb24uSU5TVEFMTF9GSUxURVIpOwotCQlGaWxlIGxvY2F0aW9uID0gbmV3IEZpbGUoaW5zdGFsbExvY2F0aW9uLmdldFVSTCgpLmdldFBhdGgoKSk7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQlpZiAoIWxvY2F0aW9uLmVxdWFscyhuZXcgRmlsZShzZWxmUHJvZmlsZS5nZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0lOU1RBTExfRk9MREVSKSkpKSB7Ci0JCQlzZWxmUHJvZmlsZS5zZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0lOU1RBTExfRk9MREVSLCBsb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlpZiAoIWxvY2F0aW9uLmVxdWFscyhuZXcgRmlsZShzZWxmUHJvZmlsZS5nZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0NBQ0hFKSkpKSB7Ci0JCQlzZWxmUHJvZmlsZS5zZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0NBQ0hFLCBsb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQljaGFuZ2VkID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFByb2ZpbGVNYXAoKS50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVByb2ZpbGUgZ2V0UHJvZmlsZShTdHJpbmcgaWQpIHsKLQkJUHJvZmlsZSBwcm9maWxlID0gaW50ZXJuYWxHZXRQcm9maWxlKGlkKTsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcHJvZmlsZS5zbmFwc2hvdCgpOwotCX0KLQotCXByaXZhdGUgUHJvZmlsZSBpbnRlcm5hbEdldFByb2ZpbGUoU3RyaW5nIGlkKSB7Ci0JCWlmIChTRUxGLmVxdWFscyhpZCkpCi0JCQlpZCA9IHNlbGY7Ci0JCVByb2ZpbGUgcHJvZmlsZSA9IChQcm9maWxlKSBnZXRQcm9maWxlTWFwKCkuZ2V0KGlkKTsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCAmJiBzZWxmICE9IG51bGwgJiYgc2VsZi5lcXVhbHMoaWQpKQotCQkJcHJvZmlsZSA9IGNyZWF0ZVN1cnJvZ2F0ZVByb2ZpbGUoaWQpOwotCi0JCXJldHVybiBwcm9maWxlOwotCX0KLQotCXByaXZhdGUgUHJvZmlsZSBjcmVhdGVTdXJyb2dhdGVQcm9maWxlKFN0cmluZyBpZCkgewotCQlpZiAoc3Vycm9nYXRlUHJvZmlsZUhhbmRsZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVByb2ZpbGUgcHJvZmlsZSA9IHN1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyLmNyZWF0ZVByb2ZpbGUoaWQpOwotCQlpZiAocHJvZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJc2F2ZVByb2ZpbGUocHJvZmlsZSk7Ci0KLQkJLy8gcmVzZXQgcHJvZmlsZSBjYWNoZQotCQlwcm9maWxlcyA9IG51bGw7Ci0JCWhhc0JlZW5SZXN0b3JlZCA9IGZhbHNlOwotCQlyZXR1cm4gKFByb2ZpbGUpIGdldFByb2ZpbGVNYXAoKS5nZXQoaWQpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVByb2ZpbGVbXSBnZXRQcm9maWxlcygpIHsKLQkJTWFwIHByb2ZpbGVNYXAgPSBnZXRQcm9maWxlTWFwKCk7Ci0JCVByb2ZpbGVbXSByZXN1bHQgPSBuZXcgUHJvZmlsZVtwcm9maWxlTWFwLnNpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHByb2ZpbGVNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyBpKyspIHsKLQkJCVByb2ZpbGUgcHJvZmlsZSA9IChQcm9maWxlKSBpdC5uZXh0KCk7Ci0JCQlyZXN1bHRbaV0gPSBwcm9maWxlLnNuYXBzaG90KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGluaXRpYWxpemVkIG1hcCBvZiBTdHJpbmcoUHJvZmlsZSBpZCktPlByb2ZpbGUuIAotCSAqLwotCXByb3RlY3RlZCBNYXAgZ2V0UHJvZmlsZU1hcCgpIHsKLQkJaWYgKHByb2ZpbGVzICE9IG51bGwpIHsKLQkJCU1hcCByZXN1bHQgPSAoTWFwKSBwcm9maWxlcy5nZXQoKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCU1hcCByZXN1bHQgPSByZXN0b3JlKCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwKDgpOwotCQlwcm9maWxlcyA9IG5ldyBTb2Z0UmVmZXJlbmNlKHJlc3VsdCk7Ci0JCWlmICghaGFzQmVlblJlc3RvcmVkKSB7Ci0JCQkvL3VwZGF0ZSByb2FtaW5nIHByb2ZpbGUgb24gZmlyc3QgbG9hZAotCQkJaGFzQmVlblJlc3RvcmVkID0gdHJ1ZTsKLQkJCXVwZGF0ZVNlbGZQcm9maWxlKHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdXBkYXRlUHJvZmlsZShQcm9maWxlIHByb2ZpbGUpIHsKLQkJU3RyaW5nIGlkID0gcHJvZmlsZS5nZXRQcm9maWxlSWQoKTsKLQkJUHJvZmlsZSBjdXJyZW50ID0gaW50ZXJuYWxHZXRQcm9maWxlKGlkKTsKLQkJaWYgKGN1cnJlbnQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMucHJvZmlsZV9kb2VzX25vdF9leGlzdCwgaWQpKTsKLQotCQlMb2NrIGxvY2sgPSAoTG9jaykgcHJvZmlsZUxvY2tzLmdldChpZCk7Ci0JCWxvY2suY2hlY2tMb2NrZWQoKTsKLQotCQljdXJyZW50LmNsZWFyTG9jYWxQcm9wZXJ0aWVzKCk7Ci0JCWN1cnJlbnQuY2xlYXJJbnN0YWxsYWJsZVVuaXRzKCk7Ci0KLQkJY3VycmVudC5hZGRQcm9wZXJ0aWVzKHByb2ZpbGUuZ2V0TG9jYWxQcm9wZXJ0aWVzKCkpOwotCQlDb2xsZWN0b3IgY29sbGVjdG9yID0gcHJvZmlsZS5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCk7Ci0JCWZvciAoSXRlcmF0b3IgY29sbGVjdG9ySXQgPSBjb2xsZWN0b3IuaXRlcmF0b3IoKTsgY29sbGVjdG9ySXQuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBjb2xsZWN0b3JJdC5uZXh0KCk7Ci0JCQljdXJyZW50LmFkZEluc3RhbGxhYmxlVW5pdChpdSk7Ci0JCQlNYXAgaXVQcm9wZXJ0aWVzID0gcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKGl1KTsKLQkJCWlmIChpdVByb3BlcnRpZXMgIT0gbnVsbCkKLQkJCQljdXJyZW50LmFkZEluc3RhbGxhYmxlVW5pdFByb3BlcnRpZXMoaXUsIGl1UHJvcGVydGllcyk7Ci0JCX0KLQkJc2F2ZVByb2ZpbGUoY3VycmVudCk7Ci0JCXByb2ZpbGUuc2V0VGltZXN0YW1wKGN1cnJlbnQuZ2V0VGltZXN0YW1wKCkpOwotCQlicm9hZGNhc3RDaGFuZ2VFdmVudChpZCwgUHJvZmlsZUV2ZW50LkNIQU5HRUQpOwotCX0KLQotCXB1YmxpYyBJUHJvZmlsZSBhZGRQcm9maWxlKFN0cmluZyBpZCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhZGRQcm9maWxlKGlkLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2ZpbGUgYWRkUHJvZmlsZShTdHJpbmcgaWQsIE1hcCBwcm9maWxlUHJvcGVydGllcykgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhZGRQcm9maWxlKGlkLCBwcm9maWxlUHJvcGVydGllcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJUHJvZmlsZSBhZGRQcm9maWxlKFN0cmluZyBpZCwgTWFwIHByb2ZpbGVQcm9wZXJ0aWVzLCBTdHJpbmcgcGFyZW50SWQpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlpZiAoU0VMRi5lcXVhbHMoaWQpKQotCQkJaWQgPSBzZWxmOwotCQlNYXAgcHJvZmlsZU1hcCA9IGdldFByb2ZpbGVNYXAoKTsKLQkJaWYgKHByb2ZpbGVNYXAuZ2V0KGlkKSAhPSBudWxsKQotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5Qcm9maWxlX0R1cGxpY2F0ZV9Sb290X1Byb2ZpbGVfSWQsIGlkKSk7Ci0KLQkJUHJvZmlsZSBwYXJlbnQgPSBudWxsOwotCQlpZiAocGFyZW50SWQgIT0gbnVsbCkgewotCQkJaWYgKFNFTEYuZXF1YWxzKHBhcmVudElkKSkKLQkJCQlwYXJlbnRJZCA9IHNlbGY7Ci0JCQlwYXJlbnQgPSAoUHJvZmlsZSkgcHJvZmlsZU1hcC5nZXQocGFyZW50SWQpOwotCQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuUHJvZmlsZV9QYXJlbnRfTm90X0ZvdW5kLCBwYXJlbnRJZCkpOwotCQl9Ci0KLQkJUHJvZmlsZSBwcm9maWxlID0gbmV3IFByb2ZpbGUoaWQsIHBhcmVudCwgcHJvZmlsZVByb3BlcnRpZXMpOwotCQlpZiAoc3Vycm9nYXRlUHJvZmlsZUhhbmRsZXIgIT0gbnVsbCAmJiBzdXJyb2dhdGVQcm9maWxlSGFuZGxlci5pc1N1cnJvZ2F0ZShwcm9maWxlKSkKLQkJCXByb2ZpbGUuc2V0U3Vycm9nYXRlUHJvZmlsZUhhbmRsZXIoc3Vycm9nYXRlUHJvZmlsZUhhbmRsZXIpOwotCQlwcm9maWxlTWFwLnB1dChpZCwgcHJvZmlsZSk7Ci0JCXNhdmVQcm9maWxlKHByb2ZpbGUpOwotCQlicm9hZGNhc3RDaGFuZ2VFdmVudChpZCwgUHJvZmlsZUV2ZW50LkFEREVEKTsKLQkJcmV0dXJuIHByb2ZpbGUuc25hcHNob3QoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlUHJvZmlsZShTdHJpbmcgcHJvZmlsZUlkKSB7Ci0JCWlmIChTRUxGLmVxdWFscyhwcm9maWxlSWQpKQotCQkJcHJvZmlsZUlkID0gc2VsZjsKLQkJLy9ub3RlIHdlIG5lZWQgdG8gbWFpbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIHByb2ZpbGUgbWFwIHVudGlsIGl0IGlzIHBlcnNpc3RlZCB0byBwcmV2ZW50IGdjCi0JCU1hcCBwcm9maWxlTWFwID0gZ2V0UHJvZmlsZU1hcCgpOwotCQlQcm9maWxlIHByb2ZpbGUgPSAoUHJvZmlsZSkgcHJvZmlsZU1hcC5nZXQocHJvZmlsZUlkKTsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmdbXSBzdWJQcm9maWxlSWRzID0gcHJvZmlsZS5nZXRTdWJQcm9maWxlSWRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3ViUHJvZmlsZUlkcy5sZW5ndGg7IGkrKykgewotCQkJcmVtb3ZlUHJvZmlsZShzdWJQcm9maWxlSWRzW2ldKTsKLQkJfQotCQlpbnRlcm5hbExvY2tQcm9maWxlKHByb2ZpbGUpOwotCQl0cnkgewotCQkJcHJvZmlsZS5zZXRQYXJlbnQobnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpbnRlcm5hbFVubG9ja1Byb2ZpbGUocHJvZmlsZSk7Ci0JCX0KLQkJcHJvZmlsZU1hcC5yZW1vdmUocHJvZmlsZUlkKTsKLQkJcHJvZmlsZUxvY2tzLnJlbW92ZShwcm9maWxlSWQpOwotCQlkZWxldGVQcm9maWxlKHByb2ZpbGVJZCk7Ci0JCWJyb2FkY2FzdENoYW5nZUV2ZW50KHByb2ZpbGVJZCwgUHJvZmlsZUV2ZW50LlJFTU9WRUQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBicm9hZGNhc3RDaGFuZ2VFdmVudChTdHJpbmcgcHJvZmlsZUlkLCBieXRlIHJlYXNvbikgewotCQkoKElQcm92aXNpb25pbmdFdmVudEJ1cykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEVuZ2luZUFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm92aXNpb25pbmdFdmVudEJ1cy5jbGFzcy5nZXROYW1lKCkpKS5wdWJsaXNoRXZlbnQobmV3IFByb2ZpbGVFdmVudChwcm9maWxlSWQsIHJlYXNvbikpOwotCX0KLQotCS8qKgotCSAqIFJlc3RvcmVzIHRoZSBwcm9maWxlIHJlZ2lzdHJ5IGZyb20gZGlzaywgYW5kIHJldHVybnMgdGhlIGxvYWRlZCBwcm9maWxlIG1hcC4KLQkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHVuYWJsZSB0byByZWFkIHRoZSByZWdpc3RyeS4KLQkgKi8KLQlwcml2YXRlIE1hcCByZXN0b3JlKCkgewotCi0JCWlmIChzdG9yZSA9PSBudWxsIHx8ICFzdG9yZS5pc0RpcmVjdG9yeSgpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5yZWdfZGlyX25vdF9hdmFpbGFibGUpOwotCi0JCVBhcnNlciBwYXJzZXIgPSBuZXcgUGFyc2VyKEVuZ2luZUFjdGl2YXRvci5nZXRDb250ZXh0KCksIEVuZ2luZUFjdGl2YXRvci5JRCk7Ci0JCUZpbGVbXSBwcm9maWxlRGlyZWN0b3JpZXMgPSBzdG9yZS5saXN0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9maWxlRGlyZWN0b3JpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgcHJvZmlsZUZpbGUgPSBmaW5kTGF0ZXN0UHJvZmlsZUZpbGUocHJvZmlsZURpcmVjdG9yaWVzW2ldKTsKLQkJCXRyeSB7Ci0JCQkJcGFyc2VyLnBhcnNlKHByb2ZpbGVGaWxlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRW5naW5lQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5lcnJvcl9wYXJzaW5nX3Byb2ZpbGUsIHByb2ZpbGVGaWxlKSwgZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBwYXJzZXIuZ2V0UHJvZmlsZU1hcCgpOwotCX0KLQotCXByaXZhdGUgRmlsZSBmaW5kTGF0ZXN0UHJvZmlsZUZpbGUoRmlsZSBwcm9maWxlRGlyZWN0b3J5KSB7Ci0KLQkJRmlsZSBsYXRlc3QgPSBudWxsOwotCQlsb25nIGxhdGVzdFRpbWVzdGFtcCA9IDA7Ci0JCUZpbGVbXSBwcm9maWxlRmlsZXMgPSBwcm9maWxlRGlyZWN0b3J5Lmxpc3RGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2ZpbGVGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBwcm9maWxlRmlsZSA9IHByb2ZpbGVGaWxlc1tpXTsKLQkJCVN0cmluZyBmaWxlTmFtZSA9IHByb2ZpbGVGaWxlLmdldE5hbWUoKTsKLQkJCXRyeSB7Ci0JCQkJbG9uZyB0aW1lc3RhbXAgPSBMb25nLnBhcnNlTG9uZyhmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUuaW5kZXhPZihQUk9GSUxFX0VYVCkpKTsKLQkJCQlpZiAodGltZXN0YW1wID4gbGF0ZXN0VGltZXN0YW1wKSB7Ci0JCQkJCWxhdGVzdFRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKLQkJCQkJbGF0ZXN0ID0gcHJvZmlsZUZpbGU7Ci0JCQkJfQotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGF0ZXN0OwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlUHJvZmlsZShQcm9maWxlIHByb2ZpbGUpIHsKLQotCQlGaWxlIHByb2ZpbGVEaXJlY3RvcnkgPSBuZXcgRmlsZShzdG9yZSwgZXNjYXBlKHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpICsgUFJPRklMRV9FWFQpOwotCQlwcm9maWxlRGlyZWN0b3J5Lm1rZGlyKCk7Ci0KLQkJbG9uZyBwcmV2aW91c1RpbWVzdGFtcCA9IHByb2ZpbGUuZ2V0VGltZXN0YW1wKCk7Ci0JCWxvbmcgY3VycmVudFRpbWVzdGFtcCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlGaWxlIHByb2ZpbGVGaWxlID0gbmV3IEZpbGUocHJvZmlsZURpcmVjdG9yeSwgTG9uZy50b1N0cmluZyhjdXJyZW50VGltZXN0YW1wKSArIFBST0ZJTEVfRVhUKTsKLQotCQlwcm9maWxlLnNldFRpbWVzdGFtcChjdXJyZW50VGltZXN0YW1wKTsKLQkJcHJvZmlsZS5zZXRDaGFuZ2VkKGZhbHNlKTsKLQkJT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHByb2ZpbGVGaWxlKSk7Ci0JCQlXcml0ZXIgd3JpdGVyID0gbmV3IFdyaXRlcihvcyk7Ci0JCQl3cml0ZXIud3JpdGVQcm9maWxlKHByb2ZpbGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlwcm9maWxlLnNldFRpbWVzdGFtcChwcmV2aW91c1RpbWVzdGFtcCk7Ci0JCQlwcm9maWxlRmlsZS5kZWxldGUoKTsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFbmdpbmVBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yX3BlcnNpc3RpbmdfcHJvZmlsZSwgcHJvZmlsZS5nZXRQcm9maWxlSWQoKSksIGUpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKG9zICE9IG51bGwpCi0JCQkJCW9zLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZGVsZXRlUHJvZmlsZShTdHJpbmcgcHJvZmlsZUlkKSB7Ci0JCUZpbGUgcHJvZmlsZURpcmVjdG9yeSA9IG5ldyBGaWxlKHN0b3JlLCBlc2NhcGUocHJvZmlsZUlkKSArIFBST0ZJTEVfRVhUKTsKLQkJRmlsZVV0aWxzLmRlbGV0ZUFsbChwcm9maWxlRGlyZWN0b3J5KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyB0b0VzY2FwZSkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbGVuZ3RoID0gdG9Fc2NhcGUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKLQkJCWNoYXIgY2ggPSB0b0VzY2FwZS5jaGFyQXQoaSk7Ci0JCQlzd2l0Y2ggKGNoKSB7Ci0JCQkJY2FzZSAnXFwnIDoKLQkJCQljYXNlICcvJyA6Ci0JCQkJY2FzZSAnOicgOgotCQkJCWNhc2UgJyonIDoKLQkJCQljYXNlICc/JyA6Ci0JCQkJY2FzZSAnIicgOgotCQkJCWNhc2UgJzwnIDoKLQkJCQljYXNlICc+JyA6Ci0JCQkJY2FzZSAnfCcgOgotCQkJCWNhc2UgJyUnIDoKLQkJCQkJYnVmZmVyLmFwcGVuZCgiJSIgKyAoaW50KSBjaCArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnVmZmVyLmFwcGVuZChjaCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXN0YXRpYyBjbGFzcyBXcml0ZXIgZXh0ZW5kcyBQcm9maWxlV3JpdGVyIHsKLQotCQlwdWJsaWMgV3JpdGVyKE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlzdXBlcihvdXRwdXQsIG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25bXSB7UHJvY2Vzc2luZ0luc3RydWN0aW9uLm1ha2VDbGFzc1ZlcnNpb25JbnN0cnVjdGlvbihQUk9GSUxFX1RBUkdFVCwgUHJvZmlsZS5jbGFzcywgUHJvZmlsZVhNTENvbnN0YW50cy5DVVJSRU5UX1ZFUlNJT04pfSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIAlQYXJzZXIgZm9yIHRoZSBjb250ZW50cyBvZiBhIFNpbXBsZVByb2ZpbGVSZWdpc3RyeSwKLQkgKiAJYXMgd3JpdHRlbiBieSB0aGUgV3JpdGVyIGNsYXNzLgotCSAqLwotCWNsYXNzIFBhcnNlciBleHRlbmRzIFByb2ZpbGVQYXJzZXIgewotCQlwcml2YXRlIGZpbmFsIE1hcCBwcm9maWxlSGFuZGxlcnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXB1YmxpYyBQYXJzZXIoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgYnVuZGxlSWQpIHsKLQkJCXN1cGVyKGNvbnRleHQsIGJ1bmRsZUlkKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnNlKEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXBhcnNlKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpKTsKLQkJfQotCi0JCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl0aGlzLnN0YXR1cyA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIFRPRE86IGN1cnJlbnRseSBub3QgY2FjaGluZyB0aGUgcGFyc2VyIHNpbmNlIHdlIG1ha2Ugbm8gYXNzdW1wdGlvbnMKLQkJCQkvLwkJIG9yIHJlc3RyaWN0aW9ucyBvbiBjb25jdXJyZW50IHBhcnNpbmcKLQkJCQlnZXRQYXJzZXIoKTsKLQkJCQlQcm9maWxlSGFuZGxlciBwcm9maWxlSGFuZGxlciA9IG5ldyBQcm9maWxlSGFuZGxlcigpOwotCQkJCXhtbFJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgUHJvZmlsZURvY0hhbmRsZXIoUFJPRklMRV9FTEVNRU5ULCBwcm9maWxlSGFuZGxlcikpOwotCQkJCXhtbFJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2Uoc3RyZWFtKSk7Ci0JCQkJcHJvZmlsZUhhbmRsZXJzLnB1dChwcm9maWxlSGFuZGxlci5nZXRQcm9maWxlSWQoKSwgcHJvZmlsZUhhbmRsZXIpOwotCQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCi0JCXB1YmxpYyBNYXAgZ2V0UHJvZmlsZU1hcCgpIHsKLQkJCU1hcCBwcm9maWxlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9maWxlSGFuZGxlcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBwcm9maWxlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQkJYWRkUHJvZmlsZShwcm9maWxlSWQsIHByb2ZpbGVNYXApOwotCQkJfQotCQkJcmV0dXJuIHByb2ZpbGVNYXA7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgYWRkUHJvZmlsZShTdHJpbmcgcHJvZmlsZUlkLCBNYXAgcHJvZmlsZU1hcCkgewotCQkJaWYgKHByb2ZpbGVNYXAuY29udGFpbnNLZXkocHJvZmlsZUlkKSkKLQkJCQlyZXR1cm47Ci0KLQkJCVByb2ZpbGVIYW5kbGVyIHByb2ZpbGVIYW5kbGVyID0gKFByb2ZpbGVIYW5kbGVyKSBwcm9maWxlSGFuZGxlcnMuZ2V0KHByb2ZpbGVJZCk7Ci0JCQlQcm9maWxlIHBhcmVudFByb2ZpbGUgPSBudWxsOwotCi0JCQlTdHJpbmcgcGFyZW50SWQgPSBwcm9maWxlSGFuZGxlci5nZXRQYXJlbnRJZCgpOwotCQkJaWYgKHBhcmVudElkICE9IG51bGwpIHsKLQkJCQlhZGRQcm9maWxlKHBhcmVudElkLCBwcm9maWxlTWFwKTsKLQkJCQlwYXJlbnRQcm9maWxlID0gKFByb2ZpbGUpIHByb2ZpbGVNYXAuZ2V0KHBhcmVudElkKTsKLQkJCX0KLQotCQkJUHJvZmlsZSBwcm9maWxlID0gbmV3IFByb2ZpbGUocHJvZmlsZUlkLCBwYXJlbnRQcm9maWxlLCBwcm9maWxlSGFuZGxlci5nZXRQcm9wZXJ0aWVzKCkpOwotCQkJaWYgKHN1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyICE9IG51bGwgJiYgc3Vycm9nYXRlUHJvZmlsZUhhbmRsZXIuaXNTdXJyb2dhdGUocHJvZmlsZSkpCi0JCQkJcHJvZmlsZS5zZXRTdXJyb2dhdGVQcm9maWxlSGFuZGxlcihzdXJyb2dhdGVQcm9maWxlSGFuZGxlcik7Ci0KLQkJCXByb2ZpbGUuc2V0VGltZXN0YW1wKHByb2ZpbGVIYW5kbGVyLmdldFRpbWVzdGFtcCgpKTsKLQotCQkJSUluc3RhbGxhYmxlVW5pdFtdIGl1cyA9IHByb2ZpbGVIYW5kbGVyLmdldEluc3RhbGxhYmxlVW5pdHMoKTsKLQkJCWlmIChpdXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSBpdXNbaV07Ci0JCQkJCXByb2ZpbGUuYWRkSW5zdGFsbGFibGVVbml0KGl1KTsKLQkJCQkJTWFwIGl1UHJvcGVydGllcyA9IHByb2ZpbGVIYW5kbGVyLmdldElVUHJvcGVydGllcyhpdSk7Ci0JCQkJCWlmIChpdVByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJCQkJZm9yIChJdGVyYXRvciBpdCA9IGl1UHJvcGVydGllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJCQlFbnRyeSBlbnRyeSA9IChFbnRyeSkgaXQubmV4dCgpOwotCQkJCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBlbnRyeS5nZXRWYWx1ZSgpOwotCQkJCQkJCXByb2ZpbGUuc2V0SW5zdGFsbGFibGVVbml0UHJvcGVydHkoaXUsIGtleSwgdmFsdWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcHJvZmlsZS5zZXRDaGFuZ2VkKGZhbHNlKTsKLQkJCXByb2ZpbGVNYXAucHV0KHByb2ZpbGVJZCwgcHJvZmlsZSk7Ci0JCX0KLQotCQlwcml2YXRlIGZpbmFsIGNsYXNzIFByb2ZpbGVEb2NIYW5kbGVyIGV4dGVuZHMgRG9jSGFuZGxlciB7Ci0KLQkJCXB1YmxpYyBQcm9maWxlRG9jSGFuZGxlcihTdHJpbmcgcm9vdE5hbWUsIFJvb3RIYW5kbGVyIHJvb3RIYW5kbGVyKSB7Ci0JCQkJc3VwZXIocm9vdE5hbWUsIHJvb3RIYW5kbGVyKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQlpZiAoUHJvZmlsZVhNTENvbnN0YW50cy5QUk9GSUxFX1RBUkdFVC5lcXVhbHModGFyZ2V0KSkgewotCQkJCQlWZXJzaW9uIHJlcG9zaXRvcnlWZXJzaW9uID0gZXh0cmFjdFBJVmVyc2lvbih0YXJnZXQsIGRhdGEpOwotCQkJCQlpZiAoIVByb2ZpbGVYTUxDb25zdGFudHMuWE1MX1RPTEVSQU5DRS5pc0luY2x1ZGVkKHJlcG9zaXRvcnlWZXJzaW9uKSkgewotCQkJCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5TaW1wbGVQcm9maWxlUmVnaXN0cnlfUGFyc2VyX0hhc19JbmNvbXBhdGlibGVfVmVyc2lvbiwgcmVwb3NpdG9yeVZlcnNpb24sIFByb2ZpbGVYTUxDb25zdGFudHMuWE1MX1RPTEVSQU5DRSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gTWVzc2FnZXMuU2ltcGxlUHJvZmlsZVJlZ2lzdHJ5X1BhcnNlcl9FcnJvcl9QYXJzaW5nX1JlZ2lzdHJ5OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCS8vIFRPRE86Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGxvY2tQcm9maWxlKFByb2ZpbGUgcHJvZmlsZSkgewotCQlQcm9maWxlIGludGVybmFsUHJvZmlsZSA9IGludGVybmFsR2V0UHJvZmlsZShwcm9maWxlLmdldFByb2ZpbGVJZCgpKTsKLQkJaWYgKGludGVybmFsUHJvZmlsZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5wcm9maWxlX25vdF9yZWdpc3RlcmVkLCBwcm9maWxlLmdldFByb2ZpbGVJZCgpKSk7Ci0KLQkJaWYgKHByb2ZpbGUuaXNDaGFuZ2VkKCkgfHwgIWNoZWNrVGltZXN0YW1wcyhwcm9maWxlLCBpbnRlcm5hbFByb2ZpbGUpKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5wcm9maWxlX25vdF9jdXJyZW50LCBwcm9maWxlLmdldFByb2ZpbGVJZCgpKSk7Ci0KLQkJaW50ZXJuYWxMb2NrUHJvZmlsZShpbnRlcm5hbFByb2ZpbGUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbExvY2tQcm9maWxlKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJTG9jayBsb2NrID0gKExvY2spIHByb2ZpbGVMb2Nrcy5nZXQocHJvZmlsZS5nZXRQcm9maWxlSWQoKSk7Ci0JCWlmIChsb2NrID09IG51bGwpIHsKLQkJCWxvY2sgPSBuZXcgTG9jaygpOwotCQkJcHJvZmlsZUxvY2tzLnB1dChwcm9maWxlLmdldFByb2ZpbGVJZCgpLCBsb2NrKTsKLQkJfQotCQlsb2NrLmxvY2sodGhpcyk7Ci0JCWlmIChwcm9maWxlLmdldFBhcmVudFByb2ZpbGUoKSAhPSBudWxsKQotCQkJaW50ZXJuYWxMb2NrUHJvZmlsZShwcm9maWxlLmdldFBhcmVudFByb2ZpbGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNoZWNrVGltZXN0YW1wcyhJUHJvZmlsZSBwcm9maWxlLCBJUHJvZmlsZSBpbnRlcm5hbFByb2ZpbGUpIHsKLQkJaWYgKHByb2ZpbGUuZ2V0VGltZXN0YW1wKCkgPT0gaW50ZXJuYWxQcm9maWxlLmdldFRpbWVzdGFtcCgpKSB7Ci0JCQlpZiAocHJvZmlsZS5nZXRQYXJlbnRQcm9maWxlKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQkJcmV0dXJuIGNoZWNrVGltZXN0YW1wcyhwcm9maWxlLmdldFBhcmVudFByb2ZpbGUoKSwgaW50ZXJuYWxQcm9maWxlLmdldFBhcmVudFByb2ZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCB1bmxvY2tQcm9maWxlKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJUHJvZmlsZSBpbnRlcm5hbFByb2ZpbGUgPSBpbnRlcm5hbEdldFByb2ZpbGUocHJvZmlsZS5nZXRQcm9maWxlSWQoKSk7Ci0JCWlmIChpbnRlcm5hbFByb2ZpbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMucHJvZmlsZV9ub3RfcmVnaXN0ZXJlZCwgcHJvZmlsZS5nZXRQcm9maWxlSWQoKSkpOwotCQlpbnRlcm5hbFVubG9ja1Byb2ZpbGUoaW50ZXJuYWxQcm9maWxlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxVbmxvY2tQcm9maWxlKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJaWYgKHByb2ZpbGUuZ2V0UGFyZW50UHJvZmlsZSgpICE9IG51bGwpCi0JCQlpbnRlcm5hbFVubG9ja1Byb2ZpbGUocHJvZmlsZS5nZXRQYXJlbnRQcm9maWxlKCkpOwotCi0JCUxvY2sgbG9jayA9IChMb2NrKSBwcm9maWxlTG9ja3MuZ2V0KHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpOwotCQlsb2NrLnVubG9jayh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL1N1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9TdXJyb2dhdGVQcm9maWxlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDhhM2MzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL1N1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVN1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgU3Vycm9nYXRlUHJvZmlsZUhhbmRsZXIgaW1wbGVtZW50cyBJU3Vycm9nYXRlUHJvZmlsZUhhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRV9UT1VDSFBPSU5UX1RZUEUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYXRpdmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVFlQRV9ST09UID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5yb290IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQMl9FTkdJTkVfRElSID0gInAyLyIgKyBFbmdpbmVBY3RpdmF0b3IuSUQgKyAiLyI7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TR0lfSU5TVEFMTF9BUkVBID0gIm9zZ2kuaW5zdGFsbC5hcmVhIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFX0lOSV9JR05PUkVEID0gImVjbGlwc2UuaW5pLmlnbm9yZWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElVX0xPQ0tFRCA9IEludGVnZXIudG9TdHJpbmcoSUluc3RhbGxhYmxlVW5pdC5MT0NLX1VOSU5TVEFMTCB8IElJbnN0YWxsYWJsZVVuaXQuTE9DS19VUERBVEUpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1NVUlJPR0FURSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnN1cnJvZ2F0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9TSEFSRURfVElNRVNUQU1QID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2hhcmVkLnRpbWVzdGFtcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9CQVNFID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuYmFzZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9SRVNPTFZFID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVzb2x2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUwgPSAiT1BUSU9OQUwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSU5DTFVTSU9OX1JVTEVTID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW50ZXJuYWwuaW5jbHVzaW9uLnJ1bGVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTaW1wbGVQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5OwotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRTaGFyZWRQcm9maWxlQmFzZUlVcyhmaW5hbCBJUHJvZmlsZSBzaGFyZWRQcm9maWxlLCBmaW5hbCBQcm9maWxlIHVzZXJQcm9maWxlKSB7Ci0JCVF1ZXJ5IHJvb3RJVVF1ZXJ5ID0gbmV3IFF1ZXJ5KCkgewotCQkJcHVibGljIGJvb2xlYW4gaXNNYXRjaChPYmplY3QgY2FuZGlkYXRlKSB7Ci0JCQkJaWYgKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIElJbnN0YWxsYWJsZVVuaXQpIHsKLQkJCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBjYW5kaWRhdGU7Ci0JCQkJCWlmIChCb29sZWFuLnZhbHVlT2Yoc2hhcmVkUHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShpdSwgUFJPUF9UWVBFX1JPT1QpKS5ib29sZWFuVmFsdWUoKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQlpZiAoaXUuZ2V0VG91Y2hwb2ludFR5cGUoKS5nZXRJZCgpLmVxdWFscyhOQVRJVkVfVE9VQ0hQT0lOVF9UWVBFKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCUNvbGxlY3RvciByb290SVVzID0gc2hhcmVkUHJvZmlsZS5xdWVyeShyb290SVVRdWVyeSwgbmV3IENvbGxlY3RvcigpLCBudWxsKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJvb3RJVXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl1c2VyUHJvZmlsZS5hZGRJbnN0YWxsYWJsZVVuaXQoaXUpOwotCQkJdXNlclByb2ZpbGUuYWRkSW5zdGFsbGFibGVVbml0UHJvcGVydGllcyhpdSwgc2hhcmVkUHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKGl1KSk7Ci0JCQl1c2VyUHJvZmlsZS5zZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShpdSwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BST0ZJTEVfTE9DS0VEX0lVLCBJVV9MT0NLRUQpOwotCQkJdXNlclByb2ZpbGUuc2V0SW5zdGFsbGFibGVVbml0UHJvcGVydHkoaXUsIFBST1BfQkFTRSwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCByZW1vdmVVc2VyUHJvZmlsZUJhc2VJVXMoZmluYWwgUHJvZmlsZSB1c2VyUHJvZmlsZSkgewotCQlRdWVyeSByb290SVVRdWVyeSA9IG5ldyBRdWVyeSgpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzTWF0Y2goT2JqZWN0IGNhbmRpZGF0ZSkgewotCQkJCWlmIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVVbml0KSB7Ci0JCQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgY2FuZGlkYXRlOwotCQkJCQlpZiAoQm9vbGVhbi52YWx1ZU9mKHVzZXJQcm9maWxlLmdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGl1LCBQUk9QX0JBU0UpKS5ib29sZWFuVmFsdWUoKSkKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX07Ci0JCUNvbGxlY3RvciByb290SVVzID0gdXNlclByb2ZpbGUucXVlcnkocm9vdElVUXVlcnksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByb290SVVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJdXNlclByb2ZpbGUucmVtb3ZlSW5zdGFsbGFibGVVbml0KGl1KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgbWFya1Jvb3RzT3B0aW9uYWwoZmluYWwgUHJvZmlsZSB1c2VyUHJvZmlsZSkgewotCQlRdWVyeSByb290SVVRdWVyeSA9IG5ldyBRdWVyeSgpIHsKLQkJCXB1YmxpYyBib29sZWFuIGlzTWF0Y2goT2JqZWN0IGNhbmRpZGF0ZSkgewotCQkJCWlmIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVVbml0KSB7Ci0JCQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgY2FuZGlkYXRlOwotCQkJCQlpZiAoQm9vbGVhbi52YWx1ZU9mKHVzZXJQcm9maWxlLmdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGl1LCBQUk9QX1RZUEVfUk9PVCkpLmJvb2xlYW5WYWx1ZSgpKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfTsKLQkJQ29sbGVjdG9yIHJvb3RJVXMgPSB1c2VyUHJvZmlsZS5xdWVyeShyb290SVVRdWVyeSwgbmV3IENvbGxlY3RvcigpLCBudWxsKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJvb3RJVXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQl1c2VyUHJvZmlsZS5zZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShpdSwgUFJPUF9JTkNMVVNJT05fUlVMRVMsIE9QVElPTkFMKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlUHJvcGVydGllcyhmaW5hbCBJUHJvZmlsZSBzaGFyZWRQcm9maWxlLCBQcm9maWxlIHVzZXJQcm9maWxlKSB7Ci0JCXVzZXJQcm9maWxlLnNldFByb3BlcnR5KFBST1BfU0hBUkVEX1RJTUVTVEFNUCwgTG9uZy50b1N0cmluZyhzaGFyZWRQcm9maWxlLmdldFRpbWVzdGFtcCgpKSk7Ci0JCUxvY2F0aW9uIGluc3RhbGxMb2NhdGlvbiA9IChMb2NhdGlvbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEVuZ2luZUFjdGl2YXRvci5nZXRDb250ZXh0KCksIExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwgTG9jYXRpb24uSU5TVEFMTF9GSUxURVIpOwotCQlGaWxlIGluc3RhbGxGb2xkZXIgPSBuZXcgRmlsZShpbnN0YWxsTG9jYXRpb24uZ2V0VVJMKCkuZ2V0UGF0aCgpKTsKLQotCQlpZiAoQm9vbGVhbi52YWx1ZU9mKHNoYXJlZFByb2ZpbGUuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9ST0FNSU5HKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCXVzZXJQcm9maWxlLnNldFByb3BlcnR5KElQcm9maWxlLlBST1BfSU5TVEFMTF9GT0xERVIsIGluc3RhbGxGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJdXNlclByb2ZpbGUuc2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9TSEFSRURfQ0FDSEUsIGluc3RhbGxGb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJdXNlclByb2ZpbGUuc2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9ST0FNSU5HLCBCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIGNhY2hlID0gc2hhcmVkUHJvZmlsZS5nZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0NBQ0hFKTsKLQkJCWlmIChjYWNoZSAhPSBudWxsKQotCQkJCXVzZXJQcm9maWxlLnNldFByb3BlcnR5KElQcm9maWxlLlBST1BfU0hBUkVEX0NBQ0hFLCBjYWNoZSk7Ci0JCX0KLQotCQlMb2NhdGlvbiBjb25maWd1cmF0aW9uTG9jYXRpb24gPSAoTG9jYXRpb24pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShFbmdpbmVBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCksIExvY2F0aW9uLkNPTkZJR1VSQVRJT05fRklMVEVSKTsKLQkJRmlsZSBjb25maWd1cmF0aW9uRm9sZGVyID0gbmV3IEZpbGUoY29uZmlndXJhdGlvbkxvY2F0aW9uLmdldFVSTCgpLmdldFBhdGgoKSk7Ci0KLQkJdXNlclByb2ZpbGUuc2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9DQUNIRSwgY29uZmlndXJhdGlvbkZvbGRlci5nZXRQYXJlbnRGaWxlKCkuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQl1c2VyUHJvZmlsZS5zZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0NPTkZJR1VSQVRJT05fRk9MREVSLCBjb25maWd1cmF0aW9uRm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKLQotCQlGaWxlIGxhdW5jaGVyQ29uZmlnRmlsZSA9IG5ldyBGaWxlKGNvbmZpZ3VyYXRpb25Gb2xkZXIsIEVDTElQU0VfSU5JX0lHTk9SRUQpOwotCQl1c2VyUHJvZmlsZS5zZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0xBVU5DSEVSX0NPTkZJR1VSQVRJT04sIGxhdW5jaGVyQ29uZmlnRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgU2ltcGxlUHJvZmlsZVJlZ2lzdHJ5IGdldFByb2ZpbGVSZWdpc3RyeSgpIHsKLQkJaWYgKHByb2ZpbGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgaW5zdGFsbEFyZWEgPSBFbmdpbmVBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5KE9TR0lfSU5TVEFMTF9BUkVBKTsKLQkJCXRyeSB7Ci0JCQkJVVJMIHJlZ2lzdHJ5VVJMID0gbmV3IFVSTChpbnN0YWxsQXJlYSArIFAyX0VOR0lORV9ESVIgKyBTaW1wbGVQcm9maWxlUmVnaXN0cnkuREVGQVVMVF9TVE9SQUdFX0RJUik7Ci0JCQkJRmlsZSBzaGFyZWRSZWdpc3RyeURpcmVjdG9yeSA9IG5ldyBGaWxlKHJlZ2lzdHJ5VVJMLmdldFBhdGgoKSk7Ci0JCQkJcHJvZmlsZVJlZ2lzdHJ5ID0gbmV3IFNpbXBsZVByb2ZpbGVSZWdpc3RyeShzaGFyZWRSZWdpc3RyeURpcmVjdG9yeSwgbnVsbCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vdGhpcyBpcyBub3QgcG9zc2libGUgYmVjYXVzZSB3ZSBrbm93IHRoZSBhYm92ZSBVUkwgaXMgdmFsaWQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJvZmlsZVJlZ2lzdHJ5OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lLklTdXJyb2dhdGVQcm9maWxlSGFuZGxlciNjcmVhdGVQcm9maWxlKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFByb2ZpbGUgY3JlYXRlUHJvZmlsZShTdHJpbmcgaWQpIHsKLQkJZmluYWwgSVByb2ZpbGUgc2hhcmVkUHJvZmlsZSA9IGdldFByb2ZpbGVSZWdpc3RyeSgpLmdldFByb2ZpbGUoaWQpOwotCQlpZiAoc2hhcmVkUHJvZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJUHJvZmlsZSB1c2VyUHJvZmlsZSA9IG5ldyBQcm9maWxlKGlkLCBudWxsLCBzaGFyZWRQcm9maWxlLmdldFByb3BlcnRpZXMoKSk7Ci0JCXVzZXJQcm9maWxlLnNldFByb3BlcnR5KFBST1BfU1VSUk9HQVRFLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCXVzZXJQcm9maWxlLnNldFN1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyKHRoaXMpOwotCQl1cGRhdGVQcm9wZXJ0aWVzKHNoYXJlZFByb2ZpbGUsIHVzZXJQcm9maWxlKTsKLQkJYWRkU2hhcmVkUHJvZmlsZUJhc2VJVXMoc2hhcmVkUHJvZmlsZSwgdXNlclByb2ZpbGUpOwotCQlyZXR1cm4gdXNlclByb2ZpbGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmUuSVN1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyI2lzU3Vycm9nYXRlKG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU3Vycm9nYXRlKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZihwcm9maWxlLmdldFByb3BlcnR5KFBST1BfU1VSUk9HQVRFKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmUuSVN1cnJvZ2F0ZVByb2ZpbGVIYW5kbGVyI3F1ZXJ5UHJvZmlsZShvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZSwgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeSwgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3IsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDb2xsZWN0b3IgcXVlcnlQcm9maWxlKElQcm9maWxlIHByb2ZpbGUsIFF1ZXJ5IHF1ZXJ5LCBDb2xsZWN0b3IgY29sbGVjdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSVByb2ZpbGUgc2hhcmVkUHJvZmlsZSA9IGdldFByb2ZpbGVSZWdpc3RyeSgpLmdldFByb2ZpbGUocHJvZmlsZS5nZXRQcm9maWxlSWQoKSk7Ci0JCWlmIChzaGFyZWRQcm9maWxlICE9IG51bGwpCi0JCQlzaGFyZWRQcm9maWxlLnF1ZXJ5KHF1ZXJ5LCBjb2xsZWN0b3IsIG1vbml0b3IpOwotCi0JCXJldHVybiBwcm9maWxlLnF1ZXJ5KHF1ZXJ5LCBjb2xsZWN0b3IsIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVwZGF0ZVByb2ZpbGUoUHJvZmlsZSB1c2VyUHJvZmlsZSkgewotCQlmaW5hbCBJUHJvZmlsZSBzaGFyZWRQcm9maWxlID0gZ2V0UHJvZmlsZVJlZ2lzdHJ5KCkuZ2V0UHJvZmlsZSh1c2VyUHJvZmlsZS5nZXRQcm9maWxlSWQoKSk7Ci0JCWlmIChzaGFyZWRQcm9maWxlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLnNoYXJlZF9wcm9maWxlX25vdF9mb3VuZCwgdXNlclByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpKTsKLQotCQlTdHJpbmcgc2hhcmVkVGltZVN0YW1wID0gTG9uZy50b1N0cmluZyhzaGFyZWRQcm9maWxlLmdldFRpbWVzdGFtcCgpKTsKLQkJU3RyaW5nIHVzZXJTaGFyZWRUaW1lU3RhbXAgPSB1c2VyUHJvZmlsZS5nZXRQcm9wZXJ0eShQUk9QX1NIQVJFRF9USU1FU1RBTVApOwotCi0JCWlmICh1c2VyU2hhcmVkVGltZVN0YW1wICE9IG51bGwgJiYgdXNlclNoYXJlZFRpbWVTdGFtcC5lcXVhbHMoc2hhcmVkVGltZVN0YW1wKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQl1cGRhdGVQcm9wZXJ0aWVzKHNoYXJlZFByb2ZpbGUsIHVzZXJQcm9maWxlKTsKLQkJcmVtb3ZlVXNlclByb2ZpbGVCYXNlSVVzKHVzZXJQcm9maWxlKTsKLQkJaWYgKCF1c2VyUHJvZmlsZS5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuaXNFbXB0eSgpKSB7Ci0JCQl1c2VyUHJvZmlsZS5zZXRQcm9wZXJ0eShQUk9QX1JFU09MVkUsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJCW1hcmtSb290c09wdGlvbmFsKHVzZXJQcm9maWxlKTsKLQkJfQotCQlhZGRTaGFyZWRQcm9maWxlQmFzZUlVcyhzaGFyZWRQcm9maWxlLCB1c2VyUHJvZmlsZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL1RvdWNocG9pbnRNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9Ub3VjaHBvaW50TWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2FlZjIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZW5naW5lL1RvdWNocG9pbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlRvdWNocG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5Ub3VjaHBvaW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vL1RPRE8gVGhpcyBuZWVkcyB0byBzdXBwb3J0IG11bHRpcGxlIHZlcnNpb24gb2YgZWFjaCB0b3VjaHBvaW50IGFuZCBoYXZlIGEgbG9va3VwIHRoYXQgc3VwcG9ydHMgdmVyc2lvbiBzZW1hbnRpY3MKLXB1YmxpYyBjbGFzcyBUb3VjaHBvaW50TWFuYWdlciBpbXBsZW1lbnRzIElSZWdpc3RyeUNoYW5nZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFRvdWNocG9pbnRNYW5hZ2VyIGluc3RhbmNlOwotCi0JcHVibGljIHN0YXRpYyBUb3VjaHBvaW50TWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IFRvdWNocG9pbnRNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVF9UT1VDSFBPSU5UUyA9ICJ0b3VjaHBvaW50cyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVF9UT1VDSFBPSU5UID0gInRvdWNocG9pbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfVE9VQ0hQT0lOVF9EQVRBID0gImRhdGEiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgY2xhc3MgVG91Y2hwb2ludEVudHJ5IHsKLQotCQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50OwotCQlwcml2YXRlIGJvb2xlYW4gY3JlYXRlZEV4dGVuc2lvbjsKLQkJcHJpdmF0ZSBUb3VjaHBvaW50IHRvdWNocG9pbnQ7Ci0KLQkJcHVibGljIFRvdWNocG9pbnRFbnRyeShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQl0aGlzLnRvdWNocG9pbnQgPSBudWxsOwotCQkJdGhpcy5jcmVhdGVkRXh0ZW5zaW9uID0gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgVG91Y2hwb2ludEVudHJ5KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBUb3VjaHBvaW50IHRvdWNocG9pbnQpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQkJdGhpcy50b3VjaHBvaW50ID0gdG91Y2hwb2ludDsKLQkJCXRoaXMuY3JlYXRlZEV4dGVuc2lvbiA9ICh0b3VjaHBvaW50ICE9IG51bGwgPyB0cnVlIDogZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzVG91Y2hwb2ludCgpIHsKLQkJCXJldHVybiAodGhpcy50b3VjaHBvaW50ICE9IG51bGwpOwotCQl9Ci0KLQkJcHVibGljIFRvdWNocG9pbnQgZ2V0VG91Y2hwb2ludCgpIHsKLQkJCWlmICghY3JlYXRlZEV4dGVuc2lvbikgewotCQkJCVN0cmluZyBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9UWVBFKTsKLQkJCQl0cnkgewotCQkJCQlUb3VjaHBvaW50IHRvdWNocG9pbnRJbnN0YW5jZSA9IChUb3VjaHBvaW50KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUklCVVRFX0NMQVNTKTsKLQkJCQkJaWYgKHRvdWNocG9pbnRJbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoIWlkLmVxdWFscyh0b3VjaHBvaW50SW5zdGFuY2UuZ2V0VG91Y2hwb2ludFR5cGUoKS5nZXRJZCgpKSkgewotCQkJCQkJCXJlcG9ydEVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLlRvdWNocG9pbnRNYW5hZ2VyX1RvdWNocG9pbnRfVHlwZV9NaXNtYXRjaCwgaWQsIHRvdWNocG9pbnRJbnN0YW5jZS5nZXRUb3VjaHBvaW50VHlwZSgpLmdldElkKCkpLCBudWxsKTsKLQkJCQkJCX0KLQkJCQkJCXRoaXMudG91Y2hwb2ludCA9IHRvdWNocG9pbnRJbnN0YW5jZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZyBlcnJvck1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLlRvdWNocG9pbnRNYW5hZ2VyX051bGxfQ3JlYXRpbmdfVG91Y2hwb2ludF9FeHRlbnNpb24sIGlkKTsKLQkJCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRW5naW5lQWN0aXZhdG9yLklELCAxLCBlcnJvck1zZywgbnVsbCkpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZXhjcHQpIHsKLQkJCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEVuZ2luZUFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuVG91Y2hwb2ludE1hbmFnZXJfRXhjZXB0aW9uX0NyZWF0aW5nX1RvdWNocG9pbnRfRXh0ZW5zaW9uLCBpZCksIGNleGNwdCkpOwotCQkJCX0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBjY2V4Y3B0KSB7Ci0JCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFbmdpbmVBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLlRvdWNocG9pbnRNYW5hZ2VyX0V4Y2VwdGlvbl9DcmVhdGluZ19Ub3VjaHBvaW50X0V4dGVuc2lvbiwgaWQpLCBjY2V4Y3B0KSk7Ci0JCQkJfQotCQkJCS8vIE1hcmsgYXMgY3JlYXRlZCBldmVuIGluIGVycm9yIGNhc2VzLAotCQkJCS8vIHNvIGV4Y2VwdGlvbnMgYXJlIG5vdCBsb2dnZWQgbXVsdGlwbGUgdGltZXMKLQkJCQljcmVhdGVkRXh0ZW5zaW9uID0gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiB0aGlzLnRvdWNocG9pbnQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoZWxlbWVudC50b1N0cmluZygpKTsKLQkJCWlmIChjcmVhdGVkRXh0ZW5zaW9uKSB7Ci0JCQkJU3RyaW5nIHRvdWNocG9pbnRTdHJpbmcgPSB0b3VjaHBvaW50ICE9IG51bGwgPyB0b3VjaHBvaW50LnRvU3RyaW5nKCkgOiAibm90IGNyZWF0ZWQiOyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFwcGVuZCgiID0+ICIgKyB0b3VjaHBvaW50U3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLy8gVE9ETzogRG8gd2UgcmVhbGx5IHdhbnQgdG8gc3RvcmUgdGhlIHRvdWNocG9pbnRzPyBUaGUgZGFuZ2VyIGlzIAotCS8vCSAgICAgdGhhdCBpZiB0d28gaW5zdGFsbGF0aW9ucyBhcmUgcGVyZm9ybWVkIHNpbXVsdGFuZW91c2x5LCB0aGVuLi4uCi0JLy8gVE9ETzogRmlndXJlIG91dCBsb2NraW5nLCBjb25jdXJyZW5jeSByZXF1aXJlbWVudHMgZm9yIHRvdWNocG9pbnRzLgotCXByaXZhdGUgTWFwIHRvdWNocG9pbnRFbnRyaWVzOwotCi0JcHJpdmF0ZSBUb3VjaHBvaW50TWFuYWdlcigpIHsKLQkJUmVnaXN0cnlGYWN0b3J5LmdldFJlZ2lzdHJ5KCkuYWRkUmVnaXN0cnlDaGFuZ2VMaXN0ZW5lcih0aGlzLCBFbmdpbmVBY3RpdmF0b3IuSUQpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSB0b3VjaHBvaW50IHdoaWNoIGlzIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBpZCwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lIGFyZSByZWdpc3RlcmVkLgotCSAqLwotCXB1YmxpYyBUb3VjaHBvaW50IGdldFRvdWNocG9pbnQoVG91Y2hwb2ludFR5cGUgaWQpIHsKLQkJaWYgKGlkID09IG51bGwgfHwgIiIuZXF1YWxzKGlkLmdldElkKCkpKSAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLlRvdWNocG9pbnRNYW5hZ2VyX051bGxfVG91Y2hwb2ludF9UeXBlX0FyZ3VtZW50KTsKLQkJaWYgKHRvdWNocG9pbnRFbnRyaWVzID09IG51bGwpIHsKLQkJCWluaXRpYWxpemVUb3VjaHBvaW50cygpOwotCQl9Ci0JCVRvdWNocG9pbnRFbnRyeSBlbnRyeSA9IChUb3VjaHBvaW50RW50cnkpIHRvdWNocG9pbnRFbnRyaWVzLmdldChpZC5nZXRJZCgpKTsKLQkJcmV0dXJuIGVudHJ5ID09IG51bGwgPyBudWxsIDogZW50cnkuZ2V0VG91Y2hwb2ludCgpOwotCX0KLQotCXB1YmxpYyBUb3VjaHBvaW50W10gZ2V0QWxsVG91Y2hwb2ludHMoKSB7Ci0JCWlmICh0b3VjaHBvaW50RW50cmllcyA9PSBudWxsKSB7Ci0JCQlpbml0aWFsaXplVG91Y2hwb2ludHMoKTsKLQkJfQotCQlDb2xsZWN0aW9uIGFkYXB0ZXJzID0gdG91Y2hwb2ludEVudHJpZXMudmFsdWVzKCk7Ci0KLQkJQXJyYXlMaXN0IHRvdWNocG9pbnRzID0gbmV3IEFycmF5TGlzdChhZGFwdGVycy5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhZGFwdGVycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVRvdWNocG9pbnRFbnRyeSBlbnRyeSA9IChUb3VjaHBvaW50RW50cnkpIGl0ZXIubmV4dCgpOwotCQkJVG91Y2hwb2ludCB0b3VjaHBvaW50ID0gZW50cnkuZ2V0VG91Y2hwb2ludCgpOwotCQkJaWYgKHRvdWNocG9pbnQgIT0gbnVsbCkgewotCQkJCXRvdWNocG9pbnRzLmFkZCh0b3VjaHBvaW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFRvdWNocG9pbnRbXSkgdG91Y2hwb2ludHMudG9BcnJheShuZXcgVG91Y2hwb2ludFt0b3VjaHBvaW50cy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgVG91Y2hwb2ludFtdIGdldENyZWF0ZWRUb3VjaHBvaW50cygpIHsKLQkJaWYgKHRvdWNocG9pbnRFbnRyaWVzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFRvdWNocG9pbnRbMF07Ci0JCUNvbGxlY3Rpb24gYWRhcHRlcnMgPSB0b3VjaHBvaW50RW50cmllcy52YWx1ZXMoKTsKLQotCQlBcnJheUxpc3QgdG91Y2hwb2ludHMgPSBuZXcgQXJyYXlMaXN0KGFkYXB0ZXJzLnNpemUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJVG91Y2hwb2ludEVudHJ5IGVudHJ5ID0gKFRvdWNocG9pbnRFbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZW50cnkuaGFzVG91Y2hwb2ludCgpKSB7Ci0JCQkJVG91Y2hwb2ludCB0b3VjaHBvaW50ID0gZW50cnkuZ2V0VG91Y2hwb2ludCgpOwotCQkJCWlmICh0b3VjaHBvaW50ICE9IG51bGwpIHsKLQkJCQkJdG91Y2hwb2ludHMuYWRkKHRvdWNocG9pbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKFRvdWNocG9pbnRbXSkgdG91Y2hwb2ludHMudG9BcnJheShuZXcgVG91Y2hwb2ludFt0b3VjaHBvaW50cy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVRvdWNocG9pbnRzKFN0cmluZ1tdIHJlcXVpcmVkVHlwZXMpIHsKLQkJTXVsdGlTdGF0dXMgc3RhdHVzID0gdG91Y2hwb2ludEVudHJpZXMgPT0gbnVsbCA/IGluaXRpYWxpemVUb3VjaHBvaW50cygpIDogbmV3IE11bHRpU3RhdHVzKEVuZ2luZUFjdGl2YXRvci5JRCwgSVN0YXR1cy5PSywgbnVsbCwgbnVsbCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUb3VjaHBvaW50RW50cnkgZW50cnkgPSAoVG91Y2hwb2ludEVudHJ5KSB0b3VjaHBvaW50RW50cmllcy5nZXQocmVxdWlyZWRUeXBlc1tpXSk7Ci0JCQlpZiAoZW50cnkgPT0gbnVsbCkgewotCQkJCXJlcG9ydEVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLlRvdWNocG9pbnRNYW5hZ2VyX1JlcXVpcmVkX1RvdWNocG9pbnRfTm90X0ZvdW5kLCByZXF1aXJlZFR5cGVzW2ldKSwgc3RhdHVzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qCi0JICogQ29uc3RydWN0IGEgbWFwIG9mIHRoZSBleHRlbnNpb25zIHRoYXQgaW1wbGVtZW50IHRoZSB0b3VjaHBvaW50cyBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJpdmF0ZSBNdWx0aVN0YXR1cyBpbml0aWFsaXplVG91Y2hwb2ludHMoKSB7Ci0JCU11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhFbmdpbmVBY3RpdmF0b3IuSUQsIElTdGF0dXMuT0ssIG51bGwsIG51bGwpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBSZWdpc3RyeUZhY3RvcnkuZ2V0UmVnaXN0cnkoKS5nZXRFeHRlbnNpb25Qb2ludChFbmdpbmVBY3RpdmF0b3IuSUQsIFBUX1RPVUNIUE9JTlRTKTsKLQkJaWYgKHBvaW50ID09IG51bGwpIHsKLQkJCXJlcG9ydEVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLlRvdWNocG9pbnRNYW5hZ2VyX05vX0V4dGVuc2lvbl9Qb2ludCwgRW5naW5lQWN0aXZhdG9yLklELCBQVF9UT1VDSFBPSU5UUyksIHN0YXR1cyk7Ci0JCQl0b3VjaHBvaW50RW50cmllcyA9IG5ldyBIYXNoTWFwKDApOwotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gcG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQl0b3VjaHBvaW50RW50cmllcyA9IG5ldyBIYXNoTWFwKGV4dGVuc2lvbnMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGV4dGVuc2lvbnNbaV0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gZWxlbWVudHNbal0uZ2V0TmFtZSgpOwotCQkJCWlmICghRUxFTUVOVF9UT1VDSFBPSU5ULmVxdWFsc0lnbm9yZUNhc2UoZWxlbWVudHNbal0uZ2V0TmFtZSgpKSkgewotCQkJCQlpZiAoIUVMRU1FTlRfVE9VQ0hQT0lOVF9EQVRBLmVxdWFscyhlbGVtZW50TmFtZSkpIHsgLy8gVE9ETzogYXJlICdkYXRhJyBlbGVtZW50cyBzdGlsbCBuZWVkZWQ/Ci0JCQkJCQlyZXBvcnRFcnJvcihOTFMuYmluZChNZXNzYWdlcy5Ub3VjaHBvaW50TWFuYWdlcl9JbmNvcnJlY3RseV9OYW1lZF9FeHRlbnNpb24sIGVsZW1lbnRzW2pdLmdldE5hbWUoKSwgRUxFTUVOVF9UT1VDSFBPSU5UKSwgc3RhdHVzKTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJU3RyaW5nIGlkID0gZWxlbWVudHNbal0uZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9UWVBFKTsKLQkJCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJCQlyZXBvcnRFcnJvcihOTFMuYmluZChNZXNzYWdlcy5Ub3VjaHBvaW50TWFuYWdlcl9BdHRyaWJ1dGVfTm90X1NwZWNpZmllZCwgQVRUUklCVVRFX1RZUEUpLCBzdGF0dXMpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKHRvdWNocG9pbnRFbnRyaWVzLmdldChpZCkgPT0gbnVsbCkgewotCQkJCQl0b3VjaHBvaW50RW50cmllcy5wdXQoaWQsIG5ldyBUb3VjaHBvaW50RW50cnkoZWxlbWVudHNbal0pKTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXBvcnRFcnJvcihOTFMuYmluZChNZXNzYWdlcy5Ub3VjaHBvaW50TWFuYWdlcl9Db25mbGljdGluZ19Ub3VjaHBvaW50X1R5cGVzLCBBVFRSSUJVVEVfVFlQRSwgaWQpLCBzdGF0dXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXN0YXRpYyB2b2lkIHJlcG9ydEVycm9yKFN0cmluZyBlcnJvck1zZywgTXVsdGlTdGF0dXMgc3RhdHVzKSB7Ci0JCVN0YXR1cyBlcnJvclN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRW5naW5lQWN0aXZhdG9yLklELCAxLCBlcnJvck1zZywgbnVsbCk7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCXN0YXR1cy5hZGQoZXJyb3JTdGF0dXMpOwotCQlMb2dIZWxwZXIubG9nKGVycm9yU3RhdHVzKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVJlZ2lzdHJ5Q2hhbmdlTGlzdGVuZXIjcmVnaXN0cnlDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUmVnaXN0cnlDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RyeUNoYW5nZWQoSVJlZ2lzdHJ5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJLy8ganVzdCBmbHVzaCB0aGUgY2FjaGUgd2hlbiBzb21ldGhpbmcgY2hhbmdlZC4gIEl0IHdpbGwgYmUgcmVjb21wdXRlZCBvbiBkZW1hbmQuCi0JCXRvdWNocG9pbnRFbnRyaWVzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9lbmdpbmUvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjZjk0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2VuZ2luZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1hY3Rpb25fbm90X2ZvdW5kPU5vIGFjdGlvbiBmb3VuZCBmb3I6IHswfS4KLWRvd25sb2FkX2FydGlmYWN0PURvd25sb2FkaW5nIGFydGlmYWN0cwotZG93bmxvYWRfbm9fcmVwb3NpdG9yeT1ObyBhcnRpZmFjdCByZXBvc2l0b3J5IGF2YWlsYWJsZS4KLQotZXJyb3JfcGFyc2luZ19wcm9maWxlPUVycm9yIHBhcnNpbmcgcHJvZmlsZSB7MH0uCi1lcnJvcl9wZXJzaXN0aW5nX3Byb2ZpbGU9RXJyb3IgcGVyc2lzdGluZyBwcm9maWxlIHswfS4KLWZhaWxlZF9jcmVhdGluZ19tZXRhZGF0YV9jYWNoZT1NZXRhZGF0YSBjYWNoZSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLQotVG91Y2hwb2ludE1hbmFnZXJfTnVsbF9Ub3VjaHBvaW50X1R5cGVfQXJndW1lbnQ9QSBudWxsIG9yIGVtcHR5IHN0cmluZyB3YXMgcGFzc2VkIGFzIHRoZSB0eXBlIG9mIGEgdG91Y2hwb2ludC4KLVRvdWNocG9pbnRNYW5hZ2VyX1JlcXVpcmVkX1RvdWNocG9pbnRfTm90X0ZvdW5kPVRoZSByZXF1aXJlZCB7MH0gdG91Y2hwb2ludCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGluc3RhbGxhdGlvbiBtYW5hZ2VyIGNvbmZpZ3VyYXRpb24uCi1Ub3VjaHBvaW50TWFuYWdlcl9Ob19FeHRlbnNpb25fUG9pbnQ9VGhlIGV4dGVuc2lvbiBwb2ludCB7MH0uezF9IHdhcyBub3QgZm91bmQgaW4gdGhlIHBsYXRmb3JtIGV4dGVuc2lvbiByZWdpc3RyeS4KLVRvdWNocG9pbnRNYW5hZ2VyX0luY29ycmVjdGx5X05hbWVkX0V4dGVuc2lvbj1BIHRvdWNocG9pbnQgZXh0ZW5zaW9uIGlzIGluY29ycmVjdGx5IG5hbWVkIHswfSBpbnN0ZWFkIG9mIHsxfS4KLVRvdWNocG9pbnRNYW5hZ2VyX0F0dHJpYnV0ZV9Ob3RfU3BlY2lmaWVkPVRoZSByZXF1aXJlZCBhdHRyaWJ1dGUgezB9IGlzIG5vdCBzcGVjaWZpZWQgZm9yIHRoZSB0b3VjaHBvaW50cyBleHRlbnNpb24gcG9pbnQuCi1Ub3VjaHBvaW50TWFuYWdlcl9Db25mbGljdGluZ19Ub3VjaHBvaW50X1R5cGVzPVR3byBvciBtb3JlIHRvdWNocG9pbnQgZXh0ZW5zaW9ucyBvZiB0eXBlIHswfSBhcmUgZGVmaW5lZC4KLVRvdWNocG9pbnRNYW5hZ2VyX1RvdWNocG9pbnRfVHlwZV9NaXNtYXRjaD1UaGUgdG91Y2hwb2ludCByZWdpc3RlcmVkIGZvciB0eXBlIHswfSByZXBvcnRzIGl0cyB0eXBlIGFzIHsxfS4KLVRvdWNocG9pbnRNYW5hZ2VyX0V4Y2VwdGlvbl9DcmVhdGluZ19Ub3VjaHBvaW50X0V4dGVuc2lvbj1BbiBleGNlcHRpb24gd2FzIHRocm93biBhbmQgY2F1Z2h0IHdoZW4gY3JlYXRpbmcgdGhlIGV4dGVuc2lvbiBwb2ludCBpbnN0YW5jZSBmb3IgdGhlIHswfSB0b3VjaHBvaW50LgotVG91Y2hwb2ludE1hbmFnZXJfTnVsbF9DcmVhdGluZ19Ub3VjaHBvaW50X0V4dGVuc2lvbj1BIG51bGwgb2JqZWN0IHdhcyByZXR1cm5lZCB3aGVuIGNyZWF0aW5nIHRoZSBleHRlbnNpb24gcG9pbnQgaW5zdGFuY2UgZm9yIHRoZSB7MH0gdG91Y2hwb2ludC4KLQotUGFyYW1ldGVyaXplZFByb3Zpc2lvbmluZ0FjdGlvbl9hY3Rpb25fb3JfcGFyYW1ldGVyc19udWxsPUJvdGggYWN0aW9uIGFuZCBhY3Rpb24gcGFyYXJhbWV0ZXJzIG11c3Qgbm90IGJlIG51bGwuCi1Qcm9maWxlX051bGxfUHJvZmlsZV9JZD1BIHByb2ZpbGUgbXVzdCBoYXZlIGFuIG5vbi1lbXB0eSBpZC4KLVByb2ZpbGVfRHVwbGljYXRlX1Jvb3RfUHJvZmlsZV9JZD1BZGRpbmcgYSBwcm9maWxlIHdpdGggZHVwbGljYXRlIGlkOiB7MH0uCi1Qcm9maWxlX1BhcmVudF9Ob3RfRm91bmQ9UGFyZW50IHByb2ZpbGUgbm90IGZvdW5kOiB7MH0uCi0KLVNpbXBsZVByb2ZpbGVSZWdpc3RyeV9QYXJzZXJfRXJyb3JfUGFyc2luZ19SZWdpc3RyeT1cCi0JRXJyb3IgcGFyc2luZyB0aGUgcHJvZmlsZSByZWdpc3RyeS4KLVNpbXBsZVByb2ZpbGVSZWdpc3RyeV9QYXJzZXJfSGFzX0luY29tcGF0aWJsZV9WZXJzaW9uPVwKLQlUaGUgcHJvZmlsZSByZWdpc3RyeSBoYXMgaW5jb21wYXRpYmxlIHZlcnNpb24gezB9OyBleHBlY3RlZCB7MX0uCi0JCi1wcm9maWxlX2RvZXNfbm90X2V4aXN0PVByb2ZpbGUgdG8gYmUgdXBkYXRlZCBkb2VzIG5vdCBleGlzdDogezB9LgotcHJvZmlsZV9ub3RfY3VycmVudD1Qcm9maWxlIHswfSBpcyBub3QgY3VycmVudC4KLXByb2ZpbGVfbm90X3JlZ2lzdGVyZWQ9UHJvZmlsZSB7MH0gbm90IHJlZ2lzdGVyZWQuCi1yZWdfZGlyX25vdF9hdmFpbGFibGU9UmVnaXN0cnkgRGlyZWN0b3J5IG5vdCBhdmFpbGFibGUuCi10aHJlYWRfbm90X293bmVyPVRocmVhZCBub3QgbG9jayBvd25lci4KLXNoYXJlZF9wcm9maWxlX25vdF9mb3VuZD1TaGFyZWQgcHJvZmlsZSB7MH0gbm90IGZvdW5kLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvQmVnaW5PcGVyYXRpb25FdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvQmVnaW5PcGVyYXRpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWRlODJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0JlZ2luT3BlcmF0aW9uRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZTsKLQotcHVibGljIGNsYXNzIEJlZ2luT3BlcmF0aW9uRXZlbnQgZXh0ZW5kcyBUcmFuc2FjdGlvbkV2ZW50IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDYzODkzMTgzNzU3MzkzMjQ4NjVMOwotCi0JcHVibGljIEJlZ2luT3BlcmF0aW9uRXZlbnQoSVByb2ZpbGUgcHJvZmlsZSwgUGhhc2VTZXQgcGhhc2VTZXQsIE9wZXJhbmRbXSBvcGVyYW5kcywgSUVuZ2luZSBlbmdpbmUpIHsKLQkJc3VwZXIocHJvZmlsZSwgcGhhc2VTZXQsIG9wZXJhbmRzLCBlbmdpbmUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0NlcnRpZmljYXRlQ2hlY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvQ2VydGlmaWNhdGVDaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YzVmMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvQ2VydGlmaWNhdGVDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5HZW5lcmFsU2VjdXJpdHlFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZS5FbmdpbmVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLklTZXJ2aWNlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnNlY3VyaXR5LlRydXN0RW5naW5lOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2lnbmVkY29udGVudC4qOwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKLQotcHVibGljIGNsYXNzIENlcnRpZmljYXRlQ2hlY2tlciB7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgYXJ0aWZhY3RzOwotCXByaXZhdGUgU2VydmljZVRyYWNrZXIgdHJ1c3RFbmdpbmVUcmFja2VyOwotCi0JcHVibGljIENlcnRpZmljYXRlQ2hlY2tlcigpIHsKLQkJYXJ0aWZhY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnVzdEVuZ2luZVRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoRW5naW5lQWN0aXZhdG9yLmdldENvbnRleHQoKSwgVHJ1c3RFbmdpbmUuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLQkJdHJ1c3RFbmdpbmVUcmFja2VyLm9wZW4oKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBzdGFydCgpIHsKLQkJcmV0dXJuIGNoZWNrQ2VydGlmaWNhdGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGNoZWNrQ2VydGlmaWNhdGVzKCkgewotCQlTaWduZWRDb250ZW50RmFjdG9yeSB2ZXJpZmllckZhY3RvcnkgPSAoU2lnbmVkQ29udGVudEZhY3RvcnkpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShFbmdpbmVBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBTaWduZWRDb250ZW50RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOwotCQlJU2VydmljZVVJIHNlcnZpY2VVSSA9IChJU2VydmljZVVJKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoRW5naW5lQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVNlcnZpY2VVSS5jbGFzcy5nZXROYW1lKCkpOwotCQlTaWduZWRDb250ZW50IGNvbnRlbnQgPSBudWxsOwotCQlTaWduZXJJbmZvW10gc2lnbmVySW5mbyA9IG51bGw7Ci0JCUFycmF5TGlzdCB1bnRydXN0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCB1bnRydXN0ZWRDaGFpbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoYXJ0aWZhY3RzLnNpemUoKSA9PSAwIHx8IHNlcnZpY2VVSSA9PSBudWxsKQotCQkJcmV0dXJuIHN0YXR1czsKLQkJSXRlcmF0b3IgYXJ0aWZhY3QgPSBhcnRpZmFjdHMuaXRlcmF0b3IoKTsKLQkJVHJ1c3RFbmdpbmUgdHJ1c3RFbmdpbmUgPSAoVHJ1c3RFbmdpbmUpIHRydXN0RW5naW5lVHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0JCXdoaWxlIChhcnRpZmFjdC5oYXNOZXh0KCkpIHsKLQkJCXRyeSB7Ci0JCQkJY29udGVudCA9IHZlcmlmaWVyRmFjdG9yeS5nZXRTaWduZWRDb250ZW50KChGaWxlKSBhcnRpZmFjdC5uZXh0KCkpOwotCQkJCWlmICghY29udGVudC5pc1NpZ25lZCgpKQotCQkJCQljb250aW51ZTsKLQkJCQlzaWduZXJJbmZvID0gY29udGVudC5nZXRTaWduZXJJbmZvcygpOwotCQkJfSBjYXRjaCAoR2VuZXJhbFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFbmdpbmVBY3RpdmF0b3IuSUQsIE1lc3NhZ2VzLkNlcnRpZmljYXRlQ2hlY2tlcl9TaWduZWRDb250ZW50RXJyb3IsIGUpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEVuZ2luZUFjdGl2YXRvci5JRCwgTWVzc2FnZXMuQ2VydGlmaWNhdGVDaGVja2VyX1NpZ25lZENvbnRlbnRJT0Vycm9yLCBlKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2lnbmVySW5mby5sZW5ndGg7IGkrKykgewotCQkJCUNlcnRpZmljYXRlW10gY2VydGlmaWNhdGVDaGFpbiA9IHNpZ25lckluZm9baV0uZ2V0Q2VydGlmaWNhdGVDaGFpbigpOwotCQkJCXRyeSB7Ci0JCQkJCUNlcnRpZmljYXRlIHRydXN0QW5jaG9yID0gdHJ1c3RFbmdpbmUuZmluZFRydXN0QW5jaG9yKGNlcnRpZmljYXRlQ2hhaW4pOwotCQkJCQlpZiAodHJ1c3RBbmNob3IgPT0gbnVsbCkgewotCQkJCQkJaWYgKCF1bnRydXN0ZWQuY29udGFpbnMoY2VydGlmaWNhdGVDaGFpblswXSkpIHsKLQkJCQkJCQl1bnRydXN0ZWQuYWRkKGNlcnRpZmljYXRlQ2hhaW5bMF0pOwotCQkJCQkJCXVudHJ1c3RlZENoYWluLmFkZChjZXJ0aWZpY2F0ZUNoYWluKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgRW5naW5lQWN0aXZhdG9yLklELCBNZXNzYWdlcy5DZXJ0aWZpY2F0ZUNoZWNrZXJfS2V5c3RvcmVDb25uZWN0aW9uRXJyb3IsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodW50cnVzdGVkLnNpemUoKSA+IDApIHsKLQkJCUNlcnRpZmljYXRlW11bXSBjZXJ0aWZpY2F0ZXM7Ci0JCQljZXJ0aWZpY2F0ZXMgPSBuZXcgQ2VydGlmaWNhdGVbdW50cnVzdGVkQ2hhaW4uc2l6ZSgpXVtdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1bnRydXN0ZWRDaGFpbi5zaXplKCk7IGkrKykgewotCQkJCWNlcnRpZmljYXRlc1tpXSA9IChDZXJ0aWZpY2F0ZVtdKSB1bnRydXN0ZWRDaGFpbi5nZXQoaSk7Ci0JCQl9Ci0JCQlDZXJ0aWZpY2F0ZVtdIHRydXN0ZWRDZXJ0aWZpY2F0ZXMgPSBzZXJ2aWNlVUkuc2hvd0NlcnRpZmljYXRlcyhjZXJ0aWZpY2F0ZXMpOwotCQkJaWYgKHRydXN0ZWRDZXJ0aWZpY2F0ZXMgPT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEVuZ2luZUFjdGl2YXRvci5JRCwgTWVzc2FnZXMuQ2VydGlmaWNhdGVDaGVja2VyX0NlcnRpZmljYXRlUmVqZWN0ZWQpOwotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cnVzdGVkQ2VydGlmaWNhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdW50cnVzdGVkLnJlbW92ZSh0cnVzdGVkQ2VydGlmaWNhdGVzW2ldKTsKLQkJCX0KLQkJCWlmICh1bnRydXN0ZWQuc2l6ZSgpID4gMCkKLQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFbmdpbmVBY3RpdmF0b3IuSUQsIE1lc3NhZ2VzLkNlcnRpZmljYXRlQ2hlY2tlcl9DZXJ0aWZpY2F0ZVJlamVjdGVkKTsKLQkJCS8vIGFkZCBuZXdseSB0cnVzdGVkIGNlcnRpZmljYXRlcyB0byB0cnVzdCBlbmdpbmUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHJ1c3RlZENlcnRpZmljYXRlcy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCXRydXN0RW5naW5lLmFkZFRydXN0QW5jaG9yKHRydXN0ZWRDZXJ0aWZpY2F0ZXNbaV0sIHRydXN0ZWRDZXJ0aWZpY2F0ZXNbaV0udG9TdHJpbmcoKSk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvL2p1c3QgcmV0dXJuIGFuIElORk8gc28gdGhlIHVzZXIgY2FuIHByb2NlZWQgd2l0aCB0aGUgaW5zdGFsbAotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEVuZ2luZUFjdGl2YXRvci5JRCwgTWVzc2FnZXMuQ2VydGlmaWNhdGVDaGVja2VyX0tleXN0b3JlQ29ubmVjdGlvbkVycm9yLCBlKTsKLQkJCQl9IGNhdGNoIChHZW5lcmFsU2VjdXJpdHlFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEVuZ2luZUFjdGl2YXRvci5JRCwgTWVzc2FnZXMuQ2VydGlmaWNhdGVDaGVja2VyX0NlcnRpZmljYXRlRXJyb3IsIGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKEZpbGUgdG9BZGQpIHsKLQkJYXJ0aWZhY3RzLmFkZCh0b0FkZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkKE9iamVjdFtdIHRvQWRkKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9BZGQubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b0FkZFtpXSBpbnN0YW5jZW9mIEZpbGUpCi0JCQkJYWRkKChGaWxlKSB0b0FkZFtpXSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9Db21taXRPcGVyYXRpb25FdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvQ29tbWl0T3BlcmF0aW9uRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBmODlhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9Db21taXRPcGVyYXRpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lOwotCi1wdWJsaWMgY2xhc3MgQ29tbWl0T3BlcmF0aW9uRXZlbnQgZXh0ZW5kcyBUcmFuc2FjdGlvbkV2ZW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTIzOTY3Nzc1NDI2MTMzNzIwTDsKLQotCXB1YmxpYyBDb21taXRPcGVyYXRpb25FdmVudChJUHJvZmlsZSBwcm9maWxlLCBQaGFzZVNldCBwaGFzZVNldCwgT3BlcmFuZFtdIG9wZXJhbmRzLCBJRW5naW5lIGVuZ2luZSkgewotCQlzdXBlcihwcm9maWxlLCBwaGFzZVNldCwgb3BlcmFuZHMsIGVuZ2luZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9EZWZhdWx0UGhhc2VTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0RlZmF1bHRQaGFzZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjc5Yjc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0RlZmF1bHRQaGFzZVNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5waGFzZXMuKjsKLQotcHVibGljIGNsYXNzIERlZmF1bHRQaGFzZVNldCBleHRlbmRzIFBoYXNlU2V0IHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IFBIQVNFX0NIRUNLX1RSVVNUID0gMHgwMTsKLQlwdWJsaWMgc3RhdGljIGludCBQSEFTRV9DT0xMRUNUID0gMHgwMjsKLQlwdWJsaWMgc3RhdGljIGludCBQSEFTRV9DT05GSUdVUkUgPSAweDA0OwotCXB1YmxpYyBzdGF0aWMgaW50IFBIQVNFX0lOU1RBTEwgPSAweDA4OwotCXB1YmxpYyBzdGF0aWMgaW50IFBIQVNFX1BST1BFUlRZID0gMHgxMDsKLQlwdWJsaWMgc3RhdGljIGludCBQSEFTRV9VTkNPTkZJR1VSRSA9IDB4MjA7Ci0JcHVibGljIHN0YXRpYyBpbnQgUEhBU0VfVU5JTlNUQUxMID0gMHg0MDsKLQotCXB1YmxpYyBEZWZhdWx0UGhhc2VTZXQoKSB7Ci0JCXN1cGVyKG5ldyBQaGFzZVtdIHtuZXcgQ29sbGVjdCgxMDApLCBuZXcgVW5jb25maWd1cmUoMTApLCBuZXcgVW5pbnN0YWxsKDUwKSwgbmV3IFByb3BlcnR5KDEpLCBuZXcgQ2hlY2tUcnVzdCgxMCksIG5ldyBJbnN0YWxsKDUwKSwgbmV3IENvbmZpZ3VyZSgxMCl9KTsKLQl9Ci0KLQlwcml2YXRlIERlZmF1bHRQaGFzZVNldChQaGFzZVtdIHBoYXNlcykgewotCQlzdXBlcihwaGFzZXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkZWZhdWx0IHBoYXNlIHNldCB0aGF0IGNvdmVycyBhbGwgdGhlIHByb3Zpc2lvbmluZyBvcGVyYXRpb25zLgotCSAqIFBoYXNlcyBjYW4gYmUgc3BlY2lmaWVkIGZvciBleGNsdXNpb24uCi0JICogCi0JICogQHBhcmFtIGV4Y2x1ZGUgLSBBIHNldCBvZiBiaXQgb3B0aW9ucyB0aGF0IHNwZWNpZnkgdGhlIHBoYXNlcyB0byBleGNsdWRlLgotCSAqIFNlZSB7QGxpbmsgRGVmYXVsdFBoYXNlU2V0fSBmb3IgcG9zc2libGUgb3B0aW9ucwotCSAqIEByZXR1cm4gdGhlIHtAbGluayBQaGFzZVNldH0KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFBoYXNlU2V0IGNyZWF0ZURlZmF1bHRQaGFzZVNldChpbnQgZXhjbHVkZSkgewotCQlBcnJheUxpc3QgcGhhc2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoKFBIQVNFX0NPTExFQ1QgJiBleGNsdWRlKSAhPSBQSEFTRV9DT0xMRUNUKQotCQkJcGhhc2VzLmFkZChuZXcgQ29sbGVjdCgxMDApKTsKLQkJaWYgKChQSEFTRV9VTkNPTkZJR1VSRSAmIGV4Y2x1ZGUpICE9IFBIQVNFX1VOQ09ORklHVVJFKQotCQkJcGhhc2VzLmFkZChuZXcgVW5jb25maWd1cmUoMTApKTsKLQkJaWYgKChQSEFTRV9VTklOU1RBTEwgJiBleGNsdWRlKSAhPSBQSEFTRV9VTklOU1RBTEwpCi0JCQlwaGFzZXMuYWRkKG5ldyBVbmluc3RhbGwoNTApKTsKLQkJaWYgKChQSEFTRV9QUk9QRVJUWSAmIGV4Y2x1ZGUpICE9IFBIQVNFX1BST1BFUlRZKQotCQkJcGhhc2VzLmFkZChuZXcgUHJvcGVydHkoMSkpOwotCQlpZiAoKFBIQVNFX0NIRUNLX1RSVVNUICYgZXhjbHVkZSkgIT0gUEhBU0VfQ0hFQ0tfVFJVU1QpCi0JCQlwaGFzZXMuYWRkKG5ldyBDaGVja1RydXN0KDEwKSk7Ci0JCWlmICgoUEhBU0VfSU5TVEFMTCAmIGV4Y2x1ZGUpICE9IFBIQVNFX0lOU1RBTEwpCi0JCQlwaGFzZXMuYWRkKG5ldyBJbnN0YWxsKDUwKSk7Ci0JCWlmICgoUEhBU0VfQ09ORklHVVJFICYgZXhjbHVkZSkgIT0gUEhBU0VfQ09ORklHVVJFKQotCQkJcGhhc2VzLmFkZChuZXcgQ29uZmlndXJlKDEwKSk7Ci0JCXJldHVybiBuZXcgRGVmYXVsdFBoYXNlU2V0KChQaGFzZVtdKSBwaGFzZXMudG9BcnJheShuZXcgUGhhc2VbcGhhc2VzLnNpemUoKV0pKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9FbmdpbmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0VuZ2luZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWQ3MTY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0VuZ2luZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci0KLXB1YmxpYyBjbGFzcyBFbmdpbmUgaW1wbGVtZW50cyBJRW5naW5lIHsKLQotCXByaXZhdGUgZmluYWwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzIGV2ZW50QnVzOwotCi0JcHVibGljIEVuZ2luZShJUHJvdmlzaW9uaW5nRXZlbnRCdXMgZXZlbnRCdXMpIHsKLQkJdGhpcy5ldmVudEJ1cyA9IGV2ZW50QnVzOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHBlcmZvcm0oSVByb2ZpbGUgaXByb2ZpbGUsIFBoYXNlU2V0IHBoYXNlU2V0LCBPcGVyYW5kW10gb3BlcmFuZHMsIFByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJLy8gVE9ETyAtLSBNZXNzYWdlcwotCQlpZiAoaXByb2ZpbGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMubnVsbF9wcm9maWxlKTsKLQotCQlpZiAocGhhc2VTZXQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMubnVsbF9waGFzZXNldCk7Ci0KLQkJaWYgKG9wZXJhbmRzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLm51bGxfb3BlcmFuZHMpOwotCi0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQljb250ZXh0ID0gbmV3IFByb3Zpc2lvbmluZ0NvbnRleHQoKTsKLQotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLQkJUHJvZmlsZSBwcm9maWxlID0gKFByb2ZpbGUpIGlwcm9maWxlOwotCQlTaW1wbGVQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKFNpbXBsZVByb2ZpbGVSZWdpc3RyeSkgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEVuZ2luZUFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQotCQlwcm9maWxlUmVnaXN0cnkubG9ja1Byb2ZpbGUocHJvZmlsZSk7Ci0JCXRyeSB7Ci0JCQlldmVudEJ1cy5wdWJsaXNoRXZlbnQobmV3IEJlZ2luT3BlcmF0aW9uRXZlbnQocHJvZmlsZSwgcGhhc2VTZXQsIG9wZXJhbmRzLCB0aGlzKSk7Ci0KLQkJCUVuZ2luZVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBFbmdpbmVTZXNzaW9uKHByb2ZpbGUsIGNvbnRleHQpOwotCi0JCQlNdWx0aVN0YXR1cyByZXN1bHQgPSBwaGFzZVNldC5wZXJmb3JtKHNlc3Npb24sIHByb2ZpbGUsIG9wZXJhbmRzLCBjb250ZXh0LCBtb25pdG9yKTsKLQkJCWlmIChyZXN1bHQubWF0Y2hlcyhJU3RhdHVzLkVSUk9SIHwgSVN0YXR1cy5DQU5DRUwpKSB7Ci0JCQkJZXZlbnRCdXMucHVibGlzaEV2ZW50KG5ldyBSb2xsYmFja09wZXJhdGlvbkV2ZW50KHByb2ZpbGUsIHBoYXNlU2V0LCBvcGVyYW5kcywgdGhpcywgcmVzdWx0KSk7Ci0JCQkJc2Vzc2lvbi5yb2xsYmFjaygpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAocHJvZmlsZS5pc0NoYW5nZWQoKSkgewotCQkJCQlwcm9maWxlUmVnaXN0cnkudXBkYXRlUHJvZmlsZShwcm9maWxlKTsKLQkJCQl9Ci0JCQkJZXZlbnRCdXMucHVibGlzaEV2ZW50KG5ldyBDb21taXRPcGVyYXRpb25FdmVudChwcm9maWxlLCBwaGFzZVNldCwgb3BlcmFuZHMsIHRoaXMpKTsKLQkJCQlzZXNzaW9uLmNvbW1pdCgpOwotCQkJfQotCQkJLy9pZiB0aGVyZSBpcyBvbmx5IG9uZSBjaGlsZCBzdGF0dXMsIHJldHVybiB0aGF0IHN0YXR1cyBpbnN0ZWFkIGJlY2F1c2UgaXQgd2lsbCBoYXZlIG1vcmUgY29udGV4dAotCQkJSVN0YXR1c1tdIGNoaWxkcmVuID0gcmVzdWx0LmdldENoaWxkcmVuKCk7Ci0JCQlyZXR1cm4gY2hpbGRyZW4ubGVuZ3RoID09IDEgPyBjaGlsZHJlblswXSA6IHJlc3VsdDsKLQkJfSBmaW5hbGx5IHsKLQkJCXByb2ZpbGVSZWdpc3RyeS51bmxvY2tQcm9maWxlKHByb2ZpbGUpOwotCQkJcHJvZmlsZS5zZXRDaGFuZ2VkKGZhbHNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0VuZ2luZVNlc3Npb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0VuZ2luZVNlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1ODYyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9FbmdpbmVTZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmUuRW5naW5lQWN0aXZhdG9yOwotCi1wdWJsaWMgY2xhc3MgRW5naW5lU2Vzc2lvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBBY3Rpb25zUmVjb3JkIHsKLQkJT3BlcmFuZCBvcGVyYW5kOwotCQlMaXN0IGFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQWN0aW9uc1JlY29yZChPcGVyYW5kIG9wZXJhbmQpIHsKLQkJCXRoaXMub3BlcmFuZCA9IG9wZXJhbmQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgcGhhc2VBY3Rpb25SZWNvcmRzUGFpcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIFBoYXNlIGN1cnJlbnRQaGFzZTsKLQlwcml2YXRlIExpc3QgY3VycmVudEFjdGlvblJlY29yZHM7Ci0JcHJpdmF0ZSBBY3Rpb25zUmVjb3JkIGN1cnJlbnRSZWNvcmQ7Ci0KLQlwcml2YXRlIElQcm9maWxlIHByb2ZpbGU7Ci0KLQlwcml2YXRlIFByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dDsKLQotCXB1YmxpYyBFbmdpbmVTZXNzaW9uKElQcm9maWxlIHByb2ZpbGUsIFByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCkgewotCQl0aGlzLnByb2ZpbGUgPSBwcm9maWxlOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKLQkJcGhhc2VBY3Rpb25SZWNvcmRzUGFpcnMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgTXVsdGlTdGF0dXMgcm9sbGJhY2soKSB7Ci0JCU11bHRpU3RhdHVzIHJlc3VsdCA9IG5ldyBNdWx0aVN0YXR1cyhFbmdpbmVBY3RpdmF0b3IuSUQsIElTdGF0dXMuT0ssIG51bGwsIG51bGwpOwotCQlpZiAoY3VycmVudFBoYXNlICE9IG51bGwpIHsKLQkJCXJvbGxCYWNrUGhhc2UoY3VycmVudFBoYXNlLCBjdXJyZW50QWN0aW9uUmVjb3Jkcyk7Ci0JCQljdXJyZW50UGhhc2UgPSBudWxsOwotCQkJY3VycmVudEFjdGlvblJlY29yZHMgPSBudWxsOwotCQkJY3VycmVudFJlY29yZCA9IG51bGw7Ci0JCX0KLQotCQlmb3IgKExpc3RJdGVyYXRvciBpdCA9IHBoYXNlQWN0aW9uUmVjb3Jkc1BhaXJzLmxpc3RJdGVyYXRvcihwaGFzZUFjdGlvblJlY29yZHNQYWlycy5zaXplKCkpOyBpdC5oYXNQcmV2aW91cygpOykgewotCQkJT2JqZWN0W10gcGFpciA9IChPYmplY3RbXSkgaXQucHJldmlvdXMoKTsKLQkJCVBoYXNlIHBoYXNlID0gKFBoYXNlKSBwYWlyWzBdOwotCQkJTGlzdCBhY3Rpb25SZWNvcmRzID0gKExpc3QpIHBhaXJbMV07Ci0JCQlyb2xsQmFja1BoYXNlKHBoYXNlLCBhY3Rpb25SZWNvcmRzKTsKLQkJfQotCQlwaGFzZUFjdGlvblJlY29yZHNQYWlycy5jbGVhcigpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTXVsdGlTdGF0dXMgcm9sbEJhY2tQaGFzZShQaGFzZSBwaGFzZSwgTGlzdCBhY3Rpb25SZWNvcmRzKSB7Ci0JCU11bHRpU3RhdHVzIHJlc3VsdCA9IG5ldyBNdWx0aVN0YXR1cyhFbmdpbmVBY3RpdmF0b3IuSUQsIElTdGF0dXMuT0ssIG51bGwsIG51bGwpOwotCi0JCWlmIChwaGFzZSAhPSBjdXJyZW50UGhhc2UpCi0JCQlwaGFzZS5wcmVQZXJmb3JtKHJlc3VsdCwgcHJvZmlsZSwgY29udGV4dCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJZm9yIChMaXN0SXRlcmF0b3IgaXQgPSBhY3Rpb25SZWNvcmRzLmxpc3RJdGVyYXRvcihhY3Rpb25SZWNvcmRzLnNpemUoKSk7IGl0Lmhhc1ByZXZpb3VzKCk7KSB7Ci0JCQlBY3Rpb25zUmVjb3JkIHJlY29yZCA9IChBY3Rpb25zUmVjb3JkKSBpdC5wcmV2aW91cygpOwotCQkJUHJvdmlzaW9uaW5nQWN0aW9uW10gYWN0aW9ucyA9IChQcm92aXNpb25pbmdBY3Rpb25bXSkgcmVjb3JkLmFjdGlvbnMudG9BcnJheShuZXcgUHJvdmlzaW9uaW5nQWN0aW9uW3JlY29yZC5hY3Rpb25zLnNpemUoKV0pOwotCQkJcGhhc2UudW5kbyhyZXN1bHQsIHRoaXMsIHByb2ZpbGUsIHJlY29yZC5vcGVyYW5kLCBhY3Rpb25zLCBjb250ZXh0KTsKLQkJfQotCQlwaGFzZS5wb3N0UGVyZm9ybShyZXN1bHQsIHByb2ZpbGUsIGNvbnRleHQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXZvaWQgcmVjb3JkUGhhc2VTdGFydChQaGFzZSBwaGFzZSkgewotCQlpZiAocGhhc2UgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZXMubnVsbF9waGFzZSk7Ci0KLQkJaWYgKGN1cnJlbnRQaGFzZSAhPSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5waGFzZV9zdGFydGVkKTsKLQotCQljdXJyZW50UGhhc2UgPSBwaGFzZTsKLQkJY3VycmVudEFjdGlvblJlY29yZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0Jdm9pZCByZWNvcmRQaGFzZUVuZChQaGFzZSBwaGFzZSkgewotCQlpZiAoY3VycmVudFBoYXNlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLnBoYXNlX25vdF9zdGFydGVkKTsKLQotCQlpZiAoY3VycmVudFBoYXNlICE9IHBoYXNlKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5ub3RfY3VycmVudF9waGFzZSk7Ci0KLQkJcGhhc2VBY3Rpb25SZWNvcmRzUGFpcnMuYWRkKG5ldyBPYmplY3RbXSB7Y3VycmVudFBoYXNlLCBjdXJyZW50QWN0aW9uUmVjb3Jkc30pOwotCQljdXJyZW50UGhhc2UgPSBudWxsOwotCQljdXJyZW50QWN0aW9uUmVjb3JkcyA9IG51bGw7Ci0JCWN1cnJlbnRSZWNvcmQgPSBudWxsOwotCX0KLQotCXZvaWQgcmVjb3JkQWN0aW9uKFByb3Zpc2lvbmluZ0FjdGlvbiBhY3Rpb24sIE9wZXJhbmQgb3BlcmFuZCkgewotCQlpZiAoYWN0aW9uID09IG51bGwgfHwgb3BlcmFuZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5hY3Rpb25fb3JfaXVfb3BlcmFuZF9udWxsKTsKLQotCQlpZiAoY3VycmVudFJlY29yZCA9PSBudWxsIHx8IG9wZXJhbmQgIT0gY3VycmVudFJlY29yZC5vcGVyYW5kKSB7Ci0JCQljdXJyZW50UmVjb3JkID0gbmV3IEFjdGlvbnNSZWNvcmQob3BlcmFuZCk7Ci0JCQljdXJyZW50QWN0aW9uUmVjb3Jkcy5hZGQoY3VycmVudFJlY29yZCk7Ci0JCX0KLQkJY3VycmVudFJlY29yZC5hY3Rpb25zLmFkZChhY3Rpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0lFbmdpbmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0lFbmdpbmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBlYjM5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9JRW5naW5lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IEJhbmQgWEkgSW50ZXJuYXRpb25hbCwgTExDIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCYW5kIFhJIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotcHVibGljIGludGVyZmFjZSBJRW5naW5lIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX05BTUUgPSBJRW5naW5lLmNsYXNzLmdldE5hbWUoKTsKLQotCXB1YmxpYyBJU3RhdHVzIHBlcmZvcm0oSVByb2ZpbGUgcHJvZmlsZSwgUGhhc2VTZXQgcGhhc2VTZXQsIE9wZXJhbmRbXSBvcGVyYW5kcywgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9JUHJvZmlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvSVByb2ZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwOWNhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9JUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuKjsKLQotcHVibGljIGludGVyZmFjZSBJUHJvZmlsZSBleHRlbmRzIElRdWVyeWFibGUgewotCi0JLyoqCi0JICogUHJvZmlsZSBwcm9wZXJ0eSBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBmbGF2b3IgZm9yIHRoZSBwcm9maWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRkxBVk9SID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZmxhdm9yIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFByb2ZpbGUgcHJvcGVydHkgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgaW5zdGFsbCBmb2xkZXIgZm9yIHRoZSBwcm9maWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSU5TVEFMTF9GT0xERVIgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsRm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFByb2ZpbGUgcHJvcGVydHkgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgY29uZmlndXJhdGlvbiBmb2xkZXIgZm9yIHRoZSBwcm9maWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQ09ORklHVVJBVElPTl9GT0xERVIgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25maWd1cmF0aW9uRm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFByb2ZpbGUgcHJvcGVydHkgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGxhdW5jaGVyIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlIHByb2ZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9MQVVOQ0hFUl9DT05GSUdVUkFUSU9OID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIubGF1bmNoZXJDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJvZmlsZSBwcm9wZXJ0eSBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBpbnN0YWxsZWQgbGFuZ3VhZ2UocykgZm9yIHRoZSBwcm9maWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfTkwgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5ubCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBQcm9maWxlIHByb3BlcnR5IGNvbnN0YW50IGZvciBhIHN0cmluZyBwcm9wZXJ0eSBpbmRpY2F0aW5nIGEgdXNlciB2aXNpYmxlIHNob3J0IAotCSAqIHRleHR1YWwgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9maWxlLiBNYXkgYmUgZW1wdHkgb3IgPGNvZGU+bnVsbDwvY29kZT4sIGFuZCAKLQkgKiBnZW5lcmFsbHkgd2lsbCBiZSBmb3Igbm9uLXRvcCBsZXZlbCBpbnN0YWxsIGNvbnRleHRzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfREVTQ1JJUFRJT04gPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBQcm9maWxlIHByb3BlcnR5IGNvbnN0YW50IGZvciBhIHN0cmluZyBwcm9wZXJ0eSBpbmRpY2F0aW5nIGEgdXNlciB2aXNpYmxlIG5hbWUgb2YgdGhpcyBwcm9maWxlLgotCSAqIE1heSBiZSBlbXB0eSBvciA8Y29kZT5udWxsPC9jb2RlPiwgYW5kIGdlbmVyYWxseSB3aWxsIGJlIGZvciBub24tdG9wIGxldmVsCi0JICogaW5zdGFsbCBjb250ZXh0cy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIFByb2ZpbGUgcHJvcGVydHkgY29uc3RhbnQgaW5kaWNhdGluZyB0aGUgbGlzdCBvZiBlbnZpcm9ubWVudHMKLQkgKiAoZS5nLiwgT1MsIFdTLCAuLi4pIGluIHdoaWNoIGEgcHJvZmlsZSBjYW4gb3BlcmF0ZS4gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotCSAqIGlzIGEgY29tbWEtZGVsaW1pdGVkIHN0cmluZyBvZiBrZXkvdmFsdWUgcGFpcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9FTlZJUk9OTUVOVFMgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbnZpcm9ubWVudHMiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUHJvZmlsZSBwcm9wZXJ0eSBjb25zdGFudCBmb3IgYSBib29sZWFuIHByb3BlcnR5IGluZGljYXRpbmcgaWYgdGhlIHByb2ZpbGluZwotCSAqIGlzIHJvYW1pbmcuICBBIHJvYW1pbmcgcHJvZmlsZSBpcyBvbmUgd2hvc2UgcGh5c2ljYWwgaW5zdGFsbCBsb2NhdGlvbiB2YXJpZXMKLQkgKiBhbmQgaXMgdXBkYXRlZCB3aGVuZXZlciBpdCBydW5zLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfUk9BTUlORyA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJvYW1pbmciOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogUHJvZmlsZSBwcm9wZXJ0eSBjb25zdGFudCBpbmRpY2F0aW5nIHRoZSBidW5kbGUgcG9vbCBjYWNoZSBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0NBQ0hFID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuY2FjaGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQcm9maWxlIHByb3BlcnR5IGNvbnN0YW50IGluZGljYXRpbmcgYSBzaGFyZWQgcmVhZC1vbmx5IGJ1bmRsZSBwb29sIGNhY2hlIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfU0hBUkVEX0NBQ0hFID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuY2FjaGUuc2hhcmVkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJvZmlsZSBwcm9wZXJ0eSBjb25zdGFudCBmb3IgYSBib29sZWFuIHByb3BlcnR5IGluZGljYXRpbmcgaWYgdXBkYXRlIGZlYXR1cmVzIHNob3VsZAotCSAqIGJlIGluc3RhbGxlZCBpbiB0aGlzIHByb2ZpbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0lOU1RBTExfRkVBVFVSRVMgPSAib3JnLmVjbGlwc2UudXBkYXRlLmluc3RhbGwuZmVhdHVyZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVJZCgpOwotCi0JcHVibGljIElQcm9maWxlIGdldFBhcmVudFByb2ZpbGUoKTsKLQotCS8qCi0JICogCUEgcHJvZmlsZSBpcyBhIHJvb3QgcHJvZmlsZSBpZiBpdCBpcyBub3QgYSBzdWItcHJvZmlsZQotCSAqIAlvZiBhbm90aGVyIHByb2ZpbGUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSb290UHJvZmlsZSgpOwotCi0JcHVibGljIGJvb2xlYW4gaGFzU3ViUHJvZmlsZXMoKTsKLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTdWJQcm9maWxlSWRzKCk7Ci0KLQkvKioKLQkgKiAJR2V0IHRoZSBzdG9yZWQgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXkuCi0JICogCUlmIHRoZSBwcm9maWxlIGlzIGEgc3ViLXByb2ZpbGUgYW5kIHRoZXJlIGlzIG5vIHZhbHVlCi0JICogCWxvY2FsbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIHRoZW4gdGhlIGNoYWluCi0JICogCW9mIHBhcmVudCBwcm9maWxlcyB3aWxsIGJlIHRyYXZlcnNlZCB0byBnZXQgYW4gYXNzb2NpYXRlZAotCSAqICB2YWx1ZSBmcm9tIHRoZSBuZWFyZXN0IGFuY2VzdG9yLgotCSAqICAKLQkgKiAgPGNvZGU+bnVsbDwvY29kZT4gaXMgcmV0dXJuIGlmIG5vbmUgb2YgdGhpcyBwcm9maWxlCi0JICogIG9yIGl0cyBhbmNlc3RvcnMgYXNzb2NpYXRlcyBhIHZhbHVlIHdpdGggdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXkpOwotCi0JLyoqCi0JICogCUdldCB0aGUgc3RvcmVkIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4ga2V5Ci0JICogCWluIHRoaXMgcHJvZmlsZS4KLQkgKiAJTm8gdHJhdmVyc2FsIG9mIHRoZSBhbmNlc3RvciBoaWVyYXJjaHkgaXMgZG9uZQotCSAqIAlmb3Igc3ViLXByb2ZpbGVzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxQcm9wZXJ0eShTdHJpbmcga2V5KTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFsbGFibGVVbml0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdCBpdSwgU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBHZXQgYW4gPGk+dW5tb2RpZmlhYmxlIGNvcHk8L2k+IG9mIHRoZSBsb2NhbCBwcm9wZXJ0aWVzCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9maWxlLgotCSAqIAotCSAqIEByZXR1cm4gYW4gPGk+dW5tb2RpZmlhYmxlIGNvcHk8L2k+IG9mIHRoZSBQcm9maWxlIHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIE1hcCBnZXRMb2NhbFByb3BlcnRpZXMoKTsKLQotCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcygpOwotCi0JcHVibGljIE1hcCBnZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKElJbnN0YWxsYWJsZVVuaXQgaXUpOwotCi0JcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCk7Ci0KLQlwdWJsaWMgQ29sbGVjdG9yIGF2YWlsYWJsZShRdWVyeSBxdWVyeSwgQ29sbGVjdG9yIGNvbGxlY3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0lQcm9maWxlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0lQcm9maWxlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwM2ZmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9JUHJvZmlsZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci0KLS8qKgotICogVGhpcyBlbmNhcHN1bGF0ZXMgdGhlIGFjY2VzcyB0byB0aGUgcHJvZmlsZSByZWdpc3RyeS4gCi0gKiBJdCBkZWFscyB3aXRoIHBlcnNpc3RlbmNlIGluIGEgdHJhbnNwYXJlbnQgd2F5LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9maWxlUmVnaXN0cnkgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEYgPSAiX1NFTEZfIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBwcm9maWxlIGluIHRoZSByZWdpc3RyeSB0aGF0IGhhcyB0aGUgZ2l2ZW4gaWQuIElmIGl0IGRvZXMgbm90IGV4aXN0LCAKLQkgKiB0aGVuIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIHByb2ZpbGUgaWRlbnRpZmllcgotCSAqIEByZXR1cm4gdGhlIHByb2ZpbGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlJUHJvZmlsZSBnZXRQcm9maWxlKFN0cmluZyBpZCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gYXJyYXkgb2YgcHJvZmlsZXMga25vd24gdG8gdGhpcyByZWdpc3RyeS4gSWYgdGhlcmUgYXJlIG5vbmUsIHRoZW4KLQkgKiByZXR1cm4gYW4gZW1wdHkgYXJyYXkuCi0JICogCi0JICogQHJldHVybiB0aGUgYXJyYXkgb2YgcHJvZmlsZXMKLQkgKi8KLQlJUHJvZmlsZVtdIGdldFByb2ZpbGVzKCk7Ci0KLQkvKioKLQkgKiBBZGQgdGhlIGdpdmVuIHByb2ZpbGUgdG8gdGhpcyBwcm9maWxlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpZCB0aGUgcHJvZmlsZSBpZAotCSAqIAotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIGlmIGEgcHJvZmlsZQotCSAqICAgICAgICAgd2l0aCB0aGUgc2FtZSBpZCBpcyBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIHJlZ2lzdHJ5LgotCSAqLwotCUlQcm9maWxlIGFkZFByb2ZpbGUoU3RyaW5nIGlkKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQWRkIHRoZSBnaXZlbiBwcm9maWxlIHRvIHRoaXMgcHJvZmlsZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIHByb2ZpbGUgaWQKLQkgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgcHJvZmlsZSBwcm9wZXJ0aWVzCi0JICogCi0JICogQHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gaWYgYSBwcm9maWxlCi0JICogICAgICAgICB3aXRoIHRoZSBzYW1lIGlkIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcmVnaXN0cnkuCi0JICovCi0JSVByb2ZpbGUgYWRkUHJvZmlsZShTdHJpbmcgaWQsIE1hcCBwcm9wZXJ0aWVzKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQWRkIHRoZSBnaXZlbiBwcm9maWxlIHRvIHRoaXMgcHJvZmlsZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIHByb2ZpbGUgaWQKLQkgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgcHJvZmlsZSBwcm9wZXJ0aWVzCi0JICogQHBhcmFtIHBhcmVudElkIHRoZSBpZCBvZiBhIHBhcmVudCBwcm9maWxlCi0JICogCi0JICogQHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gaWYgYSBwcm9maWxlCi0JICogICAgICAgICB3aXRoIHRoZSBzYW1lIGlkIGlzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgcmVnaXN0cnkgb3IgdGhlIHBhcmVudElkIGlzIG5vdCBhIHJlZ2lzdGVyZWQgUHJvZmlsZS4KLQkgKi8KLQlJUHJvZmlsZSBhZGRQcm9maWxlKFN0cmluZyBpZCwgTWFwIHByb3BlcnRpZXMsIFN0cmluZyBwYXJlbnRJZCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJlbW92ZSB0aGUgZ2l2ZW4gcHJvZmlsZSBmcm9tIHRoaXMgcHJvZmlsZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgdGhlIHByb2ZpbGUgdG8gcmVtb3ZlCi0JICovCi0Jdm9pZCByZW1vdmVQcm9maWxlKFN0cmluZyBpZCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9JU3Vycm9nYXRlUHJvZmlsZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0lTdXJyb2dhdGVQcm9maWxlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmQ2ZTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0lTdXJyb2dhdGVQcm9maWxlSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lLlByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLQotcHVibGljIGludGVyZmFjZSBJU3Vycm9nYXRlUHJvZmlsZUhhbmRsZXIgewotCi0JcHVibGljIGFic3RyYWN0IFByb2ZpbGUgY3JlYXRlUHJvZmlsZShTdHJpbmcgaWQpOwotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNTdXJyb2dhdGUoSVByb2ZpbGUgcHJvZmlsZSk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgQ29sbGVjdG9yIHF1ZXJ5UHJvZmlsZShJUHJvZmlsZSBwcm9maWxlLCBRdWVyeSBxdWVyeSwgQ29sbGVjdG9yIGNvbGxlY3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHVwZGF0ZVByb2ZpbGUoUHJvZmlsZSBzZWxmUHJvZmlsZSk7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9JbnN0YWxsYWJsZVVuaXRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvSW5zdGFsbGFibGVVbml0RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmZDkyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9JbnN0YWxsYWJsZVVuaXRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsYWJsZVVuaXRFdmVudCBleHRlbmRzIEV2ZW50T2JqZWN0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTklOU1RBTEwgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU1RBTEwgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMzMTg3MTI4MTg4MTE0NTk4ODZMOwotCi0JcHJpdmF0ZSBTdHJpbmcgcGhhc2VJZDsKLQlwcml2YXRlIGJvb2xlYW4gcHJlUGhhc2U7Ci0KLQlwcml2YXRlIElQcm9maWxlIHByb2ZpbGU7Ci0JcHJpdmF0ZSBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQ7Ci0JcHJpdmF0ZSBUb3VjaHBvaW50IHRvdWNocG9pbnQ7Ci0JcHJpdmF0ZSBJU3RhdHVzIHJlc3VsdDsKLQlwcml2YXRlIGludCB0eXBlOwotCi0JcHVibGljIEluc3RhbGxhYmxlVW5pdEV2ZW50KFN0cmluZyBwaGFzZUlkLCBib29sZWFuIHByZVBoYXNlLCBJUHJvZmlsZSBwcm9maWxlLCBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQsIGludCB0eXBlLCBUb3VjaHBvaW50IHRvdWNocG9pbnQpIHsKLQkJdGhpcyhwaGFzZUlkLCBwcmVQaGFzZSwgcHJvZmlsZSwgb3BlcmFuZCwgdHlwZSwgdG91Y2hwb2ludCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEluc3RhbGxhYmxlVW5pdEV2ZW50KFN0cmluZyBwaGFzZUlkLCBib29sZWFuIHByZVBoYXNlLCBJUHJvZmlsZSBwcm9maWxlLCBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQsIGludCB0eXBlLCBUb3VjaHBvaW50IHRvdWNocG9pbnQsIElTdGF0dXMgcmVzdWx0KSB7Ci0JCXN1cGVyKHRvdWNocG9pbnQpOyAvL1RPRE8gbm90IHN1cmUgaWYgdGhlIHRvdWNocG9pbnQgc2hvdWxkIGJlIHRoZSBzb3VyY2UKLQkJdGhpcy5waGFzZUlkID0gcGhhc2VJZDsKLQkJdGhpcy5wcmVQaGFzZSA9IHByZVBoYXNlOwotCQl0aGlzLnByb2ZpbGUgPSBwcm9maWxlOwotCQl0aGlzLm9wZXJhbmQgPSBvcGVyYW5kOwotCQlpZiAodHlwZSAhPSBVTklOU1RBTEwgJiYgdHlwZSAhPSBJTlNUQUxMKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5JbnN0YWxsYWJsZVVuaXRFdmVudF90eXBlX25vdF9pbnN0YWxsX29yX3VuaW5zdGFsbCk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMucmVzdWx0ID0gcmVzdWx0OwotCi0JfQotCi0JcHVibGljIFRvdWNocG9pbnQgZ2V0VG91Y2hwb2ludCgpIHsKLQkJcmV0dXJuIHRvdWNocG9pbnQ7Ci0JfQotCi0JcHVibGljIElQcm9maWxlIGdldFByb2ZpbGUoKSB7Ci0JCXJldHVybiBwcm9maWxlOwotCX0KLQotCXB1YmxpYyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIGdldE9wZXJhbmQoKSB7Ci0JCXJldHVybiBvcGVyYW5kOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGhhc2UoKSB7Ci0JCXJldHVybiBwaGFzZUlkOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJlKCkgewotCQlyZXR1cm4gcHJlUGhhc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNQb3N0KCkgewotCQlyZXR1cm4gIXByZVBoYXNlOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIChyZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IFN0YXR1cy5PS19TVEFUVVMpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW5zdGFsbCgpIHsKLQkJcmV0dXJuIHR5cGUgPT0gSU5TVEFMTDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1VuaW5zdGFsbCgpIHsKLQkJcmV0dXJuIHR5cGUgPT0gVU5JTlNUQUxMOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0luc3RhbGxhYmxlVW5pdE9wZXJhbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0luc3RhbGxhYmxlVW5pdE9wZXJhbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2OWQ0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9JbnN0YWxsYWJsZVVuaXRPcGVyYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLQotcHVibGljIGNsYXNzIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgZXh0ZW5kcyBPcGVyYW5kIHsKLQlwcml2YXRlIGZpbmFsIElJbnN0YWxsYWJsZVVuaXQgZmlyc3Q7Ci0JcHJpdmF0ZSBmaW5hbCBJSW5zdGFsbGFibGVVbml0IHNlY29uZDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgb3BlcmFuZCB0aGF0IHJlcHJlc2VudHMgcmVwbGFjaW5nIGFuIGluc3RhbGxhYmxlIHVuaXQKLQkgKiB3aXRoIGFub3RoZXIuIEF0IGxlYXN0IG9uZSBvZiB0aGUgcHJvdmlkZWQgaW5zdGFsbGFibGUgdW5pdHMgbXVzdCBiZQotCSAqIG5vbi1udWxsLgotCSAqIAotCSAqIEBwYXJhbSBmaXJzdCBUaGUgaW5zdGFsbGFibGUgdW5pdCBiZWluZyByZW1vdmVkLCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBzZWNvbmQgVGhlIGluc3RhbGxhYmxlIHVuaXQgYmVpbmcgYWRkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQoSUluc3RhbGxhYmxlVW5pdCBmaXJzdCwgSUluc3RhbGxhYmxlVW5pdCBzZWNvbmQpIHsKLQkJLy90aGUgb3BlcmFuZCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIG5vbi1udWxsIHVuaXRzCi0JCUFzc2VydC5pc1RydWUoZmlyc3QgIT0gbnVsbCB8fCBzZWNvbmQgIT0gbnVsbCk7Ci0JCXRoaXMuZmlyc3QgPSBmaXJzdDsKLQkJdGhpcy5zZWNvbmQgPSBzZWNvbmQ7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXQgZmlyc3QoKSB7Ci0JCXJldHVybiBmaXJzdDsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdCBzZWNvbmQoKSB7Ci0JCXJldHVybiBzZWNvbmQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGZpcnN0ICsgIiAtLT4gIiArIHNlY29uZDsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0luc3RhbGxhYmxlVW5pdFBoYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9JbnN0YWxsYWJsZVVuaXRQaGFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzlhZGQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0luc3RhbGxhYmxlVW5pdFBoYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFdpbmRSaXZlciAtIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjczNzIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEluc3RhbGxhYmxlVW5pdFBoYXNlIGV4dGVuZHMgUGhhc2UgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fQVJUSUZBQ1RfUkVRVUVTVFMgPSAiYXJ0aWZhY3RSZXF1ZXN0cyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX0FSVElGQUNUID0gImFydGlmYWN0IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fSVUgPSAiaXUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9UT1VDSFBPSU5UID0gInRvdWNocG9pbnQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgUHJvdmlzaW9uaW5nQ29udGV4dCBwcm92Q29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgdG91Y2hwb2ludFRvVG91Y2hwb2ludFBhcmFtZXRlcnM7Ci0KLQlwcm90ZWN0ZWQgSW5zdGFsbGFibGVVbml0UGhhc2UoU3RyaW5nIHBoYXNlSWQsIGludCB3ZWlnaHQpIHsKLQkJc3VwZXIocGhhc2VJZCwgd2VpZ2h0KTsKLQl9Ci0KLQl2b2lkIHBlcmZvcm0oTXVsdGlTdGF0dXMgc3RhdHVzLCBFbmdpbmVTZXNzaW9uIHNlc3Npb24sIElQcm9maWxlIHByb2ZpbGUsIE9wZXJhbmRbXSBvcGVyYW5kcywgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcHJvdkNvbnRleHQgPSBjb250ZXh0OwotCQl0b3VjaHBvaW50VG9Ub3VjaHBvaW50UGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3BlcmFuZHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghKG9wZXJhbmRzW2ldIGluc3RhbmNlb2YgSW5zdGFsbGFibGVVbml0T3BlcmFuZCkpCi0JCQkJY29udGludWU7Ci0KLQkJCUluc3RhbGxhYmxlVW5pdE9wZXJhbmQgaXVPcGVyYW5kID0gKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIG9wZXJhbmRzW2ldOwotCQkJVG91Y2hwb2ludFR5cGUgdHlwZSA9IGdldFRvdWNocG9pbnRUeXBlKGl1T3BlcmFuZCk7Ci0JCQlUb3VjaHBvaW50IHRvdWNocG9pbnQgPSBUb3VjaHBvaW50TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFRvdWNocG9pbnQodHlwZSk7Ci0JCQkvL2Fib3J0IHRoZSBlbnRpcmUgcGhhc2UgaWYgYW55IHJlcXVpcmVkIHRvdWNocG9pbnQgaXMgbWlzc2luZwotCQkJaWYgKHRvdWNocG9pbnQgPT0gbnVsbCkgewotCQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFbmdpbmVBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLnJlcXVpcmVkX3RvdWNocG9pbnRfbm90X2ZvdW5kLCB0eXBlKSwgbnVsbCkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmICghdG91Y2hwb2ludFRvVG91Y2hwb2ludFBhcmFtZXRlcnMuY29udGFpbnNLZXkodG91Y2hwb2ludCkpIHsKLQkJCQl0b3VjaHBvaW50VG9Ub3VjaHBvaW50UGFyYW1ldGVycy5wdXQodG91Y2hwb2ludCwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIucGVyZm9ybShzdGF0dXMsIHNlc3Npb24sIHByb2ZpbGUsIG9wZXJhbmRzLCBjb250ZXh0LCBtb25pdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBpbml0aWFsaXplUGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBNYXAgcGFyYW1ldGVycykgewotCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoRW5naW5lQWN0aXZhdG9yLklELCBJU3RhdHVzLk9LLCBudWxsLCBudWxsKTsKLQkJbWVyZ2VTdGF0dXMoc3RhdHVzLCBpbml0aWFsaXplSW5zdGFsbGFibGVVbml0UGhhc2UobW9uaXRvciwgcHJvZmlsZSwgcGFyYW1ldGVycykpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdG91Y2hwb2ludFRvVG91Y2hwb2ludFBhcmFtZXRlcnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFbnRyeSBlbnRyeSA9IChFbnRyeSkgaXQubmV4dCgpOwotCQkJVG91Y2hwb2ludCB0b3VjaHBvaW50ID0gKFRvdWNocG9pbnQpIGVudHJ5LmdldEtleSgpOwotCQkJTWFwIHRvdWNocG9pbnRQYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAocGFyYW1ldGVycyk7Ci0JCQl0b3VjaHBvaW50UGFyYW1ldGVycy5wdXQoUEFSTV9UT1VDSFBPSU5ULCB0b3VjaHBvaW50KTsKLQkJCW1lcmdlU3RhdHVzKHN0YXR1cywgdG91Y2hwb2ludC5pbml0aWFsaXplUGhhc2UobW9uaXRvciwgcHJvZmlsZSwgcGhhc2VJZCwgdG91Y2hwb2ludFBhcmFtZXRlcnMpKTsKLQkJCWVudHJ5LnNldFZhbHVlKHRvdWNocG9pbnRQYXJhbWV0ZXJzKTsKLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGNvbXBsZXRlUGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBNYXAgcGFyYW1ldGVycykgewotCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoRW5naW5lQWN0aXZhdG9yLklELCBJU3RhdHVzLk9LLCBudWxsLCBudWxsKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHRvdWNocG9pbnRUb1RvdWNocG9pbnRQYXJhbWV0ZXJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRW50cnkgZW50cnkgPSAoRW50cnkpIGl0Lm5leHQoKTsKLQkJCVRvdWNocG9pbnQgdG91Y2hwb2ludCA9IChUb3VjaHBvaW50KSBlbnRyeS5nZXRLZXkoKTsKLQkJCU1hcCB0b3VjaHBvaW50UGFyYW1ldGVycyA9IChNYXApIGVudHJ5LmdldFZhbHVlKCk7Ci0JCQltZXJnZVN0YXR1cyhzdGF0dXMsIHRvdWNocG9pbnQuY29tcGxldGVQaGFzZShtb25pdG9yLCBwcm9maWxlLCBwaGFzZUlkLCB0b3VjaHBvaW50UGFyYW1ldGVycykpOwotCQkJZW50cnkuc2V0VmFsdWUobnVsbCk7Ci0JCX0KLQkJbWVyZ2VTdGF0dXMoc3RhdHVzLCBjb21wbGV0ZUluc3RhbGxhYmxlVW5pdFBoYXNlKG1vbml0b3IsIHByb2ZpbGUsIHBhcmFtZXRlcnMpKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBpbml0aWFsaXplT3BlcmFuZChJUHJvZmlsZSBwcm9maWxlLCBPcGVyYW5kIG9wZXJhbmQsIE1hcCBwYXJhbWV0ZXJzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKCEob3BlcmFuZCBpbnN0YW5jZW9mIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZCBpdU9wZXJhbmQgPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgb3BlcmFuZDsKLQotCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoRW5naW5lQWN0aXZhdG9yLklELCBJU3RhdHVzLk9LLCBudWxsLCBudWxsKTsKLQkJbWVyZ2VTdGF0dXMoc3RhdHVzLCBpbml0aWFsaXplT3BlcmFuZChwcm9maWxlLCBpdU9wZXJhbmQsIHBhcmFtZXRlcnMsIG1vbml0b3IpKTsKLQkJVG91Y2hwb2ludCB0b3VjaHBvaW50ID0gZ2V0VG91Y2hwb2ludChpdU9wZXJhbmQpOwotCQlNYXAgdG91Y2hwb2ludFBhcmFtZXRlcnMgPSAoTWFwKSB0b3VjaHBvaW50VG9Ub3VjaHBvaW50UGFyYW1ldGVycy5nZXQodG91Y2hwb2ludCk7Ci0JCWlmICh0b3VjaHBvaW50UGFyYW1ldGVycyAhPSBudWxsKQotCQkJcGFyYW1ldGVycy5wdXRBbGwodG91Y2hwb2ludFBhcmFtZXRlcnMpOwotCQltZXJnZVN0YXR1cyhzdGF0dXMsIHRvdWNocG9pbnQuaW5pdGlhbGl6ZU9wZXJhbmQocHJvZmlsZSwgcGhhc2VJZCwgaXVPcGVyYW5kLCBwYXJhbWV0ZXJzKSk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgY29tcGxldGVPcGVyYW5kKElQcm9maWxlIHByb2ZpbGUsIE9wZXJhbmQgb3BlcmFuZCwgTWFwIHBhcmFtZXRlcnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAoIShvcGVyYW5kIGluc3RhbmNlb2YgSW5zdGFsbGFibGVVbml0T3BlcmFuZCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIGl1T3BlcmFuZCA9IChJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKSBvcGVyYW5kOwotCi0JCU11bHRpU3RhdHVzIHN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhFbmdpbmVBY3RpdmF0b3IuSUQsIElTdGF0dXMuT0ssIG51bGwsIG51bGwpOwotCQlUb3VjaHBvaW50IHRvdWNocG9pbnQgPSBnZXRUb3VjaHBvaW50KGl1T3BlcmFuZCk7Ci0JCW1lcmdlU3RhdHVzKHN0YXR1cywgdG91Y2hwb2ludC5jb21wbGV0ZU9wZXJhbmQocHJvZmlsZSwgcGhhc2VJZCwgaXVPcGVyYW5kLCBwYXJhbWV0ZXJzKSk7Ci0JCW1lcmdlU3RhdHVzKHN0YXR1cywgY29tcGxldGVPcGVyYW5kKHByb2ZpbGUsIGl1T3BlcmFuZCwgcGFyYW1ldGVycywgbW9uaXRvcikpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByb3RlY3RlZCBQcm92aXNpb25pbmdBY3Rpb25bXSBnZXRBY3Rpb25zKE9wZXJhbmQgb3BlcmFuZCkgewotCQlpZiAoIShvcGVyYW5kIGluc3RhbmNlb2YgSW5zdGFsbGFibGVVbml0T3BlcmFuZCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIGl1T3BlcmFuZCA9IChJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKSBvcGVyYW5kOwotCQlyZXR1cm4gZ2V0QWN0aW9ucyhpdU9wZXJhbmQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQXBwbGljYWJsZShPcGVyYW5kIG9wZXJhbmQpIHsKLQkJaWYgKCEob3BlcmFuZCBpbnN0YW5jZW9mIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUluc3RhbGxhYmxlVW5pdE9wZXJhbmQgaXVPcGVyYW5kID0gKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIG9wZXJhbmQ7Ci0JCXJldHVybiBpc0FwcGxpY2FibGUoaXVPcGVyYW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b3VjaHBvaW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9wZXJhbmQsIG9yIG51bGwgaWYgbm8gY29ycmVzcG9uZGluZwotCSAqIHRvdWNocG9pbnQgaXMgYXZhaWxhYmxlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgVG91Y2hwb2ludCBnZXRUb3VjaHBvaW50KEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCkgewotCQlyZXR1cm4gVG91Y2hwb2ludE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRUb3VjaHBvaW50KGdldFRvdWNocG9pbnRUeXBlKG9wZXJhbmQpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUb3VjaHBvaW50IGdldFRvdWNocG9pbnQoSUluc3RhbGxhYmxlVW5pdCB1bml0KSB7Ci0JCXJldHVybiBUb3VjaHBvaW50TWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldFRvdWNocG9pbnQodW5pdC5nZXRUb3VjaHBvaW50VHlwZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0b3VjaHBvaW50IHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgb3BlcmFuZC4gTmV2ZXIgcmV0dXJucyBudWxsLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgVG91Y2hwb2ludFR5cGUgZ2V0VG91Y2hwb2ludFR5cGUoSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcGVyYW5kKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdW5pdCA9IG9wZXJhbmQuc2Vjb25kKCk7Ci0JCWlmICh1bml0ID09IG51bGwpCi0JCQl1bml0ID0gb3BlcmFuZC5maXJzdCgpOwotCQlyZXR1cm4gdW5pdC5nZXRUb3VjaHBvaW50VHlwZSgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBQcm92aXNpb25pbmdBY3Rpb25bXSBnZXRBY3Rpb25zKElJbnN0YWxsYWJsZVVuaXQgdW5pdCwgU3RyaW5nIGtleSkgewotCQlTdHJpbmdbXSBpbnN0cnVjdGlvbnMgPSBnZXRJbnN0cnVjdGlvbnModW5pdCwga2V5KTsKLQkJaWYgKGluc3RydWN0aW9ucyA9PSBudWxsIHx8IGluc3RydWN0aW9ucy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlUb3VjaHBvaW50IHRvdWNocG9pbnQgPSBnZXRUb3VjaHBvaW50KHVuaXQpOwotCQkvL1RPRE8gTGlrZWx5IG5lZWQgdG8gcHJvcGFnYXRlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgdG91Y2hwb2ludCBpcyBub3QgcHJlc2VudAotCQlpZiAodG91Y2hwb2ludCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUluc3RydWN0aW9uUGFyc2VyIHBhcnNlciA9IG5ldyBJbnN0cnVjdGlvblBhcnNlcih0aGlzLCB0b3VjaHBvaW50KTsKLQkJTGlzdCBhY3Rpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluc3RydWN0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJYWN0aW9ucy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwYXJzZXIucGFyc2VBY3Rpb25zKGluc3RydWN0aW9uc1tpXSkpKTsKLQkJfQotCQlyZXR1cm4gKFByb3Zpc2lvbmluZ0FjdGlvbltdKSBhY3Rpb25zLnRvQXJyYXkobmV3IFByb3Zpc2lvbmluZ0FjdGlvblthY3Rpb25zLnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGdldEluc3RydWN0aW9ucyhJSW5zdGFsbGFibGVVbml0IHVuaXQsIFN0cmluZyBrZXkpIHsKLQkJVG91Y2hwb2ludERhdGFbXSBkYXRhID0gdW5pdC5nZXRUb3VjaHBvaW50RGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nW10gbWF0Y2hlcyA9IG5ldyBTdHJpbmdbZGF0YS5sZW5ndGhdOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCW1hdGNoZXNbY291bnRdID0gZGF0YVtpXS5nZXRJbnN0cnVjdGlvbnMoa2V5KTsKLQkJCWlmIChtYXRjaGVzW2NvdW50XSAhPSBudWxsKQotCQkJCWNvdW50Kys7Ci0JCX0KLQkJaWYgKGNvdW50ID09IGRhdGEubGVuZ3RoKQotCQkJcmV0dXJuIG1hdGNoZXM7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbY291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KG1hdGNoZXMsIDAsIHJlc3VsdCwgMCwgY291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBQcm92aXNpb25pbmdBY3Rpb24gZ2V0QWN0aW9uKFN0cmluZyBhY3Rpb25JZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJvdmlzaW9uaW5nQWN0aW9uW10gZ2V0QWN0aW9ucyhJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBcHBsaWNhYmxlKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBpbml0aWFsaXplSW5zdGFsbGFibGVVbml0UGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBNYXAgcGFyYW1ldGVycykgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBjb21wbGV0ZUluc3RhbGxhYmxlVW5pdFBoYXNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2ZpbGUgcHJvZmlsZSwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgaW5pdGlhbGl6ZU9wZXJhbmQoSVByb2ZpbGUgcHJvZmlsZSwgSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcGVyYW5kLCBNYXAgcGFyYW1ldGVycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGNvbXBsZXRlT3BlcmFuZChJUHJvZmlsZSBwcm9maWxlLCBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQsIE1hcCBwYXJhbWV0ZXJzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9JbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eU9wZXJhbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0luc3RhbGxhYmxlVW5pdFByb3BlcnR5T3BlcmFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTNkNjQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL0luc3RhbGxhYmxlVW5pdFByb3BlcnR5T3BlcmFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eU9wZXJhbmQgZXh0ZW5kcyBQcm9wZXJ0eU9wZXJhbmQgewotCXByaXZhdGUgZmluYWwgSUluc3RhbGxhYmxlVW5pdCBpdTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgb3BlcmFuZCB0aGF0IHJlcHJlc2VudHMgcmVwbGFjaW5nIGEgcHJvcGVydHkgdmFsdWUgYXNzb2NpYXRlZAotCSAqIHdpdGggYW4gSVUgd2l0aCBhbm90aGVyLiAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZQotCSAqIG5vbi1udWxsLgotCSAqIAotCSAqIEBwYXJhbSBpdSBUaGUgSUluc3RhbGxhYmxlVW5pdCB3aXRoIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyBhc3NvY2lhdGVkCi0JICogQHBhcmFtIGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSBiZWluZyBtb2RpZmllZAotCSAqIEBwYXJhbSBmaXJzdCBUaGUgcHJvcGVydHkgdmFsdWUgYmVpbmcgcmVtb3ZlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcGFyYW0gc2Vjb25kIFRoZSBwcm9wZXJ0eSB2YWx1ZSBiZWluZyBhZGRlZCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgSW5zdGFsbGFibGVVbml0UHJvcGVydHlPcGVyYW5kKElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyBrZXksIE9iamVjdCBmaXJzdCwgT2JqZWN0IHNlY29uZCkgewotCQlzdXBlcihrZXksIGZpcnN0LCBzZWNvbmQpOwotCQkvL3RoZSBpdSBtdXN0IGJlIHNwZWNpZmllZC4KLQkJQXNzZXJ0LmlzVHJ1ZShpdSAhPSBudWxsKTsKLQkJdGhpcy5pdSA9IGl1OwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IGdldEluc3RhbGxhYmxlVW5pdCgpIHsKLQkJcmV0dXJuIGl1OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiSUluc3RhbGxhYmxlVW5pdCBwcm9wZXJ0eSBmb3IgIiArIGl1LnRvU3RyaW5nKCkgKyBzdXBlci50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvTWVtZW50by5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjRjMTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL01lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotCi1wdWJsaWMgY2xhc3MgTWVtZW50byB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzI1NzM5OTczNjgzNzQ2MTU4NUw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBzaW1wbGVzID0gQXJyYXlzLmFzTGlzdChuZXcgQ2xhc3NbXSB7U3RyaW5nLmNsYXNzLCBJbnRlZ2VyLmNsYXNzLCBMb25nLmNsYXNzLCBGbG9hdC5jbGFzcywgRG91YmxlLmNsYXNzLCBCeXRlLmNsYXNzLCBTaG9ydC5jbGFzcywgQ2hhcmFjdGVyLmNsYXNzLCBCb29sZWFuLmNsYXNzfSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbiBzaW1wbGVBcnJheXMgPSBBcnJheXMuYXNMaXN0KG5ldyBDbGFzc1tdIHtTdHJpbmdbXS5jbGFzcywgSW50ZWdlcltdLmNsYXNzLCBMb25nW10uY2xhc3MsIEZsb2F0W10uY2xhc3MsIERvdWJsZVtdLmNsYXNzLCBCeXRlW10uY2xhc3MsIFNob3J0W10uY2xhc3MsIENoYXJhY3RlcltdLmNsYXNzLCBCb29sZWFuW10uY2xhc3N9KTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uIHByaW1pdGl2ZUFycmF5cyA9IEFycmF5cy5hc0xpc3QobmV3IENsYXNzW10ge2xvbmdbXS5jbGFzcywgaW50W10uY2xhc3MsIHNob3J0W10uY2xhc3MsIGNoYXJbXS5jbGFzcywgYnl0ZVtdLmNsYXNzLCBkb3VibGVbXS5jbGFzcywgZmxvYXRbXS5jbGFzcywgYm9vbGVhbltdLmNsYXNzfSk7Ci0KLQlNYXAgbWVtZW50b01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgT2JqZWN0IHJlbW92ZShTdHJpbmcga2V5KSB7Ci0JCWlmIChrZXkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCS8vIFRPRE86IHBlcnNpc3QgY2hhbmdlCi0JCXJldHVybiBtZW1lbnRvTWFwLnJlbW92ZShrZXkpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgcHV0KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgewotCQlpZiAoa2V5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQl2YWxpZGF0ZVZhbHVlKHZhbHVlKTsKLQotCQkvLyBUT0RPOiBwZXJzaXN0IGNoYW5nZQotCQlyZXR1cm4gbWVtZW50b01hcC5wdXQoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXQoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQlyZXR1cm4gbWVtZW50b01hcC5nZXQoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0S2V5cygpIHsKLQkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbigpIHsKLQkJCUl0ZXJhdG9yIGtleXNJdGVyYXRvciA9IG1lbWVudG9NYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQotCQkJcHVibGljIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgewotCQkJCXJldHVybiBrZXlzSXRlcmF0b3IuaGFzTmV4dCgpOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IG5leHRFbGVtZW50KCkgewotCQkJCXJldHVybiBrZXlzSXRlcmF0b3IubmV4dCgpOwotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVWYWx1ZShPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ2xhc3MgY2xhenogPSB2YWx1ZS5nZXRDbGFzcygpOwotCi0JCWlmIChzaW1wbGVzLmNvbnRhaW5zKGNsYXp6KSkKLQkJCXJldHVybjsKLQotCQlpZiAoc2ltcGxlQXJyYXlzLmNvbnRhaW5zKGNsYXp6KSB8fCBwcmltaXRpdmVBcnJheXMuY29udGFpbnMoY2xhenopKQotCQkJcmV0dXJuOwotCi0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oY2xhenouZ2V0TmFtZSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA0YTE0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLy9UT0RPIFNob3VsZG4ndCBoYXZlIG1lc3NhZ2VzIGNsYXNzIGluIEFQSSBwYWNrYWdlCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDZXJ0aWZpY2F0ZUNoZWNrZXJfQ2VydGlmaWNhdGVFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDZXJ0aWZpY2F0ZUNoZWNrZXJfQ2VydGlmaWNhdGVSZWplY3RlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDZXJ0aWZpY2F0ZUNoZWNrZXJfS2V5c3RvcmVDb25uZWN0aW9uRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2VydGlmaWNhdGVDaGVja2VyX1NpZ25lZENvbnRlbnRJT0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENlcnRpZmljYXRlQ2hlY2tlcl9TaWduZWRDb250ZW50RXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uX29yX2l1X29wZXJhbmRfbnVsbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBub3RfY3VycmVudF9waGFzZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBudWxsX29wZXJhbmRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG51bGxfcGhhc2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbnVsbF9waGFzZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbnVsbF9waGFzZXNldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBudWxsX3Byb2ZpbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVxdWlyZWRfdG91Y2hwb2ludF9ub3RfZm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGhhc2VfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGhhc2Vfbm90X3N0YXJ0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGhhc2Vfc3RhcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwaGFzZWlkX25vdF9wb3NpdGl2ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwaGFzZWlkX25vdF9zZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5naW5lX09wZXJhdGlvbl9DYW5jZWxlZF9CeV9Vc2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc3RhbGxhYmxlVW5pdEV2ZW50X3R5cGVfbm90X2luc3RhbGxfb3JfdW5pbnN0YWxsOwotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvT3BlcmFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvT3BlcmFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTdiMjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL09wZXJhbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZTsKLQotLyoqCi0gKiBUaGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIGVuZ2luZSBvcGVyYW5kcy4KLSAqIAotICogQHNlZSBJRW5naW5lI3BlcmZvcm0oSVByb2ZpbGUsIFBoYXNlU2V0LCBPcGVyYW5kW10sIFByb3Zpc2lvbmluZ0NvbnRleHQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotICovCi1wdWJsaWMgY2xhc3MgT3BlcmFuZCB7Ci0JLy8gbWFya2VyIGNsYXNzCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9QaGFzZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvUGhhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFkY2RlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9QaGFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lLkVuZ2luZUFjdGl2YXRvcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFBoYXNlIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX09QRVJBTkQgPSAib3BlcmFuZCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1BIQVNFX0lEID0gInBoYXNlSWQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9QUk9GSUxFID0gInByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9DT05URVhUID0gImNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHBoYXNlSWQ7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCB3ZWlnaHQ7Ci0JcHJvdGVjdGVkIGludCBwcmVQZXJmb3JtV29yayA9IDEwMDA7Ci0JcHJvdGVjdGVkIGludCBtYWluUGVyZm9ybVdvcmsgPSAxMDAwMDsKLQlwcm90ZWN0ZWQgaW50IHBvc3RQZXJmb3JtV29yayA9IDEwMDA7Ci0JcHJpdmF0ZSBNYXAgcGhhc2VQYXJhbWV0ZXJzOwotCi0JcHJvdGVjdGVkIFBoYXNlKFN0cmluZyBwaGFzZUlkLCBpbnQgd2VpZ2h0KSB7Ci0JCWlmIChwaGFzZUlkID09IG51bGwgfHwgcGhhc2VJZC5sZW5ndGgoKSA9PSAwKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlcy5waGFzZWlkX25vdF9zZXQpOwotCQlpZiAod2VpZ2h0IDw9IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLnBoYXNlaWRfbm90X3Bvc2l0aXZlKTsKLQkJdGhpcy53ZWlnaHQgPSB3ZWlnaHQ7Ci0JCXRoaXMucGhhc2VJZCA9IHBoYXNlSWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiAtICIgKyB0aGlzLndlaWdodDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBmaW5hbCBNdWx0aVN0YXR1cyBwZXJmb3JtKEVuZ2luZVNlc3Npb24gc2Vzc2lvbiwgSVByb2ZpbGUgcHJvZmlsZSwgT3BlcmFuZFtdIG9wZXJhbmRzLCBQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlNdWx0aVN0YXR1cyBzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoRW5naW5lQWN0aXZhdG9yLklELCBJU3RhdHVzLk9LLCBudWxsLCBudWxsKTsKLQkJdHJ5IHsKLQkJCXBlcmZvcm0oc3RhdHVzLCBzZXNzaW9uLCBwcm9maWxlLCBvcGVyYW5kcywgY29udGV4dCwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy8gInBlcmZvcm0iIGNhbGxzIHVzZXIgY29kZSBhbmQgbWlnaHQgdGhyb3cgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbgotCQkJLy8gd2UgY2F0Y2ggdGhlIGVycm9yIGhlcmUgdG8gZ2F0aGVyIGluZm9ybWF0aW9uIG9uIHdoZXJlIHRoZSBwcm9ibGVtIG9jY3VycmVkLgotCQkJc3RhdHVzLmFkZChuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEVuZ2luZUFjdGl2YXRvci5JRCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJfSBjYXRjaCAoTGlua2FnZUVycm9yIGUpIHsKLQkJCS8vIENhdGNoIGxpbmthZ2UgZXJyb3JzIGFzIHRoZXNlIGFyZSBnZW5lcmFsbHkgcmVjb3ZlcmFibGUgYnV0IGxldCBvdGhlciBFcnJvcnMgcHJvcGFnYXRlIChzZWUgYnVnIDIyMjAwMSkKLQkJCXN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBFbmdpbmVBY3RpdmF0b3IuSUQsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCX0KLQotCQlpZiAoc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5DQU5DRUwpKSB7Ci0JCQlNdWx0aVN0YXR1cyByZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMoRW5naW5lQWN0aXZhdG9yLklELCBJU3RhdHVzLkNBTkNFTCwgTWVzc2FnZXMuRW5naW5lX09wZXJhdGlvbl9DYW5jZWxlZF9CeV9Vc2VyLCBudWxsKTsKLQkJCXJlc3VsdC5tZXJnZShzdGF0dXMpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBlbHNlIGlmIChzdGF0dXMubWF0Y2hlcyhJU3RhdHVzLkVSUk9SKSkgewotCQkJTXVsdGlTdGF0dXMgcmVzdWx0ID0gbmV3IE11bHRpU3RhdHVzKEVuZ2luZUFjdGl2YXRvci5JRCwgSVN0YXR1cy5FUlJPUiwgZ2V0UHJvYmxlbU1lc3NhZ2UoKSwgbnVsbCk7Ci0JCQlyZXN1bHQubWVyZ2Uoc3RhdHVzKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQl2b2lkIHBlcmZvcm0oTXVsdGlTdGF0dXMgc3RhdHVzLCBFbmdpbmVTZXNzaW9uIHNlc3Npb24sIElQcm9maWxlIHByb2ZpbGUsIE9wZXJhbmRbXSBvcGVyYW5kcywgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJU3ViTW9uaXRvciBzdWJNb25pdG9yID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIHByZVBlcmZvcm1Xb3JrICsgbWFpblBlcmZvcm1Xb3JrICsgcG9zdFBlcmZvcm1Xb3JrKTsKLQkJcHJlUGVyZm9ybShzdGF0dXMsIHByb2ZpbGUsIGNvbnRleHQsIHN1Yk1vbml0b3IubmV3Q2hpbGQocHJlUGVyZm9ybVdvcmspKTsKLQkJaWYgKHN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IgfCBJU3RhdHVzLkNBTkNFTCkpCi0JCQlyZXR1cm47Ci0JCXNlc3Npb24ucmVjb3JkUGhhc2VTdGFydCh0aGlzKTsKLQotCQlzdWJNb25pdG9yLnNldFdvcmtSZW1haW5pbmcobWFpblBlcmZvcm1Xb3JrICsgcG9zdFBlcmZvcm1Xb3JrKTsKLQkJbWFpblBlcmZvcm0oc3RhdHVzLCBzZXNzaW9uLCBwcm9maWxlLCBvcGVyYW5kcywgY29udGV4dCwgc3ViTW9uaXRvci5uZXdDaGlsZChtYWluUGVyZm9ybVdvcmspKTsKLQkJaWYgKHN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IgfCBJU3RhdHVzLkNBTkNFTCkpCi0JCQlyZXR1cm47Ci0KLQkJc2Vzc2lvbi5yZWNvcmRQaGFzZUVuZCh0aGlzKTsKLQkJc3ViTW9uaXRvci5zZXRXb3JrUmVtYWluaW5nKHBvc3RQZXJmb3JtV29yayk7Ci0JCXBvc3RQZXJmb3JtKHN0YXR1cywgcHJvZmlsZSwgY29udGV4dCwgc3ViTW9uaXRvci5uZXdDaGlsZChwb3N0UGVyZm9ybVdvcmspKTsKLQkJaWYgKHN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IgfCBJU3RhdHVzLkNBTkNFTCkpCi0JCQlyZXR1cm47Ci0KLQkJc3ViTW9uaXRvci5kb25lKCk7Ci0JfQotCi0Jdm9pZCBwcmVQZXJmb3JtKE11bHRpU3RhdHVzIHN0YXR1cywgSVByb2ZpbGUgcHJvZmlsZSwgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcGhhc2VQYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJcGhhc2VQYXJhbWV0ZXJzLnB1dChQQVJNX1BST0ZJTEUsIHByb2ZpbGUpOwotCQlwaGFzZVBhcmFtZXRlcnMucHV0KFBBUk1fQ09OVEVYVCwgY29udGV4dCk7Ci0JCXBoYXNlUGFyYW1ldGVycy5wdXQoUEFSTV9QSEFTRV9JRCwgcGhhc2VJZCk7Ci0KLQkJbWVyZ2VTdGF0dXMoc3RhdHVzLCBpbml0aWFsaXplUGhhc2UobW9uaXRvciwgcHJvZmlsZSwgcGhhc2VQYXJhbWV0ZXJzKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1haW5QZXJmb3JtKE11bHRpU3RhdHVzIHN0YXR1cywgRW5naW5lU2Vzc2lvbiBzZXNzaW9uLCBJUHJvZmlsZSBwcm9maWxlLCBPcGVyYW5kW10gb3BlcmFuZHMsIFByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCwgU3ViTW9uaXRvciBzdWJNb25pdG9yKSB7Ci0JCXN1Yk1vbml0b3IuYmVnaW5UYXNrKCIiLCBvcGVyYW5kcy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3BlcmFuZHMubGVuZ3RoOyBpKyspIHsKLQkJCXN1Yk1vbml0b3Iuc2V0V29ya1JlbWFpbmluZyhvcGVyYW5kcy5sZW5ndGggLSBpKTsKLQkJCWlmIChzdWJNb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCU9wZXJhbmQgb3BlcmFuZCA9IG9wZXJhbmRzW2ldOwotCQkJaWYgKCFpc0FwcGxpY2FibGUob3BlcmFuZCkpCi0JCQkJY29udGludWU7Ci0KLQkJCVByb3Zpc2lvbmluZ0FjdGlvbltdIGFjdGlvbnMgPSBnZXRBY3Rpb25zKG9wZXJhbmQpOwotCQkJTWFwIHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcChwaGFzZVBhcmFtZXRlcnMpOwotCQkJcGFyYW1ldGVycy5wdXQoUEFSTV9PUEVSQU5ELCBvcGVyYW5kKTsKLQkJCW1lcmdlU3RhdHVzKHN0YXR1cywgaW5pdGlhbGl6ZU9wZXJhbmQocHJvZmlsZSwgb3BlcmFuZCwgcGFyYW1ldGVycywgc3ViTW9uaXRvcikpOwotCQkJcGFyYW1ldGVycyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChwYXJhbWV0ZXJzKTsKLQkJCWlmIChhY3Rpb25zICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFjdGlvbnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJUHJvdmlzaW9uaW5nQWN0aW9uIGFjdGlvbiA9IGFjdGlvbnNbal07Ci0JCQkJCXNlc3Npb24ucmVjb3JkQWN0aW9uKGFjdGlvbiwgb3BlcmFuZCk7Ci0JCQkJCW1lcmdlU3RhdHVzKHN0YXR1cywgYWN0aW9uLmV4ZWN1dGUocGFyYW1ldGVycykpOwotCQkJCQlpZiAoIXN0YXR1cy5pc09LKCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJbWVyZ2VTdGF0dXMoc3RhdHVzLCBjb21wbGV0ZU9wZXJhbmQocHJvZmlsZSwgb3BlcmFuZCwgcGFyYW1ldGVycywgc3ViTW9uaXRvcikpOwotCQkJc3ViTW9uaXRvci53b3JrZWQoMSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXJnZXMgYSBnaXZlbiBJU3RhdHVzIGludG8gYSBNdWx0aVN0YXR1cwotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBtZXJnZVN0YXR1cyhNdWx0aVN0YXR1cyBtdWx0aSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cyAhPSBudWxsICYmICFzdGF0dXMuaXNPSygpKQotCQkJbXVsdGkubWVyZ2Uoc3RhdHVzKTsKLQl9Ci0KLQl2b2lkIHBvc3RQZXJmb3JtKE11bHRpU3RhdHVzIHN0YXR1cywgSVByb2ZpbGUgcHJvZmlsZSwgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJbWVyZ2VTdGF0dXMoc3RhdHVzLCBjb21wbGV0ZVBoYXNlKG1vbml0b3IsIHByb2ZpbGUsIHBoYXNlUGFyYW1ldGVycykpOwotCQlwaGFzZVBhcmFtZXRlcnMgPSBudWxsOwotCX0KLQotCXZvaWQgdW5kbyhNdWx0aVN0YXR1cyBzdGF0dXMsIEVuZ2luZVNlc3Npb24gc2Vzc2lvbiwgSVByb2ZpbGUgcHJvZmlsZSwgT3BlcmFuZCBvcGVyYW5kLCBQcm92aXNpb25pbmdBY3Rpb25bXSBhY3Rpb25zLCBQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJTWFwIHBhcmFtZXRlcnMgPSBuZXcgSGFzaE1hcChwaGFzZVBhcmFtZXRlcnMpOwotCQlwYXJhbWV0ZXJzLnB1dChQQVJNX09QRVJBTkQsIG9wZXJhbmQpOwotCQltZXJnZVN0YXR1cyhzdGF0dXMsIGluaXRpYWxpemVPcGVyYW5kKHByb2ZpbGUsIG9wZXJhbmQsIHBhcmFtZXRlcnMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpKTsKLQkJcGFyYW1ldGVycyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChwYXJhbWV0ZXJzKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBhY3Rpb25zLmxlbmd0aDsgaisrKSB7Ci0JCQlQcm92aXNpb25pbmdBY3Rpb24gYWN0aW9uID0gYWN0aW9uc1tqXTsKLQkJCW1lcmdlU3RhdHVzKHN0YXR1cywgYWN0aW9uLnVuZG8ocGFyYW1ldGVycykpOwotCQkJLy8gVE9ETzogc2Vzc2lvbi5yZW1vdmVBY3Rpb24oLi4uKQotCQl9Ci0JCW1lcmdlU3RhdHVzKHN0YXR1cywgY29tcGxldGVPcGVyYW5kKHByb2ZpbGUsIG9wZXJhbmQsIHBhcmFtZXRlcnMsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2FibGUoT3BlcmFuZCBvcGVyYW5kKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGluaXRpYWxpemVQaGFzZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9maWxlIHByb2ZpbGUsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGNvbXBsZXRlUGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBNYXAgcGFyYW1ldGVycykgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBjb21wbGV0ZU9wZXJhbmQoSVByb2ZpbGUgcHJvZmlsZSwgT3BlcmFuZCBvcGVyYW5kLCBNYXAgcGFyYW1ldGVycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGluaXRpYWxpemVPcGVyYW5kKElQcm9maWxlIHByb2ZpbGUsIE9wZXJhbmQgb3BlcmFuZCwgTWFwIHBhcmFtZXRlcnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgUHJvdmlzaW9uaW5nQWN0aW9uW10gZ2V0QWN0aW9ucyhPcGVyYW5kIG9wZXJhbmQpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGluIGNhc2Ugb2YgYW4gZXJyb3IgcGVyZm9ybWluZwotCSAqIHRoaXMgcGhhc2UuIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvYmxlbU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5waGFzZV9lcnJvcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL1BoYXNlU2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9QaGFzZVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGZhNWRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL1BoYXNlU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZS5FbmdpbmVBY3RpdmF0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQaGFzZVNldCB7Ci0JcHJpdmF0ZSBmaW5hbCBQaGFzZVtdIHBoYXNlczsKLQotCXB1YmxpYyBQaGFzZVNldChQaGFzZVtdIHBoYXNlcykgewotCQlpZiAocGhhc2VzID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLm51bGxfcGhhc2VzKTsKLQotCQl0aGlzLnBoYXNlcyA9IHBoYXNlczsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgTXVsdGlTdGF0dXMgcGVyZm9ybShFbmdpbmVTZXNzaW9uIHNlc3Npb24sIElQcm9maWxlIHByb2ZpbGUsIE9wZXJhbmRbXSBvcGVyYW5kcywgUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJTXVsdGlTdGF0dXMgcmVzdWx0ID0gbmV3IE11bHRpU3RhdHVzKEVuZ2luZUFjdGl2YXRvci5JRCwgSVN0YXR1cy5PSywgbnVsbCwgbnVsbCk7Ci0JCWludFtdIHdlaWdodHMgPSBnZXRQcm9ncmVzc1dlaWdodHMob3BlcmFuZHMpOwotCQlpbnQgdG90YWxXb3JrID0gZ2V0VG90YWxXb3JrKHdlaWdodHMpOwotCQlTdWJNb25pdG9yIHBtID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIHRvdGFsV29yayk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBoYXNlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChwbS5pc0NhbmNlbGVkKCkpIHsKLQkJCQkJcmVzdWx0LmFkZChTdGF0dXMuQ0FOQ0VMX1NUQVRVUyk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCVBoYXNlIHBoYXNlID0gcGhhc2VzW2ldOwotCQkJCU11bHRpU3RhdHVzIHBlcmZvcm1SZXN1bHQgPSBwaGFzZS5wZXJmb3JtKHNlc3Npb24sIHByb2ZpbGUsIG9wZXJhbmRzLCBjb250ZXh0LCBwbS5uZXdDaGlsZCh3ZWlnaHRzW2ldKSk7Ci0JCQkJaWYgKCFwZXJmb3JtUmVzdWx0LmlzT0soKSkKLQkJCQkJcmVzdWx0LmFkZChwZXJmb3JtUmVzdWx0KTsKLQkJCQlpZiAocmVzdWx0Lm1hdGNoZXMoSVN0YXR1cy5FUlJPUiB8IElTdGF0dXMuQ0FOQ0VMKSkKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXBtLmRvbmUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgaW50IGdldFRvdGFsV29yayhpbnRbXSB3ZWlnaHRzKSB7Ci0JCWludCBzdW0gPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdlaWdodHMubGVuZ3RoOyBpKyspCi0JCQlzdW0gKz0gd2VpZ2h0c1tpXTsKLQkJcmV0dXJuIHN1bTsKLQl9Ci0KLQlwcml2YXRlIGludFtdIGdldFByb2dyZXNzV2VpZ2h0cyhPcGVyYW5kW10gb3BlcmFuZHMpIHsKLQkJaW50W10gd2VpZ2h0cyA9IG5ldyBpbnRbcGhhc2VzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGhhc2VzLmxlbmd0aDsgaSArPSAxKSB7Ci0JCQlpZiAob3BlcmFuZHMubGVuZ3RoID4gMCkKLQkJCQkvL2FsdGVyIHdlaWdodHMgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgYXBwbGljYWJsZSB0byB0aGF0IHBoYXNlCi0JCQkJd2VpZ2h0c1tpXSA9IChwaGFzZXNbaV0ud2VpZ2h0ICogY291bnRBcHBsaWNhYmxlKHBoYXNlc1tpXSwgb3BlcmFuZHMpIC8gb3BlcmFuZHMubGVuZ3RoKTsKLQkJCWVsc2UKLQkJCQl3ZWlnaHRzW2ldID0gcGhhc2VzW2ldLndlaWdodDsKLQkJfQotCQlyZXR1cm4gd2VpZ2h0czsKLQl9Ci0KLQlwcml2YXRlIGludCBjb3VudEFwcGxpY2FibGUoUGhhc2UgcGhhc2UsIE9wZXJhbmRbXSBvcGVyYW5kcykgewotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9wZXJhbmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocGhhc2UuaXNBcHBsaWNhYmxlKG9wZXJhbmRzW2ldKSkKLQkJCQljb3VudCsrOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9Qcm9maWxlRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL1Byb2ZpbGVFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTY3OTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL1Byb2ZpbGVFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50T2JqZWN0OwotCi0vKioKLSAqIEBub2V4dGVuZCBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9maWxlRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzA4MjQwMjkyMDYxNzI4MTc2NUw7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQURERUQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBSRU1PVkVEID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgQ0hBTkdFRCA9IDI7Ci0KLQlwcml2YXRlIGJ5dGUgcmVhc29uOwotCi0JcHVibGljIFByb2ZpbGVFdmVudChTdHJpbmcgcHJvZmlsZUlkLCBieXRlIHJlYXNvbikgewotCQlzdXBlcihwcm9maWxlSWQpOwotCQl0aGlzLnJlYXNvbiA9IHJlYXNvbjsKLQl9Ci0KLQlwdWJsaWMgYnl0ZSBnZXRSZWFzb24oKSB7Ci0JCXJldHVybiByZWFzb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9maWxlSWQoKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRTb3VyY2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9Qcm9wZXJ0eU9wZXJhbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL1Byb3BlcnR5T3BlcmFuZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGM1MzZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL1Byb3BlcnR5T3BlcmFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLQotcHVibGljIGNsYXNzIFByb3BlcnR5T3BlcmFuZCBleHRlbmRzIE9wZXJhbmQgewotCXByaXZhdGUgZmluYWwgT2JqZWN0IGZpcnN0OwotCXByaXZhdGUgZmluYWwgT2JqZWN0IHNlY29uZDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBrZXk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IG9wZXJhbmQgdGhhdCByZXByZXNlbnRzIHJlcGxhY2luZyBhIHByb3BlcnR5IHZhbHVlCi0JICogd2l0aCBhbm90aGVyLiAgQXQgbGVhc3Qgb25lIG9mIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZQotCSAqIG5vbi1udWxsLgotCSAqIAotCSAqIEBwYXJhbSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgbW9kaWZpZWQKLQkgKiBAcGFyYW0gZmlyc3QgVGhlIHByb3BlcnR5IHZhbHVlIGJlaW5nIHJlbW92ZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIHNlY29uZCBUaGUgcHJvcGVydHkgdmFsdWUgYmVpbmcgYWRkZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFByb3BlcnR5T3BlcmFuZChTdHJpbmcga2V5LCBPYmplY3QgZmlyc3QsIE9iamVjdCBzZWNvbmQpIHsKLQkJLy90aGUgb3BlcmFuZCBtdXN0IHNwZWNpZnkgaGF2ZSBhIGtleSBhbmQgaGF2ZSBhdCBsZWFzdCBvbmUgbm9uLW51bGwgdmFsdWUKLQkJQXNzZXJ0LmlzVHJ1ZShrZXkgIT0gbnVsbCAmJiAoZmlyc3QgIT0gbnVsbCB8fCBzZWNvbmQgIT0gbnVsbCkpOwotCQl0aGlzLmZpcnN0ID0gZmlyc3Q7Ci0JCXRoaXMuc2Vjb25kID0gc2Vjb25kOwotCQl0aGlzLmtleSA9IGtleTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGZpcnN0KCkgewotCQlyZXR1cm4gZmlyc3Q7Ci0JfQotCi0JcHVibGljIE9iamVjdCBzZWNvbmQoKSB7Ci0JCXJldHVybiBzZWNvbmQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRLZXkoKSB7Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGtleSArICIgPSAiICsgZmlyc3QgKyAiIC0tPiAiICsgc2Vjb25kOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9Qcm92aXNpb25pbmdBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL1Byb3Zpc2lvbmluZ0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWQwMTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL1Byb3Zpc2lvbmluZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0KLQlwcml2YXRlIE1lbWVudG8gbWVtZW50byA9IG5ldyBNZW1lbnRvKCk7Ci0KLQlwcm90ZWN0ZWQgTWVtZW50byBnZXRNZW1lbnRvKCkgewotCQlyZXR1cm4gbWVtZW50bzsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKTsKLQotCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvUHJvdmlzaW9uaW5nQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvUHJvdmlzaW9uaW5nQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWVmZGYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL1Byb3Zpc2lvbmluZ0NvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgV2luZFJpdmVyIC0gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyNzM3MgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBQcm92aXNpb25pbmdDb250ZXh0IHsKLQlwcml2YXRlIFVSTFtdIG1ldGFkYXRhUmVwb3NpdG9yaWVzOyAvL21ldGFkYXRhIHJlcG9zaXRvcmllcyB0byBjb25zdWx0Ci0JcHJpdmF0ZSBVUkxbXSBhcnRpZmFjdFJlcG9zaXRvcmllczsgLy9hcnRpZmFjdCByZXBvc2l0b3JpZXMgdG8gY29uc3VsdAotCXByaXZhdGUgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQlwcml2YXRlIExpc3QgZXh0cmFJVXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgUHJvdmlzaW9uaW5nQ29udGV4dCgpIHsKLQkJLy8gbnVsbCByZXBvcyBtZWFucyBsb29rIGF0IHRoZW0gYWxsCi0JCW1ldGFkYXRhUmVwb3NpdG9yaWVzID0gbnVsbDsKLQkJYXJ0aWZhY3RSZXBvc2l0b3JpZXMgPSBudWxsOwotCX0KLQotCXB1YmxpYyBQcm92aXNpb25pbmdDb250ZXh0KFVSTFtdIG1ldGFkYXRhUmVwb3NpdG9yaWVzKSB7Ci0JCXRoaXMubWV0YWRhdGFSZXBvc2l0b3JpZXMgPSBtZXRhZGF0YVJlcG9zaXRvcmllczsKLQl9Ci0KLQkvKioKLQkgKiBBcnRpZmFjdCByZXBvc2l0b3JpZXMgdG8gY29uc3VsdCB3aGVuIHBlcmZvcm1pbmcgYW4gb3BlcmF0aW9uLgotCSAqIEBwYXJhbSBhcnRpZmFjdFJlcG9zaXRvcmllcyBhcnJheSBvZiBVUkxzCi0JKi8KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFJlcG9zaXRvcmllcyhVUkxbXSBhcnRpZmFjdFJlcG9zaXRvcmllcykgewotCQl0aGlzLmFydGlmYWN0UmVwb3NpdG9yaWVzID0gYXJ0aWZhY3RSZXBvc2l0b3JpZXM7Ci0JfQotCi0JcHVibGljIFVSTFtdIGdldE1ldGFkYXRhUmVwb3NpdG9yaWVzKCkgewotCQlyZXR1cm4gbWV0YWRhdGFSZXBvc2l0b3JpZXM7Ci0JfQotCi0JcHVibGljIFVSTFtdIGdldEFydGlmYWN0UmVwb3NpdG9yaWVzKCkgewotCQlyZXR1cm4gYXJ0aWZhY3RSZXBvc2l0b3JpZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCXByb3BlcnRpZXMuc2V0UHJvcGVydHkoa2V5LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RXh0cmFJVXMoKSB7Ci0JCXJldHVybiBleHRyYUlVczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeHRyYUlVcyhMaXN0IGV4dHJhSVVzKSB7Ci0JCXRoaXMuZXh0cmFJVXMgPSBleHRyYUlVczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9Sb2xsYmFja09wZXJhdGlvbkV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9Sb2xsYmFja09wZXJhdGlvbkV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMDAzMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvUm9sbGJhY2tPcGVyYXRpb25FdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci0KLXB1YmxpYyBjbGFzcyBSb2xsYmFja09wZXJhdGlvbkV2ZW50IGV4dGVuZHMgVHJhbnNhY3Rpb25FdmVudCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMjA3NjQ5Mjk1Mzk0OTY5MTIxNUw7Ci0JcHJpdmF0ZSBJU3RhdHVzIGNhdXNlOwotCi0JcHVibGljIFJvbGxiYWNrT3BlcmF0aW9uRXZlbnQoSVByb2ZpbGUgcHJvZmlsZSwgUGhhc2VTZXQgcGhhc2VTZXQsIE9wZXJhbmRbXSBvcGVyYW5kcywgSUVuZ2luZSBlbmdpbmUsIElTdGF0dXMgY2F1c2UpIHsKLQkJc3VwZXIocHJvZmlsZSwgcGhhc2VTZXQsIG9wZXJhbmRzLCBlbmdpbmUpOwotCQl0aGlzLmNhdXNlID0gY2F1c2U7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gY2F1c2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvVG91Y2hwb2ludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvVG91Y2hwb2ludC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWVmMTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL1RvdWNocG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5Ub3VjaHBvaW50VHlwZTsKLQotLyoqCi0gKiBBIHRvdWNocG9pbnQgaXMgcmVzcG9uc2libGUgZm9yIGV4ZWN1dGluZyBhIGdpdmVuIHBoYXNlIGZvciBhIGdpdmVuIAotICogdGFyZ2V0ZWQgc3lzdGVtIChlY2xpcHNlLCBuYXRpdmUpLiBUaGUgb3JkZXIgb2YgcGhhc2VzIGlzIGRlZmluZWQgaW4gdGhlIHtAbGluayBQaGFzZVNldH0uICAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFRvdWNocG9pbnQgewotCi0JcHVibGljIGFic3RyYWN0IFRvdWNocG9pbnRUeXBlIGdldFRvdWNocG9pbnRUeXBlKCk7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgUHJvdmlzaW9uaW5nQWN0aW9uIGdldEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpOwotCi0JcHVibGljIElTdGF0dXMgaW5pdGlhbGl6ZVBoYXNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIHBoYXNlSWQsIE1hcCB0b3VjaHBvaW50UGFyYW1ldGVycykgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBjb21wbGV0ZVBoYXNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIHBoYXNlSWQsIE1hcCB0b3VjaHBvaW50UGFyYW1ldGVycykgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBpbml0aWFsaXplT3BlcmFuZChJUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgcGhhc2VJZCwgSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcGVyYW5kLCBNYXAgcGFyYW1ldGVycykgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBjb21wbGV0ZU9wZXJhbmQoSVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIHBoYXNlSWQsIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvVHJhbnNhY3Rpb25FdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvVHJhbnNhY3Rpb25FdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmI1NzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL1RyYW5zYWN0aW9uRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZTsKLQotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zYWN0aW9uRXZlbnQgZXh0ZW5kcyBFdmVudE9iamVjdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjI3ODcwNjk3MTg1NTQ5Mzk4NEw7Ci0JcHJvdGVjdGVkIElQcm9maWxlIHByb2ZpbGU7Ci0JcHJvdGVjdGVkIFBoYXNlU2V0IHBoYXNlU2V0OwotCXByb3RlY3RlZCBPcGVyYW5kW10gb3BlcmFuZHM7Ci0KLQlwdWJsaWMgVHJhbnNhY3Rpb25FdmVudChJUHJvZmlsZSBwcm9maWxlLCBQaGFzZVNldCBwaGFzZVNldCwgT3BlcmFuZFtdIG9wZXJhbmRzLCBJRW5naW5lIGVuZ2luZSkgewotCQlzdXBlcihlbmdpbmUpOwotCQl0aGlzLnByb2ZpbGUgPSBwcm9maWxlOwotCQl0aGlzLnBoYXNlU2V0ID0gcGhhc2VTZXQ7Ci0JCXRoaXMub3BlcmFuZHMgPSBvcGVyYW5kczsKLQl9Ci0KLQlwdWJsaWMgSVByb2ZpbGUgZ2V0UHJvZmlsZSgpIHsKLQkJcmV0dXJuIHByb2ZpbGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYzlhOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWFjdGlvbl9vcl9pdV9vcGVyYW5kX251bGw9QWN0aW9uIGFuZCBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG11c3Qgbm90IGJlIG51bGwuCi1ub3RfY3VycmVudF9waGFzZT1DdXJyZW50IHBoYXNlIGRvZXMgbm90IG1hdGNoIGFyZ3VtZW50LgotbnVsbF9vcGVyYW5kcz1PcGVyYW5kcyBtdXN0IG5vdCBiZSBudWxsLgotbnVsbF9waGFzZT1QaGFzZSBtdXN0IG5vdCBiZSBudWxsLgotbnVsbF9waGFzZXM9UGhhc2VzIG11c3Qgbm90IGJlIG51bGwKLW51bGxfcGhhc2VzZXQ9UGhhc2VTZXQgbXVzdCBub3QgYmUgbnVsbC4KLW51bGxfcHJvZmlsZT1Qcm9maWxlIG11c3Qgbm90IGJlIG51bGwuCi1yZXF1aXJlZF90b3VjaHBvaW50X25vdF9mb3VuZD1UaGUgcmVxdWlyZWQgezB9IHRvdWNocG9pbnQgd2FzIG5vdCBmb3VuZAotcGhhc2VfZXJyb3I9QW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHByb3Zpc2lvbmluZy4KLXBoYXNlX25vdF9zdGFydGVkPVRoZXJlIGlzIG5vIHBoYXNlIHRvIGVuZC4KLXBoYXNlX3N0YXJ0ZWQ9QSBwaGFzZSBpcyBhbHJlYWR5IHN0YXJ0ZWQuCi1waGFzZWlkX25vdF9wb3NpdGl2ZT1QaGFzZSB3ZWlnaHQgbXVzdCBiZSBwb3NpdGl2ZS4KLXBoYXNlaWRfbm90X3NldD1QaGFzZSBpZCBtdXN0IGJlIHNldC4KLUVuZ2luZV9PcGVyYXRpb25fQ2FuY2VsZWRfQnlfVXNlcj1PcGVyYXRpb24gY2FuY2VsZWQgYnkgdGhlIHVzZXIuCi1JbnN0YWxsYWJsZVVuaXRFdmVudF90eXBlX25vdF9pbnN0YWxsX29yX3VuaW5zdGFsbD10eXBlIG11c3QgYmUgZWl0aGVyIFVOSU5TVEFMTCgwKSBvciBJTlNUQUxMKDEpCi1DZXJ0aWZpY2F0ZUNoZWNrZXJfQ2VydGlmaWNhdGVFcnJvcj1BbiBpbnZhbGlkIGNlcnRpZmljYXRlIHdhcyBmb3VuZC4KLUNlcnRpZmljYXRlQ2hlY2tlcl9DZXJ0aWZpY2F0ZVJlamVjdGVkPU9uZSBvciBtb3JlIGNlcnRpZmljYXRlcyByZWplY3RlZC4gQ2Fubm90IHByb2NlZWQgd2l0aCBpbnN0YWxsYXRpb24uCi1DZXJ0aWZpY2F0ZUNoZWNrZXJfS2V5c3RvcmVDb25uZWN0aW9uRXJyb3I9Q2Fubm90IGNvbm5lY3QgdG8ga2V5c3RvcmUuCi1DZXJ0aWZpY2F0ZUNoZWNrZXJfU2lnbmVkQ29udGVudEVycm9yPUVycm9yIHdpdGggc2lnbmVkIGNvbnRlbnQuCi1DZXJ0aWZpY2F0ZUNoZWNrZXJfU2lnbmVkQ29udGVudElPRXJyb3I9RXJyb3IgcmVhZGluZyBzaWduZWQgY29udGVudC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9waGFzZXMvQ2hlY2tUcnVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvcGhhc2VzL0NoZWNrVHJ1c3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmMDZmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9waGFzZXMvQ2hlY2tUcnVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLnBoYXNlczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotCi0vKioKLSAqIEFuIGluc3RhbGwgcGhhc2UgdGhhdCBjaGVja3MgaWYgdGhlIGNlcnRpZmljYXRlcyB1c2VkIHRvIHNpZ24gdGhlIGFydGlmYWN0cwotICogYmVpbmcgaW5zdGFsbGVkIGFyZSBmcm9tIGEgdHJ1c3RlZCBzb3VyY2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja1RydXN0IGV4dGVuZHMgSW5zdGFsbGFibGVVbml0UGhhc2UgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBIQVNFX0lEID0gImNoZWNrVHJ1c3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQ2hlY2tUcnVzdChpbnQgd2VpZ2h0KSB7Ci0JCXN1cGVyKFBIQVNFX0lELCB3ZWlnaHQpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGNvbXBsZXRlUGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBNYXAgcGFyYW1ldGVycykgewotCQlDb2xsZWN0aW9uIGFydGlmYWN0UmVxdWVzdHMgPSAoQ29sbGVjdGlvbikgcGFyYW1ldGVycy5nZXQoUEFSTV9BUlRJRkFDVF9SRVFVRVNUUyk7Ci0KLQkJLy8gSW5zdGFudGlhdGUgYSBjaGVjayB0cnVzdCBtYW5hZ2VyCi0JCUNlcnRpZmljYXRlQ2hlY2tlciBjZXJ0aWZpY2F0ZUNoZWNrZXIgPSBuZXcgQ2VydGlmaWNhdGVDaGVja2VyKCk7Ci0JCWNlcnRpZmljYXRlQ2hlY2tlci5hZGQoYXJ0aWZhY3RSZXF1ZXN0cy50b0FycmF5KCkpOwotCQlJU3RhdHVzIHN0YXR1cyA9IGNlcnRpZmljYXRlQ2hlY2tlci5zdGFydCgpOwotCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3Zpc2lvbmluZ0FjdGlvbltdIGdldEFjdGlvbnMoSW5zdGFsbGFibGVVbml0T3BlcmFuZCBjdXJyZW50T3BlcmFuZCkgewotCQlQcm92aXNpb25pbmdBY3Rpb24gYWN0aW9uID0gZ2V0VG91Y2hwb2ludChjdXJyZW50T3BlcmFuZCkuZ2V0QWN0aW9uKHBoYXNlSWQpOwotCQlpZiAoYWN0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nQWN0aW9uW10ge2FjdGlvbn07Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgaW5pdGlhbGl6ZU9wZXJhbmQoSVByb2ZpbGUgcHJvZmlsZSwgSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcGVyYW5kLCBNYXAgcGFyYW1ldGVycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSBvcGVyYW5kLnNlY29uZCgpOwotCQlwYXJhbWV0ZXJzLnB1dChQQVJNX0lVLCBpdSk7Ci0KLQkJcmV0dXJuIHN1cGVyLmluaXRpYWxpemVPcGVyYW5kKHByb2ZpbGUsIG9wZXJhbmQsIHBhcmFtZXRlcnMsIG1vbml0b3IpOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGluaXRpYWxpemVQaGFzZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9maWxlIHByb2ZpbGUsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCXBhcmFtZXRlcnMucHV0KFBBUk1fQVJUSUZBQ1RfUkVRVUVTVFMsIG5ldyBBcnJheUxpc3QoKSk7Ci0JCXJldHVybiBzdXBlci5pbml0aWFsaXplUGhhc2UobW9uaXRvciwgcHJvZmlsZSwgcGFyYW1ldGVycyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9waGFzZXMvQ29sbGVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvcGhhc2VzL0NvbGxlY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwYmE2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9waGFzZXMvQ29sbGVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIFdpbmRSaXZlciAtIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjczNzIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5waGFzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZS5Eb3dubG9hZE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLQotLyoqCi0gKiBUaGUgZ29hbCBvZiB0aGUgY29sbGVjdCBwaGFzZSBpcyB0byBhc2sgdGhlIHRvdWNocG9pbnRzIGlmIHRoZSBhcnRpZmFjdHMgYXNzb2NpYXRlZCB3aXRoIGFuIElVIG5lZWQgdG8gYmUgZG93bmxvYWRlZC4KLSAqLwotcHVibGljIGNsYXNzIENvbGxlY3QgZXh0ZW5kcyBJbnN0YWxsYWJsZVVuaXRQaGFzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBIQVNFX0lEID0gImNvbGxlY3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgQ29sbGVjdChpbnQgd2VpZ2h0KSB7Ci0JCXN1cGVyKFBIQVNFX0lELCB3ZWlnaHQpOwotCQkvL3JlLWJhbGFuY2Ugd29yayBzaW5jZSBwb3N0UGVyZm9ybSB3aWxsIGRvIGFsbW9zdCBhbGwgdGhlIHRpbWUtY29uc3VtaW5nIHdvcmsKLQkJcHJlUGVyZm9ybVdvcmsgPSAwOwotCQltYWluUGVyZm9ybVdvcmsgPSAxMDA7Ci0JCXBvc3RQZXJmb3JtV29yayA9IDEwMDA7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBcHBsaWNhYmxlKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3ApIHsKLQkJcmV0dXJuIChvcC5zZWNvbmQoKSAhPSBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvdmlzaW9uaW5nQWN0aW9uW10gZ2V0QWN0aW9ucyhJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIGN1cnJlbnRPcGVyYW5kKSB7Ci0JCVByb3Zpc2lvbmluZ0FjdGlvbiBhY3Rpb24gPSBnZXRUb3VjaHBvaW50KGN1cnJlbnRPcGVyYW5kKS5nZXRBY3Rpb24ocGhhc2VJZCk7Ci0JCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nQWN0aW9uW10ge2FjdGlvbn07Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9ibGVtTWVzc2FnZSgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLlBoYXNlX0NvbGxlY3RfRXJyb3I7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgY29tcGxldGVJbnN0YWxsYWJsZVVuaXRQaGFzZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9maWxlIHByb2ZpbGUsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCUxpc3QgYXJ0aWZhY3RSZXF1ZXN0cyA9IChMaXN0KSBwYXJhbWV0ZXJzLmdldChQQVJNX0FSVElGQUNUX1JFUVVFU1RTKTsKLQotCQlEb3dubG9hZE1hbmFnZXIgZG0gPSBuZXcgRG93bmxvYWRNYW5hZ2VyKHByb3ZDb250ZXh0KTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGFydGlmYWN0UmVxdWVzdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUFydGlmYWN0UmVxdWVzdFtdIHJlcXVlc3RzID0gKElBcnRpZmFjdFJlcXVlc3RbXSkgaXQubmV4dCgpOwotCQkJZG0uYWRkKHJlcXVlc3RzKTsKLQkJfQotCQlyZXR1cm4gZG0uc3RhcnQobW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgaW5pdGlhbGl6ZUluc3RhbGxhYmxlVW5pdFBoYXNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2ZpbGUgcHJvZmlsZSwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJcGFyYW1ldGVycy5wdXQoUEFSTV9BUlRJRkFDVF9SRVFVRVNUUywgbmV3IEFycmF5TGlzdCgpKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvcGhhc2VzL0NvbmZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvcGhhc2VzL0NvbmZpZ3VyZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGU3ZjI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL3BoYXNlcy9Db25maWd1cmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5waGFzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmUgZXh0ZW5kcyBJbnN0YWxsYWJsZVVuaXRQaGFzZSB7Ci0KLQlwdWJsaWMgQ29uZmlndXJlKGludCB3ZWlnaHQpIHsKLQkJc3VwZXIoImNvbmZpZ3VyZSIsIHdlaWdodCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2FibGUoSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcCkgewotCQlyZXR1cm4gKG9wLnNlY29uZCgpICE9IG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBQcm92aXNpb25pbmdBY3Rpb25bXSBnZXRBY3Rpb25zKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgY3VycmVudE9wZXJhbmQpIHsKLQkJSUluc3RhbGxhYmxlVW5pdCB1bml0ID0gY3VycmVudE9wZXJhbmQuc2Vjb25kKCk7Ci0JCWlmICh1bml0LmlzRnJhZ21lbnQoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0QWN0aW9ucyh1bml0LCBwaGFzZUlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2JsZW1NZXNzYWdlKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuUGhhc2VfQ29uZmlndXJlX0Vycm9yOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGluaXRpYWxpemVPcGVyYW5kKElQcm9maWxlIHByb2ZpbGUsIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCwgTWFwIHBhcmFtZXRlcnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gb3BlcmFuZC5zZWNvbmQoKTsKLQkJbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLlBoYXNlX0NvbmZpZ3VyZV9UYXNrLCBpdS5nZXRJZCgpKSk7Ci0JCXBhcmFtZXRlcnMucHV0KFBBUk1fSVUsIGl1KTsKLQotCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBpdS5nZXRBcnRpZmFjdHMoKTsKLQkJaWYgKGFydGlmYWN0cyAhPSBudWxsICYmIGFydGlmYWN0cy5sZW5ndGggPiAwKQotCQkJcGFyYW1ldGVycy5wdXQoUEFSTV9BUlRJRkFDVCwgYXJ0aWZhY3RzWzBdKTsKLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9waGFzZXMvSW5zdGFsbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvcGhhc2VzL0luc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhZGU3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9waGFzZXMvSW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5waGFzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuSVByb3Zpc2lvbmluZ0V2ZW50QnVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsIGV4dGVuZHMgSW5zdGFsbGFibGVVbml0UGhhc2UgewotCi0JZmluYWwgc3RhdGljIGNsYXNzIEJlZm9yZUluc3RhbGxFdmVudEFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0KLQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoUEFSTV9QUk9GSUxFKTsKLQkJCVN0cmluZyBwaGFzZUlkID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoUEFSTV9QSEFTRV9JRCk7Ci0JCQlUb3VjaHBvaW50IHRvdWNocG9pbnQgPSAoVG91Y2hwb2ludCkgcGFyYW1ldGVycy5nZXQoUEFSTV9UT1VDSFBPSU5UKTsKLQkJCUluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCA9IChJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKSBwYXJhbWV0ZXJzLmdldChQQVJNX09QRVJBTkQpOwotCQkJKChJUHJvdmlzaW9uaW5nRXZlbnRCdXMpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShFbmdpbmVBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FKSkucHVibGlzaEV2ZW50KG5ldyBJbnN0YWxsYWJsZVVuaXRFdmVudChwaGFzZUlkLCB0cnVlLCBwcm9maWxlLCBvcGVyYW5kLCBJbnN0YWxsYWJsZVVuaXRFdmVudC5JTlNUQUxMLCB0b3VjaHBvaW50KSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJCVByb2ZpbGUgcHJvZmlsZSA9IChQcm9maWxlKSBwYXJhbWV0ZXJzLmdldChQQVJNX1BST0ZJTEUpOwotCQkJU3RyaW5nIHBoYXNlSWQgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChQQVJNX1BIQVNFX0lEKTsKLQkJCVRvdWNocG9pbnQgdG91Y2hwb2ludCA9IChUb3VjaHBvaW50KSBwYXJhbWV0ZXJzLmdldChQQVJNX1RPVUNIUE9JTlQpOwotCQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcGVyYW5kID0gKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fT1BFUkFORCk7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fSVUpOwotCQkJcHJvZmlsZS5yZW1vdmVJbnN0YWxsYWJsZVVuaXQoaXUpOwotCQkJKChJUHJvdmlzaW9uaW5nRXZlbnRCdXMpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShFbmdpbmVBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FKSkucHVibGlzaEV2ZW50KG5ldyBJbnN0YWxsYWJsZVVuaXRFdmVudChwaGFzZUlkLCBmYWxzZSwgcHJvZmlsZSwgb3BlcmFuZCwgSW5zdGFsbGFibGVVbml0RXZlbnQuVU5JTlNUQUxMLCB0b3VjaHBvaW50KSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCWZpbmFsIHN0YXRpYyBjbGFzcyBBZnRlckluc3RhbGxFdmVudEFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0KLQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQkJUHJvZmlsZSBwcm9maWxlID0gKFByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fUFJPRklMRSk7Ci0JCQlTdHJpbmcgcGhhc2VJZCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fUEhBU0VfSUQpOwotCQkJVG91Y2hwb2ludCB0b3VjaHBvaW50ID0gKFRvdWNocG9pbnQpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fVE9VQ0hQT0lOVCk7Ci0JCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQgPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgcGFyYW1ldGVycy5nZXQoUEFSTV9PUEVSQU5EKTsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoUEFSTV9JVSk7Ci0JCQlwcm9maWxlLmFkZEluc3RhbGxhYmxlVW5pdChpdSk7Ci0JCQkoKElQcm92aXNpb25pbmdFdmVudEJ1cykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEVuZ2luZUFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm92aXNpb25pbmdFdmVudEJ1cy5TRVJWSUNFX05BTUUpKS5wdWJsaXNoRXZlbnQobmV3IEluc3RhbGxhYmxlVW5pdEV2ZW50KHBoYXNlSWQsIGZhbHNlLCBwcm9maWxlLCBvcGVyYW5kLCBJbnN0YWxsYWJsZVVuaXRFdmVudC5JTlNUQUxMLCB0b3VjaHBvaW50KSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fUFJPRklMRSk7Ci0JCQlTdHJpbmcgcGhhc2VJZCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fUEhBU0VfSUQpOwotCQkJVG91Y2hwb2ludCB0b3VjaHBvaW50ID0gKFRvdWNocG9pbnQpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fVE9VQ0hQT0lOVCk7Ci0JCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQgPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgcGFyYW1ldGVycy5nZXQoUEFSTV9PUEVSQU5EKTsKLQkJCSgoSVByb3Zpc2lvbmluZ0V2ZW50QnVzKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoRW5naW5lQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLlNFUlZJQ0VfTkFNRSkpLnB1Ymxpc2hFdmVudChuZXcgSW5zdGFsbGFibGVVbml0RXZlbnQocGhhc2VJZCwgdHJ1ZSwgcHJvZmlsZSwgb3BlcmFuZCwgSW5zdGFsbGFibGVVbml0RXZlbnQuVU5JTlNUQUxMLCB0b3VjaHBvaW50KSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9JRCA9ICJpbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEluc3RhbGwoaW50IHdlaWdodCkgewotCQlzdXBlcihQSEFTRV9JRCwgd2VpZ2h0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FwcGxpY2FibGUoSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcCkgewotCQlyZXR1cm4gKG9wLnNlY29uZCgpICE9IG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBQcm92aXNpb25pbmdBY3Rpb25bXSBnZXRBY3Rpb25zKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgY3VycmVudE9wZXJhbmQpIHsKLQkJLy9UT0RPOiBtb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuRW5naW5lX0luc3RhbGxpbmdfSVUsIHVuaXQuZ2V0SWQoKSkpOwotCi0JCVByb3Zpc2lvbmluZ0FjdGlvbiBiZWZvcmVBY3Rpb24gPSBuZXcgQmVmb3JlSW5zdGFsbEV2ZW50QWN0aW9uKCk7Ci0JCVByb3Zpc2lvbmluZ0FjdGlvbiBhZnRlckFjdGlvbiA9IG5ldyBBZnRlckluc3RhbGxFdmVudEFjdGlvbigpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXQgdW5pdCA9IGN1cnJlbnRPcGVyYW5kLnNlY29uZCgpOwotCQlpZiAodW5pdC5pc0ZyYWdtZW50KCkpCi0JCQlyZXR1cm4gbmV3IFByb3Zpc2lvbmluZ0FjdGlvbltdIHtiZWZvcmVBY3Rpb24sIGFmdGVyQWN0aW9ufTsKLQotCQlQcm92aXNpb25pbmdBY3Rpb25bXSBwYXJzZWRBY3Rpb25zID0gZ2V0QWN0aW9ucyh1bml0LCBwaGFzZUlkKTsKLQkJaWYgKHBhcnNlZEFjdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nQWN0aW9uW10ge2JlZm9yZUFjdGlvbiwgYWZ0ZXJBY3Rpb259OwotCi0JCVByb3Zpc2lvbmluZ0FjdGlvbltdIGFjdGlvbnMgPSBuZXcgUHJvdmlzaW9uaW5nQWN0aW9uW3BhcnNlZEFjdGlvbnMubGVuZ3RoICsgMl07Ci0JCWFjdGlvbnNbMF0gPSBiZWZvcmVBY3Rpb247Ci0JCVN5c3RlbS5hcnJheWNvcHkocGFyc2VkQWN0aW9ucywgMCwgYWN0aW9ucywgMSwgcGFyc2VkQWN0aW9ucy5sZW5ndGgpOwotCQlhY3Rpb25zW2FjdGlvbnMubGVuZ3RoIC0gMV0gPSBhZnRlckFjdGlvbjsKLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9ibGVtTWVzc2FnZSgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLlBoYXNlX0luc3RhbGxfRXJyb3I7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgaW5pdGlhbGl6ZU9wZXJhbmQoSVByb2ZpbGUgcHJvZmlsZSwgSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcGVyYW5kLCBNYXAgcGFyYW1ldGVycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSBvcGVyYW5kLnNlY29uZCgpOwotCQltb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuUGhhc2VfSW5zdGFsbF9UYXNrLCBpdS5nZXRJZCgpKSk7Ci0JCXBhcmFtZXRlcnMucHV0KFBBUk1fSVUsIGl1KTsKLQotCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBpdS5nZXRBcnRpZmFjdHMoKTsKLQkJaWYgKGFydGlmYWN0cyAhPSBudWxsICYmIGFydGlmYWN0cy5sZW5ndGggPiAwKQotCQkJcGFyYW1ldGVycy5wdXQoUEFSTV9BUlRJRkFDVCwgYXJ0aWZhY3RzWzBdKTsKLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9waGFzZXMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL3BoYXNlcy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjQxYzVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL3BoYXNlcy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLnBoYXNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8vVE9ETyBTaG91bGRuJ3QgaGF2ZSBtZXNzYWdlcyBjbGFzcyBpbiBBUEkgcGFja2FnZQotY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5waGFzZXMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGhhc2VfQ29sbGVjdF9FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQaGFzZV9JbnN0YWxsX0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBoYXNlX0NvbmZpZ3VyZV9FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQaGFzZV9Db25maWd1cmVfVGFzazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQaGFzZV9JbnN0YWxsX1Rhc2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUGhhc2VfU2l6aW5nX0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBoYXNlX1VuY29uZmlndXJlX0Vycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFBoYXNlX1VuaW5zdGFsbF9FcnJvcjsKLQotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlcwotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy8gRG8gbm90IGluc3RhbnRpYXRlCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9waGFzZXMvUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL3BoYXNlcy9Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTVlNmU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL3BoYXNlcy9Qcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUucGhhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZS5Qcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotCi1wdWJsaWMgY2xhc3MgUHJvcGVydHkgZXh0ZW5kcyBQaGFzZSB7Ci0KLQlwdWJsaWMgY2xhc3MgUHJvZmlsZVByb3BlcnR5QWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQotCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCQlQcm9maWxlIHByb2ZpbGUgPSAoUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoUEFSTV9QUk9GSUxFKTsKLQkJCVByb3BlcnR5T3BlcmFuZCBwcm9wZXJ0eU9wZXJhbmQgPSAoUHJvcGVydHlPcGVyYW5kKSBwYXJhbWV0ZXJzLmdldChQQVJNX09QRVJBTkQpOwotCi0JCQlpZiAocHJvcGVydHlPcGVyYW5kLnNlY29uZCgpID09IG51bGwpCi0JCQkJcmVtb3ZlUHJvZmlsZVByb3BlcnR5KHByb2ZpbGUsIHByb3BlcnR5T3BlcmFuZCk7Ci0JCQllbHNlCi0JCQkJc2V0UHJvZmlsZVByb3BlcnR5KHByb2ZpbGUsIHByb3BlcnR5T3BlcmFuZCwgZmFsc2UpOwotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJCVByb2ZpbGUgcHJvZmlsZSA9IChQcm9maWxlKSBwYXJhbWV0ZXJzLmdldChQQVJNX1BST0ZJTEUpOwotCQkJUHJvcGVydHlPcGVyYW5kIHByb3BlcnR5T3BlcmFuZCA9IChQcm9wZXJ0eU9wZXJhbmQpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fT1BFUkFORCk7Ci0KLQkJCWlmIChwcm9wZXJ0eU9wZXJhbmQuZmlyc3QoKSA9PSBudWxsKQotCQkJCXJlbW92ZVByb2ZpbGVQcm9wZXJ0eShwcm9maWxlLCBwcm9wZXJ0eU9wZXJhbmQpOwotCQkJZWxzZQotCQkJCXNldFByb2ZpbGVQcm9wZXJ0eShwcm9maWxlLCBwcm9wZXJ0eU9wZXJhbmQsIHRydWUpOwotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBzZXRQcm9maWxlUHJvcGVydHkoUHJvZmlsZSBwcm9maWxlLCBQcm9wZXJ0eU9wZXJhbmQgcHJvcGVydHlPcGVyYW5kLCBib29sZWFuIHVuZG8pIHsKLQotCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgKHVuZG8gPyBwcm9wZXJ0eU9wZXJhbmQuZmlyc3QoKSA6IHByb3BlcnR5T3BlcmFuZC5zZWNvbmQoKSk7Ci0KLQkJCWlmIChwcm9wZXJ0eU9wZXJhbmQgaW5zdGFuY2VvZiBJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eU9wZXJhbmQpIHsKLQkJCQlJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eU9wZXJhbmQgaXVQcm9wZXJ0eU9wZXJhbmQgPSAoSW5zdGFsbGFibGVVbml0UHJvcGVydHlPcGVyYW5kKSBwcm9wZXJ0eU9wZXJhbmQ7Ci0JCQkJcHJvZmlsZS5zZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShpdVByb3BlcnR5T3BlcmFuZC5nZXRJbnN0YWxsYWJsZVVuaXQoKSwgaXVQcm9wZXJ0eU9wZXJhbmQuZ2V0S2V5KCksIHZhbHVlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvZmlsZS5zZXRQcm9wZXJ0eShwcm9wZXJ0eU9wZXJhbmQuZ2V0S2V5KCksIHZhbHVlKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZW1vdmVQcm9maWxlUHJvcGVydHkoUHJvZmlsZSBwcm9maWxlLCBQcm9wZXJ0eU9wZXJhbmQgcHJvcGVydHlPcGVyYW5kKSB7Ci0JCQlpZiAocHJvcGVydHlPcGVyYW5kIGluc3RhbmNlb2YgSW5zdGFsbGFibGVVbml0UHJvcGVydHlPcGVyYW5kKSB7Ci0JCQkJSW5zdGFsbGFibGVVbml0UHJvcGVydHlPcGVyYW5kIGl1UHJvcGVydHlPcGVyYW5kID0gKEluc3RhbGxhYmxlVW5pdFByb3BlcnR5T3BlcmFuZCkgcHJvcGVydHlPcGVyYW5kOwotCQkJCXByb2ZpbGUucmVtb3ZlSW5zdGFsbGFibGVVbml0UHJvcGVydHkoaXVQcm9wZXJ0eU9wZXJhbmQuZ2V0SW5zdGFsbGFibGVVbml0KCksIGl1UHJvcGVydHlPcGVyYW5kLmdldEtleSgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvZmlsZS5yZW1vdmVQcm9wZXJ0eShwcm9wZXJ0eU9wZXJhbmQuZ2V0S2V5KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGNsYXNzIFVwZGF0ZUluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0aWVzQWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQotCQkvLyB3ZSBkbyBub3QgbmVlZCB0byB1c2UgYSBtZW1lbnRvIGhlcmUgc2luY2UgdGhlIHByb2ZpbGUgaXMgbm90IHBlcnNpc3RlZCB1bmxlc3MgdGhlIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsCi0JCU1hcCBvcmlnaW5hbFNvdXJjZVByb3BlcnRpZXM7Ci0JCU1hcCBvcmlnaW5hbFRhcmdldFByb3BlcnRpZXM7Ci0KLQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQkJUHJvZmlsZSBwcm9maWxlID0gKFByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fUFJPRklMRSk7Ci0JCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIGl1T3BlcmFuZCA9IChJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKSBwYXJhbWV0ZXJzLmdldChQQVJNX09QRVJBTkQpOwotCi0JCQlJSW5zdGFsbGFibGVVbml0IHNvdXJjZSA9IGl1T3BlcmFuZC5maXJzdCgpOwotCQkJb3JpZ2luYWxTb3VyY2VQcm9wZXJ0aWVzID0gcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKHNvdXJjZSk7Ci0KLQkJCUlJbnN0YWxsYWJsZVVuaXQgdGFyZ2V0ID0gaXVPcGVyYW5kLnNlY29uZCgpOwotCQkJb3JpZ2luYWxUYXJnZXRQcm9wZXJ0aWVzID0gcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKHRhcmdldCk7Ci0KLQkJCXByb2ZpbGUuYWRkSW5zdGFsbGFibGVVbml0UHJvcGVydGllcyh0YXJnZXQsIG9yaWdpbmFsU291cmNlUHJvcGVydGllcyk7Ci0JCQlwcm9maWxlLmNsZWFySW5zdGFsbGFibGVVbml0UHJvcGVydGllcyhzb3VyY2UpOwotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJCVByb2ZpbGUgcHJvZmlsZSA9IChQcm9maWxlKSBwYXJhbWV0ZXJzLmdldChQQVJNX1BST0ZJTEUpOwotCQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZCBpdU9wZXJhbmQgPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgcGFyYW1ldGVycy5nZXQoUEFSTV9PUEVSQU5EKTsKLQotCQkJSUluc3RhbGxhYmxlVW5pdCBzb3VyY2UgPSBpdU9wZXJhbmQuZmlyc3QoKTsKLQkJCXByb2ZpbGUuY2xlYXJJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKHNvdXJjZSk7Ci0JCQlwcm9maWxlLmFkZEluc3RhbGxhYmxlVW5pdFByb3BlcnRpZXMoc291cmNlLCBvcmlnaW5hbFNvdXJjZVByb3BlcnRpZXMpOwotCi0JCQlJSW5zdGFsbGFibGVVbml0IHRhcmdldCA9IGl1T3BlcmFuZC5zZWNvbmQoKTsKLQkJCXByb2ZpbGUuY2xlYXJJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKHRhcmdldCk7Ci0JCQlwcm9maWxlLmFkZEluc3RhbGxhYmxlVW5pdFByb3BlcnRpZXModGFyZ2V0LCBvcmlnaW5hbFRhcmdldFByb3BlcnRpZXMpOwotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBSZW1vdmVJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydGllc0FjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0KLQkJLy8gd2UgZG8gbm90IG5lZWQgdG8gdXNlIGEgbWVtZW50byBoZXJlIHNpbmNlIHRoZSBwcm9maWxlIGlzIG5vdCBwZXJzaXN0ZWQgdW5sZXNzIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bAotCQlNYXAgb3JpZ2luYWxTb3VyY2VQcm9wZXJ0aWVzOwotCQlNYXAgb3JpZ2luYWxUYXJnZXRQcm9wZXJ0aWVzOwotCi0JCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJCVByb2ZpbGUgcHJvZmlsZSA9IChQcm9maWxlKSBwYXJhbWV0ZXJzLmdldChQQVJNX1BST0ZJTEUpOwotCQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZCBpdU9wZXJhbmQgPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgcGFyYW1ldGVycy5nZXQoUEFSTV9PUEVSQU5EKTsKLQotCQkJSUluc3RhbGxhYmxlVW5pdCBzb3VyY2UgPSBpdU9wZXJhbmQuZmlyc3QoKTsKLQkJCW9yaWdpbmFsU291cmNlUHJvcGVydGllcyA9IHByb2ZpbGUuZ2V0SW5zdGFsbGFibGVVbml0UHJvcGVydGllcyhzb3VyY2UpOwotCQkJcHJvZmlsZS5jbGVhckluc3RhbGxhYmxlVW5pdFByb3BlcnRpZXMoc291cmNlKTsKLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCQlQcm9maWxlIHByb2ZpbGUgPSAoUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoUEFSTV9QUk9GSUxFKTsKLQkJCUluc3RhbGxhYmxlVW5pdE9wZXJhbmQgaXVPcGVyYW5kID0gKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fT1BFUkFORCk7Ci0KLQkJCUlJbnN0YWxsYWJsZVVuaXQgc291cmNlID0gaXVPcGVyYW5kLmZpcnN0KCk7Ci0JCQlwcm9maWxlLmNsZWFySW5zdGFsbGFibGVVbml0UHJvcGVydGllcyhzb3VyY2UpOwotCQkJcHJvZmlsZS5hZGRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0aWVzKHNvdXJjZSwgb3JpZ2luYWxTb3VyY2VQcm9wZXJ0aWVzKTsKLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEhBU0VfSUQgPSAicHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgUHJvcGVydHkoaW50IHdlaWdodCkgewotCQlzdXBlcihQSEFTRV9JRCwgd2VpZ2h0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvdmlzaW9uaW5nQWN0aW9uW10gZ2V0QWN0aW9ucyhPcGVyYW5kIG9wZXJhbmQpIHsKLQkJaWYgKG9wZXJhbmQgaW5zdGFuY2VvZiBQcm9wZXJ0eU9wZXJhbmQpCi0JCQlyZXR1cm4gbmV3IFByb3Zpc2lvbmluZ0FjdGlvbltdIHtuZXcgUHJvZmlsZVByb3BlcnR5QWN0aW9uKCl9OwotCi0JCWlmIChvcGVyYW5kIGluc3RhbmNlb2YgSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgewotCQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZCBpdU9wZXJhbmQgPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgb3BlcmFuZDsKLQkJCWlmIChpdU9wZXJhbmQuZmlyc3QoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKGl1T3BlcmFuZC5zZWNvbmQoKSAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nQWN0aW9uW10ge25ldyBVcGRhdGVJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydGllc0FjdGlvbigpfTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5ldyBQcm92aXNpb25pbmdBY3Rpb25bXSB7bmV3IFJlbW92ZUluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0aWVzQWN0aW9uKCl9OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL3BoYXNlcy9TaXppbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL3BoYXNlcy9TaXppbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkZGM5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9waGFzZXMvU2l6aW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLnBoYXNlczsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lLkVuZ2luZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci0KLXB1YmxpYyBjbGFzcyBTaXppbmcgZXh0ZW5kcyBJbnN0YWxsYWJsZVVuaXRQaGFzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBIQVNFX0lEID0gImNvbGxlY3QiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGxvbmcgc2l6ZU9uRGlzazsKLQlwcml2YXRlIGxvbmcgZGxTaXplOwotCi0JcHVibGljIFNpemluZyhpbnQgd2VpZ2h0LCBTdHJpbmcgcGhhc2VOYW1lKSB7Ci0JCXN1cGVyKFBIQVNFX0lELCB3ZWlnaHQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQXBwbGljYWJsZShJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wKSB7Ci0JCXJldHVybiAob3Auc2Vjb25kKCkgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIGxvbmcgZ2V0RGlza1NpemUoKSB7Ci0JCXJldHVybiBzaXplT25EaXNrOwotCX0KLQotCXB1YmxpYyBsb25nIGdldERsU2l6ZSgpIHsKLQkJcmV0dXJuIGRsU2l6ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvdmlzaW9uaW5nQWN0aW9uW10gZ2V0QWN0aW9ucyhJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIGN1cnJlbnRPcGVyYW5kKSB7Ci0JCVByb3Zpc2lvbmluZ0FjdGlvbiBhY3Rpb24gPSBnZXRUb3VjaHBvaW50KGN1cnJlbnRPcGVyYW5kKS5nZXRBY3Rpb24oImNvbGxlY3QiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFByb3Zpc2lvbmluZ0FjdGlvbltdIHthY3Rpb259OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvYmxlbU1lc3NhZ2UoKSB7Ci0JCXJldHVybiBNZXNzYWdlcy5QaGFzZV9TaXppbmdfRXJyb3I7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgY29tcGxldGVJbnN0YWxsYWJsZVVuaXRQaGFzZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9maWxlIHByb2ZpbGUsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCUxpc3QgYXJ0aWZhY3RSZXF1ZXN0cyA9IChMaXN0KSBwYXJhbWV0ZXJzLmdldCgiYXJ0aWZhY3RSZXF1ZXN0cyIpOyAvLyROT04tTkxTLTEkCi0JCVNldCBhcnRpZmFjdHNUb09idGFpbiA9IG5ldyBIYXNoU2V0KGFydGlmYWN0UmVxdWVzdHMuc2l6ZSgpKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYXJ0aWZhY3RSZXF1ZXN0cy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJQXJ0aWZhY3RSZXF1ZXN0W10gcmVxdWVzdHMgPSAoSUFydGlmYWN0UmVxdWVzdFtdKSBpdC5uZXh0KCk7Ci0JCQlpZiAocmVxdWVzdHMgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWVzdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcnRpZmFjdHNUb09idGFpbi5hZGQocmVxdWVzdHNbaV0pOwotCQkJfQotCQl9Ci0KLQkJSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgcmVwb01nciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEVuZ2luZUFjdGl2YXRvci5nZXRDb250ZXh0KCksIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCVVSTFtdIHJlcG9zaXRvcmllcyA9IG51bGw7Ci0JCWlmIChwcm92Q29udGV4dCA9PSBudWxsIHx8IHByb3ZDb250ZXh0LmdldEFydGlmYWN0UmVwb3NpdG9yaWVzKCkgPT0gbnVsbCkKLQkJCXJlcG9zaXRvcmllcyA9IHJlcG9NZ3IuZ2V0S25vd25SZXBvc2l0b3JpZXMoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX0FMTCk7Ci0JCWVsc2UKLQkJCXJlcG9zaXRvcmllcyA9IHByb3ZDb250ZXh0LmdldEFydGlmYWN0UmVwb3NpdG9yaWVzKCk7Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFydGlmYWN0c1RvT2J0YWluLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlBcnRpZmFjdFJlcXVlc3QgYXJ0aWZhY3RSZXF1ZXN0ID0gKElBcnRpZmFjdFJlcXVlc3QpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3NpdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvOwotCQkJCXRyeSB7Ci0JCQkJCXJlcG8gPSByZXBvTWdyLmxvYWRSZXBvc2l0b3J5KHJlcG9zaXRvcmllc1tpXSwgbnVsbCk7Ci0JCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJY29udGludWU7Ly9za2lwIHVucmVzcG9uc2l2ZSByZXBvc2l0b3JpZXMKLQkJCQl9Ci0JCQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gcmVwby5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKGFydGlmYWN0UmVxdWVzdC5nZXRBcnRpZmFjdEtleSgpKTsKLQkJCQlpZiAoZGVzY3JpcHRvcnMubGVuZ3RoID4gMCkgewotCQkJCQlpZiAoZGVzY3JpcHRvcnNbMF0uZ2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5BUlRJRkFDVF9TSVpFKSAhPSBudWxsKQotCQkJCQkJc2l6ZU9uRGlzayArPSBMb25nLnBhcnNlTG9uZyhkZXNjcmlwdG9yc1swXS5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkFSVElGQUNUX1NJWkUpKTsKLQkJCQkJaWYgKGRlc2NyaXB0b3JzWzBdLmdldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuRE9XTkxPQURfU0laRSkgIT0gbnVsbCkKLQkJCQkJCWRsU2l6ZSArPSBMb25nLnBhcnNlTG9uZyhkZXNjcmlwdG9yc1swXS5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkRPV05MT0FEX1NJWkUpKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGluaXRpYWxpemVJbnN0YWxsYWJsZVVuaXRQaGFzZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9maWxlIHByb2ZpbGUsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCXBhcmFtZXRlcnMucHV0KFBBUk1fQVJUSUZBQ1RfUkVRVUVTVFMsIG5ldyBBcnJheUxpc3QoKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL3BoYXNlcy9VbmNvbmZpZ3VyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvcGhhc2VzL1VuY29uZmlndXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNWQ0MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvcGhhc2VzL1VuY29uZmlndXJlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUucGhhc2VzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLQotcHVibGljIGNsYXNzIFVuY29uZmlndXJlIGV4dGVuZHMgSW5zdGFsbGFibGVVbml0UGhhc2UgewotCi0JcHVibGljIFVuY29uZmlndXJlKGludCB3ZWlnaHQpIHsKLQkJc3VwZXIoInVuY29uZmlndXJlIiwgd2VpZ2h0KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQXBwbGljYWJsZShJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wKSB7Ci0JCXJldHVybiAob3AuZmlyc3QoKSAhPSBudWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvdmlzaW9uaW5nQWN0aW9uW10gZ2V0QWN0aW9ucyhJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIGN1cnJlbnRPcGVyYW5kKSB7Ci0JCS8vVE9ETzogbW9uaXRvci5zdWJUYXNrKE5MUy5iaW5kKE1lc3NhZ2VzLkVuZ2luZV9VbmNvbmZpZ3VyaW5nX0lVLCB1bml0LmdldElkKCkpKTsKLQotCQlJSW5zdGFsbGFibGVVbml0IHVuaXQgPSBjdXJyZW50T3BlcmFuZC5maXJzdCgpOwotCQlpZiAodW5pdC5pc0ZyYWdtZW50KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gZ2V0QWN0aW9ucyh1bml0LCBwaGFzZUlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2JsZW1NZXNzYWdlKCkgewotCQlyZXR1cm4gTWVzc2FnZXMuUGhhc2VfVW5jb25maWd1cmVfRXJyb3I7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgaW5pdGlhbGl6ZU9wZXJhbmQoSVByb2ZpbGUgcHJvZmlsZSwgSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcGVyYW5kLCBNYXAgcGFyYW1ldGVycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSBvcGVyYW5kLmZpcnN0KCk7Ci0JCXBhcmFtZXRlcnMucHV0KFBBUk1fSVUsIGl1KTsKLQotCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBpdS5nZXRBcnRpZmFjdHMoKTsKLQkJaWYgKGFydGlmYWN0cyAhPSBudWxsICYmIGFydGlmYWN0cy5sZW5ndGggPiAwKQotCQkJcGFyYW1ldGVycy5wdXQoUEFSTV9BUlRJRkFDVCwgYXJ0aWZhY3RzWzBdKTsKLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9waGFzZXMvVW5pbnN0YWxsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9waGFzZXMvVW5pbnN0YWxsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNjZiYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9lbmdpbmUvcGhhc2VzL1VuaW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5waGFzZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuSVByb3Zpc2lvbmluZ0V2ZW50QnVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotCi1wdWJsaWMgY2xhc3MgVW5pbnN0YWxsIGV4dGVuZHMgSW5zdGFsbGFibGVVbml0UGhhc2UgewotCi0JZmluYWwgc3RhdGljIGNsYXNzIEJlZm9yZVVuaW5zdGFsbEV2ZW50QWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoUEFSTV9QUk9GSUxFKTsKLQkJCVN0cmluZyBwaGFzZUlkID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoUEFSTV9QSEFTRV9JRCk7Ci0JCQlUb3VjaHBvaW50IHRvdWNocG9pbnQgPSAoVG91Y2hwb2ludCkgcGFyYW1ldGVycy5nZXQoUEFSTV9UT1VDSFBPSU5UKTsKLQkJCUluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCA9IChJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKSBwYXJhbWV0ZXJzLmdldChQQVJNX09QRVJBTkQpOwotCQkJKChJUHJvdmlzaW9uaW5nRXZlbnRCdXMpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShFbmdpbmVBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FKSkucHVibGlzaEV2ZW50KG5ldyBJbnN0YWxsYWJsZVVuaXRFdmVudChwaGFzZUlkLCB0cnVlLCBwcm9maWxlLCBvcGVyYW5kLCBJbnN0YWxsYWJsZVVuaXRFdmVudC5VTklOU1RBTEwsIHRvdWNocG9pbnQpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQkJUHJvZmlsZSBwcm9maWxlID0gKFByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fUFJPRklMRSk7Ci0JCQlTdHJpbmcgcGhhc2VJZCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fUEhBU0VfSUQpOwotCQkJVG91Y2hwb2ludCB0b3VjaHBvaW50ID0gKFRvdWNocG9pbnQpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fVE9VQ0hQT0lOVCk7Ci0JCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQgPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgcGFyYW1ldGVycy5nZXQoUEFSTV9PUEVSQU5EKTsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoUEFSTV9JVSk7Ci0JCQlwcm9maWxlLmFkZEluc3RhbGxhYmxlVW5pdChpdSk7Ci0JCQkoKElQcm92aXNpb25pbmdFdmVudEJ1cykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEVuZ2luZUFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm92aXNpb25pbmdFdmVudEJ1cy5TRVJWSUNFX05BTUUpKS5wdWJsaXNoRXZlbnQobmV3IEluc3RhbGxhYmxlVW5pdEV2ZW50KHBoYXNlSWQsIGZhbHNlLCBwcm9maWxlLCBvcGVyYW5kLCBJbnN0YWxsYWJsZVVuaXRFdmVudC5JTlNUQUxMLCB0b3VjaHBvaW50KSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCWZpbmFsIHN0YXRpYyBjbGFzcyBBZnRlclVuaW5zdGFsbEV2ZW50QWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQkJUHJvZmlsZSBwcm9maWxlID0gKFByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fUFJPRklMRSk7Ci0JCQlTdHJpbmcgcGhhc2VJZCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fUEhBU0VfSUQpOwotCQkJVG91Y2hwb2ludCB0b3VjaHBvaW50ID0gKFRvdWNocG9pbnQpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fVE9VQ0hQT0lOVCk7Ci0JCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQgPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgcGFyYW1ldGVycy5nZXQoUEFSTV9PUEVSQU5EKTsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoUEFSTV9JVSk7Ci0JCQlwcm9maWxlLnJlbW92ZUluc3RhbGxhYmxlVW5pdChpdSk7Ci0JCQkoKElQcm92aXNpb25pbmdFdmVudEJ1cykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEVuZ2luZUFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm92aXNpb25pbmdFdmVudEJ1cy5TRVJWSUNFX05BTUUpKS5wdWJsaXNoRXZlbnQobmV3IEluc3RhbGxhYmxlVW5pdEV2ZW50KHBoYXNlSWQsIGZhbHNlLCBwcm9maWxlLCBvcGVyYW5kLCBJbnN0YWxsYWJsZVVuaXRFdmVudC5VTklOU1RBTEwsIHRvdWNocG9pbnQpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoUEFSTV9QUk9GSUxFKTsKLQkJCVN0cmluZyBwaGFzZUlkID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoUEFSTV9QSEFTRV9JRCk7Ci0JCQlUb3VjaHBvaW50IHRvdWNocG9pbnQgPSAoVG91Y2hwb2ludCkgcGFyYW1ldGVycy5nZXQoUEFSTV9UT1VDSFBPSU5UKTsKLQkJCUluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCA9IChJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKSBwYXJhbWV0ZXJzLmdldChQQVJNX09QRVJBTkQpOwotCQkJKChJUHJvdmlzaW9uaW5nRXZlbnRCdXMpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShFbmdpbmVBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FKSkucHVibGlzaEV2ZW50KG5ldyBJbnN0YWxsYWJsZVVuaXRFdmVudChwaGFzZUlkLCB0cnVlLCBwcm9maWxlLCBvcGVyYW5kLCBJbnN0YWxsYWJsZVVuaXRFdmVudC5JTlNUQUxMLCB0b3VjaHBvaW50KSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSEFTRV9JRCA9ICJ1bmluc3RhbGwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgVW5pbnN0YWxsKGludCB3ZWlnaHQpIHsKLQkJc3VwZXIoUEhBU0VfSUQsIHdlaWdodCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBcHBsaWNhYmxlKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3ApIHsKLQkJcmV0dXJuIChvcC5maXJzdCgpICE9IG51bGwpOwotCX0KLQotCXByb3RlY3RlZCBQcm92aXNpb25pbmdBY3Rpb25bXSBnZXRBY3Rpb25zKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgY3VycmVudE9wZXJhbmQpIHsKLQkJLy9UT0RPOiBtb25pdG9yLnN1YlRhc2soTkxTLmJpbmQoTWVzc2FnZXMuRW5naW5lX1VuaW5zdGFsbGluZ19JVSwgdW5pdC5nZXRJZCgpKSk7Ci0KLQkJUHJvdmlzaW9uaW5nQWN0aW9uIGJlZm9yZUFjdGlvbiA9IG5ldyBCZWZvcmVVbmluc3RhbGxFdmVudEFjdGlvbigpOwotCQlQcm92aXNpb25pbmdBY3Rpb24gYWZ0ZXJBY3Rpb24gPSBuZXcgQWZ0ZXJVbmluc3RhbGxFdmVudEFjdGlvbigpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXQgdW5pdCA9IGN1cnJlbnRPcGVyYW5kLmZpcnN0KCk7Ci0JCWlmICh1bml0LmlzRnJhZ21lbnQoKSkKLQkJCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nQWN0aW9uW10ge2JlZm9yZUFjdGlvbiwgYWZ0ZXJBY3Rpb259OwotCQlQcm92aXNpb25pbmdBY3Rpb25bXSBwYXJzZWRBY3Rpb25zID0gZ2V0QWN0aW9ucyh1bml0LCBwaGFzZUlkKTsKLQkJaWYgKHBhcnNlZEFjdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nQWN0aW9uW10ge2JlZm9yZUFjdGlvbiwgYWZ0ZXJBY3Rpb259OwotCi0JCVByb3Zpc2lvbmluZ0FjdGlvbltdIGFjdGlvbnMgPSBuZXcgUHJvdmlzaW9uaW5nQWN0aW9uW3BhcnNlZEFjdGlvbnMubGVuZ3RoICsgMl07Ci0JCWFjdGlvbnNbMF0gPSBiZWZvcmVBY3Rpb247Ci0JCVN5c3RlbS5hcnJheWNvcHkocGFyc2VkQWN0aW9ucywgMCwgYWN0aW9ucywgMSwgcGFyc2VkQWN0aW9ucy5sZW5ndGgpOwotCQlhY3Rpb25zW2FjdGlvbnMubGVuZ3RoIC0gMV0gPSBhZnRlckFjdGlvbjsKLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcm9ibGVtTWVzc2FnZSgpIHsKLQkJcmV0dXJuIE1lc3NhZ2VzLlBoYXNlX1VuaW5zdGFsbF9FcnJvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBpbml0aWFsaXplT3BlcmFuZChJUHJvZmlsZSBwcm9maWxlLCBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQsIE1hcCBwYXJhbWV0ZXJzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IG9wZXJhbmQuZmlyc3QoKTsKLQkJcGFyYW1ldGVycy5wdXQoIml1IiwgaXUpOyAvLyROT04tTkxTLTEkCi0KLQkJSUFydGlmYWN0S2V5W10gYXJ0aWZhY3RzID0gaXUuZ2V0QXJ0aWZhY3RzKCk7Ci0JCWlmIChhcnRpZmFjdHMgIT0gbnVsbCAmJiBhcnRpZmFjdHMubGVuZ3RoID4gMCkKLQkJCXBhcmFtZXRlcnMucHV0KCJhcnRpZmFjdCIsIGFydGlmYWN0c1swXSk7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2VuZ2luZS9waGFzZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL3BoYXNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDEyYzhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvZW5naW5lL3BoYXNlcy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1QaGFzZV9Db2xsZWN0X0Vycm9yPUFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGNvbGxlY3RpbmcgaXRlbXMgdG8gYmUgaW5zdGFsbGVkCi1QaGFzZV9Db25maWd1cmVfRXJyb3I9QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY29uZmlndXJpbmcgdGhlIGluc3RhbGxlZCBpdGVtcwotUGhhc2VfQ29uZmlndXJlX1Rhc2s9Q29uZmlndXJpbmcgezB9Ci1QaGFzZV9JbnN0YWxsX0Vycm9yPUFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGluc3RhbGxpbmcgdGhlIGl0ZW1zCi1QaGFzZV9JbnN0YWxsX1Rhc2s9SW5zdGFsbGluZyB7MH0KLVBoYXNlX1NpemluZ19FcnJvcj1BbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBjb21wdXRpbmcgdGhlIHNpemUgb2YgdGhlIGl0ZW1zIHRvIGJlIGluc3RhbGxlZAotUGhhc2VfVW5jb25maWd1cmVfRXJyb3I9QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdW5jb25maWd1cmluZyB0aGUgaXRlbXMgdG8gdW5pbnN0YWxsCi1QaGFzZV9Vbmluc3RhbGxfRXJyb3I9QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgdW5pbnN0YWxsaW5nCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2RlYjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjElRm91bmRhdGlvbi0xLjEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGRlMmExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXA8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZmI1OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0jVGh1IFNlcCAwNiAyMzo0ODowNCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNjZhZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1ODoxMSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTEzZDIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMjgyZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3RvciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmdhcmJhZ2Vjb2xsZWN0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24sCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3RvciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5leGVtcGxhcnlzZXR1cC5BY3RpdmF0b3IKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4xL0ZvdW5kYXRpb24tMS4xLAotIEoyU0UtMS40Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4ZW1wbGFyeXNldHVwO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiODMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNzk0YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IFByb3Zpc2lvbmluZyBFeGVtcGxhcnkgU2V0dXAKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXhlbXBsYXJ5c2V0dXAvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZXhlbXBsYXJ5c2V0dXAvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTA0ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2V4ZW1wbGFyeXNldHVwL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4ZW1wbGFyeXNldHVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLlByb3Zpc2lvbmluZ0V2ZW50QnVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuU2ltcGxlRGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5kaXJlY3Rvci5TaW1wbGVQbGFubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lLk1ldGFkYXRhQ2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmUuU2ltcGxlUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZ2FyYmFnZWNvbGxlY3Rvci5HYXJiYWdlQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5NZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JRGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JUGxhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLQlwcml2YXRlIElQcm92aXNpb25pbmdFdmVudEJ1cyBidXM7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbkJ1czsKLQotCXByaXZhdGUgTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBkZWZhdWx0TWFuYWdlcjsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uRGVmYXVsdE1hbmFnZXI7Ci0KLQkvLwlwcml2YXRlIEFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgYXJ0aWZhY3RSZXBvTWFuYWdlcjsKLQkvLwlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uQXJ0aWZhY3RSZXBvTWFuYWdlcjsKLQotCXByaXZhdGUgSVByb2ZpbGVSZWdpc3RyeSBwcm9maWxlUmVnaXN0cnk7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvblByb2ZpbGVSZWdpc3RyeTsKLQotCXByaXZhdGUgSURpcmVjdG9yIGRpcmVjdG9yOwotCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb25EaXJlY3RvcjsKLQotCXByaXZhdGUgSVBsYW5uZXIgcGxhbm5lcjsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uUGxhbm5lcjsKLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvL05lZWQgdG8gZG8gdGhlIGNvbmZpZ3VyYXRpb24gb2YgYWxsIHRoZSBiaXRzIGFuZCBwaWVjZXM6Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gYUNvbnRleHQ7Ci0KLQkJcmVnaXN0ZXJFdmVudEJ1cygpOwotCQkvL2NyZWF0ZSB0aGUgcHJvZmlsZSByZWdpc3RyeQotCQlyZWdpc3RlclByb2ZpbGVSZWdpc3RyeSgpOwotCQkvL2NyZWF0ZSBtZXRhZGF0YSByZXBvc2l0b3JpZXMKLQkJcmVnaXN0ZXJEZWZhdWx0TWV0YWRhdGFSZXBvTWFuYWdlcigpOwotCQlyZWdpc3Rlck1ldGFkYXRhQ2FjaGUoKTsKLQotCQkvL2NyZWF0ZSB0aGUgZGlyZWN0b3IgYW5kIHBsYW5uZXIuICBUaGUgcGxhbm5lciBtdXN0IGJlCi0JCS8vcmVnaXN0ZXJlZCBmaXJzdCBiZWNhdXNlIHRoZSBkaXJlY3RvciBmaW5kcyBpdCBpbiBpdHMgY29uc3RydWN0b3IuCi0JCXJlZ2lzdGVyUGxhbm5lcigpOwotCQlyZWdpc3RlckRpcmVjdG9yKCk7Ci0JCXN0YXJ0R2FyYmFnZUNvbGxlY3RvcigpOwotCi0JCS8vY3JlYXRlIGFydGlmYWN0IHJlcG9zaXRvcmllcwotCQkvLwkJcmVnaXN0ZXJEZWZhdWx0QXJ0aWZhY3RSZXBvTWFuYWdlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdGFydEdhcmJhZ2VDb2xsZWN0b3IoKSB7Ci0JCW5ldyBHYXJiYWdlQ29sbGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGFDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8JCXVucmVnaXN0ZXJEZWZhdWx0QXJ0aWZhY3RSZXBvTWFuYWdlcigpOwotCQl1bnJlZ2lzdGVyRGlyZWN0b3IoKTsKLQkJdW5yZWdpc3RlclBsYW5uZXIoKTsKLQkJdW5yZWdpc3RlckRlZmF1bHRNZXRhZGF0YVJlcG9NYW5hZ2VyKCk7Ci0JCXVucmVnaXN0ZXJQcm9maWxlUmVnaXN0cnkoKTsKLQkJdW5yZWdpc3RlckV2ZW50QnVzKCk7Ci0JCUFjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKLQotCX0KLQotCXByaXZhdGUgdm9pZCByZWdpc3RlckRpcmVjdG9yKCkgewotCQlkaXJlY3RvciA9IG5ldyBTaW1wbGVEaXJlY3RvcigpOwotCQlyZWdpc3RyYXRpb25EaXJlY3RvciA9IGNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKElEaXJlY3Rvci5jbGFzcy5nZXROYW1lKCksIGRpcmVjdG9yLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5yZWdpc3RlckRpcmVjdG9yKCkgewotCQlyZWdpc3RyYXRpb25EaXJlY3Rvci51bnJlZ2lzdGVyKCk7Ci0JCXJlZ2lzdHJhdGlvbkRpcmVjdG9yID0gbnVsbDsKLQkJZGlyZWN0b3IgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWdpc3RlclBsYW5uZXIoKSB7Ci0JCXBsYW5uZXIgPSBuZXcgU2ltcGxlUGxhbm5lcigpOwotCQlyZWdpc3RyYXRpb25QbGFubmVyID0gY29udGV4dC5yZWdpc3RlclNlcnZpY2UoSVBsYW5uZXIuY2xhc3MuZ2V0TmFtZSgpLCBwbGFubmVyLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5yZWdpc3RlclBsYW5uZXIoKSB7Ci0JCXJlZ2lzdHJhdGlvblBsYW5uZXIudW5yZWdpc3RlcigpOwotCQlyZWdpc3RyYXRpb25QbGFubmVyID0gbnVsbDsKLQkJcGxhbm5lciA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyUHJvZmlsZVJlZ2lzdHJ5KCkgewotCQlwcm9maWxlUmVnaXN0cnkgPSBuZXcgU2ltcGxlUHJvZmlsZVJlZ2lzdHJ5KCk7Ci0JCXJlZ2lzdHJhdGlvblByb2ZpbGVSZWdpc3RyeSA9IGNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpLCBwcm9maWxlUmVnaXN0cnksIG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyUHJvZmlsZVJlZ2lzdHJ5KCkgewotCQlyZWdpc3RyYXRpb25Qcm9maWxlUmVnaXN0cnkudW5yZWdpc3RlcigpOwotCQlyZWdpc3RyYXRpb25Qcm9maWxlUmVnaXN0cnkgPSBudWxsOwotCQlwcm9maWxlUmVnaXN0cnkgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWdpc3RlckRlZmF1bHRNZXRhZGF0YVJlcG9NYW5hZ2VyKCkgewotCQlkZWZhdWx0TWFuYWdlciA9IG5ldyBNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKCk7Ci0JCXJlZ2lzdHJhdGlvbkRlZmF1bHRNYW5hZ2VyID0gY29udGV4dC5yZWdpc3RlclNlcnZpY2UoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpLCBkZWZhdWx0TWFuYWdlciwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJEZWZhdWx0TWV0YWRhdGFSZXBvTWFuYWdlcigpIHsKLQkJcmVnaXN0cmF0aW9uRGVmYXVsdE1hbmFnZXIudW5yZWdpc3RlcigpOwotCQlyZWdpc3RyYXRpb25EZWZhdWx0TWFuYWdlciA9IG51bGw7Ci0JCWRlZmF1bHRNYW5hZ2VyID0gbnVsbDsKLQl9Ci0KLQkvLwlwcml2YXRlIHZvaWQgcmVnaXN0ZXJEZWZhdWx0QXJ0aWZhY3RSZXBvTWFuYWdlcigpIHsKLQkvLwkJYXJ0aWZhY3RSZXBvTWFuYWdlciA9IG5ldyBBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCk7Ci0JLy8JCXJlZ2lzdHJhdGlvbkFydGlmYWN0UmVwb01hbmFnZXIgPSBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCksIGFydGlmYWN0UmVwb01hbmFnZXIsIG51bGwpOwotCS8vCX0KLQkvLwotCS8vCXByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyRGVmYXVsdEFydGlmYWN0UmVwb01hbmFnZXIoKSB7Ci0JLy8JCXJlZ2lzdHJhdGlvbkFydGlmYWN0UmVwb01hbmFnZXIudW5yZWdpc3RlcigpOwotCS8vCQlhcnRpZmFjdFJlcG9NYW5hZ2VyID0gbnVsbDsKLQkvLwl9Ci0KLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJNZXRhZGF0YUNhY2hlKCkgewotCQkvL1RPRE86IHdlIG5lZWQgdG8gc3RhcnQgbWV0YWRhdGEgY2FjaGUgYXQgYSBzcGVjaWZpYyB0aW1lLCBiZWNhdXNlIGl0IHJlbGllcyBvbiBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcgotCQkvL2JlaW5nIHByZXNlbnQuIFJlYWxseSwgTWV0YWRhdGFDYWNoZSBzaG91bGQganVzdCB3YWl0IHVudGlsIG1ldGFkYXRhIHJlcG9zaXRvcnkgc2VydmljZQotCQkvL2lzIGF2YWlsYWJsZSBhbmQgdGhlbiBpbml0aWFsaXplIGl0c2VsZgotCQluZXcgTWV0YWRhdGFDYWNoZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWdpc3RlckV2ZW50QnVzKCkgewotCQlidXMgPSBuZXcgUHJvdmlzaW9uaW5nRXZlbnRCdXMoKTsKLQkJcmVnaXN0cmF0aW9uQnVzID0gY29udGV4dC5yZWdpc3RlclNlcnZpY2UoSVByb3Zpc2lvbmluZ0V2ZW50QnVzLlNFUlZJQ0VfTkFNRSwgYnVzLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5yZWdpc3RlckV2ZW50QnVzKCkgewotCQlyZWdpc3RyYXRpb25CdXMudW5yZWdpc3RlcigpOwotCQlyZWdpc3RyYXRpb25CdXMgPSBudWxsOwotCQlidXMuY2xvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkZWI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjElRm91bmRhdGlvbi0xLjEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0ZjU3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9kZWJ1ZyA9IGZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MwZTkyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTIzY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLSNUaHUgQXVnIDE2IDExOjAwOjU5IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU0NmQ4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotI1R1ZSBBdWcgMjEgMTE6Mjc6NDggQ0RUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPXVzZXIKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD05OQotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI0YTg2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS40LjAiLAotIG9yZy5vc2dpLnNlcnZpY2UucHJlZnM7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLnV0aWwudHJhY2tlcjt2ZXJzaW9uPSIxLjMuMyIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZ2FyYmFnZWNvbGxlY3Rvci5HQ0FjdGl2YXRvcgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZ2FyYmFnZWNvbGxlY3Rvcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUsCi0gb3JnLmVjbGlwc2Uub3NnaTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeTtidW5kbGUtdmVyc2lvbj0iWzMuNC4wLDQuMC4wKSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4xL0ZvdW5kYXRpb24tMS4xLAotIEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODRjMjZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzOGY0MDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IFByb3Zpc2lvbmluZyBHYXJiYWdlIENvbGxlY3RvcgotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTg0MDFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24tcG9pbnQgaWQ9Im1hcmtzZXRwcm92aWRlcnMiIG5hbWU9IkdhcmJhZ2UgQ29sbGVjdG9yIiBzY2hlbWE9InNjaGVtYS9HYXJiYWdlQ29sbGVjdG9yLmV4c2QiLz4KLSAgIAotCTwhLS08ZXh0ZW5zaW9uCi0JCQlwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yb290c2V0cHJvdmlkZXJzIgotCQkJaWQ9IlJvb3RTZXRUZXN0Ij4KLQkJCTxydW4gCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci50ZXN0LlJvb3RTZXRUZXN0Ii8+Ci0JPC9leHRlbnNpb24+LS0+Ci0JCi0JIDwhLS08ZXh0ZW5zaW9uCi0JcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWFya3NldHByb3ZpZGVycyIKLQlpZD0iVGVzdFByb3ZpZGVyIj4KLQk8cnVuIAotCQljbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yLnRlc3QuTWFya1NldFByb3ZpZGVyVGVzdCIvPgotPC9leHRlbnNpb24+LS0+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NjaGVtYS9HYXJiYWdlQ29sbGVjdG9yLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zY2hlbWEvR2FyYmFnZUNvbGxlY3Rvci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTQzOTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NjaGVtYS9HYXJiYWdlQ29sbGVjdG9yLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciIgaWQ9Im1hcmtzZXRwcm92aWRlcnMiIG5hbWU9IlByb2ZpbGUtYmFzZWQgbWFyayBzZXQgcHJvdmlkZXJzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBkZXNjcmlwdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InJ1biIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InJ1biI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIgYmFzZWRPbj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yLklNYXJrU2V0UHJvdmlkZXIiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIHRoZSBmaXJzdCByZWxlYXNlIGluIHdoaWNoIHRoaXMgZXh0ZW5zaW9uIHBvaW50IGFwcGVhcnMuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIEFQSSBpbmZvcm1hdGlvbiBoZXJlLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGluZm9ybWF0aW9uIGFib3V0IHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50Ll0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvQ29yZUdhcmJhZ2VDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvQ29yZUdhcmJhZ2VDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YwZWI3MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL0NvcmVHYXJiYWdlQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5nYXJiYWdlY29sbGVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuVHJhY2luZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLQotLyoqCi0gKiBHaXZlbiBhIE1hcmtTZXQsIHRoZSBDb3JlR2FyYmFnZUNvbGxlY3RvciByZW1vdmVzIGFueSBJQXJ0aWZhY3REZXNjcmlwdG9ycyB3aGljaAotICogYXJlIG5vdCBtYXBwZWQgdG8gYmUgYW4gSUFydGlmYWN0S2V5IGluIHRoZSBNYXJrU2V0LgotICovCi1wdWJsaWMgY2xhc3MgQ29yZUdhcmJhZ2VDb2xsZWN0b3IgewotCi0JLyoqCi0JICogV2hlbiBzZXQgdG8gdHJ1ZSwgaW5mb3JtYXRpb24gd2lsbCBiZSBsb2dnZWQgZXZlcnkgdGltZSBhbiBhcnRpZmFjdCBpcyByZW1vdmVkIAotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVidWdNb2RlID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBHaXZlbiBhIGxpc3Qgb2YgSUFydGlmYWN0S2V5cyBhbmQgYW4gSUFydGlmYWN0UmVwb3NpdG9yeSwgcmVtb3ZlcyBhbGwgYXJ0aWZhY3RzCi0JICogaW4gYVJlcG9zaXRvcnkgdGhhdCBhcmUgbm90IG1hcHBlZCB0byBieSBhbiBJQXJ0aWZhY3RLZXkgaW4gbWFya1NldAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbGVhbihJQXJ0aWZhY3RLZXlbXSBtYXJrU2V0LCBJQXJ0aWZhY3RSZXBvc2l0b3J5IGFSZXBvc2l0b3J5KSB7Ci0JCUlBcnRpZmFjdEtleVtdIHJlcG9zaXRvcnlLZXlzID0gYVJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3RLZXlzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcmVwb3NpdG9yeUtleXMubGVuZ3RoOyBqKyspIHsKLQkJCWJvb2xlYW4gYXJ0aWZhY3RJc0FjdGl2ZSA9IGZhbHNlOwotCQkJZm9yIChpbnQgayA9IDA7IGsgPCBtYXJrU2V0Lmxlbmd0aDsgaysrKSB7Ci0JCQkJaWYgKHJlcG9zaXRvcnlLZXlzW2pdLmVxdWFscyhtYXJrU2V0W2tdKSkgewotCQkJCQlhcnRpZmFjdElzQWN0aXZlID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFhcnRpZmFjdElzQWN0aXZlKSB7Ci0JCQkJYVJlcG9zaXRvcnkucmVtb3ZlRGVzY3JpcHRvcihyZXBvc2l0b3J5S2V5c1tqXSk7Ci0JCQkJaWYgKGRlYnVnTW9kZSkgewotCQkJCQlUcmFjaW5nLmRlYnVnKCJLZXkgcmVtb3ZlZDoiICsgcmVwb3NpdG9yeUtleXNbal0pOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBJZiBzZXQgdG8gdHJ1ZSwgZGVidWcgbW9kZSB3aWxsIGxvZyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIGFydGlmYWN0IGRlbGV0ZWQgYnkgdGhlIENvcmVHYXJiYWdlQ29sbGVjdG9yCi0JICogQHBhcmFtIGluRGVidWdNb2RlCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldERlYnVnTW9kZShib29sZWFuIGluRGVidWdNb2RlKSB7Ci0JCWRlYnVnTW9kZSA9IGluRGVidWdNb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvR0NBY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvR0NBY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRkY2RjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL0dDQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZ2FyYmFnZWNvbGxlY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLlN5bmNocm9ub3VzUHJvdmlzaW9uaW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdPcHRpb25zOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBHQ0FjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdDX0VOQUJMRUQgPSAiZ2NfZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVCVUdfU1RSSU5HID0gR0NBY3RpdmF0b3IuSUQgKyAiL2RlYnVnIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVGQVVMVF9ERUJVRyA9IGZhbHNlOwotCi0Jc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQotCXByaXZhdGUgU3luY2hyb25vdXNQcm92aXNpb25pbmdMaXN0ZW5lciBidXNMaXN0ZW5lcjsKLQotCXN0YXRpYyBPYmplY3QgZ2V0U2VydmljZShCdW5kbGVDb250ZXh0IGN0eCwgU3RyaW5nIG5hbWUpIHsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjdHguZ2V0U2VydmljZVJlZmVyZW5jZShuYW1lKTsKLQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCByZXN1bHQgPSBjdHguZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQljdHgudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBpbkNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlHQ0FjdGl2YXRvci5jb250ZXh0ID0gaW5Db250ZXh0OwotCQlEZWJ1Z09wdGlvbnMgZGVidWcgPSAoRGVidWdPcHRpb25zKSBnZXRTZXJ2aWNlKGluQ29udGV4dCwgRGVidWdPcHRpb25zLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChkZWJ1ZyAhPSBudWxsKSB7Ci0JCQlDb3JlR2FyYmFnZUNvbGxlY3Rvci5zZXREZWJ1Z01vZGUoZGVidWcuZ2V0Qm9vbGVhbk9wdGlvbihERUJVR19TVFJJTkcsIERFRkFVTFRfREVCVUcpKTsKLQkJfQotCQlyZWdpc3RlckdDVHJpZ2dlcigpOwotCX0KLQotCS8vCVJlZ2lzdGVyIHRoZSBsaXN0ZW5lciB1c2VkIHRvIHRyaWdnZXIgdGhlIEdDLgotCXByaXZhdGUgdm9pZCByZWdpc3RlckdDVHJpZ2dlcigpIHsKLQkJSVByb3Zpc2lvbmluZ0V2ZW50QnVzIGV2ZW50QnVzID0gKElQcm92aXNpb25pbmdFdmVudEJ1cykgZ2V0U2VydmljZShHQ0FjdGl2YXRvci5jb250ZXh0LCBJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FKTsKLQkJaWYgKGV2ZW50QnVzID09IG51bGwpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBHQ0FjdGl2YXRvci5JRCwgTWVzc2FnZXMuTWlzc2luZ19idXMpKTsKLQkJCXJldHVybjsKLQkJfQotCQlldmVudEJ1cy5hZGRMaXN0ZW5lcihidXNMaXN0ZW5lciA9IG5ldyBTeW5jaHJvbm91c1Byb3Zpc2lvbmluZ0xpc3RlbmVyKCkgewotCQkJLy9UaGUgR0MgaXMgdHJpZ2dlcmVkIHdoZW4gYW4gdW5pbnN0YWxsIGV2ZW50IG9jY3VyZWQgZHVyaW5nIGEgInRyYW5zYWN0aW9uIiBhbmQgdGhlIHRyYW5zYWN0aW9uIGlzIGNvbW1pdHRlZC4gICAKLQkJCXByaXZhdGUgYm9vbGVhbiB1bmluc3RhbGxFdmVudE9jY3VycmVkID0gZmFsc2U7Ci0KLQkJCXB1YmxpYyB2b2lkIG5vdGlmeShFdmVudE9iamVjdCBvKSB7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBJbnN0YWxsYWJsZVVuaXRFdmVudCkgewotCQkJCQlJbnN0YWxsYWJsZVVuaXRFdmVudCBldmVudCA9IChJbnN0YWxsYWJsZVVuaXRFdmVudCkgbzsKLQkJCQkJaWYgKGV2ZW50LmlzVW5pbnN0YWxsKCkgJiYgZXZlbnQuaXNQb3N0KCkpIHsKLQkJCQkJCXVuaW5zdGFsbEV2ZW50T2NjdXJyZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgQ29tbWl0T3BlcmF0aW9uRXZlbnQpIHsKLQkJCQkJaWYgKHVuaW5zdGFsbEV2ZW50T2NjdXJyZWQgPT0gdHJ1ZSkgewotCQkJCQkJQ29tbWl0T3BlcmF0aW9uRXZlbnQgZXZlbnQgPSAoQ29tbWl0T3BlcmF0aW9uRXZlbnQpIG87Ci0JCQkJCQlpZiAoZ2V0Qm9vbGVhblByZWZlcmVuY2UoR0NfRU5BQkxFRCwgdHJ1ZSkpIHsKLQkJCQkJCQluZXcgR2FyYmFnZUNvbGxlY3RvcigpLnJ1bkdDKGV2ZW50LmdldFByb2ZpbGUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQl1bmluc3RhbGxFdmVudE9jY3VycmVkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBSb2xsYmFja09wZXJhdGlvbkV2ZW50KSB7Ci0JCQkJCXVuaW5zdGFsbEV2ZW50T2NjdXJyZWQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGdldEJvb2xlYW5QcmVmZXJlbmNlKFN0cmluZyBrZXksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCUlQcmVmZXJlbmNlc1NlcnZpY2UgcHJlZlNlcnZpY2UgPSAoSVByZWZlcmVuY2VzU2VydmljZSkgZ2V0U2VydmljZShjb250ZXh0LCBJUHJlZmVyZW5jZXNTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwcmVmU2VydmljZSA9PSBudWxsKQotCQkJcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLQkJTGlzdCBub2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gdG9kbyB3ZSBzaG91bGQgbG9vayBpbiB0aGUgaW5zdGFuY2Ugc2NvcGUgYXMgd2VsbCBidXQgaGF2ZSB0byBiZSBjYXJlZnVsIHRoYXQgdGhlIGluc3RhbmNlIGxvY2F0aW9uIGhhcyBiZWVuIHNldAotCQlub2Rlcy5hZGQobmV3IENvbmZpZ3VyYXRpb25TY29wZSgpLmdldE5vZGUoSUQpKTsKLQkJbm9kZXMuYWRkKG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKElEKSk7Ci0JCXJldHVybiBCb29sZWFuLnZhbHVlT2YocHJlZlNlcnZpY2UuZ2V0KGtleSwgQm9vbGVhbi50b1N0cmluZyhkZWZhdWx0VmFsdWUpLCAoUHJlZmVyZW5jZXNbXSkgbm9kZXMudG9BcnJheShuZXcgUHJlZmVyZW5jZXNbbm9kZXMuc2l6ZSgpXSkpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5yZWdpc3RlckdDVHJpZ2dlcigpIHsKLQkJSVByb3Zpc2lvbmluZ0V2ZW50QnVzIGV2ZW50QnVzID0gKElQcm92aXNpb25pbmdFdmVudEJ1cykgZ2V0U2VydmljZShHQ0FjdGl2YXRvci5jb250ZXh0LCBJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FKTsKLQkJaWYgKGV2ZW50QnVzICE9IG51bGwgJiYgYnVzTGlzdGVuZXIgIT0gbnVsbCkKLQkJCWV2ZW50QnVzLnJlbW92ZUxpc3RlbmVyKGJ1c0xpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgaW5Db250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdW5yZWdpc3RlckdDVHJpZ2dlcigpOwotCQlHQ0FjdGl2YXRvci5jb250ZXh0ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZ2FyYmFnZWNvbGxlY3Rvci9HYXJiYWdlQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL0dhcmJhZ2VDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzYmM1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL0dhcmJhZ2VDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5nYXJiYWdlY29sbGVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci0KLS8qKgotICogVGhlIG1haW4gY29udHJvbCBwb2ludCBmb3IgdGhlIHAyIGdhcmJhZ2UgY29sbGVjdG9yLiAgVGFrZXMgYSBQcm9maWxlIGFuZCBydW5zIHRoZSBDb3JlR2FyYmFnZUNvbGxlY3RvciB3aXRoIHRoZQotICogYXBwcm9wcmlhdGUgTWFya1NldHMgZm9yIHRoZSByZXBvc2l0b3JpZXMgdXNlZCBieSB0aGF0IFByb2ZpbGUuCi0gKiAKLSAqIFRha2VzIHRoZSBwcm9maWxlIHBhc3NlZCBpbiBhbmQgY3JlYXRlcyBhIHNldCAobWFya1NldCkgdGhhdCBtYXBzIHRoZSBhcnRpZmFjdCByZXBvc2l0b3JpZXMgaXQgdXNlcyB0byB0aGUKLSAqIGFydGlmYWN0IGtleXMgaXRzIElVcyBob2xkLiAgVGhpcyBpcyBkb25lIGJ5IGdldHRpbmcgTWFya1NldHMgZnJvbSBhbGwgcmVnaXN0ZXJlZCBJTWFya1NldFByb3ZpZGVycy4KLSAqIAotICogVGhlbiwgdGhlIE1hcmtTZXRzIGFyZSBvYnRhaW5lZCBmb3IgZXZlcnkgb3RoZXIgcmVnaXN0ZXJlZCBQcm9maWxlIGluIGEgc2ltaWxhciBmYXNoaW9uLiAgRWFjaCBNYXJrU2V0IGlzCi0gKiBjaGVja2VkIHRvIHNlZSBpZiBpdHMgYXJ0aWZhY3QgcmVwb3NpdG9yeSBpcyBhbHJlYWR5IGEga2V5IGluIG1hcmtTZXQuICBJZiBzbywgdGhhdCBNYXJrU2V0J3MgYXJ0aWZhY3Qga2V5cyAKLSAqIGFyZSBhZGRlZCB0byB0aGUgbGlzdCB0aGF0IGlzIG1hcHBlZCB0byBieSB0aGUgYXJ0aWZhY3QgcmVwb3NpdG9yeS4gCi0gKi8KLXB1YmxpYyBjbGFzcyBHYXJiYWdlQ29sbGVjdG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQVF9NQVJLU0VUID0gR0NBY3RpdmF0b3IuSUQgKyAiLm1hcmtzZXRwcm92aWRlcnMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBNYXBzIElBcnRpZmFjdFJlcG9zaXRvcnkgb2JqZWN0cyB0byB0aGVpciByZXNwZWN0aXZlICJtYXJrZWQgc2V0IiBvZiBJQXJ0aWZhY3RLZXlzCi0JICovCi0JcHJpdmF0ZSBNYXAgbWFya1NldDsKLQotCXB1YmxpYyB2b2lkIHJ1bkdDKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJbWFya1NldCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmICghdHJhdmVyc2VNYWluUHJvZmlsZShwcm9maWxlKSkKLQkJCXJldHVybjsKLQotCQkvL0NvbXBsZXRlIGVhY2ggTWFya1NldCB3aXRoIHRoZSBNYXJrU2V0cyBwcm92aWRlZCBieSBhbGwgb2YgdGhlIG90aGVyIHJlZ2lzdGVyZWQgUHJvZmlsZXMKLQkJdHJhdmVyc2VSZWdpc3RlcmVkUHJvZmlsZXMoKTsKLQotCQkvL1J1biB0aGUgR0Mgb24gZWFjaCBNYXJrU2V0Ci0JCWludm9rZUNvcmVHQygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiB0cmF2ZXJzZU1haW5Qcm9maWxlKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUmVnaXN0cnlGYWN0b3J5LmdldFJlZ2lzdHJ5KCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNvbmZpZ0VsdHMgPSByZWdpc3RyeS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoUFRfTUFSS1NFVCk7Ci0KLQkJLy9GaXJzdCB3ZSBjb2xsZWN0IGFsbCByZXBvcyBhbmQga2V5cyBmb3IgdGhlIHByb2ZpbGUgYmVpbmcgR0MnZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdFbHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIShjb25maWdFbHRzW2ldLmdldE5hbWUoKS5lcXVhbHMoInJ1biIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgcnVuQXR0cmlidXRlID0gY29uZmlnRWx0c1tpXTsKLQkJCWlmIChydW5BdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQljb250cmlidXRlTWFya1NldHMocnVuQXR0cmlidXRlLCBwcm9maWxlLCB0cnVlKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW52b2tlQ29yZUdDKCkgewotCQlJdGVyYXRvciBrZXlJdGVyYXRvciA9IG1hcmtTZXQua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGtleUl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSUFydGlmYWN0UmVwb3NpdG9yeSBuZXh0UmVwbyA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5KSBrZXlJdGVyYXRvci5uZXh0KCk7Ci0JCQlJQXJ0aWZhY3RLZXlbXSBrZXlzID0gKElBcnRpZmFjdEtleVtdKSAoKENvbGxlY3Rpb24pIG1hcmtTZXQuZ2V0KG5leHRSZXBvKSkudG9BcnJheShuZXcgSUFydGlmYWN0S2V5WzBdKTsKLQkJCU1hcmtTZXQgYU1hcmtTZXQgPSBuZXcgTWFya1NldChrZXlzLCBuZXh0UmVwbyk7Ci0JCQluZXcgQ29yZUdhcmJhZ2VDb2xsZWN0b3IoKS5jbGVhbihhTWFya1NldC5nZXRLZXlzKCksIGFNYXJrU2V0LmdldFJlcG8oKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdHJhdmVyc2VSZWdpc3RlcmVkUHJvZmlsZXMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFJlZ2lzdHJ5RmFjdG9yeS5nZXRSZWdpc3RyeSgpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjb25maWdFbHRzID0gcmVnaXN0cnkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKFBUX01BUktTRVQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ0VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghKGNvbmZpZ0VsdHNbaV0uZ2V0TmFtZSgpLmVxdWFscygicnVuIikpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBydW5BdHRyaWJ1dGUgPSBjb25maWdFbHRzW2ldOwotCQkJaWYgKHJ1bkF0dHJpYnV0ZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIEdDQWN0aXZhdG9yLmdldFNlcnZpY2UoR0NBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlpZiAocHJvZmlsZVJlZ2lzdHJ5ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSVByb2ZpbGVbXSByZWdpc3RlcmVkUHJvZmlsZXMgPSBwcm9maWxlUmVnaXN0cnkuZ2V0UHJvZmlsZXMoKTsKLQotCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWdpc3RlcmVkUHJvZmlsZXMubGVuZ3RoOyBqKyspIHsKLQkJCQljb250cmlidXRlTWFya1NldHMocnVuQXR0cmlidXRlLCByZWdpc3RlcmVkUHJvZmlsZXNbal0sIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUGFyYW1ldGVyaXplZFNhZmVSdW5uYWJsZSBpbXBsZW1lbnRzIElTYWZlUnVubmFibGUgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2ZnOwotCQlJUHJvZmlsZSBhUHJvZmlsZTsKLQkJTWFya1NldFtdIGFQcm9maWxlTWFya1NldHM7Ci0KLQkJcHVibGljIFBhcmFtZXRlcml6ZWRTYWZlUnVubmFibGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IHJ1bnRBdHRyaWJ1dGUsIElQcm9maWxlIHByb2ZpbGUpIHsKLQkJCWNmZyA9IHJ1bnRBdHRyaWJ1dGU7Ci0JCQlhUHJvZmlsZSA9IHByb2ZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBoYW5kbGVFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEdDQWN0aXZhdG9yLklELCBNZXNzYWdlcy5FcnJvcl9pbl9leHRlbnNpb24sIGV4Y2VwdGlvbikpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCQlJTWFya1NldFByb3ZpZGVyIGFNYXJrU2V0UHJvdmlkZXIgPSAoSU1hcmtTZXRQcm92aWRlcikgY2ZnLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUklCVVRFX0NMQVNTKTsKLQkJCWlmIChhTWFya1NldFByb3ZpZGVyID09IG51bGwpIHsKLQkJCQlhUHJvZmlsZU1hcmtTZXRzID0gbnVsbDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlhUHJvZmlsZU1hcmtTZXRzID0gYU1hcmtTZXRQcm92aWRlci5nZXRNYXJrU2V0cyhhUHJvZmlsZSk7Ci0JCX0KLQotCQlwdWJsaWMgTWFya1NldFtdIGdldFJlc3VsdCgpIHsKLQkJCXJldHVybiBhUHJvZmlsZU1hcmtTZXRzOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVNYXJrU2V0cyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgcnVuQXR0cmlidXRlLCBJUHJvZmlsZSBwcm9maWxlLCBib29sZWFuIGFkZFJlcG9zaXRvcmllcykgewotCQlQYXJhbWV0ZXJpemVkU2FmZVJ1bm5hYmxlIHByb3ZpZGVyRXhlY3V0b3IgPSBuZXcgUGFyYW1ldGVyaXplZFNhZmVSdW5uYWJsZShydW5BdHRyaWJ1dGUsIHByb2ZpbGUpOwotCQlTYWZlUnVubmVyLnJ1bihwcm92aWRlckV4ZWN1dG9yKTsKLQkJTWFya1NldFtdIGFQcm9maWxlTWFya1NldHMgPSBwcm92aWRlckV4ZWN1dG9yLmdldFJlc3VsdCgpOwotCQlpZiAoYVByb2ZpbGVNYXJrU2V0cy5sZW5ndGggPT0gMCB8fCBhUHJvZmlsZU1hcmtTZXRzWzBdID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhUHJvZmlsZU1hcmtTZXRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYVByb2ZpbGVNYXJrU2V0c1tpXSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgYVByb2ZpbGVNYXJrU2V0cy5sZW5ndGg7IGorKykgewotCQkJCWlmIChhUHJvZmlsZU1hcmtTZXRzW2pdID09IG51bGwpIHsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCUNvbGxlY3Rpb24ga2V5cyA9IChDb2xsZWN0aW9uKSBtYXJrU2V0LmdldChhUHJvZmlsZU1hcmtTZXRzW2pdLmdldFJlcG8oKSk7Ci0JCQkJaWYgKGtleXMgPT0gbnVsbCkgewotCQkJCQlpZiAoYWRkUmVwb3NpdG9yaWVzKSB7Ci0JCQkJCQlrZXlzID0gbmV3IEhhc2hTZXQoKTsKLQkJCQkJCW1hcmtTZXQucHV0KGFQcm9maWxlTWFya1NldHNbal0uZ2V0UmVwbygpLCBrZXlzKTsKLQkJCQkJCWFkZEtleXMoa2V5cywgYVByb2ZpbGVNYXJrU2V0c1tqXS5nZXRLZXlzKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJYWRkS2V5cyhrZXlzLCBhUHJvZmlsZU1hcmtTZXRzW2pdLmdldEtleXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEtleXMoQ29sbGVjdGlvbiBrZXlMaXN0LCBJQXJ0aWZhY3RLZXlbXSBrZXlBcnJheSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleUFycmF5Lmxlbmd0aDsgaSsrKQotCQkJa2V5TGlzdC5hZGQoa2V5QXJyYXlbaV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvSU1hcmtTZXRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZ2FyYmFnZWNvbGxlY3Rvci9JTWFya1NldFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZjIwMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZ2FyYmFnZWNvbGxlY3Rvci9JTWFya1NldFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5nYXJiYWdlY29sbGVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci0KLS8qKiAKLSAqIEFueSBjbGFzcyB3aGljaCBkZWNsYXJlcyBpdHNlbGYgYXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmdhcmJhZ2Vjb2xsZWN0b3IubWFya3NldHByb3ZpZGVycwotICogZXh0ZW5zaW9uIHBvaW50IG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiAgR2l2ZW4gYSBQcm9maWxlLCBpbXBsZW1lbnRvcnMgd2lsbCBuZWVkIHRvIHByb3ZpZGUgYW4gYXJyYXkgb2YKLSAqIE1hcmtTZXQgb2JqZWN0cywgZWFjaCBvZiB3aGljaCBzaG91bGQgY29udGFpbiBhbiBJQXJ0aWZhY3RSZXBvc2l0b3J5IGFuZCB0aGUgSUFydGlmYWN0S2V5cyB1c2VkIGJ5IHRoZSBnaXZlbgotICogUHJvZmlsZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWFya1NldFByb3ZpZGVyIHsKLQotCS8qKgotCSAqIFJldHVybnMgYSBNYXJrU2V0IGZvciBlYWNoIGJ1bmRsZSBwb29sIHVzZWQgYnkgYSBQcm9maWxlIHAuICBUaGUgTWFya1NldCB3aWxsIGNvbnRhaW4KLQkgKiBhbGwgb2YgdGhlIElBcnRpZmFjdEtleXMgZm91bmQgaW4gcCwgYXMgd2VsbCBhcyB0aGUgSUFydGlmYWN0UmVwb3NpdG9yeSBvdmVyIHdoaWNoIHRoZQotCSAqIHJvb3Qgc2V0IG9mIGtleXMgaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiBAcGFyYW0gcHJvZmlsZSBBIHByb2ZpbGUgd2hvc2UgQXJ0aWZhY3RSZXBvc2l0b3JpZXMgcmVxdWlyZSBhIGdhcmJhZ2UgY29sbGVjdGlvbgotCSAqIEByZXR1cm4gQW4gYXJyYXkgb2YgTWFya1NldCBvYmplY3QocykgY29udGFpbmluZyBwJ3MgSUFydGlmYWN0UmVwb3NpdG9yeSBhbmQgaXRzIHJvb3Qgc2V0IG9mIElBcnRpZmFjdEtleXMKLQkgKi8KLQlwdWJsaWMgTWFya1NldFtdIGdldE1hcmtTZXRzKElQcm9maWxlIHByb2ZpbGUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUFydGlmYWN0UmVwb3NpdG9yeSBmb3Igd2hpY2ggdGhpcyBJTWFya1NldFByb3ZpZGVyIHByb3ZpZGVzIGEgTWFya1NldC4KLQkgKiBAcGFyYW0gcCBUaGUgUHJvZmlsZSB3aG9zZSBJQXJ0aWZhY3RSZXBvc2l0b3J5IGlzIHJlcXVpcmVkCi0JICogQHJldHVybiBUaGUgSUFydGlmYWN0UmVwb3NpdG9yeSBmb3Igd2hpY2ggdGhpcyBJTWFya1NldFByb3ZpZGVyIHByb3ZpZGVzIGEgTWFya1NldC4KLQkgKi8KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KElQcm9maWxlIHApOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL01hcmtTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvTWFya1NldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIyNDQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvTWFya1NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZ2FyYmFnZWNvbGxlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci0KLS8qKgotICogV3JhcHBlciBjbGFzcyB1c2VkIHRvIHN0b3JlIGFuIElBcnRpZmFjdFJlcG9zaXRvcnkgYW5kIGl0cyByb290IHNldCBvZiBJQXJ0aWZhY3RLZXlzLgotICovCi1wdWJsaWMgY2xhc3MgTWFya1NldCB7Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBzZXQgZm9yIHJlcG8uICBUaGlzIGlzIHRoZSBzZXQgb2Yga2V5cyB0aGF0IGN1cnJlbnRseSBtYXAgdG8gYW4gYXJ0aWZhY3QgaW4gcmVwby4KLQkgKi8KLQlwcml2YXRlIElBcnRpZmFjdEtleVtdIGtleXM7Ci0KLQkvKioKLQkgKiBUaGUgQXJ0aWZhY3RSZXBvc2l0b3J5IGZvciB3aGljaCBhIHJvb3Qgc2V0IGlzIGJlaW5nIHN0b3JlZC4KLQkgKi8KLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbzsKLQotCXB1YmxpYyBNYXJrU2V0KElBcnRpZmFjdEtleVtdIGluS2V5cywgSUFydGlmYWN0UmVwb3NpdG9yeSBpblJlcG8pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpbktleXMpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGluUmVwbyk7Ci0JCWtleXMgPSBpbktleXM7Ci0JCXJlcG8gPSBpblJlcG87Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdEtleVtdIGdldEtleXMoKSB7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGdldFJlcG8oKSB7Ci0JCXJldHVybiByZXBvOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZ2FyYmFnZWNvbGxlY3Rvci9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvZ2FyYmFnZWNvbGxlY3Rvci9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDBmZWE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmdhcmJhZ2Vjb2xsZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmdhcmJhZ2Vjb2xsZWN0b3IubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcl9pbl9leHRlbnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19idXM7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2dhcmJhZ2Vjb2xsZWN0b3IvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg2MjMxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3Rvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9nYXJiYWdlY29sbGVjdG9yL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1FcnJvcl9pbl9leHRlbnNpb249QW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY2FsbGluZyB0byBhbiBJTWFya1NldFByb3ZpZGVyLgotTWlzc2luZ19idXM9UHJvdmlzaW9uaW5nRXZlbnRCdXMgc2VydmljZSBjb3VsZCBub3QgYmUgb2J0YWluZWQsIENvcmVHYXJiYWdlQ29sbGVjdG9yIHdpbGwgbm90IGZ1bmN0aW9uIHByb3Blcmx5LgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2RlYjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9DREMtMS4xJUZvdW5kYXRpb24tMS4xIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWI3ZjQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWEwYjNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzQxICswLDAgQEAKLSNUaHUgT2N0IDExIDE2OjQ2OjMxIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTRlMDA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLSNUaHUgT2N0IDExIDE2OjU0OjExIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD05OQotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbWV0aG9kcz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1zcF9jbGVhbnVwLmNvcnJlY3RfaW5kZW50YXRpb249ZmFsc2UKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlX2NoYW5nZXNfb25seT1mYWxzZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2EwYzcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuaW5zdGFsbGVyLkluc3RhbGxlckFjdGl2YXRvcgotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5vc2dpLAotIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLAotIG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5zd3QsCi0gb3JnLmVjbGlwc2UuY29yZS5uZXQ7YnVuZGxlLXZlcnNpb249IjEuMS4wIgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjEvRm91bmRhdGlvbi0xLjEsCi0gSjJTRS0xLjQKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmluc3RhbGxlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuaW5zdGFsbGVyLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5pbnN0YWxsZXI7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9SRUFETUUudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWZjY2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotIFRoaXMgaXMgYSBzaW1wbGUgaW5zdGFsbCBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyB1c2Ugb2YgcDIuICBTZWUgdGhlIGNsYXNzCi0gY29tbWVudCBvbiB0aGUgSW5zdGFsbERlc2NyaXB0aW9uIGNsYXNzIGZvciBkZXRhaWxzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTNkYzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHByb2R1Y3RfbGcuZ2lmLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvY29uZmlnLmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvY29uZmlnLmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjNzQwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL2NvbmZpZy5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0jIEVjbGlwc2UgcnVudGltZSBjb25maWd1cmF0aW9uIGZpbGUKLSMgVGhpcyBmaWxlIGNvbnRhaW5zIGEgbnVtYmVyIG9mIGtleS92YWx1ZSBwYWlycyB0aGF0IGFyZSBtZXJnZWQgaW50byB0aGUgCi0jIFN5c3RlbSBwcm9wZXJ0aWVzIG9uIHN5c3RlbSBzdGFydHVwLiAgVGhlIHZhbHVlcyBjb250cm9sIHRoZSB3YXkgdGhlIAotIyBydW50aW1lIGlzIHN0cnVjdHVyZWQgYW5kIHJ1bnMuCi0KLSMgTm90ZTogIE9ubHkgcGxhdGZvcm06L2Jhc2UvIGFuZCBmaWxlOiBVUkxzIGFyZSBzdXBwb3J0ZWQuICBJbiBnZW5lcmFsIHRoZSAKLSMgVVJMcyBnaXZlbiBtYXkgaW5jbHVkZSBhIHZlcnNpb24gbnVtYmVyIChlLmcuLCAuLi4vbG9jYXRpb25fMS4yLjMpLiAgCi0jIElmIGEgdmVyc2lvbiBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgc3lzdGVtIGJpbmRzCi0jIHRvIHRoZSBsb2NhdGlvbiB3aGljaCBtYXRjaGVzIGV4YWN0bHkgb3IgdG8gdGhlIHZlcnNpb25lZCBsb2NhdGlvbiB3aXRoIHRoZQotIyBsYXRlc3QgdmVyc2lvbiBudW1iZXIuICBJZiBhIHZlcnNpb24gbnVtYmVyIGlzIGdpdmVuIHRoZW4gb25seSBleGFjdCBtYXRjaGVzCi0jIGFyZSBjb25zaWRlcmVkLgotCi0jIFRoZSBVUkwgZm9yIHRoZSBydW50aW1lIGVudHJ5IHBvaW50LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSMgcGxhdGZvcm06L2Jhc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5vc2dpIAotI29zZ2kuZnJhbWV3b3JrPXBsYXRmb3JtOi9iYXNlL3BsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaQotCi0jIFRoZSBjbGFzc3BhdGggZm9yIHRoZSBmcmFtZXdvcmsgZm91bmQgYXQgdGhlIG9zZ2kuZnJhbWV3b3JrIGxvY2F0aW9uLiAgVGhpcyAKLSMgY29tbWEtc2VwYXJhdGVkIGxpc3QgY29udGFpbnMgZWl0aGVyIFVSTHMgb3Igc2ltcGxlIGVsZW1lbnQgbmFtZXMuICBTaW1wbGUKLSMgbmFtZXMgYXJlIGFzc3VtZWQgdG8gYmUgcmVsYXRpdmUgdG8gdGhlIGZyYW1ld29yaydzIGluc3RhbGwgZGlyZWN0b3J5LiAgCi0jIFR5cGljYWxseSB0aGlzIHZhbHVlIG5lZWQgbm90IGJlIHNldCBhcyBpdCBpcyBpbml0aWFsaXplZCBieSB0aGUgZnJhbWV3b3JrIGl0c2VsZi4KLSMgVmVyc2lvbiBtYXRjaCBzZWFyY2hpbmcgaXMgbm90IGRvbmUgZm9yIFVSTHMgbGlzdGVkIGhlcmUuCi0jb3NnaS5mcmFtZXdvcmtDbGFzc1BhdGggPQotCi0jIFRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBsb2NhdGlvbnMgdG8gc2VhcmNoIGZvciB0aGUgc3BsYXNoIHNjcmVlbiBmaWxlIChzcGxhc2guYm1wKS4KLSMgRm9yIGVhY2ggbGlzdCBlbGVtZW50IGEgc3ViZGlyZWN0b3J5IHN0cnVjdHVyZSBiYXNlZCBvbiB0aGUgcGF0dGVybiBubC88bG9jYWxlPiBpcyBzZWFyY2hlZC4KLSMgVGhlIHN5c3RlbSBiaW5kcyB0byB0aGUgZmlyc3QgbWF0Y2hpbmcgZmlsZS4gIFRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUuCi0jb3NnaS5zcGxhc2hQYXRoPQotCi0jIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3BsYXNoIHNjcmVlbiBmaWxlLiAgSWYgdGhpcyB2YWx1ZSBpcyBzZXQgYXQgc3lzdGVtIHN0YXJ0dXAgaXQgaXMgdXNlZCAKLSMgaW4gZmF2b3VyIG9mIHRoZSBvc2dpLnNwbGFzaFBhdGggc2VhcmNoaW5nIG91dGxpbmVkIGFib3ZlLiAgSWYgdGhlIHZhbHVlIGlzIG5vdCBzZXQgCi0jIHRoZSBzZWFyY2hpbmcgaXMgZG9uZSBhbmQgdGhpcyBrZXkgaXMgYm91bmQgdG8gdGhlIHJlc3VsdCBvZiB0aGUgc2VhcmNoLgotI29zZ2kuc3BsYXNoTG9jYXRpb24gPQotCi0jIFRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBidW5kbGVzIHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCBhbmQgb3B0aW9uYWxseSBzdGFydGVkCi0jIG9uY2UgdGhlIHN5c3RlbSBpcyB1cCBhbmQgcnVubmluZy4gIEVhY2ggZW50cnkgaWYgb2YgdGhlIGZvcm0KLSMgICAgIDxVUkwgfCBzaW1wbGUgYnVuZGxlIGxvY2F0aW9uPltAIFs8c3RhcnRsZXZlbD5dIFsiOnN0YXJ0Il1dCi0jIElmIHRoZSBzdGFydGxldmVsIGlzIG9taXR0ZWQgdGhlbiB0aGUgZnJhbWV3b3JrIHdpbGwgdXNlIHRoZSBkZWZhdWx0IHN0YXJ0IGxldmVsIGZvciB0aGUgYnVuZGxlLgotIyBJZiB0aGUgInN0YXJ0IiB0YWcgaXMgYWRkZWQgdGhlbiB0aGUgYnVuZGxlIHdpbGwgYmUgbWFya2VkIGFzIHN0YXJ0ZWQgYWZ0ZXIgYmVpbmcgaW5zdGFsbGVkLgotIyBTaW1wbGUgYnVuZGxlIGxvY2F0aW9ucyBhcmUgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gdGhlIGZyYW1ld29yaydzIHBhcmVudCBkaXJlY3RvcnkuCi0jIFRoZSBzdGFydGxldmVsIGluZGljYXRlcyB0aGUgT1NHaSBzdGFydCBsZXZlbCBhdCB3aGljaCB0aGUgYnVuZGxlIHNob3VsZCBydW4uCi1vc2dpLmJ1bmRsZXM9XAotCW9yZy5lY2xpcHNlLmNvcmUuam9icyxcCi0Jb3JnLmVjbGlwc2UuY29yZS5uZXQsXAotCW9yZy5lY2xpcHNlLmVjZixcCi0Jb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlcixcCi0Jb3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5LFwKLQlvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LmFwcEBzdGFydCxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24sXAotCW9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4sXAotCW9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veEBzdGFydCxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcyxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSxcCi0gICAgb3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eSxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IsXAotCW9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yQHN0YXJ0LFwKLQlvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzLFwKLQlvcmcuZWNsaXBzZS5zd3QsXAotCW9yZy5lY2xpcHNlLnN3dC53aW4zMi53aW4zMi54ODYsXAotCW9yZy5lY2xpcHNlLnN3dC5ndGsubGludXgueDg2LFwKLQlvcmcuZWNsaXBzZS5zd3QuY2FyYm9uLm1hY29zeCxcCi0Jb3JnLnNhdDRqLmNvcmUsXAotCW9yZy5zYXQ0ai5wYgotCi1vcmcuZWNsaXBzZS51cGRhdGUucmVjb25jaWxlPWZhbHNlCi0KLSMgVGhlIHByb2R1Y3QgdG8gcnVuLiAgQSBnaXZlbiBFY2xpcHNlIGNvbmZpZ3VyYXRpb24gbWF5IGNvbnRhaW4gbWFueSBwcm9kdWN0cy4KLSMgVGhlIHByb2R1Y3QgaWRlbnRpZmllZCB3aWxsIHN1cHBseSB0aGUgYnJhbmRpbmcgKHdpbmRvdyBpY29ucywgdGl0bGUgYmFyIHRleHQpIGV0YyAKLSMgYXMgd2VsbCBhcyBkZWZpbmUgdGhlIGRlZmF1bHQgYXBwbGljYXRpb24gdG8gcnVuLiAgCi1lY2xpcHNlLnByb2R1Y3Q9b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIucHJvZHVjdAotCi0jIFRoZSBhcHBsaWNhdGlvbiB0byBydW4uICBUaGUgdmFsdWUgc3BlY2lmaWVkIGhlcmUgaXMgdGhlIGlkIG9mIHRoZSBhcHBsaWNhdGlvbiBleHRlbnNpb24KLSMgdGhlIHJ1bnRpbWUgd2lsbCBmaW5kLCBpbnN0YW50aWF0ZSBhbmQgZXhlY3V0ZSBvbmNlIHRoZSBzeXN0ZW0gaXMgdXAuICBOb3RlIHRoYXQgdHlwaWNhbGx5IAotIyB0aGUgaWRlbnRpZmllZCBlY2xpcHNlLnByb2R1Y3QgZGVmaW5lcyB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0byBydW4uCi0jZWNsaXBzZS5hcHBsaWNhdGlvbj0KLQotIyBUaGUgYnVpbGQgaWRlbnRpZmllcgotZWNsaXBzZS5idWlsZElkPUBidWlsZEAKLQotIyBFbmQgb2YgZmlsZSBtYXJrZXIgLSBtdXN0IGJlIGhlcmUKLWVvZj1lb2YKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL2luc3RhbGxlci5wcm9kdWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9pbnN0YWxsZXIucHJvZHVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4ODAxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL2luc3RhbGxlci5wcm9kdWN0CisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/cGRlIHZlcnNpb249IjMuNCI/PgotCi08cHJvZHVjdCBuYW1lPSJFcXVpbm94IHAyIEluc3RhbGxlciIgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLnByb2R1Y3QiIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci5hcHBsaWNhdGlvbiIgdXNlRmVhdHVyZXM9ImZhbHNlIj4KLQotICAgPGFib3V0SW5mbz4KLSAgICAgIDxpbWFnZSBwYXRoPSJwcm9kdWN0X2xnLmdpZiIvPgotICAgICAgPHRleHQ+Ci0gICAgICAgICBQMiBJbnN0YWxsZXIKLSAgICAgIDwvdGV4dD4KLSAgIDwvYWJvdXRJbmZvPgotCi0gICA8Y29uZmlnSW5pIHVzZT0iZGVmYXVsdCI+Ci0gICAgICA8bGludXg+L29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL2NvbmZpZy5pbmk8L2xpbnV4PgotICAgICAgPG1hY29zeD4vb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvY29uZmlnLmluaTwvbWFjb3N4PgotICAgICAgPHNvbGFyaXM+L29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL2NvbmZpZy5pbmk8L3NvbGFyaXM+Ci0gICAgICA8d2luMzI+L29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL2NvbmZpZy5pbmk8L3dpbjMyPgotICAgPC9jb25maWdJbmk+Ci0KLSAgIDxsYXVuY2hlckFyZ3M+Ci0gICAgICA8dm1BcmdzPi1Eb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsRGVzY3JpcHRpb249aHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvdGVzdFVwZGF0ZXMvc2RrLWluc3RhbGxlci5wcm9wZXJ0aWVzPC92bUFyZ3M+Ci0gICA8L2xhdW5jaGVyQXJncz4KLQotICAgPHdpbmRvd0ltYWdlcy8+Ci0KLSAgIDxzcGxhc2gKLSAgICAgIGxvY2F0aW9uPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlciIgLz4KLSAgIDxsYXVuY2hlciBuYW1lPSJwMmluc3RhbGxlciI+Ci0gICAgICA8c29sYXJpcy8+Ci0gICAgICA8d2luIHVzZUljbz0iZmFsc2UiPgotICAgICAgICAgPGJtcC8+Ci0gICAgICA8L3dpbj4KLSAgIDwvbGF1bmNoZXI+Ci0KLSAgIDx2bT4KLSAgIDwvdm0+Ci0KLSAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLm5ldCIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZWNmIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHkiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXIiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guYXBwIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbiIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ii8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNhcmJvbi5tYWNvc3giLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4NiIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYiIGZyYWdtZW50PSJ0cnVlIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvciIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5Ii8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5Ii8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLm9zZ2kiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dCIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uuc3d0LmNhcmJvbi5tYWNvc3giLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsubGludXgueDg2Ii8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3Qud2luMzIud2luMzIueDg2IiBmcmFnbWVudD0idHJ1ZSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLnNhdDRqLmNvcmUiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5zYXQ0ai5wYiIvPgotICAgPC9wbHVnaW5zPgotCi08L3Byb2R1Y3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmMjQwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBFcXVpbm94IFByb3Zpc2lvbmluZyBJbnN0YWxsZXIKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxODAwZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJhcHBsaWNhdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmluc3RhbGxlci5JbnN0YWxsQXBwbGljYXRpb24iPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0icHJvZHVjdCIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJvZHVjdHMiPgotICAgICAgPHByb2R1Y3QKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci5hcHBsaWNhdGlvbiIKLSAgICAgICAgICAgIG5hbWU9IkVxdWlub3ggcDIgSW5zdGFsbGVyIj4KLSAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgbmFtZT0iYXBwTmFtZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJFcXVpbm94IHAyIEluc3RhbGxlciI+Ci0gICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgPHByb3BlcnR5Ci0gICAgICAgICAgICAgICBuYW1lPSJhYm91dEltYWdlIgotICAgICAgICAgICAgICAgdmFsdWU9InByb2R1Y3RfbGcuZ2lmIj4KLSAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9ImFib3V0VGV4dCIKLSAgICAgICAgICAgICAgIHZhbHVlPSJwMiBJbnN0YWxsZXIiPgotICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgIDwvcHJvZHVjdD4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvcHJvZHVjdF9sZy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3Byb2R1Y3RfbGcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDk1ZTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvcHJvZHVjdF9sZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3Nkay1pbnN0YWxsZXIucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc2RrLWluc3RhbGxlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDMwNDIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc2RrLWluc3RhbGxlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1lY2xpcHNlLnAyLm1ldGFkYXRhPWh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvZWNsaXBzZS90ZXN0VXBkYXRlcy8KLWVjbGlwc2UucDIuYXJ0aWZhY3RzPWh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvZWNsaXBzZS90ZXN0VXBkYXRlcy8KLWVjbGlwc2UucDIuZmxhdm9yPXRvb2xpbmcKLWVjbGlwc2UucDIucHJvZmlsZU5hbWU9RWNsaXBzZSBTREsKLWVjbGlwc2UucDIubGF1bmNoZXJOYW1lPWVjbGlwc2UKLWVjbGlwc2UucDIucm9vdElkPXNkawotZWNsaXBzZS5wMi5hdXRvU3RhcnQ9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvSGVhZGxlc3NJbnN0YWxsQWR2aXNvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvSGVhZGxlc3NJbnN0YWxsQWR2aXNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzRkMTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0hlYWRsZXNzSW5zdGFsbEFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmluc3RhbGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmluc3RhbGxlci4qOwotCi0vKioKLSAqIEEgaGVhZGxlc3MgaW5zdGFsbCBhZHZpc29yIHRoYXQgcHJpbnRzIGV2ZXJ5dGhpbmcgdG8gYSBsb2cuCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWFkbGVzc0luc3RhbGxBZHZpc29yIGV4dGVuZHMgSW5zdGFsbEFkdmlzb3IgewotCWNsYXNzIEhlYWRsZXNzUHJvZ3Jlc3NNb25pdG9yIGltcGxlbWVudHMgSVByb2dyZXNzTW9uaXRvciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBjYW5jZWxlZDsKLQotCQlwdWJsaWMgdm9pZCBiZWdpblRhc2soU3RyaW5nIG5hbWUsIGludCB0b3RhbFdvcmspIHsKLQkJCXNldFJlc3VsdChuZXcgU3RhdHVzKElTdGF0dXMuSU5GTywgSW5zdGFsbGVyQWN0aXZhdG9yLlBJX0lOU1RBTExFUiwgbmFtZSkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9uZSgpIHsKLQkJCS8vbm90aGluZyB0byBkbwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW50ZXJuYWxXb3JrZWQoZG91YmxlIHdvcmspIHsKLQkJCS8vbm90aGluZyB0byBkbwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJCXJldHVybiBjYW5jZWxlZDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJCWNhbmNlbGVkID0gdmFsdWU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkgewotCQkJc2V0UmVzdWx0KG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCBJbnN0YWxsZXJBY3RpdmF0b3IuUElfSU5TVEFMTEVSLCBuYW1lKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdWJUYXNrKFN0cmluZyBuYW1lKSB7Ci0JCQkvL25vdGhpbmcgdG8gZG8KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdvcmtlZChpbnQgd29yaykgewotCQkJLy9ub3RoaW5nIHRvIGRvCi0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBwZXJmb3JtSW5zdGFsbChJSW5zdGFsbE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJcmV0dXJuIG9wZXJhdGlvbi5pbnN0YWxsKG5ldyBIZWFkbGVzc1Byb2dyZXNzTW9uaXRvcigpKTsKLQl9Ci0KLQlwdWJsaWMgSW5zdGFsbERlc2NyaXB0aW9uIHByZXBhcmVJbnN0YWxsRGVzY3JpcHRpb24oSW5zdGFsbERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCS8vIFRoZSBoZWFkbGVzcyBhZHZpc29yIGhhcyBubyBmdXJ0aGVyIGlucHV0IG9uIHRoZSBpbnN0YWxsIGxvY2F0aW9uLgotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJvbXB0Rm9yTGF1bmNoKEluc3RhbGxEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0KElTdGF0dXMgc3RhdHVzKSB7Ci0JCUxvZ0hlbHBlci5sb2coc3RhdHVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJLy9ub3RoaW5nIHRvIGRvCi0JfQotCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJLy9ub3RoaW5nIHRvIGRvCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2luc3RhbGxlci9JbnN0YWxsQXBwbGljYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjg1ZTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmluc3RhbGxlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUubmV0LnByb3h5LklQcm94eVNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5pbnN0YWxsZXIudWkuU1dUSW5zdGFsbEFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5pbnN0YWxsZXIuSW5zdGFsbEFkdmlzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5pbnN0YWxsZXIuSW5zdGFsbERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGlzIGEgc2ltcGxlIGluc3RhbGxlciBhcHBsaWNhdGlvbiBidWlsdCB1c2luZyBQMi4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlIGdpdmVuCi0gKiBhbiAiaW5zdGFsbCBkZXNjcmlwdGlvbiIgYXMgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgb3Igc3lzdGVtIHByb3BlcnR5IAotICogKHtAbGluayAjU1lTX1BST1BfSU5TVEFMTF9ERVNDUklQVElPTn0pLiAgVGhlIGFwcGxpY2F0aW9uIHJlYWRzIHRoaXMKLSAqIGluc3RhbGwgZGVzY3JpcHRpb24sIGFuZCBsb29rcyBmb3IgYW4gZXhpc3RpbmcgcHJvZmlsZSBpbiB0aGUgbG9jYWwgaW5zdGFsbCByZWdpc3RyeSB0aGF0Ci0gKiBtYXRjaGVzIGl0LiAgSWYgbm8gcHJvZmlsZSBpcyBmb3VuZCwgaXQgY3JlYXRlcyBhIG5ldyBwcm9maWxlLCBhbmQgaW5zdGFsbHMgdGhlIHJvb3QKLSAqIElVIGluIHRoZSBpbnN0YWxsIGRlc2NyaXB0aW9uIGludG8gdGhlIHByb2ZpbGUuIEl0IG1heSB0aGVuIGxhdW5jaCB0aGUgaW5zdGFsbGVkIGFwcGxpY2F0aW9uLAotICogZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpY2F0aW9uIGluIHRoZSBpbnN0YWxsIGRlc2NyaXB0aW9uLiAgSWYgYW4gZXhpc3RpbmcgcHJvZmlsZSBpcyBmb3VuZCwKLSAqIHRoZSBhcHBsaWNhdGlvbiBpbnN0ZWFkIHBlcmZvcm1zIGFuIHVwZGF0ZSBvbiB0aGUgZXhpc3RpbmcgcHJvZmlsZSB3aXRoIHRoZSBuZXcgcm9vdAotICogSVUgaW4gdGhlIGluc3RhbGwgZGVzY3JpcHRpb24uIFRodXMsIGFuIGluc3RhbGxlZCBhcHBsaWNhdGlvbiBjYW4gYmUgdXBkYXRlZCBieSBkcm9wcGluZwotICogaW4gYSBuZXcgaW5zdGFsbCBkZXNjcmlwdGlvbiBmaWxlLCBhbmQgcmUtcnVubmluZyB0aGlzIGluc3RhbGxlciBhcHBsaWNhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbiB7Ci0JLyoqCi0JICogQSBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyB0aGUgVVJMIG9mIGFuIGluc3RhbGwgZGVzY3JpcHRpb24uIEFuIGluc3RhbGwgZGVzY3JpcHRpb24gaXMgYSBmaWxlCi0JICogdGhhdCBjb250YWlucyBhbGwgdGhlIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGNvbXBsZXRlIHRoZSBpbnN0YWxsLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNfUFJPUF9JTlNUQUxMX0RFU0NSSVBUSU9OID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbERlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGluc3RhbGwgYWR2aXNvci4gVGhpcyBmaWVsZCBpcyBub24gbnVsbCB3aGlsZSB0aGUgaW5zdGFsbCBhcHBsaWNhdGlvbiBpcyBydW5uaW5nLgotCSAqLwotCXByaXZhdGUgSW5zdGFsbEFkdmlzb3IgYWR2aXNvcjsKLQotCS8qKgotCSAqIFRocm93cyBhbiBleGNlcHRpb24gb2Ygc2V2ZXJpdHkgZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBDb3JlRXhjZXB0aW9uIGZhaWwoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGZhaWwobWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBvZiBzZXZlcml0eSBlcnJvciB3aXRoIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIENvcmVFeGNlcHRpb24gZmFpbChTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHRocm93YWJsZSkgewotCQlyZXR1cm4gbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJbnN0YWxsZXJBY3RpdmF0b3IuUElfSU5TVEFMTEVSLCBtZXNzYWdlLCB0aHJvd2FibGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgaW5zdGFsbCBkZXNjcmlwdGlvbiwgZmlsbGluZyBpbiBhbnkgbWlzc2luZyBkYXRhIGlmIG5lZWRlZC4KLQkgKi8KLQlwcml2YXRlIEluc3RhbGxEZXNjcmlwdGlvbiBjb21wdXRlSW5zdGFsbERlc2NyaXB0aW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJbnN0YWxsRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBmZXRjaEluc3RhbGxEZXNjcmlwdGlvbihTdWJNb25pdG9yLmNvbnZlcnQobnVsbCkpOwotCQlyZXR1cm4gYWR2aXNvci5wcmVwYXJlSW5zdGFsbERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIEluc3RhbGxBZHZpc29yIGNyZWF0ZUluc3RhbGxDb250ZXh0KCkgewotCQkvL1RPRE8gY3JlYXRlIGFuIGFwcHJvcHJpYXRlIGFkdmlzb3IgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaGVhZGxlc3Mgb3IgR1VJIGluc3RhbGwgaXMgZGVzaXJlZC4KLQkJSW5zdGFsbEFkdmlzb3IgcmVzdWx0ID0gbmV3IFNXVEluc3RhbGxBZHZpc29yKCk7Ci0JCXJlc3VsdC5zdGFydCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEZldGNoIGFuZCByZXR1cm4gdGhlIGluc3RhbGwgZGVzY3JpcHRpb24gdG8gYmUgaW5zdGFsbGVkLgotCSAqLwotCXByaXZhdGUgSW5zdGFsbERlc2NyaXB0aW9uIGZldGNoSW5zdGFsbERlc2NyaXB0aW9uKFN1Yk1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgc2l0ZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eShTWVNfUFJPUF9JTlNUQUxMX0RFU0NSSVBUSU9OKTsKLQkJaWYgKHNpdGUgPT0gbnVsbCkKLQkJCXRocm93IGZhaWwoTWVzc2FnZXMuQXBwX05vU2l0ZSk7Ci0JCXRyeSB7Ci0JCQlVUkwgc2l0ZVVSTCA9IG5ldyBVUkwoc2l0ZSk7Ci0JCQlyZXR1cm4gSW5zdGFsbERlc2NyaXB0aW9uUGFyc2VyLmxvYWRGcm9tUHJvcGVydGllcyhzaXRlVVJMLm9wZW5TdHJlYW0oKSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBmYWlsKE1lc3NhZ2VzLkFwcF9JbnZhbGlkU2l0ZSArIHNpdGUsIGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBmYWlsKE1lc3NhZ2VzLkFwcF9JbnZhbGlkU2l0ZSArIHNpdGUsIGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGdldFN0YXR1cyhmaW5hbCBFeGNlcHRpb24gZmFpbHVyZSkgewotCQlUaHJvd2FibGUgY2F1c2UgPSBmYWlsdXJlOwotCQkvL3Vud3JhcCB0YXJnZXQgZXhjZXB0aW9uIGlmIGFwcGxpY2FibGUKLQkJaWYgKGZhaWx1cmUgaW5zdGFuY2VvZiBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uKSB7Ci0JCQljYXVzZSA9ICgoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbikgZmFpbHVyZSkuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCQlpZiAoY2F1c2UgPT0gbnVsbCkKLQkJCQljYXVzZSA9IGZhaWx1cmU7Ci0JCX0KLQkJaWYgKGNhdXNlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikKLQkJCXJldHVybiAoKENvcmVFeGNlcHRpb24pIGNhdXNlKS5nZXRTdGF0dXMoKTsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSW5zdGFsbGVyQWN0aXZhdG9yLlBJX0lOU1RBTExFUiwgTWVzc2FnZXMuQXBwX0Vycm9yLCBjYXVzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxhdW5jaFByb2R1Y3QoSW5zdGFsbERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYXRoIGluc3RhbGxMb2NhdGlvbiA9IGRlc2NyaXB0aW9uLmdldEluc3RhbGxMb2NhdGlvbigpOwotCQlJUGF0aCB0b1J1biA9IGluc3RhbGxMb2NhdGlvbi5hcHBlbmQoZGVzY3JpcHRpb24uZ2V0TGF1bmNoZXJOYW1lKCkpOwotCQl0cnkgewotCQkJUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyh0b1J1bi50b1N0cmluZygpLCBudWxsLCBpbnN0YWxsTG9jYXRpb24udG9GaWxlKCkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBmYWlsKE1lc3NhZ2VzLkFwcF9MYXVuY2hGYWlsZWQgKyB0b1J1biwgZSk7Ci0JCX0KLQkJLy93YWl0IGEgZmV3IHNlY29uZHMgdG8gZ2l2ZSB0aGUgdXNlciBhIGNoYW5jZSB0byByZWFkIHRoZSBtZXNzYWdlCi0JCXRyeSB7Ci0JCQlUaHJlYWQuc2xlZXAoMzAwMCk7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCS8vaWdub3JlCi0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb24jc3RhcnQob3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ29udGV4dCkgewotCQl0cnkgewotCQkJYXBwQ29udGV4dC5hcHBsaWNhdGlvblJ1bm5pbmcoKTsKLQkJCWluaXRpYWxpemVQcm94eVN1cHBvcnQoKTsKLQkJCWFkdmlzb3IgPSBjcmVhdGVJbnN0YWxsQ29udGV4dCgpOwotCQkJLy9mZXRjaCBkZXNjcmlwdGlvbiBvZiB3aGF0IHRvIGluc3RhbGwKLQkJCUluc3RhbGxEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0aW9uID0gY29tcHV0ZUluc3RhbGxEZXNjcmlwdGlvbigpOwotCQkJCXN0YXJ0UmVxdWlyZWRCdW5kbGVzKGRlc2NyaXB0aW9uKTsKLQkJCQkvL3BlcmZvcm0gbG9uZyBydW5uaW5nIGluc3RhbGwgb3BlcmF0aW9uCi0JCQkJSW5zdGFsbFVwZGF0ZVByb2R1Y3RPcGVyYXRpb24gb3BlcmF0aW9uID0gbmV3IEluc3RhbGxVcGRhdGVQcm9kdWN0T3BlcmF0aW9uKEluc3RhbGxlckFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpLCBkZXNjcmlwdGlvbik7Ci0JCQkJSVN0YXR1cyByZXN1bHQgPSBhZHZpc29yLnBlcmZvcm1JbnN0YWxsKG9wZXJhdGlvbik7Ci0JCQkJaWYgKCFyZXN1bHQuaXNPSygpKSB7Ci0JCQkJCUxvZ0hlbHBlci5sb2cocmVzdWx0KTsKLQkJCQkJYWR2aXNvci5zZXRSZXN1bHQocmVzdWx0KTsKLQkJCQkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX09LOwotCQkJCX0KLQkJCQkvL2p1c3QgZXhpdCBhZnRlciBhIHN1Y2Nlc3NmdWwgdXBkYXRlCi0JCQkJaWYgKCFvcGVyYXRpb24uaXNGaXJzdEluc3RhbGwoKSkKLQkJCQkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX09LOwotCQkJCWlmIChjYW5BdXRvU3RhcnQoZGVzY3JpcHRpb24pKQotCQkJCQlsYXVuY2hQcm9kdWN0KGRlc2NyaXB0aW9uKTsKLQkJCQllbHNlIHsKLQkJCQkJLy9ub3RpZnkgdXNlciB0aGF0IHRoZSBwcm9kdWN0IHdhcyBpbnN0YWxsZWQKLQkJCQkJLy9UT0RPIHByZXNlbnQgdGhlIHVzZXIgYW4gb3B0aW9uIHRvIGltbWVkaWF0ZWx5IHN0YXJ0IHRoZSBwcm9kdWN0Ci0JCQkJCWFkdmlzb3Iuc2V0UmVzdWx0KHJlc3VsdCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCWFkdmlzb3Iuc2V0UmVzdWx0KFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJSVN0YXR1cyBlcnJvciA9IGdldFN0YXR1cyhlKTsKLQkJCQlhZHZpc29yLnNldFJlc3VsdChlcnJvcik7Ci0JCQkJTG9nSGVscGVyLmxvZyhlcnJvcik7Ci0JCQl9Ci0JCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfT0s7Ci0JCX0gZmluYWxseSB7Ci0JCQlhZHZpc29yLnN0b3AoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUHJveHlTdXBwb3J0KCkgewotCQlJUHJveHlTZXJ2aWNlIHByb3hpZXMgPSAoSVByb3h5U2VydmljZSkgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEluc3RhbGxlckFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0Q29udGV4dCgpLCBJUHJveHlTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwcm94aWVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXByb3hpZXMuc2V0UHJveGllc0VuYWJsZWQodHJ1ZSk7Ci0JCXByb3hpZXMuc2V0U3lzdGVtUHJveGllc0VuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBjb25maWd1cmF0aW9uIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gaW5zdGFsbAotCSAqIGRlc2NyaXB0aW9uIGNhbiBiZSBzdGFydGVkIGF1dG9tYXRpY2FsbHkuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhbkF1dG9TdGFydChJbnN0YWxsRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJaWYgKCFkZXNjcmlwdGlvbi5pc0F1dG9TdGFydCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvL2Nhbid0IHN0YXJ0IGlmIHdlIGRvbid0IGtub3cgbGF1bmNoZXIgbmFtZSBhbmQgcGF0aAotCQlpZiAoZGVzY3JpcHRpb24uZ2V0TGF1bmNoZXJOYW1lKCkgPT0gbnVsbCB8fCBkZXNjcmlwdGlvbi5nZXRJbnN0YWxsTG9jYXRpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYWR2aXNvci5wcm9tcHRGb3JMYXVuY2goZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIFN0YXJ0cyB0aGUgcDIgYnVuZGxlcyBuZWVkZWQgdG8gY29udGludWUgd2l0aCB0aGUgaW5zdGFsbC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc3RhcnRSZXF1aXJlZEJ1bmRsZXMoSW5zdGFsbERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlQYXRoIGluc3RhbGxMb2NhdGlvbiA9IGRlc2NyaXB0aW9uLmdldEluc3RhbGxMb2NhdGlvbigpOwotCQlpZiAoaW5zdGFsbExvY2F0aW9uID09IG51bGwpCi0JCQl0aHJvdyBmYWlsKE1lc3NhZ2VzLkFwcF9Ob0luc3RhbGxMb2NhdGlvbiwgbnVsbCk7Ci0JCS8vc2V0IGFnZW50IGxvY2F0aW9uIGlmIHNwZWNpZmllZAotCQlJUGF0aCBhZ2VudExvY2F0aW9uID0gZGVzY3JpcHRpb24uZ2V0QWdlbnRMb2NhdGlvbigpOwotCQlpZiAoYWdlbnRMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgYWdlbnRBcmVhID0gU3lzdGVtLmdldFByb3BlcnR5KCJlY2xpcHNlLnAyLmRhdGEuYXJlYSIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYWdlbnRBcmVhID09IG51bGwgfHwgYWdlbnRBcmVhLmxlbmd0aCgpID09IDApCi0JCQkJU3lzdGVtLnNldFByb3BlcnR5KCJlY2xpcHNlLnAyLmRhdGEuYXJlYSIsIGFnZW50TG9jYXRpb24udG9PU1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAKLQkJfQotCQkvL3N0YXJ0IHVwIHAyCi0JCXRyeSB7Ci0JCQlJbnN0YWxsZXJBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCIpLnN0YXJ0KEJ1bmRsZS5TVEFSVF9UUkFOU0lFTlQpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBmYWlsKE1lc3NhZ2VzLkFwcF9GYWlsZWRTdGFydCwgZSk7Ci0JCX0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb24jc3RvcCgpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQkJLy9ub3RlIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgZnJvbSBhbm90aGVyIHRocmVhZAotCQlJbnN0YWxsQWR2aXNvciB0ZW1wQ29udGV4dCA9IGFkdmlzb3I7Ci0JCWlmICh0ZW1wQ29udGV4dCAhPSBudWxsKSB7Ci0JCQl0ZW1wQ29udGV4dC5zdG9wKCk7Ci0JCQlhZHZpc29yID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxEZXNjcmlwdGlvblBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvSW5zdGFsbERlc2NyaXB0aW9uUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5MGY4MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvSW5zdGFsbERlc2NyaXB0aW9uUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5pbnN0YWxsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuaW5zdGFsbGVyLkluc3RhbGxEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIGluc3RhbGwgZGVzY3JpcHRpb25zIGZyb20gYSBzdHJlYW0uCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsRGVzY3JpcHRpb25QYXJzZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0FHRU5UX0xPQ0FUSU9OID0gImVjbGlwc2UucDIuYWdlbnRMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9BUlRJRkFDVF9SRVBPU0lUT1JZID0gImVjbGlwc2UucDIuYXJ0aWZhY3RzIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQlVORExFX0xPQ0FUSU9OID0gImVjbGlwc2UucDIuYnVuZGxlTG9jYXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9JTlNUQUxMX0xPQ0FUSU9OID0gImVjbGlwc2UucDIuaW5zdGFsbExvY2F0aW9uIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSVNfQVVUT19TVEFSVCA9ICJlY2xpcHNlLnAyLmF1dG9TdGFydCI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0xBVU5DSEVSX05BTUUgPSAiZWNsaXBzZS5wMi5sYXVuY2hlck5hbWUiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9NRVRBREFUQV9SRVBPU0lUT1JZID0gImVjbGlwc2UucDIubWV0YWRhdGEiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9QUk9GSUxFX05BTUUgPSAiZWNsaXBzZS5wMi5wcm9maWxlTmFtZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1JPT1RfSUQgPSAiZWNsaXBzZS5wMi5yb290SWQiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9ST09UX1ZFUlNJT04gPSAiZWNsaXBzZS5wMi5yb290VmVyc2lvbiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTG9hZHMgYW5kIHJldHVybnMgYW4gaW5zdGFsbCBkZXNjcmlwdGlvbiB0aGF0IGlzIHN0b3JlZCBpbiBhIHByb3BlcnRpZXMgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyZWFtIFRoZSBzdHJlYW0gdG8gbG9hZCB0aGUgaW5zdGFsbCBkZXNjcmlwdGlvbiBmcm9tLiBUaGUgc3RyZWFtCi0JICogd2lsbCBiZSBjbG9zZWQgcHJpb3IgdG8gdGhpcyBtZXRob2QgcmV0dXJuaW5nLCB3aGV0aGVyIHRoZSBkZXNjcmlwdGlvbiBpcwotCSAqIHJlYWQgc3VjY2Vzc2Z1bGx5IG9yIG5vdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEluc3RhbGxEZXNjcmlwdGlvbiBsb2FkRnJvbVByb3BlcnRpZXMoSW5wdXRTdHJlYW0gc3RyZWFtLCBTdWJNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQl0cnkgewotCQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc3RyZWFtKTsKLQkJCXByb3BlcnRpZXMubG9hZChpbik7Ci0JCQlJbnN0YWxsRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBuZXcgSW5zdGFsbERlc2NyaXB0aW9uKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUFJPUF9QUk9GSUxFX05BTUUpKTsKLQkJCWRlc2NyaXB0aW9uLnNldEFydGlmYWN0UmVwb3NpdG9yeShuZXcgVVJMKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUFJPUF9BUlRJRkFDVF9SRVBPU0lUT1JZKSkpOwotCQkJZGVzY3JpcHRpb24uc2V0TWV0YWRhdGFSZXBvc2l0b3J5KG5ldyBVUkwocHJvcGVydGllcy5nZXRQcm9wZXJ0eShQUk9QX01FVEFEQVRBX1JFUE9TSVRPUlkpKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRBdXRvU3RhcnQoQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST1BfSVNfQVVUT19TVEFSVCkpKTsKLQkJCWRlc2NyaXB0aW9uLnNldExhdW5jaGVyTmFtZShwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST1BfTEFVTkNIRVJfTkFNRSkpOwotCQkJU3RyaW5nIGxvY2F0aW9uU3RyaW5nID0gcHJvcGVydGllcy5nZXRQcm9wZXJ0eShQUk9QX0lOU1RBTExfTE9DQVRJT04pOwotCQkJaWYgKGxvY2F0aW9uU3RyaW5nICE9IG51bGwpCi0JCQkJZGVzY3JpcHRpb24uc2V0SW5zdGFsbExvY2F0aW9uKG5ldyBQYXRoKGxvY2F0aW9uU3RyaW5nKSk7Ci0JCQlsb2NhdGlvblN0cmluZyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUFJPUF9BR0VOVF9MT0NBVElPTik7Ci0JCQlpZiAobG9jYXRpb25TdHJpbmcgIT0gbnVsbCkKLQkJCQlkZXNjcmlwdGlvbi5zZXRBZ2VudExvY2F0aW9uKG5ldyBQYXRoKGxvY2F0aW9uU3RyaW5nKSk7Ci0JCQlsb2NhdGlvblN0cmluZyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoUFJPUF9CVU5ETEVfTE9DQVRJT04pOwotCQkJaWYgKGxvY2F0aW9uU3RyaW5nICE9IG51bGwpCi0JCQkJZGVzY3JpcHRpb24uc2V0QnVuZGxlTG9jYXRpb24obmV3IFBhdGgobG9jYXRpb25TdHJpbmcpKTsKLQkJCWRlc2NyaXB0aW9uLnNldFJvb3RJZChwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST1BfUk9PVF9JRCkpOwotCQkJU3RyaW5nIHZlcnNpb25TdHJpbmcgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBST1BfUk9PVF9WRVJTSU9OKTsKLQkJCVZlcnNpb24gdmVyc2lvbiA9IHZlcnNpb25TdHJpbmcgPT0gbnVsbCA/IG51bGwgOiBuZXcgVmVyc2lvbih2ZXJzaW9uU3RyaW5nKTsKLQkJCWRlc2NyaXB0aW9uLnNldFJvb3RWZXJzaW9uKHZlcnNpb24pOwotCi0JCQkvL2FueSByZW1haW5pbmcgcHJvcGVydGllcyBhcmUgcHJvZmlsZSBwcm9wZXJ0aWVzCi0JCQlNYXAgcHJvZmlsZVByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcChwcm9wZXJ0aWVzKTsKLQkJCXByb2ZpbGVQcm9wZXJ0aWVzLnJlbW92ZShQUk9QX1BST0ZJTEVfTkFNRSk7Ci0JCQlwcm9maWxlUHJvcGVydGllcy5yZW1vdmUoUFJPUF9BUlRJRkFDVF9SRVBPU0lUT1JZKTsKLQkJCXByb2ZpbGVQcm9wZXJ0aWVzLnJlbW92ZShQUk9QX01FVEFEQVRBX1JFUE9TSVRPUlkpOwotCQkJcHJvZmlsZVByb3BlcnRpZXMucmVtb3ZlKFBST1BfSVNfQVVUT19TVEFSVCk7Ci0JCQlwcm9maWxlUHJvcGVydGllcy5yZW1vdmUoUFJPUF9MQVVOQ0hFUl9OQU1FKTsKLQkJCXByb2ZpbGVQcm9wZXJ0aWVzLnJlbW92ZShQUk9QX0FHRU5UX0xPQ0FUSU9OKTsKLQkJCXByb2ZpbGVQcm9wZXJ0aWVzLnJlbW92ZShQUk9QX0JVTkRMRV9MT0NBVElPTik7Ci0JCQlwcm9maWxlUHJvcGVydGllcy5yZW1vdmUoUFJPUF9ST09UX0lEKTsKLQkJCXByb2ZpbGVQcm9wZXJ0aWVzLnJlbW92ZShQUk9QX1JPT1RfVkVSU0lPTik7Ci0JCQlkZXNjcmlwdGlvbi5zZXRQcm9maWxlUHJvcGVydGllcyhwcm9maWxlUHJvcGVydGllcyk7Ci0JCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JCX0gZmluYWxseSB7Ci0JCQlzYWZlQ2xvc2UoaW4pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzYWZlQ2xvc2UoSW5wdXRTdHJlYW0gaW4pIHsKLQkJdHJ5IHsKLQkJCWlmIChpbiAhPSBudWxsKQotCQkJCWluLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vaWdub3JlIHNlY29uZGFyeSBmYWlsdXJlIGR1cmluZyBjbG9zZQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvSW5zdGFsbFVwZGF0ZVByb2R1Y3RPcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxVcGRhdGVQcm9kdWN0T3BlcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MDEyZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvSW5zdGFsbFVwZGF0ZVByb2R1Y3RPcGVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5pbnN0YWxsZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklEaXJlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLlByb2ZpbGVDaGFuZ2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5pbnN0YWxsZXIuSUluc3RhbGxPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5pbnN0YWxsZXIuSW5zdGFsbERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi0vKioKLSAqIFRoaXMgb3BlcmF0aW9uIHBlcmZvcm1zIGluc3RhbGxhdGlvbiBvciB1cGRhdGUgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LgotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbFVwZGF0ZVByb2R1Y3RPcGVyYXRpb24gaW1wbGVtZW50cyBJSW5zdGFsbE9wZXJhdGlvbiB7Ci0KLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIGFydGlmYWN0UmVwb01hbjsKLQlwcml2YXRlIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsKLQlwcml2YXRlIElEaXJlY3RvciBkaXJlY3RvcjsKLQlwcml2YXRlIGZpbmFsIEluc3RhbGxEZXNjcmlwdGlvbiBpbnN0YWxsRGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBib29sZWFuIGlzSW5zdGFsbCA9IHRydWU7Ci0JcHJpdmF0ZSBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBtZXRhZGF0YVJlcG9NYW47Ci0JcHJpdmF0ZSBJUHJvZmlsZVJlZ2lzdHJ5IHByb2ZpbGVSZWdpc3RyeTsKLQlwcml2YXRlIElTdGF0dXMgcmVzdWx0OwotCi0JcHJpdmF0ZSBBcnJheUxpc3Qgc2VydmljZVJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgSW5zdGFsbFVwZGF0ZVByb2R1Y3RPcGVyYXRpb24oQnVuZGxlQ29udGV4dCBjb250ZXh0LCBJbnN0YWxsRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5idW5kbGVDb250ZXh0ID0gY29udGV4dDsKLQkJdGhpcy5pbnN0YWxsRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgd2hhdCB0b3AgbGV2ZWwgaW5zdGFsbGFibGUgdW5pdHMgc2hvdWxkIGJlIGluc3RhbGxlZCBieSB0aGUgZGlyZWN0b3IKLQkgKi8KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXRbXSBjb21wdXRlVW5pdHNUb0luc3RhbGwoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmaW5kVW5pdChpbnN0YWxsRGVzY3JpcHRpb24uZ2V0Um9vdElkKCksIGluc3RhbGxEZXNjcmlwdGlvbi5nZXRSb290VmVyc2lvbigpKX07Ci0JfQotCi0JLyoqCi0JICogVGhpcyBwcm9maWxlIGlzIGJlaW5nIHVwZGF0ZWQ7IHJldHVybiB0aGUgdW5pdHMgdG8gdW5pbnN0YWxsIGZyb20gdGhlIHByb2ZpbGUuCi0JICovCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0W10gY29tcHV0ZVVuaXRzVG9Vbmluc3RhbGwoSVByb2ZpbGUgcCkgewotCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXRbXSkgcC5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkudG9BcnJheShJSW5zdGFsbGFibGVVbml0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW5kIHJldHVybiB0aGUgcHJvZmlsZSBpbnRvIHdoaWNoIHVuaXRzIHdpbGwgYmUgaW5zdGFsbGVkLgotCSAqLwotCXByaXZhdGUgSVByb2ZpbGUgY3JlYXRlUHJvZmlsZSgpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlJUHJvZmlsZSBwcm9maWxlID0gZ2V0UHJvZmlsZSgpOwotCQlpZiAocHJvZmlsZSA9PSBudWxsKSB7Ci0JCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlwcm9wZXJ0aWVzLnB1dChJUHJvZmlsZS5QUk9QX0lOU1RBTExfRk9MREVSLCBpbnN0YWxsRGVzY3JpcHRpb24uZ2V0SW5zdGFsbExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQlFbnZpcm9ubWVudEluZm8gaW5mbyA9IChFbnZpcm9ubWVudEluZm8pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShJbnN0YWxsZXJBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldENvbnRleHQoKSwgRW52aXJvbm1lbnRJbmZvLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlTdHJpbmcgZW52ID0gIm9zZ2kub3M9IiArIGluZm8uZ2V0T1MoKSArICIsb3NnaS53cz0iICsgaW5mby5nZXRXUygpICsgIixvc2dpLmFyY2g9IiArIGluZm8uZ2V0T1NBcmNoKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlwcm9wZXJ0aWVzLnB1dChJUHJvZmlsZS5QUk9QX0VOVklST05NRU5UUywgZW52KTsKLQkJCXByb3BlcnRpZXMucHV0QWxsKGluc3RhbGxEZXNjcmlwdGlvbi5nZXRQcm9maWxlUHJvcGVydGllcygpKTsKLQkJCXByb3BlcnRpZXMucHV0KElQcm9maWxlLlBST1BfQ0FDSEUsIGluc3RhbGxEZXNjcmlwdGlvbi5nZXRCdW5kbGVMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSk7Ci0JCQlwcm9maWxlID0gcHJvZmlsZVJlZ2lzdHJ5LmFkZFByb2ZpbGUoZ2V0UHJvZmlsZUlkKCksIHByb3BlcnRpZXMpOwotCQl9Ci0JCXJldHVybiBwcm9maWxlOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBhY3R1YWwgcHJvZHVjdCBpbnN0YWxsIG9yIHVwZGF0ZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9JbnN0YWxsKFN1Yk1vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlwcmVwYXJlTWV0YWRhdGFSZXBvc2l0b3J5KCk7Ci0JCXByZXBhcmVBcnRpZmFjdFJlcG9zaXRvcnkoKTsKLQkJSVByb2ZpbGUgcCA9IGNyZWF0ZVByb2ZpbGUoKTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIHRvSW5zdGFsbCA9IGNvbXB1dGVVbml0c1RvSW5zdGFsbCgpOwotCQltb25pdG9yLndvcmtlZCg1KTsKLQotCQlJU3RhdHVzIHM7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocCk7Ci0JCWlmIChpc0luc3RhbGwpIHsKLQkJCW1vbml0b3Iuc2V0VGFza05hbWUoTkxTLmJpbmQoTWVzc2FnZXMuT3BfSW5zdGFsbGluZywgaW5zdGFsbERlc2NyaXB0aW9uLmdldFByb2R1Y3ROYW1lKCkpKTsKLQkJCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyh0b0luc3RhbGwpOwotCQkJcyA9IGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBtb25pdG9yLm5ld0NoaWxkKDkwKSk7Ci0JCX0gZWxzZSB7Ci0JCQltb25pdG9yLnNldFRhc2tOYW1lKE5MUy5iaW5kKE1lc3NhZ2VzLk9wX1VwZGF0aW5nLCBpbnN0YWxsRGVzY3JpcHRpb24uZ2V0UHJvZHVjdE5hbWUoKSkpOwotCQkJSUluc3RhbGxhYmxlVW5pdFtdIHRvVW5pbnN0YWxsID0gY29tcHV0ZVVuaXRzVG9Vbmluc3RhbGwocCk7Ci0JCQlyZXF1ZXN0LnJlbW92ZUluc3RhbGxhYmxlVW5pdHModG9Vbmluc3RhbGwpOwotCQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKHRvSW5zdGFsbCk7Ci0JCQlzID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG1vbml0b3IubmV3Q2hpbGQoOTApKTsKLQkJfQotCQlpZiAoIXMuaXNPSygpKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24ocyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBleGNlcHRpb24gb2Ygc2V2ZXJpdHkgZXJyb3Igd2l0aCB0aGUgZ2l2ZW4gZXJyb3IgbWVzc2FnZS4KLQkgKi8KLQlwcml2YXRlIENvcmVFeGNlcHRpb24gZmFpbChTdHJpbmcgbWVzc2FnZSkgewotCQlyZXR1cm4gZmFpbChtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGV4Y2VwdGlvbiBvZiBzZXZlcml0eSBlcnJvciB3aXRoIHRoZSBnaXZlbiBlcnJvciBtZXNzYWdlLgotCSAqLwotCXByaXZhdGUgQ29yZUV4Y2VwdGlvbiBmYWlsKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7Ci0JCXJldHVybiBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEluc3RhbGxlckFjdGl2YXRvci5QSV9JTlNUQUxMRVIsIG1lc3NhZ2UsIHRocm93YWJsZSkpOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIGFuZCByZXR1cm5zIHRoZSBpbnN0YWxsYWJsZSB1bml0IHdpdGggdGhlIGdpdmVuIGlkLCBhbmQgb3B0aW9uYWxseSB0aGUKLQkgKiBnaXZlbiB2ZXJzaW9uLgotCSAqLwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBmaW5kVW5pdChTdHJpbmcgaWQsIFZlcnNpb24gdmVyc2lvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXRocm93IGZhaWwoTWVzc2FnZXMuT3BfTm9JZCk7Ci0JCVZlcnNpb25SYW5nZSByYW5nZSA9IFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlOwotCQlpZiAodmVyc2lvbiAhPSBudWxsICYmICF2ZXJzaW9uLmVxdWFscyhWZXJzaW9uLmVtcHR5VmVyc2lvbikpCi0JCQlyYW5nZSA9IG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgdmVyc2lvbiwgdHJ1ZSk7Ci0JCVF1ZXJ5IHF1ZXJ5ID0gbmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KGlkLCByYW5nZSk7Ci0JCUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgQ29sbGVjdG9yKCk7Ci0JCUl0ZXJhdG9yIG1hdGNoZXMgPSBtZXRhZGF0YVJlcG9NYW4ucXVlcnkocXVlcnksIGNvbGxlY3RvciwgbnVsbCkuaXRlcmF0b3IoKTsKLQkJLy9waWNrIHRoZSBuZXdlc3QgbWF0Y2gKLQkJSUluc3RhbGxhYmxlVW5pdCBuZXdlc3QgPSBudWxsOwotCQl3aGlsZSAobWF0Y2hlcy5oYXNOZXh0KCkpIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgY2FuZGlkYXRlID0gKElJbnN0YWxsYWJsZVVuaXQpIG1hdGNoZXMubmV4dCgpOwotCQkJaWYgKG5ld2VzdCA9PSBudWxsIHx8IChuZXdlc3QuZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyhjYW5kaWRhdGUuZ2V0VmVyc2lvbigpKSA8IDApKQotCQkJCW5ld2VzdCA9IGNhbmRpZGF0ZTsKLQkJfQotCQlpZiAobmV3ZXN0ID09IG51bGwpCi0JCQl0aHJvdyBmYWlsKE1lc3NhZ2VzLk9wX0lVTm90Rm91bmQgKyBpZCk7Ci0JCXJldHVybiBuZXdlc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvZmlsZSBiZWluZyBpbnN0YWxsZWQgaW50by4KLQkgKi8KLQlwcml2YXRlIElQcm9maWxlIGdldFByb2ZpbGUoKSB7Ci0JCXJldHVybiBwcm9maWxlUmVnaXN0cnkuZ2V0UHJvZmlsZShnZXRQcm9maWxlSWQoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaWQgb2YgdGhlIHByb2ZpbGUgdG8gdXNlIGZvciBpbnN0YWxsL3VwZGF0ZSBiYXNlZCBvbiB0aGlzIG9wZXJhdGlvbidzIGluc3RhbGwgZGVzY3JpcHRpb24uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvZmlsZUlkKCkgewotCQlJUGF0aCBsb2NhdGlvbiA9IGluc3RhbGxEZXNjcmlwdGlvbi5nZXRJbnN0YWxsTG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpCi0JCQlyZXR1cm4gbG9jYXRpb24udG9TdHJpbmcoKTsKLQkJcmV0dXJuIGluc3RhbGxEZXNjcmlwdGlvbi5nZXRQcm9kdWN0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW5zdGFsbCBvcGVyYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogbm8gaW5zdGFsbCBvcGVyYXRpb24gaGFzIGJlZW4gcnVuLgotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldFJlc3VsdCgpIHsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRTZXJ2aWNlKFN0cmluZyBuYW1lKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmID0gYnVuZGxlQ29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKG5hbWUpOwotCQlpZiAocmVmID09IG51bGwpCi0JCQl0aHJvdyBmYWlsKE1lc3NhZ2VzLk9wX05vU2VydmljZSArIG5hbWUpOwotCQlPYmplY3Qgc2VydmljZSA9IGJ1bmRsZUNvbnRleHQuZ2V0U2VydmljZShyZWYpOwotCQlpZiAoc2VydmljZSA9PSBudWxsKQotCQkJdGhyb3cgZmFpbChNZXNzYWdlcy5PcF9Ob1NlcnZpY2VJbXBsICsgbmFtZSk7Ci0JCXNlcnZpY2VSZWZlcmVuY2VzLmFkZChyZWYpOwotCQlyZXR1cm4gc2VydmljZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmluc3RhbGxlci5JSW5zdGFsbE9wZXJhdGlvbiNpbnN0YWxsKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGluc3RhbGwoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQlTdWJNb25pdG9yIG1vbml0b3IgPSBTdWJNb25pdG9yLmNvbnZlcnQocG0sIE1lc3NhZ2VzLk9wX1ByZXBhcmluZywgMTAwKTsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJcHJlSW5zdGFsbCgpOwotCQkJCWlzSW5zdGFsbCA9IGdldFByb2ZpbGUoKSA9PSBudWxsOwotCQkJCWRvSW5zdGFsbChtb25pdG9yKTsKLQkJCQlyZXN1bHQgPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIEluc3RhbGxlckFjdGl2YXRvci5QSV9JTlNUQUxMRVIsIGlzSW5zdGFsbCA/IE1lc3NhZ2VzLk9wX0luc3RhbGxDb21wbGV0ZSA6IE1lc3NhZ2VzLk9wX1VwZGF0ZUNvbXBsZXRlLCBudWxsKTsKLQkJCQltb25pdG9yLnNldFRhc2tOYW1lKE1lc3NhZ2VzLk9wX0NsZWFudXApOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlwb3N0SW5zdGFsbCgpOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IGUuZ2V0U3RhdHVzKCk7Ci0JCX0gZmluYWxseSB7Ci0JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIG9wZXJhdGlvbiByZXByZXNlbnRzIHRoZSBwcm9kdWN0IGJlaW5nIGluc3RhbGxlZAotCSAqIGZvciB0aGUgZmlyc3QgdGltZSwgaW4gYSBuZXcgcHJvZmlsZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0SW5zdGFsbCgpIHsKLQkJcmV0dXJuIGlzSW5zdGFsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9zdEluc3RhbGwoKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBzZXJ2aWNlUmVmZXJlbmNlcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTZXJ2aWNlUmVmZXJlbmNlIHNyID0gKFNlcnZpY2VSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLQkJCWJ1bmRsZUNvbnRleHQudW5nZXRTZXJ2aWNlKHNyKTsKLQkJfQotCQlzZXJ2aWNlUmVmZXJlbmNlcy5jbGVhcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVJbnN0YWxsKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvL29idGFpbiByZXF1aXJlZCBzZXJ2aWNlcwotCQlzZXJ2aWNlUmVmZXJlbmNlcy5jbGVhcigpOwotCQlkaXJlY3RvciA9IChJRGlyZWN0b3IpIGdldFNlcnZpY2UoSURpcmVjdG9yLmNsYXNzLmdldE5hbWUoKSk7Ci0JCW1ldGFkYXRhUmVwb01hbiA9IChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgZ2V0U2VydmljZShJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlhcnRpZmFjdFJlcG9NYW4gPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIGdldFNlcnZpY2UoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIGdldFNlcnZpY2UoSVByb2ZpbGVSZWdpc3RyeS5jbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVwYXJlQXJ0aWZhY3RSZXBvc2l0b3J5KCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCVVSTCBhcnRpZmFjdFJlcG8gPSBpbnN0YWxsRGVzY3JpcHRpb24uZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KCk7Ci0JCWlmIChhcnRpZmFjdFJlcG8gIT0gbnVsbCkKLQkJCWFydGlmYWN0UmVwb01hbi5sb2FkUmVwb3NpdG9yeShhcnRpZmFjdFJlcG8sIG51bGwpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmVwYXJlTWV0YWRhdGFSZXBvc2l0b3J5KCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCVVSTCBtZXRhZGF0YVJlcG8gPSBpbnN0YWxsRGVzY3JpcHRpb24uZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KCk7Ci0JCWlmIChtZXRhZGF0YVJlcG8gIT0gbnVsbCkKLQkJCW1ldGFkYXRhUmVwb01hbi5sb2FkUmVwb3NpdG9yeShtZXRhZGF0YVJlcG8sIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxlckFjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvSW5zdGFsbGVyQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YTY2YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvSW5zdGFsbGVyQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5pbnN0YWxsZXI7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5QYWNrYWdlQWRtaW47Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsZXJBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfSU5TVEFMTEVSID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyIjsgLy8kTk9OLU5MUy0xJAotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UKLQlwcml2YXRlIHN0YXRpYyBJbnN0YWxsZXJBY3RpdmF0b3IgcGx1Z2luOwotCi0JcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0KLQlwcml2YXRlIFBhY2thZ2VBZG1pbiBwYWNrYWdlQWRtaW4gPSBudWxsOwotCi0JcHJpdmF0ZSBTZXJ2aWNlUmVmZXJlbmNlIHBhY2thZ2VBZG1pblJlZiA9IG51bGw7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5zdGFsbGVyQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIEluc3RhbGxlckFjdGl2YXRvcigpIHsKLQkJLy9ub3RoaW5nIHRvIGRvCi0JfQotCi0JcHVibGljIEJ1bmRsZSBnZXRCdW5kbGUoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlpZiAocGFja2FnZUFkbWluID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQnVuZGxlW10gYnVuZGxlcyA9IHBhY2thZ2VBZG1pbi5nZXRCdW5kbGVzKHN5bWJvbGljTmFtZSwgbnVsbCk7Ci0JCWlmIChidW5kbGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy9SZXR1cm4gdGhlIGZpcnN0IGJ1bmRsZSB0aGF0IGlzIG5vdCBpbnN0YWxsZWQgb3IgdW5pbnN0YWxsZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoKGJ1bmRsZXNbaV0uZ2V0U3RhdGUoKSAmIChCdW5kbGUuSU5TVEFMTEVEIHwgQnVuZGxlLlVOSU5TVEFMTEVEKSkgPT0gMCkgewotCQkJCXJldHVybiBidW5kbGVzW2ldOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGJ1bmRsZSBjb250ZXh0IGZvciB0aGlzIGJ1bmRsZS4KLQkgKiBAcmV0dXJuIHRoZSBidW5kbGUgY29udGV4dAotCSAqLwotCXB1YmxpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RhcnQob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBhQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMuY29udGV4dCA9IGFDb250ZXh0OwotCQlwbHVnaW4gPSB0aGlzOwotCQlwYWNrYWdlQWRtaW5SZWYgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoUGFja2FnZUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXBhY2thZ2VBZG1pbiA9IChQYWNrYWdlQWRtaW4pIGNvbnRleHQuZ2V0U2VydmljZShwYWNrYWdlQWRtaW5SZWYpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQljb250ZXh0LnVuZ2V0U2VydmljZShwYWNrYWdlQWRtaW5SZWYpOwotCQlwYWNrYWdlQWRtaW4gPSBudWxsOwotCQlwYWNrYWdlQWRtaW5SZWYgPSBudWxsOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNDQwNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5pbnN0YWxsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmluc3RhbGxlci5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZHZpc29yX0NhbmNlbGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkdmlzb3JfUHJlcGFyaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwcF9FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBfRmFpbGVkU3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwX0ludmFsaWRTaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwcF9MYXVuY2hGYWlsZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwX0xhdW5jaGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBfTm9JbnN0YWxsTG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwX05vU2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfQnJvd3NlQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19DYW5jZWxCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX0Nsb3NlQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19FeHBsYWluU2hhcmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19FeHBsYWluU3RhbmRhbG9uZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfSW5zdGFsbEJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfSW5zdGFsbGxpbmdQcm9ncmVzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfSW50ZXJuYWxFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfTGF1bmNoQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19MYXlvdXRHcm91cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfTG9jYXRpb25GaWVsZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfTG9jYXRpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfTG9jYXRpb25Qcm9tcHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGlhbG9nX1Byb21wdFN0YXJ0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19TZWxlY3RMb2NhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaWFsb2dfU2hhcmVkQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19TaGVsbFRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpYWxvZ19TdGFuZGFsb25lQnV0dG9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wX0NsZWFudXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BfSW5zdGFsbENvbXBsZXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wX0luc3RhbGxpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BfSVVOb3RGb3VuZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcF9Ob0lkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wX05vU2VydmljZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcF9Ob1NlcnZpY2VJbXBsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wX1ByZXBhcmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcF9VcGRhdGVDb21wbGV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcF9VcGRhdGluZzsKLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBNZXNzYWdlcygpIHsKLQkJLy9ub3RoaW5nIHRvIGRvCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1MWMzZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFkdmlzb3JfQ2FuY2VsZWQ9SW5zdGFsbCBjYW5jZWxlZAotQWR2aXNvcl9QcmVwYXJpbmc9UHJlcGFyaW5nIHRvIGluc3RhbGwKLUFwcF9FcnJvcj1BbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgaW5zdGFsbGF0aW9uCi1BcHBfRmFpbGVkU3RhcnQ9VW5hYmxlIHRvIHN0YXJ0IHByb3Zpc2lvbmluZyBpbmZyYXN0cnVjdHVyZQotQXBwX0ludmFsaWRTaXRlPUludmFsaWQgaW5zdGFsbCBzaXRlOiAKLUFwcF9MYXVuY2hGYWlsZWQ9RmFpbGVkIHRvIGxhdW5jaCB0aGUgcHJvZHVjdDogCi1BcHBfTGF1bmNoaW5nPUxhdW5jaGluZyB7MH0KLUFwcF9Ob0luc3RhbGxMb2NhdGlvbj1JbnN0YWxsIGZhaWxlZCBiZWNhdXNlIHRoZSBpbnN0YWxsIGxvY2F0aW9uIHdhcyBub3Qgc2V0Ci1BcHBfTm9TaXRlPU5vIGluc3RhbGwgc2l0ZSBwcm92aWRlZAotRGlhbG9nX0Jyb3dzZUJ1dHRvbj0mQnJvd3NlLi4uCi1EaWFsb2dfQ2FuY2VsQnV0dG9uPSZDYW5jZWwKLURpYWxvZ19DbG9zZUJ1dHRvbj0mQ2xvc2UKLURpYWxvZ19FeHBsYWluU2hhcmVkPUluIGEgc2hhcmVkIGluc3RhbGwsIGNvbW1vbiBjb21wb25lbnRzIGFyZSBzdG9yZWQgdG9nZXRoZXIsIGFsbG93aW5nIHRoZW0gdG8gYmUgc2hhcmVkIGFjcm9zcyBtdWx0aXBsZSBwcm9kdWN0cy4KLURpYWxvZ19FeHBsYWluU3RhbmRhbG9uZT1JbiBhIHN0YW5kLWFsb25lIGluc3RhbGwsIGVhY2ggcHJvZHVjdCBpcyBpbnN0YWxsZWQgaW4gaXRzIG93biBkaXJlY3Rvcnkgd2l0aG91dCBhbnkgc2hhcmluZyBiZXR3ZWVuIHByb2R1Y3RzCi1EaWFsb2dfSW5zdGFsbEJ1dHRvbj0mSW5zdGFsbAotRGlhbG9nX0luc3RhbGxsaW5nUHJvZ3Jlc3M9SW5zdGFsbGluZy4uLgotRGlhbG9nX0ludGVybmFsRXJyb3I9QW4gaW50ZXJuYWwgZXJyb3IgaGFzIG9jY3VycmVkCi1EaWFsb2dfTGF1bmNoQnV0dG9uPSZMYXVuY2gKLURpYWxvZ19MYXlvdXRHcm91cD1MYXlvdXQKLURpYWxvZ19Mb2NhdGlvbkZpZWxkPUxvY2F0aW9uCi1EaWFsb2dfTG9jYXRpb25MYWJlbD1TZWxlY3QgdGhlIHByb2R1Y3QgaW5zdGFsbCBkaXJlY3Rvcnk6Ci1EaWFsb2dfTG9jYXRpb25Qcm9tcHQ9U2VsZWN0IHdoZXJlIHlvdSB3YW50IHswfSB0byBiZSBpbnN0YWxsZWQKLURpYWxvZ19Qcm9tcHRTdGFydD1JbnN0YWxsIGNvbXBsZXRlLiBEbyB5b3Ugd2FudCB0byBzdGFydCB7MH0gaW1tZWRpYXRlbHk/Ci1EaWFsb2dfU2VsZWN0TG9jYXRpb249U2VsZWN0IHRoZSBpbnN0YWxsIGxvY2F0aW9uCi1EaWFsb2dfU2hhcmVkQnV0dG9uPSZTaGFyZWQgaW5zdGFsbAotRGlhbG9nX1NoZWxsVGl0bGU9SW5zdGFsbGVyCi1EaWFsb2dfU3RhbmRhbG9uZUJ1dHRvbj1TdGFuZC0mYWxvbmUgaW5zdGFsbAotT3BfQ2xlYW51cD1Tb21lIGZpbmFsIGhvdXNla2VlcGluZwotT3BfSW5zdGFsbENvbXBsZXRlPUluc3RhbGwgY29tcGxldGUKLU9wX0luc3RhbGxpbmc9SW5zdGFsbGluZyB7MH0KLU9wX0lVTm90Rm91bmQ9SW5zdGFsbGFibGUgdW5pdCBub3QgZm91bmQ6IAotT3BfTm9JZD1JbnN0YWxsYWJsZSB1bml0IGlkIG5vdCBzcGVjaWZpZWQKLU9wX05vU2VydmljZT1JbnN0YWxsIHJlcXVpcmVzIGEgc2VydmljZSB0aGF0IGlzIG5vdCBhdmFpbGFibGU6IAotT3BfTm9TZXJ2aWNlSW1wbD1JbnN0YWxsIHJlcXVpcmVzIGEgc2VydmljZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIG5vdCBhdmFpbGFibGU6IAotT3BfUHJlcGFyaW5nPVByZXBhcmluZyB0byBpbnN0YWxsCi1PcF9VcGRhdGVDb21wbGV0ZT1VcGRhdGUgY29tcGxldGUKLU9wX1VwZGF0aW5nPVVwZGF0aW5nIHswfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvdWkvSW5zdGFsbERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvdWkvSW5zdGFsbERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjgwNWM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL3VpL0luc3RhbGxEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuaW5zdGFsbGVyLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5pbnN0YWxsZXIuSW5zdGFsbGVyQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuaW5zdGFsbGVyLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuaW5zdGFsbGVyLklJbnN0YWxsT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuaW5zdGFsbGVyLkluc3RhbGxEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogVGhlIGluc3RhbGwgd2l6YXJkIHRoYXQgZHJpdmVzIHRoZSBpbnN0YWxsLiBUaGlzIGRpYWxvZyBpcyB1c2VkIGZvciB1c2VyIGlucHV0Ci0gKiBwcmlvciB0byB0aGUgaW5zdGFsbCwgcHJvZ3Jlc3MgZmVlZGJhY2sgZHVyaW5nIHRoZSBpbnN0YWxsLCBhbmQgZGlzcGxheWluZyByZXN1bHRzCi0gKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnN0YWxsLgotICovCi1wdWJsaWMgY2xhc3MgSW5zdGFsbERpYWxvZyB7Ci0JLyoqCi0JICogQSBwcm9ncmVzcyBtb25pdG9yIGltcGxlbWVudGF0aW9uIHRoYXQgYXN5bmNocm9ub3VzbHkgdXBkYXRlcyB0aGUgcHJvZ3Jlc3MgYmFyLgotCSAqLwotCWNsYXNzIE1vbml0b3IgaW1wbGVtZW50cyBJUHJvZ3Jlc3NNb25pdG9yIHsKLQotCQlib29sZWFuIGNhbmNlbGVkID0gZmFsc2UsIHJ1bm5pbmcgPSBmYWxzZTsKLQkJU3RyaW5nIHN1YlRhc2tOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZG91YmxlIHRvdGFsV29yaywgdXNlZFdvcms7Ci0KLQkJcHVibGljIHZvaWQgYmVnaW5UYXNrKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBpbnQgd29yaykgewotCQkJdG90YWxXb3JrID0gd29yazsKLQkJCXJ1bm5pbmcgPSB0cnVlOwotCQkJdXBkYXRlKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb25lKCkgewotCQkJcnVubmluZyA9IGZhbHNlOwotCQkJdXNlZFdvcmsgPSB0b3RhbFdvcms7Ci0JCQl1cGRhdGUoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGludGVybmFsV29ya2VkKGRvdWJsZSB3b3JrKSB7Ci0JCQl1c2VkV29yayA9IE1hdGgubWluKHVzZWRXb3JrICsgd29yaywgdG90YWxXb3JrKTsKLQkJCXVwZGF0ZSgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJCXJldHVybiByZXR1cm5Db2RlID09IENBTkNFTDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENhbmNlbGVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJCXJldHVybkNvZGUgPSBDQU5DRUw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRUYXNrTmFtZShTdHJpbmcgbmFtZSkgewotCQkJc3ViVGFza05hbWUgPSBuYW1lID09IG51bGwgPyAiIiA6IG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCXVwZGF0ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3ViVGFzayhTdHJpbmcgbmFtZSkgewotCQkJc3ViVGFza05hbWUgPSBuYW1lID09IG51bGwgPyAiIiA6IG5hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCXVwZGF0ZSgpOwotCQl9Ci0KLQkJdm9pZCB1cGRhdGUoKSB7Ci0JCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0JCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCVNoZWxsIHRoZVNoZWxsID0gZ2V0U2hlbGwoKTsKLQkJCQkJaWYgKHRoZVNoZWxsID09IG51bGwgfHwgdGhlU2hlbGwuaXNEaXNwb3NlZCgpKQotCQkJCQkJcmV0dXJuOwotCQkJCQlwcm9ncmVzc1N1YlRhc2suc2V0VGV4dChzaG9ydGVuKHN1YlRhc2tOYW1lKSk7Ci0JCQkJCWlmIChwcm9ncmVzc0Jhci5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCXByb2dyZXNzQmFyLnNldFZpc2libGUocnVubmluZyk7Ci0JCQkJCXByb2dyZXNzQmFyLnNldE1heGltdW0oMTAwMCk7Ci0JCQkJCXByb2dyZXNzQmFyLnNldE1pbmltdW0oMCk7Ci0JCQkJCWludCB2YWx1ZSA9IChpbnQpICh1c2VkV29yayAvIHRvdGFsV29yayAqIDEwMDApOwotCQkJCQlpZiAocHJvZ3Jlc3NCYXIuZ2V0U2VsZWN0aW9uKCkgPCB2YWx1ZSkKLQkJCQkJCXByb2dyZXNzQmFyLnNldFNlbGVjdGlvbih2YWx1ZSk7Ci0JCQkJfQotCi0JCQkJcHJpdmF0ZSBTdHJpbmcgc2hvcnRlbihTdHJpbmcgdGV4dCkgewotCQkJCQlpZiAodGV4dC5sZW5ndGgoKSA8PSA2NCkKLQkJCQkJCXJldHVybiB0ZXh0OwotCQkJCQlpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKLQkJCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIDMwKSArICIuLi4iICsgdGV4dC5zdWJzdHJpbmcobGVuIC0gMzAsIGxlbik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdvcmtlZChpbnQgd29yaykgewotCQkJaW50ZXJuYWxXb3JrZWQod29yayk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbmNhcHN1bGF0ZXMgYSByZXN1bHQgcGFzc2VkIGZyb20gYW4gb3BlcmF0aW9uIHJ1bm5pbmcgaW4gYSBiYWNrZ3JvdW5kCi0JICogdGhyZWFkIHRvIHRoZSBVSSB0aHJlYWQuCi0JICovCi0Jc3RhdGljIGNsYXNzIFJlc3VsdCB7Ci0JCXByaXZhdGUgYm9vbGVhbiBkb25lOwotCQlwcml2YXRlIElTdGF0dXMgc3RhdHVzOwotCi0JCXN5bmNocm9uaXplZCB2b2lkIGRvbmUoKSB7Ci0JCQlkb25lID0gdHJ1ZTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCB2b2lkIGZhaWxlZChUaHJvd2FibGUgdCkgewotCQkJU3RyaW5nIG1zZyA9IE1lc3NhZ2VzLkRpYWxvZ19JbnRlcm5hbEVycm9yOwotCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJbnN0YWxsZXJBY3RpdmF0b3IuUElfSU5TVEFMTEVSLCBtc2csIHQpOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQkJcmV0dXJuIHN0YXR1czsKLQkJfQotCi0JCXN5bmNocm9uaXplZCBib29sZWFuIGlzRG9uZSgpIHsKLQkJCXJldHVybiBkb25lOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCQl0aGlzLnN0YXR1cyA9IHN0YXR1czsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVVRUT05fV0lEVEggPSAxMDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENBTkNFTCA9IDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE9LID0gMDsKLQotCXByaXZhdGUgQnV0dG9uIGNhbmNlbEJ1dHRvbjsKLQlwcml2YXRlIENvbXBvc2l0ZSBjb250ZW50czsKLQlwcml2YXRlIEJ1dHRvbiBva0J1dHRvbjsKLQotCVByb2dyZXNzQmFyIHByb2dyZXNzQmFyOwotCUxhYmVsIHByb2dyZXNzU3ViVGFzazsKLQlMYWJlbCBwcm9ncmVzc1Rhc2s7Ci0KLQlpbnQgcmV0dXJuQ29kZSA9IC0xOwotCi0JcHJpdmF0ZSBCdXR0b24gc2V0dGluZ3NCcm93c2U7Ci0JcHJpdmF0ZSBMYWJlbCBzZXR0aW5nc0V4cGxhaW47Ci0JcHJpdmF0ZSBDb21wb3NpdGUgc2V0dGluZ3NHcm91cDsKLQlwcml2YXRlIFRleHQgc2V0dGluZ3NMb2NhdGlvbjsKLQlwcml2YXRlIExhYmVsIHNldHRpbmdzTG9jYXRpb25MYWJlbDsKLQlwcml2YXRlIEJ1dHRvbiBzZXR0aW5nc1NoYXJlZDsKLQlwcml2YXRlIEJ1dHRvbiBzZXR0aW5nc1N0YW5kYWxvbmU7Ci0KLQlwcml2YXRlIFNoZWxsIHNoZWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHdhaXRpbmdGb3JDbG9zZSA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgb3BlbnMgYSBwcm9ncmVzcyBtb25pdG9yIGRpYWxvZy4KLQkgKi8KLQlwdWJsaWMgSW5zdGFsbERpYWxvZygpIHsKLQkJY3JlYXRlU2hlbGwoKTsKLQkJcHJvZ3Jlc3NUYXNrID0gbmV3IExhYmVsKGNvbnRlbnRzLCBTV1QuV1JBUCB8IFNXVC5MRUZUKTsKLQkJcHJvZ3Jlc3NUYXNrLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQljcmVhdGVJbnN0YWxsU2V0dGluZ3NDb250cm9scygpOwotCQljcmVhdGVQcm9ncmVzc0NvbnRyb2xzKCk7Ci0JCWNyZWF0ZUJ1dHRvbkJhcigpOwotCi0JCXNoZWxsLmxheW91dCgpOwotCQlzaGVsbC5vcGVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnJvd3NlUHJlc3NlZCgpIHsKLQkJRGlyZWN0b3J5RGlhbG9nIGRpckRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2coc2hlbGwpOwotCQlkaXJEaWFsb2cuc2V0TWVzc2FnZShNZXNzYWdlcy5EaWFsb2dfU2VsZWN0TG9jYXRpb24pOwotCQlTdHJpbmcgbG9jYXRpb24gPSBkaXJEaWFsb2cub3BlbigpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCWxvY2F0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJc2V0dGluZ3NMb2NhdGlvbi5zZXRUZXh0KGxvY2F0aW9uKTsKLQkJdmFsaWRhdGVJbnN0YWxsU2V0dGluZ3MoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBjb2RlKSB7Ci0JCXJldHVybkNvZGUgPSBjb2RlOwotCQlpZiAod2FpdGluZ0ZvckNsb3NlKQotCQkJY2xvc2UoKTsKLQkJLy9ncmV5IG91dCB0aGUgY2FuY2VsIGJ1dHRvbiB0byBpbmRpY2F0ZSB0aGUgcmVxdWVzdCB3YXMgaGVhcmQKLQkJaWYgKGNvZGUgPT0gQ0FOQ0VMICYmICFjYW5jZWxCdXR0b24uaXNEaXNwb3NlZCgpKQotCQkJY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQlpZiAoc2hlbGwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFzaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCQlzaGVsbC5kaXNwb3NlKCk7Ci0JCXNoZWxsID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQnV0dG9uQmFyKCkgewotCQlDb21wb3NpdGUgYnV0dG9uQmFyID0gbmV3IENvbXBvc2l0ZShjb250ZW50cywgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5SSUdIVDsKLQkJYnV0dG9uQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWJ1dHRvbkJhci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlva0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQmFyLCBTV1QuUFVTSCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoQlVUVE9OX1dJRFRILCBTV1QuREVGQVVMVCk7Ci0JCW9rQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCW9rQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRGlhbG9nX0luc3RhbGxCdXR0b24pOwotCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJb2tCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYnV0dG9uUHJlc3NlZChPSyk7Ci0JCQl9Ci0JCX0pOwotCi0JCWNhbmNlbEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQmFyLCBTV1QuUFVTSCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoQlVUVE9OX1dJRFRILCBTV1QuREVGQVVMVCk7Ci0JCWNhbmNlbEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljYW5jZWxCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5EaWFsb2dfQ2FuY2VsQnV0dG9uKTsKLQkJY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljYW5jZWxCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYnV0dG9uUHJlc3NlZChDQU5DRUwpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBjb250cm9scyB0byBwcm9tcHQgZm9yIHRoZSBhZ2VudCBhbmQgaW5zdGFsbCBsb2NhdGlvbnMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUluc3RhbGxTZXR0aW5nc0NvbnRyb2xzKCkgewotCQlzZXR0aW5nc0dyb3VwID0gbmV3IENvbXBvc2l0ZShjb250ZW50cywgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCXNldHRpbmdzR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCXNldHRpbmdzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGlzdGVuZXIgdmFsaWRhdGVMaXN0ZW5lciA9IG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJdmFsaWRhdGVJbnN0YWxsU2V0dGluZ3MoKTsKLQkJCX0KLQkJfTsKLQotCQkvL1RoZSBncm91cCBhc2tpbmcgZm9yIHRoZSBwcm9kdWN0IGluc3RhbGwgZGlyZWN0b3J5Ci0JCUdyb3VwIGluc3RhbGxMb2NhdGlvbkdyb3VwID0gbmV3IEdyb3VwKHNldHRpbmdzR3JvdXAsIFNXVC5OT05FKTsKLQkJaW5zdGFsbExvY2F0aW9uR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlpbnN0YWxsTG9jYXRpb25Hcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJaW5zdGFsbExvY2F0aW9uR3JvdXAuc2V0VGV4dChNZXNzYWdlcy5EaWFsb2dfTG9jYXRpb25GaWVsZCk7Ci0JCXNldHRpbmdzTG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChpbnN0YWxsTG9jYXRpb25Hcm91cCwgU1dULk5PTkUpOwotCQlzZXR0aW5nc0xvY2F0aW9uTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXNldHRpbmdzTG9jYXRpb25MYWJlbC5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19Mb2NhdGlvbkxhYmVsKTsKLQotCQkvL1RoZSBzdWItZ3JvdXAgd2l0aCB0ZXh0IGVudHJ5IGZpZWxkIGFuZCBicm93c2UgYnV0dG9uCi0JCUNvbXBvc2l0ZSBsb2NhdGlvbkZpZWxkR3JvdXAgPSBuZXcgQ29tcG9zaXRlKGluc3RhbGxMb2NhdGlvbkdyb3VwLCBTV1QuTk9ORSk7Ci0JCWxvY2F0aW9uRmllbGRHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0JCWxvY2F0aW9uRmllbGRHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc2V0dGluZ3NMb2NhdGlvbiA9IG5ldyBUZXh0KGxvY2F0aW9uRmllbGRHcm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlzZXR0aW5nc0xvY2F0aW9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzZXR0aW5nc0xvY2F0aW9uLmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHZhbGlkYXRlTGlzdGVuZXIpOwotCQlzZXR0aW5nc0Jyb3dzZSA9IG5ldyBCdXR0b24obG9jYXRpb25GaWVsZEdyb3VwLCBTV1QuUFVTSCk7Ci0JCXNldHRpbmdzQnJvd3NlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEJVVFRPTl9XSURUSCwgU1dULkRFRkFVTFQpKTsKLQkJc2V0dGluZ3NCcm93c2Uuc2V0VGV4dChNZXNzYWdlcy5EaWFsb2dfQnJvd3NlQnV0dG9uKTsKLQkJc2V0dGluZ3NCcm93c2UuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQlicm93c2VQcmVzc2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vQ3JlYXRlIHRoZSByYWRpbyBidXR0b24gZ3JvdXAgYXNraW5nIGZvciB0aGUga2luZCBvZiBpbnN0YWxsIChzaGFyZWQgdnMuIHN0YW5kYWxvbmUpCi0JCUdyb3VwIGluc3RhbGxLaW5kR3JvdXAgPSBuZXcgR3JvdXAoc2V0dGluZ3NHcm91cCwgU1dULk5PTkUpOwotCQlpbnN0YWxsS2luZEdyb3VwLnNldFRleHQoTWVzc2FnZXMuRGlhbG9nX0xheW91dEdyb3VwKTsKLQkJaW5zdGFsbEtpbmRHcm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJaW5zdGFsbEtpbmRHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCXNldHRpbmdzU3RhbmRhbG9uZSA9IG5ldyBCdXR0b24oaW5zdGFsbEtpbmRHcm91cCwgU1dULlJBRElPKTsKLQkJc2V0dGluZ3NTdGFuZGFsb25lLnNldFRleHQoTWVzc2FnZXMuRGlhbG9nX1N0YW5kYWxvbmVCdXR0b24pOwotCQlzZXR0aW5nc1N0YW5kYWxvbmUuYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgdmFsaWRhdGVMaXN0ZW5lcik7Ci0JCXNldHRpbmdzU3RhbmRhbG9uZS5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCXNldHRpbmdzU2hhcmVkID0gbmV3IEJ1dHRvbihpbnN0YWxsS2luZEdyb3VwLCBTV1QuUkFESU8pOwotCQlzZXR0aW5nc1NoYXJlZC5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19TaGFyZWRCdXR0b24pOwotCQlzZXR0aW5nc1NoYXJlZC5hZGRMaXN0ZW5lcihTV1QuU2VsZWN0aW9uLCB2YWxpZGF0ZUxpc3RlbmVyKTsKLQkJc2V0dGluZ3NFeHBsYWluID0gbmV3IExhYmVsKGluc3RhbGxLaW5kR3JvdXAsIFNXVC5XUkFQKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuREVGQVVMVCwgNDApOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlzZXR0aW5nc0V4cGxhaW4uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc2V0dGluZ3NFeHBsYWluLnNldFRleHQoTWVzc2FnZXMuRGlhbG9nX0V4cGxhaW5TdGFuZGFsb25lKTsKLQotCQkvL21ha2UgdGhlIGVudGlyZSBncm91cCBpbnZpc2libGUgdW50aWwgd2UgYWN0dWFsbHkgbmVlZCB0byBwcm9tcHQgZm9yIGxvY2F0aW9ucwotCQlzZXR0aW5nc0dyb3VwLnNldFZpc2libGUoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVQcm9ncmVzc0NvbnRyb2xzKCkgewotCQlwcm9ncmVzc0JhciA9IG5ldyBQcm9ncmVzc0Jhcihjb250ZW50cywgU1dULkhPUklaT05UQUwgfCBTV1QuU01PT1RIKTsKLQkJcHJvZ3Jlc3NCYXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXByb2dyZXNzQmFyLnNldFZpc2libGUoZmFsc2UpOwotCQlwcm9ncmVzc1N1YlRhc2sgPSBuZXcgTGFiZWwoY29udGVudHMsIFNXVC5XUkFQIHwgU1dULkxFRlQpOwotCQlwcm9ncmVzc1N1YlRhc2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNoZWxsKCkgewotCQlzaGVsbCA9IG5ldyBTaGVsbChTV1QuRElBTE9HX1RSSU0gfCBTV1QuQVBQTElDQVRJT05fTU9EQUwgfCBTV1QuTUlOIHwgU1dULlJFU0laRSk7Ci0JCXNoZWxsLnNldEJvdW5kcygzMDAsIDIwMCwgNjAwLCA0MDApOwotCQlzaGVsbC5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19TaGVsbFRpdGxlKTsKLQkJc2hlbGwuc2V0TGF5b3V0KG5ldyBGaWxsTGF5b3V0KCkpOwotCQljb250ZW50cyA9IG5ldyBDb21wb3NpdGUoc2hlbGwsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAxNTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDE1OwotCQljb250ZW50cy5zZXRMYXlvdXQobGF5b3V0KTsKLQl9Ci0KLQlwdWJsaWMgRGlzcGxheSBnZXREaXNwbGF5KCkgewotCQlTaGVsbCB0aGVTaGVsbCA9IHNoZWxsOwotCQlpZiAodGhlU2hlbGwgPT0gbnVsbCB8fCB0aGVTaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRoZVNoZWxsLmdldERpc3BsYXkoKTsKLQl9Ci0KLQlwdWJsaWMgU2hlbGwgZ2V0U2hlbGwoKSB7Ci0JCXJldHVybiBzaGVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBc2tzIHRoZSB1c2VyIHRvIGNsb3NlIHRoZSBkaWFsb2csIGFuZCByZXR1cm5zIG9uY2UgdGhlIGRpYWxvZyBpcyBjbG9zZWQuCi0JICovCi0JcHVibGljIHZvaWQgcHJvbXB0Rm9yQ2xvc2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQlpZiAoZGlzcGxheSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlwcm9ncmVzc1Rhc2suc2V0VGV4dChtZXNzYWdlKTsKLQkJcHJvZ3Jlc3NTdWJUYXNrLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCXByb2dyZXNzQmFyLnNldFZpc2libGUoZmFsc2UpOwotCQlva0J1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJY2FuY2VsQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRGlhbG9nX0Nsb3NlQnV0dG9uKTsKLQkJY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXdhaXRpbmdGb3JDbG9zZSA9IHRydWU7Ci0JCXdoaWxlIChzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcm9tcHRGb3JMYXVuY2goSW5zdGFsbERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCURpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkoKTsKLQkJaWYgKGRpc3BsYXkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcHJvZ3Jlc3NUYXNrLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMuRGlhbG9nX1Byb21wdFN0YXJ0LCBkZXNjcmlwdGlvbi5nZXRQcm9kdWN0TmFtZSgpKSk7Ci0JCXByb2dyZXNzU3ViVGFzay5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9ncmVzc0Jhci5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJb2tCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5EaWFsb2dfTGF1bmNoQnV0dG9uKTsKLQkJb2tCdXR0b24uc2V0VmlzaWJsZSh0cnVlKTsKLQkJY2FuY2VsQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRGlhbG9nX0Nsb3NlQnV0dG9uKTsKLQkJY2FuY2VsQnV0dG9uLnNldFZpc2libGUodHJ1ZSk7Ci0JCXdhaXRpbmdGb3JDbG9zZSA9IHRydWU7Ci0JCXdoaWxlIChzaGVsbCAhPSBudWxsICYmICFzaGVsbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWlmICghZGlzcGxheS5yZWFkQW5kRGlzcGF0Y2goKSkKLQkJCQlkaXNwbGF5LnNsZWVwKCk7Ci0JCX0KLQkJcmV0dXJuIHJldHVybkNvZGUgPT0gT0s7Ci0JfQotCi0JLyoqCi0JICogUHJvbXB0cyB0aGUgdXNlciBmb3IgdGhlIGluc3RhbGwgbG9jYXRpb24sIGFuZCB3aGV0aGVyIHRoZSBpbnN0YWxsIHNob3VsZAotCSAqIGJlIHNoYXJlZCBvciBzdGFuZGFsb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIHByb21wdEZvckxvY2F0aW9ucyhJbnN0YWxsRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJcHJvZ3Jlc3NUYXNrLnNldFRleHQoTkxTLmJpbmQoTWVzc2FnZXMuRGlhbG9nX0xvY2F0aW9uUHJvbXB0LCBkZXNjcmlwdGlvbi5nZXRQcm9kdWN0TmFtZSgpKSk7Ci0JCW9rQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRGlhbG9nX0luc3RhbGxCdXR0b24pOwotCQlva0J1dHRvbi5zZXRWaXNpYmxlKHRydWUpOwotCQljYW5jZWxCdXR0b24uc2V0VGV4dChNZXNzYWdlcy5EaWFsb2dfQ2FuY2VsQnV0dG9uKTsKLQkJY2FuY2VsQnV0dG9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCXNldHRpbmdzR3JvdXAuc2V0VmlzaWJsZSh0cnVlKTsKLQkJdmFsaWRhdGVJbnN0YWxsU2V0dGluZ3MoKTsKLQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0RGlzcGxheSgpOwotCQlyZXR1cm5Db2RlID0gLTE7Ci0JCXdoaWxlIChyZXR1cm5Db2RlID09IC0xICYmIHNoZWxsICE9IG51bGwgJiYgIXNoZWxsLmlzRGlzcG9zZWQoKSkgewotCQkJaWYgKCFkaXNwbGF5LnJlYWRBbmREaXNwYXRjaCgpKQotCQkJCWRpc3BsYXkuc2xlZXAoKTsKLQkJfQotCQlpZiAocmV0dXJuQ29kZSA9PSBDQU5DRUwpCi0JCQljbG9zZSgpOwotCQlpZiAoc2hlbGwgPT0gbnVsbCB8fCBzaGVsbC5pc0Rpc3Bvc2VkKCkpCi0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJc2V0SW5zdGFsbFNldHRpbmdzRW5hYmxlbWVudChmYWxzZSk7Ci0JCVBhdGggbG9jYXRpb24gPSBuZXcgUGF0aChzZXR0aW5nc0xvY2F0aW9uLmdldFRleHQoKSk7Ci0JCWRlc2NyaXB0aW9uLnNldEluc3RhbGxMb2NhdGlvbihsb2NhdGlvbik7Ci0JCWlmIChzZXR0aW5nc1N0YW5kYWxvbmUuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCS8vZm9yY2UgZXZlcnl0aGluZyB0byBiZSBjby1sb2NhdGVkIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB2YWx1ZXMgd2VyZSBzZXQgaW4gdGhlIGluc3RhbGwgZGVzY3JpcHRpb24KLQkJCWRlc2NyaXB0aW9uLnNldEFnZW50TG9jYXRpb24obG9jYXRpb24uYXBwZW5kKCJwMiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJZGVzY3JpcHRpb24uc2V0QnVuZGxlTG9jYXRpb24obG9jYXRpb24pOwotCQl9IGVsc2UgewotCQkJaWYgKGRlc2NyaXB0aW9uLmdldEFnZW50TG9jYXRpb24oKSA9PSBudWxsKQotCQkJCWRlc2NyaXB0aW9uLnNldEFnZW50TG9jYXRpb24obmV3IFBhdGgoU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKSkuYXBwZW5kKCIucDIvIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCS8vdXNlIGJ1bmRsZSBwb29sIGxvY2F0aW9uIHNwZWNpZmllZCBpbiBpbnN0YWxsIGRlc2NyaXB0aW9uCi0JCQkvL2J5IGRlZmF1bHQgdGhpcyB3aWxsIGJlIG51bGwsIGNhdXNpbmcgdGhlIGJ1bmRsZSBwb29sIHRvIGJlIG5lc3RlZCBpbiB0aGUgYWdlbnQgbG9jYXRpb24KLQkJfQotCQlva0J1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBydW5zIHRoZSBnaXZlbiBvcGVyYXRpb24gaW4gdGhlIGNvbnRleHQgb2YgYSBwcm9ncmVzcyBkaWFsb2cuCi0JICogVGhlIGRpYWxvZyBpcyBvcGVuZWQgYXV0b21hdGljYWxseSBwcmlvciB0byBzdGFydGluZyB0aGUgb3BlcmF0aW9uLCBhbmQgY2xvc2VkCi0JICogYXV0b21hdGljYWxseSB1cG9uIGNvbXBsZXRpb24uCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgVUkgdGhyZWFkLiBUaGUgb3BlcmF0aW9uIHdpbGwgYmUKLQkgKiBleGVjdXRlZCBvdXRzaWRlIHRoZSBVSSB0aHJlYWQuCi0JICogCi0JICogQHBhcmFtIG9wZXJhdGlvbiBUaGUgb3BlcmF0aW9uIHRvIHJ1bgotCSAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uCi0JICovCi0JcHVibGljIElTdGF0dXMgcnVuKGZpbmFsIElJbnN0YWxsT3BlcmF0aW9uIG9wZXJhdGlvbikgewotCQlmaW5hbCBSZXN1bHQgcmVzdWx0ID0gbmV3IFJlc3VsdCgpOwotCQlUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZCgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl0cnkgewotCQkJCQlyZXN1bHQuc2V0U3RhdHVzKG9wZXJhdGlvbi5pbnN0YWxsKG5ldyBNb25pdG9yKCkpKTsKLQkJCQl9IGNhdGNoIChUaHJlYWREZWF0aCB0KSB7Ci0JCQkJCS8vbXVzdCByZXRocm93IG9yIHRoZSB0aHJlYWQgd29uJ3QgZGllCi0JCQkJCXRocm93IHQ7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiB0KSB7Ci0JCQkJCXJlc3VsdC5mYWlsZWQodCk7Ci0JCQkJfSBjYXRjaCAoRXJyb3IgdCkgewotCQkJCQlyZXN1bHQuZmFpbGVkKHQpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCURpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkoKTsKLQkJCQkJLy9lbnN1cmUgYWxsIGV2ZW50cyBmcm9tIHRoZSBvcGVyYXRpb24gaGF2ZSBydW4KLQkJCQkJaWYgKGRpc3BsYXkgIT0gbnVsbCkgewotCQkJCQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkvL2RvIG5vdGhpbmcKLQkJCQkJCQl9Ci0JCQkJCQl9KTsKLQkJCQkJfQotCQkJCQlyZXN1bHQuZG9uZSgpOwotCQkJCQkvL3dha2UgdGhlIGV2ZW50IGxvb3AKLQkJCQkJaWYgKGRpc3BsYXkgIT0gbnVsbCkKLQkJCQkJCWRpc3BsYXkud2FrZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJd2FpdGluZ0ZvckNsb3NlID0gZmFsc2U7Ci0JCXByb2dyZXNzVGFzay5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19JbnN0YWxsbGluZ1Byb2dyZXNzKTsKLQkJY2FuY2VsQnV0dG9uLnNldFRleHQoTWVzc2FnZXMuRGlhbG9nX0NhbmNlbEJ1dHRvbik7Ci0JCXRocmVhZC5zdGFydCgpOwotCQlEaXNwbGF5IGRpc3BsYXkgPSBnZXREaXNwbGF5KCk7Ci0JCXdoaWxlICghcmVzdWx0LmlzRG9uZSgpKSB7Ci0JCQlpZiAoIWRpc3BsYXkucmVhZEFuZERpc3BhdGNoKCkpCi0JCQkJZGlzcGxheS5zbGVlcCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQuZ2V0U3RhdHVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldEluc3RhbGxTZXR0aW5nc0VuYWJsZW1lbnQoYm9vbGVhbiB2YWx1ZSkgewotCQlzZXR0aW5nc0xvY2F0aW9uLnNldEVuYWJsZWQodmFsdWUpOwotCQlzZXR0aW5nc1NoYXJlZC5zZXRFbmFibGVkKHZhbHVlKTsKLQkJc2V0dGluZ3NTdGFuZGFsb25lLnNldEVuYWJsZWQodmFsdWUpOwotCQlzZXR0aW5nc0dyb3VwLnNldEVuYWJsZWQodmFsdWUpOwotCQlzZXR0aW5nc0V4cGxhaW4uc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JCXNldHRpbmdzQnJvd3NlLnNldEVuYWJsZWQodmFsdWUpOwotCQlzZXR0aW5nc0xvY2F0aW9uTGFiZWwuc2V0RW5hYmxlZCh2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAocHJvZ3Jlc3NUYXNrICE9IG51bGwgJiYgIXByb2dyZXNzVGFzay5pc0Rpc3Bvc2VkKCkpCi0JCQlwcm9ncmVzc1Rhc2suc2V0VGV4dChtZXNzYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiBWYWxpZGF0ZXMgdGhhdCB0aGUgdXNlciBoYXMgY29ycmVjdGx5IGVudGVyZWQgYWxsIHJlcXVpcmVkIGluc3RhbGwgc2V0dGluZ3MuCi0JICovCi0Jdm9pZCB2YWxpZGF0ZUluc3RhbGxTZXR0aW5ncygpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gc2V0dGluZ3NTdGFuZGFsb25lLmdldFNlbGVjdGlvbigpIHx8IHNldHRpbmdzU2hhcmVkLmdldFNlbGVjdGlvbigpOwotCQllbmFibGVkICY9IFBhdGguUk9PVC5pc1ZhbGlkUGF0aChzZXR0aW5nc0xvY2F0aW9uLmdldFRleHQoKSk7Ci0JCWlmIChlbmFibGVkKSB7Ci0JCQkvL21ha2Ugc3VyZSB0aGUgaW5zdGFsbCBsb2NhdGlvbiBpcyBhbiBhYnNvbHV0ZSBwYXRoCi0JCQlJUGF0aCBsb2NhdGlvbiA9IG5ldyBQYXRoKHNldHRpbmdzTG9jYXRpb24uZ2V0VGV4dCgpKTsKLQkJCWVuYWJsZWQgJj0gbG9jYXRpb24uaXNBYnNvbHV0ZSgpOwotCQl9Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJaWYgKHNldHRpbmdzU3RhbmRhbG9uZS5nZXRTZWxlY3Rpb24oKSkKLQkJCXNldHRpbmdzRXhwbGFpbi5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19FeHBsYWluU3RhbmRhbG9uZSk7Ci0JCWVsc2UKLQkJCXNldHRpbmdzRXhwbGFpbi5zZXRUZXh0KE1lc3NhZ2VzLkRpYWxvZ19FeHBsYWluU2hhcmVkKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvdWkvU1dUSW5zdGFsbEFkdmlzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvaW5zdGFsbGVyL3VpL1NXVEluc3RhbGxBZHZpc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNjA2MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9pbnN0YWxsZXIvdWkvU1dUSW5zdGFsbEFkdmlzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmluc3RhbGxlci51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuaW5zdGFsbGVyLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuaW5zdGFsbGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBJbnN0YWxsIGNvbnRleHQgdGhhdCBjcmVhdGVzIGEgc2ltcGxlIFNXVC1iYXNlZCBVSSBhbmQgaW50ZXJhY3RzIHdpdGggYSB1c2VyLgotICovCi1wdWJsaWMgY2xhc3MgU1dUSW5zdGFsbEFkdmlzb3IgZXh0ZW5kcyBJbnN0YWxsQWR2aXNvciB7Ci0JcHJpdmF0ZSBJbnN0YWxsRGlhbG9nIGRpYWxvZzsKLQlwcml2YXRlIGJvb2xlYW4gc3RhcnRlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBzdG9wcGVkID0gZmFsc2U7Ci0KLQlwdWJsaWMgSVN0YXR1cyBwZXJmb3JtSW5zdGFsbChJSW5zdGFsbE9wZXJhdGlvbiBvcGVyYXRpb24pIHsKLQkJcmV0dXJuIGRpYWxvZy5ydW4ob3BlcmF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgSW5zdGFsbERlc2NyaXB0aW9uIHByZXBhcmVJbnN0YWxsRGVzY3JpcHRpb24oSW5zdGFsbERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCWlmIChkZXNjcmlwdGlvbi5nZXRJbnN0YWxsTG9jYXRpb24oKSA9PSBudWxsKQotCQkJZGlhbG9nLnByb21wdEZvckxvY2F0aW9ucyhkZXNjcmlwdGlvbik7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcm9tcHRGb3JMYXVuY2goSW5zdGFsbERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiBkaWFsb2cucHJvbXB0Rm9yTGF1bmNoKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHQoSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3RyaW5nIG1lc3NhZ2U7Ci0JCWlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkNBTkNFTCkgewotCQkJbWVzc2FnZSA9IE1lc3NhZ2VzLkFkdmlzb3JfQ2FuY2VsZWQ7Ci0JCX0gZWxzZSB7Ci0JCQltZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJfQotCQlkaWFsb2cucHJvbXB0Rm9yQ2xvc2UobWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHN0YXJ0KCkgewotCQlpZiAoc3RvcHBlZCB8fCBzdGFydGVkKQotCQkJcmV0dXJuOwotCQlzdGFydGVkID0gdHJ1ZTsKLQkJRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXRDdXJyZW50KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwpCi0JCQlkaXNwbGF5ID0gbmV3IERpc3BsYXkoKTsKLQkJZGlhbG9nID0gbmV3IEluc3RhbGxEaWFsb2coKTsKLQkJZGlhbG9nLnNldE1lc3NhZ2UoTWVzc2FnZXMuQWR2aXNvcl9QcmVwYXJpbmcpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKCkgewotCQlpZiAoc3RvcHBlZCB8fCAhc3RhcnRlZCkKLQkJCXJldHVybjsKLQkJc3RvcHBlZCA9IHRydWU7Ci0JCWZpbmFsIEluc3RhbGxEaWFsb2cgYWN0aXZlRGlhbG9nID0gZGlhbG9nOwotCQlpZiAoYWN0aXZlRGlhbG9nID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vY2xlYXIgdGhlIHdpbmRvdyBub3csIHNvIHRoZSByZWZlcmVuY2UgaXMgZ29uZSBubyBtYXR0ZXIgd2hhdCBoYXBwZW5zIGR1cmluZyBjbGVhbnVwCi0JCWRpYWxvZyA9IG51bGw7Ci0JCWZpbmFsIERpc3BsYXkgZGlzcGxheSA9IGFjdGl2ZURpYWxvZy5nZXREaXNwbGF5KCk7Ci0JCWlmIChkaXNwbGF5ID09IG51bGwgfHwgZGlzcGxheS5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWFjdGl2ZURpYWxvZy5jbG9zZSgpOwotCQkJfQotCQl9KTsKLQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2luc3RhbGxlci9JSW5zdGFsbE9wZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9pbnN0YWxsZXIvSUluc3RhbGxPcGVyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkZDliMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2luc3RhbGxlci9JSW5zdGFsbE9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmluc3RhbGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotCi0vKioKLSAqIFRoZSBvcGVyYXRpb24gdGhhdCB3aWxsIHBlcmZvcm0gdGhlIGluc3RhbGwuIFRoaXMgaW50ZXJmYWNlIGV4aXN0cyB0byBhbGxvdwotICogdGhlIGluc3RhbGwgYWR2aXNvciB0byBhY3QgYXMgdGhlIHJ1bm5hYmxlIGNvbnRleHQgZm9yIHRoZSBpbnN0YWxsLCBoYW5kbGluZwotICogcHJvZ3Jlc3MgbW9uaXRvcmluZyBhbmQgY2FuY2VsYXRpb24uCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElJbnN0YWxsT3BlcmF0aW9uIHsKLQkvKioKLQkgKiBQZXJmb3JtcyB0aGUgaW5zdGFsbC4KLQkgKiA8cD4KLQkgKiBUaGUgcHJvdmlkZWQgbW9uaXRvciBjYW4gYmUgdXNlZCB0byByZXBvcnQgcHJvZ3Jlc3MgYW5kIHJlc3BvbmQgdG8gCi0JICogY2FuY2VsbGF0aW9uLiAgSWYgdGhlIHByb2dyZXNzIG1vbml0b3IgaGFzIGJlZW4gY2FuY2VsZWQsIHRoZSBqb2IKLQkgKiBzaG91bGQgZmluaXNoIGl0cyBleGVjdXRpb24gYXQgdGhlIGVhcmxpZXN0IGNvbnZlbmllbmNlIGFuZCByZXR1cm4gYSByZXN1bHQKLQkgKiBzdGF0dXMgb2Ygc2V2ZXJpdHkge0BsaW5rIElTdGF0dXMjQ0FOQ0VMfS4gIFRoZSBzaW5nbGV0b24KLQkgKiBjYW5jZWwgc3RhdHVzIHtAbGluayBTdGF0dXMjQ0FOQ0VMX1NUQVRVU30gY2FuIGJlIHVzZWQgZm9yCi0JICogdGhpcyBwdXJwb3NlLiAgVGhlIG1vbml0b3IgaXMgb25seSB2YWxpZCBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBpbnZvY2F0aW9uCi0JICogb2YgdGhpcyBtZXRob2QuCi0JICogCi0JICogQHBhcmFtIG1vbml0b3IgdGhlIG1vbml0b3IgdG8gYmUgdXNlZCBmb3IgcmVwb3J0aW5nIHByb2dyZXNzIGFuZAotCSAqIHJlc3BvbmRpbmcgdG8gY2FuY2VsYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzIHJlcG9ydGluZwotCSAqIGFuZCBjYW5jZWxhdGlvbiBhcmUgbm90IGRlc2lyZWQuCi0JICogQHJldHVybiByZXN1bHRpbmcgc3RhdHVzIG9mIHRoZSBydW4uIFRoZSByZXN1bHQgbXVzdCBub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBpbnN0YWxsKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2luc3RhbGxlci9JbnN0YWxsQWR2aXNvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9pbnN0YWxsZXIvSW5zdGFsbEFkdmlzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZlYWNjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL2luc3RhbGxlci9JbnN0YWxsQWR2aXNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuaW5zdGFsbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLS8qKgotICogVGhlIGluc3RhbGwgYWR2aXNvciBoZWxwcyB0byBtYWtlIGRlY2lzaW9ucyBkdXJpbmcgaW5zdGFsbCwgYW5kIGlzIHRoZSBjb25kdWl0Ci0gKiBmb3IgcmVwb3J0aW5nIHByb2dyZXNzIGFuZCByZXN1bHRzIGJhY2sgdG8gYW4gZW5kIHVzZXIgb3IgbG9nLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgSW5zdGFsbEFkdmlzb3IgewotCS8qKgotCSAqIFBlcmZvcm1zIHRoZSBhY3R1YWwgaW5zdGFsbC4gVGhlIGFkdmlzb3IgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHByb2dyZXNzCi0JICogbW9uaXRvcmluZyBhbmQgY2FuY2VsYXRpb24uIFRoZSBhZHZpc29yIG1heSBwZXJmb3JtIHRoZSBpbnN0YWxsIGluCi0JICogYW5vdGhlciB0aHJlYWQsIGJ1dCBtdXN0IGJsb2NrIHRoZSBjYWxsaW5nIHRocmVhZCB1bnRpbCB0aGUgaW5zdGFsbAotCSAqIGNvbXBsZXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gb3BlcmF0aW9uIFRoZSBpbnN0YWxsIG9wZXJhdGlvbiB0byBydW4KLQkgKiBAcmV0dXJuIElTdGF0dXMgVGhlIHJlc3VsdCBvZiB0aGUgaW5zdGFsbCBvcGVyYXRpb24uIFRoaXMgaXMgdHlwaWNhbGx5Ci0JICoganVzdCB0aGUgcmV0dXJuIHZhbHVlIG9mIHtAbGluayBJSW5zdGFsbE9wZXJhdGlvbiNpbnN0YWxsKElQcm9ncmVzc01vbml0b3IpfSwKLQkgKiBidXQgdGhlIGFkdmlzb3IgbWF5IGFsdGVyIHRoZSByZXN1bHQgc3RhdHVzIGlmIGRlc2lyZWQuCi0JICovCi0JcHVibGljIGFic3RyYWN0IElTdGF0dXMgcGVyZm9ybUluc3RhbGwoSUluc3RhbGxPcGVyYXRpb24gb3BlcmF0aW9uKTsKLQotCS8qKgotCSAqIEFsbG93cyB0aGUgYWR2aXNvciB0byBtb2RpZnkgb3IgZmlsbCBpbiBtaXNzaW5nIHZhbHVlcyBpbiB0aGUgaW5zdGFsbCBkZXNjcmlwdGlvbi4gIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgaW5pdGlhbCBpbnN0YWxsIGRlc2NyaXB0aW9uCi0JICogQHJldHVybiBUaGUgaW5zdGFsbCBkZXNjcmlwdGlvbiB0byBiZSB1c2VkIGZvciB0aGUgaW5zdGFsbC4KLQkgKiBAZXhjZXB0aW9uIE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uIGlmIHRoZSBpbnN0YWxsIHNob3VsZCBiZSBjYW5jZWxlZC4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSW5zdGFsbERlc2NyaXB0aW9uIHByZXBhcmVJbnN0YWxsRGVzY3JpcHRpb24oSW5zdGFsbERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKTsKLQotCS8qKgotCSAqIFByb21wdHMgZm9yIHdoZXRoZXIgdGhlIGluc3RhbGxlZCBhcHBsaWNhdGlvbiBzaG91bGQgYmUgbGF1bmNoZWQgaW1tZWRpYXRlbHkuCi0JICogVGhpcyBtZXRob2QgaXMgb25seSBjYWxsZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIGluc3RhbGwuCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBpbml0aWFsIGluc3RhbGwgZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBwcm9kdWN0IHNob3VsZCBiZSBsYXVuY2hlZCwgYW5kIAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcHJvbXB0Rm9yTGF1bmNoKEluc3RhbGxEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbik7Ci0KLQkvKioKLQkgKiBSZXBvcnRzIHNvbWUgcmVzdWx0IGluZm9ybWF0aW9uIHRvIHRoZSBjb250ZXh0LiAgVGhlIHN0YXR1cyBtYXkgYmUKLQkgKiBpbmZvcm1hdGlvbiwgd2FybmluZywgb3IgYW4gZXJyb3IuCi0JICovCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2V0UmVzdWx0KElTdGF0dXMgc3RhdHVzKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBpbnN0YWxsIGFkdmlzb3IuICBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBhbnkgCi0JICogb3RoZXIgbWV0aG9kcyBvbiB0aGUgYWR2aXNvciBhcmUgY2FsbGVkLiAgU3Vic2VxdWVudCBpbnZvY2F0aW9ucyBvZiB0aGlzCi0JICogbWV0aG9kIGFyZSBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0YXJ0KCk7Ci0KLQkvKioKLQkgKiBTdG9wcyB0aGUgaW5zdGFsbCBhZHZpc29yLiBUaGUgYWR2aXNvciBiZWNvbWVzIGludmFsaWQgYWZ0ZXIgaXQgaGFzIGJlZW4KLQkgKiBzdG9wcGVkOyBhIHN0b3BwZWQgYWR2aXNvciBjYW5ub3QgYmUgcmVzdGFydGVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHN0b3AoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pbnN0YWxsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvaW5zdGFsbGVyL0luc3RhbGxEZXNjcmlwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9pbnN0YWxsZXIvSW5zdGFsbERlc2NyaXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OWZlNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9pbnN0YWxsZXIvSW5zdGFsbERlc2NyaXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuaW5zdGFsbGVyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIEFuIGluc3RhbGwgaW5mb3JtYXRpb24gY2FwdHVyZXMgYWxsIHRoZSBkYXRhIG5lZWRlZCB0byBwZXJmb3JtIGEgcHJvZHVjdCBpbnN0YWxsLgotICogVGhpcyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBvbiB3aGVyZSB0aGUgaW5zdGFsbGVkIHByb2R1Y3QgY29tZXMgZnJvbSwgd2hhdCB3aWxsCi0gKiBiZSBpbnN0YWxsZWQsIGFuZCB3aGVyZSBpdCB3aWxsIGJlIGluc3RhbGxlZC4KLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxEZXNjcmlwdGlvbiB7Ci0JcHJpdmF0ZSBVUkwgYXJ0aWZhY3RSZXBvOwotCXByaXZhdGUgSVBhdGggaW5zdGFsbExvY2F0aW9uLCBhZ2VudExvY2F0aW9uLCBidW5kbGVMb2NhdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gaXNBdXRvU3RhcnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgbGF1bmNoZXJOYW1lOwotCXByaXZhdGUgVVJMIG1ldGFkYXRhUmVwbzsKLQlwcml2YXRlIFN0cmluZyBwcm9kdWN0TmFtZTsKLQlwcml2YXRlIFN0cmluZyByb290SWQ7Ci0JcHJpdmF0ZSBWZXJzaW9uIHJvb3RWZXJzaW9uOwotCXByaXZhdGUgZmluYWwgTWFwIHByb2ZpbGVQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBJbnN0YWxsRGVzY3JpcHRpb24oU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5wcm9kdWN0TmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcDIgYWdlbnQgbG9jYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIGluZGljYXRlCi0JICogdGhlIGRlZmF1bHQgYWdlbnQgbG9jYXRpb24uCi0JICovCi0JcHVibGljIElQYXRoIGdldEFnZW50TG9jYXRpb24oKSB7Ci0JCXJldHVybiBhZ2VudExvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxvY2F0aW9uIG9mIHRoZSBhcnRpZmFjdCByZXBvc2l0b3J5IHRvIGluc3RhbGwgZnJvbQotCSAqIEByZXR1cm4gYW4gYXJ0aWZhY3QgcmVwb3NpdG9yeSBVUkwKLQkgKi8KLQlwdWJsaWMgVVJMIGdldEFydGlmYWN0UmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwbzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBidW5kbGUgcG9vbCBsb2NhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8KLQkgKiBpbmRpY2F0ZSB0aGUgZGVmYXVsdCBidW5kbGUgcG9vbCBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0QnVuZGxlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBidW5kbGVMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhbCBmaWxlIHN5c3RlbSBsb2NhdGlvbiB0byBpbnN0YWxsIGludG8uCi0JICogQHJldHVybiBhIGxvY2FsIGZpbGUgc3lzdGVtIGxvY2F0aW9uCi0JICovCi0JcHVibGljIElQYXRoIGdldEluc3RhbGxMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGluc3RhbGxMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBwcm9kdWN0J3MgbGF1bmNoZXIgZXhlY3V0YWJsZQotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGxhdW5jaGVyIGV4ZWN1dGFibGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVyTmFtZSgpIHsKLQkJcmV0dXJuIGxhdW5jaGVyTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgbWV0YWRhdGEgcmVwb3NpdG9yeSB0byBpbnN0YWxsIGZyb20KLQkgKiBAcmV0dXJuIGEgbWV0YWRhdGEgcmVwb3NpdG9yeSBVUkwKLQkgKi8KLQlwdWJsaWMgVVJMIGdldE1ldGFkYXRhUmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIG1ldGFkYXRhUmVwbzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9maWxlIHByb3BlcnRpZXMgZm9yIHRoaXMgaW5zdGFsbC4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFByb2ZpbGVQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gcHJvZmlsZVByb3BlcnRpZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoaXMgaW5zdGFsbC4KLQkgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBwcm9kdWN0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9kdWN0TmFtZSgpIHsKLQkJcmV0dXJuIHByb2R1Y3ROYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIG9mIHRoZSByb290IGluc3RhbGxhYmxlIHVuaXQKLQkgKiBAcmV0dXJuIHRoZSBpZCBvZiB0aGUgcm9vdCBpbnN0YWxsYWJsZSB1bml0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRSb290SWQoKSB7Ci0JCXJldHVybiByb290SWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmVyc2lvbiBvZiB0aGUgcm9vdCBpbnN0YWxsYWJsZSB1bml0Ci0JICogQHJldHVybiB0aGUgdmVyc2lvbiBvZiB0aGUgcm9vdCBpbnN0YWxsYWJsZSB1bml0Ci0JICovCi0JcHVibGljIFZlcnNpb24gZ2V0Um9vdFZlcnNpb24oKSB7Ci0JCXJldHVybiByb290VmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGluc3RhbGxlZCBwcm9kdWN0IHNob3VsZCBiZSBzdGFydGVkIHVwb24gc3VjY2Vzc2Z1bAotCSAqIGluc3RhbGwuCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJvZHVjdCBzaG91bGQgYmUgc3RhcnRlZCB1cG9uIHN1Y2Nlc3NmdWwKLQkgKiBpbnN0YWxsLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXV0b1N0YXJ0KCkgewotCQlyZXR1cm4gaXNBdXRvU3RhcnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWdlbnRMb2NhdGlvbihJUGF0aCBhZ2VudExvY2F0aW9uKSB7Ci0JCXRoaXMuYWdlbnRMb2NhdGlvbiA9IGFnZW50TG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RSZXBvc2l0b3J5KFVSTCByZXBvc2l0b3J5KSB7Ci0JCXRoaXMuYXJ0aWZhY3RSZXBvID0gcmVwb3NpdG9yeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdXRvU3RhcnQoYm9vbGVhbiB2YWx1ZSkgewotCQl0aGlzLmlzQXV0b1N0YXJ0ID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnVuZGxlTG9jYXRpb24oSVBhdGggYnVuZGxlTG9jYXRpb24pIHsKLQkJdGhpcy5idW5kbGVMb2NhdGlvbiA9IGJ1bmRsZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc3RhbGxMb2NhdGlvbihJUGF0aCBsb2NhdGlvbikgewotCQl0aGlzLmluc3RhbGxMb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExhdW5jaGVyTmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLmxhdW5jaGVyTmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0YWRhdGFSZXBvc2l0b3J5KFVSTCByZXBvc2l0b3J5KSB7Ci0JCXRoaXMubWV0YWRhdGFSZXBvID0gcmVwb3NpdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBTdXBwbGllcyBhIHNldCBvZiBwcm9maWxlIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQgd2hlbiB0aGUgcHJvZmlsZSBpcyBjcmVhdGVkLgotCSAqIEBwYXJhbSBwcm9wZXJ0aWVzIHRoZSBwcm9maWxlIHByb3BlcnRpZXMgdG8gYmUgYWRkZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9maWxlUHJvcGVydGllcyhNYXAgcHJvcGVydGllcykgewotCQlwcm9maWxlUHJvcGVydGllcy5wdXRBbGwocHJvcGVydGllcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdElkKFN0cmluZyByb290KSB7Ci0JCXRoaXMucm9vdElkID0gcm9vdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSb290VmVyc2lvbihWZXJzaW9uIHZlcnNpb24pIHsKLQkJdGhpcy5yb290VmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZGViNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjElRm91bmRhdGlvbi0xLjEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYTNlOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmY2M1OTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotI1dlZCBBdWcgMjkgMDA6NDU6MzIgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRjNDA1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNXZWQgQXVnIDI5IDAwOjQ1OjMyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWEyNzE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jVHVlIEF1ZyAyOCAxMToxOTo1OSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM3NjQ2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3NvcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMSwKLSBKMlNFLTEuNAotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycyIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5qYXJwcm9jZXNzb3IudmVyaWZpZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5pbnRlcm5hbC5wcm92aXNpb25hbC5lcXVpbm94LnAyLmphcnByb2Nlc3Nvcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjgzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Njg5OWFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggUHJvdmlzaW9uaW5nIEpBUiBQcm9jZXNzb3IKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9Db21tYW5kU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvQ29tbWFuZFN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU2NTJhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9Db21tYW5kU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yLklQcm9jZXNzU3RlcDsKLQotLyoqCi0gKiBAYXV0aG9yIGFuaWVmZXJAY2EuaWJtLmNvbQotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1hbmRTdGVwIGltcGxlbWVudHMgSVByb2Nlc3NTdGVwIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbW1hbmQgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZXh0ZW5zaW9uID0gbnVsbDsKLQlwcml2YXRlICBQcm9wZXJ0aWVzIG9wdGlvbnMgPSBudWxsOwotCXByb3RlY3RlZCBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQkKLQlwdWJsaWMgQ29tbWFuZFN0ZXAoUHJvcGVydGllcyBvcHRpb25zLCBTdHJpbmcgY29tbWFuZCwgU3RyaW5nIGV4dGVuc2lvbiwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCXRoaXMuY29tbWFuZCA9IGNvbW1hbmQ7Ci0JCXRoaXMuZXh0ZW5zaW9uID0gZXh0ZW5zaW9uOwotCQl0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwotCQl0aGlzLnZlcmJvc2UgPSB2ZXJib3NlOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgaW50IGV4ZWN1dGUoU3RyaW5nW10gY21kKSB7Ci0JCXJldHVybiBleGVjdXRlKGNtZCwgZmFsc2UpOwotCX0KLQkKLQlwcm90ZWN0ZWQgc3RhdGljIGludCBleGVjdXRlKFN0cmluZ1tdIGNtZCwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCVJ1bnRpbWUgcnVudGltZSA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOwotCQlQcm9jZXNzIHByb2MgPSBudWxsOwotCQl0cnkgewotCQkJcHJvYyA9IHJ1bnRpbWUuZXhlYyhjbWQpOwotCQkJU3RyZWFtUHJvY2Vzc29yIGVycm9yU3RyZWFtUHJvY2Vzc29yID0gbmV3IFN0cmVhbVByb2Nlc3Nvcihwcm9jLmdldEVycm9yU3RyZWFtKCksIFN0cmVhbVByb2Nlc3Nvci5TVERFUlIsIHZlcmJvc2UpOyAKLQkJCVN0cmVhbVByb2Nlc3NvciBvdXRwdXRTdHJlYW1Qcm9jZXNzb3IgPSBuZXcgU3RyZWFtUHJvY2Vzc29yKHByb2MuZ2V0SW5wdXRTdHJlYW0oKSwgU3RyZWFtUHJvY2Vzc29yLlNURE9VVCwgdmVyYm9zZSk7IAotCQkJZXJyb3JTdHJlYW1Qcm9jZXNzb3Iuc3RhcnQoKTsKLQkJCW91dHB1dFN0cmVhbVByb2Nlc3Nvci5zdGFydCgpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYodmVyYm9zZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3IgZXhlY3V0aW5nIGNvbW1hbmQgIiArIFV0aWxzLmNvbmNhdChjbWQpKTsgLy8kTk9OLU5MUy0xJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludCByZXN1bHQgPSBwcm9jLndhaXRGb3IoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCWlmKHZlcmJvc2UpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldE9wdGlvbnMoKSB7Ci0JCWlmKG9wdGlvbnMgPT0gbnVsbCkKLQkJCW9wdGlvbnMgPSBuZXcgUHJvcGVydGllcygpOwotCQlyZXR1cm4gb3B0aW9uczsKLQl9Ci0JCi0JcHVibGljIHZvaWQgYWRqdXN0SW5mKEZpbGUgaW5wdXQsIFByb3BlcnRpZXMgaW5mLCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJLy9ub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvTWFpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvTWFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2RmNzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL01haW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5qYXJwcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yLkphclByb2Nlc3NvckV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWFpbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiWy1vcHRpb24gLi4uXS4uLiBpbnB1dCIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCItcHJvY2Vzc0FsbCAgICAgcHJvY2VzcyBhbGwgamFycywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgd2VyZSBwcmV2aW91c2x5IG5vcm1hbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IG9ubHkgbm9ybWFsaXplZCBqYXJzIHdpbGwgYmUgcHJvY2Vzc2VkLiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiLXJlcGFjayAgICAgICAgIG5vcm1hbGl6ZSBqYXJzICIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiLXNpZ24gPGNvbW1hbmQ+IHNpZ24gamFycyB1c2luZyA8Y29tbWFuZD4iKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi1wYWNrICAgICAgICAgICBwYWNrIHRoZSBqYXJzLiAgcGFjayBhbmQgcmVwYWNrIGFyZSByZWR1bmRhbnQgdW5sZXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgICAgICAgICAgc2lnbiBpcyBhbHNvIHNwZWNpZmllZC4iKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi11bnBhY2sgICAgICAgICB1bnBhY2sgcGFjay5neiBmaWxlcy4gVW5wYWNrIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgICAgICAgICAgIHdpdGggcmVwYWNrLCBzaWduIGFuZCBwYWNrLiIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIi1vdXRwdXREaXIgPGRpcj4gIHRoZSBvdXRwdXQgZGlyZWN0b3J5Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCItdmVyYm9zZSAgICAgICAgdmVyYm9zZSBtb2RlICIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBKYXJQcm9jZXNzb3JFeGVjdXRvci5PcHRpb25zIHByb2Nlc3NBcmd1bWVudHMoU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncy5sZW5ndGggPT0gMCkgewotCQkJcHJpbnRVc2FnZSgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlKYXJQcm9jZXNzb3JFeGVjdXRvci5PcHRpb25zIG9wdGlvbnMgPSBuZXcgSmFyUHJvY2Vzc29yRXhlY3V0b3IuT3B0aW9ucygpOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoOyBpIDwgYXJncy5sZW5ndGggLSAxOyBpKyspIHsKLQkJCWlmIChhcmdzW2ldLmVxdWFscygiLXBhY2siKSkgey8vJE5PTi1OTFMtMSQKLQkJCQlvcHRpb25zLnBhY2sgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXVucGFjayIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlvcHRpb25zLnVucGFjayA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItc2lnbiIpICYmIGkgPCBhcmdzLmxlbmd0aCAtIDIpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcmludFVzYWdlKCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlvcHRpb25zLnNpZ25Db21tYW5kID0gYXJnc1srK2ldOwotCQkJfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXJlcGFjayIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlvcHRpb25zLnJlcGFjayA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItb3V0cHV0RGlyIikgJiYgaSA8IGFyZ3MubGVuZ3RoIC0gMikgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFyZ3NbaSArIDFdLnN0YXJ0c1dpdGgoIi0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXByaW50VXNhZ2UoKTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCW9wdGlvbnMub3V0cHV0RGlyID0gYXJnc1srK2ldOwotCQkJfSBlbHNlIGlmIChhcmdzW2ldLmVxdWFscygiLXZlcmJvc2UiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJb3B0aW9ucy52ZXJib3NlID0gdHJ1ZTsKLQkJCX0gIGVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKCItcHJvY2Vzc0FsbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlvcHRpb25zLnByb2Nlc3NBbGwgPSB0cnVlOwotCQkJfSAKLQkJfQotCi0JCW9wdGlvbnMuaW5wdXQgPSBuZXcgRmlsZShhcmdzW2ldKTsKLQotCQlTdHJpbmcgcHJvYmxlbU1lc3NhZ2UgPSBudWxsOwotCQlTdHJpbmcgaW5wdXROYW1lID0gb3B0aW9ucy5pbnB1dC5nZXROYW1lKCk7Ci0JCWlmIChvcHRpb25zLnVucGFjaykgewotCQkJaWYgKCFKYXJQcm9jZXNzb3IuY2FuUGVyZm9ybVVucGFjaygpKSB7Ci0JCQkJcHJvYmxlbU1lc3NhZ2UgPSAiVGhlIHVucGFjazIwMCBjb21tYW5kIGNhbm5vdCBiZSBmb3VuZC4iOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UgCWlmIChvcHRpb25zLmlucHV0LmlzRmlsZSgpICYmICFpbnB1dE5hbWUuZW5kc1dpdGgoIi56aXAiKSAmJiAhaW5wdXROYW1lLmVuZHNXaXRoKCIucGFjay5neiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXByb2JsZW1NZXNzYWdlID0gIklucHV0IGZpbGUgaXMgbm90IGEgcGFjay5neiBmaWxlLiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSAJaWYgKG9wdGlvbnMucGFjayB8fCBvcHRpb25zLnJlcGFjayB8fCBvcHRpb25zLnNpZ25Db21tYW5kICE9IG51bGwpIHsKLQkJCQlwcm9ibGVtTWVzc2FnZSA9ICJQYWNrLCByZXBhY2sgb3Igc2lnbiBjYW5ub3QgYmUgc3BlY2lmaWVkIHdpdGggdW5wYWNrLiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChvcHRpb25zLmlucHV0LmlzRmlsZSgpICYmICFpbnB1dE5hbWUuZW5kc1dpdGgoIi56aXAiKSAmJiAhaW5wdXROYW1lLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJcHJvYmxlbU1lc3NhZ2UgPSAiSW5wdXQgZmlsZSBpcyBub3QgYSBqYXIgZmlsZS4iOyAvLyROT04tTkxTLTEkCi0JCQl9IGVsc2UJaWYgKChvcHRpb25zLnBhY2sgfHwgb3B0aW9ucy5yZXBhY2spICYmICFKYXJQcm9jZXNzb3IuY2FuUGVyZm9ybVBhY2soKSkgewotCQkJCXByb2JsZW1NZXNzYWdlID0gIlRoZSBwYWNrMjAwIGNvbW1hbmQgY2FuIG5vdCBiZSBmb3VuZC4iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYocHJvYmxlbU1lc3NhZ2UgIT0gbnVsbCl7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocHJvYmxlbU1lc3NhZ2UpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlwcmludFVzYWdlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJldHVybiBvcHRpb25zOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gYXJncwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJSmFyUHJvY2Vzc29yRXhlY3V0b3IuT3B0aW9ucyBvcHRpb25zID0gcHJvY2Vzc0FyZ3VtZW50cyhhcmdzKTsKLQkJaWYgKG9wdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbmV3IEphclByb2Nlc3NvckV4ZWN1dG9yKCkucnVuSmFyUHJvY2Vzc29yKG9wdGlvbnMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvUGFja1N0ZXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1BhY2tTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMmE3NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvUGFja1N0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1wdWJsaWMgY2xhc3MgUGFja1N0ZXAgZXh0ZW5kcyBDb21tYW5kU3RlcCB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBwYWNrQ29tbWFuZCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiBjYW5QYWNrID0gbnVsbDsKLQotCXByaXZhdGUgU2V0IGV4Y2x1c2lvbnMgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2FuUGFjaygpIHsKLQkJaWYgKGNhblBhY2sgIT0gbnVsbCkKLQkJCXJldHVybiBjYW5QYWNrLmJvb2xlYW5WYWx1ZSgpOwotCi0JCVN0cmluZ1tdIGxvY2F0aW9ucyA9IFV0aWxzLmdldFBhY2syMDBDb21tYW5kcygicGFjazIwMCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsb2NhdGlvbnMgPT0gbnVsbCkgewotCQkJY2FuUGFjayA9IEJvb2xlYW4uRkFMU0U7Ci0JCQlwYWNrQ29tbWFuZCA9IG51bGw7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpbnQgcmVzdWx0OwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxvY2F0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGxvY2F0aW9uc1tpXSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJcmVzdWx0ID0gZXhlY3V0ZShuZXcgU3RyaW5nW10ge2xvY2F0aW9uc1tpXSwgIi1WIn0pOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmVzdWx0ID09IDApIHsKLQkJCQlwYWNrQ29tbWFuZCA9IGxvY2F0aW9uc1tpXTsKLQkJCQljYW5QYWNrID0gQm9vbGVhbi5UUlVFOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJY2FuUGFjayA9IEJvb2xlYW4uRkFMU0U7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgUGFja1N0ZXAoUHJvcGVydGllcyBvcHRpb25zKSB7Ci0JCXN1cGVyKG9wdGlvbnMsIG51bGwsIG51bGwsIGZhbHNlKTsKLQkJZXhjbHVzaW9ucyA9IFV0aWxzLmdldFBhY2tFeGNsdXNpb25zKG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyBQYWNrU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlzdXBlcihvcHRpb25zLCBudWxsLCBudWxsLCB2ZXJib3NlKTsKLQkJZXhjbHVzaW9ucyA9IFV0aWxzLmdldFBhY2tFeGNsdXNpb25zKG9wdGlvbnMpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgcmVjdXJzaW9uRWZmZWN0KFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJaWYgKGNhblBhY2soKSAmJiBlbnRyeU5hbWUuZW5kc1dpdGgoIi5qYXIiKSAmJiAhZXhjbHVzaW9ucy5jb250YWlucyhlbnRyeU5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBlbnRyeU5hbWUgKyBVdGlscy5QQUNLRURfU1VGRklYOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBGaWxlIHByZVByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEZpbGUgcG9zdFByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJaWYgKGNhblBhY2soKSAmJiBwYWNrQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlQcm9wZXJ0aWVzIGluZiA9IFV0aWxzLmdldEVjbGlwc2VJbmYoaW5wdXQsIHZlcmJvc2UpOwotCQkJaWYgKCFzaG91bGRQYWNrKGlucHV0LCBjb250YWluZXJzLCBpbmYpKQotCQkJCXJldHVybiBudWxsOwotCQkJRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUod29ya2luZ0RpcmVjdG9yeSwgaW5wdXQuZ2V0TmFtZSgpICsgVXRpbHMuUEFDS0VEX1NVRkZJWCk7Ci0JCQl0cnkgewotCQkJCVN0cmluZ1tdIGNtZCA9IGdldENvbW1hbmQoaW5wdXQsIG91dHB1dEZpbGUsIGluZiwgY29udGFpbmVycyk7Ci0JCQkJaW50IHJlc3VsdCA9IGV4ZWN1dGUoY21kLCB2ZXJib3NlKTsKLQkJCQlpZiAocmVzdWx0ICE9IDAgJiYgdmVyYm9zZSkKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogIiArIHJlc3VsdCArICIgd2FzIHJldHVybmVkIGZyb20gY29tbWFuZDogIiArIFV0aWxzLmNvbmNhdChjbWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKHZlcmJvc2UpCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gb3V0cHV0RmlsZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzaG91bGRQYWNrKEZpbGUgaW5wdXQsIExpc3QgY29udGFpbmVycywgUHJvcGVydGllcyBpbmYpIHsKLQkJLy8xOiBleGNsdWRlIGJ5IGNvbnRhaW5lcnMKLQkJLy8gaW5uZXJtb3N0IGphciBpcyBmaXJzdCBvbiB0aGUgbGlzdCwgaXQgY2FuIG92ZXJyaWRlIG91dGVyIGphcnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRhaW5lcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJUHJvcGVydGllcyBjb250YWluZXIgPSAoUHJvcGVydGllcykgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGNvbnRhaW5lci5jb250YWluc0tleShVdGlscy5NQVJLX0VYQ0xVREVfQ0hJTERSRU5fUEFDSykpIHsKLQkJCQlpZiAoQm9vbGVhbi52YWx1ZU9mKGNvbnRhaW5lci5nZXRQcm9wZXJ0eShVdGlscy5NQVJLX0VYQ0xVREVfQ0hJTERSRU5fUEFDSykpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJCWlmICh2ZXJib3NlKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGlucHV0LmdldE5hbWUoKSArICIgaXMgZXhjbHVkZWQgZnJvbSBwYWNrMjAwIGJ5IGl0cyBjb250YWluZXJzLiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQkvLzI6IGV4Y2x1ZGVkIGJ5IHNlbGYKLQkJaWYgKGluZiAhPSBudWxsICYmIGluZi5jb250YWluc0tleShVdGlscy5NQVJLX0VYQ0xVREVfUEFDSykgJiYgQm9vbGVhbi52YWx1ZU9mKGluZi5nZXRQcm9wZXJ0eShVdGlscy5NQVJLX0VYQ0xVREVfUEFDSykpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlpZiAodmVyYm9zZSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2x1ZGluZyAiICsgaW5wdXQuZ2V0TmFtZSgpICsgIiBmcm9tICIgKyBnZXRTdGVwTmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0Q29tbWFuZChGaWxlIGlucHV0LCBGaWxlIG91dHB1dEZpbGUsIFByb3BlcnRpZXMgaW5mLCBMaXN0IGNvbnRhaW5lcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIGNtZCA9IG51bGw7Ci0JCVN0cmluZyBhcmd1bWVudHMgPSBnZXRBcmd1bWVudHMoaW5wdXQsIGluZiwgY29udGFpbmVycyk7Ci0JCWlmIChhcmd1bWVudHMgIT0gbnVsbCAmJiBhcmd1bWVudHMubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmdbXSBhcmdzID0gVXRpbHMudG9TdHJpbmdBcnJheShhcmd1bWVudHMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNtZCA9IG5ldyBTdHJpbmdbMyArIGFyZ3MubGVuZ3RoXTsKLQkJCWNtZFswXSA9IHBhY2tDb21tYW5kOwotCQkJU3lzdGVtLmFycmF5Y29weShhcmdzLCAwLCBjbWQsIDEsIGFyZ3MubGVuZ3RoKTsKLQkJCWNtZFtjbWQubGVuZ3RoIC0gMl0gPSBvdXRwdXRGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLQkJCWNtZFtjbWQubGVuZ3RoIC0gMV0gPSBpbnB1dC5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCX0gZWxzZSB7Ci0JCQljbWQgPSBuZXcgU3RyaW5nW10ge3BhY2tDb21tYW5kLCBvdXRwdXRGaWxlLmdldENhbm9uaWNhbFBhdGgoKSwgaW5wdXQuZ2V0Q2Fub25pY2FsUGF0aCgpfTsKLQkJfQotCQlyZXR1cm4gY21kOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXJndW1lbnRzKEZpbGUgaW5wdXQsIFByb3BlcnRpZXMgaW5mLCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJLy8xOiBFeHBsaWNpdGx5IG1hcmtlZCBpbiBvdXIgLmluZiBmaWxlCi0JCWlmIChpbmYgIT0gbnVsbCAmJiBpbmYuY29udGFpbnNLZXkoVXRpbHMuUEFDS19BUkdTKSkgewotCQkJcmV0dXJuIGluZi5nZXRQcm9wZXJ0eShVdGlscy5QQUNLX0FSR1MpOwotCQl9Ci0KLQkJLy8yOiBEZWZhdWx0cyBzZXQgaW4gb25lIG9mIG91ciBjb250YWluaW5nIGphcnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRhaW5lcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJUHJvcGVydGllcyBjb250YWluZXIgPSAoUHJvcGVydGllcykgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGNvbnRhaW5lci5jb250YWluc0tleShVdGlscy5ERUZBVUxUX1BBQ0tfQVJHUykpIHsKLQkJCQlyZXR1cm4gY29udGFpbmVyLmdldFByb3BlcnR5KFV0aWxzLkRFRkFVTFRfUEFDS19BUkdTKTsKLQkJCX0KLQkJfQotCi0JCS8vMzogU2V0IGJ5IG5hbWUgaW4gb3V0c2lkZSBwYWNrLnByb3BlcnRpZXMgZmlsZQotCQlQcm9wZXJ0aWVzIG9wdGlvbnMgPSBnZXRPcHRpb25zKCk7Ci0JCVN0cmluZyBhcmdzS2V5ID0gaW5wdXQuZ2V0TmFtZSgpICsgVXRpbHMuUEFDS19BUkdTX1NVRkZJWDsKLQkJaWYgKG9wdGlvbnMuY29udGFpbnNLZXkoYXJnc0tleSkpIHsKLQkJCXJldHVybiBvcHRpb25zLmdldFByb3BlcnR5KGFyZ3NLZXkpOwotCQl9Ci0KLQkJLy80OiBTZXQgYnkgZGVmYXVsdCBpbiBvdXRzaWRlIHBhY2sucHJvcGVydGllcyBmaWxlCi0JCWlmIChvcHRpb25zLmNvbnRhaW5zS2V5KFV0aWxzLkRFRkFVTFRfUEFDS19BUkdTKSkgewotCQkJcmV0dXJuIG9wdGlvbnMuZ2V0UHJvcGVydHkoVXRpbHMuREVGQVVMVF9QQUNLX0FSR1MpOwotCQl9Ci0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGVwTmFtZSgpIHsKLQkJcmV0dXJuICJQYWNrIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdEluZihGaWxlIGlucHV0LCBQcm9wZXJ0aWVzIGluZiwgTGlzdCBjb250YWluZXJzKSB7Ci0JCWlmIChpbnB1dCA9PSBudWxsIHx8IGluZiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vZG9uJ3QgYmUgdmVyYm9zZSB0byBjaGVjayBpZiB3ZSBzaG91bGQgbWFyayB0aGUgaW5mCi0JCWJvb2xlYW4gdiA9IHZlcmJvc2U7Ci0JCXZlcmJvc2UgPSBmYWxzZTsKLQkJaWYgKCFzaG91bGRQYWNrKGlucHV0LCBjb250YWluZXJzLCBpbmYpKSB7Ci0JCQl2ZXJib3NlID0gdjsKLQkJCXJldHVybjsKLQkJfQotCQl2ZXJib3NlID0gdjsKLQotCQkvL21hcmsgYXMgY29uZGl0aW9uZWQgaWYgbm90IHByZXZpb3VzbHkgbWFya2VkLiAgQSBzaWduZWQgamFyIGlzIGFzc3VtZWQgdG8gYmUgcHJldmlvdXNseSBjb25kaXRpb25lZC4KLQkJaWYgKGluZi5nZXRQcm9wZXJ0eShVdGlscy5NQVJLX1BST1BFUlRZKSA9PSBudWxsKSB7Ci0JCQlpbmYucHV0KFV0aWxzLk1BUktfUFJPUEVSVFksICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJLy9yZWNvcmQgYXJndW1lbnRzIHVzZWQKLQkJCVN0cmluZyBhcmd1bWVudHMgPSBpbmYuZ2V0UHJvcGVydHkoVXRpbHMuUEFDS19BUkdTKTsKLQkJCWlmIChhcmd1bWVudHMgPT0gbnVsbCkgewotCQkJCWFyZ3VtZW50cyA9IGdldEFyZ3VtZW50cyhpbnB1dCwgaW5mLCBjb250YWluZXJzKTsKLQkJCQlpZiAoYXJndW1lbnRzICE9IG51bGwgJiYgYXJndW1lbnRzLmxlbmd0aCgpID4gMCkKLQkJCQkJaW5mLnB1dChVdGlscy5QQUNLX0FSR1MsIGFyZ3VtZW50cyk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9QYWNrVW5wYWNrU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvUGFja1VucGFja1N0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk3MDdhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9QYWNrVW5wYWNrU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQGF1dGhvciBhbmllZmVyQGNhLmlibS5jb20KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWNrVW5wYWNrU3RlcCBleHRlbmRzIFBhY2tTdGVwIHsKLQlwcml2YXRlIFNldCBleGNsdXNpb25zID0gbnVsbDsKLQotCXB1YmxpYyBQYWNrVW5wYWNrU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMpIHsKLQkJc3VwZXIob3B0aW9ucyk7Ci0JCWV4Y2x1c2lvbnMgPSBVdGlscy5nZXRQYWNrRXhjbHVzaW9ucyhvcHRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgUGFja1VucGFja1N0ZXAoUHJvcGVydGllcyBvcHRpb25zLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJc3VwZXIob3B0aW9ucywgdmVyYm9zZSk7Ci0JCWV4Y2x1c2lvbnMgPSBVdGlscy5nZXRQYWNrRXhjbHVzaW9ucyhvcHRpb25zKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlY3Vyc2lvbkVmZmVjdChTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCWlmIChjYW5QYWNrKCkgJiYgZW50cnlOYW1lLmVuZHNXaXRoKCIuamFyIikgJiYgIWV4Y2x1c2lvbnMuY29udGFpbnMoZW50cnlOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZW50cnlOYW1lOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3IuUGFja1N0ZXAjcG9zdFByb2Nlc3MoamF2YS5pby5GaWxlLCBqYXZhLmlvLkZpbGUsIGphdmEudXRpbC5MaW5rZWRMaXN0KQotCSAqLwotCXB1YmxpYyBGaWxlIHBvc3RQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7Ci0JCWlmIChjYW5QYWNrKCkgJiYgcGFja0NvbW1hbmQgIT0gbnVsbCAmJiBpbnB1dCAhPSBudWxsKSB7Ci0JCQlQcm9wZXJ0aWVzIGluZiA9IFV0aWxzLmdldEVjbGlwc2VJbmYoaW5wdXQsIHZlcmJvc2UpOwotCQkJaWYgKCFzaG91bGRQYWNrKGlucHV0LCBjb250YWluZXJzLCBpbmYpKQotCQkJCXJldHVybiBudWxsOwotCQkJRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKHdvcmtpbmdEaXJlY3RvcnksICJ0ZW1wXyIgKyBpbnB1dC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCVN0cmluZ1tdIHRtcCA9IGdldENvbW1hbmQoaW5wdXQsIHRlbXBGaWxlLCBpbmYsIGNvbnRhaW5lcnMpOwotCQkJCVN0cmluZ1tdIGNtZCA9IG5ldyBTdHJpbmdbdG1wLmxlbmd0aCArIDFdOwotCQkJCWNtZFswXSA9IHRtcFswXTsKLQkJCQljbWRbMV0gPSAiLXIiOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLmFycmF5Y29weSh0bXAsIDEsIGNtZCwgMiwgdG1wLmxlbmd0aCAtIDEpOwotCi0JCQkJaW50IHJlc3VsdCA9IGV4ZWN1dGUoY21kLCB2ZXJib3NlKTsKLQkJCQlpZiAocmVzdWx0ID09IDAgJiYgdGVtcEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJRmlsZSBmaW5hbEZpbGUgPSBuZXcgRmlsZSh3b3JraW5nRGlyZWN0b3J5LCBpbnB1dC5nZXROYW1lKCkpOwotCQkJCQlpZiAoZmluYWxGaWxlLmV4aXN0cygpKQotCQkJCQkJZmluYWxGaWxlLmRlbGV0ZSgpOwotCQkJCQl0ZW1wRmlsZS5yZW5hbWVUbyhmaW5hbEZpbGUpOwotCQkJCQlyZXR1cm4gZmluYWxGaWxlOwotCQkJCX0gZWxzZSBpZiAodmVyYm9zZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yOiAiICsgcmVzdWx0ICsgIiB3YXMgcmV0dXJuZWQgZnJvbSBjb21tYW5kOiAiICsgVXRpbHMuY29uY2F0KGNtZCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKHZlcmJvc2UpCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmludGVybmFsLmphcnByb2Nlc3Nvci5QYWNrU3RlcCNwcmVQcm9jZXNzKGphdmEuaW8uRmlsZSwgamF2YS5pby5GaWxlLCBqYXZhLnV0aWwuTGlua2VkTGlzdCkKLQkgKi8KLQlwdWJsaWMgRmlsZSBwcmVQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RlcE5hbWUoKSB7Ci0JCXJldHVybiAiUmVwYWNrIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1NpZ25Db21tYW5kU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvU2lnbkNvbW1hbmRTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NDg4MDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvU2lnbkNvbW1hbmRTdGVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5qYXJwcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFNpZ25Db21tYW5kU3RlcCBleHRlbmRzIENvbW1hbmRTdGVwIHsKLQlwcml2YXRlIFNldCBleGNsdXNpb25zID0gbnVsbDsKLQotCXB1YmxpYyBTaWduQ29tbWFuZFN0ZXAoUHJvcGVydGllcyBvcHRpb25zLCBTdHJpbmcgY29tbWFuZCkgewotCQlzdXBlcihvcHRpb25zLCBjb21tYW5kLCAiLmphciIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlleGNsdXNpb25zID0gVXRpbHMuZ2V0U2lnbkV4Y2x1c2lvbnMob3B0aW9ucyk7Ci0JfQotCi0JcHVibGljIFNpZ25Db21tYW5kU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMsIFN0cmluZyBjb21tYW5kLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJc3VwZXIob3B0aW9ucywgY29tbWFuZCwgIi5qYXIiLCB2ZXJib3NlKTsgLy8kTk9OLU5MUy0xJAotCQlleGNsdXNpb25zID0gVXRpbHMuZ2V0U2lnbkV4Y2x1c2lvbnMob3B0aW9ucyk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmphcnByb2Nlc3Nvci5JUHJvY2Vzc1N0ZXAjcmVjdXJzaW9uRWZmZWN0KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyByZWN1cnNpb25FZmZlY3QoU3RyaW5nIGVudHJ5TmFtZSkgewotCQlpZiAoZW50cnlOYW1lLmVuZHNXaXRoKGV4dGVuc2lvbikgJiYgIWV4Y2x1c2lvbnMuY29udGFpbnMoZW50cnlOYW1lKSkKLQkJCXJldHVybiBlbnRyeU5hbWU7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5qYXJwcm9jZXNzb3IuSVByb2Nlc3NTdGVwI3ByZVByb2Nlc3MoamF2YS5pby5GaWxlLCBqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIEZpbGUgcHJlUHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIExpc3QgY29udGFpbmVycykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuamFycHJvY2Vzc29yLklQcm9jZXNzU3RlcCNwb3N0UHJvY2VzcyhqYXZhLmlvLkZpbGUsIGphdmEuaW8uRmlsZSkKLQkgKi8KLQlwdWJsaWMgRmlsZSBwb3N0UHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIExpc3QgY29udGFpbmVycykgewotCQlpZiAoY29tbWFuZCAhPSBudWxsICYmIGlucHV0ICE9IG51bGwgJiYgc2hvdWxkU2lnbihpbnB1dCwgY29udGFpbmVycykpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nW10gY21kID0gbmV3IFN0cmluZ1tdIHtjb21tYW5kLCBpbnB1dC5nZXRDYW5vbmljYWxQYXRoKCl9OwotCQkJCWludCByZXN1bHQgPSBleGVjdXRlKGNtZCwgdmVyYm9zZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSAwKSB7Ci0JCQkJCXJldHVybiBpbnB1dDsKLQkJCQl9IGVsc2UgaWYgKHZlcmJvc2UpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogIiArIHJlc3VsdCArICIgd2FzIHJldHVybmVkIGZyb20gY29tbWFuZDogIiArIFV0aWxzLmNvbmNhdChjbWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWlmICh2ZXJib3NlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFNpZ24oRmlsZSBpbnB1dCwgTGlzdCBjb250YWluZXJzKSB7Ci0JCVByb3BlcnRpZXMgaW5mID0gbnVsbDsKLQotCQkvLzE6IEFyZSB3ZSBleGNsdWRlZCBmcm9tIHNpZ25pbmcgYnkgb3VyIHBhcmVudHM/Ci0JCS8vaW5uZXJtb3N0IGphciBpcyBmaXJzdCBvbiB0aGUgbGlzdCwgaXQgb3ZlcnJpZGVzIG91dGVyIGphcnMKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbnRhaW5lcnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJaW5mID0gKFByb3BlcnRpZXMpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpbmYuY29udGFpbnNLZXkoVXRpbHMuTUFSS19FWENMVURFX0NISUxEUkVOX1NJR04pKXsKLQkJCQlpZihCb29sZWFuLnZhbHVlT2YoaW5mLmdldFByb3BlcnR5KFV0aWxzLk1BUktfRVhDTFVERV9DSElMRFJFTl9TSUdOKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQkJaWYgKHZlcmJvc2UpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oaW5wdXQuZ2V0TmFtZSgpICsgImlzIGV4Y2x1ZGVkIGZyb20gc2lnbmluZyBieSBpdHMgY29udGFpbmVycy4iKTsgLy8kTk9OLU5MUy0xJCAKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCS8vMjogSXMgdGhpcyBqYXIgaXRzZWxmIG1hcmtlZCBhcyBleGNsdWRlPwotCQlpbmYgPSBVdGlscy5nZXRFY2xpcHNlSW5mKGlucHV0LCB2ZXJib3NlKTsKLQkJaWYgKGluZiAhPSBudWxsICYmIGluZi5jb250YWluc0tleShVdGlscy5NQVJLX0VYQ0xVREVfU0lHTikgJiYgQm9vbGVhbi52YWx1ZU9mKGluZi5nZXRQcm9wZXJ0eShVdGlscy5NQVJLX0VYQ0xVREVfU0lHTikpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlpZiAodmVyYm9zZSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2x1ZGluZyAiICsgaW5wdXQuZ2V0TmFtZSgpICsgIiBmcm9tIHNpZ25pbmcuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RlcE5hbWUoKSB7Ci0JCXJldHVybiAiU2lnbiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9TdHJlYW1Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1N0cmVhbVByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGFiODEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1N0cmVhbVByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLQotcHVibGljIGNsYXNzIFN0cmVhbVByb2Nlc3NvciBleHRlbmRzIFRocmVhZCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RERVJSID0gIlNUREVSUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVERPVVQgPSAiU1RET1VUIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgYm9vbGVhbiB2ZXJib3NlOwotCi0JcHVibGljIFN0cmVhbVByb2Nlc3NvcihJbnB1dFN0cmVhbSBpcywgU3RyaW5nIG5hbWUsIGJvb2xlYW4gdmVyYm9zZSkgewotCQl0aGlzLmlucHV0U3RyZWFtID0gaXM7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQl0cnkgewotCQkJSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJCUJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzcik7Ci0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCVN0cmluZyBzID0gYnIucmVhZExpbmUoKTsKLQkJCQlpZiAocyA9PSBudWxsKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAodmVyYm9zZSkgewotCQkJCQlpZiAoU1RERVJSLmVxdWFscyhuYW1lKSkKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbihuYW1lICsgIjogIiArIHMpOyAvLyROT04tTkxTLTEkCi0JCQkJCWVsc2UKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihuYW1lICsgIjogIiArIHMpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9VbnBhY2tTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9VbnBhY2tTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2Yzg0YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvVW5wYWNrU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIEBhdXRob3IgYW5pZWZlcgotICoKLSAqLwotcHVibGljIGNsYXNzIFVucGFja1N0ZXAgZXh0ZW5kcyBDb21tYW5kU3RlcCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5QQUNLRVJfUFJPUEVSVFkgPSAib3JnLmVjbGlwc2UudXBkYXRlLmphcnByb2Nlc3Nvci5VbnBhY2tlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBCb29sZWFuIGNhblVucGFjayA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVucGFja0NvbW1hbmQgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNhblVucGFjaygpIHsKLQkJaWYgKGNhblVucGFjayAhPSBudWxsKQotCQkJcmV0dXJuIGNhblVucGFjay5ib29sZWFuVmFsdWUoKTsKLQotCQlTdHJpbmdbXSBsb2NhdGlvbnMgPSBVdGlscy5nZXRQYWNrMjAwQ29tbWFuZHMoInVucGFjazIwMCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsb2NhdGlvbnMgPT0gbnVsbCkgewotCQkJY2FuVW5wYWNrID0gQm9vbGVhbi5GQUxTRTsKLQkJCXVucGFja0NvbW1hbmQgPSBudWxsOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaW50IHJlc3VsdDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChsb2NhdGlvbnNbaV0gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCXJlc3VsdCA9IGV4ZWN1dGUobmV3IFN0cmluZ1tdIHtsb2NhdGlvbnNbaV0sICItViJ9KTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJlc3VsdCA9PSAwKSB7Ci0JCQkJdW5wYWNrQ29tbWFuZCA9IGxvY2F0aW9uc1tpXTsKLQkJCQljYW5VbnBhY2sgPSBCb29sZWFuLlRSVUU7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQljYW5VbnBhY2sgPSBCb29sZWFuLkZBTFNFOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFVucGFja1N0ZXAoUHJvcGVydGllcyBvcHRpb25zKSB7Ci0JCXN1cGVyKG9wdGlvbnMsIG51bGwsIG51bGwsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgVW5wYWNrU3RlcChQcm9wZXJ0aWVzIG9wdGlvbnMsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlzdXBlcihvcHRpb25zLCBudWxsLCBudWxsLCB2ZXJib3NlKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuamFycHJvY2Vzc29yLklQcm9jZXNzU3RlcCNyZWN1cnNpb25FZmZlY3QoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlY3Vyc2lvbkVmZmVjdChTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCWlmIChjYW5VbnBhY2soKSAmJiBlbnRyeU5hbWUuZW5kc1dpdGgoVXRpbHMuUEFDS0VEX1NVRkZJWCkpIHsKLQkJCXJldHVybiBlbnRyeU5hbWUuc3Vic3RyaW5nKDAsIGVudHJ5TmFtZS5sZW5ndGgoKSAtIFV0aWxzLlBBQ0tFRF9TVUZGSVgubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5qYXJwcm9jZXNzb3IuSVByb2Nlc3NTdGVwI3ByZVByb2Nlc3MoamF2YS5pby5GaWxlLCBqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIEZpbGUgcHJlUHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIExpc3QgY29udGFpbmVycykgewotCQlpZiAoY2FuVW5wYWNrKCkgJiYgdW5wYWNrQ29tbWFuZCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLQkJCWlmIChuYW1lLmVuZHNXaXRoKFV0aWxzLlBBQ0tFRF9TVUZGSVgpKSB7Ci0JCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGVuZ3RoKCkgLSBVdGlscy5QQUNLRURfU1VGRklYLmxlbmd0aCgpKTsKLQotCQkJCUZpbGUgdW5wYWNrZWQgPSBuZXcgRmlsZSh3b3JraW5nRGlyZWN0b3J5LCBuYW1lKTsKLQkJCQlGaWxlIHBhcmVudCA9IHVucGFja2VkLmdldFBhcmVudEZpbGUoKTsKLQkJCQlpZiAoIXBhcmVudC5leGlzdHMoKSkKLQkJCQkJcGFyZW50Lm1rZGlycygpOwotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBvcHRpb25zID0gZ2V0T3B0aW9ucygpLmdldFByb3BlcnR5KGlucHV0LmdldE5hbWUoKSArICIudW5wYWNrLmFyZ3MiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdbXSBjbWQgPSBudWxsOwotCQkJCQlpZiAob3B0aW9ucyAhPSBudWxsKSB7Ci0JCQkJCQljbWQgPSBuZXcgU3RyaW5nW10ge3VucGFja0NvbW1hbmQsIG9wdGlvbnMsIGlucHV0LmdldENhbm9uaWNhbFBhdGgoKSwgdW5wYWNrZWQuZ2V0Q2Fub25pY2FsUGF0aCgpfTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWNtZCA9IG5ldyBTdHJpbmdbXSB7dW5wYWNrQ29tbWFuZCwgaW5wdXQuZ2V0Q2Fub25pY2FsUGF0aCgpLCB1bnBhY2tlZC5nZXRDYW5vbmljYWxQYXRoKCl9OwotCQkJCQl9Ci0JCQkJCWludCByZXN1bHQgPSBleGVjdXRlKGNtZCwgdmVyYm9zZSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCAmJiB2ZXJib3NlKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogIiArIHJlc3VsdCArICIgd2FzIHJldHVybmVkIGZyb20gY29tbWFuZDogIiArIFV0aWxzLmNvbmNhdChjbWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlyZXR1cm4gdW5wYWNrZWQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudXBkYXRlLmphcnByb2Nlc3Nvci5JUHJvY2Vzc1N0ZXAjcG9zdFByb2Nlc3MoamF2YS5pby5GaWxlLCBqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIEZpbGUgcG9zdFByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBMaXN0IGNvbnRhaW5lcnMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGVwTmFtZSgpIHsKLQkJcmV0dXJuICJVbnBhY2siOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZjIyYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5qYXJwcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5pbnRlcm5hbC5wcm92aXNpb25hbC5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci5KYXJQcm9jZXNzb3I7Ci0KLS8qKgotICogQGF1dGhvciBhbmllZmVyQGNhLmlibS5jb20KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlscyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS19GSUxFX05BTUUgPSAiTUVUQS1JTkYvZWNsaXBzZS5pbmYiOyAvLyROT04tTkxTLTEkCi0KLQkvKgotCSAqIFByb3BlcnRpZXMgZm91bmQgaW4gb3V0ZXIgcGFjay5wcm9wZXJ0aWVzIGZpbGUKLQkgKi8KLQkvL2NvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGphcnMgdG8gZXhjbHVkZSBmcm9tIHNpZ2luaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTl9FWENMVURFUyA9ICJzaWduLmV4Y2x1ZGVzIjsgLy8kTk9OLU5MUy0xJAotCS8vY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgamFycyB0byBleGxjbHVkZSBmcm9tIHBhY2tpbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLX0VYQ0xVREVTID0gInBhY2suZXhjbHVkZXMiOyAvLyROT04tTkxTLTEkCi0JLy9TdWZmaXggdXNlZCB3aGVuIHNwZWNpZnlpbmcgYXJndW1lbnRzIHRvIHVzZSB3aGVuIHJ1bm5pbmcgcGFjazIwMCBvbiBhIGphcgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tfQVJHU19TVUZGSVggPSAiLnBhY2suYXJncyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogUHJvcGVydGllcyBmb3VuZCBpbiBib3RoIHBhY2sucHJvcGVydGllcyBhbmQgZWNsaXBzZS5pbmYKLQkgKi8KLQkvLwlEZWZhdWx0IGFyZ3VtZW50cyB0byB1c2Ugd2hlbiBydW5uaW5nIHBhY2syMDAuCi0JLy8gQWZmZWN0cyBhbGwgamFycyB3aGVuIHNwZWNpZmllZCBpbiBwYWNrLnByb3BlcnRpZXMsIGFmZmVjdHMgY2hpbGRyZW4gd2hlbiBzcGVjaWZpZWQgaW4gZWNsaXBzZS5pbmYKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1BBQ0tfQVJHUyA9ICJwYWNrMjAwLmRlZmF1bHQuYXJncyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qCi0JICogUHJvcGVydGllcyBmb3VuZCBpbiBlY2xpcHNlLmluZiBmaWxlCi0JICovCi0JLy9UaGlzIGphciBoYXMgYmVlbiBjb25kaXRpb25lZCB3aXRoIHBhY2syMDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLX1BST1BFUlRZID0gInBhY2syMDAuY29uZGl0aW9uZWQiOyAvLyROT04tTkxTLTEkCi0JLy9FeGNsdWRlIHRoaXMgamFyIGZyb20gcHJvY2Vzc2luZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUktfRVhDTFVERSA9ICJqYXJwcm9jZXNzb3IuZXhjbHVkZSI7IC8vJE5PTi1OTFMtMSQKLQkvL0V4Y2x1ZGUgdGhpcyBqYXIgZnJvbSBwYWNrMjAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS19FWENMVURFX1BBQ0sgPSAiamFycHJvY2Vzc29yLmV4Y2x1ZGUucGFjayI7IC8vJE5PTi1OTFMtMSQKLQkvL0V4Y2x1ZGUgdGhpcyBqYXIgZnJvbSBzaWduaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS19FWENMVURFX1NJR04gPSAiamFycHJvY2Vzc29yLmV4Y2x1ZGUuc2lnbiI7IC8vJE5PTi1OTFMtMSQKLQkvL0V4Y2x1ZGUgdGhpcyBqYXIncyBjaGlsZHJlbiBmcm9tIHByb2Nlc3NpbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLX0VYQ0xVREVfQ0hJTERSRU4gPSAiamFycHJvY2Vzc29yLmV4Y2x1ZGUuY2hpbGRyZW4iOyAvLyROT04tTkxTLTEkCi0JLy9FeGNsdWRlIHRoaXMgamFyJ3MgY2hpbGRyZW4gZnJvbSBwYWNrMjAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSS19FWENMVURFX0NISUxEUkVOX1BBQ0sgPSAiamFycHJvY2Vzc29yLmV4Y2x1ZGUuY2hpbGRyZW4ucGFjayI7IC8vJE5PTi1OTFMtMSQKLQkvL0V4Y2x1ZGUgdGhpcyBqYXIncyBjaGlsZHJlbiBmcm9tIHNpZ25pbmcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLX0VYQ0xVREVfQ0hJTERSRU5fU0lHTiA9ICJqYXJwcm9jZXNzb3IuZXhjbHVkZS5jaGlsZHJlbi5zaWduIjsgLy8kTk9OLU5MUy0xJAotCS8vQXJndW1lbnRzIHVzZWQgaW4gcGFjazIwMCBmb3IgdGhpcyBqYXIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLX0FSR1MgPSAicGFjazIwMC5hcmdzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDSzIwMF9QUk9QRVJUWSA9ICJvcmcuZWNsaXBzZS51cGRhdGUuamFycHJvY2Vzc29yLnBhY2syMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlJFID0gIkBqcmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICJAcGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIkBub25lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0VEX1NVRkZJWCA9ICIucGFjay5neiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfU1VGRklYID0gIi5qYXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVGaWx0ZXIgSkFSX0ZJTFRFUiA9IG5ldyBGaWxlRmlsdGVyKCkgewotCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBwYXRobmFtZSkgewotCQkJcmV0dXJuIHBhdGhuYW1lLmlzRmlsZSgpICYmIHBhdGhuYW1lLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlRmlsdGVyIFBBQ0tfR1pfRklMVEVSID0gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0JCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7Ci0JCQlyZXR1cm4gcGF0aG5hbWUuaXNGaWxlKCkgJiYgcGF0aG5hbWUuZ2V0TmFtZSgpLmVuZHNXaXRoKEphclByb2Nlc3Nvci5QQUNLRURfU1VGRklYKTsKLQkJfQotCX07Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoT2JqZWN0IHN0cmVhbSkgewotCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHN0cmVhbSBpbnN0YW5jZW9mIElucHV0U3RyZWFtKQotCQkJCQkoKElucHV0U3RyZWFtKSBzdHJlYW0pLmNsb3NlKCk7Ci0JCQkJZWxzZSBpZiAoc3RyZWFtIGluc3RhbmNlb2YgT3V0cHV0U3RyZWFtKQotCQkJCQkoKE91dHB1dFN0cmVhbSkgc3RyZWFtKS5jbG9zZSgpOwotCQkJCWVsc2UgaWYgKHN0cmVhbSBpbnN0YW5jZW9mIEphckZpbGUpCi0JCQkJCSgoSmFyRmlsZSkgc3RyZWFtKS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIHNldCBvZiBjb21tYW5kcyB0byB0cnkgdG8gZXhlY3V0ZSBwYWNrL3VucGFjayAKLQkgKiBAcGFyYW0gY21kIHRoZSBjb21tYW5kLCBlaXRoZXIgInBhY2syMDAiIG9yICJ1bnBhY2syMDAiCi0JICogQHJldHVybiBTdHJpbmcgW10gb3IgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0UGFjazIwMENvbW1hbmRzKFN0cmluZyBjbWQpIHsKLQkJU3RyaW5nW10gbG9jYXRpb25zID0gbnVsbDsKLQkJU3RyaW5nIHByb3AgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoUEFDSzIwMF9QUk9QRVJUWSk7Ci0JCVN0cmluZyBqYXZhSG9tZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKE5PTkUuZXF1YWxzKHByb3ApKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBlbHNlIGlmIChKUkUuZXF1YWxzKHByb3ApKSB7Ci0JCQlsb2NhdGlvbnMgPSBuZXcgU3RyaW5nW10ge2phdmFIb21lICsgIi9iaW4vIiArIGNtZH07IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChQQVRILmVxdWFscyhwcm9wKSkgewotCQkJbG9jYXRpb25zID0gbmV3IFN0cmluZ1tdIHtjbWR9OwotCQl9IGVsc2UgaWYgKHByb3AgPT0gbnVsbCkgewotCQkJbG9jYXRpb25zID0gbmV3IFN0cmluZ1tdIHtqYXZhSG9tZSArICIvYmluLyIgKyBjbWQsIGNtZH07IC8vJE5PTi1OTFMtMSQgCi0JCX0gZWxzZSB7Ci0JCQlsb2NhdGlvbnMgPSBuZXcgU3RyaW5nW10ge3Byb3AgKyAiLyIgKyBjbWR9OyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGxvY2F0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBUcmFuc2ZlcnMgYWxsIGF2YWlsYWJsZSBieXRlcyBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gdG8gdGhlIGdpdmVuCi0JICogb3V0cHV0IHN0cmVhbS4gQ2xvc2VzIGJvdGggc3RyZWFtcyBpZiBjbG9zZSA9PSB0cnVlLCByZWdhcmRsZXNzIG9mIGZhaWx1cmUuIAotCSAqIEZsdXNoZXMgdGhlIGRlc3RpbmF0aW9uIHN0cmVhbSBpZiBjbG9zZSA9PSBmYWxzZQotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKiBAcGFyYW0gY2xvc2UgCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2ZlclN0cmVhbXMoSW5wdXRTdHJlYW0gc291cmNlLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24sIGJvb2xlYW4gY2xvc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXNvdXJjZSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvdXJjZSk7Ci0JCWRlc3RpbmF0aW9uID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uKTsKLQkJdHJ5IHsKLQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJaW50IGJ5dGVzUmVhZCA9IC0xOwotCQkJCWlmICgoYnl0ZXNSZWFkID0gc291cmNlLnJlYWQoYnVmZmVyKSkgPT0gLTEpCi0JCQkJCWJyZWFrOwotCQkJCWRlc3RpbmF0aW9uLndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChjbG9zZSkgewotCQkJCWNsb3NlKHNvdXJjZSk7Ci0JCQkJY2xvc2UoZGVzdGluYXRpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlkZXN0aW5hdGlvbi5mbHVzaCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyBhbGwgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBmcm9tIHRoZSBnaXZlbiByb290IGRvd24gKGluY2x1c2l2ZSkuCi0JICogUmV0dXJucyBmYWxzZSBpZiB3ZSBjb3VsZCBub3QgZGVsZXRlIHNvbWUgZmlsZSBvciBhbiBleGNlcHRpb24gb2NjdXJyZWQKLQkgKiBhdCBhbnkgcG9pbnQgaW4gdGhlIGRlbGV0aW9uLgotCSAqIEV2ZW4gaWYgYW4gZXhjZXB0aW9uIG9jY3VycywgYSBiZXN0IGVmZm9ydCBpcyBtYWRlIHRvIGNvbnRpbnVlIGRlbGV0aW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjbGVhcihqYXZhLmlvLkZpbGUgcm9vdCkgewotCQlib29sZWFuIHJlc3VsdCA9IGNsZWFyQ2hpbGRyZW4ocm9vdCk7Ci0JCXRyeSB7Ci0JCQlpZiAocm9vdC5leGlzdHMoKSkKLQkJCQlyZXN1bHQgJj0gcm9vdC5kZWxldGUoKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlcyBhbGwgdGhlIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBmcm9tIHRoZSBnaXZlbiByb290IGRvd24sIGV4Y2VwdCBmb3IgCi0JICogdGhlIHJvb3QgaXRzZWxmLgotCSAqIFJldHVybnMgZmFsc2UgaWYgd2UgY291bGQgbm90IGRlbGV0ZSBzb21lIGZpbGUgb3IgYW4gZXhjZXB0aW9uIG9jY3VycmVkCi0JICogYXQgYW55IHBvaW50IGluIHRoZSBkZWxldGlvbi4KLQkgKiBFdmVuIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMsIGEgYmVzdCBlZmZvcnQgaXMgbWFkZSB0byBjb250aW51ZSBkZWxldGluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xlYXJDaGlsZHJlbihqYXZhLmlvLkZpbGUgcm9vdCkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWlmIChyb290LmlzRGlyZWN0b3J5KCkpIHsKLQkJCVN0cmluZ1tdIGxpc3QgPSByb290Lmxpc3QoKTsKLQkJCS8vIGZvciBzb21lIHVua25vd24gcmVhc29uLCBsaXN0KCkgY2FuIHJldHVybiBudWxsLiAgCi0JCQkvLyBKdXN0IHNraXAgdGhlIGNoaWxkcmVuIElmIGl0IGRvZXMuCi0JCQlpZiAobGlzdCAhPSBudWxsKQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCQkJcmVzdWx0ICY9IGNsZWFyKG5ldyBqYXZhLmlvLkZpbGUocm9vdCwgbGlzdFtpXSkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTZXQgZ2V0UGFja0V4Y2x1c2lvbnMoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCi0JCVN0cmluZyBwYWNrRXhjbHVkZXMgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFBBQ0tfRVhDTFVERVMpOwotCQlpZiAocGFja0V4Y2x1ZGVzICE9IG51bGwpIHsKLQkJCVN0cmluZ1tdIGV4Y2x1ZGVzID0gdG9TdHJpbmdBcnJheShwYWNrRXhjbHVkZXMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCVNldCBwYWNrRXhjbHVzaW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGV4Y2x1ZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJcGFja0V4Y2x1c2lvbnMuYWRkKGV4Y2x1ZGVzW2ldKTsKLQkJCX0KLQkJCXJldHVybiBwYWNrRXhjbHVzaW9uczsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfU0VUOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2V0IGdldFNpZ25FeGNsdXNpb25zKFByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlpZiAocHJvcGVydGllcyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX1NFVDsKLQkJU3RyaW5nIHNpZ25FeGNsdWRlcyA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoU0lHTl9FWENMVURFUyk7Ci0JCWlmIChzaWduRXhjbHVkZXMgIT0gbnVsbCkgewotCQkJU3RyaW5nW10gZXhjbHVkZXMgPSB0b1N0cmluZ0FycmF5KHNpZ25FeGNsdWRlcywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU2V0IHNpZ25FeGNsdXNpb25zID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXhjbHVkZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzaWduRXhjbHVzaW9ucy5hZGQoZXhjbHVkZXNbaV0pOwotCQkJfQotCQkJcmV0dXJuIHNpZ25FeGNsdXNpb25zOwotCQl9Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29uY2F0KFN0cmluZ1tdIGFycmF5KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpID4gMCkKLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlidWZmZXIuYXBwZW5kKGFycmF5W2ldKTsKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSB0b1N0cmluZ0FycmF5KFN0cmluZyBpbnB1dCwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbnB1dCwgc2VwYXJhdG9yKTsKLQkJaW50IGNvdW50ID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCVN0cmluZ1tdIHJlc3VsdCA9IG5ldyBTdHJpbmdbY291bnRdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCXJlc3VsdFtpXSA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByb3BlcnRpZXMgZnJvbSB0aGUgZWNsaXBzZS5pbmYgZmlsZSBmcm9tIHRoZSBnaXZlbiBqYXIuICBJZiB0aGUgZmlsZSBpcyBub3QgYSBqYXIsIG51bGwgaXMgcmV0dXJuZWQuCi0JICogSWYgdGhlIGZpbGUgaXMgYSBqYXIsIGJ1dCBkb2VzIG5vdCBjb250YWluIGFuIGVjbGlwc2UuaW5mIGZpbGUsIGFuIGVtcHR5IFByb3BlcnRpZXMgb2JqZWN0IGlzIHJldHVybmVkLgotCSAqIEBwYXJhbSBqYXJGaWxlCi0JICogQHJldHVybiBUaGUgZWNsaXBzZS5pbmYgcHJvcGVydGllcyBmb3IgdGhlIGdpdmVuIGphciBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGdldEVjbGlwc2VJbmYoRmlsZSBqYXJGaWxlLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJaWYgKGphckZpbGUgPT0gbnVsbCB8fCAhamFyRmlsZS5leGlzdHMoKSkgewotCQkJaWYgKHZlcmJvc2UpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGYWlsZWQgdG8gb2J0YWluIGVjbGlwc2UuaW5mIGR1ZSB0byBtaXNzaW5nIGphciBmaWxlOiAiICsgamFyRmlsZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUphckZpbGUgamFyID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphciA9IG5ldyBKYXJGaWxlKGphckZpbGUsIGZhbHNlKTsKLQkJfSBjYXRjaCAoWmlwRXhjZXB0aW9uIGUpIHsKLQkJCS8vbm90IGEgamFyLCBkb24ndCBib3RoZXIgbG9nZ2luZyB0aGlzLgotCQkJcmV0dXJuIG51bGw7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWlmICh2ZXJib3NlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGYWlsZWQgdG8gb2J0YWluIGVjbGlwc2UuaW5mIGR1ZSB0byBJT0V4Y2VwdGlvbjogIiArIGphckZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXRyeSB7Ci0JCQlKYXJFbnRyeSBtYXJrID0gamFyLmdldEphckVudHJ5KE1BUktfRklMRV9OQU1FKTsKLQkJCWlmIChtYXJrICE9IG51bGwpIHsKLQkJCQlJbnB1dFN0cmVhbSBpbiA9IGphci5nZXRJbnB1dFN0cmVhbShtYXJrKTsKLQkJCQlQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQlwcm9wcy5sb2FkKGluKTsKLQkJCQlpbi5jbG9zZSgpOwotCQkJCXJldHVybiBwcm9wczsKLQkJCX0KLQkJCXJldHVybiBuZXcgUHJvcGVydGllcygpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAodmVyYm9zZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmFpbGVkIHRvIG9idGFpbiBlY2xpcHNlLmluZiBkdWUgdG8gSU9FeGNlcHRpb246ICIgKyBqYXJGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCWNsb3NlKGphcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2hvdWxkU2tpcEphcihGaWxlIGlucHV0LCBib29sZWFuIHByb2Nlc3NBbGwsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlQcm9wZXJ0aWVzIGluZiA9IGdldEVjbGlwc2VJbmYoaW5wdXQsIHZlcmJvc2UpOwotCQlpZiAoaW5mID09IG51bGwpIHsKLQkJCS8vbm90IGEgamFyLCBjb3VsZCBiZSBhIHBhY2suZ3oKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgZXhjbHVkZSA9IGluZi5nZXRQcm9wZXJ0eShNQVJLX0VYQ0xVREUpOwotCi0JCS8vd2FzIG1hcmtlZCBhcyBleGNsdWRlLCB3ZSBzaG91bGQgc2tpcAotCQlpZiAoZXhjbHVkZSAhPSBudWxsICYmIEJvb2xlYW4udmFsdWVPZihleGNsdWRlKS5ib29sZWFuVmFsdWUoKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vcHJvY2VzcyBhbGwgd2FzIHNldCwgZG9uJ3Qgc2tpcAotCQlpZiAocHJvY2Vzc0FsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvL290aGVyd2lzZSwgd2Ugc2tpcCBpZiBub3QgbWFya2VkIG1hcmtlZAotCQlTdHJpbmcgbWFya2VkID0gaW5mLmdldFByb3BlcnR5KE1BUktfUFJPUEVSVFkpOwotCQlyZXR1cm4gIUJvb2xlYW4udmFsdWVPZihtYXJrZWQpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIFN0b3JlcyB0aGUgZ2l2ZW4gcHJvcGVydGllcyBpbiB0aGUgb3V0cHV0IHN0cmVhbS4gIFdlIHN0b3JlIHRoZSBwcm9wZXJ0aWVzIAotCSAqIGluIHNvcnRlZCBvcmRlciBzbyB0aGF0IHRoZSBzaWduaW5nIGhhc2ggZG9lc24ndCBjaGFuZ2UgaWYgdGhlIHByb3BlcnRpZXMgZGlkbid0IGNoYW5nZS4gCi0JICogQHBhcmFtIHByb3BzCi0JICogQHBhcmFtIHN0cmVhbQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdG9yZVByb3BlcnRpZXMoUHJvcGVydGllcyBwcm9wcywgT3V0cHV0U3RyZWFtIHN0cmVhbSkgewotCQlQcmludFN0cmVhbSBwcmludFN0cmVhbSA9IG5ldyBQcmludFN0cmVhbShzdHJlYW0pOwotCQlwcmludFN0cmVhbS5wcmludCgiI1Byb2Nlc3NlZCB1c2luZyBKYXJwcm9jZXNzb3JcbiIpOyAvLyROT04tTkxTLTEkCi0JCVNvcnRlZE1hcCBzb3J0ZWQgPSBuZXcgVHJlZU1hcChwcm9wcyk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNvcnRlZC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCXByaW50U3RyZWFtLnByaW50KGtleSk7Ci0JCQlwcmludFN0cmVhbS5wcmludCgiID0gIik7IC8vJE5PTi1OTFMtMSQKLQkJCXByaW50U3RyZWFtLnByaW50KHNvcnRlZC5nZXQoa2V5KSk7Ci0JCQlwcmludFN0cmVhbS5wcmludCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQkJcHJpbnRTdHJlYW0uZmx1c2goKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci9aaXBQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1ppcFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmExY2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL1ppcFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IuSVByb2Nlc3NTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yLkphclByb2Nlc3NvcjsKLQotLyoqCi0gKiBAYXV0aG9yIGFuaWVmZXJAY2EuaWJtLmNvbQotICoKLSAqLwotcHVibGljIGNsYXNzIFppcFByb2Nlc3NvciB7Ci0KLQlwcml2YXRlIElQcm9jZXNzU3RlcCBzaWduU3RlcCA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvY2Vzc1N0ZXAgcGFja1N0ZXAgPSBudWxsOwotCXByaXZhdGUgSVByb2Nlc3NTdGVwIHBhY2tVbnBhY2tTdGVwID0gbnVsbDsKLQlwcml2YXRlIElQcm9jZXNzU3RlcCB1bnBhY2tTdGVwID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnkgPSBudWxsOwotCXByaXZhdGUgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbnVsbDsKLQlwcml2YXRlIFNldCBwYWNrRXhjbHVzaW9ucyA9IG51bGw7Ci0JcHJpdmF0ZSBTZXQgc2lnbkV4Y2x1c2lvbnMgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGNvbW1hbmQgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBwYWNraW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHNpZ25pbmcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gcmVwYWNraW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHVucGFja2luZyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiB2ZXJib3NlID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NBbGwgPSBmYWxzZTsKLQotCXB1YmxpYyB2b2lkIHNldFdvcmtpbmdEaXJlY3RvcnkoU3RyaW5nIGRpcikgewotCQl3b3JraW5nRGlyZWN0b3J5ID0gZGlyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V29ya2luZ0RpcmVjdG9yeSgpIHsKLQkJaWYgKHdvcmtpbmdEaXJlY3RvcnkgPT0gbnVsbCkKLQkJCXdvcmtpbmdEaXJlY3RvcnkgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHdvcmtpbmdEaXJlY3Rvcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2lnbkNvbW1hbmQoU3RyaW5nIGNvbW1hbmQpIHsKLQkJdGhpcy5jb21tYW5kID0gY29tbWFuZDsKLQkJdGhpcy5zaWduaW5nID0gKGNvbW1hbmQgIT0gbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFjayhib29sZWFuIHBhY2spIHsKLQkJdGhpcy5wYWNraW5nID0gcGFjazsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXBhY2soYm9vbGVhbiByZXBhY2spIHsKLQkJdGhpcy5yZXBhY2tpbmcgPSByZXBhY2s7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VW5wYWNrKGJvb2xlYW4gdW5wYWNrKSB7Ci0JCXRoaXMudW5wYWNraW5nID0gdW5wYWNrOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcmJvc2UoYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCXRoaXMudmVyYm9zZSA9IHZlcmJvc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvY2Vzc0FsbChib29sZWFuIGFsbCkgewotCQl0aGlzLnByb2Nlc3NBbGwgPSBhbGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvY2Vzc1ppcChGaWxlIHppcEZpbGUpIHRocm93cyBaaXBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKHZlcmJvc2UpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmcgIiArIHppcEZpbGUuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQlaaXBGaWxlIHppcCA9IG5ldyBaaXBGaWxlKHppcEZpbGUpOwotCQlpbml0aWFsaXplKHppcCk7Ci0KLQkJU3RyaW5nIGV4dGVuc2lvbiA9IHVucGFja2luZyA/ICJwYWNrLmd6IiA6ICIuamFyIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUZpbGUgdGVtcERpciA9IG5ldyBGaWxlKGdldFdvcmtpbmdEaXJlY3RvcnkoKSwgInRlbXBfIiArIHppcEZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlKYXJQcm9jZXNzb3IgcHJvY2Vzc29yID0gbmV3IEphclByb2Nlc3NvcigpOwotCQlwcm9jZXNzb3Iuc2V0VmVyYm9zZSh2ZXJib3NlKTsKLQkJcHJvY2Vzc29yLnNldFByb2Nlc3NBbGwocHJvY2Vzc0FsbCk7Ci0JCXByb2Nlc3Nvci5zZXRXb3JraW5nRGlyZWN0b3J5KHRlbXBEaXIuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQkJaWYgKHVucGFja2luZykgewotCQkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKHVucGFja1N0ZXApOwotCQl9Ci0KLQkJRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoZ2V0V29ya2luZ0RpcmVjdG9yeSgpLCB6aXBGaWxlLmdldE5hbWUoKSArICIudGVtcCIpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgcGFyZW50ID0gb3V0cHV0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0JCWlmICghcGFyZW50LmV4aXN0cygpKQotCQkJcGFyZW50Lm1rZGlycygpOwotCQlaaXBPdXRwdXRTdHJlYW0gemlwT3V0ID0gbmV3IFppcE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlKSk7Ci0JCUVudW1lcmF0aW9uIGVudHJpZXMgPSB6aXAuZW50cmllcygpOwotCQlpZiAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJZm9yIChaaXBFbnRyeSBlbnRyeSA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOyBlbnRyeSAhPSBudWxsOyBlbnRyeSA9IGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkgPyAoWmlwRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKSA6IG51bGwpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGVudHJ5LmdldE5hbWUoKTsKLQotCQkJCUlucHV0U3RyZWFtIGVudHJ5U3RyZWFtID0gemlwLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQotCQkJCWJvb2xlYW4gcGFjayA9IHBhY2tpbmcgJiYgIXBhY2tFeGNsdXNpb25zLmNvbnRhaW5zKG5hbWUpOwotCQkJCWJvb2xlYW4gc2lnbiA9IHNpZ25pbmcgJiYgIXNpZ25FeGNsdXNpb25zLmNvbnRhaW5zKG5hbWUpOwotCQkJCWJvb2xlYW4gcmVwYWNrID0gcmVwYWNraW5nICYmICFwYWNrRXhjbHVzaW9ucy5jb250YWlucyhuYW1lKTsKLQotCQkJCUZpbGUgZXh0cmFjdGVkRmlsZSA9IG51bGw7Ci0KLQkJCQlpZiAoZW50cnkuZ2V0TmFtZSgpLmVuZHNXaXRoKGV4dGVuc2lvbikgJiYgKHBhY2sgfHwgc2lnbiB8fCByZXBhY2sgfHwgdW5wYWNraW5nKSkgewotCQkJCQlleHRyYWN0ZWRGaWxlID0gbmV3IEZpbGUodGVtcERpciwgbmFtZSk7Ci0JCQkJCXBhcmVudCA9IGV4dHJhY3RlZEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQlpZiAoIXBhcmVudC5leGlzdHMoKSkKLQkJCQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJCQkJaWYgKHZlcmJvc2UpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkV4dHJhY3RpbmcgIiArIGVudHJ5LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJRmlsZU91dHB1dFN0cmVhbSBleHRyYWN0ZWQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShleHRyYWN0ZWRGaWxlKTsKLQkJCQkJVXRpbHMudHJhbnNmZXJTdHJlYW1zKGVudHJ5U3RyZWFtLCBleHRyYWN0ZWQsIHRydWUpOyAvLyB0aGlzIHdpbGwgY2xvc2UgdGhlIHN0cmVhbQotCQkJCQllbnRyeVN0cmVhbSA9IG51bGw7Ci0KLQkJCQkJYm9vbGVhbiBza2lwID0gVXRpbHMuc2hvdWxkU2tpcEphcihleHRyYWN0ZWRGaWxlLCBwcm9jZXNzQWxsLCB2ZXJib3NlKTsKLQkJCQkJaWYgKHNraXApIHsKLQkJCQkJCS8vc2tpcHBpbmcgdGhpcyBmaWxlIAotCQkJCQkJZW50cnlTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGV4dHJhY3RlZEZpbGUpOwotCQkJCQkJaWYgKHZlcmJvc2UpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGVudHJ5LmdldE5hbWUoKSArICIgaXMgbm90IG1hcmtlZCwgc2tpcHBpbmcuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWlmICh1bnBhY2tpbmcpIHsKLQkJCQkJCQlGaWxlIHJlc3VsdCA9IHByb2Nlc3Nvci5wcm9jZXNzSmFyKGV4dHJhY3RlZEZpbGUpOwotCQkJCQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gZXh0cmFjdGVkRmlsZS5nZXROYW1lKCkubGVuZ3RoKCkpICsgcmVzdWx0LmdldE5hbWUoKTsKLQkJCQkJCQlleHRyYWN0ZWRGaWxlID0gcmVzdWx0OwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpZiAocmVwYWNrIHx8IHNpZ24pIHsKLQkJCQkJCQkJcHJvY2Vzc29yLmNsZWFyUHJvY2Vzc1N0ZXBzKCk7Ci0JCQkJCQkJCWlmIChyZXBhY2spCi0JCQkJCQkJCQlwcm9jZXNzb3IuYWRkUHJvY2Vzc1N0ZXAocGFja1VucGFja1N0ZXApOwotCQkJCQkJCQlpZiAoc2lnbikKLQkJCQkJCQkJCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChzaWduU3RlcCk7Ci0JCQkJCQkJCWV4dHJhY3RlZEZpbGUgPSBwcm9jZXNzb3IucHJvY2Vzc0phcihleHRyYWN0ZWRGaWxlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKHBhY2spIHsKLQkJCQkJCQkJcHJvY2Vzc29yLmNsZWFyUHJvY2Vzc1N0ZXBzKCk7Ci0JCQkJCQkJCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChwYWNrU3RlcCk7Ci0JCQkJCQkJCUZpbGUgbW9kaWZpZWRGaWxlID0gcHJvY2Vzc29yLnByb2Nlc3NKYXIoZXh0cmFjdGVkRmlsZSk7Ci0JCQkJCQkJCWlmIChtb2RpZmllZEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJU3RyaW5nIG5ld05hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmxlbmd0aCgpIC0gZXh0cmFjdGVkRmlsZS5nZXROYW1lKCkubGVuZ3RoKCkpICsgbW9kaWZpZWRGaWxlLmdldE5hbWUoKTsKLQkJCQkJCQkJCQlpZiAodmVyYm9zZSkgewotCQkJCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyAiICsgbmV3TmFtZSArICIgdG8gIiArIG91dHB1dEZpbGUuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlaaXBFbnRyeSB6aXBFbnRyeSA9IG5ldyBaaXBFbnRyeShuZXdOYW1lKTsKLQkJCQkJCQkJCQllbnRyeVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obW9kaWZpZWRGaWxlKTsKLQkJCQkJCQkJCQl6aXBPdXQucHV0TmV4dEVudHJ5KHppcEVudHJ5KTsKLQkJCQkJCQkJCQlVdGlscy50cmFuc2ZlclN0cmVhbXMoZW50cnlTdHJlYW0sIHppcE91dCwgZmFsc2UpOyAvL3dlIHdhbnQgdG8ga2VlcCB6aXBPdXQgb3BlbgotCQkJCQkJCQkJCWVudHJ5U3RyZWFtLmNsb3NlKCk7Ci0JCQkJCQkJCQkJVXRpbHMuY2xlYXIobW9kaWZpZWRGaWxlKTsKLQkJCQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQlVdGlscy5jbG9zZShlbnRyeVN0cmVhbSk7Ci0JCQkJCQkJCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBQcm9ibGVtIHJlYWRpbmcgIiArIG1vZGlmaWVkRmlsZS5nZXRQYXRoKCkgKyAiLiIpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVudHJ5U3RyZWFtID0gbnVsbDsKLQkJCQkJCQkJfSBlbHNlIGlmICh2ZXJib3NlKSB7Ci0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhcm5pbmc6ICIgKyBtb2RpZmllZEZpbGUuZ2V0UGF0aCgpICsgIiBub3QgZm91bmQuIik7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZXh0cmFjdGVkRmlsZS5leGlzdHMoKSkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWVudHJ5U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShleHRyYWN0ZWRGaWxlKTsKLQkJCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWlmICh2ZXJib3NlKSB7Ci0JCQkJCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBQcm9ibGVtIHJlYWRpbmcgIiArIGV4dHJhY3RlZEZpbGUuZ2V0UGF0aCgpICsgIi4iKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKHZlcmJvc2UgJiYgZW50cnlTdHJlYW0gIT0gbnVsbCkgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nICIgKyBuYW1lICsgIiB0byAiICsgb3V0cHV0RmlsZS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZW50cnlTdHJlYW0gIT0gbnVsbCkgewotCQkJCQlaaXBFbnRyeSBuZXdFbnRyeSA9IG5ldyBaaXBFbnRyeShuYW1lKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCXppcE91dC5wdXROZXh0RW50cnkobmV3RW50cnkpOwotCQkJCQkJVXRpbHMudHJhbnNmZXJTdHJlYW1zKGVudHJ5U3RyZWFtLCB6aXBPdXQsIGZhbHNlKTsKLQkJCQkJCXppcE91dC5jbG9zZUVudHJ5KCk7Ci0JCQkJCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlpZih2ZXJib3NlKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiAiICsgbmFtZSArICIgYWxyZWFkeSBleGlzdHMgaW4gIiArIG91dHB1dEZpbGUuZ2V0TmFtZSgpICsgIi4gIFNraXBwaW5nLiIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVudHJ5U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCi0JCQkJaWYgKGV4dHJhY3RlZEZpbGUgIT0gbnVsbCkKLQkJCQkJVXRpbHMuY2xlYXIoZXh0cmFjdGVkRmlsZSk7Ci0JCQkJCi0JCQkJaWYgKHZlcmJvc2UpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZyAiICsgemlwRmlsZS5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JCXppcE91dC5jbG9zZSgpOwotCQl6aXAuY2xvc2UoKTsKLQotCQlGaWxlIGZpbmFsRmlsZSA9IG5ldyBGaWxlKGdldFdvcmtpbmdEaXJlY3RvcnkoKSwgemlwRmlsZS5nZXROYW1lKCkpOwotCQlpZiAoZmluYWxGaWxlLmV4aXN0cygpKQotCQkJZmluYWxGaWxlLmRlbGV0ZSgpOwotCQlvdXRwdXRGaWxlLnJlbmFtZVRvKGZpbmFsRmlsZSk7Ci0JCVV0aWxzLmNsZWFyKHRlbXBEaXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKFppcEZpbGUgemlwKSB7Ci0JCVppcEVudHJ5IGVudHJ5ID0gemlwLmdldEVudHJ5KCJwYWNrLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCUlucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXN0cmVhbSA9IHppcC5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JCQkJcHJvcGVydGllcy5sb2FkKHN0cmVhbSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKHZlcmJvc2UpCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCVV0aWxzLmNsb3NlKHN0cmVhbSk7Ci0JCQl9Ci0JCX0KLQotCQlwYWNrRXhjbHVzaW9ucyA9IFV0aWxzLmdldFBhY2tFeGNsdXNpb25zKHByb3BlcnRpZXMpOwotCQlzaWduRXhjbHVzaW9ucyA9IFV0aWxzLmdldFNpZ25FeGNsdXNpb25zKHByb3BlcnRpZXMpOwotCi0JCXBhY2tVbnBhY2tTdGVwID0gbmV3IFBhY2tVbnBhY2tTdGVwKHByb3BlcnRpZXMsIHZlcmJvc2UpOwotCQlwYWNrU3RlcCA9IG5ldyBQYWNrU3RlcChwcm9wZXJ0aWVzLCB2ZXJib3NlKTsKLQkJc2lnblN0ZXAgPSBuZXcgU2lnbkNvbW1hbmRTdGVwKHByb3BlcnRpZXMsIGNvbW1hbmQsIHZlcmJvc2UpOwotCQl1bnBhY2tTdGVwID0gbmV3IFVucGFja1N0ZXAocHJvcGVydGllcywgdmVyYm9zZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvcGFjay1yZWFkbWUuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvamFycHJvY2Vzc29yL3BhY2stcmVhZG1lLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNWZlNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvcGFjay1yZWFkbWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLSAgPHRpdGxlPkVjbGlwc2UgdXBkYXRlIHBhY2tpbmcgdG9vbCByZWFkbWU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+RWNsaXBzZSB1cGRhdGUgcGFja2luZyB0b29sPC9oMT4KLQotPGgzPk92ZXJ2aWV3PC9oMz4KLVRoZSB1cGRhdGUgcGFja2luZyB0b29sIHByb2Nlc3NlcyBhIGhpZXJhcmNoeSBvZiBhcmJpdHJhcmlseSBuZXN0ZWQKLUpBUnMgYW5kIFpJUCBmaWxlcy4gIEl0IGlzIGEgZ2VuZXJpYyB1dGlsaXR5IHRoYXQgcGVyZm9ybXMgYSBkZXB0aCBmaXJzdCB0cmF2ZXJzYWwgb2YgCi1hIG5lc3RlZCBoaWVyYXJjaHkgb2YgWklQcyBhbmQgSkFScywgcGVyZm9ybXMgdmFyaW91cyBjb21tYW5kcyBvbgotZWFjaCBvZiB0aGUgSkFScyBpbiB0aGUgaGllcmFyY2h5LCBhbmQgdGhlbiByZWJ1aWxkcyB0aGUgc2FtZSBoaWVyYXJjaHkKLW9mIFpJUHMgYW5kIEpBUnMgYWdhaW4uICBDdXJyZW50bHkgaXRzIG1haW4gZnVuY3Rpb25zIGFyZToKLTx1bD4KLQk8bGk+UGFja2luZyBKQVJzIHVzaW5nIHRoZSBKYXZhIDEuNSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy90b29sZG9jcy9zaGFyZS9wYWNrMjAwLmh0bWwiPnBhY2syMDA8L2E+Ci0JIGNvbW1hbmQuPC9saT4KLQkgPGxpPlVucGFja2luZyBQQUNLLkdacyB1c2luZyB0aGUgSmF2YSAxLjUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlLzEuNS4wL2RvY3MvdG9vbGRvY3Mvc2hhcmUvdW5wYWNrMjAwLmh0bWwiPnVucGFjazIwMDwvYT4KLQkgY29tbWFuZC48L2xpPgotCSA8bGk+Tm9ybWFsaXppbmcgSkFScyBmb3IgZnV0dXJlIGNvbXByZXNzaW9uIGJ5IHBhY2syMDAuIFRoaXMgaXMgYWNjb21wbGlzaGVkCi0JIGJ5IHJ1bm5pbmcgdGhlIHBhY2syMDAgY29tbWFuZCB3aXRoIHRoZSA8dHQ+LS1yZXBhY2s8L3R0PiBjb21tYW5kIGxpbmUgYXJndW1lbnQuPC9saT4KLQkgPGxpPlNpZ25pbmcgSkFScyB0byBhbGxvdyBmb3IgYXV0aGVudGljYXRpb24gb2YgdGhlIG9yaWdpbiBvZiBKQVJzLiBUaGlzIGlzIGFjY29tcGxpc2hlZCBieQotCSBydW5uaW5nIGEgc3VwcGxpZWQgY29tbWFuZCAodHlwaWNhbGx5IHRoZSBjb21tYW5kIHdpbGwganVzdCBiZSBhIHdyYXBwZXIgYXJvdW5kCi0JIHRoZSBKYXZhIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS8xLjMvZG9jcy90b29sZG9jcy93aW4zMi9qYXJzaWduZXIuaHRtbCI+amFyc2lnbmVyPC9hPiB0b29sKS48L2xpPgotPC91bD4KLVRoZSBwYWNraW5nIHRvb2wgaXMgdXNlZCBpbiB0aGUgZm9sbG93aW5nIGNvbnRleHRzOgotPHVsPgotCTxsaT5EdXJpbmcgYSBQREUgYnVpbGQsIHRvIHByZXBhcmUgSkFScyBmb3IgdXBsb2FkaW5nIHRvIGFuIEVjbGlwc2UKLQl1cGRhdGUgc2l0ZS4gIEluIHRoaXMgdXNhZ2UsIGl0IGlzIHVzZWQgdG8gYm90aCBub21hbGl6ZSBKQVIgY29udGVudHMKLQkocGFjazIwMCAtcmVwYWNrKSwgYW5kIHNpZ24gSkFScy48L2xpPgotCTxsaT5PbiBhbiB1cGRhdGUgc2l0ZSwgdG8gY29udmVydCB0cmFkaXRpb25hbCBKQVIgY29udGVudCBpbnRvIHRoZSAKLQljb21wcmVzc2VkIHBhY2syMDAgZm9ybWF0LjwvbGk+Ci0JPGxpPkZyb20gYW4gRWNsaXBzZSBjbGllbnQgYXBwbGljYXRpb24gZHVyaW5nIHVwZGF0ZSwgdG8gY29udmVydAotCWNvbXByZXNzZWQgcGFjazIwMCBmb3JtYXQgY29udGVudCBpbnRvIGV4ZWN1dGFibGUgSkFSIGZpbGVzLjwvbGk+Ci08L3VsPgotPGgzPlRvb2wgdXNhZ2U8L2gzPgotVG8gcnVuIHRoZSBwYWNraW5nIHRvb2wsIHlvdSBuZWVkIGEgMS41IEpSRSBpbnN0YWxsZWQuIFRoZSB0b29sIGlzIHJ1bgotYnkgaW52b2tpbmcgSmF2YSBhcyBmb2xsb3dzOgotCi08cHJlPgotCWphdmEgamFycHJvY2Vzc29yLmphciBbb3B0aW9uc10gaW5wdXQKLTwvcHJlPgotCi1XaGVyZSA8dHQ+aW5wdXQ8L3R0PiBpcyBlaXRoZXIgYSB6aXAgZmlsZSwgYSBkaXJlY3RvcnksIG9yIGEgSkFSIChvciBhIHBhY2suZ3ogZmlsZSkuIEFsbCBmaWxlcyBlbmRpbmcgCi1pbiAiLmphciIgb3IgIi5wYWNrLmd6IiBpbiB0aGUgcHJvdmlkZWQgemlwIG9yIGRpcmVjdG9yeSBoaWVyYXJjaHkKLXdpbGwgYmUgcHJvY2Vzc2VkLiAKLVRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFyZSBzdXBwb3J0ZWQ6Ci08dWw+Ci08bGk+LXJlcGFjayA6IE5vcm1hbGl6ZSB0aGUgamFycyB1c2luZyBwYWNrMjAwIDx0dD4tLXJlcGFjazwvdHQ+PC9saT4KLTxsaT4tc2lnbiAmbHQ7Y21kJmd0OyA6IHNpZ25zIHRoZSBqYXJzIGJ5IGV4ZWN1dGluZyB0aGUgcHJvdmlkZWQgY29tbWFuZC4gIAotVGhlIGNvbW1hbmQgd2lsbCBiZSBwcm92aWRlZCBhIHNpbmdsZSBhcmd1bWVudCB0aGF0IHdpbGwgYmUgdGhlIGZ1bGwgcGF0aCBvZiB0aGUgSkFSIHRvIHByb2Nlc3MuCi08L2xpPgotPGxpPi1wYWNrIDogZm9yIGVhY2ggaW5wdXQgaW4gSkFSIGZvcm0sIHByb2R1Y2UgYSBjb3JyZXNwb25kaW5nIG91dHB1dAotaW4gcGFja2VkIGZvcm0uICBGb3IgYW4gaW5wdXQgImEuamFyIiwgdGhlIG91dHB1dCBpcyBhLmphci5wYWNrLmd6LiAgCi08L2xpPgotPGxpPi11bnBhY2sgOiBmb3IgZWFjaCBpbnB1dCBpbiBwYWNrZWQgZm9ybSwgcHJvZHVjZSBhIGNvcnJlc3BvbmRpbmcgb3V0cHV0Ci1pbiB1bnBhY2tlZCBmb3JtLiAgRm9yIGFuIGlucHV0ICJhLmphci5wYWNrLmd6IiwgdGhlIG91dHB1dCBpcyAiYS5qYXIiLiAtdW5wYWNrIGlzIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIC1yZXBhY2ssIC1wYWNrIGFuZCAtc2lnbi48L2xpPgotPGxpPi1vdXRwdXREaXIgJmx0O2RpciZndDsgOiBUaGUgZGlyZWN0b3J5IHRvIHB1dCB0aGUgdG9vbCdzIG91dHB1dCBpbnRvLiAgSWYgdGhlIGlucHV0IHdhcyBhIHppcCBmaWxlLCB0aGVuIGFuIG91dHB1dCB6aXAgZmlsZSB3aWxsIGJlCi1jcmVhdGVkIGNvbnRhaW5nIGFsbCB0aGUgb3V0cHV0IGZpbGVzLiAgSWYgdGhlIGlucHV0IHdhcyBhIGRpcmVjdG9yeSwgZm9yIGVhY2ggaW5wdXQgZmlsZSB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGZpbGUgaW4gdGhlIG91dHB1dCBkaXJlY3RvcnkuIEJ5IGRlZmF1bHQgdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgaXMgdXNlZC4gIElmIHRoZSBpbnB1dCBpcyBpbiB0aGUgc2FtZQotZGlyZWN0b3J5IGFzIHRoZSBvdXRwdXQsIHRoZSBpbnB1dCBmaWxlcyBtYXkgYmUgb3ZlcndyaXR0ZW4uPC9saT4KLTwvdWw+Ci0KLUFkZGl0aW9uYWxseSwgd2hlbiB0aGUgaW5wdXQgaXMgYSB6aXAgZmlsZSwgaXQgbWF5IGNvbnRhaW4gYSBmaWxlIGNhbGxlZAotPHR0PnBhY2sucHJvcGVydGllczwvdHQ+LiAgVGhlIHBhY2sucHJvcGVydGllcyBmaWxlIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgotPHVsPgotPGxpPnBhY2suZXhjbHVkZXMgPSAgamFyTmFtZVssIGphck5hbWVdKiA6IEEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgSkFScyB0aGF0IHNob3VsZCBub3QgYmUgcGFja2VkIG9yIHJlcGFja2VkLgotPC9saT4KLTxsaT5zaWduLmV4Y2x1ZGVzID0gIGphck5hbWVbLCBqYXJOYW1lXSogOiBBIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIEpBUnMgdGhhdCBzaG91bGQgbm90IGJlIHNpZ25lZC4KLTwvbGk+Ci08bGk+Jmx0O2phcm5hbWUmZ3Q7LnBhY2suYXJncyA9IG9wdGlvblssIG9wdGlvbl0qIDogQSBjb21tYS1kZWxpbWl0ZWQgbGlzdCBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IHNob3VsZAotYmUgcGFzc2VkIHRvIHBhY2syMDAgd2hlbiBwYWNraW5nIGFueSBqYXIgd2l0aCBuYW1lICZsdDtqYXJuYW1lJmd0Oy4KLTwvdWw+Ci08L3A+Ci08cD4KLTxmb250IHNpemU9LTE+Ci1Db3B5cmlnaHQgKGMpIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIDIwMDYuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIAotPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMDwvYT4uCi08L2ZvbnQ+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci92ZXJpZmllci9WZXJpZmllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvdmVyaWZpZXIvVmVyaWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc1ZDg4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci92ZXJpZmllci9WZXJpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yLnZlcmlmaWVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5qYXJwcm9jZXNzb3IuVW5wYWNrU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3Nvci5VdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5pbnRlcm5hbC5wcm92aXNpb25hbC5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci5KYXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IuSmFyUHJvY2Vzc29yRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBWZXJpZmllciBleHRlbmRzIEphclByb2Nlc3NvckV4ZWN1dG9yIHsKLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRVc2FnZSgpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJUaGlzIHRvb2wgdmVyaWZpZXMgdGhhdCB1bnBhY2tpbmcgYSBwYWNrLmd6IGZpbGUgd2l0aCB0aGUgamFycHJvY2Vzc29yIHJlc3VsdHMgaW4gYSB2YWxpZCBqYXIgZmlsZS4iKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlOiBqYXZhIC1jcCBqYXJwcm9jZXNzb3IuamFyIG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnRlcm5hbC5qYXJwcm9jZXNzb3IudmVyaWZpZXIuVmVyaWZpZXIgLWRpciA8d29ya2luZ0RpcmVjdG9yeT4gaW5wdXQgW2lucHV0XSIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKCItZGlyIDogc3BlY2lmaWVzIGEgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgcGFjay5neiBmaWxlcyBjYW4gYmUgdGVtcG9yYXJpbHkgdW5wYWNrZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oImlucHV0IDogYSBsaXN0IG9mIGRpcmVjdG9yaWVzIGFuZC9vciBwYWNrLmd6IGZpbGVzIHRvIHZlcmlmeS4iKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpZiAoIVZlcmlmeVN0ZXAuY2FuVmVyaWZ5KCkpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FuJ3QgZmluZCBqYXJzaWduZXIuICBQbGVhc2UgYWRqdXN0IHlvdXIgc3lzdGVtIHBhdGggb3IgdXNlIGEgamRrLiIpOyAvLyROT04tTkxTLTEkCi0JCQlwcmludFVzYWdlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgd29ya2luZ0RpcmVjdG9yeSA9IG51bGw7Ci0JCVN0cmluZyBbXSBpbnB1dDsKLQkJCi0JCWlmKGFyZ3MubGVuZ3RoID09IDApIHsKLQkJCXdvcmtpbmdEaXJlY3RvcnkgPSAiLiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlucHV0ID0gbmV3IFN0cmluZ1tdIHsiLiJ9OyAvLyROT04tTkxTLTEkCi0JCX1lbHNlIHsKLQkJCWludCBpZHggPSAwOwotCQkJaWYoYXJnc1swXSA9PSAiLWhlbHAiKXsgLy8kTk9OLU5MUy0xJAotCQkJCXByaW50VXNhZ2UoKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoYXJnc1tpZHhdID09ICItZGlyIikgeyAvLyROT04tTkxTLTEkCi0JCQkJd29ya2luZ0RpcmVjdG9yeSA9IGFyZ3NbKytpZHhdOwotCQkJCWlkeCsrOwotCQkJfSBlbHNlIHsKLQkJCQl3b3JraW5nRGlyZWN0b3J5ID0gInRlbXAiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlucHV0ID0gbmV3IFN0cmluZ1thcmdzLmxlbmd0aCAtIGlkeF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGFyZ3MsIGlkeCwgaW5wdXQsIDAsIGFyZ3MubGVuZ3RoIC0gaWR4KTsKLQkJfQotCQkKLQkJRmlsZSB3b3JraW5nRGlyID0gbmV3IEZpbGUod29ya2luZ0RpcmVjdG9yeSk7Ci0JCWJvb2xlYW4gY2xlYXIgPSBmYWxzZTsKLQkJaWYoIHdvcmtpbmdEaXIuZXhpc3RzKCkpIHsKLQkJCXdvcmtpbmdEaXIgPSBuZXcgRmlsZSggd29ya2luZ0RpciwgImphcnByb2Nlc3Nvci52ZXJpZmllci50ZW1wIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNsZWFyID0gdHJ1ZTsKLQkJfQotCQkKLQkJVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgVmVyaWZpZXIoKTsKLQkJdmVyaWZpZXIudmVyaWZ5KHdvcmtpbmdEaXIsIGlucHV0KTsKLQkJCi0JCWlmKGNsZWFyKQotCQkJd29ya2luZ0Rpci5kZWxldGVPbkV4aXQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2ZXJpZnkoZmluYWwgRmlsZSB3b3JraW5nRGlyZWN0b3J5LCBTdHJpbmdbXSBpbnB1dCkgewotCQlQcm9wZXJ0aWVzIG9wdGlvbnMgPSBuZXcgUHJvcGVydGllcygpOwotCi0JCUphclByb2Nlc3NvciB1bnBhY2tlciA9IG5ldyBKYXJQcm9jZXNzb3IoKTsKLQkJdW5wYWNrZXIuYWRkUHJvY2Vzc1N0ZXAobmV3IFVucGFja1N0ZXAob3B0aW9ucywgZmFsc2UpKTsKLQkJdW5wYWNrZXIuc2V0V29ya2luZ0RpcmVjdG9yeSh3b3JraW5nRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKLQotCQkvKiBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSBhIGZ1bGwgcHJvY2Vzc29yIHRvIGRvIHRoZSB2ZXJpZmljYXRpb24gdW5sZXNzIHdlIHdhbnQgdG8gdmVyaWZ5IG5lc3RlZCBqYXJzIGFzIHdlbGwuCi0JCSAqIFNvIGZvciBub3csIHVzZSBhIGN1c3RvbSBwcm9jZXNzb3IgdG8ganVzdCBjYWxsIHRoZSB2ZXJpZnkgc3RlcCBkaXJlY3RseS4KLQkJICovCi0JCWZpbmFsIFZlcmlmeVN0ZXAgdmVyaWZ5U3RlcCA9IG5ldyBWZXJpZnlTdGVwKG9wdGlvbnMsIGZhbHNlKTsKLQkJSmFyUHJvY2Vzc29yIHZlcmlmaWVyID0gbmV3IEphclByb2Nlc3NvcigpIHsKLQkJCXB1YmxpYyBGaWxlIHByb2Nlc3NKYXIoRmlsZSBpbnB1dEZpbGUpIHsKLQkJCQlyZXR1cm4gdmVyaWZ5U3RlcC5wb3N0UHJvY2VzcyhpbnB1dEZpbGUsIHdvcmtpbmdEaXJlY3RvcnksIG51bGwpOwotCQkJfQotCQl9OwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUoaW5wdXRbaV0pOwotCQkJaWYgKGlucHV0RmlsZS5leGlzdHMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCXByb2Nlc3MoaW5wdXRGaWxlLCBVdGlscy5QQUNLX0daX0ZJTFRFUiwgdHJ1ZSwgdW5wYWNrZXIsIHZlcmlmaWVyKTsKLQkJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlVdGlscy5jbGVhcih3b3JraW5nRGlyZWN0b3J5KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci92ZXJpZmllci9WZXJpZnlTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL2phcnByb2Nlc3Nvci92ZXJpZmllci9WZXJpZnlTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNjM2OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9qYXJwcm9jZXNzb3IvdmVyaWZpZXIvVmVyaWZ5U3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5qYXJwcm9jZXNzb3IudmVyaWZpZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yLkNvbW1hbmRTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuamFycHJvY2Vzc29yLlV0aWxzOwotCi1wdWJsaWMgY2xhc3MgVmVyaWZ5U3RlcCBleHRlbmRzIENvbW1hbmRTdGVwIHsKLQotCXN0YXRpYyBTdHJpbmcgdmVyaWZ5Q29tbWFuZCA9ICJqYXJzaWduZXIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIEJvb2xlYW4gY2FuVmVyaWZ5ID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5WZXJpZnkoKSB7Ci0JCWlmIChjYW5WZXJpZnkgIT0gbnVsbCkKLQkJCXJldHVybiBjYW5WZXJpZnkuYm9vbGVhblZhbHVlKCk7Ci0KLQkJU3RyaW5nIGphdmFIb21lID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmhvbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY29tbWFuZCA9IGphdmFIb21lICsgIi8uLi9iaW4vamFyc2lnbmVyIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgcmVzdWx0ID0gZXhlY3V0ZShuZXcgU3RyaW5nW10ge2NvbW1hbmR9KTsKLQkJaWYgKHJlc3VsdCA8IDApIHsKLQkJCWNvbW1hbmQgPSAiamFyc2lnbmVyIjsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gZXhlY3V0ZShuZXcgU3RyaW5nW10ge2NvbW1hbmR9KTsKLQkJCWlmIChyZXN1bHQgPCAwKSB7Ci0JCQkJY2FuVmVyaWZ5ID0gQm9vbGVhbi5GQUxTRTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJdmVyaWZ5Q29tbWFuZCA9IGNvbW1hbmQ7Ci0JCWNhblZlcmlmeSA9IEJvb2xlYW4uVFJVRTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIFZlcmlmeVN0ZXAoUHJvcGVydGllcyBvcHRpb25zLCBib29sZWFuIHZlcmJvc2UpIHsKLQkJc3VwZXIob3B0aW9ucywgdmVyaWZ5Q29tbWFuZCwgIi5qYXIiLCB2ZXJib3NlKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RlcE5hbWUoKSB7Ci0JCXJldHVybiAiVmVyaWZ5IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBGaWxlIHBvc3RQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKSB7Ci0JCWlmIChjYW5WZXJpZnkoKSAmJiB2ZXJpZnlDb21tYW5kICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludCgiVmVyaWZ5aW5nICIgKyBpbnB1dC5nZXROYW1lKCkgKyAiOiAgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCVN0cmluZ1tdIGNtZCA9IG5ldyBTdHJpbmdbXSB7dmVyaWZ5Q29tbWFuZCwgIi12ZXJpZnkiLCBpbnB1dC5nZXRDYW5vbmljYWxQYXRoKCl9OyAvLyROT04tTkxTLTEkCi0JCQkJaW50IHJlc3VsdCA9IGV4ZWN1dGUoY21kLCB0cnVlKTsKLQkJCQlpZiAocmVzdWx0ICE9IDAgJiYgdmVyYm9zZSkKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvcjogIiArIHJlc3VsdCArICIgd2FzIHJldHVybmVkIGZyb20gY29tbWFuZDogIiArIFV0aWxzLmNvbmNhdChjbWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKHZlcmJvc2UpCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gaW5wdXQ7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEZpbGUgcHJlUHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIExpc3QgY29udGFpbmVycykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlY3Vyc2lvbkVmZmVjdChTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXF1aW5veC9wMi9qYXJwcm9jZXNzb3IvSVByb2Nlc3NTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9pbnRlcm5hbC9wcm92aXNpb25hbC9lcXVpbm94L3AyL2phcnByb2Nlc3Nvci9JUHJvY2Vzc1N0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3OWM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yL3NyYy9vcmcvZWNsaXBzZS9pbnRlcm5hbC9wcm92aXNpb25hbC9lcXVpbm94L3AyL2phcnByb2Nlc3Nvci9JUHJvY2Vzc1N0ZXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5pbnRlcm5hbC5wcm92aXNpb25hbC5lcXVpbm94LnAyLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqCi0gKiBAYXV0aG9yIGFuaWVmZXJAY2EuaWJtLmNvbQotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJUHJvY2Vzc1N0ZXAgewotCi0JLyoqCi0JICogVGhlIGVmZmVjdCBvZiB0aGlzIHByb2Nlc3Npbmcgc3RlcCBpZiB0aGUgSmFyUHJvY2Vzc29yIHdhcyB0byByZWN1cnNlIG9uIHRoaXMgZW50cnkuCi0JICogUmV0dXJuIG51bGwgaWYgdGhpcyBzdGVwIHdpbGwgbm90IGRvIGFueXRoaW5nIHdpdGggdGhpcyBlbnRyeS4KLQkgKiBSZXR1cm4gdGhlIG5ldyBlbnRyeU5hbWUgaWYgdGhpcyBzdGVwIHdpbGwgbW9kaWZ5IHRoaXMgZW50cnkgb24gcmVjdXJzaW9uLgotCSAqIEBwYXJhbSBlbnRyeU5hbWUKLQkgKiBAcmV0dXJuIFRoZSBuZXcgZW50cnkgbmFtZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlY3Vyc2lvbkVmZmVjdChTdHJpbmcgZW50cnlOYW1lKTsKLQotCS8qKgotCSAqIFBlcmZvcm0gc29tZSBwcm9jZXNzaW5nIG9uIHRoZSBpbnB1dCBmaWxlIGJlZm9yZSB0aGUgSmFyUHJvY2Vzc29yIGNvbnNpZGVycyB0aGUgZW50cmllcyBmb3IgcmVjdXJzaW9uLgotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEBwYXJhbSB3b3JraW5nRGlyZWN0b3J5Ci0JICogQHBhcmFtIGNvbnRhaW5lcnMgaW5mIHByb3BlcnRpZXMgZm9yIGNvbnRhaW5pbmcgamFycywgaW5uZXJtb3N0IGphciBpcyBmaXJzdCBvbiB0aGUgbGlzdAotCSAqIEByZXR1cm4gdGhlIGZpbGUgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mIHRoZSBwcm9jZXNzaW5nCi0JICovCi0JcHVibGljIEZpbGUgcHJlUHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHdvcmtpbmdEaXJlY3RvcnksIExpc3QgY29udGFpbmVycyk7Ci0KLQkvKioKLQkgKiBQZXJmb3JtIHNvbWUgcHJvY2Vzc2luZyBvbiB0aGUgaW5wdXQgZmlsZSBhZnRlciB0aGUgSmFyUHJvY2Vzc29yIHJldHVybnMgZnJvbSByZWN1cnNpb24uCi0JICoKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcGFyYW0gd29ya2luZ0RpcmVjdG9yeQotCSAqIEBwYXJhbSBjb250YWluZXJzIGluZiBwcm9wZXJ0aWVzIGZvciBjb250YWluaW5nIGphcnMsIGlubmVybW9zdCBqYXIgaXMgZmlyc3Qgb24gdGhlIGxpc3QKLQkgKiBAcmV0dXJuIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZiB0aGUgcHJvY2Vzc2luZwotCSAqLwotCXB1YmxpYyBGaWxlIHBvc3RQcm9jZXNzKEZpbGUgaW5wdXQsIEZpbGUgd29ya2luZ0RpcmVjdG9yeSwgTGlzdCBjb250YWluZXJzKTsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGlzIHByb2Nlc3Mgc3RlcAotCSAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBwcm9jZXNzIHN0ZXAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0ZXBOYW1lKCk7Ci0KLQkvKioKLQkgKiBBZGp1c3QgYW55IHByb3BlcnRpZXMgaW4gdGhlIGVjbGlwc2UuaW5mIGFzIGFwcHJvcHJpYXRlIGZvciB0aGlzIHN0ZXAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcGFyYW0gaW5mCi0JICogQHBhcmFtIGNvbnRhaW5lcnMgaW5mIHByb3BlcnRpZXMgZm9yIGNvbnRhaW5pbmcgamFycywgaW5uZXJtb3N0IGphciBpcyBmaXJzdCBvbiB0aGUgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIGFkanVzdEluZihGaWxlIGlucHV0LCBQcm9wZXJ0aWVzIGluZiwgTGlzdCBjb250YWluZXJzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2VxdWlub3gvcDIvamFycHJvY2Vzc29yL0phclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXF1aW5veC9wMi9qYXJwcm9jZXNzb3IvSmFyUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYWRlY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXF1aW5veC9wMi9qYXJwcm9jZXNzb3IvSmFyUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmludGVybmFsLnByb3Zpc2lvbmFsLmVxdWlub3gucDIuamFycHJvY2Vzc29yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3Nvci4qOwotCi1wdWJsaWMgY2xhc3MgSmFyUHJvY2Vzc29yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNLRURfU1VGRklYID0gInBhY2suZ3oiOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBMaXN0IHN0ZXBzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgU3RyaW5nIHdvcmtpbmdEaXJlY3RvcnkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgaW50IGRlcHRoID0gLTE7Ci0JcHJpdmF0ZSBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc0FsbCA9IGZhbHNlOwotCXByaXZhdGUgTGlua2VkTGlzdCBjb250YWluaW5nSW5mcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLQlzdGF0aWMgcHVibGljIEphclByb2Nlc3NvciBnZXRVbnBhY2tQcm9jZXNzb3IoUHJvcGVydGllcyBwcm9wZXJ0aWVzKSB7Ci0JCWlmICghY2FuUGVyZm9ybVVucGFjaygpKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCUphclByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSmFyUHJvY2Vzc29yKCk7Ci0JCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChuZXcgVW5wYWNrU3RlcChwcm9wZXJ0aWVzKSk7Ci0JCXJldHVybiBwcm9jZXNzb3I7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBKYXJQcm9jZXNzb3IgZ2V0UGFja1Byb2Nlc3NvcihQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJaWYgKCFjYW5QZXJmb3JtUGFjaygpKQotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0JCUphclByb2Nlc3NvciBwcm9jZXNzb3IgPSBuZXcgSmFyUHJvY2Vzc29yKCk7Ci0JCXByb2Nlc3Nvci5hZGRQcm9jZXNzU3RlcChuZXcgUGFja1N0ZXAocHJvcGVydGllcykpOwotCQlyZXR1cm4gcHJvY2Vzc29yOwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjYW5QZXJmb3JtUGFjaygpIHsKLQkJcmV0dXJuIFBhY2tTdGVwLmNhblBhY2soKTsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2FuUGVyZm9ybVVucGFjaygpIHsKLQkJcmV0dXJuIFVucGFja1N0ZXAuY2FuVW5wYWNrKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRXb3JraW5nRGlyZWN0b3J5KCkgewotCQlyZXR1cm4gd29ya2luZ0RpcmVjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRXb3JraW5nRGlyZWN0b3J5KFN0cmluZyBkaXIpIHsKLQkJaWYoZGlyICE9IG51bGwpCi0JCQl3b3JraW5nRGlyZWN0b3J5ID0gZGlyOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRWZXJib3NlKGJvb2xlYW4gdmVyYm9zZSkgewotCQl0aGlzLnZlcmJvc2UgPSB2ZXJib3NlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9jZXNzQWxsKGJvb2xlYW4gYWxsKXsKLQkJdGhpcy5wcm9jZXNzQWxsID0gYWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb2Nlc3NTdGVwKElQcm9jZXNzU3RlcCBzdGVwKSB7Ci0JCXN0ZXBzLmFkZChzdGVwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhclByb2Nlc3NTdGVwcygpIHsKLQkJc3RlcHMuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZWNyZWF0ZSBhIGphciBmaWxlLiAgVGhlIHJlcGxhY2VtZW50cyBtYXAgc3BlY2lmaWVzIGVudHJ5IG5hbWVzIHRvIGJlIHJlcGxhY2VkLCB0aGUgcmVwbGFjZW1lbnRzIGFyZQotCSAqIGV4cGVjdGVkIHRvIGJlIGZvdW5kIGluIGRpcmVjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gamFyIC0gVGhlIGlucHV0IGphcgotCSAqIEBwYXJhbSBvdXRwdXRKYXIgLSB0aGUgb3V0cHV0Ci0JICogQHBhcmFtIHJlcGxhY2VtZW50cyAtIG1hcCBvZiBlbnRyeU5hbWUgLT4gbmV3IGVudHJ5TmFtZQotCSAqIEBwYXJhbSBkaXJlY3RvcnkgLSBsb2NhdGlvbiB0byBmaW5kIGZpbGUgZm9yIG5ldyBlbnRyeU5hbWUKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlY3JlYXRlSmFyKEphckZpbGUgamFyLCBKYXJPdXRwdXRTdHJlYW0gb3V0cHV0SmFyLCBNYXAgcmVwbGFjZW1lbnRzLCBGaWxlIGRpcmVjdG9yeSwgUHJvcGVydGllcyBpbmYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGluID0gbnVsbDsKLQkJYm9vbGVhbiBtYXJrZWQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCUVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXIuZW50cmllcygpOwotCQkJZm9yIChKYXJFbnRyeSBlbnRyeSA9IChKYXJFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOyBlbnRyeSAhPSBudWxsOyBlbnRyeSA9IGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkgPyAoSmFyRW50cnkpIGVudHJpZXMubmV4dEVsZW1lbnQoKSA6IG51bGwpIHsKLQkJCQlGaWxlIHJlcGxhY2VtZW50ID0gbnVsbDsKLQkJCQlKYXJFbnRyeSBuZXdFbnRyeSA9IG51bGw7Ci0JCQkJaWYgKHJlcGxhY2VtZW50cy5jb250YWluc0tleShlbnRyeS5nZXROYW1lKCkpKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgcmVwbGFjZW1lbnRzLmdldChlbnRyeS5nZXROYW1lKCkpOwotCQkJCQlyZXBsYWNlbWVudCA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgbmFtZSk7Ci0JCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJCWlmIChyZXBsYWNlbWVudC5leGlzdHMoKSkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShyZXBsYWNlbWVudCkpOwotCQkJCQkJCQluZXdFbnRyeSA9IG5ldyBKYXJFbnRyeShuYW1lKTsKLQkJCQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCQlpZiAodmVyYm9zZSkgewotCQkJCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogUHJvYmxlbSByZWFkaW5nICIgK3JlcGxhY2VtZW50LmdldFBhdGgoKSArICIsIHVzaW5nICIgKyBqYXIuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyBlbnRyeS5nZXROYW1lKCkgICsgIiBpbnN0ZWFkLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfSBlbHNlIGlmICh2ZXJib3NlKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiAiICsgcmVwbGFjZW1lbnQuZ2V0UGF0aCgpICsgIiBub3QgZm91bmQsIHVzaW5nICIgKyBqYXIuZ2V0TmFtZSgpICsgRmlsZS5zZXBhcmF0b3IgKyBlbnRyeS5nZXROYW1lKCkgKyAiIGluc3RlYWQuIik7CSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChuZXdFbnRyeSA9PSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSkpOwotCQkJCQkJbmV3RW50cnkgPSBuZXcgSmFyRW50cnkoZW50cnkuZ2V0TmFtZSgpKTsKLQkJCQkJfSBjYXRjaCggRXhjZXB0aW9uIGUgKSB7Ci0JCQkJCQlpZih2ZXJib3NlKSB7Ci0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkVSUk9SOiBwcm9ibGVtIHJlYWRpbmcgIiArIGVudHJ5LmdldE5hbWUoKSArICIgZnJvbSAiICsgamFyLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJbmV3RW50cnkuc2V0VGltZShlbnRyeS5nZXRUaW1lKCkpOwotCQkJCW91dHB1dEphci5wdXROZXh0RW50cnkobmV3RW50cnkpOwotCQkJCWlmIChlbnRyeS5nZXROYW1lKCkuZXF1YWxzKFV0aWxzLk1BUktfRklMRV9OQU1FKSkgewotCQkJCQkvL1RoZSBlY2xpcHNlLmluZiBmaWxlIHdhcyByZWFkIGluIGVhcmxpZXIsIGRvbid0IG5lZWQgdG8gcmVyZWFkIGl0LCBqdXN0IHdyaXRlIGl0IG91dCBub3cKLQkJCQkJVXRpbHMuc3RvcmVQcm9wZXJ0aWVzKGluZiwgb3V0cHV0SmFyKTsKLQkJCQkJbWFya2VkID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlVdGlscy50cmFuc2ZlclN0cmVhbXMoaW4sIG91dHB1dEphciwgZmFsc2UpOwotCQkJCX0KLQkJCQlvdXRwdXRKYXIuY2xvc2VFbnRyeSgpOwotCQkJCWluLmNsb3NlKCk7Ci0KLQkJCQkvL2RlbGV0ZSB0aGUgbmVzdGVkIGphciBmaWxlCi0JCQkJaWYgKHJlcGxhY2VtZW50ICE9IG51bGwpIHsKLQkJCQkJcmVwbGFjZW1lbnQuZGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFtYXJrZWQpIHsKLQkJCQlKYXJFbnRyeSBlbnRyeSA9IG5ldyBKYXJFbnRyeShVdGlscy5NQVJLX0ZJTEVfTkFNRSk7Ci0JCQkJb3V0cHV0SmFyLnB1dE5leHRFbnRyeShlbnRyeSk7Ci0JCQkJVXRpbHMuc3RvcmVQcm9wZXJ0aWVzKGluZiwgb3V0cHV0SmFyKTsKLQkJCQlvdXRwdXRKYXIuY2xvc2VFbnRyeSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJVXRpbHMuY2xvc2Uob3V0cHV0SmFyKTsKLQkJCVV0aWxzLmNsb3NlKGphcik7Ci0JCQlVdGlscy5jbG9zZShpbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyByZWN1cnNpb25FZmZlY3QoU3RyaW5nIGVudHJ5TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3RlcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJUHJvY2Vzc1N0ZXAgc3RlcCA9IChJUHJvY2Vzc1N0ZXApIGl0ZXIubmV4dCgpOwotCi0JCQlyZXN1bHQgPSBzdGVwLnJlY3Vyc2lvbkVmZmVjdChlbnRyeU5hbWUpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCWVudHJ5TmFtZSA9IHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBleHRyYWN0RW50cmllcyhKYXJGaWxlIGphciwgRmlsZSB0ZW1wRGlyLCBNYXAgZGF0YSwgUHJvcGVydGllcyBpbmYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmKGluZiAhPSBudWxsICkgewotCQkJLy9za2lwIGlmIGV4Y2x1ZGluZyBjaGlsZHJlbgotCQkJaWYoaW5mLmNvbnRhaW5zS2V5KFV0aWxzLk1BUktfRVhDTFVERV9DSElMRFJFTikpewotCQkJCVN0cmluZyBleGNsdWRlQ2hpbGRyZW4gPSBpbmYuZ2V0UHJvcGVydHkoVXRpbHMuTUFSS19FWENMVURFX0NISUxEUkVOKTsKLQkJCQlpZiggQm9vbGVhbi52YWx1ZU9mKGV4Y2x1ZGVDaGlsZHJlbikuYm9vbGVhblZhbHVlKCkgKQotCQkJCQlpZih2ZXJib3NlKXsKLQkJCQkJCWZvcihpbnQgaSA9IDA7IGkgPD0gZGVwdGg7IGkrKykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNoaWxkcmVuIG9mICIgKyBqYXIuZ2V0TmFtZSgpICsgImFyZSBleGNsdWRlZCBmcm9tIHByb2Nlc3NpbmcuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkKLQkJRW51bWVyYXRpb24gZW50cmllcyA9IGphci5lbnRyaWVzKCk7Ci0JCWlmIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlmb3IgKEphckVudHJ5IGVudHJ5ID0gKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSA/IChKYXJFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpIDogbnVsbCkgewotCQkJCVN0cmluZyBuYW1lID0gZW50cnkuZ2V0TmFtZSgpOwotCQkJCVN0cmluZyBuZXdOYW1lID0gcmVjdXJzaW9uRWZmZWN0KG5hbWUpOwotCQkJCWlmIChuZXdOYW1lICE9IG51bGwpIHsKLQkJCQkJaWYodmVyYm9zZSl7Ci0JCQkJCQlmb3IoaW50IGkgPSAwOyBpIDw9IGRlcHRoOyBpKyspCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludCgiICAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9jZXNzaW5nIG5lc3RlZCBmaWxlOiAiICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQkvL2V4dHJhY3QgZW50cnkgdG8gdGVtcCBkaXJlY3RvcnkKLQkJCQkJRmlsZSBleHRyYWN0ZWQgPSBuZXcgRmlsZSh0ZW1wRGlyLCBuYW1lKTsKLQkJCQkJRmlsZSBwYXJlbnREaXIgPSBleHRyYWN0ZWQuZ2V0UGFyZW50RmlsZSgpOwotCQkJCQlpZiAoIXBhcmVudERpci5leGlzdHMoKSkKLQkJCQkJCXBhcmVudERpci5ta2RpcnMoKTsKLQotCQkJCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQkJCU91dHB1dFN0cmVhbSBvdXQgPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJaW4gPSBqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwotCQkJCQkJb3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGV4dHJhY3RlZCkpOwotCQkJCQkJVXRpbHMudHJhbnNmZXJTdHJlYW1zKGluLCBvdXQsIHRydWUpOyAvL3RoaXMgd2lsbCBjbG9zZSBib3RoIHN0cmVhbXMKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCVV0aWxzLmNsb3NlKGluKTsKLQkJCQkJCVV0aWxzLmNsb3NlKG91dCk7Ci0JCQkJCX0KLQkJCQkJZXh0cmFjdGVkLnNldExhc3RNb2RpZmllZChlbnRyeS5nZXRUaW1lKCkpOwotCi0JCQkJCS8vcmVjdXJzZQotCQkJCQljb250YWluaW5nSW5mcy5hZGRGaXJzdChpbmYpOwotCQkJCQlTdHJpbmcgZGlyID0gZ2V0V29ya2luZ0RpcmVjdG9yeSgpOwotCQkJCQlzZXRXb3JraW5nRGlyZWN0b3J5KHBhcmVudERpci5nZXRDYW5vbmljYWxQYXRoKCkpOwotCQkJCQlGaWxlIHJlc3VsdCA9IHByb2Nlc3NKYXIoZXh0cmFjdGVkKTsKLQotCQkJCQluZXdOYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5sZW5ndGgoKSAtIGV4dHJhY3RlZC5nZXROYW1lKCkubGVuZ3RoKCkpICsgcmVzdWx0LmdldE5hbWUoKTsKLQkJCQkJZGF0YS5wdXQobmFtZSwgbmV3TmFtZSk7Ci0KLQkJCQkJc2V0V29ya2luZ0RpcmVjdG9yeShkaXIpOwotCQkJCQljb250YWluaW5nSW5mcy5yZW1vdmVGaXJzdCgpOwotCi0JCQkJCS8vZGVsZXRlIHRoZSBleHRyYWN0ZWQgaXRlbSBsZWF2aW5nIHRoZSByZWN1cnNpb24gcmVzdWx0Ci0JCQkJCWlmICghbmFtZS5lcXVhbHMobmV3TmFtZSkpCi0JCQkJCQlleHRyYWN0ZWQuZGVsZXRlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIHByZVByb2Nlc3MoRmlsZSBpbnB1dCwgRmlsZSB0ZW1wRGlyKSB7Ci0JCUZpbGUgcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3RlcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJUHJvY2Vzc1N0ZXAgc3RlcCA9IChJUHJvY2Vzc1N0ZXApIGl0ZXIubmV4dCgpOwotCQkJcmVzdWx0ID0gc3RlcC5wcmVQcm9jZXNzKGlucHV0LCB0ZW1wRGlyLCBjb250YWluaW5nSW5mcyk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJaW5wdXQgPSByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCXByaXZhdGUgRmlsZSBwb3N0UHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlIHRlbXBEaXIpIHsKLQkJRmlsZSByZXN1bHQgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzdGVwcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlQcm9jZXNzU3RlcCBzdGVwID0gKElQcm9jZXNzU3RlcCkgaXRlci5uZXh0KCk7Ci0JCQlyZXN1bHQgPSBzdGVwLnBvc3RQcm9jZXNzKGlucHV0LCB0ZW1wRGlyLCBjb250YWluaW5nSW5mcyk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJaW5wdXQgPSByZXN1bHQ7Ci0JCX0KLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGp1c3RJbmYoRmlsZSBpbnB1dCwgUHJvcGVydGllcyBpbmYpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc3RlcHMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlJUHJvY2Vzc1N0ZXAgc3RlcCA9IChJUHJvY2Vzc1N0ZXApIGl0ZXIubmV4dCgpOwotCQkJc3RlcC5hZGp1c3RJbmYoaW5wdXQsIGluZiwgY29udGFpbmluZ0luZnMpOwotCQl9Ci0JfQotCi0JcHVibGljIEZpbGUgcHJvY2Vzc0phcihGaWxlIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkrK2RlcHRoOwotCQlsb25nIGxhc3RNb2RpZmllZCA9IGlucHV0Lmxhc3RNb2RpZmllZCgpOwotCQlGaWxlIHdvcmtpbmdEaXIgPSBuZXcgRmlsZShnZXRXb3JraW5nRGlyZWN0b3J5KCkpOwotCQlpZiAoIXdvcmtpbmdEaXIuZXhpc3RzKCkpCi0JCQl3b3JraW5nRGlyLm1rZGlycygpOwotCi0JCWJvb2xlYW4gc2tpcCA9IFV0aWxzLnNob3VsZFNraXBKYXIoaW5wdXQsIHByb2Nlc3NBbGwsIHZlcmJvc2UpOwotCQlpZiAoZGVwdGggPT0gMCAmJiB2ZXJib3NlKSB7Ci0JCQlpZiAoc2tpcCkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwaW5nICIgKyBpbnB1dC5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KCJSdW5uaW5nICIpOyAvLyROT04tTkxTLTEkIAotCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IHN0ZXBzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQlJUHJvY2Vzc1N0ZXAgc3RlcCA9IChJUHJvY2Vzc1N0ZXApIGl0ZXIubmV4dCgpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50KHN0ZXAuZ2V0U3RlcE5hbWUoKSArICIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJvbiAiICsgaW5wdXQuZ2V0UGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKHNraXApIHsKLQkJCS8vVGhpcyBqYXIgd2FzIG5vdCBtYXJrZWQgYXMgY29uZGl0aW9uZWQsIGFuZCB3ZSBhcmUgb25seSBwcm9jZXNzaW5nIGNvbmRpdGlvbmVkIGphcnMsIHNvIGRvIG5vdGhpbmcKLQkJCS0tZGVwdGg7Ci0JCQlyZXR1cm4gaW5wdXQ7Ci0JCX0KLQotCQkvL3ByZQotCQlGaWxlIHdvcmtpbmdGaWxlID0gcHJlUHJvY2VzcyhpbnB1dCwgd29ya2luZ0Rpcik7Ci0KLQkJLy9FeHRyYWN0IGVudHJpZXMgZnJvbSBqYXIgYW5kIHJlY3Vyc2Ugb24gdGhlbQotCQlGaWxlIHRlbXBEaXIgPSBudWxsOwotCQlpZiAoZGVwdGggPT0gMCkgewotCQkJdGVtcERpciA9IG5ldyBGaWxlKHdvcmtpbmdEaXIsICJ0ZW1wLiIgKyB3b3JraW5nRmlsZS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlGaWxlIHBhcmVudCA9IHdvcmtpbmdEaXIuZ2V0UGFyZW50RmlsZSgpOwotCQkJdGVtcERpciA9IG5ldyBGaWxlKHBhcmVudCwgInRlbXBfIiArIGRlcHRoICsgJ18nICsgd29ya2luZ0ZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSmFyRmlsZSBqYXIgPSBuZXcgSmFyRmlsZSh3b3JraW5nRmlsZSwgZmFsc2UpOwotCQlNYXAgcmVwbGFjZW1lbnRzID0gbmV3IEhhc2hNYXAoKTsKLQkJUHJvcGVydGllcyBpbmYgPSBVdGlscy5nZXRFY2xpcHNlSW5mKHdvcmtpbmdGaWxlLCB2ZXJib3NlKTsKLQkJZXh0cmFjdEVudHJpZXMoamFyLCB0ZW1wRGlyLCByZXBsYWNlbWVudHMsIGluZik7Ci0KLQkJaWYgKGluZiAhPSBudWxsKQotCQkJYWRqdXN0SW5mKHdvcmtpbmdGaWxlLCBpbmYpOwotCi0JCS8vUmVjcmVhdGUgdGhlIGphciB3aXRoIHJlcGxhY2VtZW50cy4gCi0JCS8vVE9ETzogVGhpcyBpcyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGlmIHdlIGRpZG4ndCBjaGFuZ2UgdGhlIGluZiBmaWxlIGFuZCBkaWRuJ3QgY2hhbmdlIGFueSBjb250ZW50Ci0JCUZpbGUgdGVtcEphciA9IG51bGw7Ci0JCXRlbXBKYXIgPSBuZXcgRmlsZSh0ZW1wRGlyLCB3b3JraW5nRmlsZS5nZXROYW1lKCkpOwotCQlGaWxlIHBhcmVudCA9IHRlbXBKYXIuZ2V0UGFyZW50RmlsZSgpOwotCQlpZiAoIXBhcmVudC5leGlzdHMoKSkKLQkJCXBhcmVudC5ta2RpcnMoKTsKLQkJSmFyT3V0cHV0U3RyZWFtIGphck91dCA9IG5ldyBKYXJPdXRwdXRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXBKYXIpKSk7Ci0JCXJlY3JlYXRlSmFyKGphciwgamFyT3V0LCByZXBsYWNlbWVudHMsIHRlbXBEaXIsIGluZik7Ci0KLQkJamFyLmNsb3NlKCk7Ci0JCWlmICh0ZW1wSmFyICE9IG51bGwpIHsKLQkJCWlmICghd29ya2luZ0ZpbGUuZXF1YWxzKGlucHV0KSkgewotCQkJCXdvcmtpbmdGaWxlLmRlbGV0ZSgpOwotCQkJfQotCQkJd29ya2luZ0ZpbGUgPSB0ZW1wSmFyOwotCQl9Ci0KLQkJLy9wb3N0Ci0JCUZpbGUgcmVzdWx0ID0gcG9zdFByb2Nlc3Mod29ya2luZ0ZpbGUsIHdvcmtpbmdEaXIpOwotCQkKLQkJLy9oYXZlIHRvIG5vcm1hbGl6ZSBhZnRlciB0aGUgcG9zdCBzdGVwcwotCQlub3JtYWxpemUocmVzdWx0LCB3b3JraW5nRGlyKTsKLQkJCi0JCWlmICghcmVzdWx0LmVxdWFscyh3b3JraW5nRmlsZSkgJiYgIXdvcmtpbmdGaWxlLmVxdWFscyhpbnB1dCkpCi0JCQl3b3JraW5nRmlsZS5kZWxldGUoKTsKLQkJaWYgKCFyZXN1bHQuZ2V0UGFyZW50RmlsZSgpLmVxdWFscyh3b3JraW5nRGlyKSkgewotCQkJRmlsZSBmaW5hbEZpbGUgPSBuZXcgRmlsZSh3b3JraW5nRGlyLCByZXN1bHQuZ2V0TmFtZSgpKTsKLQkJCWlmIChmaW5hbEZpbGUuZXhpc3RzKCkpCi0JCQkJZmluYWxGaWxlLmRlbGV0ZSgpOwotCQkJcmVzdWx0LnJlbmFtZVRvKGZpbmFsRmlsZSk7Ci0JCQlyZXN1bHQgPSBmaW5hbEZpbGU7Ci0JCX0KLQotCQlpZiAodGVtcERpci5leGlzdHMoKSkKLQkJCVV0aWxzLmNsZWFyKHRlbXBEaXIpOwotCi0JCXJlc3VsdC5zZXRMYXN0TW9kaWZpZWQobGFzdE1vZGlmaWVkKTsKLQkJLS1kZXB0aDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIG5vcm1hbGl6ZShGaWxlIGlucHV0LCBGaWxlIGRpcmVjdG9yeSkgewotCQlpZihpbnB1dC5nZXROYW1lKCkuZW5kc1dpdGgoSmFyUHJvY2Vzc29yLlBBQ0tFRF9TVUZGSVgpKSB7Ci0JCQkvL25vdCBhIGphcgotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlGaWxlIHRlbXBKYXIgPSBuZXcgRmlsZShkaXJlY3RvcnksICJ0ZW1wXyIgKyBpbnB1dC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQlKYXJGaWxlIGphciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWphciA9IG5ldyBKYXJGaWxlKGlucHV0LCBmYWxzZSk7Ci0JCQl9IGNhdGNoIChKYXJFeGNlcHRpb24gZSkgewotCQkJCS8vbm90IGEgamFyCi0JCQkJcmV0dXJuIDsKLQkJCX0KLQkJCUphck91dHB1dFN0cmVhbSBqYXJPdXQgPSBuZXcgSmFyT3V0cHV0U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wSmFyKSkpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlFbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyLmVudHJpZXMoKTsKLQkJCQlmb3IgKEphckVudHJ5IGVudHJ5ID0gKEphckVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7IGVudHJ5ICE9IG51bGw7IGVudHJ5ID0gZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSA/IChKYXJFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpIDogbnVsbCkgewotCQkJCQlKYXJFbnRyeSBuZXdFbnRyeSA9IG5ldyBKYXJFbnRyeShlbnRyeS5nZXROYW1lKCkpOwotCQkJCQluZXdFbnRyeS5zZXRUaW1lKGVudHJ5LmdldFRpbWUoKSk7Ci0JCQkJCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oamFyLmdldElucHV0U3RyZWFtKGVudHJ5KSk7Ci0JCQkJCWphck91dC5wdXROZXh0RW50cnkobmV3RW50cnkpOwotCQkJCQlVdGlscy50cmFuc2ZlclN0cmVhbXMoaW4sIGphck91dCwgZmFsc2UpOwotCQkJCQlqYXJPdXQuY2xvc2VFbnRyeSgpOwotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJVXRpbHMuY2xvc2UoamFyT3V0KTsKLQkJCQlVdGlscy5jbG9zZShqYXIpOwotCQkJCVV0aWxzLmNsb3NlKGluKTsKLQkJCX0KLQkJCXRlbXBKYXIuc2V0TGFzdE1vZGlmaWVkKGlucHV0Lmxhc3RNb2RpZmllZCgpKTsKLQkJCWlucHV0LmRlbGV0ZSgpOwotCQkJdGVtcEphci5yZW5hbWVUbyhpbnB1dCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWlmICh2ZXJib3NlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBub3JtYWxpemluZyBqYXIgIiArIGlucHV0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXF1aW5veC9wMi9qYXJwcm9jZXNzb3IvSmFyUHJvY2Vzc29yRXhlY3V0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3Ivc3JjL29yZy9lY2xpcHNlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2VxdWlub3gvcDIvamFycHJvY2Vzc29yL0phclByb2Nlc3NvckV4ZWN1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YTU2MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3Nvci9zcmMvb3JnL2VjbGlwc2UvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXF1aW5veC9wMi9qYXJwcm9jZXNzb3IvSmFyUHJvY2Vzc29yRXhlY3V0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5pbnRlcm5hbC5wcm92aXNpb25hbC5lcXVpbm94LnAyLmphcnByb2Nlc3NvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmphcnByb2Nlc3Nvci4qOwotCi1wdWJsaWMgY2xhc3MgSmFyUHJvY2Vzc29yRXhlY3V0b3IgewotCXB1YmxpYyBzdGF0aWMgY2xhc3MgT3B0aW9ucyB7Ci0JCXB1YmxpYyBTdHJpbmcgb3V0cHV0RGlyID0gIi4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBTdHJpbmcgc2lnbkNvbW1hbmQgPSBudWxsOwotCQlwdWJsaWMgYm9vbGVhbiBwYWNrID0gZmFsc2U7Ci0JCXB1YmxpYyBib29sZWFuIHJlcGFjayA9IGZhbHNlOwotCQlwdWJsaWMgYm9vbGVhbiB1bnBhY2sgPSBmYWxzZTsKLQkJcHVibGljIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotCQlwdWJsaWMgYm9vbGVhbiBwcm9jZXNzQWxsID0gZmFsc2U7Ci0JCXB1YmxpYyBGaWxlIGlucHV0ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5KYXJQcm9jZXNzb3IoT3B0aW9ucyBvcHRpb25zKSB7Ci0JCWlmIChvcHRpb25zLmlucHV0LmlzRmlsZSgpICYmIG9wdGlvbnMuaW5wdXQuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuemlwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJWmlwUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBaaXBQcm9jZXNzb3IoKTsKLQkJCXByb2Nlc3Nvci5zZXRXb3JraW5nRGlyZWN0b3J5KG9wdGlvbnMub3V0cHV0RGlyKTsKLQkJCXByb2Nlc3Nvci5zZXRTaWduQ29tbWFuZChvcHRpb25zLnNpZ25Db21tYW5kKTsKLQkJCXByb2Nlc3Nvci5zZXRQYWNrKG9wdGlvbnMucGFjayk7Ci0JCQlwcm9jZXNzb3Iuc2V0UmVwYWNrKG9wdGlvbnMucmVwYWNrIHx8IChvcHRpb25zLnBhY2sgJiYgb3B0aW9ucy5zaWduQ29tbWFuZCAhPSBudWxsKSk7Ci0JCQlwcm9jZXNzb3Iuc2V0VW5wYWNrKG9wdGlvbnMudW5wYWNrKTsKLQkJCXByb2Nlc3Nvci5zZXRWZXJib3NlKG9wdGlvbnMudmVyYm9zZSk7Ci0JCQlwcm9jZXNzb3Iuc2V0UHJvY2Vzc0FsbChvcHRpb25zLnByb2Nlc3NBbGwpOwotCQkJdHJ5IHsKLQkJCQlwcm9jZXNzb3IucHJvY2Vzc1ppcChvcHRpb25zLmlucHV0KTsKLQkJCX0gY2F0Y2ggKFppcEV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKG9wdGlvbnMudmVyYm9zZSkKLQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAob3B0aW9ucy52ZXJib3NlKQotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJSmFyUHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBKYXJQcm9jZXNzb3IoKTsKLQkJCUphclByb2Nlc3NvciBwYWNrUHJvY2Vzc29yID0gbnVsbDsKLQotCQkJcHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3Rvcnkob3B0aW9ucy5vdXRwdXREaXIpOwotCQkJcHJvY2Vzc29yLnNldFByb2Nlc3NBbGwob3B0aW9ucy5wcm9jZXNzQWxsKTsKLQkJCXByb2Nlc3Nvci5zZXRWZXJib3NlKG9wdGlvbnMudmVyYm9zZSk7Ci0KLQkJCS8vbG9hZCBvcHRpb25zIGZpbGUKLQkJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCQlpZiAob3B0aW9ucy5pbnB1dC5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJRmlsZSBwYWNrUHJvcGVydGllcyA9IG5ldyBGaWxlKG9wdGlvbnMuaW5wdXQsICJwYWNrLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwYWNrUHJvcGVydGllcy5leGlzdHMoKSAmJiBwYWNrUHJvcGVydGllcy5pc0ZpbGUoKSkgewotCQkJCQlJbnB1dFN0cmVhbSBpbiA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0ocGFja1Byb3BlcnRpZXMpKTsKLQkJCQkJCXByb3BlcnRpZXMubG9hZChpbik7Ci0JCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWlmIChvcHRpb25zLnZlcmJvc2UpCi0JCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCVV0aWxzLmNsb3NlKGluKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG9wdGlvbnMudW5wYWNrKQotCQkJCWFkZFVucGFja1N0ZXAocHJvY2Vzc29yLCBwcm9wZXJ0aWVzLCBvcHRpb25zKTsKLQotCQkJaWYgKG9wdGlvbnMucmVwYWNrIHx8IChvcHRpb25zLnBhY2sgJiYgb3B0aW9ucy5zaWduQ29tbWFuZCAhPSBudWxsKSkKLQkJCQlhZGRQYWNrVW5wYWNrU3RlcChwcm9jZXNzb3IsIHByb3BlcnRpZXMsIG9wdGlvbnMpOwotCi0JCQlpZiAob3B0aW9ucy5zaWduQ29tbWFuZCAhPSBudWxsKQotCQkJCWFkZFNpZ25TdGVwKHByb2Nlc3NvciwgcHJvcGVydGllcywgb3B0aW9ucyk7Ci0KLQkJCWlmIChvcHRpb25zLnBhY2spIHsKLQkJCQlwYWNrUHJvY2Vzc29yID0gbmV3IEphclByb2Nlc3NvcigpOwotCQkJCXBhY2tQcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShvcHRpb25zLm91dHB1dERpcik7Ci0JCQkJcGFja1Byb2Nlc3Nvci5zZXRQcm9jZXNzQWxsKG9wdGlvbnMucHJvY2Vzc0FsbCk7Ci0JCQkJcGFja1Byb2Nlc3Nvci5zZXRWZXJib3NlKG9wdGlvbnMudmVyYm9zZSk7Ci0JCQkJYWRkUGFja1N0ZXAocGFja1Byb2Nlc3NvciwgcHJvcGVydGllcywgb3B0aW9ucyk7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJcHJvY2VzcyhvcHRpb25zLmlucHV0LCBvcHRpb25zLnVucGFjayA/IFV0aWxzLlBBQ0tfR1pfRklMVEVSIDogVXRpbHMuSkFSX0ZJTFRFUiwgb3B0aW9ucy52ZXJib3NlLCBwcm9jZXNzb3IsIHBhY2tQcm9jZXNzb3IpOwotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAob3B0aW9ucy52ZXJib3NlKQotCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2VzcyhGaWxlIGlucHV0LCBGaWxlRmlsdGVyIGZpbHRlciwgYm9vbGVhbiB2ZXJib3NlLCBKYXJQcm9jZXNzb3IgcHJvY2Vzc29yLCBKYXJQcm9jZXNzb3IgcGFja1Byb2Nlc3NvcikgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7Ci0JCWlmICghaW5wdXQuZXhpc3RzKCkpCi0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKCk7Ci0KLQkJRmlsZVtdIGZpbGVzID0gbnVsbDsKLQkJaWYgKGlucHV0LmlzRGlyZWN0b3J5KCkpIHsKLQkJCWZpbGVzID0gaW5wdXQubGlzdEZpbGVzKCk7Ci0JCX0gZWxzZSBpZiAoZmlsdGVyLmFjY2VwdChpbnB1dCkpIHsKLQkJCWZpbGVzID0gbmV3IEZpbGVbXSB7aW5wdXR9OwotCQl9IGVsc2UKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlTdHJpbmcgZGlyID0gcHJvY2Vzc29yLmdldFdvcmtpbmdEaXJlY3RvcnkoKTsKLQkJCQlwcm9jZXNzb3Iuc2V0V29ya2luZ0RpcmVjdG9yeShkaXIgKyAiLyIgKyBmaWxlc1tpXS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBhY2tQcm9jZXNzb3IgIT0gbnVsbCkKLQkJCQkJcGFja1Byb2Nlc3Nvci5zZXRXb3JraW5nRGlyZWN0b3J5KGRpciArICIvIiArIGZpbGVzW2ldLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlwcm9jZXNzKGZpbGVzW2ldLCBmaWx0ZXIsIHZlcmJvc2UsIHByb2Nlc3NvciwgcGFja1Byb2Nlc3Nvcik7Ci0JCQkJcHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3RvcnkoZGlyKTsKLQkJCQlpZiAocGFja1Byb2Nlc3NvciAhPSBudWxsKQotCQkJCQlwYWNrUHJvY2Vzc29yLnNldFdvcmtpbmdEaXJlY3RvcnkoZGlyKTsKLQkJCX0gZWxzZSBpZiAoZmlsdGVyLmFjY2VwdChmaWxlc1tpXSkpIHsKLQkJCQl0cnkgewotCQkJCQlGaWxlIHJlc3VsdCA9IHByb2Nlc3Nvci5wcm9jZXNzSmFyKGZpbGVzW2ldKTsKLQkJCQkJaWYgKHBhY2tQcm9jZXNzb3IgIT0gbnVsbCAmJiByZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXhpc3RzKCkpIHsKLQkJCQkJCXBhY2tQcm9jZXNzb3IucHJvY2Vzc0phcihyZXN1bHQpOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlpZiAodmVyYm9zZSkKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGFja1VucGFja1N0ZXAoSmFyUHJvY2Vzc29yIHByb2Nlc3NvciwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBKYXJQcm9jZXNzb3JFeGVjdXRvci5PcHRpb25zIG9wdGlvbnMpIHsKLQkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKG5ldyBQYWNrVW5wYWNrU3RlcChwcm9wZXJ0aWVzLCBvcHRpb25zLnZlcmJvc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRTaWduU3RlcChKYXJQcm9jZXNzb3IgcHJvY2Vzc29yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIEphclByb2Nlc3NvckV4ZWN1dG9yLk9wdGlvbnMgb3B0aW9ucykgewotCQlwcm9jZXNzb3IuYWRkUHJvY2Vzc1N0ZXAobmV3IFNpZ25Db21tYW5kU3RlcChwcm9wZXJ0aWVzLCBvcHRpb25zLnNpZ25Db21tYW5kLCBvcHRpb25zLnZlcmJvc2UpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWNrU3RlcChKYXJQcm9jZXNzb3IgcHJvY2Vzc29yLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIEphclByb2Nlc3NvckV4ZWN1dG9yLk9wdGlvbnMgb3B0aW9ucykgewotCQlwcm9jZXNzb3IuYWRkUHJvY2Vzc1N0ZXAobmV3IFBhY2tTdGVwKHByb3BlcnRpZXMsIG9wdGlvbnMudmVyYm9zZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFVucGFja1N0ZXAoSmFyUHJvY2Vzc29yIHByb2Nlc3NvciwgUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBKYXJQcm9jZXNzb3JFeGVjdXRvci5PcHRpb25zIG9wdGlvbnMpIHsKLQkJcHJvY2Vzc29yLmFkZFByb2Nlc3NTdGVwKG5ldyBVbnBhY2tTdGVwKHByb3BlcnRpZXMsIG9wdGlvbnMudmVyYm9zZSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvTWV0YWRhdGEgR2VuZXJhdG9yIFBsdWdpbnMgYW5kIEZlYXR1cmVzLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvTWV0YWRhdGEgR2VuZXJhdG9yIFBsdWdpbnMgYW5kIEZlYXR1cmVzLmxhdW5jaAppbmRleCAyNzE2MjBjLi42OGM0ZmUxIDEwMDY0NAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL01ldGFkYXRhIEdlbmVyYXRvciBQbHVnaW5zIGFuZCBGZWF0dXJlcy5sYXVuY2gKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9NZXRhZGF0YSBHZW5lcmF0b3IgUGx1Z2lucyBhbmQgRmVhdHVyZXMubGF1bmNoCkBAIC0xLDQgKzEsNCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgogPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+CiA8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgogPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgpAQCAtMTUsOSArMTUsOSBAQAogPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KIDxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgogPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyozLjEuMjAwLnYyMDA3MTIwM0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aCozLjIuMTAwLnYyMDA3MDUwMkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24qMy40LjAudjIwMDgwNDIxLTIwMDZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkqMy40LjAudjIwMDgwNDIxLTIwMDZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LnJlZ2lzdHJ5KjMuMi4yMDAudjIwMDcwNzE3QGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMqMy4yLjEwMC52MjAwODAzMjQtMTYwMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lKjMuNC4wLnYyMDA4MDQyMS0xODA1QGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCoxLjEuMC52MjAwODA0MjEtMjAwNkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5qb2JzKjMuNC4wLnYyMDA4MDMxMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSozLjMuMC52MjAwODA0MTRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmFudC5jb3JlKjMuMi4wLnYyMDA4MDQyNUBkZWZhdWx0OmRlZmF1bHQiLz4KKzxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0YXJnZXRfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkud2luMzIueDg2KjEuMC4wLnYyMDA4MDMyNEBkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LnJlZ2lzdHJ5KjMuMi4yMDAudjIwMDcwNzE3QGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyozLjEuMjAwLnYyMDA3MTIwM0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuYW50LmNvcmUqMy4yLjAudjIwMDgwMzE5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUqMy40LjAudjIwMDgwMzI0LTE3MjVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMqMy4yLjIwMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGUqMy4zLjAudjIwMDgwNDE0QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiozLjQuMC52MjAwODA0MDdAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guYXBwKjEuMC4xMDAudjIwMDgwMzMxQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpKjMuNC4wLnYyMDA4MDQxNEA6LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgqMy4yLjEwMC52MjAwNzA1MDJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IqMy4yLjIwMC52MjAwODA0MDRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkqMy40LjAudjIwMDgwMzE2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5KjEuMC4wLnYyMDA4MDQxNEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5qb2JzKjMuNC4wLnYyMDA4MDMxMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMqMy4yLjEwMC52MjAwODAzMjQtMTYwMEBkZWZhdWx0OmRlZmF1bHQiLz4KIDxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+CiA8Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgogPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VOYW1lZEpSRSIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ3b3Jrc3BhY2VfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvcioxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkqMS4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhKjEuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMqMS4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluKjEuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94KjEuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5KjEuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IqMS4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpKjMuNC4wLnF1YWxpZmllckA6LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlKjEuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlcioyLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSoxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZioyLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5zc2wqMS4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IqMS4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5LndpbjMyLng4NioxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUqMS4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzKjMuMi4yMDAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyLnNzbCoxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvcioxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIqMi4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSoxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eSoyLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0Ii8+Cis8c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyLnNzbCoxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyKjIuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLnNzbCoxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5lY2YqMi4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHkqMi4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4qMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyKjIuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQiLz4KIDwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvTWV0YWRhdGEgR2VuZXJhdG9yIFNESy5sYXVuY2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL01ldGFkYXRhIEdlbmVyYXRvciBTREsubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmQxOTg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IvTWV0YWRhdGEgR2VuZXJhdG9yIFNESy5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9NZXRhZGF0YSBHZW5lcmF0b3IgU0RLIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfYXV0b19zdGFydCIgdmFsdWU9ImZhbHNlIi8+Ci08aW50QXR0cmlidXRlIGtleT0iZGVmYXVsdF9zdGFydF9sZXZlbCIgdmFsdWU9IjQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iaW5jbHVkZU9wdGlvbmFsIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL2oyc2RrMS40LjJfMDgiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLWNvbnNvbGUgJiMxMzsmIzEwOy1jb25zb2xlbG9nJiMxMzsmIzEwOy1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci5FY2xpcHNlR2VuZXJhdG9yJiMxMzsmIzEwOy1tZXRhZGF0YVJlcG9zaXRvcnkgZmlsZTpDOi9lcXVpbm94LnAyL3NlcnZlcnMvJiMxMzsmIzEwOy1hcnRpZmFjdFJlcG9zaXRvcnkgZmlsZTpDOi9lcXVpbm94LnAyL3NlcnZlcnMvJiMxMzsmIzEwOy1zb3VyY2UgYzpcZWNsaXBzZVxsYXRlc3RcZWNsaXBzZSYjMTM7JiMxMDstcm9vdCBzZGsmIzEzOyYjMTA7LXJvb3RWZXJzaW9uIDMuNC4wLkkyMDA4MDIxMndpdGhjb3B5cmlnaHRsaWNlbnNlY2hhbmdlcyYjMTM7JiMxMDstZmxhdm9yIHRvb2xpbmcmIzEzOyYjMTA7LXB1Ymxpc2hBcnRpZmFjdHMmIzEzOyYjMTA7LWFwcGVuZCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0iY29tLmlibS5pY3VAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmFudC5jb3JlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmpvYnNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUubmV0QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGhAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LnJlZ2lzdHJ5QGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guYXBwQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODZAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpQDosb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvckBkZWZhdWx0OmRlZmF1bHQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VOYW1lZEpSRSIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ3b3Jrc3BhY2VfYnVuZGxlcyIgdmFsdWU9Im9yZy5hcGFjaGUueGVyY2VzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuYXBhY2hlLnhtbC5yZXNvbHZlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW5AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veEBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZG93bmxvYWRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5QGRlZmF1bHQ6ZGVmYXVsdCIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ly5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYmI3YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ly5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzgyYmE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ly5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5PC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuYXBpLnRvb2xzLmFwaUFuYWx5c2lzTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNGRmMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzI5ICswLDAgQEAKLSNGcmkgRmViIDIyIDExOjIyOjU5IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Yjc1ODBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1ODoyMiBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ly5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWEyY2E1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnk7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucyIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LmlvO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnk7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGssCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24sCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zLAotICAgb3JnLmVjbGlwc2UucGRlLnAyLnVpIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24sb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlIgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2UsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24sCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkuc3RvcmFnZSwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXI7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudXRpbDt2ZXJzaW9uPSIxLjEuMCIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIiwKLSBvcmcub3NnaS5zZXJ2aWNlLnByZWZzO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcueG1sLnNheAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkFjdGl2YXRvcgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNCwKLSBDREMtMS4xL0ZvdW5kYXRpb24tMS4xCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24sCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSwKLSBvcmcuZWNsaXBzZS5lY2Y7YnVuZGxlLXZlcnNpb249IjEuMi4wIiwKLSBvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyO2J1bmRsZS12ZXJzaW9uPSIyLjAuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaTtidW5kbGUtdmVyc2lvbj0iMy40LjAiLAotIG9yZy5lY2xpcHNlLmNvcmUuam9icztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIKLUVjbGlwc2UtQnVkZHlQb2xpY3k6IHJlZ2lzdGVyZWQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlZWJhMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgc2NoZW1hLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiMDkwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBQcm92aXNpb25pbmcgTWV0YWRhdGEgUmVwb3NpdG9yeQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjhiNjAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0ibWV0YWRhdGFSZXBvc2l0b3JpZXMiIG5hbWU9Ik1ldGFkYXRhIFJlcG9zaXRvcmllcyIgc2NoZW1hPSJzY2hlbWEvbWV0YWRhdGFSZXBvc2l0b3JpZXMuZXhzZCIvPgotICAgPGV4dGVuc2lvbiBpZD0ic2ltcGxlUmVwb3NpdG9yeSIgIHBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkubWV0YWRhdGFSZXBvc2l0b3JpZXMiPgotCQk8ZmlsdGVyIHN1ZmZpeD0iY29udGVudC54bWwiLz4KLQkJPGZhY3RvcnkgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuU2ltcGxlTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSIvPgotICAgPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NjaGVtYS9tZXRhZGF0YVJlcG9zaXRvcmllcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc2NoZW1hL21ldGFkYXRhUmVwb3NpdG9yaWVzLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MTIzOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc2NoZW1hL21ldGFkYXRhUmVwb3NpdG9yaWVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ij4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkiIGlkPSJtZXRhZGF0YVJlcG9zaXRvcmllcyIgbmFtZT0iTWV0YWRhdGEgUmVwb3NpdG9yaWVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIHVzZWQgdG8gcHJvdmlkZSBhcnRpZmFjdCByZXBvc2l0b3J5IGltcGxlbWVudGF0aW9ucwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJmYWN0b3J5Ii8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZpbHRlciIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9IjEiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIHRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgCi0mbHQ7c2FtcCZndDtvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeSZsdDsvc2FtcCZndDsuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIiBiYXNlZE9uPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJmaWx0ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzdWZmaXgiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSAwLjEuMAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgZXh0ZW5zaW9uIHBvaW50IHVzYWdlIGV4YW1wbGUgaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBjbGFzcyBhdHRyaWJ1dGUgbXVzdCByZXByZXNlbnQgYW4gCi1pbXBsZW1lbnRvciBvZiAmbHQ7dHQmZ3Q7b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnkmbHQ7L3R0Jmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBbRW50ZXIgaW5mb3JtYXRpb24gYWJvdXQgc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBleHRlbnNpb24gcG9pbnQuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggCi1hY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YSAKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOGEyNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPX1BST1ZJREVSX1hQVCA9IElEICsgJy4nICsgIm1ldGFkYXRhUmVwb3NpdG9yaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0OwotCXByaXZhdGUgc3RhdGljIENhY2hlTWFuYWdlciBjYWNoZU1hbmFnZXI7Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGJ1bmRsZUNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDYWNoZU1hbmFnZXIgZ2V0Q2FjaGVNYW5hZ2VyKCkgewotCQlyZXR1cm4gY2FjaGVNYW5hZ2VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFjdGl2YXRvci5idW5kbGVDb250ZXh0ID0gY29udGV4dDsKLQkJY2FjaGVNYW5hZ2VyID0gbmV3IENhY2hlTWFuYWdlcigpOwotCQljYWNoZU1hbmFnZXIucmVnaXN0ZXJSZXBvRXZlbnRMaXN0ZW5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGNhY2hlTWFuYWdlciAhPSBudWxsKSB7Ci0JCQljYWNoZU1hbmFnZXIudW5yZWdpc3RlclJlcG9FdmVudExpc3RlbmVyKCk7Ci0JCQljYWNoZU1hbmFnZXIgPSBudWxsOwotCQl9Ci0JCUFjdGl2YXRvci5idW5kbGVDb250ZXh0ID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0NhY2hlTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9DYWNoZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI2NzgzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0NhY2hlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLklQcm92aXNpb25pbmdFdmVudEJ1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuU3luY2hyb25vdXNQcm92aXNpb25pbmdMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24uQWdlbnRMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXZlbnQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLS8qKgotICogQSBjbGFzcyB0byBtYW5hZ2UgbWV0YWRhdGEgY2FjaGUgZmlsZXMuIENyZWF0aW5nIHRoZSBjYWNoZSBmaWxlcyB3aWxsIHBsYWNlCi0gKiB0aGUgZmlsZSBpbiB0aGUgQWdlbnREYXRhIGxvY2F0aW9uIGluIGEgY2FjaGUgZGlyZWN0b3J5LgotICogCi0gKiBVc2luZyB0aGUgYnVzIGxpc3RlbmVycyB3aWxsIGFsbG93IHRoZSBtYW5hZ2VyIHRvIGxpc3RlbiBmb3IgcmVwb3NpdG9yeQotICogZXZlbnRzLiBXaGVuIGEgcmVwb3NpdG9yeSBpcyByZW1vdmVkLCBpdCB3aWxsIHJlbW92ZSB0aGUgY2FjaGUgZmlsZSBpZiBvbmUKLSAqIHdhcyBjcmVhdGVkIGZvciB0aGUgcmVwb3NpdG9yeS4KLSAqLwotcHVibGljIGNsYXNzIENhY2hlTWFuYWdlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgU3luY2hyb25vdXNQcm92aXNpb25pbmdMaXN0ZW5lciBidXNMaXN0ZW5lcjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9GSUxFTkFNRSA9ICJjb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfRVhURU5TSU9OID0gIi5qYXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FWFRFTlNJT04gPSAiLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgYSBoYXNoIG9mIHRoZSBVUkwuCi0JICovCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZUhhc2goVVJMIHJlcG9zaXRvcnlMb2NhdGlvbikgewotCQkvL2Rvbid0IHVzZSBVUkwjaGFzaENvZGUgYmVjYXVzZSBpdCBwZXJmb3JtcyBETlMgbG9va3VwcwotCQlyZXR1cm4gcmVwb3NpdG9yeUxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbG9jYWwgY2FjaGUgZmlsZSB3aXRoIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gcmVtb3RlIGxvY2F0aW9uLAotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIGEgbG9jYWwgY2FjaGUgY291bGQgbm90IGJlIGNyZWF0ZWQuCi0JICogCi0JICogQHBhcmFtIHJlcG9zaXRvcnlMb2NhdGlvbgotCSAqIEBwYXJhbSBtb25pdG9yIC0gYSBwcm9ncmVzcyBtb25pdG9yCi0JICogQHJldHVybiBBIHtAbGluayBGaWxlfSBvYmplY3QgcG9pbnRpbmcgdG8gdGhlIGNhY2hlIGZpbGUgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiB0aGUgbG9jYXRpb24gaXMgbm90IGEgcmVwb3NpdG9yeS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBQcm92aXNpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgRmlsZSBjcmVhdGVDYWNoZShVUkwgcmVwb3NpdG9yeUxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJRmlsZSBjYWNoZUZpbGUgPSBnZXRDYWNoZShyZXBvc2l0b3J5TG9jYXRpb24pOwotCQlVUkwgamFyTG9jYXRpb24gPSBVUkxNZXRhZGF0YVJlcG9zaXRvcnkuZ2V0QWN0dWFsTG9jYXRpb24ocmVwb3NpdG9yeUxvY2F0aW9uLCBKQVJfRVhURU5TSU9OKTsKLQkJVVJMIHhtbExvY2F0aW9uID0gVVJMTWV0YWRhdGFSZXBvc2l0b3J5LmdldEFjdHVhbExvY2F0aW9uKHJlcG9zaXRvcnlMb2NhdGlvbiwgWE1MX0VYVEVOU0lPTik7Ci0JCUFnZW50TG9jYXRpb24gYWdlbnRMb2NhdGlvbiA9IChBZ2VudExvY2F0aW9uKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgQWdlbnRMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotCQlVUkwgZGF0YUFyZWEgPSBhZ2VudExvY2F0aW9uLmdldERhdGFBcmVhKEFjdGl2YXRvci5JRCArICIvY2FjaGUvIik7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZSBkYXRhQXJlYUZpbGUgPSBVUkxVdGlsLnRvRmlsZShkYXRhQXJlYSk7Ci0JCWludCBoYXNoQ29kZSA9IGNvbXB1dGVIYXNoKHJlcG9zaXRvcnlMb2NhdGlvbik7Ci0JCWlmIChjYWNoZUZpbGUgPT0gbnVsbCB8fCBpc0NhY2hlU3RhbGUocmVwb3NpdG9yeUxvY2F0aW9uLCBjYWNoZUZpbGUpKSB7Ci0JCQlsb25nIGxhc3RNb2RpZmllZFJlbW90ZSA9IGdldFRyYW5zcG9ydCgpLmdldExhc3RNb2RpZmllZChqYXJMb2NhdGlvbik7Ci0JCQlVUkwgcmVtb3RlRmlsZTsKLQkJCWlmIChsYXN0TW9kaWZpZWRSZW1vdGUgIT0gMCkgewotCQkJCWNhY2hlRmlsZSA9IG5ldyBGaWxlKGRhdGFBcmVhRmlsZSwgQ09OVEVOVF9GSUxFTkFNRSArIGhhc2hDb2RlICsgSkFSX0VYVEVOU0lPTik7Ci0JCQkJcmVtb3RlRmlsZSA9IGphckxvY2F0aW9uOwotCQkJfSBlbHNlIHsKLQkJCQlsYXN0TW9kaWZpZWRSZW1vdGUgPSBnZXRUcmFuc3BvcnQoKS5nZXRMYXN0TW9kaWZpZWQoeG1sTG9jYXRpb24pOwotCQkJCWlmIChsYXN0TW9kaWZpZWRSZW1vdGUgPT0gMCkKLQkJCQkJLy8gbm8gamFyIG9yIHhtbCBmaWxlIGZvdW5kCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWNhY2hlRmlsZSA9IG5ldyBGaWxlKGRhdGFBcmVhRmlsZSwgQ09OVEVOVF9GSUxFTkFNRSArIGhhc2hDb2RlICsgWE1MX0VYVEVOU0lPTik7Ci0JCQkJcmVtb3RlRmlsZSA9IHhtbExvY2F0aW9uOwotCQkJfQotCQkJY2FjaGVGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCU91dHB1dFN0cmVhbSBtZXRhZGF0YSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShjYWNoZUZpbGUpKTsKLQkJCXRyeSB7Ci0JCQkJSVN0YXR1cyByZXN1bHQgPSBnZXRUcmFuc3BvcnQoKS5kb3dubG9hZChyZW1vdGVGaWxlLnRvRXh0ZXJuYWxGb3JtKCksIG1ldGFkYXRhLCBtb25pdG9yKTsKLQkJCQlpZiAoIXJlc3VsdC5pc09LKCkpIHsKLQkJCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihyZXN1bHQpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJbWV0YWRhdGEuY2xvc2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2FjaGVGaWxlOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIGxvY2FsIGNhY2hlIGZpbGUgZm9yIHRoZSBnaXZlbiByZXBvc2l0b3J5Ci0JICogQHBhcmFtIHJlcG9zaXRvcnlMb2NhdGlvbgotCSAqLwotCXZvaWQgZGVsZXRlQ2FjaGUoVVJMIHJlcG9zaXRvcnlMb2NhdGlvbikgewotCQlGaWxlIGNhY2hlRmlsZSA9IGdldENhY2hlKHJlcG9zaXRvcnlMb2NhdGlvbik7Ci0JCWlmIChjYWNoZUZpbGUgIT0gbnVsbCkKLQkJCXNhZmVEZWxldGUoY2FjaGVGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHRoZSBsb2NhbCBmaWxlcGF0aCBvZiB0aGUgcmVwb3NpdG9yeSdzIGNhY2hlIGZpbGUuCi0JICogQHBhcmFtIHJlcG9zaXRvcnlMb2NhdGlvbgotCSAqIEByZXR1cm4gQSB7QGxpbmsgRmlsZX0gcG9pbnRpbmcgdG8gdGhlIGNhY2hlIGZpbGUgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGUgY2FjaGUgZmlsZSBkb2VzIG5vdCBleGlzdC4KLQkgKi8KLQlwcml2YXRlIEZpbGUgZ2V0Q2FjaGUoVVJMIHJlcG9zaXRvcnlMb2NhdGlvbikgewotCQlBZ2VudExvY2F0aW9uIGFnZW50TG9jYXRpb24gPSAoQWdlbnRMb2NhdGlvbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEFnZW50TG9jYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJVVJMIGRhdGFBcmVhID0gYWdlbnRMb2NhdGlvbi5nZXREYXRhQXJlYShBY3RpdmF0b3IuSUQgKyAiL2NhY2hlLyIpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgZGF0YUFyZWFGaWxlID0gVVJMVXRpbC50b0ZpbGUoZGF0YUFyZWEpOwotCQlpbnQgaGFzaENvZGUgPSBjb21wdXRlSGFzaChyZXBvc2l0b3J5TG9jYXRpb24pOwotCQlGaWxlIGNhY2hlRmlsZSA9IG5ldyBGaWxlKGRhdGFBcmVhRmlsZSwgQ09OVEVOVF9GSUxFTkFNRSArIGhhc2hDb2RlICsgSkFSX0VYVEVOU0lPTik7Ci0JCWlmICghY2FjaGVGaWxlLmV4aXN0cygpKSB7Ci0JCQljYWNoZUZpbGUgPSBuZXcgRmlsZShkYXRhQXJlYUZpbGUsIENPTlRFTlRfRklMRU5BTUUgKyBoYXNoQ29kZSArIFhNTF9FWFRFTlNJT04pOwotCQkJaWYgKCFjYWNoZUZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGNhY2hlRmlsZTsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRTZXJ2aWNlKEJ1bmRsZUNvbnRleHQgY3R4LCBTdHJpbmcgbmFtZSkgewotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGN0eC5nZXRTZXJ2aWNlUmVmZXJlbmNlKG5hbWUpOwotCQlpZiAocmVmZXJlbmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IHJlc3VsdCA9IGN0eC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCWN0eC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIEVDRk1ldGFkYXRhVHJhbnNwb3J0IGdldFRyYW5zcG9ydCgpIHsKLQkJcmV0dXJuIEVDRk1ldGFkYXRhVHJhbnNwb3J0LmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIHRoZSByZXBvc2l0b3J5J3MgbG9jYWwgY2FjaGUgZmlsZSBpcyBvdXQgb2YgZGF0ZS4KLQkgKiBAcGFyYW0gcmVwb3NpdG9yeUxvY2F0aW9uIFRoZSByZW1vdGUgbG9jYXRpb24gb2YgdGhlIGZpbGUKLQkgKiBAcGFyYW0gY2FjaGVGaWxlIFRoZSBjdXJyZW50IGxvY2FsIGNhY2hlIG9mIHRoZSByZW1vdGUgbG9jYXRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjYWNoZSBmaWxlIGlzIG91dCBvZiBkYXRlLCA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiBpZiB0aGUgY2FjaGUgZmlsZSBpcyBpbiBzeW5jIHdpdGggdGhlIHJlcG9zaXRvcnkuIFRoZSBjYWNoZSBmaWxlIGlzCi0JICogY29uc2lkZXJlZCBzdGFsZSBpZiB0aGVyZSBpcyBubyBsb2NhbCBjYWNoZSBmaWxlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NhY2hlU3RhbGUoVVJMIHJlcG9zaXRvcnlMb2NhdGlvbiwgRmlsZSBjYWNoZUZpbGUpIHsKLQkJbG9uZyBsYXN0TW9kaWZpZWQgPSBjYWNoZUZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCVN0cmluZyBuYW1lID0gY2FjaGVGaWxlLmdldE5hbWUoKTsKLQkJVVJMIG1ldGFkYXRhTG9jYXRpb24gPSBudWxsOwotCQlpZiAobmFtZS5lbmRzV2l0aChYTUxfRVhURU5TSU9OKSkgewotCQkJbWV0YWRhdGFMb2NhdGlvbiA9IFVSTE1ldGFkYXRhUmVwb3NpdG9yeS5nZXRBY3R1YWxMb2NhdGlvbihyZXBvc2l0b3J5TG9jYXRpb24sIFhNTF9FWFRFTlNJT04pOwotCQl9IGVsc2UgaWYgKG5hbWUuZW5kc1dpdGgoSkFSX0VYVEVOU0lPTikpIHsKLQkJCW1ldGFkYXRhTG9jYXRpb24gPSBVUkxNZXRhZGF0YVJlcG9zaXRvcnkuZ2V0QWN0dWFsTG9jYXRpb24ocmVwb3NpdG9yeUxvY2F0aW9uLCBKQVJfRVhURU5TSU9OKTsKLQkJfQotCQlsb25nIGxhc3RNb2RpZmllZFJlbW90ZSA9IDA7Ci0JCXRyeSB7Ci0JCQlsYXN0TW9kaWZpZWRSZW1vdGUgPSBnZXRUcmFuc3BvcnQoKS5nZXRMYXN0TW9kaWZpZWQobWV0YWRhdGFMb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjYWNoZSBpcyBzdGFsZQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGxhc3RNb2RpZmllZFJlbW90ZSA+IGxhc3RNb2RpZmllZCA/IHRydWUgOiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEge0BsaW5rIFN5bmNocm9ub3VzUHJvdmlzaW9uaW5nTGlzdGVuZXJ9IHRvIHRoZSBldmVudCBidXMgZm9yCi0JICogZGVsZXRpbmcgY2FjaGUgZmlsZXMgd2hlbiB0aGUgY29ycmVzcG9uZGluZyByZXBvc2l0b3J5IGlzIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJSZXBvRXZlbnRMaXN0ZW5lcigpIHsKLQkJSVByb3Zpc2lvbmluZ0V2ZW50QnVzIGV2ZW50QnVzID0gKElQcm92aXNpb25pbmdFdmVudEJ1cykgZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FKTsKLQkJaWYgKGV2ZW50QnVzID09IG51bGwpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJQcm92aXNpb25pbmdFdmVudEJ1cyBjb3VsZCBub3QgYmUgb2J0YWluZWQuIE1ldGFkYXRhIGNhY2hlcyBtYXkgbm90IGJlIGNsZWFuZWQgdXAgcHJvcGVybHkuIikpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGJ1c0xpc3RlbmVyID09IG51bGwpIHsKLQkJCWJ1c0xpc3RlbmVyID0gbmV3IFN5bmNocm9ub3VzUHJvdmlzaW9uaW5nTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5KEV2ZW50T2JqZWN0IG8pIHsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBSZXBvc2l0b3J5RXZlbnQpIHsKLQkJCQkJCVJlcG9zaXRvcnlFdmVudCBldmVudCA9IChSZXBvc2l0b3J5RXZlbnQpIG87Ci0JCQkJCQlpZiAoUmVwb3NpdG9yeUV2ZW50LlJFTU9WRUQgPT0gZXZlbnQuZ2V0S2luZCgpICYmIElSZXBvc2l0b3J5LlRZUEVfTUVUQURBVEEgPT0gZXZlbnQuZ2V0UmVwb3NpdG9yeVR5cGUoKSkgewotCQkJCQkJCWRlbGV0ZUNhY2hlKGV2ZW50LmdldFJlcG9zaXRvcnlMb2NhdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlldmVudEJ1cy5hZGRMaXN0ZW5lcihidXNMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2FmZURlbGV0ZShGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCWlmICghZmlsZS5kZWxldGUoKSkgewotCQkJCWZpbGUuZGVsZXRlT25FeGl0KCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHtAbGluayBTeW5jaHJvbm91c1Byb3Zpc2lvbmluZ0xpc3RlbmVyfSB0aGF0IGNsZWFucyB1cCB0aGUKLQkgKiBjYWNoZSBmaWxlIGZyb20gdGhlIGV2ZW50IGJ1cy4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUmVwb0V2ZW50TGlzdGVuZXIoKSB7Ci0JCUlQcm92aXNpb25pbmdFdmVudEJ1cyBldmVudEJ1cyA9IChJUHJvdmlzaW9uaW5nRXZlbnRCdXMpIGdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLlNFUlZJQ0VfTkFNRSk7Ci0JCWlmIChldmVudEJ1cyAhPSBudWxsICYmIGJ1c0xpc3RlbmVyICE9IG51bGwpIHsKLQkJCWV2ZW50QnVzLnJlbW92ZUxpc3RlbmVyKGJ1c0xpc3RlbmVyKTsKLQkJCWJ1c0xpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvRUNGTWV0YWRhdGFUcmFuc3BvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvRUNGTWV0YWRhdGFUcmFuc3BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDgxNmExOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0VDRk1ldGFkYXRhVHJhbnNwb3J0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lY2YuY29yZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVjZi5jb3JlLnNlY3VyaXR5LkNvbm5lY3RDb250ZXh0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lY2YuY29yZS5zZWN1cml0eS5JQ29ubmVjdENvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2Zlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2Zlci5pZGVudGl0eS5GaWxlQ3JlYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIuaWRlbnRpdHkuRmlsZUlERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLnNlcnZpY2UuSVJldHJpZXZlRmlsZVRyYW5zZmVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLklTZXJ2aWNlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuSVNlcnZpY2VVSS5BdXRoZW50aWNhdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS5zdG9yYWdlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7Ci0KLXB1YmxpYyBjbGFzcyBFQ0ZNZXRhZGF0YVRyYW5zcG9ydCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9SRURJUkVDVCA9ICJTZXJ2ZXIgcmVkaXJlY3RlZCB0b28gbWFueSB0aW1lcyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHBhc3N3b3JkIHJldHJ5IGF0dGVtcHRzIGFsbG93ZWQgYmVmb3JlIGZhaWxpbmcuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPR0lOX1JFVFJJRVMgPSAzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFByb3RvY29sRXhjZXB0aW9uIEVSUk9SXzQwMSA9IG5ldyBQcm90b2NvbEV4Y2VwdGlvbigpOwotCi0JLyoqCi0JICogQSBqb2IgdGhhdCB3YWl0cyBvbiBhIGJhcnJpZXIuCi0JICovCi0Jc3RhdGljIGNsYXNzIFdhaXRKb2IgZXh0ZW5kcyBKb2IgewotCQlwcml2YXRlIGZpbmFsIE9iamVjdFtdIGJhcnJpZXI7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSB3YWl0IGpvYi4KLQkJICogQHBhcmFtIGxvY2F0aW9uIEEgbG9jYXRpb24gc3RyaW5nIHRoYXQgaXMgdXNlZCBpbiB0aGUgam9iIG5hbWUKLQkJICogQHBhcmFtIGJhcnJpZXIgVGhlIGpvYiB3aWxsIHdhaXQgdW50aWwgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBiYXJyaWVyIGlzIG5vbi1udWxsCi0JCSAqLwotCQlXYWl0Sm9iKFN0cmluZyBsb2NhdGlvbiwgT2JqZWN0W10gYmFycmllcikgewotCQkJc3VwZXIoTkxTLmJpbmQoTWVzc2FnZXMucmVwb19sb2FkaW5nLCBsb2NhdGlvbikpOwotCQkJdGhpcy5iYXJyaWVyID0gYmFycmllcjsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2IjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCQkgKi8KLQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJc3luY2hyb25pemVkIChiYXJyaWVyKSB7Ci0JCQkJd2hpbGUgKGJhcnJpZXJbMF0gPT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJYmFycmllci53YWl0KCk7Ci0JCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vaWdub3JlCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSBzaW5nbGV0b24gdHJhbnNwb3J0IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEVDRk1ldGFkYXRhVHJhbnNwb3J0IGluc3RhbmNlOwotCi0JcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlVHJhY2tlciByZXRyaWV2YWxGYWN0b3J5VHJhY2tlcjsKLQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEVDRk1ldGFkYXRhVHJhbnNwb3J0IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRUNGTWV0YWRhdGFUcmFuc3BvcnQoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBFQ0ZNZXRhZGF0YVRyYW5zcG9ydCgpIHsKLQkJcmV0cmlldmFsRmFjdG9yeVRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVJldHJpZXZlRmlsZVRyYW5zZmVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCksIG51bGwpOwotCQlyZXRyaWV2YWxGYWN0b3J5VHJhY2tlci5vcGVuKCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZG93bmxvYWQoU3RyaW5nIHVybCwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCUlDb25uZWN0Q29udGV4dCBjb250ZXh0ID0gZ2V0Q29ubmVjdGlvbkNvbnRleHQodXJsLCBmYWxzZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IExPR0lOX1JFVFJJRVM7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBwZXJmb3JtRG93bmxvYWQodXJsLCBkZXN0aW5hdGlvbiwgY29udGV4dCwgbW9uaXRvcik7Ci0JCQkJfSBjYXRjaCAoUHJvdG9jb2xFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoZSA9PSBFUlJPUl80MDEpCi0JCQkJCQljb250ZXh0ID0gZ2V0Q29ubmVjdGlvbkNvbnRleHQodXJsLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFVzZXJDYW5jZWxsZWRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJLy9yZWFjaGVkIG1heGltdW0gbnVtYmVyIG9mIHJldHJpZXMgd2l0aG91dCBzdWNjZXNzCi0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfRkFJTEVEX0FVVEhFTlRJQ0FUSU9OLCBOTFMuYmluZChNZXNzYWdlcy5pb19mYWlsZWRSZWFkLCB1cmwpLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBwZXJmb3JtRG93bmxvYWQoU3RyaW5nIHRvRG93bmxvYWQsIE91dHB1dFN0cmVhbSB0YXJnZXQsIElDb25uZWN0Q29udGV4dCBjb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7Ci0JCUlSZXRyaWV2ZUZpbGVUcmFuc2ZlckZhY3RvcnkgZmFjdG9yeSA9IChJUmV0cmlldmVGaWxlVHJhbnNmZXJGYWN0b3J5KSByZXRyaWV2YWxGYWN0b3J5VHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLmlvX2ZhaWxlZFJlYWQsIHRvRG93bmxvYWQpKTsKLQkJcmV0dXJuIHRyYW5zZmVyKGZhY3RvcnkubmV3SW5zdGFuY2UoKSwgdG9Eb3dubG9hZCwgdGFyZ2V0LCBjb250ZXh0LCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUgZm9yIHRoZSBzcGVjaWZpZWQgZmlsZS4KLQkgKiBAcGFyYW0gbG9jYXRpb24gLSBUaGUgVVJMIGxvY2F0aW9uIG9mIHRoZSBmaWxlLgotCSAqIEByZXR1cm4gQSA8Y29kZT5sb25nPC9jb2RlPiByZXByZXNlbnRpbmcgdGhlIGRhdGUuIFJldHVybnMgPGNvZGU+MDwvY29kZT4gaWYgdGhlIGZpbGUgaXMgbm90IGZvdW5kIG9yIGFuIGVycm9yIG9jY3VycmVkLgotCSAqIEBleGNlcHRpb24gT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gaWYgdGhlIHJlcXVlc3Qgd2FzIGNhbmNlbGVkLgotCSAqLwotCXB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZChVUkwgbG9jYXRpb24pIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlTdHJpbmcgbG9jYXRpb25TdHJpbmcgPSBsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpOwotCQl0cnkgewotCQkJSUNvbm5lY3RDb250ZXh0IGNvbnRleHQgPSBnZXRDb25uZWN0aW9uQ29udGV4dChsb2NhdGlvblN0cmluZywgZmFsc2UpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBMT0dJTl9SRVRSSUVTOyBpKyspIHsKLQkJCQl0cnkgewotCQkJCQlyZXR1cm4gZG9HZXRMYXN0TW9kaWZpZWQobG9jYXRpb25TdHJpbmcsIGNvbnRleHQpOwotCQkJCX0gY2F0Y2ggKFByb3RvY29sRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKEVSUk9SXzQwMSA9PSBlKQotCQkJCQkJY29udGV4dCA9IGdldENvbm5lY3Rpb25Db250ZXh0KGxvY2F0aW9uU3RyaW5nLCB0cnVlKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQllLmdldE1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKFVzZXJDYW5jZWxsZWRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJLy90b28gbWFueSByZXRyaWVzLCBzbyByZXBvcnQgYXMgZmFpbHVyZQotCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfQVVUSEVOVElDQVRJT04sIE5MUy5iaW5kKE1lc3NhZ2VzLmlvX2ZhaWxlZFJlYWQsIGxvY2F0aW9uU3RyaW5nKSwgbnVsbCkpOwotCX0KLQotCS8qKgotCSAqIFBlcmZvcm0gdGhlIEVDRiBjYWxsIHRvIGdldCB0aGUgbGFzdCBtb2RpZmllZCB0aW1lLCBmYWlsaW5nIGlmIHRoZXJlIGlzIGFueQotCSAqIHByb3RvY29sIGZhaWx1cmUgc3VjaCBhcyBhbiBhdXRoZW50aWNhdGlvbiBmYWlsdXJlLgotCSAqLwotCXByaXZhdGUgbG9uZyBkb0dldExhc3RNb2RpZmllZChTdHJpbmcgbG9jYXRpb24sIElDb25uZWN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewotCQlJQ29udGFpbmVyIGNvbnRhaW5lcjsKLQkJdHJ5IHsKLQkJCWNvbnRhaW5lciA9IENvbnRhaW5lckZhY3RvcnkuZ2V0RGVmYXVsdCgpLmNyZWF0ZUNvbnRhaW5lcigpOwotCQl9IGNhdGNoIChDb250YWluZXJDcmVhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJSVJlbW90ZUZpbGVTeXN0ZW1Ccm93c2VyQ29udGFpbmVyQWRhcHRlciBhZGFwdGVyID0gKElSZW1vdGVGaWxlU3lzdGVtQnJvd3NlckNvbnRhaW5lckFkYXB0ZXIpIGNvbnRhaW5lci5nZXRBZGFwdGVyKElSZW1vdGVGaWxlU3lzdGVtQnJvd3NlckNvbnRhaW5lckFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlJUmVtb3RlRmlsZSByZW1vdGVGaWxlID0gY2hlY2tGaWxlKGFkYXB0ZXIsIGxvY2F0aW9uLCBjb250ZXh0KTsKLQkJaWYgKHJlbW90ZUZpbGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIHJlbW90ZUZpbGUuZ2V0SW5mbygpLmdldExhc3RNb2RpZmllZCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbm5lY3Rpb24gY29udGV4dCBmb3IgdGhlIGdpdmVuIFVSTC4gVGhpcyBtYXkgcHJvbXB0IHRoZQotCSAqIHVzZXIgZm9yIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgYXMgcmVxdWlyZWQuCi0JICogCi0JICogQHBhcmFtIHhtbExvY2F0aW9uIC0gdGhlIGZpbGUgbG9jYXRpb24gcmVxdWlyaW5nIGxvZ2luIGRldGFpbHMKLQkgKiBAcGFyYW0gcHJvbXB0IC0gdXNlIDxjb2RlPnRydWU8L2NvZGU+IHRvIHByb21wdCB0aGUgdXNlciBpbnN0ZWFkIG9mCi0JICogbG9va2luZyBhdCB0aGUgc2VjdXJlIHByZWZlcmVuY2Ugc3RvcmUgZm9yIGxvZ2luLCB1c2UgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogdG8gb25seSB0cnkgdGhlIHNlY3VyZSBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHRocm93cyBVc2VyQ2FuY2VsbGVkRXhjZXB0aW9uIHdoZW4gdGhlIHVzZXIgY2FuY2VscyB0aGUgbG9naW4gcHJvbXB0IAotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIGlmIHRoZSBwYXNzd29yZCBjYW5ub3QgYmUgcmVhZCBvciBzYXZlZAotCSAqIEByZXR1cm4gVGhlIGNvbm5lY3Rpb24gY29udGV4dAotCSAqLwotCXB1YmxpYyBJQ29ubmVjdENvbnRleHQgZ2V0Q29ubmVjdGlvbkNvbnRleHQoU3RyaW5nIHhtbExvY2F0aW9uLCBib29sZWFuIHByb21wdCkgdGhyb3dzIFVzZXJDYW5jZWxsZWRFeGNlcHRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUlTZWN1cmVQcmVmZXJlbmNlcyBzZWN1cmVQcmVmZXJlbmNlcyA9IFNlY3VyZVByZWZlcmVuY2VzRmFjdG9yeS5nZXREZWZhdWx0KCk7Ci0JCUlQYXRoIGhvc3RMb2NhdGlvbiA9IG5ldyBQYXRoKHhtbExvY2F0aW9uKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCVN0cmluZyBub2RlS2V5OwotCQl0cnkgewotCQkJbm9kZUtleSA9IFVSTEVuY29kZXIuZW5jb2RlKGhvc3RMb2NhdGlvbi50b1N0cmluZygpLCAiVVRGLTgiKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUyKSB7Ci0JCQkvL2ZhbGwgYmFjayB0byBkZWZhdWx0IHBsYXRmb3JtIGVuY29kaW5nCi0JCQlub2RlS2V5ID0gVVJMRW5jb2Rlci5lbmNvZGUoaG9zdExvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JCVN0cmluZyBub2RlTmFtZSA9IElSZXBvc2l0b3J5LlBSRUZFUkVOQ0VfTk9ERSArICcvJyArIG5vZGVLZXk7Ci0JCUlTZWN1cmVQcmVmZXJlbmNlcyBwcmVmTm9kZSA9IG51bGw7Ci0JCWlmIChzZWN1cmVQcmVmZXJlbmNlcy5ub2RlRXhpc3RzKG5vZGVOYW1lKSkKLQkJCXByZWZOb2RlID0gc2VjdXJlUHJlZmVyZW5jZXMubm9kZShub2RlTmFtZSk7Ci0JCWlmICghcHJvbXB0KSB7Ci0JCQlpZiAocHJlZk5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIHVzZXJuYW1lID0gcHJlZk5vZGUuZ2V0KElSZXBvc2l0b3J5LlBST1BfVVNFUk5BTUUsIG51bGwpOwotCQkJCVN0cmluZyBwYXNzd29yZCA9IHByZWZOb2RlLmdldChJUmVwb3NpdG9yeS5QUk9QX1BBU1NXT1JELCBudWxsKTsKLQkJCQkvL2lmIHdlIGRvbid0IGhhdmUgc3RvcmVkIGNvbm5lY3Rpb24gZGF0YSBqdXN0IHJldHVybiBhIG51bGwgY29ubmVjdGlvbiBjb250ZXh0Ci0JCQkJaWYgKHVzZXJuYW1lID09IG51bGwgfHwgcGFzc3dvcmQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJcmV0dXJuIENvbm5lY3RDb250ZXh0RmFjdG9yeS5jcmVhdGVVc2VybmFtZVBhc3N3b3JkQ29ubmVjdENvbnRleHQodXNlcm5hbWUsIHBhc3N3b3JkKTsKLQkJCX0gY2F0Y2ggKFN0b3JhZ2VFeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5yZXBvTWFuX2ludGVybmFsRXJyb3IsIHhtbExvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgbXNnLCBudWxsKSk7Ci0JCQl9Ci0JCX0KLQkJLy9uZWVkIHRvIHByb21wdCB1c2VyIGZvciB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkCi0JCVNlcnZpY2VUcmFja2VyIGFkbWluVUlUcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElTZXJ2aWNlVUkuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLQkJYWRtaW5VSVRyYWNrZXIub3BlbigpOwotCQlJU2VydmljZVVJIGFkbWluVUlTZXJ2aWNlID0gKElTZXJ2aWNlVUkpIGFkbWluVUlUcmFja2VyLmdldFNlcnZpY2UoKTsKLQkJQXV0aGVudGljYXRpb25JbmZvIGxvZ2luRGV0YWlscyA9IG51bGw7Ci0JCWlmIChhZG1pblVJU2VydmljZSAhPSBudWxsKQotCQkJbG9naW5EZXRhaWxzID0gYWRtaW5VSVNlcnZpY2UuZ2V0VXNlcm5hbWVQYXNzd29yZChob3N0TG9jYXRpb24udG9TdHJpbmcoKSk7Ci0JCS8vbnVsbCByZXN1bHQgbWVhbnMgdXNlciBjYW5jZWxlZCBwYXNzd29yZCBkaWFsb2cKLQkJaWYgKGxvZ2luRGV0YWlscyA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFVzZXJDYW5jZWxsZWRFeGNlcHRpb24oKTsKLQkJLy9zYXZlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgaWYgcmVxdWVzdGVkIGJ5IHVzZXIKLQkJaWYgKGxvZ2luRGV0YWlscy5zYXZlUmVzdWx0KCkpIHsKLQkJCWlmIChwcmVmTm9kZSA9PSBudWxsKQotCQkJCXByZWZOb2RlID0gc2VjdXJlUHJlZmVyZW5jZXMubm9kZShub2RlTmFtZSk7Ci0JCQl0cnkgewotCQkJCXByZWZOb2RlLnB1dChJUmVwb3NpdG9yeS5QUk9QX1VTRVJOQU1FLCBsb2dpbkRldGFpbHMuZ2V0VXNlck5hbWUoKSwgdHJ1ZSk7Ci0JCQkJcHJlZk5vZGUucHV0KElSZXBvc2l0b3J5LlBST1BfUEFTU1dPUkQsIGxvZ2luRGV0YWlscy5nZXRQYXNzd29yZCgpLCB0cnVlKTsKLQkJCQlwcmVmTm9kZS5mbHVzaCgpOwotCQkJfSBjYXRjaCAoU3RvcmFnZUV4Y2VwdGlvbiBlMSkgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5yZXBvTWFuX2ludGVybmFsRXJyb3IsIHhtbExvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgbXNnLCBudWxsKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLnJlcG9NYW5faW50ZXJuYWxFcnJvciwgeG1sTG9jYXRpb24udG9TdHJpbmcoKSk7Ci0JCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCBtc2csIG51bGwpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29ubmVjdENvbnRleHRGYWN0b3J5LmNyZWF0ZVVzZXJuYW1lUGFzc3dvcmRDb25uZWN0Q29udGV4dChsb2dpbkRldGFpbHMuZ2V0VXNlck5hbWUoKSwgbG9naW5EZXRhaWxzLmdldFBhc3N3b3JkKCkpOwotCX0KLQotCXByaXZhdGUgSVJlbW90ZUZpbGUgY2hlY2tGaWxlKGZpbmFsIElSZW1vdGVGaWxlU3lzdGVtQnJvd3NlckNvbnRhaW5lckFkYXB0ZXIgcmV0cmlldmFsQ29udGFpbmVyLCBmaW5hbCBTdHJpbmcgbG9jYXRpb24sIElDb25uZWN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewotCQlmaW5hbCBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzJdOwotCQlmaW5hbCBPYmplY3QgRkFJTCA9IG5ldyBPYmplY3QoKTsKLQkJSVJlbW90ZUZpbGVTeXN0ZW1MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJUmVtb3RlRmlsZVN5c3RlbUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlUmVtb3RlRmlsZUV2ZW50KElSZW1vdGVGaWxlU3lzdGVtRXZlbnQgZXZlbnQpIHsKLQkJCQlFeGNlcHRpb24gZXhjZXB0aW9uID0gZXZlbnQuZ2V0RXhjZXB0aW9uKCk7Ci0JCQkJaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXN5bmNocm9uaXplZCAocmVzdWx0KSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBGQUlMOwotCQkJCQkJcmVzdWx0WzFdID0gZXhjZXB0aW9uOwotCQkJCQkJcmVzdWx0Lm5vdGlmeSgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmIChldmVudCBpbnN0YW5jZW9mIElSZW1vdGVGaWxlU3lzdGVtQnJvd3NlRXZlbnQpIHsKLQkJCQkJSVJlbW90ZUZpbGVTeXN0ZW1Ccm93c2VFdmVudCBmc2JlID0gKElSZW1vdGVGaWxlU3lzdGVtQnJvd3NlRXZlbnQpIGV2ZW50OwotCQkJCQlJUmVtb3RlRmlsZVtdIHJlbW90ZUZpbGVzID0gZnNiZS5nZXRSZW1vdGVGaWxlcygpOwotCQkJCQlpZiAocmVtb3RlRmlsZXMgIT0gbnVsbCAmJiByZW1vdGVGaWxlcy5sZW5ndGggPiAwICYmIHJlbW90ZUZpbGVzWzBdICE9IG51bGwpIHsKLQkJCQkJCXN5bmNocm9uaXplZCAocmVzdWx0KSB7Ci0JCQkJCQkJcmVzdWx0WzBdID0gcmVtb3RlRmlsZXNbMF07Ci0JCQkJCQkJcmVzdWx0Lm5vdGlmeSgpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJc3luY2hyb25pemVkIChyZXN1bHQpIHsKLQkJCQkJCQlyZXN1bHRbMF0gPSBGQUlMOwotCQkJCQkJCXJlc3VsdC5ub3RpZnkoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJdHJ5IHsKLQkJCXJldHJpZXZhbENvbnRhaW5lci5zZXRDb25uZWN0Q29udGV4dEZvckF1dGhlbnRpY2F0aW9uKGNvbnRleHQpOwotCQkJcmV0cmlldmFsQ29udGFpbmVyLnNlbmRCcm93c2VSZXF1ZXN0KEZpbGVJREZhY3RvcnkuZ2V0RGVmYXVsdCgpLmNyZWF0ZUZpbGVJRChyZXRyaWV2YWxDb250YWluZXIuZ2V0QnJvd3NlTmFtZXNwYWNlKCksIGxvY2F0aW9uKSwgbGlzdGVuZXIpOwotCQl9IGNhdGNoIChSZW1vdGVGaWxlU3lzdGVtRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IGNhdGNoIChGaWxlQ3JlYXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXdhaXRGb3IobG9jYXRpb24sIHJlc3VsdCk7Ci0JCWlmIChyZXN1bHRbMF0gPT0gRkFJTCAmJiByZXN1bHRbMV0gaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotCQkJSU9FeGNlcHRpb24gaW9FeGNlcHRpb24gPSAoSU9FeGNlcHRpb24pIHJlc3VsdFsxXTsKLQkJCS8vdGhyb3cgYSBzcGVjaWFsIGV4Y2VwdGlvbiBmb3IgYXV0aGVudGljYXRpb24gZmFpbHVyZSBzbyB3ZSBrbm93IHRvIHByb21wdCBmb3IgdXNlcm5hbWUvcGFzc3dvcmQKLQkJCVN0cmluZyBtZXNzYWdlID0gaW9FeGNlcHRpb24uZ2V0TWVzc2FnZSgpOwotCQkJaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiAobWVzc2FnZS5pbmRleE9mKCIgNDAxICIpICE9IC0xIHx8IG1lc3NhZ2UuaW5kZXhPZihTRVJWRVJfUkVESVJFQ1QpICE9IC0xKSkgLy8kTk9OLU5MUy0xJAotCQkJCXRocm93IEVSUk9SXzQwMTsKLQkJfQotCQlpZiAocmVzdWx0WzBdIGluc3RhbmNlb2YgSVJlbW90ZUZpbGUpCi0JCQlyZXR1cm4gKElSZW1vdGVGaWxlKSByZXN1bHRbMF07Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFdhaXRzIHVudGlsIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgZ2l2ZW4gYXJyYXkgaXMgbm9uLW51bGwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRGb3IoU3RyaW5nIGxvY2F0aW9uLCBPYmplY3RbXSBiYXJyaWVyKSB7Ci0JCVdhaXRKb2Igd2FpdCA9IG5ldyBXYWl0Sm9iKGxvY2F0aW9uLCBiYXJyaWVyKTsKLQkJd2FpdC5zY2hlZHVsZSgpOwotCQl3aGlsZSAoYmFycmllclswXSA9PSBudWxsKSB7Ci0JCQlib29sZWFuIGxvZ2dlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQl3YWl0LmpvaW4oKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoIWxvZ2dlZCkKLQkJCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQWN0aXZhdG9yLklELCAiVW5leHBlY3RlZCBpbnRlcnJ1cHQgd2hpbGUgd2FpdGluZyBvbiBFQ0YgdHJhbnNmZXIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgSVN0YXR1cyB0cmFuc2ZlcihmaW5hbCBJUmV0cmlldmVGaWxlVHJhbnNmZXJDb250YWluZXJBZGFwdGVyIHJldHJpZXZhbENvbnRhaW5lciwgZmluYWwgU3RyaW5nIHRvRG93bmxvYWQsIGZpbmFsIE91dHB1dFN0cmVhbSB0YXJnZXQsIElDb25uZWN0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIElTdGF0dXNbXSByZXN1bHQgPSBuZXcgSVN0YXR1c1sxXTsKLQkJSUZpbGVUcmFuc2Zlckxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElGaWxlVHJhbnNmZXJMaXN0ZW5lcigpIHsKLQotCQkJcHVibGljIHZvaWQgaGFuZGxlVHJhbnNmZXJFdmVudChJRmlsZVRyYW5zZmVyRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlU3RhcnRFdmVudCkgewotCQkJCQlJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlU3RhcnRFdmVudCByc2UgPSAoSUluY29taW5nRmlsZVRyYW5zZmVyUmVjZWl2ZVN0YXJ0RXZlbnQpIGV2ZW50OwotCQkJCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcnNlLnJlY2VpdmUodGFyZ2V0KTsKLQkJCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNvbnZlcnRUb1N0YXR1cyhlKTsKLQkJCQkJCQlzeW5jaHJvbml6ZWQgKHJlc3VsdCkgewotCQkJCQkJCQlyZXN1bHRbMF0gPSBzdGF0dXM7Ci0JCQkJCQkJCXJlc3VsdC5ub3RpZnkoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgSUluY29taW5nRmlsZVRyYW5zZmVyUmVjZWl2ZURhdGFFdmVudCkgewotCQkJCQlJSW5jb21pbmdGaWxlVHJhbnNmZXIgc291cmNlID0gKChJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlRGF0YUV2ZW50KSBldmVudCkuZ2V0U291cmNlKCk7Ci0JCQkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKLQkJCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCQlzb3VyY2UuY2FuY2VsKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgSUluY29taW5nRmlsZVRyYW5zZmVyUmVjZWl2ZURvbmVFdmVudCkgewotCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNvbnZlcnRUb1N0YXR1cygoKElJbmNvbWluZ0ZpbGVUcmFuc2ZlclJlY2VpdmVEb25lRXZlbnQpIGV2ZW50KS5nZXRFeGNlcHRpb24oKSk7Ci0JCQkJCXN5bmNocm9uaXplZCAocmVzdWx0KSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBzdGF0dXM7Ci0JCQkJCQlyZXN1bHQubm90aWZ5KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJdHJ5IHsKLQkJCXJldHJpZXZhbENvbnRhaW5lci5zZXRDb25uZWN0Q29udGV4dEZvckF1dGhlbnRpY2F0aW9uKGNvbnRleHQpOwotCQkJcmV0cmlldmFsQ29udGFpbmVyLnNlbmRSZXRyaWV2ZVJlcXVlc3QoRmlsZUlERmFjdG9yeS5nZXREZWZhdWx0KCkuY3JlYXRlRmlsZUlEKHJldHJpZXZhbENvbnRhaW5lci5nZXRSZXRyaWV2ZU5hbWVzcGFjZSgpLCB0b0Rvd25sb2FkKSwgbGlzdGVuZXIsIG51bGwpOwotCQl9IGNhdGNoIChJbmNvbWluZ0ZpbGVUcmFuc2ZlckV4Y2VwdGlvbiBlKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9IGUuZ2V0U3RhdHVzKCk7Ci0JCQlUaHJvd2FibGUgZXhjZXB0aW9uID0gc3RhdHVzLmdldEV4Y2VwdGlvbigpOwotCQkJaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2UgPSBleGNlcHRpb24uZ2V0TWVzc2FnZSgpOwotCQkJCWlmIChtZXNzYWdlICE9IG51bGwgJiYgKG1lc3NhZ2UuaW5kZXhPZigiNDAxIikgIT0gLTEgfHwgbWVzc2FnZS5pbmRleE9mKFNFUlZFUl9SRURJUkVDVCkgIT0gLTEpKSAvLyROT04tTkxTLTEkCi0JCQkJCXRocm93IEVSUk9SXzQwMTsKLQkJCX0KLQkJCXJldHVybiBzdGF0dXM7Ci0JCX0gY2F0Y2ggKEZpbGVDcmVhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCX0KLQkJd2FpdEZvcih0b0Rvd25sb2FkLCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGNvbnZlcnRUb1N0YXR1cyhFeGNlcHRpb24gZSkgewotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCWlmIChlIGluc3RhbmNlb2YgVXNlckNhbmNlbGxlZEV4Y2VwdGlvbikKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuQ0FOQ0VMLCBBY3RpdmF0b3IuSUQsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9Mb2NhbE1ldGFkYXRhUmVwb3NpdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9Mb2NhbE1ldGFkYXRhUmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTA0MGJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvTG9jYWxNZXRhZGF0YVJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgUHJhc2hhbnQgRGV2YSAtIEJ1ZyAxOTQ2NzQgW3Byb3ZdIFByb3ZpZGUgd3JpdGUgYWNjZXNzIHRvIG1ldGFkYXRhIHJlcG9zaXRvcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuSVByb3Zpc2lvbmluZ0V2ZW50QnVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeS5BYnN0cmFjdE1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LlJlcG9zaXRvcnlSZWZlcmVuY2U7Ci0KLS8qKgotICogQSBtZXRhZGF0YSByZXBvc2l0b3J5IHRoYXQgcmVzaWRlcyBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uICBJZiB0aGUgcmVwb3NpdG9yeQotICogbG9jYXRpb24gaXMgYSBkaXJlY3RvcnksIHRoaXMgaW1wbGVtZW50YXRpb24gd2lsbCB0cmF2ZXJzZSB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZQotICogYW5kIGNvbWJpbmUgYW55IG1ldGFkYXRhIHJlcG9zaXRvcnkgZmlsZXMgdGhhdCBhcmUgZm91bmQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbE1ldGFkYXRhUmVwb3NpdG9yeSBleHRlbmRzIEFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5IHsKLQotCXN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBDT05URU5UX0ZJTEVOQU1FID0gImNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIFJFUE9TSVRPUllfVFlQRSA9IExvY2FsTWV0YWRhdGFSZXBvc2l0b3J5LmNsYXNzLmdldE5hbWUoKTsKLQlzdGF0aWMgZmluYWwgcHJpdmF0ZSBJbnRlZ2VyIFJFUE9TSVRPUllfVkVSU0lPTiA9IG5ldyBJbnRlZ2VyKDEpOwotCXN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBKQVJfRVhURU5TSU9OID0gIi5qYXIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIFhNTF9FWFRFTlNJT04gPSAiLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBIYXNoU2V0IHVuaXRzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQlwcm90ZWN0ZWQgSGFzaFNldCByZXBvc2l0b3JpZXMgPSBuZXcgSGFzaFNldCgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRBY3R1YWxMb2NhdGlvbihVUkwgbG9jYXRpb24sIFN0cmluZyBleHRlbnNpb24pIHsKLQkJU3RyaW5nIHNwZWMgPSBsb2NhdGlvbi5nZXRGaWxlKCk7Ci0JCWlmIChzcGVjLmVuZHNXaXRoKENPTlRFTlRfRklMRU5BTUUgKyBleHRlbnNpb24pKQotCQkJcmV0dXJuIG5ldyBGaWxlKHNwZWMgKyBleHRlbnNpb24pOwotCQlpZiAoc3BlYy5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQlzcGVjICs9IENPTlRFTlRfRklMRU5BTUU7Ci0JCWVsc2UKLQkJCXNwZWMgKz0gIi8iICsgQ09OVEVOVF9GSUxFTkFNRTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IEZpbGUoc3BlYyArIGV4dGVuc2lvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldEFjdHVhbExvY2F0aW9uKFVSTCBsb2NhdGlvbikgewotCQlyZXR1cm4gZ2V0QWN0dWFsTG9jYXRpb24obG9jYXRpb24sIFhNTF9FWFRFTlNJT04pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbm8gYXJndW1lbnQgY29uc3RydWN0b3IgaXMgY2FsbGVkIHdoZW4gcmVzdG9yaW5nIGFuIGV4aXN0aW5nIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIExvY2FsTWV0YWRhdGFSZXBvc2l0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIGEgbmV3IGxvY2FsIHJlcG9zaXRvcnkuCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeQotCSAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSByZXBvc2l0b3J5Ci0JICovCi0JcHVibGljIExvY2FsTWV0YWRhdGFSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgU3RyaW5nIG5hbWUsIE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyKG5hbWUgPT0gbnVsbCA/IChsb2NhdGlvbiAhPSBudWxsID8gbG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSA6ICIiKSA6IG5hbWUsIFJFUE9TSVRPUllfVFlQRSwgUkVQT1NJVE9SWV9WRVJTSU9OLnRvU3RyaW5nKCksIGxvY2F0aW9uLCBudWxsLCBudWxsLCBwcm9wZXJ0aWVzKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIWxvY2F0aW9uLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgbG9jYWwgcmVwb3NpdG9yeSBsb2NhdGlvbjogIiArIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkvL3doZW4gY3JlYXRpbmcgYSByZXBvc2l0b3J5LCB3ZSBtdXN0IGVuc3VyZSBpdCBleGlzdHMgb24gZGlzayBzbyBhIHN1YnNlcXVlbnQgbG9hZCB3aWxsIHN1Y2NlZWQKLQkJc2F2ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEluc3RhbGxhYmxlVW5pdHMoSUluc3RhbGxhYmxlVW5pdFtdIGluc3RhbGxhYmxlVW5pdHMpIHsKLQkJaWYgKGluc3RhbGxhYmxlVW5pdHMgPT0gbnVsbCB8fCBpbnN0YWxsYWJsZVVuaXRzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQl1bml0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChpbnN0YWxsYWJsZVVuaXRzKSk7Ci0JCXNhdmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2UoVVJMIHJlcG9zaXRvcnlMb2NhdGlvbiwgaW50IHJlcG9zaXRvcnlUeXBlLCBpbnQgb3B0aW9ucykgewotCQlhc3NlcnRNb2RpZmlhYmxlKCk7Ci0JCXJlcG9zaXRvcmllcy5hZGQobmV3IFJlcG9zaXRvcnlSZWZlcmVuY2UocmVwb3NpdG9yeUxvY2F0aW9uLCByZXBvc2l0b3J5VHlwZSwgb3B0aW9ucykpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoUmVwb3NpdG9yeVN0YXRlIHN0YXRlKSB7Ci0JCXRoaXMubmFtZSA9IHN0YXRlLk5hbWU7Ci0JCXRoaXMudHlwZSA9IHN0YXRlLlR5cGU7Ci0JCXRoaXMudmVyc2lvbiA9IHN0YXRlLlZlcnNpb24udG9TdHJpbmcoKTsKLQkJdGhpcy5wcm92aWRlciA9IHN0YXRlLlByb3ZpZGVyOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gc3RhdGUuRGVzY3JpcHRpb247Ci0JCXRoaXMubG9jYXRpb24gPSBzdGF0ZS5Mb2NhdGlvbjsKLQkJdGhpcy5wcm9wZXJ0aWVzID0gc3RhdGUuUHJvcGVydGllczsKLQkJdGhpcy51bml0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5Vbml0cykpOwotCQl0aGlzLnJlcG9zaXRvcmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5SZXBvc2l0b3JpZXMpKTsKLQkJcHVibGlzaFJlcG9zaXRvcnlSZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogQnJvYWRjYXN0IGRpc2NvdmVyeSBldmVudHMgZm9yIGFsbCByZXBvc2l0b3JpZXMgcmVmZXJlbmNlZCBieSB0aGlzIHJlcG9zaXRvcnkuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHB1Ymxpc2hSZXBvc2l0b3J5UmVmZXJlbmNlcygpIHsKLQkJSVByb3Zpc2lvbmluZ0V2ZW50QnVzIGJ1cyA9IChJUHJvdmlzaW9uaW5nRXZlbnRCdXMpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FKTsKLQkJaWYgKGJ1cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVwb3NpdG9yaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCVJlcG9zaXRvcnlSZWZlcmVuY2UgcmVmZXJlbmNlID0gKFJlcG9zaXRvcnlSZWZlcmVuY2UpIGl0Lm5leHQoKTsKLQkJCWJvb2xlYW4gaXNFbmFibGVkID0gKHJlZmVyZW5jZS5PcHRpb25zICYgSVJlcG9zaXRvcnkuRU5BQkxFRCkgIT0gMDsKLQkJCWJ1cy5wdWJsaXNoRXZlbnQobmV3IFJlcG9zaXRvcnlFdmVudChyZWZlcmVuY2UuTG9jYXRpb24sIHJlZmVyZW5jZS5UeXBlLCBSZXBvc2l0b3J5RXZlbnQuRElTQ09WRVJFRCwgaXNFbmFibGVkKSk7Ci0JCX0KLQl9Ci0KLQkvLyB1c2UgdGhpcyBtZXRob2QgdG8gc2V0dXAgYW55IHRyYW5zaWVudCBmaWVsZHMgZXRjIGFmdGVyIHRoZSBvYmplY3QgaGFzIGJlZW4gcmVzdG9yZWQgZnJvbSBhIHN0cmVhbQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVBZnRlckxvYWQoVVJMIGFMb2NhdGlvbikgewotCQl0aGlzLmxvY2F0aW9uID0gYUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIENvbGxlY3RvciBxdWVyeShRdWVyeSBxdWVyeSwgQ29sbGVjdG9yIGNvbGxlY3RvciwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBxdWVyeS5wZXJmb3JtKHVuaXRzLml0ZXJhdG9yKCksIGNvbGxlY3Rvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotCQl1bml0cy5jbGVhcigpOwotCQlzYXZlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSW5zdGFsbGFibGVVbml0cyhRdWVyeSBxdWVyeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdW5pdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCWlmIChxdWVyeS5pc01hdGNoKGl0Lm5leHQoKSkpIHsKLQkJCQlpdC5yZW1vdmUoKTsKLQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCX0KLQkJaWYgKGNoYW5nZWQpCi0JCQlzYXZlKCk7Ci0JCXJldHVybiBjaGFuZ2VkOwotCX0KLQotCXB1YmxpYyB2b2lkIHJldmVydFRvQmFja3VwKExvY2FsTWV0YWRhdGFSZXBvc2l0b3J5IGJhY2t1cCkgewotCQluYW1lID0gYmFja3VwLm5hbWU7Ci0JCXR5cGUgPSBiYWNrdXAudHlwZTsKLQkJdmVyc2lvbiA9IGJhY2t1cC52ZXJzaW9uOwotCQlsb2NhdGlvbiA9IGJhY2t1cC5sb2NhdGlvbjsKLQkJZGVzY3JpcHRpb24gPSBiYWNrdXAuZGVzY3JpcHRpb247Ci0JCXByb3ZpZGVyID0gYmFja3VwLnByb3ZpZGVyOwotCQlwcm9wZXJ0aWVzID0gYmFja3VwLnByb3BlcnRpZXM7Ci0JCXVuaXRzID0gYmFja3VwLnVuaXRzOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlKCkgewotCQlGaWxlIGZpbGUgPSBnZXRBY3R1YWxMb2NhdGlvbihsb2NhdGlvbik7Ci0JCUZpbGUgamFyRmlsZSA9IGdldEFjdHVhbExvY2F0aW9uKGxvY2F0aW9uLCBKQVJfRVhURU5TSU9OKTsKLQkJYm9vbGVhbiBjb21wcmVzcyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KFBST1BfQ09NUFJFU1NFRCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbnVsbDsKLQkJCWlmICghY29tcHJlc3MpIHsKLQkJCQlpZiAoamFyRmlsZS5leGlzdHMoKSkgewotCQkJCQlqYXJGaWxlLmRlbGV0ZSgpOwotCQkJCX0KLQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJaWYgKCFmaWxlLmdldFBhcmVudEZpbGUoKS5leGlzdHMoKSkKLQkJCQkJCWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCQkJCQlmaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQl9Ci0JCQkJb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSk7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCWZpbGUuZGVsZXRlKCk7Ci0JCQkJfQotCQkJCWlmICghamFyRmlsZS5leGlzdHMoKSkgewotCQkJCQlpZiAoIWphckZpbGUuZ2V0UGFyZW50RmlsZSgpLmV4aXN0cygpKQotCQkJCQkJamFyRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQkJCWphckZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJCX0KLQkJCQlKYXJFbnRyeSBqYXJFbnRyeSA9IG5ldyBKYXJFbnRyeShmaWxlLmdldE5hbWUoKSk7Ci0JCQkJSmFyT3V0cHV0U3RyZWFtIGpPdXRwdXQgPSBuZXcgSmFyT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGphckZpbGUpKTsKLQkJCQlqT3V0cHV0LnB1dE5leHRFbnRyeShqYXJFbnRyeSk7Ci0JCQkJb3V0cHV0ID0gak91dHB1dDsKLQkJCX0KLQkJCXN1cGVyLnNldFByb3BlcnR5KElSZXBvc2l0b3J5LlBST1BfVElNRVNUQU1QLCBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7Ci0JCQluZXcgTWV0YWRhdGFSZXBvc2l0b3J5SU8oKS53cml0ZSh0aGlzLCBvdXRwdXQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfV1JJVEUsICJFcnJvciBzYXZpbmcgbWV0YWRhdGEgcmVwb3NpdG9yeTogIiArIGxvY2F0aW9uLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCVN0cmluZyBvbGRWYWx1ZSA9IHN1cGVyLnNldFByb3BlcnR5KGtleSwgbmV3VmFsdWUpOwotCQlpZiAob2xkVmFsdWUgPT0gbmV3VmFsdWUgfHwgKG9sZFZhbHVlICE9IG51bGwgJiYgb2xkVmFsdWUuZXF1YWxzKG5ld1ZhbHVlKSkpCi0JCQlyZXR1cm4gb2xkVmFsdWU7Ci0JCXNhdmUoKTsKLQkJLy9mb3JjZSByZXBvc2l0b3J5IG1hbmFnZXIgdG8gcmVsb2FkIHRoaXMgcmVwb3NpdG9yeSBiZWNhdXNlIGl0IGNhY2hlcyBwcm9wZXJ0aWVzCi0JCU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKG1hbmFnZXIucmVtb3ZlUmVwb3NpdG9yeShnZXRMb2NhdGlvbigpKSkKLQkJCW1hbmFnZXIuYWRkUmVwb3NpdG9yeSh0aGlzKTsKLQkJcmV0dXJuIG9sZFZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkZDhjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Lm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGVzCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBpb19mYWlsZWRSZWFkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlvX0luY29tcGF0aWJsZVZlcnNpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaW9fcGFyc2VFcnJvcjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9fbG9hZGluZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9NYW5fYWRkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9NYW5fZXhpc3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcG9NYW5fZmFpbGVkUmVhZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvTWFuX2ludGVybmFsRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb01hbl9ub3RFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb01hbl91bmtub3duVHlwZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZXBvTWFuX2ludmFsaWRMb2NhdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9NZXRhZGF0YVJlcG9zaXRvcnlJTy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9NZXRhZGF0YVJlcG9zaXRvcnlJTy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjJmMzAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvTWV0YWRhdGFSZXBvc2l0b3J5SU8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgUHJhc2hhbnQgRGV2YSAtIEJ1ZyAxOTQ2NzQgW3Byb3ZdIFByb3ZpZGUgd3JpdGUgYWNjZXNzIHRvIG1ldGFkYXRhIHJlcG9zaXRvcnkKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLk9yZGVyZWRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5pby5NZXRhZGF0YVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuaW8uTWV0YWRhdGFXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wZXJzaXN0ZW5jZS5YTUxXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuUmVwb3NpdG9yeVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5LlJlcG9zaXRvcnlTdGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGFuZCB3cml0ZXMgcHJvdmlzaW9uaW5nIG1ldGFkYXRhLgotICovCi1wdWJsaWMgY2xhc3MgTWV0YWRhdGFSZXBvc2l0b3J5SU8gewotCi0JLyoqCi0JICogUmVhZHMgbWV0YWRhdGEgZnJvbSB0aGUgZ2l2ZW4gc3RyZWFtLCBhbmQgcmV0dXJucyB0aGUgY29udGFpbmVkIGFycmF5Ci0JICogb2YgYWJzdHJhY3QgbWV0YWRhdGEgcmVwb3NpdG9yaWVzLgotCSAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIGJ1ZmZlcmluZywgYW5kIGNsb3NlcyB0aGUgc3RyZWFtIHdoZW4gZmluaXNoZWQuCi0JICovCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgcmVhZChVUkwgbG9jYXRpb24sIElucHV0U3RyZWFtIGlucHV0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlCdWZmZXJlZElucHV0U3RyZWFtIGJ1ZmZlcmVkSW5wdXQgPSBudWxsOwotCQl0cnkgewotCQkJdHJ5IHsKLQkJCQlidWZmZXJlZElucHV0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXQpOwotCi0JCQkJUGFyc2VyIHJlcG9zaXRvcnlQYXJzZXIgPSBuZXcgUGFyc2VyKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEFjdGl2YXRvci5JRCk7Ci0JCQkJcmVwb3NpdG9yeVBhcnNlci5wYXJzZShpbnB1dCwgbW9uaXRvcik7Ci0JCQkJSVN0YXR1cyByZXN1bHQgPSByZXBvc2l0b3J5UGFyc2VyLmdldFN0YXR1cygpOwotCQkJCXN3aXRjaCAocmVzdWx0LmdldFNldmVyaXR5KCkpIHsKLQkJCQkJY2FzZSBJU3RhdHVzLkNBTkNFTCA6Ci0JCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQkJY2FzZSBJU3RhdHVzLkVSUk9SIDoKLQkJCQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24ocmVzdWx0KTsKLQkJCQkJY2FzZSBJU3RhdHVzLldBUk5JTkcgOgotCQkJCQljYXNlIElTdGF0dXMuSU5GTyA6Ci0JCQkJCQlMb2dIZWxwZXIubG9nKHJlc3VsdCk7Ci0JCQkJfQotCQkJCXJldHVybiByZXBvc2l0b3J5UGFyc2VyLmdldFJlcG9zaXRvcnkoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGJ1ZmZlcmVkSW5wdXQgIT0gbnVsbCkKLQkJCQkJYnVmZmVyZWRJbnB1dC5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5pb19mYWlsZWRSZWFkLCBsb2NhdGlvbik7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfUkVBRCwgbXNnLCBpb2UpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlPdXRwdXRTdHJlYW0gYnVmZmVyZWRPdXRwdXQgPSBudWxsOwotCQl0cnkgewotCQkJYnVmZmVyZWRPdXRwdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0cHV0KTsKLQkJCVdyaXRlciByZXBvc2l0b3J5V3JpdGVyID0gbmV3IFdyaXRlcihidWZmZXJlZE91dHB1dCwgcmVwb3NpdG9yeS5nZXRDbGFzcygpKTsKLQkJCXJlcG9zaXRvcnlXcml0ZXIud3JpdGUocmVwb3NpdG9yeSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYnVmZmVyZWRPdXRwdXQgIT0gbnVsbCkgewotCQkJCWJ1ZmZlcmVkT3V0cHV0LmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludGVyZmFjZSBYTUxDb25zdGFudHMgZXh0ZW5kcyBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuaW8uWE1MQ29uc3RhbnRzIHsKLQotCQkvLyBDb25zdGFudHMgZGVmaW5pbmcgdGhlIHN0cnVjdHVyZSBvZiB0aGUgWE1MIGZvciBhIE1ldGFkYXRhUmVwb3NpdG9yeQotCi0JCS8vIEEgZm9ybWF0IHZlcnNpb24gbnVtYmVyIGZvciBtZXRhZGF0YSByZXBvc2l0b3J5IFhNTC4KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1ZFUlNJT04gPSAiMS4wLjAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgVmVyc2lvbiBDVVJSRU5UX1ZFUlNJT04gPSBuZXcgVmVyc2lvbihYTUxfVkVSU0lPTik7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgVmVyc2lvblJhbmdlIFhNTF9UT0xFUkFOQ0UgPSBuZXcgVmVyc2lvblJhbmdlKENVUlJFTlRfVkVSU0lPTiwgdHJ1ZSwgbmV3IFZlcnNpb24oMiwgMCwgMCksIGZhbHNlKTsKLQotCQkvLyBDb25zdGFudHMgZm9yIHByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb25zCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX1JFUE9TSVRPUllfVEFSR0VUID0gIm1ldGFkYXRhUmVwb3NpdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBDb25zdGFudHMgZm9yIG1ldGFkYXRhIHJlcG9zaXRvcnkgZWxlbWVudHMKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9FTEVNRU5UID0gInJlcG9zaXRvcnkiOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MV3JpdGVyLlByb2Nlc3NpbmdJbnN0cnVjdGlvbltdIGNyZWF0ZVBJKENsYXNzIHJlcG9zaXRvcnlDbGFzcykgewotCQkvL1RPRE8gV2Ugc2hvdWxkIHJlbW92ZSB0aGlzIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIGJ1dCBjdXJyZW50bHkgb2xkIGNsaWVudHMgcmVseSBvbiB0aGlzLiBTZWUgYnVnIDIxMDQ1MC4KLQkJcmV0dXJuIG5ldyBYTUxXcml0ZXIuUHJvY2Vzc2luZ0luc3RydWN0aW9uW10ge1hNTFdyaXRlci5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ubWFrZUNsYXNzVmVyc2lvbkluc3RydWN0aW9uKFhNTENvbnN0YW50cy5QSV9SRVBPU0lUT1JZX1RBUkdFVCwgcmVwb3NpdG9yeUNsYXNzLCBYTUxDb25zdGFudHMuQ1VSUkVOVF9WRVJTSU9OKX07Ci0JfQotCi0JLy8gWE1MIHdyaXRlciBmb3IgYSBJTWV0YWRhdGFSZXBvc2l0b3J5Ci0JcHJvdGVjdGVkIGNsYXNzIFdyaXRlciBleHRlbmRzIE1ldGFkYXRhV3JpdGVyIGltcGxlbWVudHMgWE1MQ29uc3RhbnRzIHsKLQotCQlwdWJsaWMgV3JpdGVyKE91dHB1dFN0cmVhbSBvdXRwdXQsIENsYXNzIHJlcG9zaXRvcnlDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXN1cGVyKG91dHB1dCwgY3JlYXRlUEkocmVwb3NpdG9yeUNsYXNzKSk7Ci0JCX0KLQotCQkvKioKLQkJICogV3JpdGUgdGhlIGdpdmVuIG1ldGFkYXRhIHJlcG9zaXRvcnkgdG8gdGhlIG91dHB1dCBzdHJlYW0uCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3cml0ZShJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKLQkJCXN0YXJ0KFJFUE9TSVRPUllfRUxFTUVOVCk7Ci0JCQlhdHRyaWJ1dGUoTkFNRV9BVFRSSUJVVEUsIHJlcG9zaXRvcnkuZ2V0TmFtZSgpKTsKLQkJCWF0dHJpYnV0ZShUWVBFX0FUVFJJQlVURSwgcmVwb3NpdG9yeS5nZXRUeXBlKCkpOwotCQkJYXR0cmlidXRlKFZFUlNJT05fQVRUUklCVVRFLCByZXBvc2l0b3J5LmdldFZlcnNpb24oKSk7Ci0JCQlhdHRyaWJ1dGVPcHRpb25hbChQUk9WSURFUl9BVFRSSUJVVEUsIHJlcG9zaXRvcnkuZ2V0UHJvdmlkZXIoKSk7Ci0JCQlhdHRyaWJ1dGVPcHRpb25hbChERVNDUklQVElPTl9BVFRSSUJVVEUsIHJlcG9zaXRvcnkuZ2V0RGVzY3JpcHRpb24oKSk7IC8vIFRPRE86IGNvdWxkIGJlIGNkYXRhPwotCi0JCQl3cml0ZVByb3BlcnRpZXMocmVwb3NpdG9yeS5nZXRQcm9wZXJ0aWVzKCkpOwotCQkJQ29sbGVjdG9yIHVuaXRzID0gcmVwb3NpdG9yeS5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCk7Ci0JCQlpZiAocmVwb3NpdG9yeSBpbnN0YW5jZW9mIExvY2FsTWV0YWRhdGFSZXBvc2l0b3J5KSB7Ci0JCQkJU2V0IHJlZmVyZW5jZXMgPSAoKExvY2FsTWV0YWRhdGFSZXBvc2l0b3J5KSByZXBvc2l0b3J5KS5yZXBvc2l0b3JpZXM7Ci0JCQkJd3JpdGVSZXBvc2l0b3J5UmVmZXJlbmNlcyhyZWZlcmVuY2VzLml0ZXJhdG9yKCksIHJlZmVyZW5jZXMuc2l6ZSgpKTsKLQkJCX0KLQkJCXdyaXRlSW5zdGFsbGFibGVVbml0cyh1bml0cy5pdGVyYXRvcigpLCB1bml0cy5zaXplKCkpOwotCi0JCQllbmQoUkVQT1NJVE9SWV9FTEVNRU5UKTsKLQkJCWZsdXNoKCk7Ci0JCX0KLQotCQkvKioKLQkJICogV3JpdGVzIGEgbGlzdCBvZiB7QGxpbmsgUmVwb3NpdG9yeVJlZmVyZW5jZX0uCi0JCSAqIEBwYXJhbSByZWZlcmVuY2VzIEFuIEl0ZXJhdG9yIG9mIHtAbGluayBSZXBvc2l0b3J5UmVmZXJlbmNlfS4KLQkJICogQHBhcmFtIHNpemUgVGhlIG51bWJlciBvZiByZWZlcmVuY2VzICB0byB3cml0ZQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVSZXBvc2l0b3J5UmVmZXJlbmNlcyhJdGVyYXRvciByZWZlcmVuY2VzLCBpbnQgc2l6ZSkgewotCQkJaWYgKHNpemUgPT0gMCkKLQkJCQlyZXR1cm47Ci0JCQlzdGFydChSRVBPU0lUT1JZX1JFRkVSRU5DRVNfRUxFTUVOVCk7Ci0JCQlhdHRyaWJ1dGUoQ09MTEVDVElPTl9TSVpFX0FUVFJJQlVURSwgc2l6ZSk7Ci0JCQl3aGlsZSAocmVmZXJlbmNlcy5oYXNOZXh0KCkpCi0JCQkJd3JpdGVSZXBvc2l0b3J5UmVmZXJlbmNlKChSZXBvc2l0b3J5UmVmZXJlbmNlKSByZWZlcmVuY2VzLm5leHQoKSk7Ci0JCQllbmQoUkVQT1NJVE9SWV9SRUZFUkVOQ0VTX0VMRU1FTlQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHdyaXRlUmVwb3NpdG9yeVJlZmVyZW5jZShSZXBvc2l0b3J5UmVmZXJlbmNlIHJlZmVyZW5jZSkgewotCQkJc3RhcnQoUkVQT1NJVE9SWV9SRUZFUkVOQ0VfRUxFTUVOVCk7Ci0JCQlhdHRyaWJ1dGUoVVJMX0FUVFJJQlVURSwgcmVmZXJlbmNlLkxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJYXR0cmlidXRlKFRZUEVfQVRUUklCVVRFLCBJbnRlZ2VyLnRvU3RyaW5nKHJlZmVyZW5jZS5UeXBlKSk7Ci0JCQlhdHRyaWJ1dGUoT1BUSU9OU19BVFRSSUJVVEUsIEludGVnZXIudG9TdHJpbmcocmVmZXJlbmNlLk9wdGlvbnMpKTsKLQkJCWVuZChSRVBPU0lUT1JZX1JFRkVSRU5DRV9FTEVNRU5UKTsKLQkJfQotCX0KLQotCS8qCi0JICogCVBhcnNlciBmb3IgdGhlIGNvbnRlbnRzIG9mIGEgbWV0YWRhdGEgcmVwb3NpdG9yeSwKLQkgKiAJYXMgd3JpdHRlbiBieSB0aGUgV3JpdGVyIGNsYXNzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgUGFyc2VyIGV4dGVuZHMgTWV0YWRhdGFQYXJzZXIgaW1wbGVtZW50cyBYTUxDb25zdGFudHMgewotCi0JCXByaXZhdGUgSU1ldGFkYXRhUmVwb3NpdG9yeSB0aGVSZXBvc2l0b3J5ID0gbnVsbDsKLQkJcHJvdGVjdGVkIENsYXNzIHRoZVJlcG9zaXRvcnlDbGFzcyA9IG51bGw7Ci0KLQkJcHVibGljIFBhcnNlcihCdW5kbGVDb250ZXh0IGNvbnRleHQsIFN0cmluZyBidW5kbGVJZCkgewotCQkJc3VwZXIoY29udGV4dCwgYnVuZGxlSWQpOwotCQl9Ci0KLQkJcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHBhcnNlKElucHV0U3RyZWFtIHN0cmVhbSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJdGhpcy5zdGF0dXMgPSBudWxsOwotCQkJc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCQkJbW9uaXRvci5iZWdpblRhc2soTWVzc2FnZXMucmVwb19sb2FkaW5nLCBJUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04pOwotCQkJdHJ5IHsKLQkJCQkvLyBUT0RPOiBjdXJyZW50bHkgbm90IGNhY2hpbmcgdGhlIHBhcnNlciBzaW5jZSB3ZSBtYWtlIG5vIGFzc3VtcHRpb25zCi0JCQkJLy8JCSBvciByZXN0cmljdGlvbnMgb24gY29uY3VycmVudCBwYXJzaW5nCi0JCQkJZ2V0UGFyc2VyKCk7Ci0JCQkJUmVwb3NpdG9yeUhhbmRsZXIgcmVwb3NpdG9yeUhhbmRsZXIgPSBuZXcgUmVwb3NpdG9yeUhhbmRsZXIoKTsKLQkJCQl4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IFJlcG9zaXRvcnlEb2NIYW5kbGVyKFJFUE9TSVRPUllfRUxFTUVOVCwgcmVwb3NpdG9yeUhhbmRsZXIpKTsKLQkJCQl4bWxSZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKHN0cmVhbSkpOwotCQkJCWlmIChpc1ZhbGlkWE1MKCkpIHsKLQkJCQkJdGhlUmVwb3NpdG9yeSA9IHJlcG9zaXRvcnlIYW5kbGVyLmdldFJlcG9zaXRvcnkoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQltb25pdG9yLmRvbmUoKTsKLQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKSB7Ci0JCQlyZXR1cm4gdGhlUmVwb3NpdG9yeTsKLQkJfQotCi0JCXB1YmxpYyBDbGFzcyBnZXRSZXBvc2l0b3J5Q2xhc3MoKSB7Ci0JCQlyZXR1cm4gdGhlUmVwb3NpdG9yeUNsYXNzOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRSb290T2JqZWN0KCkgewotCQkJcmV0dXJuIHRoZVJlcG9zaXRvcnk7Ci0JCX0KLQotCQlwcml2YXRlIGZpbmFsIGNsYXNzIFJlcG9zaXRvcnlEb2NIYW5kbGVyIGV4dGVuZHMgRG9jSGFuZGxlciB7Ci0KLQkJCXB1YmxpYyBSZXBvc2l0b3J5RG9jSGFuZGxlcihTdHJpbmcgcm9vdE5hbWUsIFJvb3RIYW5kbGVyIHJvb3RIYW5kbGVyKSB7Ci0JCQkJc3VwZXIocm9vdE5hbWUsIHJvb3RIYW5kbGVyKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCQlpZiAoUElfUkVQT1NJVE9SWV9UQVJHRVQuZXF1YWxzKHRhcmdldCkpIHsKLQkJCQkJVmVyc2lvbiByZXBvc2l0b3J5VmVyc2lvbiA9IGV4dHJhY3RQSVZlcnNpb24odGFyZ2V0LCBkYXRhKTsKLQkJCQkJaWYgKCFNZXRhZGF0YVJlcG9zaXRvcnlJTy5YTUxDb25zdGFudHMuWE1MX1RPTEVSQU5DRS5pc0luY2x1ZGVkKHJlcG9zaXRvcnlWZXJzaW9uKSkgewotCQkJCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5pb19JbmNvbXBhdGlibGVWZXJzaW9uLCByZXBvc2l0b3J5VmVyc2lvbiwgTWV0YWRhdGFSZXBvc2l0b3J5SU8uWE1MQ29uc3RhbnRzLlhNTF9UT0xFUkFOQ0UpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZXBvc2l0b3J5SGFuZGxlciBleHRlbmRzIFJvb3RIYW5kbGVyIHsKLQotCQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSByZXF1aXJlZCA9IG5ldyBTdHJpbmdbXSB7TkFNRV9BVFRSSUJVVEUsIFRZUEVfQVRUUklCVVRFLCBWRVJTSU9OX0FUVFJJQlVURX07Ci0JCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIG9wdGlvbmFsID0gbmV3IFN0cmluZ1tdIHtERVNDUklQVElPTl9BVFRSSUJVVEUsIFBST1ZJREVSX0FUVFJJQlVURX07Ci0KLQkJCXByaXZhdGUgSW5zdGFsbGFibGVVbml0c0hhbmRsZXIgdW5pdHNIYW5kbGVyID0gbnVsbDsKLQkJCXByaXZhdGUgUHJvcGVydGllc0hhbmRsZXIgcHJvcGVydGllc0hhbmRsZXIgPSBudWxsOwotCQkJcHJpdmF0ZSBSZXBvc2l0b3J5UmVmZXJlbmNlc0hhbmRsZXIgcmVwb3NpdG9yeVJlZmVyZW5jZXNIYW5kbGVyID0gbnVsbDsKLQotCQkJcHJpdmF0ZSBBYnN0cmFjdE1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gbnVsbDsKLQotCQkJcHJpdmF0ZSBSZXBvc2l0b3J5U3RhdGUgc3RhdGUgPSBuZXcgUmVwb3NpdG9yeVN0YXRlKCk7Ci0KLQkJCXB1YmxpYyBSZXBvc2l0b3J5SGFuZGxlcigpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCi0JCQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgewotCQkJCXJldHVybiByZXBvc2l0b3J5OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSb290QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCQlTdHJpbmdbXSB2YWx1ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoYXR0cmlidXRlcywgcmVxdWlyZWQsIG9wdGlvbmFsKTsKLQkJCQlWZXJzaW9uIHZlcnNpb24gPSBjaGVja1ZlcnNpb24odGhpcy5lbGVtZW50SGFuZGxlZCwgVkVSU0lPTl9BVFRSSUJVVEUsIHZhbHVlc1syXSk7Ci0JCQkJc3RhdGUuTmFtZSA9IHZhbHVlc1swXTsKLQkJCQlzdGF0ZS5UeXBlID0gdmFsdWVzWzFdOwotCQkJCXN0YXRlLlZlcnNpb24gPSB2ZXJzaW9uOwotCQkJCXN0YXRlLkRlc2NyaXB0aW9uID0gdmFsdWVzWzNdOwotCQkJCXN0YXRlLlByb3ZpZGVyID0gdmFsdWVzWzRdOwotCQkJCXN0YXRlLkxvY2F0aW9uID0gbnVsbDsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCQljaGVja0NhbmNlbCgpOwotCQkJCWlmIChQUk9QRVJUSUVTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCWlmIChwcm9wZXJ0aWVzSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQlwcm9wZXJ0aWVzSGFuZGxlciA9IG5ldyBQcm9wZXJ0aWVzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKElOU1RBTExBQkxFX1VOSVRTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCWlmICh1bml0c0hhbmRsZXIgPT0gbnVsbCkgewotCQkJCQkJdW5pdHNIYW5kbGVyID0gbmV3IEluc3RhbGxhYmxlVW5pdHNIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSB7Ci0JCQkJaWYgKGlzVmFsaWRYTUwoKSkgewotCQkJCQlzdGF0ZS5Qcm9wZXJ0aWVzID0gKHByb3BlcnRpZXNIYW5kbGVyID09IG51bGwgPyBuZXcgT3JkZXJlZFByb3BlcnRpZXMoMCkgLy8KLQkJCQkJCQk6IHByb3BlcnRpZXNIYW5kbGVyLmdldFByb3BlcnRpZXMoKSk7Ci0JCQkJCXN0YXRlLlVuaXRzID0gKHVuaXRzSGFuZGxlciA9PSBudWxsID8gbmV3IElJbnN0YWxsYWJsZVVuaXRbMF0gLy8KLQkJCQkJCQk6IHVuaXRzSGFuZGxlci5nZXRVbml0cygpKTsKLQkJCQkJc3RhdGUuUmVwb3NpdG9yaWVzID0gcmVwb3NpdG9yeVJlZmVyZW5jZXNIYW5kbGVyID09IG51bGwgPyBuZXcgUmVwb3NpdG9yeVJlZmVyZW5jZVswXSA6IHJlcG9zaXRvcnlSZWZlcmVuY2VzSGFuZGxlci5nZXRSZWZlcmVuY2VzKCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQkvL2Nhbid0IGNyZWF0ZSByZXBvc2l0b3J5IGlmIG1pc3NpbmcgdHlwZSAtIHRoaXMgaXMgYWxyZWFkeSBsb2dnZWQgd2hlbiBwYXJzaW5nIGF0dHJpYnV0ZXMKLQkJCQkJCWlmIChzdGF0ZS5UeXBlID09IG51bGwpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJLy9taWdyYXRpb24gc3VwcG9ydCBmb3IgY2hhbmdlIHRvIE1ldGFkYXRhQ2FjaGUgKGJ1ZyAyMTE5MzQpCi0JCQkJCQlpZiAoc3RhdGUuVHlwZS5lcXVhbHMoIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuaW5zdGFsbHJlZ2lzdHJ5Lk1ldGFkYXRhQ2FjaGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXN0YXRlLlR5cGUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkxvY2FsTWV0YWRhdGFSZXBvc2l0b3J5IjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKHN0YXRlLlR5cGUpOwotCQkJCQkJT2JqZWN0IHJlcG9zaXRvcnlPYmplY3QgPSBjbGF6ei5uZXdJbnN0YW5jZSgpOwotCQkJCQkJaWYgKHJlcG9zaXRvcnlPYmplY3QgaW5zdGFuY2VvZiBBYnN0cmFjdE1ldGFkYXRhUmVwb3NpdG9yeSkgewotCQkJCQkJCXJlcG9zaXRvcnkgPSAoQWJzdHJhY3RNZXRhZGF0YVJlcG9zaXRvcnkpIHJlcG9zaXRvcnlPYmplY3Q7Ci0JCQkJCQkJcmVwb3NpdG9yeS5pbml0aWFsaXplKHN0YXRlKTsKLQkJCQkJCX0KLQkJCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPOiBUaHJvdyBhIFNBWEV4Y2VwdGlvbgotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPOiBUaHJvdyBhIFNBWEV4Y2VwdGlvbgotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBUT0RPOiBUaHJvdyBhIFNBWEV4Y2VwdGlvbgotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQkJcmV0dXJuIE1lc3NhZ2VzLmlvX3BhcnNlRXJyb3I7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJLy8gVE9ETzoKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9NZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L01ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1ZDMwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L01ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkNvbmZpZ3VyYXRpb25TY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLklQcm92aXNpb25pbmdFdmVudEJ1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuUHJvdmlzaW9uaW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LlF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0vKioKLSAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyfS4KLSAqLwotcHVibGljIGNsYXNzIE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgaW1wbGVtZW50cyBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciwgUHJvdmlzaW9uaW5nTGlzdGVuZXIgewotCXN0YXRpYyBjbGFzcyBSZXBvc2l0b3J5SW5mbyB7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbjsKLQkJYm9vbGVhbiBpc1N5c3RlbSA9IGZhbHNlOwotCQlib29sZWFuIGlzRW5hYmxlZCA9IHRydWU7Ci0JCVVSTCBsb2NhdGlvbjsKLQkJU3RyaW5nIG5hbWU7Ci0JCVNvZnRSZWZlcmVuY2UgcmVwb3NpdG9yeTsKLQkJU3RyaW5nIHN1ZmZpeDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9TVUZGSVggPSAic3VmZml4IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NVRkZJWCA9ICJjb250ZW50LnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxfRklMVEVSID0gImZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUNUT1JZID0gImZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VOQUJMRUQgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BST1ZJREVSID0gInByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1VGRklYID0gInN1ZmZpeCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NZU1RFTSA9ICJpc1N5c3RlbSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VSTCA9ICJ1cmwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ERV9SRVBPU0lUT1JJRVMgPSAicmVwb3NpdG9yaWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTWFwIG9mIFN0cmluZy0+UmVwb3NpdG9yeUluZm8sIHdoZXJlIFN0cmluZyBpcyB0aGUgcmVwb3NpdG9yeSBrZXkKLQkgKiBvYnRhaW5lZCB2aWEgZ2V0S2V5KFVSTCkuCi0JICovCi0JcHJpdmF0ZSBNYXAgcmVwb3NpdG9yaWVzID0gbnVsbDsKLQotCS8vbG9jayBvYmplY3QgdG8gYmUgaGVsZCB3aGVuIHJlZmVycmluZyB0byB0aGUgcmVwb3NpdG9yaWVzIGZpZWxkCi0JcHJpdmF0ZSBmaW5hbCBPYmplY3QgcmVwb3NpdG9yeUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0KLQkvKioKLQkgKiBDYWNoZSBMaXN0IG9mIHJlcG9zaXRvcmllcyB0aGF0IGFyZSBub3QgcmVhY2hhYmxlLiBNYWludGFpbiBjYWNoZQotCSAqIGZvciBzaG9ydCBkdXJhdGlvbiBiZWNhdXNlIHJlcG9zaXRvcnkgbWF5IGJlY29tZSBhdmFpbGFibGUgYXQgYW55IHRpbWUuCi0JICovCi0JcHJpdmF0ZSBTb2Z0UmVmZXJlbmNlIHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzOwotCi0JcHVibGljIE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKSB7Ci0JCUlQcm92aXNpb25pbmdFdmVudEJ1cyBidXMgPSAoSVByb3Zpc2lvbmluZ0V2ZW50QnVzKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChidXMgIT0gbnVsbCkKLQkJCWJ1cy5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJLy9pbml0aWFsaXplIHJlcG9zaXRvcmllcyBsYXppbHkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZXBvc2l0b3J5KElNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQlhZGRSZXBvc2l0b3J5KHJlcG9zaXRvcnksIHRydWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSByZXBvc2l0b3J5IHRvIHRoZSBsaXN0IG9mIGtub3duIHJlcG9zaXRvcmllcwotCSAqIEBwYXJhbSByZXBvc2l0b3J5IHRoZSByZXBvc2l0b3J5IG9iamVjdCB0byBhZGQKLQkgKiBAcGFyYW0gc2lnbmFsQWRkIHdoZXRoZXIgYSByZXBvc2l0b3J5IGNoYW5nZSBldmVudCBzaG91bGQgYmUgZmlyZWQKLQkgKiBAcGFyYW0gc3VmZml4IHRoZSBzdWZmaXggdXNlZCB0byBsb2FkIHRoZSByZXBvc2l0b3J5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB1bmtub3duCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJlcG9zaXRvcnkoSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBib29sZWFuIHNpZ25hbEFkZCwgU3RyaW5nIHN1ZmZpeCkgewotCQlib29sZWFuIGFkZGVkID0gdHJ1ZTsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCVN0cmluZyBrZXkgPSBnZXRLZXkocmVwb3NpdG9yeSk7Ci0JCQlSZXBvc2l0b3J5SW5mbyBpbmZvID0gKFJlcG9zaXRvcnlJbmZvKSByZXBvc2l0b3JpZXMuZ2V0KGtleSk7Ci0JCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJCWluZm8gPSBuZXcgUmVwb3NpdG9yeUluZm8oKTsKLQkJCWluZm8ucmVwb3NpdG9yeSA9IG5ldyBTb2Z0UmVmZXJlbmNlKHJlcG9zaXRvcnkpOwotCQkJaW5mby5uYW1lID0gcmVwb3NpdG9yeS5nZXROYW1lKCk7Ci0JCQlpbmZvLmRlc2NyaXB0aW9uID0gcmVwb3NpdG9yeS5nZXREZXNjcmlwdGlvbigpOwotCQkJaW5mby5sb2NhdGlvbiA9IHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKTsKLQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcygpLmdldChJUmVwb3NpdG9yeS5QUk9QX1NZU1RFTSk7Ci0JCQlpbmZvLmlzU3lzdGVtID0gdmFsdWUgPT0gbnVsbCA/IGZhbHNlIDogQm9vbGVhbi52YWx1ZU9mKHZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQkJCWluZm8uc3VmZml4ID0gc3VmZml4OwotCQkJYWRkZWQgPSByZXBvc2l0b3JpZXMucHV0KGdldEtleShyZXBvc2l0b3J5KSwgaW5mbykgPT0gbnVsbDsKLQkJfQotCQkvLyBzYXZlIHRoZSBnaXZlbiByZXBvc2l0b3J5IGluIHRoZSBwcmVmZXJlbmNlcy4KLQkJcmVtZW1iZXIocmVwb3NpdG9yeSwgc3VmZml4KTsKLQkJaWYgKGFkZGVkICYmIHNpZ25hbEFkZCkKLQkJCWJyb2FkY2FzdENoYW5nZUV2ZW50KHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKSwgSVJlcG9zaXRvcnkuVFlQRV9NRVRBREFUQSwgUmVwb3NpdG9yeUV2ZW50LkFEREVEKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbikgewotCQlhZGRSZXBvc2l0b3J5KGxvY2F0aW9uLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIGJvb2xlYW4gaXNFbmFibGVkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobG9jYXRpb24pOwotCQlSZXBvc2l0b3J5SW5mbyBpbmZvID0gbmV3IFJlcG9zaXRvcnlJbmZvKCk7Ci0JCWluZm8ubG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJaW5mby5pc0VuYWJsZWQgPSBpc0VuYWJsZWQ7Ci0JCWJvb2xlYW4gYWRkZWQgPSB0cnVlOwotCQlzeW5jaHJvbml6ZWQgKHJlcG9zaXRvcnlMb2NrKSB7Ci0JCQlpZiAocmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQkJcmVzdG9yZVJlcG9zaXRvcmllcygpOwotCQkJYWRkZWQgPSByZXBvc2l0b3JpZXMucHV0KGdldEtleShsb2NhdGlvbiksIGluZm8pID09IG51bGw7Ci0JCX0KLQkJLy8gc2F2ZSB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBpbiB0aGUgcHJlZmVyZW5jZXMuCi0JCXJlbWVtYmVyKGluZm8pOwotCQlpZiAoYWRkZWQpCi0JCQlicm9hZGNhc3RDaGFuZ2VFdmVudChsb2NhdGlvbiwgSVJlcG9zaXRvcnkuVFlQRV9NRVRBREFUQSwgUmVwb3NpdG9yeUV2ZW50LkFEREVEKTsKLQl9Ci0KLQkvKioKLQkgKiBUT0RPIEVsaW1pbmF0ZSBkdXBsaWNhdGlvbiB3aXRoIEFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYnJvYWRjYXN0Q2hhbmdlRXZlbnQoVVJMIGxvY2F0aW9uLCBpbnQgcmVwb3NpdG9yeVR5cGUsIGludCBraW5kKSB7Ci0JCUlQcm92aXNpb25pbmdFdmVudEJ1cyBidXMgPSAoSVByb3Zpc2lvbmluZ0V2ZW50QnVzKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChidXMgIT0gbnVsbCkKLQkJCWJ1cy5wdWJsaXNoRXZlbnQobmV3IFJlcG9zaXRvcnlFdmVudChsb2NhdGlvbiwgcmVwb3NpdG9yeVR5cGUsIGtpbmQsIHRydWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiB3ZSByZWNlbnRseSBhdHRlbXB0ZWQgdG8gbG9hZCB0aGUgZ2l2ZW4gbG9jYXRpb24gYW5kIGZhaWxlZAotCSAqIHRvIGZpbmQgYW55dGhpbmcuIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlcG9zaXRvcnkgd2FzIG5vdAotCSAqIGZvdW5kLCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tOb3RGb3VuZChVUkwgbG9jYXRpb24pIHsKLQkJaWYgKHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUxpc3QgYmFkUmVwb3MgPSAoTGlzdCkgdW5hdmFpbGFibGVSZXBvc2l0b3JpZXMuZ2V0KCk7Ci0JCWlmIChiYWRSZXBvcyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gYmFkUmVwb3MuY29udGFpbnMobG9jYXRpb24pOwotCX0KLQotCS8qKgotCSAqIENsZWFyIHRoZSBmYWN0IHRoYXQgd2UgdHJpZWQgdG8gbG9hZCBhIHJlcG9zaXRvcnkgYXQgdGhpcyBsb2NhdGlvbiBhbmQgZGlkIG5vdCBmaW5kIGFueXRoaW5nLgotCSAqLwotCXByaXZhdGUgdm9pZCBjbGVhck5vdEZvdW5kKFVSTCBsb2NhdGlvbikgewotCQlMaXN0IGJhZFJlcG9zOwotCQlpZiAodW5hdmFpbGFibGVSZXBvc2l0b3JpZXMgIT0gbnVsbCkgewotCQkJYmFkUmVwb3MgPSAoTGlzdCkgdW5hdmFpbGFibGVSZXBvc2l0b3JpZXMuZ2V0KCk7Ci0JCQlpZiAoYmFkUmVwb3MgIT0gbnVsbCkgewotCQkJCWJhZFJlcG9zLnJlbW92ZShsb2NhdGlvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXhlY3V0YWJsZSBleHRlbnNpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlCi0JICogd2FzIG5vIGNvcnJlc3BvbmRpbmcgZXh0ZW5zaW9uLCBvciBhbiBlcnJvciBvY2N1cnJlZCBsb2FkaW5nIGl0Ci0JICovCi0JcHJpdmF0ZSBPYmplY3QgY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbiwgU3RyaW5nIGVsZW1lbnQpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCUNvcmVFeGNlcHRpb24gZmFpbHVyZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5nZXROYW1lKCkuZXF1YWxzKGVsZW1lbnQpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJbG9nKCJFcnJvciBsb2FkaW5nIHJlcG9zaXRvcnkgZXh0ZW5zaW9uOiAiICsgZXh0ZW5zaW9uLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgZmFpbHVyZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWxvZygiTWFsZm9ybWVkIHJlcG9zaXRvcnkgZXh0ZW5zaW9uOiAiICsgZXh0ZW5zaW9uLmdldFVuaXF1ZUlkZW50aWZpZXIoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyI2NyZWF0ZVJlcG9zaXRvcnkoamF2YS5uZXQuVVJMLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGNyZWF0ZVJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIE1hcCBwcm9wZXJ0aWVzKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChsb2NhdGlvbik7Ci0JCUFzc2VydC5pc05vdE51bGwobmFtZSk7Ci0JCUFzc2VydC5pc05vdE51bGwodHlwZSk7Ci0JCWJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQkvL3JlcG9zaXRvcnkgc2hvdWxkIG5vdCBhbHJlYWR5IGV4aXN0Ci0JCQlsb2FkUmVwb3NpdG9yeShsb2NhdGlvbiwgKElQcm9ncmVzc01vbml0b3IpIG51bGwsIHR5cGUsIHRydWUpOwotCQkJbG9hZGVkID0gdHJ1ZTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZXhwZWN0ZWQgLSBmYWxsIHRocm91Z2ggYW5kIGNyZWF0ZSB0aGUgbmV3IHJlcG9zaXRvcnkKLQkJfQotCQlpZiAobG9hZGVkKQotCQkJZmFpbChsb2NhdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfRVhJU1RTKTsKLQotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IFJlZ2lzdHJ5RmFjdG9yeS5nZXRSZWdpc3RyeSgpLmdldEV4dGVuc2lvbihBY3RpdmF0b3IuUkVQT19QUk9WSURFUl9YUFQsIHR5cGUpOwotCQlpZiAoZXh0ZW5zaW9uID09IG51bGwpCi0JCQlmYWlsKGxvY2F0aW9uLCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9VTktOT1dOX1RZUEUpOwotCQlJTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSBmYWN0b3J5ID0gKElNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5KSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGV4dGVuc2lvbiwgRkFDVE9SWSk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpCi0JCQlmYWlsKGxvY2F0aW9uLCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfUkVBRCk7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVzdWx0ID0gZmFjdG9yeS5jcmVhdGUobG9jYXRpb24sIG5hbWUsIHR5cGUsIHByb3BlcnRpZXMpOwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlmYWlsKGxvY2F0aW9uLCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfUkVBRCk7Ci0JCWNsZWFyTm90Rm91bmQobG9jYXRpb24pOwotCQlhZGRSZXBvc2l0b3J5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZhaWwoVVJMIGxvY2F0aW9uLCBpbnQgY29kZSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oZmFpbFN0YXR1cyhsb2NhdGlvbiwgY29kZSkpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBmYWlsU3RhdHVzKFVSTCBsb2NhdGlvbiwgaW50IGNvZGUpIHsKLQkJU3RyaW5nIG1zZyA9IG51bGw7Ci0JCXN3aXRjaCAoY29kZSkgewotCQkJY2FzZSBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9FWElTVFMgOgotCQkJCW1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLnJlcG9NYW5fZXhpc3RzLCBsb2NhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX1VOS05PV05fVFlQRSA6Ci0JCQkJbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl91bmtub3duVHlwZSwgbG9jYXRpb24pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfUkVBRCA6Ci0JCQkJbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9mYWlsZWRSZWFkLCBsb2NhdGlvbik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCA6Ci0JCQkJbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9ub3RFeGlzdHMsIGxvY2F0aW9uKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfSU5WQUxJRF9MT0NBVElPTiA6Ci0JCQkJbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9pbnZhbGlkTG9jYXRpb24sIGxvY2F0aW9uKTsKLQkJCQlicmVhazsKLQkJfQotCQlpZiAobXNnID09IG51bGwpCi0JCQltc2cgPSBNZXNzYWdlcy5yZXBvTWFuX2ludGVybmFsRXJyb3I7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgY29kZSwgbXNnLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIElFeHRlbnNpb25bXSBmaW5kTWF0Y2hpbmdSZXBvc2l0b3J5RXh0ZW5zaW9ucyhTdHJpbmcgc3VmZml4LCBTdHJpbmcgdHlwZSkgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbHQgPSBudWxsOwotCQlpZiAodHlwZSAhPSBudWxsICYmIHR5cGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dCA9IFJlZ2lzdHJ5RmFjdG9yeS5nZXRSZWdpc3RyeSgpLmdldEV4dGVuc2lvbihBY3RpdmF0b3IuUkVQT19QUk9WSURFUl9YUFQsIHR5cGUpOwotCQkJZWx0ID0gKGV4dCAhPSBudWxsKSA/IGV4dC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKSA6IG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbMF07Ci0JCX0gZWxzZSB7Ci0JCQllbHQgPSBSZWdpc3RyeUZhY3RvcnkuZ2V0UmVnaXN0cnkoKS5nZXRDb25maWd1cmF0aW9uRWxlbWVudHNGb3IoQWN0aXZhdG9yLlJFUE9fUFJPVklERVJfWFBUKTsKLQkJfQotCi0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWx0W2ldLmdldE5hbWUoKS5lcXVhbHMoImZpbHRlciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIWVsdFtpXS5nZXRBdHRyaWJ1dGUoInN1ZmZpeCIpLmVxdWFscyhzdWZmaXgpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZWx0W2ldID0gbnVsbDsKLQkJCQl9IGVsc2UgewotCQkJCQljb3VudCsrOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJZWx0W2ldID0gbnVsbDsKLQkJCX0KLQkJfQotCQlJRXh0ZW5zaW9uW10gcmVzdWx0cyA9IG5ldyBJRXh0ZW5zaW9uW2NvdW50XTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbHQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbHRbaV0gIT0gbnVsbCkKLQkJCQlyZXN1bHRzWy0tY291bnRdID0gZWx0W2ldLmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gZ2V0QWxsU3VmZml4ZXMoKSB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gUmVnaXN0cnlGYWN0b3J5LmdldFJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKEFjdGl2YXRvci5SRVBPX1BST1ZJREVSX1hQVCk7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCXJlc3VsdC5hZGQoREVGQVVMVF9TVUZGSVgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZWxlbWVudHNbaV0uZ2V0TmFtZSgpLmVxdWFscyhFTF9GSUxURVIpKSB7Ci0JCQkJU3RyaW5nIHN1ZmZpeCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShBVFRSX1NVRkZJWCk7Ci0JCQkJaWYgKCFyZXN1bHQuY29udGFpbnMoc3VmZml4KSkKLQkJCQkJcmVzdWx0LmFkZChzdWZmaXgpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgc3RyaW5nIGtleSBiYXNlZCBvbiB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSB3aGljaAotCSAqIGlzIHN1aXRhYmxlIGZvciB1c2UgYXMgYSBwcmVmZXJlbmNlIG5vZGUgbmFtZS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRLZXkoSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCXJldHVybiBnZXRLZXkocmVwb3NpdG9yeS5nZXRMb2NhdGlvbigpKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiBhIHN0cmluZyBrZXkgYmFzZWQgb24gdGhlIGdpdmVuIHJlcG9zaXRvcnkgbG9jYXRpb24gd2hpY2gKLQkgKiBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIGEgcHJlZmVyZW5jZSBub2RlIG5hbWUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0S2V5KFVSTCBsb2NhdGlvbikgewotCQlyZXR1cm4gbG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKS5yZXBsYWNlKCcvJywgJ18nKTsKLQl9Ci0KLQlwdWJsaWMgVVJMW10gZ2V0S25vd25SZXBvc2l0b3JpZXMoaW50IGZsYWdzKSB7Ci0JCXN5bmNocm9uaXplZCAocmVwb3NpdG9yeUxvY2spIHsKLQkJCWlmIChyZXBvc2l0b3JpZXMgPT0gbnVsbCkKLQkJCQlyZXN0b3JlUmVwb3NpdG9yaWVzKCk7Ci0JCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaW50IGkgPSAwOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IHJlcG9zaXRvcmllcy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7IGkrKykgewotCQkJCVJlcG9zaXRvcnlJbmZvIGluZm8gPSAoUmVwb3NpdG9yeUluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAobWF0Y2hlc0ZsYWdzKGluZm8sIGZsYWdzKSkKLQkJCQkJcmVzdWx0LmFkZChpbmZvLmxvY2F0aW9uKTsKLQkJCX0KLQkJCXJldHVybiAoVVJMW10pIHJlc3VsdC50b0FycmF5KG5ldyBVUkxbcmVzdWx0LnNpemUoKV0pOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHByZWZlcmVuY2Ugbm9kZSB3aGljaCBpcyB0aGUgcm9vdCBmb3Igd2hlcmUgd2Ugc3RvcmUgdGhlIHJlcG9zaXRvcnkgaW5mb3JtYXRpb24uCi0JICovCi0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIG5ldyBDb25maWd1cmF0aW9uU2NvcGUoKS5nZXROb2RlKEFjdGl2YXRvci5JRCkubm9kZShOT0RFX1JFUE9TSVRPUklFUyk7Ci0JfQotCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeShVUkwgbG9jYXRpb24pIHsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXBvc2l0b3JpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVJlcG9zaXRvcnlJbmZvIGluZm8gPSAoUmVwb3NpdG9yeUluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoVVJMVXRpbC5zYW1lVVJMKGluZm8ubG9jYXRpb24sIGxvY2F0aW9uKSkgewotCQkJCQlpZiAoaW5mby5yZXBvc2l0b3J5ID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gKElNZXRhZGF0YVJlcG9zaXRvcnkpIGluZm8ucmVwb3NpdG9yeS5nZXQoKTsKLQkJCQkJLy91cGRhdGUgb3VyIHJlcG9zaXRvcnkgaW5mbyBiZWNhdXNlIHRoZSByZXBvc2l0b3J5IG1heSBoYXZlIGNoYW5nZWQKLQkJCQkJaWYgKHJlcG8gIT0gbnVsbCkKLQkJCQkJCWFkZFJlcG9zaXRvcnkocmVwbyk7Ci0JCQkJCXJldHVybiByZXBvOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIjZ2V0UmVwb3NpdG9yeVByb3BlcnR5KGphdmEubmV0LlVSTCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFJlcG9zaXRvcnlQcm9wZXJ0eShVUkwgbG9jYXRpb24sIFN0cmluZyBrZXkpIHsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXBvc2l0b3JpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVJlcG9zaXRvcnlJbmZvIGluZm8gPSAoUmVwb3NpdG9yeUluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoVVJMVXRpbC5zYW1lVVJMKGluZm8ubG9jYXRpb24sIGxvY2F0aW9uKSkgewotCQkJCQlpZiAoSVJlcG9zaXRvcnkuUFJPUF9ERVNDUklQVElPTi5lcXVhbHMoa2V5KSkKLQkJCQkJCXJldHVybiBpbmZvLmRlc2NyaXB0aW9uOwotCQkJCQlpZiAoSVJlcG9zaXRvcnkuUFJPUF9OQU1FLmVxdWFscyhrZXkpKQotCQkJCQkJcmV0dXJuIGluZm8ubmFtZTsKLQkJCQkJLy8gS2V5IG5vdCBrbm93biwgcmV0dXJuIG51bGwKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQkJLy8gUmVwb3NpdG9yeSBub3QgZm91bmQsIHJldHVybiBudWxsCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyI2dldEVuYWJsZWQoamF2YS5uZXQuVVJMKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChVUkwgbG9jYXRpb24pIHsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSByZXBvc2l0b3JpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCVJlcG9zaXRvcnlJbmZvIGluZm8gPSAoUmVwb3NpdG9yeUluZm8pIGl0Lm5leHQoKTsKLQkJCQlpZiAoVVJMVXRpbC5zYW1lVVJMKGluZm8ubG9jYXRpb24sIGxvY2F0aW9uKSkgewotCQkJCQlyZXR1cm4gaW5mby5pc0VuYWJsZWQ7Ci0JCQkJfQotCQkJfQotCQkJLy8gUmVwb3NpdG9yeSBub3QgZm91bmQsIHJldHVybiBmYWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgbG9hZFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbG9hZFJlcG9zaXRvcnkobG9jYXRpb24sIG1vbml0b3IsIG51bGwsIHRydWUpOwotCX0KLQotCXByaXZhdGUgSU1ldGFkYXRhUmVwb3NpdG9yeSBsb2FkUmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgU3RyaW5nIHR5cGUsIGJvb2xlYW4gc2lnbmFsQWRkKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChsb2NhdGlvbik7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVzdWx0ID0gZ2V0UmVwb3NpdG9yeShsb2NhdGlvbik7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCU11bHRpU3RhdHVzIG5vdEZvdW5kU3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5ELCBOTFMuYmluZChNZXNzYWdlcy5yZXBvTWFuX25vdEV4aXN0cywgbG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSksIG51bGwpOwotCQlpZiAoY2hlY2tOb3RGb3VuZChsb2NhdGlvbikpCi0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5vdEZvdW5kU3RhdHVzKTsKLQkJU3RyaW5nW10gc3VmZml4ZXMgPSBzb3J0U3VmZml4ZXMoZ2V0QWxsU3VmZml4ZXMoKSwgbG9jYXRpb24pOwotCQlTdWJNb25pdG9yIHN1YiA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBNZXNzYWdlcy5yZXBvTWFuX2FkZGluZywgc3VmZml4ZXMubGVuZ3RoICogMTAwKTsKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VmZml4ZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZXN1bHQgPSBsb2FkUmVwb3NpdG9yeShsb2NhdGlvbiwgc3VmZml4ZXNbaV0sIHR5cGUsIHN1Yi5uZXdDaGlsZCgxMDApLCBub3RGb3VuZFN0YXR1cyk7Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJCWFkZFJlcG9zaXRvcnkocmVzdWx0LCBzaWduYWxBZGQsIHN1ZmZpeGVzW2ldKTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWIuZG9uZSgpOwotCQl9Ci0JCXJlbWVtYmVyTm90Rm91bmQobG9jYXRpb24pOwotCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5vdEZvdW5kU3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBUcnkgdG8gbG9hZCBhIHByZS1leGlzdGluZyByZXBvIGF0IHRoZSBnaXZlbiBsb2NhdGlvbgotCSAqLwotCXByaXZhdGUgSU1ldGFkYXRhUmVwb3NpdG9yeSBsb2FkUmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIFN0cmluZyBzdWZmaXgsIFN0cmluZyB0eXBlLCBTdWJNb25pdG9yIG1vbml0b3IsIE11bHRpU3RhdHVzIGZhaWx1cmVzKSB7Ci0JCUlFeHRlbnNpb25bXSBwcm92aWRlcnMgPSBmaW5kTWF0Y2hpbmdSZXBvc2l0b3J5RXh0ZW5zaW9ucyhzdWZmaXgsIHR5cGUpOwotCQkvLyBMb29wIG92ZXIgdGhlIGNhbmRpZGF0ZXMgYW5kIHJldHVybiB0aGUgZmlyc3Qgb25lIHRoYXQgc3VjY2Vzc2Z1bGx5IGxvYWRzCi0JCW1vbml0b3IuYmVnaW5UYXNrKCIiLCBwcm92aWRlcnMubGVuZ3RoICogMTApOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSBmYWN0b3J5ID0gKElNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5KSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKHByb3ZpZGVyc1tpXSwgRkFDVE9SWSk7Ci0JCQl0cnkgewotCQkJCWlmIChmYWN0b3J5ICE9IG51bGwpCi0JCQkJCXJldHVybiBmYWN0b3J5LmxvYWQobG9jYXRpb24sIG1vbml0b3IubmV3Q2hpbGQoMTApKTsKLQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpICE9IFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCkKLQkJCQkJZmFpbHVyZXMuYWRkKGUuZ2V0U3RhdHVzKCkpOwotCQkJCS8va2VlcCB0cnlpbmcgd2l0aCBvdGhlciBmYWN0b3JpZXMKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSB0KSB7Ci0JCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIG1lc3NhZ2UsIHQpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2hlc0ZsYWdzKFJlcG9zaXRvcnlJbmZvIGluZm8sIGludCBmbGFncykgewotCQlpZiAoKGZsYWdzICYgUkVQT1NJVE9SSUVTX1NZU1RFTSkgPT0gUkVQT1NJVE9SSUVTX1NZU1RFTSkKLQkJCWlmICghaW5mby5pc1N5c3RlbSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICgoZmxhZ3MgJiBSRVBPU0lUT1JJRVNfTk9OX1NZU1RFTSkgPT0gUkVQT1NJVE9SSUVTX05PTl9TWVNURU0pCi0JCQlpZiAoaW5mby5pc1N5c3RlbSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICgoZmxhZ3MgJiBSRVBPU0lUT1JJRVNfRElTQUJMRUQpID09IFJFUE9TSVRPUklFU19ESVNBQkxFRCkgewotCQkJaWYgKGluZm8uaXNFbmFibGVkKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIHsKLQkJCS8vaWdub3JlIGRpc2FibGVkIHJlcG9zaXRvcmllcyBmb3IgYWxsIG90aGVyIGZsYWcgdHlwZXMKLQkJCWlmICghaW5mby5pc0VuYWJsZWQpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmICgoZmxhZ3MgJiBSRVBPU0lUT1JJRVNfTE9DQUwpID09IFJFUE9TSVRPUklFU19MT0NBTCkKLQkJCXJldHVybiAiZmlsZSIuZXF1YWxzKGluZm8ubG9jYXRpb24uZ2V0UHJvdG9jb2woKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuZXZlbnRidXMuUHJvdmlzaW9uaW5nTGlzdGVuZXIjbm90aWZ5KGphdmEudXRpbC5FdmVudE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnkoRXZlbnRPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIFJlcG9zaXRvcnlFdmVudCkgewotCQkJUmVwb3NpdG9yeUV2ZW50IGV2ZW50ID0gKFJlcG9zaXRvcnlFdmVudCkgbzsKLQkJCWlmIChldmVudC5nZXRLaW5kKCkgPT0gUmVwb3NpdG9yeUV2ZW50LkRJU0NPVkVSRUQgJiYgZXZlbnQuZ2V0UmVwb3NpdG9yeVR5cGUoKSA9PSBJUmVwb3NpdG9yeS5UWVBFX01FVEFEQVRBKQotCQkJCWFkZFJlcG9zaXRvcnkoZXZlbnQuZ2V0UmVwb3NpdG9yeUxvY2F0aW9uKCksIGV2ZW50LmlzUmVwb3NpdG9yeUVuYWJsZWQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGEgcHJlZmVyZW5jZSBhbmQgcmV0dXJucyA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgcHJlZmVyZW5jZQotCSAqIHdhcyBhY3R1YWxseSBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBwdXRWYWx1ZShQcmVmZXJlbmNlcyBub2RlLCBTdHJpbmcga2V5LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gbm9kZS5nZXQoa2V5LCBudWxsKTsKLQkJaWYgKG9sZFZhbHVlID09IG5ld1ZhbHVlIHx8IChvbGRWYWx1ZSAhPSBudWxsICYmIG9sZFZhbHVlLmVxdWFscyhuZXdWYWx1ZSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkKLQkJCW5vZGUucmVtb3ZlKGtleSk7Ci0JCWVsc2UKLQkJCW5vZGUucHV0KGtleSwgbmV3VmFsdWUpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBQZXJmb3JtcyBhIHF1ZXJ5IGFnYWluc3QgYWxsIG9mIHRoZSBpbnN0YWxsYWJsZSB1bml0cyBvZiBlYWNoIGtub3duIAotCSAqIHJlcG9zaXRvcnksIGFjY3VtdWxhdGluZyBhbnkgb2JqZWN0cyB0aGF0IHNhdGlzZnkgdGhlIHF1ZXJ5IGluIHRoZSAKLQkgKiBwcm92aWRlZCBjb2xsZWN0b3IuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IHVzaW5nIHRoaXMgbWV0aG9kIGNhbiBiZSBxdWl0ZSBleHBlbnNpdmUsIGFzIGV2ZXJ5IGtub3duCi0JICogbWV0YWRhdGEgcmVwb3NpdG9yeSB3aWxsIGJlIGxvYWRlZCBpbiBvcmRlciB0byBxdWVyeSBlYWNoIG9uZS4gIElmIGEKLQkgKiBjbGllbnQgd2lzaGVzIHRvIHF1ZXJ5IG9ubHkgY2VydGFpbiByZXBvc2l0b3JpZXMsIGl0IGlzIGJldHRlciB0byB1c2UKLQkgKiB7QGxpbmsgI2dldEtub3duUmVwb3NpdG9yaWVzKGludCl9IHRvIGZpbHRlciB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXMKLQkgKiBsb2FkZWQgYW5kIHRoZW4gcXVlcnkgZWFjaCBvZiB0aGUgcmV0dXJuZWQgcmVwb3NpdG9yaWVzLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGxvbmctcnVubmluZzsgcHJvZ3Jlc3MgYW5kIGNhbmNlbGxhdGlvbiBhcmUgcHJvdmlkZWQKLQkgKiBieSB0aGUgZ2l2ZW4gcHJvZ3Jlc3MgbW9uaXRvci4gCi0JICogCi0JICogQHBhcmFtIHF1ZXJ5IFRoZSBxdWVyeSB0byBwZXJmb3JtIGFnYWluc3QgZWFjaCBpbnN0YWxsYWJsZSB1bml0IGluIGVhY2gga25vd24gcmVwb3NpdG9yeQotCSAqIEBwYXJhbSBjb2xsZWN0b3IgQ29sbGVjdHMgdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5Ci0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gVGhlIGNvbGxlY3RvciBhcmd1bWVudAotCSAqLwotCXB1YmxpYyBDb2xsZWN0b3IgcXVlcnkoUXVlcnkgcXVlcnksIENvbGxlY3RvciBjb2xsZWN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlVUkxbXSBsb2NhdGlvbnMgPSBnZXRLbm93blJlcG9zaXRvcmllcyhSRVBPU0lUT1JJRVNfQUxMKTsKLQkJU3ViTW9uaXRvciBzdWIgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgbG9jYXRpb25zLmxlbmd0aCAqIDEwKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJbG9hZFJlcG9zaXRvcnkobG9jYXRpb25zW2ldLCBzdWIubmV3Q2hpbGQoOSkpLnF1ZXJ5KHF1ZXJ5LCBjb2xsZWN0b3IsIHN1Yi5uZXdDaGlsZCgxKSk7Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlIHRoaXMgcmVwb3NpdG9yeSBmb3IgdGhpcyBxdWVyeQotCQkJfQotCQl9Ci0JCXN1Yi5kb25lKCk7Ci0JCXJldHVybiBjb2xsZWN0b3I7Ci0JfQotCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgcmVmcmVzaFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQljbGVhck5vdEZvdW5kKGxvY2F0aW9uKTsKLQkJaWYgKCFyZW1vdmVSZXBvc2l0b3J5KGxvY2F0aW9uKSkKLQkJCWZhaWwobG9jYXRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCk7Ci0JCXJldHVybiBsb2FkUmVwb3NpdG9yeShsb2NhdGlvbiwgbW9uaXRvciwgbnVsbCwgZmFsc2UpOwotCX0KLQotCS8qCi0JICogU2F2ZSB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXMgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHJlbWVtYmVyKElNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIHN1ZmZpeCkgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IGdldFByZWZlcmVuY2VzKCkubm9kZShnZXRLZXkocmVwb3NpdG9yeSkpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9VUkwsIHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfREVTQ1JJUFRJT04sIHJlcG9zaXRvcnkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX05BTUUsIHJlcG9zaXRvcnkuZ2V0TmFtZSgpKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfUFJPVklERVIsIHJlcG9zaXRvcnkuZ2V0UHJvdmlkZXIoKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX1RZUEUsIHJlcG9zaXRvcnkuZ2V0VHlwZSgpKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfVkVSU0lPTiwgcmVwb3NpdG9yeS5nZXRWZXJzaW9uKCkpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9TWVNURU0sIChTdHJpbmcpIHJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcygpLmdldChJUmVwb3NpdG9yeS5QUk9QX1NZU1RFTSkpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9TVUZGSVgsIHN1ZmZpeCk7Ci0JCWlmIChjaGFuZ2VkKQotCQkJc2F2ZVRvUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIGNoYW5nZWQ7Ci0JfQotCi0JLyoKLQkgKiBTYXZlIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gcmVtZW1iZXIoUmVwb3NpdG9yeUluZm8gaW5mbykgewotCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IGdldFByZWZlcmVuY2VzKCkubm9kZShnZXRLZXkoaW5mby5sb2NhdGlvbikpOwotCQljaGFuZ2VkIHw9IHB1dFZhbHVlKG5vZGUsIEtFWV9VUkwsIGluZm8ubG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX1NZU1RFTSwgQm9vbGVhbi50b1N0cmluZyhpbmZvLmlzU3lzdGVtKSk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX0RFU0NSSVBUSU9OLCBpbmZvLmRlc2NyaXB0aW9uKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfTkFNRSwgaW5mby5uYW1lKTsKLQkJY2hhbmdlZCB8PSBwdXRWYWx1ZShub2RlLCBLRVlfU1VGRklYLCBpbmZvLnN1ZmZpeCk7Ci0JCWNoYW5nZWQgfD0gcHV0VmFsdWUobm9kZSwgS0VZX0VOQUJMRUQsIEJvb2xlYW4udG9TdHJpbmcoaW5mby5pc0VuYWJsZWQpKTsKLQkJaWYgKGNoYW5nZWQpCi0JCQlzYXZlVG9QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gY2hhbmdlZDsKLQl9Ci0KLQkvKioKLQkgKiBDYWNoZSB0aGUgZmFjdCB0aGF0IHdlIHRyaWVkIHRvIGxvYWQgYSByZXBvc2l0b3J5IGF0IHRoaXMgbG9jYXRpb24gYW5kIGRpZCBub3QgZmluZCBhbnl0aGluZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtZW1iZXJOb3RGb3VuZChVUkwgbG9jYXRpb24pIHsKLQkJTGlzdCBiYWRSZXBvczsKLQkJaWYgKHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzICE9IG51bGwpIHsKLQkJCWJhZFJlcG9zID0gKExpc3QpIHVuYXZhaWxhYmxlUmVwb3NpdG9yaWVzLmdldCgpOwotCQkJaWYgKGJhZFJlcG9zICE9IG51bGwpIHsKLQkJCQliYWRSZXBvcy5hZGQobG9jYXRpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQliYWRSZXBvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYmFkUmVwb3MuYWRkKGxvY2F0aW9uKTsKLQkJdW5hdmFpbGFibGVSZXBvc2l0b3JpZXMgPSBuZXcgU29mdFJlZmVyZW5jZShiYWRSZXBvcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlUmVwb3NpdG9yeShVUkwgdG9SZW1vdmUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbCh0b1JlbW92ZSk7Ci0JCWZpbmFsIFN0cmluZyByZXBvS2V5ID0gZ2V0S2V5KHRvUmVtb3ZlKTsKLQkJc3luY2hyb25pemVkIChyZXBvc2l0b3J5TG9jaykgewotCQkJaWYgKHJlcG9zaXRvcmllcyA9PSBudWxsKQotCQkJCXJlc3RvcmVSZXBvc2l0b3JpZXMoKTsKLQkJCWlmIChyZXBvc2l0b3JpZXMucmVtb3ZlKHJlcG9LZXkpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCS8vIHJlbW92ZSB0aGUgcmVwb3NpdG9yeSBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JCXRyeSB7Ci0JCQlnZXRQcmVmZXJlbmNlcygpLm5vZGUocmVwb0tleSkucmVtb3ZlTm9kZSgpOwotCQkJc2F2ZVRvUHJlZmVyZW5jZXMoKTsKLQkJfSBjYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCWxvZygiRXJyb3Igc2F2aW5nIHByZWZlcmVuY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlicm9hZGNhc3RDaGFuZ2VFdmVudCh0b1JlbW92ZSwgSVJlcG9zaXRvcnkuVFlQRV9NRVRBREFUQSwgUmVwb3NpdG9yeUV2ZW50LlJFTU9WRUQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlLgotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlRnJvbVByZWZlcmVuY2VzKCkgewotCQkvLyByZXN0b3JlIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyBmcm9tIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JCVByZWZlcmVuY2VzIG5vZGUgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlTdHJpbmdbXSBjaGlsZHJlbjsKLQkJdHJ5IHsKLQkJCWNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbk5hbWVzKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2coIkVycm9yIHJlc3RvcmluZyByZXBvc2l0b3JpZXMgZnJvbSBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJUHJlZmVyZW5jZXMgY2hpbGQgPSBub2RlLm5vZGUoY2hpbGRyZW5baV0pOwotCQkJU3RyaW5nIGxvY2F0aW9uU3RyaW5nID0gY2hpbGQuZ2V0KEtFWV9VUkwsIG51bGwpOwotCQkJaWYgKGxvY2F0aW9uU3RyaW5nID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQl0cnkgewotCQkJCVJlcG9zaXRvcnlJbmZvIGluZm8gPSBuZXcgUmVwb3NpdG9yeUluZm8oKTsKLQkJCQlpbmZvLmxvY2F0aW9uID0gbmV3IFVSTChsb2NhdGlvblN0cmluZyk7Ci0JCQkJaW5mby5uYW1lID0gY2hpbGQuZ2V0KEtFWV9OQU1FLCBudWxsKTsKLQkJCQlpbmZvLmRlc2NyaXB0aW9uID0gY2hpbGQuZ2V0KEtFWV9ERVNDUklQVElPTiwgbnVsbCk7Ci0JCQkJaW5mby5pc1N5c3RlbSA9IGNoaWxkLmdldEJvb2xlYW4oS0VZX1NZU1RFTSwgZmFsc2UpOwotCQkJCWluZm8uaXNFbmFibGVkID0gY2hpbGQuZ2V0Qm9vbGVhbihLRVlfRU5BQkxFRCwgdHJ1ZSk7Ci0JCQkJaW5mby5zdWZmaXggPSBjaGlsZC5nZXQoS0VZX1NVRkZJWCwgbnVsbCk7Ci0JCQkJcmVwb3NpdG9yaWVzLnB1dChnZXRLZXkoaW5mby5sb2NhdGlvbiksIGluZm8pOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2coIkVycm9yIHdoaWxlIHJlc3RvcmluZyByZXBvc2l0b3J5OiAiICsgbG9jYXRpb25TdHJpbmcsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyBtZXRhZGF0YSByZXBvc2l0b3JpZXMgc3BlY2lmaWVkIGFzIHN5c3RlbSBwcm9wZXJ0aWVzLgotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlRnJvbVN5c3RlbVByb3BlcnR5KCkgewotCQlTdHJpbmcgbG9jYXRpb25TdHJpbmcgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFByb3BlcnR5KCJlY2xpcHNlLnAyLm1ldGFkYXRhUmVwb3NpdG9yeSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsb2NhdGlvblN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihsb2NhdGlvblN0cmluZywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHBhdGhTdHJpbmcgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQl0cnkgewotCQkJCVJlcG9zaXRvcnlJbmZvIGluZm8gPSBuZXcgUmVwb3NpdG9yeUluZm8oKTsKLQkJCQlpbmZvLmxvY2F0aW9uID0gbmV3IFVSTChwYXRoU3RyaW5nKTsKLQkJCQlyZXBvc2l0b3JpZXMucHV0KGdldEtleShpbmZvLmxvY2F0aW9uKSwgaW5mbyk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCWxvZygiRXJyb3Igd2hpbGUgcmVzdG9yaW5nIHJlcG9zaXRvcnkgIiArIHBhdGhTdHJpbmcsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyB0aGUgcmVwb3NpdG9yeSBsaXN0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc3RvcmVSZXBvc2l0b3JpZXMoKSB7Ci0JCXN5bmNocm9uaXplZCAocmVwb3NpdG9yeUxvY2spIHsKLQkJCXJlcG9zaXRvcmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlyZXN0b3JlRnJvbVN5c3RlbVByb3BlcnR5KCk7Ci0JCQlyZXN0b3JlRnJvbVByZWZlcmVuY2VzKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFNhdmUgdGhlIHJlcG9zaXRvcnkgbGlzdCBpbiB0aGUgZmlsZS1zeXN0ZW0KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2F2ZVRvUHJlZmVyZW5jZXMoKSB7Ci0JCXRyeSB7Ci0JCQlnZXRQcmVmZXJlbmNlcygpLmZsdXNoKCk7Ci0JCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlsb2coIkVycm9yIHdoaWxlIHNhdmluZyByZXBvc2l0b3JpZXMgaW4gcHJlZmVyZW5jZXMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIjc2V0RW5hYmxlZChqYXZhLm5ldC5VUkwsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5hYmxlZChVUkwgbG9jYXRpb24sIGJvb2xlYW4gZW5hYmxlbWVudCkgewotCQlzeW5jaHJvbml6ZWQgKHJlcG9zaXRvcnlMb2NrKSB7Ci0JCQlpZiAocmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQkJcmVzdG9yZVJlcG9zaXRvcmllcygpOwotCQkJUmVwb3NpdG9yeUluZm8gaW5mbyA9IChSZXBvc2l0b3J5SW5mbykgcmVwb3NpdG9yaWVzLmdldChnZXRLZXkobG9jYXRpb24pKTsKLQkJCWlmIChpbmZvID09IG51bGwgfHwgaW5mby5pc0VuYWJsZWQgPT0gZW5hYmxlbWVudCkKLQkJCQlyZXR1cm47Ci0JCQlpbmZvLmlzRW5hYmxlZCA9IGVuYWJsZW1lbnQ7Ci0JCQlyZW1lbWJlcihpbmZvKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE9wdGltaXplIHRoZSBvcmRlciBpbiB3aGljaCByZXBvc2l0b3J5IHN1ZmZpeGVzIGFyZSBzZWFyY2hlZCBieSB0cnlpbmcgCi0JICogdGhlIGxhc3Qgc3VjY2Vzc2Z1bGx5IGxvYWRlZCBzdWZmaXggZmlyc3QuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBzb3J0U3VmZml4ZXMoU3RyaW5nW10gc3VmZml4ZXMsIFVSTCBsb2NhdGlvbikgewotCQlzeW5jaHJvbml6ZWQgKHJlcG9zaXRvcnlMb2NrKSB7Ci0JCQlpZiAocmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQkJcmVzdG9yZVJlcG9zaXRvcmllcygpOwotCQkJUmVwb3NpdG9yeUluZm8gaW5mbyA9IChSZXBvc2l0b3J5SW5mbykgcmVwb3NpdG9yaWVzLmdldChnZXRLZXkobG9jYXRpb24pKTsKLQkJCWlmIChpbmZvID09IG51bGwgfHwgaW5mby5zdWZmaXggPT0gbnVsbCkKLQkJCQlyZXR1cm4gc3VmZml4ZXM7Ci0JCQkvL21vdmUgbGFzdFN1ZmZpeCB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QgYnV0IHByZXNlcnZlIG9yZGVyIG9mIHJlbWFpbmluZyBlbnRyaWVzCi0JCQlTdHJpbmcgbGFzdFN1ZmZpeCA9IGluZm8uc3VmZml4OwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWZmaXhlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChsYXN0U3VmZml4LmVxdWFscyhzdWZmaXhlc1tpXSkpIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShzdWZmaXhlcywgMCwgc3VmZml4ZXMsIDEsIGkpOwotCQkJCQlzdWZmaXhlc1swXSA9IGxhc3RTdWZmaXg7Ci0JCQkJCXJldHVybiBzdWZmaXhlczsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1ZmZpeGVzOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlUmVwb3NpdG9yeUxvY2F0aW9uKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobG9jYXRpb24pOwotCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlc3VsdCA9IGdldFJlcG9zaXRvcnkobG9jYXRpb24pOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJU3RyaW5nW10gc3VmZml4ZXMgPSBnZXRBbGxTdWZmaXhlcygpOwotCQlTdWJNb25pdG9yIHN1YiA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCBNZXNzYWdlcy5yZXBvX2xvYWRpbmcsIHN1ZmZpeGVzLmxlbmd0aCAqIDEwMCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9ub3RFeGlzdHMsIGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpLCBudWxsKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdWZmaXhlcy5sZW5ndGg7IGkrKykgewotCQkJU3ViTW9uaXRvciBsb29wTW9uaXRvciA9IHN1Yi5uZXdDaGlsZCgxMDApOwotCQkJSUV4dGVuc2lvbltdIHByb3ZpZGVycyA9IGZpbmRNYXRjaGluZ1JlcG9zaXRvcnlFeHRlbnNpb25zKHN1ZmZpeGVzW2ldLCBudWxsKTsKLQkJCS8vIExvb3Agb3ZlciB0aGUgY2FuZGlkYXRlcyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBvbmUgdGhhdCBzdWNjZXNzZnVsbHkgbG9hZHMKLQkJCWxvb3BNb25pdG9yLmJlZ2luVGFzaygiIiwgcHJvdmlkZXJzLmxlbmd0aCAqIDEwKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm92aWRlcnMubGVuZ3RoOyBqKyspIHsKLQkJCQlJTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSBmYWN0b3J5ID0gKElNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5KSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKHByb3ZpZGVyc1tqXSwgRkFDVE9SWSk7Ci0JCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCQlzdGF0dXMgPSBmYWN0b3J5LnZhbGlkYXRlKGxvY2F0aW9uLCBsb29wTW9uaXRvci5uZXdDaGlsZCgxMCkpOwotCQkJCQlpZiAoc3RhdHVzLmlzT0soKSkgewotCQkJCQkJc3ViLmRvbmUoKTsKLQkJCQkJCXJldHVybiBzdGF0dXM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlzdWIuZG9uZSgpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9VUkxNZXRhZGF0YVJlcG9zaXRvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvVVJMTWV0YWRhdGFSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOWM3YmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9VUkxNZXRhZGF0YVJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBQcmFzaGFudCBEZXZhIC0gQnVnIDE5NDY3NCBbcHJvdl0gUHJvdmlkZSB3cml0ZSBhY2Nlc3MgdG8gbWV0YWRhdGEgcmVwb3NpdG9yeQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5OwotCi0vKioKLSAqIEEgbWV0YWRhdGEgcmVwb3NpdG9yeSBiYWNrZWQgYnkgYW4gYXJiaXRyYXJ5IFVSTC4KLSAqLwotcHVibGljIGNsYXNzIFVSTE1ldGFkYXRhUmVwb3NpdG9yeSBleHRlbmRzIEFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRklMRU5BTUUgPSAiY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRVhURU5TSU9OID0gIi54bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfVFlQRSA9IFVSTE1ldGFkYXRhUmVwb3NpdG9yeS5jbGFzcy5nZXROYW1lKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50ZWdlciBSRVBPU0lUT1JZX1ZFUlNJT04gPSBuZXcgSW50ZWdlcigxKTsKLQotCXRyYW5zaWVudCBwcm90ZWN0ZWQgVVJMIGNvbnRlbnQ7Ci0JcHJvdGVjdGVkIEhhc2hTZXQgdW5pdHMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0QWN0dWFsTG9jYXRpb24oVVJMIGJhc2UpIHsKLQkJcmV0dXJuIGdldEFjdHVhbExvY2F0aW9uKGJhc2UsIFhNTF9FWFRFTlNJT04pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgVVJMIGdldEFjdHVhbExvY2F0aW9uKFVSTCBiYXNlLCBTdHJpbmcgZXh0ZW5zaW9uKSB7Ci0JCWlmIChleHRlbnNpb24gPT0gbnVsbCkgewotCQkJZXh0ZW5zaW9uID0gWE1MX0VYVEVOU0lPTjsKLQkJfQotCQlTdHJpbmcgc3BlYyA9IGJhc2UudG9FeHRlcm5hbEZvcm0oKTsKLQkJaWYgKHNwZWMuZW5kc1dpdGgoQ09OVEVOVF9GSUxFTkFNRSArIGV4dGVuc2lvbikpCi0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgVVJMKHNwZWMgKyBleHRlbnNpb24pOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUxKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCWlmIChzcGVjLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCXNwZWMgKz0gQ09OVEVOVF9GSUxFTkFNRTsKLQkJZWxzZQotCQkJc3BlYyArPSAiLyIgKyBDT05URU5UX0ZJTEVOQU1FOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTChzcGVjICsgZXh0ZW5zaW9uKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIFVSTE1ldGFkYXRhUmVwb3NpdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVVJMTWV0YWRhdGFSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgU3RyaW5nIG5hbWUsIE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCXN1cGVyKG5hbWUgPT0gbnVsbCA/IChsb2NhdGlvbiAhPSBudWxsID8gbG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSA6ICIiKSA6IG5hbWUsIFJFUE9TSVRPUllfVFlQRSwgUkVQT1NJVE9SWV9WRVJTSU9OLnRvU3RyaW5nKCksIGxvY2F0aW9uLCBudWxsLCBudWxsLCBwcm9wZXJ0aWVzKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZW50ID0gZ2V0QWN0dWFsTG9jYXRpb24obG9jYXRpb24pOwotCX0KLQotCXByb3RlY3RlZCBVUkwgZ2V0Q29udGVudFVSTCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShSZXBvc2l0b3J5U3RhdGUgc3RhdGUpIHsKLQkJdGhpcy5uYW1lID0gc3RhdGUuTmFtZTsKLQkJdGhpcy50eXBlID0gc3RhdGUuVHlwZTsKLQkJdGhpcy52ZXJzaW9uID0gc3RhdGUuVmVyc2lvbi50b1N0cmluZygpOwotCQl0aGlzLnByb3ZpZGVyID0gc3RhdGUuUHJvdmlkZXI7Ci0JCXRoaXMuZGVzY3JpcHRpb24gPSBzdGF0ZS5EZXNjcmlwdGlvbjsKLQkJdGhpcy5sb2NhdGlvbiA9IHN0YXRlLkxvY2F0aW9uOwotCQl0aGlzLnByb3BlcnRpZXMgPSBzdGF0ZS5Qcm9wZXJ0aWVzOwotCQl0aGlzLnVuaXRzLmFkZEFsbChBcnJheXMuYXNMaXN0KHN0YXRlLlVuaXRzKSk7Ci0JfQotCi0JLy8gVXNlIHRoaXMgbWV0aG9kIHRvIHNldHVwIGFueSB0cmFuc2llbnQgZmllbGRzIGV0YyBhZnRlciB0aGUgb2JqZWN0IGhhcyBiZWVuIHJlc3RvcmVkIGZyb20gYSBzdHJlYW0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplQWZ0ZXJMb2FkKFVSTCByZXBvTG9jYXRpb24pIHsKLQkJdGhpcy5sb2NhdGlvbiA9IHJlcG9Mb2NhdGlvbjsKLQkJY29udGVudCA9IGdldEFjdHVhbExvY2F0aW9uKGxvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdG9yIHF1ZXJ5KFF1ZXJ5IHF1ZXJ5LCBDb2xsZWN0b3IgY29sbGVjdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIHF1ZXJ5LnBlcmZvcm0odW5pdHMuaXRlcmF0b3IoKSwgY29sbGVjdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L2lvL01ldGFkYXRhUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L2lvL01ldGFkYXRhUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMDkzNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9pby9NZXRhZGF0YVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBHZW51aXRlYywgTExDIC0gYWRkZWQgbGljZW5zZSBzdXBwb3J0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LmlvOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5PcmRlcmVkUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2UuWE1MUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuUmVwb3NpdG9yeVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRhZGF0YVBhcnNlciBleHRlbmRzIFhNTFBhcnNlciBpbXBsZW1lbnRzIFhNTENvbnN0YW50cyB7Ci0KLQlwdWJsaWMgTWV0YWRhdGFQYXJzZXIoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgYnVuZGxlSWQpIHsKLQkJc3VwZXIoY29udGV4dCwgYnVuZGxlSWQpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBSZXBvc2l0b3J5UmVmZXJlbmNlc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCQlwcml2YXRlIEhhc2hTZXQgcmVmZXJlbmNlczsKLQotCQlwdWJsaWMgUmVwb3NpdG9yeVJlZmVyZW5jZXNIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIFJFUE9TSVRPUllfUkVGRVJFTkNFU19FTEVNRU5UKTsKLQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCXJlZmVyZW5jZXMgPSAoc2l6ZSAhPSBudWxsID8gbmV3IEhhc2hTZXQoSW50ZWdlci5wYXJzZUludChzaXplKSkgOiBuZXcgSGFzaFNldCg0KSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKFJFUE9TSVRPUllfUkVGRVJFTkNFX0VMRU1FTlQpKSB7Ci0JCQkJbmV3IFJlcG9zaXRvcnlSZWZlcmVuY2VIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMsIHJlZmVyZW5jZXMpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBSZXBvc2l0b3J5UmVmZXJlbmNlW10gZ2V0UmVmZXJlbmNlcygpIHsKLQkJCXJldHVybiAoUmVwb3NpdG9yeVJlZmVyZW5jZVtdKSByZWZlcmVuY2VzLnRvQXJyYXkobmV3IFJlcG9zaXRvcnlSZWZlcmVuY2VbcmVmZXJlbmNlcy5zaXplKCldKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBSZXBvc2l0b3J5UmVmZXJlbmNlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSByZXF1aXJlZCA9IG5ldyBTdHJpbmdbXSB7VVJMX0FUVFJJQlVURSwgVFlQRV9BVFRSSUJVVEUsIE9QVElPTlNfQVRUUklCVVRFfTsKLQotCQlwdWJsaWMgUmVwb3NpdG9yeVJlZmVyZW5jZUhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgU2V0IHJlZmVyZW5jZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIFJFUE9TSVRPUllfUkVGRVJFTkNFX0VMRU1FTlQpOwotCQkJU3RyaW5nW10gdmFsdWVzID0gcGFyc2VSZXF1aXJlZEF0dHJpYnV0ZXMoYXR0cmlidXRlcywgcmVxdWlyZWQpOwotCQkJdHJ5IHsKLQkJCQlpbnQgdHlwZSA9IGNoZWNrSW50ZWdlcihlbGVtZW50SGFuZGxlZCwgVFlQRV9BVFRSSUJVVEUsIHZhbHVlc1sxXSk7Ci0JCQkJaW50IG9wdGlvbnMgPSBjaGVja0ludGVnZXIoZWxlbWVudEhhbmRsZWQsIE9QVElPTlNfQVRUUklCVVRFLCB2YWx1ZXNbMl0pOwotCQkJCXJlZmVyZW5jZXMuYWRkKG5ldyBSZXBvc2l0b3J5UmVmZXJlbmNlKG5ldyBVUkwodmFsdWVzWzBdKSwgdHlwZSwgb3B0aW9ucykpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlpbnZhbGlkQXR0cmlidXRlVmFsdWUoZWxlbWVudEhhbmRsZWQsIFVSTF9BVFRSSUJVVEUsIHZhbHVlc1swXSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgSW5zdGFsbGFibGVVbml0c0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCQlwcml2YXRlIEFycmF5TGlzdCB1bml0czsKLQotCQlwdWJsaWMgSW5zdGFsbGFibGVVbml0c0hhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgSU5TVEFMTEFCTEVfVU5JVFNfRUxFTUVOVCk7Ci0JCQlTdHJpbmcgc2l6ZSA9IHBhcnNlT3B0aW9uYWxBdHRyaWJ1dGUoYXR0cmlidXRlcywgQ09MTEVDVElPTl9TSVpFX0FUVFJJQlVURSk7Ci0JCQl1bml0cyA9IChzaXplICE9IG51bGwgPyBuZXcgQXJyYXlMaXN0KG5ldyBJbnRlZ2VyKHNpemUpLmludFZhbHVlKCkpIDogbmV3IEFycmF5TGlzdCg0KSk7Ci0JCX0KLQotCQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdFtdIGdldFVuaXRzKCkgewotCQkJaW50IHNpemUgPSB1bml0cy5zaXplKCk7Ci0JCQlJSW5zdGFsbGFibGVVbml0W10gcmVzdWx0ID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbc2l6ZV07Ci0JCQlpbnQgaSA9IDA7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdW5pdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyBpKyspIHsKLQkJCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBkZXNjID0gKEluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJcmVzdWx0W2ldID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChkZXNjKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKElOU1RBTExBQkxFX1VOSVRfRUxFTUVOVCkpIHsKLQkJCQluZXcgSW5zdGFsbGFibGVVbml0SGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCB1bml0cyk7Ci0JCQl9IGVsc2UgewotCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEluc3RhbGxhYmxlVW5pdEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHJlcXVpcmVkID0gbmV3IFN0cmluZ1tdIHtJRF9BVFRSSUJVVEUsIFZFUlNJT05fQVRUUklCVVRFfTsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBvcHRpb25hbCA9IG5ldyBTdHJpbmdbXSB7U0lOR0xFVE9OX0FUVFJJQlVURX07Ci0KLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gY3VycmVudFVuaXQgPSBudWxsOwotCi0JCXByaXZhdGUgUHJvcGVydGllc0hhbmRsZXIgcHJvcGVydGllc0hhbmRsZXIgPSBudWxsOwotCQlwcml2YXRlIFByb3ZpZGVkQ2FwYWJpbGl0aWVzSGFuZGxlciBwcm92aWRlZENhcGFiaWxpdGllc0hhbmRsZXIgPSBudWxsOwotCQlwcml2YXRlIFJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlciByZXF1aXJlZENhcGFiaWxpdGllc0hhbmRsZXIgPSBudWxsOwotCQlwcml2YXRlIEhvc3RSZXF1aXJlZENhcGFiaWxpdGllc0hhbmRsZXIgaG9zdFJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlciA9IG51bGw7Ci0JCXByaXZhdGUgVGV4dEhhbmRsZXIgZmlsdGVySGFuZGxlciA9IG51bGw7Ci0JCXByaXZhdGUgQXJ0aWZhY3RzSGFuZGxlciBhcnRpZmFjdHNIYW5kbGVyID0gbnVsbDsKLQkJcHJpdmF0ZSBUb3VjaHBvaW50VHlwZUhhbmRsZXIgdG91Y2hwb2ludFR5cGVIYW5kbGVyID0gbnVsbDsKLQkJcHJpdmF0ZSBUb3VjaHBvaW50RGF0YUhhbmRsZXIgdG91Y2hwb2ludERhdGFIYW5kbGVyID0gbnVsbDsKLQkJcHJpdmF0ZSBVcGRhdGVEZXNjcmlwdG9ySGFuZGxlciB1cGRhdGVEZXNjcmlwdG9ySGFuZGxlciA9IG51bGw7Ci0JCXByaXZhdGUgTGljZW5zZXNIYW5kbGVyIGxpY2Vuc2VzSGFuZGxlciA9IG51bGw7Ci0JCXByaXZhdGUgQ29weXJpZ2h0SGFuZGxlciBjb3B5cmlnaHRIYW5kbGVyID0gbnVsbDsKLQkJcHJpdmF0ZSBSZXF1aXJlbWVudHNDaGFuZ2VIYW5kbGVyIHJlcXVpcmVtZW50Q2hhbmdlc0hhbmRsZXIgPSBudWxsOwotCQlwcml2YXRlIEFwcGxpY2FiaWxpdHlTY29wZXNIYW5kbGVyIGFwcGxpY2FiaWxpdHlTY29wZUhhbmRsZXIgPSBudWxsOwotCQlwcml2YXRlIExpZmVDeWNsZUhhbmRsZXIgbGlmZUN5Y2xlSGFuZGxlcjsKLQotCQlwcml2YXRlIFN0cmluZyBpZDsKLQkJcHJpdmF0ZSBWZXJzaW9uIHZlcnNpb247Ci0JCXByaXZhdGUgYm9vbGVhbiBzaW5nbGV0b247Ci0KLQkJcHJpdmF0ZSBMaXN0IHVuaXRzOwotCi0JCXB1YmxpYyBJbnN0YWxsYWJsZVVuaXRIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIExpc3QgdW5pdHMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIElOU1RBTExBQkxFX1VOSVRfRUxFTUVOVCk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSBwYXJzZUF0dHJpYnV0ZXMoYXR0cmlidXRlcywgcmVxdWlyZWQsIG9wdGlvbmFsKTsKLQkJCXRoaXMudW5pdHMgPSB1bml0czsKLQkJCS8vc2tpcCBlbnRpcmUgSVUgaWYgdGhlIGlkIGlzIG1pc3NpbmcKLQkJCWlmICh2YWx1ZXNbMF0gPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCWlkID0gdmFsdWVzWzBdOwotCQkJdmVyc2lvbiA9IGNoZWNrVmVyc2lvbihJTlNUQUxMQUJMRV9VTklUX0VMRU1FTlQsIFZFUlNJT05fQVRUUklCVVRFLCB2YWx1ZXNbMV0pOwotCQkJc2luZ2xldG9uID0gY2hlY2tCb29sZWFuKElOU1RBTExBQkxFX1VOSVRfRUxFTUVOVCwgU0lOR0xFVE9OX0FUVFJJQlVURSwgdmFsdWVzWzJdLCB0cnVlKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCi0JCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IGdldEluc3RhbGxhYmxlVW5pdCgpIHsKLQkJCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGN1cnJlbnRVbml0KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQljaGVja0NhbmNlbCgpOwotCQkJaWYgKFBST1BFUlRJRVNfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQlpZiAocHJvcGVydGllc0hhbmRsZXIgPT0gbnVsbCkgewotCQkJCQlwcm9wZXJ0aWVzSGFuZGxlciA9IG5ldyBQcm9wZXJ0aWVzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoUFJPVklERURfQ0FQQUJJTElUSUVTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJaWYgKHByb3ZpZGVkQ2FwYWJpbGl0aWVzSGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCXByb3ZpZGVkQ2FwYWJpbGl0aWVzSGFuZGxlciA9IG5ldyBQcm92aWRlZENhcGFiaWxpdGllc0hhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFJFUVVJUkVEX0NBUEFCSUxJVElFU19FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCWlmIChyZXF1aXJlZENhcGFiaWxpdGllc0hhbmRsZXIgPT0gbnVsbCkgewotCQkJCQlyZXF1aXJlZENhcGFiaWxpdGllc0hhbmRsZXIgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXRpZXNIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChIT1NUX1JFUVVJUkVEX0NBUEFCSUxJVElFU19FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCWlmIChob3N0UmVxdWlyZWRDYXBhYmlsaXRpZXNIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJaG9zdFJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlciA9IG5ldyBIb3N0UmVxdWlyZWRDYXBhYmlsaXRpZXNIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChJVV9GSUxURVJfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQlpZiAoZmlsdGVySGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCWZpbHRlckhhbmRsZXIgPSBuZXcgVGV4dEhhbmRsZXIodGhpcywgSVVfRklMVEVSX0VMRU1FTlQsIGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChBUlRJRkFDVF9LRVlTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJaWYgKGFydGlmYWN0c0hhbmRsZXIgPT0gbnVsbCkgewotCQkJCQlhcnRpZmFjdHNIYW5kbGVyID0gbmV3IEFydGlmYWN0c0hhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKFRPVUNIUE9JTlRfVFlQRV9FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCWlmICh0b3VjaHBvaW50VHlwZUhhbmRsZXIgPT0gbnVsbCkgewotCQkJCQl0b3VjaHBvaW50VHlwZUhhbmRsZXIgPSBuZXcgVG91Y2hwb2ludFR5cGVIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChUT1VDSFBPSU5UX0RBVEFfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQlpZiAodG91Y2hwb2ludERhdGFIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJdG91Y2hwb2ludERhdGFIYW5kbGVyID0gbmV3IFRvdWNocG9pbnREYXRhSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoVVBEQVRFX0RFU0NSSVBUT1JfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQlpZiAodXBkYXRlRGVzY3JpcHRvckhhbmRsZXIgPT0gbnVsbCkKLQkJCQkJdXBkYXRlRGVzY3JpcHRvckhhbmRsZXIgPSBuZXcgVXBkYXRlRGVzY3JpcHRvckhhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQkJZWxzZSB7Ci0JCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChMSUNFTlNFU19FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCWlmIChsaWNlbnNlc0hhbmRsZXIgPT0gbnVsbCkgewotCQkJCQlsaWNlbnNlc0hhbmRsZXIgPSBuZXcgTGljZW5zZXNIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChSRVFVSVJFTUVOVF9DSEFOR0VTLmVxdWFscyhuYW1lKSkgewotCQkJCWlmIChyZXF1aXJlbWVudENoYW5nZXNIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJcmVxdWlyZW1lbnRDaGFuZ2VzSGFuZGxlciA9IG5ldyBSZXF1aXJlbWVudHNDaGFuZ2VIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChBUFBMSUNBQklMSVRZX1NDT1BFLmVxdWFscyhuYW1lKSkgewotCQkJCWlmIChhcHBsaWNhYmlsaXR5U2NvcGVIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJYXBwbGljYWJpbGl0eVNjb3BlSGFuZGxlciA9IG5ldyBBcHBsaWNhYmlsaXR5U2NvcGVzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0gZWxzZSBpZiAoTElGRUNZQ0xFLmVxdWFscyhuYW1lKSkgewotCQkJCWlmIChsaWZlQ3ljbGVIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJbGlmZUN5Y2xlSGFuZGxlciA9IG5ldyBMaWZlQ3ljbGVIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChDT1BZUklHSFRfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQlpZiAoY29weXJpZ2h0SGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCWNvcHlyaWdodEhhbmRsZXIgPSBuZXcgQ29weXJpZ2h0SGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlkdXBsaWNhdGVFbGVtZW50KHRoaXMsIG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZCgpIHsKLQkJCWlmIChpc1ZhbGlkWE1MKCkpIHsKLQkJCQlpZiAocmVxdWlyZW1lbnRDaGFuZ2VzSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCWN1cnJlbnRVbml0ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXRQYXRjaERlc2NyaXB0aW9uKCk7Ci0JCQkJCSgoSW5zdGFsbGFibGVVbml0UGF0Y2hEZXNjcmlwdGlvbikgY3VycmVudFVuaXQpLnNldFJlcXVpcmVtZW50Q2hhbmdlcygoUmVxdWlyZW1lbnRDaGFuZ2VbXSkgcmVxdWlyZW1lbnRDaGFuZ2VzSGFuZGxlci5nZXRSZXF1aXJlbWVudENoYW5nZXMoKS50b0FycmF5KG5ldyBSZXF1aXJlbWVudENoYW5nZVtyZXF1aXJlbWVudENoYW5nZXNIYW5kbGVyLmdldFJlcXVpcmVtZW50Q2hhbmdlcygpLnNpemUoKV0pKTsKLQkJCQkJaWYgKGFwcGxpY2FiaWxpdHlTY29wZUhhbmRsZXIgIT0gbnVsbCkKLQkJCQkJCSgoSW5zdGFsbGFibGVVbml0UGF0Y2hEZXNjcmlwdGlvbikgY3VycmVudFVuaXQpLnNldEFwcGxpY2FiaWxpdHlTY29wZShhcHBsaWNhYmlsaXR5U2NvcGVIYW5kbGVyLmdldFNjb3BlKCkpOwotCQkJCQlpZiAobGlmZUN5Y2xlSGFuZGxlciAhPSBudWxsKQotCQkJCQkJKChJbnN0YWxsYWJsZVVuaXRQYXRjaERlc2NyaXB0aW9uKSBjdXJyZW50VW5pdCkuc2V0TGlmZUN5Y2xlKGxpZmVDeWNsZUhhbmRsZXIuZ2V0TGlmZUN5Y2xlUmVxdWlyZW1lbnQoKSk7Ci0JCQkJfSBlbHNlIGlmIChob3N0UmVxdWlyZWRDYXBhYmlsaXRpZXNIYW5kbGVyID09IG51bGwgfHwgaG9zdFJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlci5nZXRIb3N0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKS5sZW5ndGggPT0gMCkgewotCQkJCQljdXJyZW50VW5pdCA9IG5ldyBJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWN1cnJlbnRVbml0ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCSgoSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbikgY3VycmVudFVuaXQpLnNldEhvc3QoaG9zdFJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlci5nZXRIb3N0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSk7Ci0JCQkJfQotCQkJCWN1cnJlbnRVbml0LnNldElkKGlkKTsKLQkJCQljdXJyZW50VW5pdC5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQkJCWN1cnJlbnRVbml0LnNldFNpbmdsZXRvbihzaW5nbGV0b24pOwotCQkJCU9yZGVyZWRQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSAocHJvcGVydGllc0hhbmRsZXIgPT0gbnVsbCA/IG5ldyBPcmRlcmVkUHJvcGVydGllcygwKSA6IHByb3BlcnRpZXNIYW5kbGVyLmdldFByb3BlcnRpZXMoKSk7Ci0JCQkJU3RyaW5nIHVwZGF0ZUZyb20gPSBudWxsOwotCQkJCVZlcnNpb25SYW5nZSB1cGRhdGVSYW5nZSA9IG51bGw7Ci0JCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gcHJvcGVydGllcy5rZXlzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoa2V5KTsKLQkJCQkJLy9CYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0JCQkJCWlmIChrZXkuZXF1YWxzKCJlcXVpbm94LnAyLnVwZGF0ZS5mcm9tIikpIHsKLQkJCQkJCXVwZGF0ZUZyb20gPSB2YWx1ZTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWlmIChrZXkuZXF1YWxzKCJlcXVpbm94LnAyLnVwZGF0ZS5yYW5nZSIpKSB7Ci0JCQkJCQl1cGRhdGVSYW5nZSA9IG5ldyBWZXJzaW9uUmFuZ2UodmFsdWUpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJLy9FbmQgb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotCQkJCQljdXJyZW50VW5pdC5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLQkJCQl9Ci0JCQkJLy9CYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0JCQkJaWYgKHVwZGF0ZUZyb20gIT0gbnVsbCAmJiB1cGRhdGVSYW5nZSAhPSBudWxsKQotCQkJCQljdXJyZW50VW5pdC5zZXRVcGRhdGVEZXNjcmlwdG9yKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVVcGRhdGVEZXNjcmlwdG9yKHVwZGF0ZUZyb20sIHVwZGF0ZVJhbmdlLCBJVXBkYXRlRGVzY3JpcHRvci5OT1JNQUwsIG51bGwpKTsKLQkJCQkvL0VuZCBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0KLQkJCQlpZiAobGljZW5zZXNIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJTGljZW5zZSBsaWNlbnNlID0gbGljZW5zZXNIYW5kbGVyLmdldExpY2Vuc2UoKTsKLQkJCQkJY3VycmVudFVuaXQuc2V0TGljZW5zZShsaWNlbnNlKTsKLQkJCQl9Ci0KLQkJCQlpZiAoY29weXJpZ2h0SGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCUNvcHlyaWdodCBjb3B5cmlnaHQgPSBjb3B5cmlnaHRIYW5kbGVyLmdldENvcHlyaWdodCgpOwotCQkJCQljdXJyZW50VW5pdC5zZXRDb3B5cmlnaHQoY29weXJpZ2h0KTsKLQkJCQl9Ci0KLQkJCQlQcm92aWRlZENhcGFiaWxpdHlbXSBwcm92aWRlZENhcGFiaWxpdGllcyA9IChwcm92aWRlZENhcGFiaWxpdGllc0hhbmRsZXIgPT0gbnVsbCA/IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbMF0gOiBwcm92aWRlZENhcGFiaWxpdGllc0hhbmRsZXIuZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKSk7Ci0JCQkJY3VycmVudFVuaXQuc2V0Q2FwYWJpbGl0aWVzKHByb3ZpZGVkQ2FwYWJpbGl0aWVzKTsKLQkJCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZENhcGFiaWxpdGllcyA9IChyZXF1aXJlZENhcGFiaWxpdGllc0hhbmRsZXIgPT0gbnVsbCA/IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbMF0gOiByZXF1aXJlZENhcGFiaWxpdGllc0hhbmRsZXIuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSk7Ci0JCQkJY3VycmVudFVuaXQuc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMocmVxdWlyZWRDYXBhYmlsaXRpZXMpOwotCQkJCWlmIChmaWx0ZXJIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJY3VycmVudFVuaXQuc2V0RmlsdGVyKGZpbHRlckhhbmRsZXIuZ2V0VGV4dCgpKTsKLQkJCQl9Ci0JCQkJSUFydGlmYWN0S2V5W10gYXJ0aWZhY3RzID0gKGFydGlmYWN0c0hhbmRsZXIgPT0gbnVsbCA/IG5ldyBJQXJ0aWZhY3RLZXlbMF0gOiBhcnRpZmFjdHNIYW5kbGVyLmdldEFydGlmYWN0S2V5cygpKTsKLQkJCQljdXJyZW50VW5pdC5zZXRBcnRpZmFjdHMoYXJ0aWZhY3RzKTsKLQkJCQlpZiAodG91Y2hwb2ludFR5cGVIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJY3VycmVudFVuaXQuc2V0VG91Y2hwb2ludFR5cGUodG91Y2hwb2ludFR5cGVIYW5kbGVyLmdldFRvdWNocG9pbnRUeXBlKCkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIFRPRE86IGNyZWF0ZSBhbiBlcnJvcgotCQkJCX0KLQkJCQlUb3VjaHBvaW50RGF0YVtdIHRvdWNocG9pbnREYXRhID0gKHRvdWNocG9pbnREYXRhSGFuZGxlciA9PSBudWxsID8gbmV3IFRvdWNocG9pbnREYXRhWzBdIDogdG91Y2hwb2ludERhdGFIYW5kbGVyLmdldFRvdWNocG9pbnREYXRhKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG91Y2hwb2ludERhdGEubGVuZ3RoOyBpKyspCi0JCQkJCWN1cnJlbnRVbml0LmFkZFRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhW2ldKTsKLQkJCQlpZiAodXBkYXRlRGVzY3JpcHRvckhhbmRsZXIgIT0gbnVsbCkKLQkJCQkJY3VycmVudFVuaXQuc2V0VXBkYXRlRGVzY3JpcHRvcih1cGRhdGVEZXNjcmlwdG9ySGFuZGxlci5nZXRVcGRhdGVEZXNjcmlwdG9yKCkpOwotCQkJCXVuaXRzLmFkZChjdXJyZW50VW5pdCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgQXBwbGljYWJpbGl0eVNjb3Blc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCQlwcml2YXRlIExpc3Qgc2NvcGVzOwotCi0JCXB1YmxpYyBBcHBsaWNhYmlsaXR5U2NvcGVzSGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBBUFBMSUNBQklMSVRZX1NDT1BFKTsKLQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCXNjb3BlcyA9IChzaXplICE9IG51bGwgPyBuZXcgQXJyYXlMaXN0KG5ldyBJbnRlZ2VyKHNpemUpLmludFZhbHVlKCkpIDogbmV3IEFycmF5TGlzdCg0KSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKEFQUExZX09OLmVxdWFscyhuYW1lKSkgewotCQkJCW5ldyBBcHBsaWNhYmlsaXR5U2NvcGVIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMsIHNjb3Blcyk7Ci0JCQl9IGVsc2UgewotCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgUmVxdWlyZWRDYXBhYmlsaXR5W11bXSBnZXRTY29wZSgpIHsKLQkJCXJldHVybiAoUmVxdWlyZWRDYXBhYmlsaXR5W11bXSkgc2NvcGVzLnRvQXJyYXkobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtzY29wZXMuc2l6ZSgpXVtdKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBBcHBsaWNhYmlsaXR5U2NvcGVIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQkJcHJpdmF0ZSBSZXF1aXJlZENhcGFiaWxpdGllc0hhbmRsZXIgY2hpbGRyZW47Ci0JCXByaXZhdGUgTGlzdCBzY29wZXM7Ci0KLQkJcHVibGljIEFwcGxpY2FiaWxpdHlTY29wZUhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdCBzY29wZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIEFQUExZX09OKTsKLQkJCXRoaXMuc2NvcGVzID0gc2NvcGVzOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCWlmIChSRVFVSVJFRF9DQVBBQklMSVRJRVNfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQljaGlsZHJlbiA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdGllc0hhbmRsZXIodGhpcywgYXR0cmlidXRlcyk7Ci0JCQl9IGVsc2UgewotCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZCgpIHsKLQkJCXNjb3Blcy5hZGQoY2hpbGRyZW4uZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUmVxdWlyZW1lbnRzQ2hhbmdlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0JCXByaXZhdGUgTGlzdCByZXF1aXJlbWVudENoYW5nZXM7Ci0KLQkJcHVibGljIFJlcXVpcmVtZW50c0NoYW5nZUhhbmRsZXIoSW5zdGFsbGFibGVVbml0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIFJFUVVJUkVNRU5UX0NIQU5HRVMpOwotCQkJU3RyaW5nIHNpemUgPSBwYXJzZU9wdGlvbmFsQXR0cmlidXRlKGF0dHJpYnV0ZXMsIENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUpOwotCQkJcmVxdWlyZW1lbnRDaGFuZ2VzID0gKHNpemUgIT0gbnVsbCA/IG5ldyBBcnJheUxpc3QobmV3IEludGVnZXIoc2l6ZSkuaW50VmFsdWUoKSkgOiBuZXcgQXJyYXlMaXN0KDQpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUkVRVUlSRU1FTlRfQ0hBTkdFKSkgewotCQkJCW5ldyBSZXF1aXJlbWVudENoYW5nZUhhbmRsZXIodGhpcywgYXR0cmlidXRlcywgcmVxdWlyZW1lbnRDaGFuZ2VzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTGlzdCBnZXRSZXF1aXJlbWVudENoYW5nZXMoKSB7Ci0JCQlyZXR1cm4gcmVxdWlyZW1lbnRDaGFuZ2VzOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFJlcXVpcmVtZW50Q2hhbmdlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0JCXByaXZhdGUgTGlzdCBmcm9tOwotCQlwcml2YXRlIExpc3QgdG87Ci0JCXByaXZhdGUgTGlzdCByZXF1aXJlbWVudENoYW5nZXM7Ci0KLQkJcHVibGljIFJlcXVpcmVtZW50Q2hhbmdlSGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBMaXN0IHJlcXVpcmVtZW50Q2hhbmdlcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgUkVRVUlSRU1FTlRfQ0hBTkdFKTsKLQkJCWZyb20gPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJdG8gPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJdGhpcy5yZXF1aXJlbWVudENoYW5nZXMgPSByZXF1aXJlbWVudENoYW5nZXM7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKFJFUVVJUkVNRU5UX0ZST00pKSB7Ci0JCQkJbmV3IFJlcXVpcmVtZW50Q2hhbmdlRWx0SGFuZGxlcih0aGlzLCBSRVFVSVJFTUVOVF9GUk9NLCBhdHRyaWJ1dGVzLCBmcm9tKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChuYW1lLmVxdWFscyhSRVFVSVJFTUVOVF9UTykpIHsKLQkJCQluZXcgUmVxdWlyZW1lbnRDaGFuZ2VFbHRIYW5kbGVyKHRoaXMsIFJFUVVJUkVNRU5UX1RPLCBhdHRyaWJ1dGVzLCB0byk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZCgpIHsKLQkJCXJlcXVpcmVtZW50Q2hhbmdlcy5hZGQobmV3IFJlcXVpcmVtZW50Q2hhbmdlKGZyb20uc2l6ZSgpID09IDAgPyBudWxsIDogKFJlcXVpcmVkQ2FwYWJpbGl0eSkgZnJvbS5nZXQoMCksIHRvLnNpemUoKSA9PSAwID8gbnVsbCA6IChSZXF1aXJlZENhcGFiaWxpdHkpIHRvLmdldCgwKSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFJlcXVpcmVtZW50Q2hhbmdlRWx0SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0JCXByaXZhdGUgTGlzdCByZXF1aXJlbWVudDsKLQotCQlwdWJsaWMgUmVxdWlyZW1lbnRDaGFuZ2VFbHRIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBTdHJpbmcgcGFyZW50SWQsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcywgTGlzdCBmcm9tKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBwYXJlbnRJZCk7Ci0JCQlyZXF1aXJlbWVudCA9IGZyb207Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKFJFUVVJUkVEX0NBUEFCSUxJVFlfRUxFTUVOVC5lcXVhbHMobmFtZSkpCi0JCQkJbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eUhhbmRsZXIodGhpcywgYXR0cmlidXRlcywgcmVxdWlyZW1lbnQpOwotCQkJZWxzZSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBMaWZlQ3ljbGVIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQkJcHJpdmF0ZSBMaXN0IGxpZmVDeWNsZVJlcXVpcmVtZW50OwotCi0JCXB1YmxpYyBMaWZlQ3ljbGVIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIExJRkVDWUNMRSk7Ci0JCQlsaWZlQ3ljbGVSZXF1aXJlbWVudCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCX0KLQotCQlwdWJsaWMgUmVxdWlyZWRDYXBhYmlsaXR5IGdldExpZmVDeWNsZVJlcXVpcmVtZW50KCkgewotCQkJaWYgKGxpZmVDeWNsZVJlcXVpcmVtZW50LnNpemUoKSA9PSAwKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChSZXF1aXJlZENhcGFiaWxpdHkpIGxpZmVDeWNsZVJlcXVpcmVtZW50LmdldCgwKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpZiAoUkVRVUlSRURfQ0FQQUJJTElUWV9FTEVNRU5ULmVxdWFscyhuYW1lKSkgewotCQkJCW5ldyBSZXF1aXJlZENhcGFiaWxpdHlIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMsIGxpZmVDeWNsZVJlcXVpcmVtZW50KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUHJvdmlkZWRDYXBhYmlsaXRpZXNIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQkJcHJpdmF0ZSBMaXN0IHByb3ZpZGVkQ2FwYWJpbGl0aWVzOwotCi0JCXB1YmxpYyBQcm92aWRlZENhcGFiaWxpdGllc0hhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgUFJPVklERURfQ0FQQUJJTElUSUVTX0VMRU1FTlQpOwotCQkJU3RyaW5nIHNpemUgPSBwYXJzZU9wdGlvbmFsQXR0cmlidXRlKGF0dHJpYnV0ZXMsIENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUpOwotCQkJcHJvdmlkZWRDYXBhYmlsaXRpZXMgPSAoc2l6ZSAhPSBudWxsID8gbmV3IEFycmF5TGlzdChuZXcgSW50ZWdlcihzaXplKS5pbnRWYWx1ZSgpKSA6IG5ldyBBcnJheUxpc3QoNCkpOwotCQl9Ci0KLQkJcHVibGljIFByb3ZpZGVkQ2FwYWJpbGl0eVtdIGdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCkgewotCQkJcmV0dXJuIChQcm92aWRlZENhcGFiaWxpdHlbXSkgcHJvdmlkZWRDYXBhYmlsaXRpZXMudG9BcnJheShuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W3Byb3ZpZGVkQ2FwYWJpbGl0aWVzLnNpemUoKV0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCWlmIChuYW1lLmVxdWFscyhQUk9WSURFRF9DQVBBQklMSVRZX0VMRU1FTlQpKSB7Ci0JCQkJbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eUhhbmRsZXIodGhpcywgYXR0cmlidXRlcywgcHJvdmlkZWRDYXBhYmlsaXRpZXMpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBQcm92aWRlZENhcGFiaWxpdHlIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSByZXF1aXJlZCA9IG5ldyBTdHJpbmdbXSB7TkFNRVNQQUNFX0FUVFJJQlVURSwgTkFNRV9BVFRSSUJVVEUsIFZFUlNJT05fQVRUUklCVVRFfTsKLQotCQlwdWJsaWMgUHJvdmlkZWRDYXBhYmlsaXR5SGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBMaXN0IGNhcGFiaWxpdGllcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgUFJPVklERURfQ0FQQUJJTElUWV9FTEVNRU5UKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHBhcnNlUmVxdWlyZWRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHJlcXVpcmVkKTsKLQkJCVZlcnNpb24gdmVyc2lvbiA9IGNoZWNrVmVyc2lvbihQUk9WSURFRF9DQVBBQklMSVRZX0VMRU1FTlQsIFZFUlNJT05fQVRUUklCVVRFLCB2YWx1ZXNbMl0pOwotCQkJY2FwYWJpbGl0aWVzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KHZhbHVlc1swXSwgdmFsdWVzWzFdLCB2ZXJzaW9uKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgSG9zdFJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0JCXByaXZhdGUgTGlzdCByZXF1aXJlZENhcGFiaWxpdGllczsKLQotCQlwdWJsaWMgSG9zdFJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBIT1NUX1JFUVVJUkVEX0NBUEFCSUxJVElFU19FTEVNRU5UKTsKLQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCXJlcXVpcmVkQ2FwYWJpbGl0aWVzID0gKHNpemUgIT0gbnVsbCA/IG5ldyBBcnJheUxpc3QobmV3IEludGVnZXIoc2l6ZSkuaW50VmFsdWUoKSkgOiBuZXcgQXJyYXlMaXN0KDQpKTsKLQkJfQotCi0JCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHlbXSBnZXRIb3N0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSB7Ci0JCQlyZXR1cm4gKFJlcXVpcmVkQ2FwYWJpbGl0eVtdKSByZXF1aXJlZENhcGFiaWxpdGllcy50b0FycmF5KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbcmVxdWlyZWRDYXBhYmlsaXRpZXMuc2l6ZSgpXSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKFJFUVVJUkVEX0NBUEFCSUxJVFlfRUxFTUVOVCkpIHsKLQkJCQluZXcgUmVxdWlyZWRDYXBhYmlsaXR5SGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCByZXF1aXJlZENhcGFiaWxpdGllcyk7Ci0JCQl9IGVsc2UgewotCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFJlcXVpcmVkQ2FwYWJpbGl0aWVzSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0JCXByaXZhdGUgTGlzdCByZXF1aXJlZENhcGFiaWxpdGllczsKLQotCQlwdWJsaWMgUmVxdWlyZWRDYXBhYmlsaXRpZXNIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIFJFUVVJUkVEX0NBUEFCSUxJVElFU19FTEVNRU5UKTsKLQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCXJlcXVpcmVkQ2FwYWJpbGl0aWVzID0gKHNpemUgIT0gbnVsbCA/IG5ldyBBcnJheUxpc3QobmV3IEludGVnZXIoc2l6ZSkuaW50VmFsdWUoKSkgOiBuZXcgQXJyYXlMaXN0KDQpKTsKLQkJfQotCi0JCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHlbXSBnZXRSZXF1aXJlZENhcGFiaWxpdGllcygpIHsKLQkJCXJldHVybiAoUmVxdWlyZWRDYXBhYmlsaXR5W10pIHJlcXVpcmVkQ2FwYWJpbGl0aWVzLnRvQXJyYXkobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtyZXF1aXJlZENhcGFiaWxpdGllcy5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoUkVRVUlSRURfQ0FQQUJJTElUWV9FTEVNRU5UKSkgewotCQkJCW5ldyBSZXF1aXJlZENhcGFiaWxpdHlIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMsIHJlcXVpcmVkQ2FwYWJpbGl0aWVzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgUmVxdWlyZWRDYXBhYmlsaXR5SGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gcmVxdWlyZWQgPSBuZXcgU3RyaW5nW10ge05BTUVTUEFDRV9BVFRSSUJVVEUsIE5BTUVfQVRUUklCVVRFLCBWRVJTSU9OX1JBTkdFX0FUVFJJQlVURX07Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gb3B0aW9uYWwgPSBuZXcgU3RyaW5nW10ge0NBUEFCSUxJVFlfT1BUSU9OQUxfQVRUUklCVVRFLCBDQVBBQklMSVRZX01VTFRJUExFX0FUVFJJQlVURSwgQ0FQQUJJTElUWV9HUkVFRF9BVFRSSUJVVEV9OwotCi0JCXByaXZhdGUgUmVxdWlyZWRDYXBhYmlsaXR5IGN1cnJlbnRDYXBhYmlsaXR5ID0gbnVsbDsKLQotCQlwcml2YXRlIFRleHRIYW5kbGVyIGZpbHRlckhhbmRsZXIgPSBudWxsOwotCQlwcml2YXRlIENhcGFiaWxpdHlTZWxlY3RvcnNIYW5kbGVyIHNlbGVjdG9yc0hhbmRsZXIgPSBudWxsOwotCi0JCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHlIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIExpc3QgY2FwYWJpbGl0aWVzKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBSRVFVSVJFRF9DQVBBQklMSVRZX0VMRU1FTlQpOwotCQkJU3RyaW5nW10gdmFsdWVzID0gcGFyc2VBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHJlcXVpcmVkLCBvcHRpb25hbCk7Ci0JCQlWZXJzaW9uUmFuZ2UgcmFuZ2UgPSBjaGVja1ZlcnNpb25SYW5nZShSRVFVSVJFRF9DQVBBQklMSVRZX0VMRU1FTlQsIFZFUlNJT05fUkFOR0VfQVRUUklCVVRFLCB2YWx1ZXNbMl0pOwotCQkJYm9vbGVhbiBpc09wdGlvbmFsID0gY2hlY2tCb29sZWFuKFJFUVVJUkVEX0NBUEFCSUxJVFlfRUxFTUVOVCwgQ0FQQUJJTElUWV9PUFRJT05BTF9BVFRSSUJVVEUsIHZhbHVlc1szXSwgZmFsc2UpLmJvb2xlYW5WYWx1ZSgpOwotCQkJYm9vbGVhbiBpc011bHRpcGxlID0gY2hlY2tCb29sZWFuKFJFUVVJUkVEX0NBUEFCSUxJVFlfRUxFTUVOVCwgQ0FQQUJJTElUWV9NVUxUSVBMRV9BVFRSSUJVVEUsIHZhbHVlc1s0XSwgZmFsc2UpLmJvb2xlYW5WYWx1ZSgpOwotCQkJYm9vbGVhbiBpc0dyZWVkeSA9IGNoZWNrQm9vbGVhbihSRVFVSVJFRF9DQVBBQklMSVRZX0VMRU1FTlQsIENBUEFCSUxJVFlfR1JFRURfQVRUUklCVVRFLCB2YWx1ZXNbNV0sIHRydWUpLmJvb2xlYW5WYWx1ZSgpOwotCQkJY3VycmVudENhcGFiaWxpdHkgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KHZhbHVlc1swXSwgdmFsdWVzWzFdLCByYW5nZSwgbnVsbCwgaXNPcHRpb25hbCwgaXNNdWx0aXBsZSwgaXNHcmVlZHkpOwotCQkJY2FwYWJpbGl0aWVzLmFkZChjdXJyZW50Q2FwYWJpbGl0eSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKENBUEFCSUxJVFlfRklMVEVSX0VMRU1FTlQpKSB7Ci0JCQkJZmlsdGVySGFuZGxlciA9IG5ldyBUZXh0SGFuZGxlcih0aGlzLCBDQVBBQklMSVRZX0ZJTFRFUl9FTEVNRU5ULCBhdHRyaWJ1dGVzKTsKLQkJCX0gZWxzZSBpZiAobmFtZS5lcXVhbHMoQ0FQQUJJTElUWV9TRUxFQ1RPUlNfRUxFTUVOVCkpIHsKLQkJCQlzZWxlY3RvcnNIYW5kbGVyID0gbmV3IENhcGFiaWxpdHlTZWxlY3RvcnNIYW5kbGVyKHRoaXMsIGF0dHJpYnV0ZXMpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkKCkgewotCQkJaWYgKGlzVmFsaWRYTUwoKSkgewotCQkJCWlmIChjdXJyZW50Q2FwYWJpbGl0eSAhPSBudWxsKSB7Ci0JCQkJCWlmIChmaWx0ZXJIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkJCWN1cnJlbnRDYXBhYmlsaXR5LnNldEZpbHRlcihmaWx0ZXJIYW5kbGVyLmdldFRleHQoKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHNlbGVjdG9yc0hhbmRsZXIgIT0gbnVsbCkgewotCQkJCQkJY3VycmVudENhcGFiaWxpdHkuc2V0U2VsZWN0b3JzKHNlbGVjdG9yc0hhbmRsZXIuZ2V0U2VsZWN0b3JzKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEFydGlmYWN0c0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCXByaXZhdGUgTGlzdCBhcnRpZmFjdHM7Ci0KLQkJcHVibGljIEFydGlmYWN0c0hhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgQVJUSUZBQ1RfS0VZU19FTEVNRU5UKTsKLQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCWFydGlmYWN0cyA9IChzaXplICE9IG51bGwgPyBuZXcgQXJyYXlMaXN0KG5ldyBJbnRlZ2VyKHNpemUpLmludFZhbHVlKCkpIDogbmV3IEFycmF5TGlzdCg0KSk7Ci0JCX0KLQotCQlwdWJsaWMgSUFydGlmYWN0S2V5W10gZ2V0QXJ0aWZhY3RLZXlzKCkgewotCQkJcmV0dXJuIChJQXJ0aWZhY3RLZXlbXSkgYXJ0aWZhY3RzLnRvQXJyYXkobmV3IElBcnRpZmFjdEtleVthcnRpZmFjdHMuc2l6ZSgpXSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKEFSVElGQUNUX0tFWV9FTEVNRU5UKSkgewotCQkJCW5ldyBBcnRpZmFjdEhhbmRsZXIodGhpcywgYXR0cmlidXRlcywgYXJ0aWZhY3RzKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgQXJ0aWZhY3RIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHJlcXVpcmVkID0gbmV3IFN0cmluZ1tdIHtDTEFTU0lGSUVSX0FUVFJJQlVURSwgSURfQVRUUklCVVRFLCBWRVJTSU9OX0FUVFJJQlVURX07Ci0KLQkJcHVibGljIEFydGlmYWN0SGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBMaXN0IGFydGlmYWN0cykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgQVJUSUZBQ1RfS0VZX0VMRU1FTlQpOwotCQkJU3RyaW5nW10gdmFsdWVzID0gcGFyc2VSZXF1aXJlZEF0dHJpYnV0ZXMoYXR0cmlidXRlcywgcmVxdWlyZWQpOwotCQkJVmVyc2lvbiB2ZXJzaW9uID0gY2hlY2tWZXJzaW9uKEFSVElGQUNUX0tFWV9FTEVNRU5ULCBWRVJTSU9OX0FUVFJJQlVURSwgdmFsdWVzWzJdKTsKLQkJCWFydGlmYWN0cy5hZGQobmV3IEFydGlmYWN0S2V5KHZhbHVlc1swXSwgdmFsdWVzWzFdLCB2ZXJzaW9uKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgQ2FwYWJpbGl0eVNlbGVjdG9yc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCi0JCXByaXZhdGUgTGlzdCBzZWxlY3RvcnM7Ci0KLQkJcHVibGljIENhcGFiaWxpdHlTZWxlY3RvcnNIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIENBUEFCSUxJVFlfU0VMRUNUT1JTX0VMRU1FTlQpOwotCQkJU3RyaW5nIHNpemUgPSBwYXJzZU9wdGlvbmFsQXR0cmlidXRlKGF0dHJpYnV0ZXMsIENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUpOwotCQkJc2VsZWN0b3JzID0gKHNpemUgIT0gbnVsbCA/IG5ldyBBcnJheUxpc3QobmV3IEludGVnZXIoc2l6ZSkuaW50VmFsdWUoKSkgOiBuZXcgQXJyYXlMaXN0KDQpKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTZWxlY3RvcnMoKSB7Ci0JCQlyZXR1cm4gKFN0cmluZ1tdKSBzZWxlY3RvcnMudG9BcnJheShuZXcgU3RyaW5nW3NlbGVjdG9ycy5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoQ0FQQUJJTElUWV9TRUxFQ1RPUl9FTEVNRU5UKSkgewotCQkJCW5ldyBUZXh0SGFuZGxlcih0aGlzLCBDQVBBQklMSVRZX1NFTEVDVE9SX0VMRU1FTlQsIGF0dHJpYnV0ZXMsIHNlbGVjdG9ycyk7Ci0JCQl9IGVsc2UgewotCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIFRvdWNocG9pbnRUeXBlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSByZXF1aXJlZCA9IG5ldyBTdHJpbmdbXSB7SURfQVRUUklCVVRFLCBWRVJTSU9OX0FUVFJJQlVURX07Ci0KLQkJVG91Y2hwb2ludFR5cGUgdG91Y2hwb2ludFR5cGUgPSBudWxsOwotCi0JCXB1YmxpYyBUb3VjaHBvaW50VHlwZUhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgVE9VQ0hQT0lOVF9UWVBFX0VMRU1FTlQpOwotCQkJU3RyaW5nW10gdmFsdWVzID0gcGFyc2VSZXF1aXJlZEF0dHJpYnV0ZXMoYXR0cmlidXRlcywgcmVxdWlyZWQpOwotCQkJVmVyc2lvbiB2ZXJzaW9uID0gY2hlY2tWZXJzaW9uKFRPVUNIUE9JTlRfVFlQRV9FTEVNRU5ULCBWRVJTSU9OX0FUVFJJQlVURSwgdmFsdWVzWzFdKTsKLQkJCXRvdWNocG9pbnRUeXBlID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnRUeXBlKHZhbHVlc1swXSwgdmVyc2lvbik7Ci0JCX0KLQotCQlwdWJsaWMgVG91Y2hwb2ludFR5cGUgZ2V0VG91Y2hwb2ludFR5cGUoKSB7Ci0JCQlyZXR1cm4gdG91Y2hwb2ludFR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVG91Y2hwb2ludERhdGFIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCQlUb3VjaHBvaW50RGF0YSB0b3VjaHBvaW50RGF0YSA9IG51bGw7Ci0KLQkJTGlzdCBkYXRhID0gbnVsbDsKLQotCQlwdWJsaWMgVG91Y2hwb2ludERhdGFIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIFRPVUNIUE9JTlRfREFUQV9FTEVNRU5UKTsKLQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCWRhdGEgPSAoc2l6ZSAhPSBudWxsID8gbmV3IEFycmF5TGlzdChuZXcgSW50ZWdlcihzaXplKS5pbnRWYWx1ZSgpKSA6IG5ldyBBcnJheUxpc3QoNCkpOwotCQl9Ci0KLQkJcHVibGljIFRvdWNocG9pbnREYXRhW10gZ2V0VG91Y2hwb2ludERhdGEoKSB7Ci0JCQlUb3VjaHBvaW50RGF0YVtdIHJlc3VsdCA9IG5ldyBUb3VjaHBvaW50RGF0YVtkYXRhLnNpemUoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykKLQkJCQlyZXN1bHRbaV0gPSAoKFRvdWNocG9pbnRJbnN0cnVjdGlvbnNIYW5kbGVyKSBkYXRhLmdldChpKSkuZ2V0VG91Y2hwb2ludERhdGEoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKFRPVUNIUE9JTlRfREFUQV9JTlNUUlVDVElPTlNfRUxFTUVOVCkpIHsKLQkJCQlkYXRhLmFkZChuZXcgVG91Y2hwb2ludEluc3RydWN0aW9uc0hhbmRsZXIodGhpcywgYXR0cmlidXRlcywgZGF0YSkpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBUb3VjaHBvaW50SW5zdHJ1Y3Rpb25zSGFuZGxlciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciB7Ci0KLQkJTWFwIGluc3RydWN0aW9ucyA9IG51bGw7Ci0KLQkJcHVibGljIFRvdWNocG9pbnRJbnN0cnVjdGlvbnNIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIExpc3QgZGF0YSkgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgVE9VQ0hQT0lOVF9EQVRBX0lOU1RSVUNUSU9OU19FTEVNRU5UKTsKLQkJCVN0cmluZyBzaXplID0gcGFyc2VPcHRpb25hbEF0dHJpYnV0ZShhdHRyaWJ1dGVzLCBDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFKTsKLQkJCWluc3RydWN0aW9ucyA9IChzaXplICE9IG51bGwgPyBuZXcgTGlua2VkSGFzaE1hcChuZXcgSW50ZWdlcihzaXplKS5pbnRWYWx1ZSgpKSA6IG5ldyBMaW5rZWRIYXNoTWFwKDQpKTsKLQkJfQotCi0JCXB1YmxpYyBUb3VjaHBvaW50RGF0YSBnZXRUb3VjaHBvaW50RGF0YSgpIHsKLQkJCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludERhdGEoaW5zdHJ1Y3Rpb25zKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoVE9VQ0hQT0lOVF9EQVRBX0lOU1RSVUNUSU9OX0VMRU1FTlQpKSB7Ci0JCQkJbmV3IFRvdWNocG9pbnRJbnN0cnVjdGlvbkhhbmRsZXIodGhpcywgYXR0cmlidXRlcywgaW5zdHJ1Y3Rpb25zKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW52YWxpZEVsZW1lbnQobmFtZSwgYXR0cmlidXRlcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVG91Y2hwb2ludEluc3RydWN0aW9uSGFuZGxlciBleHRlbmRzIFRleHRIYW5kbGVyIHsKLQotCQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHJlcXVpcmVkID0gbmV3IFN0cmluZ1tdIHtUT1VDSFBPSU5UX0RBVEFfSU5TVFJVQ1RJT05fS0VZX0FUVFJJQlVURX07Ci0KLQkJTWFwIGluc3RydWN0aW9ucyA9IG51bGw7Ci0JCVN0cmluZyBrZXkgPSBudWxsOwotCi0JCXB1YmxpYyBUb3VjaHBvaW50SW5zdHJ1Y3Rpb25IYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIE1hcCBpbnN0cnVjdGlvbnMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIFRPVUNIUE9JTlRfREFUQV9JTlNUUlVDVElPTl9FTEVNRU5UKTsKLQkJCWtleSA9IHBhcnNlUmVxdWlyZWRBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHJlcXVpcmVkKVswXTsKLQkJCXRoaXMuaW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSB7Ci0JCQlpZiAoaXNWYWxpZFhNTCgpKSB7Ci0JCQkJaWYgKGtleSAhPSBudWxsKSB7Ci0JCQkJCWluc3RydWN0aW9ucy5wdXQoa2V5LCBnZXRUZXh0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBVcGRhdGVEZXNjcmlwdG9ySGFuZGxlciBleHRlbmRzIFRleHRIYW5kbGVyIHsKLQkJcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSByZXF1aXJlZCA9IG5ldyBTdHJpbmdbXSB7SURfQVRUUklCVVRFLCBWRVJTSU9OX1JBTkdFX0FUVFJJQlVURX07Ci0JCXByaXZhdGUgZmluYWwgU3RyaW5nW10gb3B0aW9uYWwgPSBuZXcgU3RyaW5nW10ge1VQREFURV9ERVNDUklQVE9SX1NFVkVSSVRZLCBERVNDUklQVElPTl9BVFRSSUJVVEV9OwotCi0JCXByaXZhdGUgSVVwZGF0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotCQlwdWJsaWMgVXBkYXRlRGVzY3JpcHRvckhhbmRsZXIoQWJzdHJhY3RIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgSU5TVEFMTEFCTEVfVU5JVF9FTEVNRU5UKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHBhcnNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCByZXF1aXJlZCwgb3B0aW9uYWwpOwotCQkJVmVyc2lvblJhbmdlIHJhbmdlID0gY2hlY2tWZXJzaW9uUmFuZ2UoUkVRVUlSRURfQ0FQQUJJTElUWV9FTEVNRU5ULCBWRVJTSU9OX1JBTkdFX0FUVFJJQlVURSwgdmFsdWVzWzFdKTsKLQkJCWludCBzZXZlcml0eSA9IG5ldyBJbnRlZ2VyKHZhbHVlc1syXSkuaW50VmFsdWUoKTsKLQkJCWRlc2NyaXB0b3IgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVXBkYXRlRGVzY3JpcHRvcih2YWx1ZXNbMF0sIHJhbmdlLCBzZXZlcml0eSwgdmFsdWVzWzNdKTsKLQkJfQotCi0JCXB1YmxpYyBJVXBkYXRlRGVzY3JpcHRvciBnZXRVcGRhdGVEZXNjcmlwdG9yKCkgewotCQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAJSGFuZGxlciBmb3IgYSBsaXN0IG9mIGxpY2Vuc2VzLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBMaWNlbnNlc0hhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdEhhbmRsZXIgewotCQkvLyBOb3RlIHRoaXMgaGFuZGxlciBpcyBzZXQgdXAgdG8gaGFuZGxlIG11bHRpcGxlIGxpY2Vuc2UgZWxlbWVudHMsIGJ1dCBmb3Igbm93Ci0JCS8vIHRoZSBBUEkgZm9yIElJbnN0YWxsYWJsZVVuaXQgb25seSByZWZsZWN0cyBvbmUuCi0JCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE2OTExCi0JCXByaXZhdGUgTGlzdCBsaWNlbnNlczsKLQotCQlwdWJsaWMgTGljZW5zZXNIYW5kbGVyKENvbnRlbnRIYW5kbGVyIHBhcmVudEhhbmRsZXIsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJc3VwZXIocGFyZW50SGFuZGxlciwgTElDRU5TRVNfRUxFTUVOVCk7Ci0JCQlTdHJpbmcgc2l6ZSA9IHBhcnNlT3B0aW9uYWxBdHRyaWJ1dGUoYXR0cmlidXRlcywgQ09MTEVDVElPTl9TSVpFX0FUVFJJQlVURSk7Ci0JCQlsaWNlbnNlcyA9IChzaXplICE9IG51bGwgPyBuZXcgQXJyYXlMaXN0KG5ldyBJbnRlZ2VyKHNpemUpLmludFZhbHVlKCkpIDogbmV3IEFycmF5TGlzdCgyKSk7Ci0JCX0KLQotCQlwdWJsaWMgTGljZW5zZSBnZXRMaWNlbnNlKCkgewotCQkJaWYgKGxpY2Vuc2VzLnNpemUoKSA9PSAwKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChMaWNlbnNlKSBsaWNlbnNlcy5nZXQoMCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJaWYgKG5hbWUuZXF1YWxzKExJQ0VOU0VfRUxFTUVOVCkpIHsKLQkJCQluZXcgTGljZW5zZUhhbmRsZXIodGhpcywgYXR0cmlidXRlcywgbGljZW5zZXMpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogCUhhbmRsZXIgZm9yIGEgbGljZW5zZSBpbiBhbiBsaXN0IG9mIGxpY2Vuc2VzLgotCSAqLwotCXByb3RlY3RlZCBjbGFzcyBMaWNlbnNlSGFuZGxlciBleHRlbmRzIFRleHRIYW5kbGVyIHsKLQotCQlTdHJpbmcgdXJsID0gbnVsbDsKLQotCQlwcml2YXRlIGZpbmFsIExpc3QgbGljZW5zZXM7Ci0KLQkJcHVibGljIExpY2Vuc2VIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIExpc3QgbGljZW5zZXMpIHsKLQkJCXN1cGVyKHBhcmVudEhhbmRsZXIsIExJQ0VOU0VfRUxFTUVOVCk7Ci0JCQl1cmwgPSBwYXJzZU9wdGlvbmFsQXR0cmlidXRlKGF0dHJpYnV0ZXMsIFVSTF9BVFRSSUJVVEUpOwotCQkJdGhpcy5saWNlbnNlcyA9IGxpY2Vuc2VzOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSB7Ci0JCQlpZiAoaXNWYWxpZFhNTCgpKSB7Ci0JCQkJbGljZW5zZXMuYWRkKG5ldyBMaWNlbnNlKHVybCwgZ2V0VGV4dCgpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAJSGFuZGxlciBmb3IgYSBjb3B5cmlnaHQuCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIENvcHlyaWdodEhhbmRsZXIgZXh0ZW5kcyBUZXh0SGFuZGxlciB7Ci0KLQkJU3RyaW5nIHVybCA9IG51bGw7Ci0JCXByaXZhdGUgQ29weXJpZ2h0IGNvcHlyaWdodDsKLQotCQlwdWJsaWMgQ29weXJpZ2h0SGFuZGxlcihBYnN0cmFjdEhhbmRsZXIgcGFyZW50SGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBDT1BZUklHSFRfRUxFTUVOVCk7Ci0JCQl1cmwgPSBwYXJzZU9wdGlvbmFsQXR0cmlidXRlKGF0dHJpYnV0ZXMsIFVSTF9BVFRSSUJVVEUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSB7Ci0JCQlpZiAoaXNWYWxpZFhNTCgpKSB7Ci0JCQkJY29weXJpZ2h0ID0gbmV3IENvcHlyaWdodCh1cmwsIGdldFRleHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgQ29weXJpZ2h0IGdldENvcHlyaWdodCgpIHsKLQkJCXJldHVybiBjb3B5cmlnaHQ7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L2lvL01ldGFkYXRhV3JpdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L2lvL01ldGFkYXRhV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZWE0NTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9pby9NZXRhZGF0YVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBHZW51aXRlYywgTExDIC0gYWRkZWQgbGljZW5zZSBzdXBwb3J0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LmlvOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wZXJzaXN0ZW5jZS5YTUxXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0YWRhdGFXcml0ZXIgZXh0ZW5kcyBYTUxXcml0ZXIgaW1wbGVtZW50cyBYTUxDb25zdGFudHMgewotCi0JcHVibGljIE1ldGFkYXRhV3JpdGVyKE91dHB1dFN0cmVhbSBvdXRwdXQsIFByb2Nlc3NpbmdJbnN0cnVjdGlvbltdIHBpRWxlbWVudHMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJc3VwZXIob3V0cHV0LCBwaUVsZW1lbnRzKTsKLQkJLy8gVE9ETzogYWRkIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBmb3IgdGhlIG1ldGFkYXRhIHZlcnNpb24KLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgYSBsaXN0IG9mIHtAbGluayBJSW5zdGFsbGFibGVVbml0fS4KLQkgKiBAcGFyYW0gdW5pdHMgQW4gSXRlcmF0b3Igb2Yge0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9LgotCSAqIEBwYXJhbSBzaXplIFRoZSBudW1iZXIgb2YgdW5pdHMgdG8gd3JpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUluc3RhbGxhYmxlVW5pdHMoSXRlcmF0b3IgdW5pdHMsIGludCBzaXplKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm47Ci0JCXN0YXJ0KElOU1RBTExBQkxFX1VOSVRTX0VMRU1FTlQpOwotCQlhdHRyaWJ1dGUoQ09MTEVDVElPTl9TSVpFX0FUVFJJQlVURSwgc2l6ZSk7Ci0JCXdoaWxlICh1bml0cy5oYXNOZXh0KCkpCi0JCQl3cml0ZUluc3RhbGxhYmxlVW5pdCgoSUluc3RhbGxhYmxlVW5pdCkgdW5pdHMubmV4dCgpKTsKLQkJZW5kKElOU1RBTExBQkxFX1VOSVRTX0VMRU1FTlQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdyaXRlSW5zdGFsbGFibGVVbml0KElJbnN0YWxsYWJsZVVuaXQgcmVzb2x2ZWRJVSkgewotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gcmVzb2x2ZWRJVS51bnJlc29sdmVkKCk7Ci0JCXN0YXJ0KElOU1RBTExBQkxFX1VOSVRfRUxFTUVOVCk7Ci0JCWF0dHJpYnV0ZShJRF9BVFRSSUJVVEUsIGl1LmdldElkKCkpOwotCQlhdHRyaWJ1dGUoVkVSU0lPTl9BVFRSSUJVVEUsIGl1LmdldFZlcnNpb24oKSk7Ci0JCWF0dHJpYnV0ZShTSU5HTEVUT05fQVRUUklCVVRFLCBpdS5pc1NpbmdsZXRvbigpLCB0cnVlKTsKLQkJLy8JCWF0dHJpYnV0ZShGUkFHTUVOVF9BVFRSSUJVVEUsIGl1LmlzRnJhZ21lbnQoKSwgZmFsc2UpOwotCi0JCWlmIChpdS5pc0ZyYWdtZW50KCkgJiYgaXUgaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQpIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCBmcmFnbWVudCA9IChJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQpIGl1OwotCQkJd3JpdGVIb3N0UmVxdWlyZWRDYXBhYmlsaXRpZXMoZnJhZ21lbnQuZ2V0SG9zdCgpKTsKLQkJfQotCi0JCWlmIChpdSBpbnN0YW5jZW9mIElJbnN0YWxsYWJsZVVuaXRQYXRjaCkgewotCQkJSUluc3RhbGxhYmxlVW5pdFBhdGNoIHBhdGNoID0gKElJbnN0YWxsYWJsZVVuaXRQYXRjaCkgaXU7Ci0JCQl3cml0ZUFwcGxpY2FiaWxpdHlTY29wZShwYXRjaC5nZXRBcHBsaWNhYmlsaXR5U2NvcGUoKSk7Ci0JCQl3cml0ZVJlcXVpcmVtZW50c0NoYW5nZShwYXRjaC5nZXRSZXF1aXJlbWVudHNDaGFuZ2UoKSk7Ci0JCQl3cml0ZUxpZmVDeWNsZShwYXRjaC5nZXRMaWZlQ3ljbGUoKSk7Ci0JCX0KLQotCQl3cml0ZVVwZGF0ZURlc2NyaXB0b3IocmVzb2x2ZWRJVSwgcmVzb2x2ZWRJVS5nZXRVcGRhdGVEZXNjcmlwdG9yKCkpOwotCQl3cml0ZVByb3BlcnRpZXMoaXUuZ2V0UHJvcGVydGllcygpKTsKLQkJd3JpdGVQcm92aWRlZENhcGFiaWxpdGllcyhpdS5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpKTsKLQkJd3JpdGVSZXF1aXJlZENhcGFiaWxpdGllcyhpdS5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpKTsKLQkJd3JpdGVUcmltbWVkQ2RhdGEoSVVfRklMVEVSX0VMRU1FTlQsIGl1LmdldEZpbHRlcigpKTsKLQotCQl3cml0ZUFydGlmYWN0S2V5cyhpdS5nZXRBcnRpZmFjdHMoKSk7Ci0JCXdyaXRlVG91Y2hwb2ludFR5cGUoaXUuZ2V0VG91Y2hwb2ludFR5cGUoKSk7Ci0JCXdyaXRlVG91Y2hwb2ludERhdGEoaXUuZ2V0VG91Y2hwb2ludERhdGEoKSk7Ci0JCXdyaXRlTGljZW5zZXMoaXUuZ2V0TGljZW5zZSgpKTsKLQkJd3JpdGVDb3B5cmlnaHQoaXUuZ2V0Q29weXJpZ2h0KCkpOwotCi0JCWVuZChJTlNUQUxMQUJMRV9VTklUX0VMRU1FTlQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdyaXRlTGlmZUN5Y2xlKFJlcXVpcmVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5KSB7Ci0JCWlmIChjYXBhYmlsaXR5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN0YXJ0KExJRkVDWUNMRSk7Ci0JCXdyaXRlUmVxdWlyZWRDYXBhYmlsaXR5KGNhcGFiaWxpdHkpOwotCQllbmQoTElGRUNZQ0xFKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUhvc3RSZXF1aXJlZENhcGFiaWxpdGllcyhSZXF1aXJlZENhcGFiaWxpdHlbXSBjYXBhYmlsaXRpZXMpIHsKLQkJaWYgKGNhcGFiaWxpdGllcyAhPSBudWxsICYmIGNhcGFiaWxpdGllcy5sZW5ndGggPiAwKSB7Ci0JCQlzdGFydChIT1NUX1JFUVVJUkVEX0NBUEFCSUxJVElFU19FTEVNRU5UKTsKLQkJCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCBjYXBhYmlsaXRpZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJd3JpdGVSZXF1aXJlZENhcGFiaWxpdHkoY2FwYWJpbGl0aWVzW2ldKTsKLQkJCX0KLQkJCWVuZChIT1NUX1JFUVVJUkVEX0NBUEFCSUxJVElFU19FTEVNRU5UKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdyaXRlUHJvdmlkZWRDYXBhYmlsaXRpZXMoUHJvdmlkZWRDYXBhYmlsaXR5W10gY2FwYWJpbGl0aWVzKSB7Ci0JCWlmIChjYXBhYmlsaXRpZXMgIT0gbnVsbCAmJiBjYXBhYmlsaXRpZXMubGVuZ3RoID4gMCkgewotCQkJc3RhcnQoUFJPVklERURfQ0FQQUJJTElUSUVTX0VMRU1FTlQpOwotCQkJYXR0cmlidXRlKENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUsIGNhcGFiaWxpdGllcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzdGFydChQUk9WSURFRF9DQVBBQklMSVRZX0VMRU1FTlQpOwotCQkJCWF0dHJpYnV0ZShOQU1FU1BBQ0VfQVRUUklCVVRFLCBjYXBhYmlsaXRpZXNbaV0uZ2V0TmFtZXNwYWNlKCkpOwotCQkJCWF0dHJpYnV0ZShOQU1FX0FUVFJJQlVURSwgY2FwYWJpbGl0aWVzW2ldLmdldE5hbWUoKSk7Ci0JCQkJYXR0cmlidXRlKFZFUlNJT05fQVRUUklCVVRFLCBjYXBhYmlsaXRpZXNbaV0uZ2V0VmVyc2lvbigpKTsKLQkJCQllbmQoUFJPVklERURfQ0FQQUJJTElUWV9FTEVNRU5UKTsKLQkJCX0KLQkJCWVuZChQUk9WSURFRF9DQVBBQklMSVRJRVNfRUxFTUVOVCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGNhcGFiaWxpdGllcykgewotCQlpZiAoY2FwYWJpbGl0aWVzICE9IG51bGwgJiYgY2FwYWJpbGl0aWVzLmxlbmd0aCA+IDApIHsKLQkJCXN0YXJ0KFJFUVVJUkVEX0NBUEFCSUxJVElFU19FTEVNRU5UKTsKLQkJCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCBjYXBhYmlsaXRpZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FwYWJpbGl0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJd3JpdGVSZXF1aXJlZENhcGFiaWxpdHkoY2FwYWJpbGl0aWVzW2ldKTsKLQkJCX0KLQkJCWVuZChSRVFVSVJFRF9DQVBBQklMSVRJRVNfRUxFTUVOVCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZVVwZGF0ZURlc2NyaXB0b3IoSUluc3RhbGxhYmxlVW5pdCBpdSwgSVVwZGF0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXN0YXJ0KFVQREFURV9ERVNDUklQVE9SX0VMRU1FTlQpOwotCQlhdHRyaWJ1dGUoSURfQVRUUklCVVRFLCBkZXNjcmlwdG9yLmdldElkKCkpOwotCQlhdHRyaWJ1dGUoVkVSU0lPTl9SQU5HRV9BVFRSSUJVVEUsIGRlc2NyaXB0b3IuZ2V0UmFuZ2UoKSk7Ci0JCWF0dHJpYnV0ZShVUERBVEVfREVTQ1JJUFRPUl9TRVZFUklUWSwgZGVzY3JpcHRvci5nZXRTZXZlcml0eSgpKTsKLQkJYXR0cmlidXRlKERFU0NSSVBUSU9OX0FUVFJJQlVURSwgZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpKTsKLQkJZW5kKFVQREFURV9ERVNDUklQVE9SX0VMRU1FTlQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdyaXRlQXBwbGljYWJpbGl0eVNjb3BlKFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10gY2FwYWJpbGl0aWVzKSB7Ci0JCXN0YXJ0KEFQUExJQ0FCSUxJVFlfU0NPUEUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNhcGFiaWxpdGllcy5sZW5ndGg7IGkrKykgewotCQkJc3RhcnQoQVBQTFlfT04pOwotCQkJd3JpdGVSZXF1aXJlZENhcGFiaWxpdGllcyhjYXBhYmlsaXRpZXNbaV0pOwotCQkJZW5kKEFQUExZX09OKTsKLQkJfQotCQllbmQoQVBQTElDQUJJTElUWV9TQ09QRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVSZXF1aXJlbWVudHNDaGFuZ2UoUmVxdWlyZW1lbnRDaGFuZ2VbXSBjaGFuZ2VzKSB7Ci0JCXN0YXJ0KFJFUVVJUkVNRU5UX0NIQU5HRVMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJCXdyaXRlUmVxdWlyZW1lbnRDaGFuZ2UoY2hhbmdlc1tpXSk7Ci0JCX0KLQkJZW5kKFJFUVVJUkVNRU5UX0NIQU5HRVMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdyaXRlUmVxdWlyZW1lbnRDaGFuZ2UoUmVxdWlyZW1lbnRDaGFuZ2UgY2hhbmdlKSB7Ci0JCXN0YXJ0KFJFUVVJUkVNRU5UX0NIQU5HRSk7Ci0JCWlmIChjaGFuZ2UuYXBwbHlPbigpICE9IG51bGwpIHsKLQkJCXN0YXJ0KFJFUVVJUkVNRU5UX0ZST00pOwotCQkJd3JpdGVSZXF1aXJlZENhcGFiaWxpdHkoY2hhbmdlLmFwcGx5T24oKSk7Ci0JCQllbmQoUkVRVUlSRU1FTlRfRlJPTSk7Ci0JCX0KLQkJaWYgKGNoYW5nZS5uZXdWYWx1ZSgpICE9IG51bGwpIHsKLQkJCXN0YXJ0KFJFUVVJUkVNRU5UX1RPKTsKLQkJCXdyaXRlUmVxdWlyZWRDYXBhYmlsaXR5KGNoYW5nZS5uZXdWYWx1ZSgpKTsKLQkJCWVuZChSRVFVSVJFTUVOVF9UTyk7Ci0JCX0KLQkJZW5kKFJFUVVJUkVNRU5UX0NIQU5HRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVSZXF1aXJlZENhcGFiaWxpdHkoUmVxdWlyZWRDYXBhYmlsaXR5IGNhcGFiaWxpdHkpIHsKLQkJc3RhcnQoUkVRVUlSRURfQ0FQQUJJTElUWV9FTEVNRU5UKTsKLQkJYXR0cmlidXRlKE5BTUVTUEFDRV9BVFRSSUJVVEUsIGNhcGFiaWxpdHkuZ2V0TmFtZXNwYWNlKCkpOwotCQlhdHRyaWJ1dGUoTkFNRV9BVFRSSUJVVEUsIGNhcGFiaWxpdHkuZ2V0TmFtZSgpKTsKLQkJYXR0cmlidXRlKFZFUlNJT05fUkFOR0VfQVRUUklCVVRFLCBjYXBhYmlsaXR5LmdldFJhbmdlKCkpOwotCQlhdHRyaWJ1dGUoQ0FQQUJJTElUWV9PUFRJT05BTF9BVFRSSUJVVEUsIGNhcGFiaWxpdHkuaXNPcHRpb25hbCgpLCBmYWxzZSk7Ci0JCWF0dHJpYnV0ZShDQVBBQklMSVRZX01VTFRJUExFX0FUVFJJQlVURSwgY2FwYWJpbGl0eS5pc011bHRpcGxlKCksIGZhbHNlKTsKLQkJYXR0cmlidXRlKENBUEFCSUxJVFlfR1JFRURfQVRUUklCVVRFLCBjYXBhYmlsaXR5LmlzR3JlZWR5KCksIHRydWUpOwotCQl3cml0ZVRyaW1tZWRDZGF0YShDQVBBQklMSVRZX0ZJTFRFUl9FTEVNRU5ULCBjYXBhYmlsaXR5LmdldEZpbHRlcigpKTsKLQotCQlTdHJpbmdbXSBzZWxlY3RvcnMgPSBjYXBhYmlsaXR5LmdldFNlbGVjdG9ycygpOwotCQlpZiAoc2VsZWN0b3JzLmxlbmd0aCA+IDApIHsKLQkJCXN0YXJ0KENBUEFCSUxJVFlfU0VMRUNUT1JTX0VMRU1FTlQpOwotCQkJYXR0cmlidXRlKENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUsIHNlbGVjdG9ycy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzZWxlY3RvcnMubGVuZ3RoOyBqKyspIHsKLQkJCQl3cml0ZVRyaW1tZWRDZGF0YShDQVBBQklMSVRZX1NFTEVDVE9SX0VMRU1FTlQsIHNlbGVjdG9yc1tqXSk7Ci0JCQl9Ci0JCQllbmQoQ0FQQUJJTElUWV9TRUxFQ1RPUlNfRUxFTUVOVCk7Ci0JCX0KLQotCQllbmQoUkVRVUlSRURfQ0FQQUJJTElUWV9FTEVNRU5UKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUFydGlmYWN0S2V5cyhJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdEtleXMpIHsKLQkJaWYgKGFydGlmYWN0S2V5cyAhPSBudWxsICYmIGFydGlmYWN0S2V5cy5sZW5ndGggPiAwKSB7Ci0JCQlzdGFydChBUlRJRkFDVF9LRVlTX0VMRU1FTlQpOwotCQkJYXR0cmlidXRlKENPTExFQ1RJT05fU0laRV9BVFRSSUJVVEUsIGFydGlmYWN0S2V5cy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnRpZmFjdEtleXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzdGFydChBUlRJRkFDVF9LRVlfRUxFTUVOVCk7Ci0JCQkJYXR0cmlidXRlKEFSVElGQUNUX0tFWV9DTEFTU0lGSUVSX0FUVFJJQlVURSwgYXJ0aWZhY3RLZXlzW2ldLmdldENsYXNzaWZpZXIoKSk7Ci0JCQkJYXR0cmlidXRlKElEX0FUVFJJQlVURSwgYXJ0aWZhY3RLZXlzW2ldLmdldElkKCkpOwotCQkJCWF0dHJpYnV0ZShWRVJTSU9OX0FUVFJJQlVURSwgYXJ0aWZhY3RLZXlzW2ldLmdldFZlcnNpb24oKSk7Ci0JCQkJZW5kKEFSVElGQUNUX0tFWV9FTEVNRU5UKTsKLQkJCX0KLQkJCWVuZChBUlRJRkFDVF9LRVlTX0VMRU1FTlQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVUb3VjaHBvaW50VHlwZShUb3VjaHBvaW50VHlwZSB0b3VjaHBvaW50VHlwZSkgewotCQlzdGFydChUT1VDSFBPSU5UX1RZUEVfRUxFTUVOVCk7Ci0JCWF0dHJpYnV0ZShJRF9BVFRSSUJVVEUsIHRvdWNocG9pbnRUeXBlLmdldElkKCkpOwotCQlhdHRyaWJ1dGUoVkVSU0lPTl9BVFRSSUJVVEUsIHRvdWNocG9pbnRUeXBlLmdldFZlcnNpb24oKSk7Ci0JCWVuZChUT1VDSFBPSU5UX1RZUEVfRUxFTUVOVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGVUb3VjaHBvaW50RGF0YShUb3VjaHBvaW50RGF0YVtdIHRvdWNocG9pbnREYXRhKSB7Ci0JCWlmICh0b3VjaHBvaW50RGF0YSAhPSBudWxsICYmIHRvdWNocG9pbnREYXRhLmxlbmd0aCA+IDApIHsKLQkJCXN0YXJ0KFRPVUNIUE9JTlRfREFUQV9FTEVNRU5UKTsKLQkJCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCB0b3VjaHBvaW50RGF0YS5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b3VjaHBvaW50RGF0YS5sZW5ndGg7IGkrKykgewotCQkJCVRvdWNocG9pbnREYXRhIG5leHREYXRhID0gdG91Y2hwb2ludERhdGFbaV07Ci0JCQkJTWFwIGluc3RydWN0aW9ucyA9IG5leHREYXRhLmdldEluc3RydWN0aW9ucygpOwotCQkJCWlmIChpbnN0cnVjdGlvbnMuc2l6ZSgpID4gMCkgewotCQkJCQlzdGFydChUT1VDSFBPSU5UX0RBVEFfSU5TVFJVQ1RJT05TX0VMRU1FTlQpOwotCQkJCQlhdHRyaWJ1dGUoQ09MTEVDVElPTl9TSVpFX0FUVFJJQlVURSwgaW5zdHJ1Y3Rpb25zLnNpemUoKSk7Ci0JCQkJCWZvciAoSXRlcmF0b3IgaXRlciA9IGluc3RydWN0aW9ucy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCQkJTWFwLkVudHJ5IGVudHJ5ID0gKE1hcC5FbnRyeSkgaXRlci5uZXh0KCk7Ci0JCQkJCQlzdGFydChUT1VDSFBPSU5UX0RBVEFfSU5TVFJVQ1RJT05fRUxFTUVOVCk7Ci0JCQkJCQlhdHRyaWJ1dGUoVE9VQ0hQT0lOVF9EQVRBX0lOU1RSVUNUSU9OX0tFWV9BVFRSSUJVVEUsIGVudHJ5LmdldEtleSgpKTsKLQkJCQkJCWNkYXRhKChTdHJpbmcpIGVudHJ5LmdldFZhbHVlKCksIHRydWUpOwotCQkJCQkJZW5kKFRPVUNIUE9JTlRfREFUQV9JTlNUUlVDVElPTl9FTEVNRU5UKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVuZChUT1VDSFBPSU5UX0RBVEFfRUxFTUVOVCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVUcmltbWVkQ2RhdGEoU3RyaW5nIGVsZW1lbnQsIFN0cmluZyBmaWx0ZXIpIHsKLQkJU3RyaW5nIHRyaW1tZWQ7Ci0JCWlmIChmaWx0ZXIgIT0gbnVsbCAmJiAodHJpbW1lZCA9IGZpbHRlci50cmltKCkpLmxlbmd0aCgpID4gMCkgewotCQkJc3RhcnQoZWxlbWVudCk7Ci0JCQljZGF0YSh0cmltbWVkKTsKLQkJCWVuZChlbGVtZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZUxpY2Vuc2VzKExpY2Vuc2UgbGljZW5zZSkgewotCQlpZiAobGljZW5zZSAhPSBudWxsKSB7Ci0JCQkvLyBJbiB0aGUgZnV0dXJlIHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lIGxpY2Vuc2UsIHNvIHdlIHdyaXRlIHRoaXMgCi0JCQkvLyBhcyBhIGNvbGxlY3Rpb24gb2Ygb25lLgotCQkJLy8gU2VlIGJ1ZyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjE2OTExCi0JCQlzdGFydChMSUNFTlNFU19FTEVNRU5UKTsKLQkJCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCAxKTsKLQkJCXN0YXJ0KExJQ0VOU0VfRUxFTUVOVCk7Ci0JCQlpZiAobGljZW5zZS5nZXRVUkwoKSAhPSBudWxsKQotCQkJCWF0dHJpYnV0ZShVUkxfQVRUUklCVVRFLCBsaWNlbnNlLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJY2RhdGEobGljZW5zZS5nZXRCb2R5KCksIHRydWUpOwotCQkJZW5kKExJQ0VOU0VfRUxFTUVOVCk7Ci0JCQllbmQoTElDRU5TRVNfRUxFTUVOVCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVDb3B5cmlnaHQoQ29weXJpZ2h0IGNvcHlyaWdodCkgewotCQlpZiAoY29weXJpZ2h0ICE9IG51bGwpIHsKLQkJCXN0YXJ0KENPUFlSSUdIVF9FTEVNRU5UKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKGNvcHlyaWdodC5nZXRVUkwoKSAhPSBudWxsKQotCQkJCQlhdHRyaWJ1dGUoVVJMX0FUVFJJQlVURSwgY29weXJpZ2h0LmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzZSkgewotCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLklORk8sIEFjdGl2YXRvci5JRCwgIkVycm9yIHdyaXRpbmcgdGhlIGNvcHlyaWdodCBVUkw6ICIgKyBjb3B5cmlnaHQuZ2V0VVJMKCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2RhdGEoY29weXJpZ2h0LmdldEJvZHkoKSwgdHJ1ZSk7Ci0JCQllbmQoQ09QWVJJR0hUX0VMRU1FTlQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9pby9YTUxDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvaW8vWE1MQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MDMxYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9pby9YTUxDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuaW87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFhNTENvbnN0YW50cyBleHRlbmRzIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucGVyc2lzdGVuY2UuWE1MQ29uc3RhbnRzIHsKLQotCS8vIENvbnN0YW50cyBkZWZpbmluZyB0aGUgc3RydWN0dXJlIG9mIHRoZSBYTUwgZm9yIG1ldGFkYXRhIG9iamVjdHMKLQotCS8vIEEgZm9ybWF0IHZlcnNpb24gbnVtYmVyIGZvciBtZXRhZGF0YSBYTUwuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBWZXJzaW9uIENVUlJFTlRfVkVSU0lPTiA9IG5ldyBWZXJzaW9uKDAsIDAsIDEpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVmVyc2lvblJhbmdlIFhNTF9UT0xFUkFOQ0UgPSBuZXcgVmVyc2lvblJhbmdlKENVUlJFTlRfVkVSU0lPTiwgdHJ1ZSwgbmV3IFZlcnNpb24oMiwgMCwgMCksIGZhbHNlKTsKLQotCS8vIENvbnN0YW50cyBmb3IgcHJvY2Vzc2luZyBJbnN0cnVjdGlvbnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9NRVRBREFUQV9UQVJHRVQgPSAibWV0YWRhdGEiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDb25zdGFudHMgZm9yIG1ldGFkYXRhIGVsZW1lbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTEFCTEVfVU5JVFNfRUxFTUVOVCA9ICJ1bml0cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQUxMQUJMRV9VTklUX0VMRU1FTlQgPSAidW5pdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vQ29uc3RhbnRzIGZvciByZXBvc2l0b3J5IHJlZmVyZW5jZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVBPU0lUT1JZX1JFRkVSRU5DRVNfRUxFTUVOVCA9ICJyZWZlcmVuY2VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfUkVGRVJFTkNFX0VMRU1FTlQgPSAicmVwb3NpdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05TX0FUVFJJQlVURSA9ICJvcHRpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQ29uc3RhbnRzIGZvciBzdWItZWxlbWVudHMgb2YgYW4gaW5zdGFsbGFibGUgdW5pdCBlbGVtZW50Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfS0VZU19FTEVNRU5UID0gImFydGlmYWN0cyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9LRVlfRUxFTUVOVCA9ICJhcnRpZmFjdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRF9DQVBBQklMSVRJRVNfRUxFTUVOVCA9ICJyZXF1aXJlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1NUX1JFUVVJUkVEX0NBUEFCSUxJVElFU19FTEVNRU5UID0gImhvc3RSZXF1aXJlbWVudHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRURfQ0FQQUJJTElUWV9FTEVNRU5UID0gInJlcXVpcmVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVEX0NBUEFCSUxJVElFU19FTEVNRU5UID0gInByb3ZpZGVzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVEX0NBUEFCSUxJVFlfRUxFTUVOVCA9ICJwcm92aWRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1VDSFBPSU5UX1RZUEVfRUxFTUVOVCA9ICJ0b3VjaHBvaW50IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPVUNIUE9JTlRfREFUQV9FTEVNRU5UID0gInRvdWNocG9pbnREYXRhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElVX0ZJTFRFUl9FTEVNRU5UID0gImZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUERBVEVfREVTQ1JJUFRPUl9FTEVNRU5UID0gInVwZGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExJQ0FCSUxJVFlfU0NPUEUgPSAicGF0Y2hTY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBMWV9PTiA9ICJzY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFTUVOVF9DSEFOR0VTID0gImNoYW5nZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRU1FTlRfQ0hBTkdFID0gImNoYW5nZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFTUVOVF9GUk9NID0gImZyb20iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUlSRU1FTlRfVE8gPSAidG8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElGRUNZQ0xFID0gImxpZmVDeWNsZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENvbnN0YW50cyBmb3IgYXR0cmlidXRlcyBvZiBhbiBpbnN0YWxsYWJsZSB1bml0IGVsZW1lbnQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVUT05fQVRUUklCVVRFID0gInNpbmdsZXRvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFHTUVOVF9BVFRSSUJVVEUgPSAiZnJhZ21lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDb25zdGFudHMgZm9yIHN1Yi1lbGVtZW50cyBvZiBhIHJlcXVpcmVkIGNhcGFiaWxpdHkgZWxlbWVudAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfRklMVEVSX0VMRU1FTlQgPSAiZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfU0VMRUNUT1JTX0VMRU1FTlQgPSAic2VsZWN0b3JzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfU0VMRUNUT1JfRUxFTUVOVCA9ICJzZWxlY3RvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENvbnN0YW50cyBmb3IgYXR0cmlidXRlcyBvZiBhIHJlcXVpcmVkIGNhcGFiaWxpdHkgZWxlbWVudAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfT1BUSU9OQUxfQVRUUklCVVRFID0gIm9wdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfTVVMVElQTEVfQVRUUklCVVRFID0gIm11bHRpcGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfR1JFRURfQVRUUklCVVRFID0gImdyZWVkeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENvbnN0YW50cyBmb3IgYXR0cmlidXRlcyBvZiBhbiBhcnRpZmFjdCBrZXkgZWxlbWVudAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX0tFWV9DTEFTU0lGSUVSX0FUVFJJQlVURSA9ICJjbGFzc2lmaWVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gQ29uc3RhbnRzIGZvciBzdWItZWxlbWVudHMgb2YgYSB0b3VjaHBvaW50IGRhdGEgZWxlbWVudAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPVUNIUE9JTlRfREFUQV9JTlNUUlVDVElPTlNfRUxFTUVOVCA9ICJpbnN0cnVjdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9VQ0hQT0lOVF9EQVRBX0lOU1RSVUNUSU9OX0VMRU1FTlQgPSAiaW5zdHJ1Y3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDb25zdGFudHMgZm9yIGF0dHJpYnV0ZXMgb2YgYW4gYSB0b3VjaHBvaW50IGRhdGEgaW5zdHJ1Y3Rpb24gZWxlbWVudAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPVUNIUE9JTlRfREFUQV9JTlNUUlVDVElPTl9LRVlfQVRUUklCVVRFID0gImtleSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENvbnN0YW50cyBmb3IgYXR0cmlidXRlcyBvZiBhbiB1cGRhdGUgZGVzY3JpcHRvcgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9ERVNDUklQVE9SX1NFVkVSSVRZID0gInNldmVyaXR5IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDNkNjI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW9fZmFpbGVkUmVhZD1VbmFibGUgdG8gcmVhZCByZXBvc2l0b3J5IGF0IHswfQotaW9fSW5jb21wYXRpYmxlVmVyc2lvbj1cCi1NZXRhZGF0YSByZXBvc2l0b3J5IGhhcyBpbmNvbXBhdGlibGUgdmVyc2lvbiB7MH07IGV4cGVjdGVkIHsxfQotaW9fcGFyc2VFcnJvcj1cCi1FcnJvciBwYXJzaW5nIG1ldGFkYXRhIHJlcG9zaXRvcnkKLQotcmVwb19sb2FkaW5nID0gTG9hZGluZyB0aGUgcmVwb3NpdG9yeSB7MH0KLQotcmVwb01hbl9hZGRpbmcgPSBBZGRpbmcgcmVwb3NpdG9yeSB7MH0KLXJlcG9NYW5fZXhpc3RzPVJlcG9zaXRvcnkgYWxyZWFkeSBleGlzdHMgYXQgezB9Ci1yZXBvTWFuX2ZhaWxlZFJlYWQ9VGhlIHJlcG9zaXRvcnkgY291bGQgbm90IGJlIHJlYWQ6IHswfQotcmVwb01hbl9pbnRlcm5hbEVycm9yPUludGVybmFsIGVycm9yCi1yZXBvTWFuX25vdEV4aXN0cz1ObyByZXBvc2l0b3J5IGZvdW5kIGF0IHswfQotcmVwb01hbl91bmtub3duVHlwZT1Vbmtub3duIHJlcG9zaXRvcnkgdHlwZSBhdCB7MH0KLXJlcG9NYW5faW52YWxpZExvY2F0aW9uPXswfSBpcyBub3QgYSB2YWxpZCByZXBvc2l0b3J5IGxvY2F0aW9uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0lNZXRhZGF0YVJlcG9zaXRvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvSU1ldGFkYXRhUmVwb3NpdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjdmYzg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvSU1ldGFkYXRhUmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5JUXVlcnlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeS5BYnN0cmFjdE1ldGFkYXRhUmVwb3NpdG9yeTsKLQotLyoqCi0gKiBBIG1ldGFkYXRhIHJlcG9zaXRvcnkgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGEgc2V0IG9mIGluc3RhbGxhYmxlIHVuaXRzCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLiAgTWV0YWRhdGEgcmVwb3NpdG9yeQotICogaW1wbGVtZW50YXRpb25zIG11c3Qgc3ViY2xhc3Mge0BsaW5rIEFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5fSByYXRoZXIgdGhhbiAKLSAqIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBkaXJlY3RseS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTWV0YWRhdGFSZXBvc2l0b3J5IGV4dGVuZHMgSVJlcG9zaXRvcnksIElRdWVyeWFibGUgewotCi0JLyoqIAotCSAqIEFkZCB0aGUgZ2l2ZW4gaW5zdGFsbGFibGUgdW5pdHMgdG8gdGhpcyByZXBvc2l0b3J5Ci0JICogQHBhcmFtIGluc3RhbGxhYmxlVW5pdHMgdGhlIGluc3RhbGxhYmxlIHVuaXRzIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEluc3RhbGxhYmxlVW5pdHMoSUluc3RhbGxhYmxlVW5pdFtdIGluc3RhbGxhYmxlVW5pdHMpOwotCi0JLyoqCi0JICogQWRkcyBhIHJlZmVyZW5jZSB0byBhbm90aGVyIHJlcG9zaXRvcnkgdG8gdGhpcyByZXBvc2l0b3J5LiBXaGVuIGEgcmVwb3NpdG9yeQotCSAqIGlzIGxvYWRlZCBieSB7QGxpbmsgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXJ9LCBpdHMgcmVmZXJlbmNlcwotCSAqIGFyZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSByZXBvc2l0b3J5IG1hbmFnZXIncyBzZXQgb2Yga25vd24gcmVwb3NpdG9yaWVzLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBhZGQgdGhlIDxiPmNvbnRlbnRzPC9iPiBvZiB0aGUgZ2l2ZW4KLQkgKiByZXBvc2l0b3J5IHRvIHRoaXMgcmVwb3NpdG9yeSwgYnV0IG1lcmVseSBhZGRzIHRoZSBsb2NhdGlvbiBvZiBhbm90aGVyCi0JICogcmVwb3NpdG9yeSB0byB0aGUgbWV0YWRhdGEgb2YgdGhpcyByZXBvc2l0b3J5LgotCSAqIDxwPgotCSAqIFRoZSB7QGxpbmsgSVJlcG9zaXRvcnkjRU5BQkxFRH0gb3B0aW9uIGZsYWcgY29udHJvbHMgd2hldGhlciB0aGUgCi0JICogcmVmZXJlbmNlZCByZXBvc2l0b3J5IHNob3VsZCBiZSBtYXJrZWQgYXMgZW5hYmxlZCB3aGVuIGFkZGVkIHRvIHRoZSByZXBvc2l0b3J5Ci0JICogbWFuYWdlci4gSWYgdGhpcyBmbGFnIGlzIHNldCwgdGhlIHJlcG9zaXRvcnkgd2lsbCBiZSBtYXJrZWQgYXMgZW5hYmxlZCB3aGVuCi0JICogYWRkZWQgdG8gdGhlIHJlcG9zaXRvcnkgbWFuYWdlci4gSWYgdGhpcyBmbGFnIGlzIG1pc3NpbmcsIHRoZSByZXBvc2l0b3J5IHdpbGwKLQkgKiBiZSBtYXJrZWQgYXMgZGlzYWJsZWQuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSB0byBhZGQKLQkgKiBAcGFyYW0gdHlwZSB0aGUgcmVwb3NpdG9yeSB0eXBlIChjdXJyZW50bHkgZWl0aGVyIHtAbGluayBJUmVwb3NpdG9yeSNUWVBFX01FVEFEQVRBfQotCSAqIG9yIHtAbGluayBJUmVwb3NpdG9yeSNUWVBFX0FSVElGQUNUfSkuCi0JICogQHBhcmFtIG9wdGlvbnMgYml0LXdpc2Ugb3Igb2Ygb3B0aW9uIGNvbnN0YW50cyAoY3VycmVudGx5IGVpdGhlciAKLQkgKiB7QGxpbmsgSVJlcG9zaXRvcnkjRU5BQkxFRH0gb3Ige0BsaW5rIElSZXBvc2l0b3J5I05PTkV9KS4KLQkgKiBAc2VlIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyI3NldEVuYWJsZWQoVVJMLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlZmVyZW5jZShVUkwgbG9jYXRpb24sIGludCB0eXBlLCBpbnQgb3B0aW9ucyk7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFsbCBpbnN0YWxsYWJsZSB1bml0cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBxdWVyeSBmcm9tIHRoaXMgcmVwb3NpdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gcXVlcnkgdGhlIGluc3RhbGxhYmxlIHVuaXRzIHRvIHJlbW92ZQotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFueSB1bml0cyB3ZXJlIGFjdHVhbGx5IHJlbW92ZWQsIGFuZAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJbnN0YWxsYWJsZVVuaXRzKFF1ZXJ5IHF1ZXJ5LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpOwotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBpbnN0YWxsYWJsZSB1bml0cyBmcm9tIHRoaXMgcmVwb3NpdG9yeS4gIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0lNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0lNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4M2Y2ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LklRdWVyeWFibGU7Ci0KLS8qKgotICogVGhlIG1ldGFkYXRhIHJlcG9zaXRvcnkgbWFuYWdlciBpcyB1c2VkIHRvIGNyZWF0ZSwgYWNjZXNzLCBhbmQgbWFuaXB1bGF0ZQotICoge0BsaW5rIElNZXRhZGF0YVJlcG9zaXRvcnl9IGluc3RhbmNlcy4gVGhlIG1hbmFnZXIga2VlcHMgdHJhY2sgb2YgYSAKLSAqIHNldCBvZiBrbm93biByZXBvc2l0b3JpZXMsIGFuZCBwcm92aWRlcyBjYWNoaW5nIG9mIHRoZXNlIGtub3duIHJlcG9zaXRvcmllcwotICogdG8gYXZvaWQgdW5uZWNlc3NhcnkgbG9hZGluZyBvZiByZXBvc2l0b3JpZXMgZnJvbSB0aGUgZGlzayBvciBuZXR3b3JrLiAgVGhlCi0gKiBtYW5hZ2VyIGZpcmVzIHtAbGluayBSZXBvc2l0b3J5RXZlbnR9cyB3aGVuIHRoZSBzZXQgb2Yga25vd24gcmVwb3NpdG9yaWVzCi0gKiBjaGFuZ2VzLgotICogCi0gKiBAbm9pbXBsZW1lbnQgVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgZXh0ZW5kcyBJUXVlcnlhYmxlIHsKLQotCS8qKgotCSAqIENvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhbGwgZW5hYmxlZCByZXBvc2l0b3JpZXMgYXJlIG9mIGludGVyZXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9TSVRPUklFU19BTEwgPSAwOwotCi0JLyoqCi0JICogQ29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHN5c3RlbSByZXBvc2l0b3JpZXMgYXJlIG9mIGludGVyZXN0LgotCSAqIEBzZWUgSVJlcG9zaXRvcnkjUFJPUF9TWVNURU0KLQkgKiBAc2VlICNnZXRLbm93blJlcG9zaXRvcmllcyhpbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQT1NJVE9SSUVTX1NZU1RFTSA9IDEgPDwgMDsKLQotCS8qKgotCSAqIENvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBub24tc3lzdGVtIHJlcG9zaXRvcmllcyBhcmUgb2YgaW50ZXJlc3QKLQkgKiBAc2VlIElSZXBvc2l0b3J5I1BST1BfU1lTVEVNCi0JICogQHNlZSAjZ2V0S25vd25SZXBvc2l0b3JpZXMoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9TSVRPUklFU19OT05fU1lTVEVNID0gMSA8PCAxOwotCi0JLyoqCi0JICogQ29uc3RhbnQgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IGxvY2FsIHJlcG9zaXRvcmllcyBhcmUgb2YgaW50ZXJlc3QuCi0JICogQHNlZSAjZ2V0S25vd25SZXBvc2l0b3JpZXMoaW50KQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUE9TSVRPUklFU19MT0NBTCA9IDEgPDwgMjsKLQotCS8qKgotCSAqIENvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBkaXNhYmxlZCByZXBvc2l0b3JpZXMgYXJlIG9mIGludGVyZXN0LgotCSAqIEBzZWUgI2dldEtub3duUmVwb3NpdG9yaWVzKGludCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVBPU0lUT1JJRVNfRElTQUJMRUQgPSAxIDw8IDM7Ci0KLQkvKioKLQkgKiBSZXBvc2l0b3J5IHR5cGUgZm9yIGEgc2ltcGxlIHJlcG9zaXRvcnkgYmFzZWQgb24gYSBVUkwgb3IgbG9jYWwgZmlsZSBzeXN0ZW0gbG9jYXRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TSU1QTEVfUkVQT1NJVE9SWSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuc2ltcGxlUmVwb3NpdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFkZHMgYSByZXBvc2l0b3J5IHRvIHRoZSBsaXN0IG9mIG1ldGFkYXRhIHJlcG9zaXRvcmllcyB0cmFja2VkIGJ5IHRoZSByZXBvc2l0b3J5Ci0JICogbWFuYWdlci4KLQkgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSBtZXRhZGF0YSByZXBvc2l0b3J5IHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uKTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgZW1wdHkgbWV0YWRhdGEgcmVwb3NpdG9yeSBvZiB0aGUgZ2l2ZW4gdHlwZSBhdCAKLQkgKiB0aGUgZ2l2ZW4gbG9jYXRpb24uCi0JICogPHA+Ci0JICogVGhlIHJlc3VsdGluZyByZXBvc2l0b3J5IGlzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHJlcG9zaXRvcmllcyB0cmFja2VkIGJ5Ci0JICogdGhlIHJlcG9zaXRvcnkgbWFuYWdlci4gQ2xpZW50cyBtdXN0IG1ha2UgYSBzdWJzZXF1ZW50IGNhbGwgdG8ge0BsaW5rICNyZW1vdmVSZXBvc2l0b3J5KFVSTCl9Ci0JICogaWYgdGhleSBkbyBub3Qgd2FudCB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyIHRvIHJlbWVtYmVyIHRoZSByZXBvc2l0b3J5IGZvciBzdWJzZXF1ZW50Ci0JICogbG9hZCBhdHRlbXB0cy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBmb3IgdGhlIG5ldyByZXBvc2l0b3J5Ci0JICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIG5ldyByZXBvc2l0b3J5Ci0JICogQHBhcmFtIHR5cGUgdGhlIGtpbmQgb2YgcmVwb3NpdG9yeSB0byBjcmVhdGUKLQkgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgcHJvcGVydGllcyB0byBzZXQgb24gdGhlIHJlcG9zaXRvcnkKLQkgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHJlcG9zaXRvcnkKLQkgKiBAdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiBpZiB0aGUgcmVwb3NpdG9yeSBjb3VsZCBub3QgYmUgY3JlYXRlZC4gIFJlYXNvbnMgaW5jbHVkZToKLQkgKiA8dWw+Ci0JICogPGxpPlRoZSByZXBvc2l0b3J5IHR5cGUgaXMgdW5rbm93bi48L2xpPgotCSAqIDxsaT5UaGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyB0byB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBsb2NhdGlvbi48L2xpPgotCSAqIDxsaT5BIHJlcG9zaXRvcnkgYWxyZWFkeSBleGlzdHMgYXQgdGhhdCBsb2NhdGlvbi48L2xpPgotCSAqIDwvdWw+Ci0JICovCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgY3JlYXRlUmVwb3NpdG9yeShVUkwgbG9jYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgTWFwIHByb3BlcnRpZXMpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhZGF0YSByZXBvc2l0b3J5IGxvY2F0aW9ucyBrbm93biB0byB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IGEgdmFsaWQgcmVwb3NpdG9yeQotCSAqIGV4aXN0cyBhdCBhbnkgb2YgdGhlIHJldHVybmVkIGxvY2F0aW9ucyBhdCBhbnkgcGFydGljdWxhciBtb21lbnQgaW4gdGltZS4KLQkgKiBBIHN1YnNlcXVlbnQgYXR0ZW1wdCB0byBsb2FkIGEgcmVwb3NpdG9yeSBhdCBhbnkgb2YgdGhlIGdpdmVuIGxvY2F0aW9ucyBtYXkKLQkgKiBvciBtYXkgbm90IHN1Y2NlZWQuCi0JICogCi0JICogQHBhcmFtIGZsYWdzIGFuIGludGVnZXIgYml0LW1hc2sgaW5kaWNhdGluZyB3aGljaCByZXBvc2l0b3JpZXMgc2hvdWxkIGJlCi0JICogcmV0dXJuZWQuICA8Y29kZT5SRVBPU0lUT1JJRVNfQUxMPC9jb2RlPiBjYW4gYmUgdXNlZCBhcyB0aGUgbWFzayB3aGVuCi0JICogYWxsIGVuYWJsZWQgcmVwb3NpdG9yaWVzIHNob3VsZCBiZSByZXR1cm5lZC4gIFdoZXJlIG11bHRpcGxlIG1hc2tzIGFyZSBjb21iaW5lZCwgb25seQotCSAqIHRoZSByZXBvc2l0b3JpZXMgdGhhdCBzYXRpc2Z5IGFsbCB0aGUgZ2l2ZW4gY3JpdGVyaWEgYXJlIHJldHVybmVkLiBGb3IgZXhhbXBsZSwKLQkgKiBhIGZsYWcgdmFsdWUgb2YgKFJFUE9TSVRPUklFU19TWVNURU18UkVQT1NJVE9SSUVTX0xPQ0FMKSB3aWxsIG9ubHkKLQkgKiByZXR1cm4gcmVwb3NpdG9yaWVzIHRoYXQgYXJlIGJvdGggc3lzdGVtIGFuZCBsb2NhbCByZXBvc2l0b3JpZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgbG9jYXRpb25zIG9mIHRoZSByZXBvc2l0b3JpZXMgbWFuYWdlZCBieSB0aGlzIHJlcG9zaXRvcnkgbWFuYWdlci4KLQkgKiAKLQkgKiBAc2VlICNSRVBPU0lUT1JJRVNfQUxMCi0JICogQHNlZSAjUkVQT1NJVE9SSUVTX1NZU1RFTQotCSAqIEBzZWUgI1JFUE9TSVRPUklFU19MT0NBTAotCSAqIEBzZWUgI1JFUE9TSVRPUklFU19OT05fU1lTVEVNCi0JICogQHNlZSAjUkVQT1NJVE9SSUVTX0RJU0FCTEVECi0JICovCi0JcHVibGljIFVSTFtdIGdldEtub3duUmVwb3NpdG9yaWVzKGludCBmbGFncyk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcG9zaXRvcnkgYXQgdGhlIGdpdmVuIFVSTCwgCi0JICogd2l0aG91dCBsb2FkaW5nIHRoZSByZXBvc2l0b3J5LgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBzb21lIHByb3BlcnRpZXMgZm9yIGEgcmVwb3NpdG9yeSBjYW4gb25seSBiZQotCSAqIGRldGVybWluZWQgd2hlbiB0aGF0IHJlcG9zaXRvcnkgaXMgbG9hZGVkLiAgVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBmb3Igc3VjaCBwcm9wZXJ0aWVzLiAgT25seSB2YWx1ZXMgZm9yIHRoZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIGFscmVhZHkKLQkgKiBrbm93biBieSBhIHJlcG9zaXRvcnkgbWFuYWdlciB3aWxsIGJlIHJldHVybmVkLiAKLQkgKiA8cD4KLQkgKiBJZiBhIGNsaWVudCB3aXNoZXMgdG8gcmV0cmlldmUgYSBwcm9wZXJ0eSB2YWx1ZSBmcm9tIGEgcmVwb3NpdG9yeSAKLQkgKiByZWdhcmRsZXNzIG9mIHRoZSBjb3N0IG9mIHJldHJpZXZpbmcgaXQsIHRoZSBjbGllbnQgc2hvdWxkIGxvYWQgdGhlIAotCSAqIHJlcG9zaXRvcnkgYW5kIHRoZW4gcmV0cmlldmUgdGhlIHByb3BlcnR5IGZyb20gdGhlIHJlcG9zaXRvcnkgaXRzZWxmLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgVVJMIG9mIHRoZSByZXBvc2l0b3J5IGluIHF1ZXN0aW9uCi0JICogQHBhcmFtIGtleSB0aGUgU3RyaW5nIGtleSBvZiB0aGUgcHJvcGVydHkgZGVzaXJlZAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlIHJlcG9zaXRvcnkKLQkgKiBkb2VzIG5vdCBleGlzdCwgdGhlIHZhbHVlIGRvZXMgbm90IGV4aXN0LCBvciB0aGUgcHJvcGVydHkgdmFsdWUgCi0JICogY291bGQgbm90IGJlIGRldGVybWluZWQgd2l0aG91dCBsb2FkaW5nIHRoZSByZXBvc2l0b3J5LgotCSAqIAotCSAqIEBzZWUgI2xvYWRSZXBvc2l0b3J5KFVSTCwgSVByb2dyZXNzTW9uaXRvcikKLQkgKiBAc2VlIElSZXBvc2l0b3J5I2dldFByb3BlcnRpZXMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmVwb3NpdG9yeVByb3BlcnR5KFVSTCBsb2NhdGlvbiwgU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmFibGVtZW50IHZhbHVlIG9mIGEgcmVwb3NpdG9yeS4gIERpc2FibGVkIHJlcG9zaXRvcmllcyBhcmUga25vd24KLQkgKiB0byB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyLCBidXQgYXJlIG5ldmVyIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgcHJvdmlzaW9uaW5nCi0JICogb3BlcmF0aW9uLiBEaXNhYmxlZCByZXBvc2l0b3JpZXMgYXJlIHVzZWZ1bCBhcyBhIGZvcm0gb2YgYm9va21hcmsgdG8gaW5kaWNhdGUgdGhhdCBhIAotCSAqIHJlcG9zaXRvcnkgbG9jYXRpb24gaXMgb2YgaW50ZXJlc3QsIGJ1dCBub3QgY3VycmVudGx5IHVzZWQuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IGVuYWJsZW1lbnQgaXMgYSBwcm9wZXJ0eSBvZiB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyIGFuZCBub3QgYSBwcm9wZXJ0eQotCSAqIG9mIHRoZSBhZmZlY3RlZCByZXBvc2l0b3J5LiBUaGUgZW5hYmxlbWVudCBvZiB0aGUgcmVwb3NpdG9yeSBpcyBkaXNjYXJkZWQgd2hlbiAKLQkgKiBhIHJlcG9zaXRvcnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSByZXBvc2l0b3J5IG1hbmFnZXIuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSB3aG9zZSBlbmFibGVtZW50IGlzIHJlcXVlc3RlZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHJlcG9zaXRvcnkgaXMgZW5hYmxlZCwgYW5kCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IGlmIGl0IGlzIG5vdCBlbmFibGVkLCBvciBpZiB0aGUgcmVwb3NpdG9yeSBsb2NhdGlvbiAKLQkgKiBpcyBub3Qga25vd24gdG8gdGhlIHJlcG9zaXRvcnkgbWFuYWdlci4KLQkgKiBAc2VlICNSRVBPU0lUT1JJRVNfRElTQUJMRUQKLQkgKiBAc2VlICNzZXRFbmFibGVkKFVSTCwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoVVJMIGxvY2F0aW9uKTsKLQotCS8qKgotCSAqIExvYWRzIGEgcmVwb3NpdG9yeSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBVUkwuICBJZiBhIHJlcG9zaXRvcnkgaGFzCi0JICogcHJldmlvdXNseSBiZWVuIGxvYWRlZCBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24sIHRoZSBzYW1lIGNhY2hlZCByZXBvc2l0b3J5Ci0JICogbWF5IGJlIHJldHVybmVkLgotCSAqIDxwPgotCSAqIFRoZSByZXN1bHRpbmcgcmVwb3NpdG9yeSBpcyBhZGRlZCB0byB0aGUgbGlzdCBvZiByZXBvc2l0b3JpZXMgdHJhY2tlZCBieQotCSAqIHRoZSByZXBvc2l0b3J5IG1hbmFnZXIuIENsaWVudHMgbXVzdCBtYWtlIGEgc3Vic2VxdWVudCBjYWxsIHRvIHtAbGluayAjcmVtb3ZlUmVwb3NpdG9yeShVUkwpfQotCSAqIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlIHJlcG9zaXRvcnkgbWFuYWdlciB0byByZW1lbWJlciB0aGUgcmVwb3NpdG9yeSBmb3Igc3Vic2VxdWVudAotCSAqIGxvYWQgYXR0ZW1wdHMuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkgdG8gbG9hZAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIFRoZSBsb2FkZWQgbWV0YWRhdGEgcmVwb3NpdG9yeQotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIGlmIHRoZSByZXBvc2l0b3J5IGNvdWxkIG5vdCBiZSBjcmVhdGVkLiAgUmVhc29ucyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+VGhlcmUgaXMgbm8gZXhpc3RpbmcgcmVwb3NpdG9yeSBhdCB0aGF0IGxvY2F0aW9uLjwvbGk+Ci0JICogPGxpPlRoZSByZXBvc2l0b3J5IGF0IHRoYXQgbG9jYXRpb24gY291bGQgbm90IGJlIHJlYWQuPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGxvYWRSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVmcmVzaGVzIHRoZSByZXBvc2l0b3J5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFVSTC4gVGhpcyBtZXRob2QgZGlzY2FyZHMKLQkgKiBhbnkgY2FjaGVkIHN0YXRlIGhlbGQgYnkgdGhlIHJlcG9zaXRvcnkgbWFuYWdlciBhbmQgcmVsb2FkcyB0aGUgcmVwb3NpdG9yeQotCSAqIGNvbnRlbnRzLiBUaGUgcHJvdmlkZWQgcmVwb3NpdG9yeSBsb2NhdGlvbiBtdXN0IGFscmVhZHkgYmUga25vd24gdG8gdGhlIHJlcG9zaXRvcnkKLQkgKiBtYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkgdG8gcmVmcmVzaAotCSAqIEBwYXJhbSBtb25pdG9yIGEgcHJvZ3Jlc3MgbW9uaXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgcHJvZ3Jlc3MKLQkgKiAgICByZXBvcnRpbmcgaXMgbm90IGRlc2lyZWQKLQkgKiBAcmV0dXJuIFRoZSByZWZyZXNoZWQgbWV0YWRhdGEgcmVwb3NpdG9yeQotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIGlmIHRoZSByZXBvc2l0b3J5IGNvdWxkIG5vdCBiZSByZWZyZXNoZWQuICBSZWFzb25zIGluY2x1ZGU6Ci0JICogPHVsPgotCSAqIDxsaT5UaGUgbG9jYXRpb24gaXMgbm90IGtub3duIHRvIHRoZSByZXBvc2l0b3J5IG1hbmFnZXIuPC9saT4KLQkgKiA8bGk+VGhlcmUgaXMgbm8gZXhpc3RpbmcgcmVwb3NpdG9yeSBhdCB0aGF0IGxvY2F0aW9uLjwvbGk+Ci0JICogPGxpPlRoZSByZXBvc2l0b3J5IGF0IHRoYXQgbG9jYXRpb24gY291bGQgbm90IGJlIHJlYWQuPC9saT4KLQkgKiA8L3VsPgotCSAqLwotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IHJlZnJlc2hSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgbWV0YWRhdGEgcmVwb3NpdG9yeSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gZnJvbSB0aGUgbGlzdCBvZgotCSAqIG1ldGFkYXRhIHJlcG9zaXRvcmllcyB0cmFja2VkIGJ5IHRoZSByZXBvc2l0b3J5IG1hbmFnZXIuICBUaGUgdW5kZXJseWluZwotCSAqIHJlcG9zaXRvcnkgaXMgbm90IGRlbGV0ZWQuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwb3NpdG9yeSB0byByZW1vdmUKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgcmVwb3NpdG9yeSB3YXMgcmVtb3ZlZCwgYW5kIAotCSAqIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlUmVwb3NpdG9yeShVUkwgbG9jYXRpb24pOwotCi0JLyoqCi0JICogU2V0cyB0aGUgZW5hYmxlbWVudCBvZiBhIHJlcG9zaXRvcnkuIERpc2FibGVkIHJlcG9zaXRvcmllcyBhcmUga25vd24KLQkgKiB0byB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyLCBidXQgYXJlIG5ldmVyIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgcHJvdmlzaW9uaW5nCi0JICogb3BlcmF0aW9uLiBEaXNhYmxlZCByZXBvc2l0b3JpZXMgYXJlIHVzZWZ1bCBhcyBhIGZvcm0gb2YgYm9va21hcmsgdG8gaW5kaWNhdGUgdGhhdCBhIAotCSAqIHJlcG9zaXRvcnkgbG9jYXRpb24gaXMgb2YgaW50ZXJlc3QsIGJ1dCBub3QgY3VycmVudGx5IHVzZWQuCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IGVuYWJsZW1lbnQgaXMgYSBwcm9wZXJ0eSBvZiB0aGUgcmVwb3NpdG9yeSBtYW5hZ2VyIGFuZCBub3QgYSBwcm9wZXJ0eQotCSAqIG9mIHRoZSBhZmZlY3RlZCByZXBvc2l0b3J5LiBUaGUgZW5hYmxlbWVudCBvZiB0aGUgcmVwb3NpdG9yeSBpcyBkaXNjYXJkZWQgd2hlbiAKLQkgKiBhIHJlcG9zaXRvcnkgaXMgcmVtb3ZlZCBmcm9tIHRoZSByZXBvc2l0b3J5IG1hbmFnZXIuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdCBpZiB0aGUgZ2l2ZW4gcmVwb3NpdG9yeSBsb2NhdGlvbiBpcyBub3Qga25vd24gdG8gdGhlCi0JICogcmVwb3NpdG9yeSBtYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIHJlcG9zaXRvcnkgdG8gZW5hYmxlIG9yIGRpc2FibGUKLQkgKiBAcGFyYW0gZW5hYmxlbWVudCA8Y29kZT50cnVlPC9jb2RlPnRvIGVuYWJsZSB0aGUgcmVwb3NpdG9yeSwgYW5kCi0JICogPGNvZGU+ZmFsc2U8L2NvZGU+IHRvIGRpc2FibGUgdGhlIHJlcG9zaXRvcnkKLQkgKiBAc2VlICNSRVBPU0lUT1JJRVNfRElTQUJMRUQKLQkgKiBAc2VlICNpc0VuYWJsZWQoVVJMKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoVVJMIGxvY2F0aW9uLCBib29sZWFuIGVuYWJsZW1lbnQpOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIGEgZ2l2ZW4gVVJMIGFuZCByZXR1cm5zIGEgc3RhdHVzIGluZGljYXRpbmcgd2hldGhlciBhIHZhbGlkIHJlcG9zaXRvcnkgaXMgbGlrZWx5Ci0JICogdG8gYmUgZm91bmQgYXQgdGhlIGdpdmVuIFVSTC4gIENhbGxlcnMgbXVzdCBhc3N1bWUgdGhhdCB0aGUgdmFsaWRpdHkgb2YgYSAKLQkgKiByZXBvc2l0b3J5IGxvY2F0aW9uIGNhbm5vdCBiZSBjb21wbGV0ZWx5IGRldGVybWluZWQgdW50aWwgYW4gYXR0ZW1wdCB0byBsb2FkIAotCSAqIHRoZSByZXBvc2l0b3J5IGlzIG1hZGUuICAKLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSByZXBvc2l0b3J5IHRvIHZhbGlkYXRlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gQSBzdGF0dXMgaW5kaWNhdGluZyB3aGV0aGVyIGEgdmFsaWQgcmVwb3NpdG9yeSBpcyBsaWtlbHkgbG9jYXRlZCBhdCB0aGUKLQkgKiBsb2NhdGlvbi4gIEEgc3RhdHVzIHdpdGggc2V2ZXJpdHkgPGNvZGU+T0s8L2NvZGU+IGluZGljYXRlcyB0aGF0IHRoZSByZXBvc2l0b3J5IGlzCi0JICogbGlrZWx5IHRvIGJlIGxvYWRhYmxlLCBvciB0aGF0IGFzIG11Y2ggdmFsaWRhdGlvbiBhcyBjb3VsZCBiZSBkb25lIHdhcyBzdWNjZXNzZnVsLgotCSAqIFJlYXNvbnMgZm9yIGEgbm9uLU9LIHN0YXR1cyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+VGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpcyBub3QgYSB2YWxpZCByZXBvc2l0b3J5IGxvY2F0aW9uLjwvbGk+Ci0JICogPGxpPlRoZXJlIGlzIG5vIGV4aXN0aW5nIHJlcG9zaXRvcnkgYXQgdGhhdCBsb2NhdGlvbi48L2xpPgotCSAqIDxsaT5UaGUgcmVwb3NpdG9yeSBhdCB0aGF0IGxvY2F0aW9uIGNvdWxkIG5vdCBiZSByZWFkLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZVJlcG9zaXRvcnlMb2NhdGlvbihVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9BYnN0cmFjdE1ldGFkYXRhUmVwb3NpdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvQWJzdHJhY3RNZXRhZGF0YVJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkNTNhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9BYnN0cmFjdE1ldGFkYXRhUmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5jb3JlLnJlcG9zaXRvcnkuQWJzdHJhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFRoZSBjb21tb24gYmFzZSBjbGFzcyBmb3IgYWxsIG1ldGFkYXRhIHJlcG9zaXRvcmllcy4KLSAqIDxwPgotICogQ2xpZW50cyBtYXkgc3ViY2xhc3MgdGhpcyBjbGFzcy4KLSAqIDxwPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNZXRhZGF0YVJlcG9zaXRvcnkgZXh0ZW5kcyBBYnN0cmFjdFJlcG9zaXRvcnkgaW1wbGVtZW50cyBJTWV0YWRhdGFSZXBvc2l0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgUmVwb3NpdG9yeVN0YXRlIHsKLQkJcHVibGljIFN0cmluZyBOYW1lOwotCQlwdWJsaWMgU3RyaW5nIFR5cGU7Ci0JCXB1YmxpYyBWZXJzaW9uIFZlcnNpb247Ci0JCXB1YmxpYyBTdHJpbmcgUHJvdmlkZXI7Ci0JCXB1YmxpYyBTdHJpbmcgRGVzY3JpcHRpb247Ci0JCXB1YmxpYyBVUkwgTG9jYXRpb247Ci0JCXB1YmxpYyBNYXAgUHJvcGVydGllczsKLQkJcHVibGljIElJbnN0YWxsYWJsZVVuaXRbXSBVbml0czsKLQkJcHVibGljIFJlcG9zaXRvcnlSZWZlcmVuY2VbXSBSZXBvc2l0b3JpZXM7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5KCkgewotCQlzdXBlcigibm9OYW1lIiwgIm5vVHlwZSIsICJub1ZlcnNpb24iLCBudWxsLCBudWxsLCBudWxsLCBudWxsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplKFJlcG9zaXRvcnlTdGF0ZSBzdGF0ZSk7Ci0KLQlwcm90ZWN0ZWQgQWJzdHJhY3RNZXRhZGF0YVJlcG9zaXRvcnkoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmVyc2lvbiwgVVJMIGxvY2F0aW9uLCBTdHJpbmcgZGVzY3JpcHRpb24sIFN0cmluZyBwcm92aWRlciwgTWFwIHByb3BlcnRpZXMpIHsKLQkJc3VwZXIobmFtZSwgdHlwZSwgdmVyc2lvbiwgbG9jYXRpb24sIGRlc2NyaXB0aW9uLCBwcm92aWRlciwgcHJvcGVydGllcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkSW5zdGFsbGFibGVVbml0cyhJSW5zdGFsbGFibGVVbml0W10gaW5zdGFsbGFibGVVbml0KSB7Ci0JCWFzc2VydE1vZGlmaWFibGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWZlcmVuY2UoVVJMIHJlcG9zaXRvcnlMb2NhdGlvbiwgaW50IHJlcG9zaXRvcnlUeXBlLCBpbnQgb3B0aW9ucykgewotCQlhc3NlcnRNb2RpZmlhYmxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKCkgewotCQlhc3NlcnRNb2RpZmlhYmxlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSW5zdGFsbGFibGVVbml0cyhRdWVyeSBxdWVyeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWFzc2VydE1vZGlmaWFibGUoKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvSU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L0lNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwM2MxY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvSU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLQotcHVibGljIGludGVyZmFjZSBJTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGVtcHR5IG1ldGFkYXRhIHJlcG9zaXRvcnkgb2YgdGhlIGdpdmVuIHR5cGUgYXQgCi0JICogdGhlIGdpdmVuIGxvY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbiB0aGUgbG9jYXRpb24gZm9yIHRoZSBuZXcgcmVwb3NpdG9yeQotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBuZXcgcmVwb3NpdG9yeQotCSAqIEBwYXJhbSB0eXBlIHRoZSBraW5kIG9mIHJlcG9zaXRvcnkgdG8gY3JlYXRlCi0JICogQHBhcmFtIHByb3BlcnRpZXMgdGhlIHByb3BlcnRpZXMgdG8gc2V0IG9uIHRoZSByZXBvc2l0b3J5Ci0JICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCByZXBvc2l0b3J5Ci0JICogQHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gaWYgdGhlIHJlcG9zaXRvcnkgY291bGQgbm90IGJlIGNyZWF0ZWQuICBSZWFzb25zIGluY2x1ZGU6Ci0JICogPHVsPgotCSAqIDxsaT5UaGUgcmVwb3NpdG9yeSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LjwvbGk+Ci0JICogPGxpPlRoZXJlIHdhcyBhbiBlcnJvciB3cml0aW5nIHRvIHRoZSBnaXZlbiByZXBvc2l0b3J5IGxvY2F0aW9uLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBjcmVhdGUoVVJMIGxvY2F0aW9uLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUsIE1hcCBwcm9wZXJ0aWVzKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogTG9hZHMgYSByZXBvc2l0b3J5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIFVSTC4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSByZXBvc2l0b3J5IHRvIGxvYWQKLQkgKiBAcGFyYW0gbW9uaXRvciBhIHByb2dyZXNzIG1vbml0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHByb2dyZXNzCi0JICogICAgcmVwb3J0aW5nIGlzIG5vdCBkZXNpcmVkCi0JICogQHJldHVybiBUaGUgbG9hZGVkIG1ldGFkYXRhIHJlcG9zaXRvcnkKLQkgKiBAdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiBpZiB0aGUgcmVwb3NpdG9yeSBjb3VsZCBub3QgYmUgY3JlYXRlZC4gIFJlYXNvbnMgaW5jbHVkZToKLQkgKiA8dWw+Ci0JICogPGxpPlRoZXJlIGlzIG5vIGV4aXN0aW5nIHJlcG9zaXRvcnkgYXQgdGhhdCBsb2NhdGlvbi48L2xpPgotCSAqIDxsaT5UaGUgcmVwb3NpdG9yeSBhdCB0aGF0IGxvY2F0aW9uIGNvdWxkIG5vdCBiZSByZWFkLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBsb2FkKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVmFsaWRhdGVzIGEgY2FuZGlkYXRlIHJlcG9zaXRvcnkgVVJMIGFuZCByZXR1cm5zIGEgc3RhdHVzIGluZGljYXRpbmcgdGhlCi0JICogbGlrZWxpaG9vZCBvZiBhIHZhbGlkIHJlcG9zaXRvcnkgYmVpbmcgbG9jYXRlZCBhdCB0aGUgbG9jYXRpb24uICBJbXBsZW1lbnRvcnMgCi0JICogc2hvdWxkIG1ha2UgYWxsIGF0dGVtcHRzIHRvIHZhbGlkYXRlIHRoZSBVUkwgdGhhdCBjYW4gYmUgbWFkZSB3aXRob3V0IAotCSAqIGFjdHVhbGx5IGxvYWRpbmcgdGhlIHJlcG9zaXRvcnkuICBUaGUgY29tcHV0YXRpb24gZm9yIHRoaXMgbWV0aG9kIG11c3QgYmUgCi0JICogc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBsb2FkaW5nIHRoZSByZXBvc2l0b3J5LiAgRWFybHkgZGV0ZWN0YWJsZSBlcnJvciAKLQkgKiBjb25kaXRpb25zLCBzdWNoIGFzIHRoZSBub24tZXhpc3RlbmNlIG9mIHRoZSBsb2NhdGlvbiwgb3IgYW4gaW5hYmlsaXR5IHRvIHJlYWQgCi0JICogdGhlIGxvY2F0aW9uLCBzaG91bGQgYmUgZGV0ZXJtaW5lZCBpbiB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gVGhlIGxvY2F0aW9uIG9mIHRoZSByZXBvc2l0b3J5IHRvIHZhbGlkYXRlCi0JICogQHBhcmFtIG1vbml0b3IgYSBwcm9ncmVzcyBtb25pdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBwcm9ncmVzcwotCSAqICAgIHJlcG9ydGluZyBpcyBub3QgZGVzaXJlZAotCSAqIEByZXR1cm4gQSBzdGF0dXMgaW5kaWNhdGluZyB3aGV0aGVyIGEgdmFsaWQgcmVwb3NpdG9yeSBpcyBsaWtlbHkgbG9jYXRlZCBhdCB0aGUKLQkgKiBsb2NhdGlvbi4gIEEgc3RhdHVzIHdpdGggc2V2ZXJpdHkgPGNvZGU+T0s8L2NvZGU+IGluZGljYXRlcyB0aGF0IHRoZSByZXBvc2l0b3J5IGlzCi0JICogbGlrZWx5IHRvIGJlIGxvYWRhYmxlLCBvciB0aGF0IGFzIG11Y2ggdmFsaWRhdGlvbiBhcyBjb3VsZCBiZSBkb25lIHdhcyBzdWNjZXNzZnVsLgotCSAqIFJlYXNvbnMgZm9yIGEgbm9uLU9LIHN0YXR1cyBpbmNsdWRlOgotCSAqIDx1bD4KLQkgKiA8bGk+VGhlIHNwZWNpZmllZCBsb2NhdGlvbiBpcyBub3QgYSB2YWxpZCByZXBvc2l0b3J5IGxvY2F0aW9uLjwvbGk+Ci0JICogPGxpPlRoZXJlIGlzIG5vIGV4aXN0aW5nIHJlcG9zaXRvcnkgYXQgdGhhdCBsb2NhdGlvbi48L2xpPgotCSAqIDxsaT5UaGUgcmVwb3NpdG9yeSBhdCB0aGF0IGxvY2F0aW9uIGNvdWxkIG5vdCBiZSByZWFkLjwvbGk+Ci0JICogPC91bD4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9SZXBvc2l0b3J5UmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9SZXBvc2l0b3J5UmVmZXJlbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5Yzk4NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3BpL3AyL21ldGFkYXRhL3JlcG9zaXRvcnkvUmVwb3NpdG9yeVJlZmVyZW5jZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0vKioKLSAqIFNlcmlhbGl6YXRpb24gaGVscGVyIGNsYXNzIGZvciByZXBvc2l0b3J5IHJlZmVyZW5jZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5UmVmZXJlbmNlIHsKLQlwdWJsaWMgVVJMIExvY2F0aW9uOwotCXB1YmxpYyBpbnQgVHlwZTsKLQlwdWJsaWMgaW50IE9wdGlvbnM7Ci0KLQlwdWJsaWMgUmVwb3NpdG9yeVJlZmVyZW5jZShVUkwgbG9jYXRpb24sIGludCB0eXBlLCBpbnQgb3B0aW9ucykgewotCQl0aGlzLkxvY2F0aW9uID0gbG9jYXRpb247Ci0JCXRoaXMuVHlwZSA9IHR5cGU7Ci0JCXRoaXMuT3B0aW9ucyA9IG9wdGlvbnM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVJlcG9zaXRvcnlSZWZlcmVuY2Ugb3RoZXIgPSAoUmVwb3NpdG9yeVJlZmVyZW5jZSkgb2JqOwotCQlpZiAoTG9jYXRpb24gPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLkxvY2F0aW9uICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFMb2NhdGlvbi5lcXVhbHMob3RoZXIuTG9jYXRpb24pKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoVHlwZSAhPSBvdGhlci5UeXBlKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLQkJaW50IHJlc3VsdCA9IDE7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChMb2NhdGlvbiA9PSBudWxsKSA/IDAgOiBMb2NhdGlvbi5oYXNoQ29kZSgpKTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBUeXBlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L1NpbXBsZU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3NwaS9wMi9tZXRhZGF0YS9yZXBvc2l0b3J5L1NpbXBsZU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiZjAwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9zcGkvcDIvbWV0YWRhdGEvcmVwb3NpdG9yeS9TaW1wbGVNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphcklucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSBpbXBsZW1lbnRzIElNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfRVhURU5TSU9OID0gIi5qYXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FWFRFTlNJT04gPSAiLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVE9DT0xfRklMRSA9ICJmaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElNZXRhZGF0YVJlcG9zaXRvcnkgY3JlYXRlKFVSTCBsb2NhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBNYXAgcHJvcGVydGllcykgewotCQlpZiAobG9jYXRpb24uZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBMb2NhbE1ldGFkYXRhUmVwb3NpdG9yeShsb2NhdGlvbiwgbmFtZSwgcHJvcGVydGllcyk7Ci0JCXJldHVybiBuZXcgVVJMTWV0YWRhdGFSZXBvc2l0b3J5KGxvY2F0aW9uLCBuYW1lLCBwcm9wZXJ0aWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZmlsZSBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0gdGhhdCBjb250YWlucyB0aGUgY29udGVudHMgb2YgdGhlCi0JICogbWV0YWRhdGEgcmVwb3NpdG9yeSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldExvY2FsRmlsZShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24gewotCQlGaWxlIGxvY2FsRmlsZSA9IG51bGw7Ci0JCVVSTCBqYXJMb2NhdGlvbiA9IFVSTE1ldGFkYXRhUmVwb3NpdG9yeS5nZXRBY3R1YWxMb2NhdGlvbihsb2NhdGlvbiwgSkFSX0VYVEVOU0lPTik7Ci0JCVVSTCB4bWxMb2NhdGlvbiA9IFVSTE1ldGFkYXRhUmVwb3NpdG9yeS5nZXRBY3R1YWxMb2NhdGlvbihsb2NhdGlvbiwgWE1MX0VYVEVOU0lPTik7Ci0JCS8vIElmIHRoZSByZXBvc2l0b3J5IGlzIGxvY2FsLCB3ZSBjYW4gcmV0dXJuIHRoZSByZXBvc2l0b3J5IGZpbGUgZGlyZWN0bHkKLQkJaWYgKFBST1RPQ09MX0ZJTEUuZXF1YWxzKHhtbExvY2F0aW9uLmdldFByb3RvY29sKCkpKSB7Ci0JCQkvL2xvb2sgZm9yIGEgY29tcHJlc3NlZCBsb2NhbCBmaWxlCi0JCQlsb2NhbEZpbGUgPSBuZXcgRmlsZShqYXJMb2NhdGlvbi5nZXRQYXRoKCkpOwotCQkJaWYgKGxvY2FsRmlsZS5leGlzdHMoKSkKLQkJCQlyZXR1cm4gbG9jYWxGaWxlOwotCQkJLy9sb29rIGZvciBhbiB1bmNvbXByZXNzZWQgbG9jYWwgZmlsZQotCQkJbG9jYWxGaWxlID0gbmV3IEZpbGUoeG1sTG9jYXRpb24uZ2V0UGF0aCgpKTsKLQkJCWlmIChsb2NhbEZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIGxvY2FsRmlsZTsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5pb19mYWlsZWRSZWFkLCBsb2NhdGlvbik7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQsIG1zZywgbnVsbCkpOwotCQl9Ci0JCS8vZmlsZSBpcyBub3QgbG9jYWwsIGNyZWF0ZSBhIGNhY2hlIG9mIHRoZSByZXBvc2l0b3J5IG1ldGFkYXRhCi0JCWxvY2FsRmlsZSA9IEFjdGl2YXRvci5nZXRDYWNoZU1hbmFnZXIoKS5jcmVhdGVDYWNoZShsb2NhdGlvbiwgbW9uaXRvcik7Ci0JCWlmIChsb2NhbEZpbGUgPT0gbnVsbCkgewotCQkJLy90aGVyZSBpcyBubyByZW1vdGUgZmlsZSBpbiBlaXRoZXIgZm9ybQotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLmlvX2ZhaWxlZFJlYWQsIGxvY2F0aW9uKTsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgbXNnLCBudWxsKSk7Ci0JCX0KLQkJcmV0dXJuIGxvY2FsRmlsZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkjdmFsaWRhdGUoamF2YS5uZXQuVVJMLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJdmFsaWRhdGVBbmRMb2FkKGxvY2F0aW9uLCBmYWxzZSwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5I2xvYWQoamF2YS5uZXQuVVJMLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBsb2FkKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHZhbGlkYXRlQW5kTG9hZChsb2NhdGlvbiwgdHJ1ZSwgbW9uaXRvcik7Ci0JfQotCi0JcHJvdGVjdGVkIElNZXRhZGF0YVJlcG9zaXRvcnkgdmFsaWRhdGVBbmRMb2FkKFVSTCBsb2NhdGlvbiwgYm9vbGVhbiBkb0xvYWQsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWxvbmcgdGltZSA9IDA7Ci0JCWZpbmFsIFN0cmluZyBkZWJ1Z01zZyA9ICJWYWxpZGF0aW5nIGFuZCBsb2FkaW5nIG1ldGFkYXRhIHJlcG9zaXRvcnkgIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoVHJhY2luZy5ERUJVR19NRVRBREFUQV9QQVJTSU5HKSB7Ci0JCQlUcmFjaW5nLmRlYnVnKGRlYnVnTXNnICsgbG9jYXRpb24pOwotCQkJdGltZSA9IC1TeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlTdWJNb25pdG9yIHN1YiA9IFN1Yk1vbml0b3IuY29udmVydChtb25pdG9yLCA0MDApOwotCQl0cnkgewotCQkJRmlsZSBsb2NhbEZpbGUgPSBnZXRMb2NhbEZpbGUobG9jYXRpb24sIHN1Yi5uZXdDaGlsZCgzMDApKTsKLQkJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShsb2NhbEZpbGUpKTsKLQkJCUphcklucHV0U3RyZWFtIGphclN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vaWYgcmVhZGluZyBmcm9tIGEgamFyLCBvYnRhaW4gYSBzdHJlYW0gb24gdGhlIGVudHJ5IHdpdGggdGhlIGFjdHVhbCBjb250ZW50cwotCQkJCWlmIChsb2NhbEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkuZW5kc1dpdGgoSkFSX0VYVEVOU0lPTikpIHsKLQkJCQkJamFyU3RyZWFtID0gbmV3IEphcklucHV0U3RyZWFtKGluU3RyZWFtKTsKLQkJCQkJSmFyRW50cnkgamFyRW50cnkgPSBqYXJTdHJlYW0uZ2V0TmV4dEphckVudHJ5KCk7Ci0JCQkJCVN0cmluZyBlbnRyeU5hbWUgPSBVUkxNZXRhZGF0YVJlcG9zaXRvcnkuQ09OVEVOVF9GSUxFTkFNRSArIFVSTE1ldGFkYXRhUmVwb3NpdG9yeS5YTUxfRVhURU5TSU9OOwotCQkJCQl3aGlsZSAoamFyRW50cnkgIT0gbnVsbCAmJiAoIWVudHJ5TmFtZS5lcXVhbHMoamFyRW50cnkuZ2V0TmFtZSgpKSkpIHsKLQkJCQkJCWphckVudHJ5ID0gamFyU3RyZWFtLmdldE5leHRKYXJFbnRyeSgpOwotCQkJCQl9Ci0JCQkJCWlmIChqYXJFbnRyeSA9PSBudWxsKQotCQkJCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5yZXBvTWFuX2ludmFsaWRMb2NhdGlvbiwgbG9jYXRpb24pKTsKLQkJCQl9Ci0JCQkJLy9wYXJzZSB0aGUgcmVwb3NpdG9yeSBkZXNjcmlwdG9yIGZpbGUKLQkJCQlzdWIuc2V0V29ya1JlbWFpbmluZygxMDApOwotCQkJCWlmIChkb0xvYWQpIHsKLQkJCQkJSW5wdXRTdHJlYW0gZGVzY3JpcHRvclN0cmVhbSA9IGphclN0cmVhbSAhPSBudWxsID8gamFyU3RyZWFtIDogaW5TdHJlYW07Ci0JCQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVzdWx0ID0gbmV3IE1ldGFkYXRhUmVwb3NpdG9yeUlPKCkucmVhZChsb2NhbEZpbGUudG9VUkwoKSwgZGVzY3JpcHRvclN0cmVhbSwgc3ViLm5ld0NoaWxkKDEwMCkpOwotCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgTG9jYWxNZXRhZGF0YVJlcG9zaXRvcnkpCi0JCQkJCQkoKExvY2FsTWV0YWRhdGFSZXBvc2l0b3J5KSByZXN1bHQpLmluaXRpYWxpemVBZnRlckxvYWQobG9jYXRpb24pOwotCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgVVJMTWV0YWRhdGFSZXBvc2l0b3J5KQotCQkJCQkJKChVUkxNZXRhZGF0YVJlcG9zaXRvcnkpIHJlc3VsdCkuaW5pdGlhbGl6ZUFmdGVyTG9hZChsb2NhdGlvbik7Ci0JCQkJCWlmIChUcmFjaW5nLkRFQlVHX01FVEFEQVRBX1BBUlNJTkcpIHsKLQkJCQkJCXRpbWUgKz0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCQlUcmFjaW5nLmRlYnVnKGRlYnVnTXNnICsgInRpbWUgKG1zKTogIiArIHRpbWUpOyAvLyROT04tTkxTLTEkIAotCQkJCQl9Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlzYWZlQ2xvc2UoamFyU3RyZWFtKTsKLQkJCQlzYWZlQ2xvc2UoaW5TdHJlYW0pOwotCQkJfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLmlvX2ZhaWxlZFJlYWQsIGxvY2F0aW9uKTsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgbXNnLCBlKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5pb19mYWlsZWRSZWFkLCBsb2NhdGlvbik7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfUkVBRCwgbXNnLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9uaXRvciAhPSBudWxsKQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENsb3NlcyBhIHN0cmVhbSwgaWdub3JpbmcgYW55IHNlY29uZGFyeSBleGNlcHRpb25zCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNhZmVDbG9zZShJbnB1dFN0cmVhbSBzdHJlYW0pIHsKLQkJaWYgKHN0cmVhbSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vaWdub3JlCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2RlYjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjElRm91bmRhdGlvbi0xLjEiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmYwN2Y4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGE8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNWI2M2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDM0NyArMCwwIEBACi0jTW9uIE5vdiAwNSAxNzowMToyMSBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZWNyZWF0ZU1vZGlmaWVkQ2xhc3NGaWxlSW5PdXRwdXRGb2xkZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdEZXNjcmlwdGlvbj1yZXR1cm5fdGFnCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGQ3ZmE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI01vbiBOb3YgMDUgMTc6MDE6MjEgRVNUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+PHRlbXBsYXRlcy8+Ci1zcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLXNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTNkMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE1MTUwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGE7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGE7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGE7Ci0gIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcCwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24sCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aSwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbiwKLSAgIG9yZy5lY2xpcHNlLnBkZS5wMi51aSIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeTsKLSAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbiwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucywKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbiwKLSAgIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwLAotICAgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGssCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUsCi0gICBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUiCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuTWV0YWRhdGFBY3RpdmF0b3IKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMSwKLSBKMlNFLTEuNAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmI4MzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVkZWU3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggUHJvdmlzaW9uaW5nIE1ldGFkYXRhCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL0FydGlmYWN0S2V5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvQXJ0aWZhY3RLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIwMThiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvQXJ0aWZhY3RLZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKiogCi0gKiBUaGUgY29uY3JldGUgdHlwZSBmb3IgcmVwcmVzZW50aW5nIElBcnRpZmFjdEtleSdzLgotICogPHA+Ci0gKiBTZWUge2xpbmsgSUFydGlmYWN0IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsaWZlY3ljbGUgb2YgYXJ0aWZhY3Qga2V5cykgCi0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEtleSBpbXBsZW1lbnRzIElBcnRpZmFjdEtleSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUEFSQVRPUiA9ICIsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xhc3NpZmllcjsKLQlwcml2YXRlIGZpbmFsIFZlcnNpb24gdmVyc2lvbjsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldEFycmF5RnJvbUxpc3QoU3RyaW5nIHN0cmluZ0xpc3QsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQkJaWYgKHN0cmluZ0xpc3QgPT0gbnVsbCB8fCBzdHJpbmdMaXN0LnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlib29sZWFuIHNlcGFyYXRvclNlZW4gPSB0cnVlOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihzdHJpbmdMaXN0LCBzZXBhcmF0b3IsIHRydWUpOwotCQl3aGlsZSAodG9rZW5zLmhhc01vcmVUb2tlbnMoKSkgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWlmICh0b2tlbi5lcXVhbHMoc2VwYXJhdG9yKSkgewotCQkJCWlmIChzZXBhcmF0b3JTZWVuKQotCQkJCQlsaXN0LmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzZXBhcmF0b3JTZWVuID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJc2VwYXJhdG9yU2VlbiA9IGZhbHNlOwotCQkJCWlmICh0b2tlbi5sZW5ndGgoKSAhPSAwKQotCQkJCQlsaXN0LmFkZCh0b2tlbik7Ci0JCQl9Ci0JCX0KLQkJaWYgKHNlcGFyYXRvclNlZW4pCi0JCQlsaXN0LmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIChTdHJpbmdbXSkgbGlzdC50b0FycmF5KG5ldyBTdHJpbmdbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElBcnRpZmFjdEtleSBwYXJzZShTdHJpbmcgc3BlY2lmaWNhdGlvbikgewotCQlTdHJpbmdbXSBwYXJ0cyA9IGdldEFycmF5RnJvbUxpc3Qoc3BlY2lmaWNhdGlvbiwgU0VQQVJBVE9SKTsKLQkJaWYgKHBhcnRzLmxlbmd0aCA8IDIgfHwgcGFydHMubGVuZ3RoID4gMykKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHBhcnRzIGluIGFydGlmYWN0IGtleTogIiArIHNwZWNpZmljYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCVZlcnNpb24gdmVyc2lvbiA9IFZlcnNpb24uZW1wdHlWZXJzaW9uOwotCQlpZiAocGFydHMubGVuZ3RoID09IDMgJiYgcGFydHNbMl0udHJpbSgpLmxlbmd0aCgpID4gMCkKLQkJCXZlcnNpb24gPSBWZXJzaW9uLnBhcnNlVmVyc2lvbihwYXJ0c1syXSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IEFydGlmYWN0S2V5KHBhcnRzWzBdLCBwYXJ0c1sxXSwgdmVyc2lvbik7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJXcm9uZyB2ZXJzaW9uIHN5bnRheCBpbiBhcnRpZmFjdCBrZXk6ICIgKyBzcGVjaWZpY2F0aW9uKS5pbml0Q2F1c2UoZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBBcnRpZmFjdEtleShTdHJpbmcgY2xhc3NpZmllciwgU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJc3VwZXIoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChjbGFzc2lmaWVyKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCk7Ci0JCUFzc2VydC5pc05vdE51bGwodmVyc2lvbik7Ci0JCWlmIChjbGFzc2lmaWVyLmluZGV4T2YoU0VQQVJBVE9SKSAhPSAtMSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hIG5vdCBhbGxvd2VkIGluIGNsYXNzaWZpZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaWQuaW5kZXhPZihTRVBBUkFUT1IpICE9IC0xKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWEgbm90IGFsbG93ZWQgaW4gaWQiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmNsYXNzaWZpZXIgPSBjbGFzc2lmaWVyOwotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDbGFzc2lmaWVyKCkgewotCQlyZXR1cm4gY2xhc3NpZmllcjsKLQl9Ci0KLQlwdWJsaWMgVmVyc2lvbiBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlpbnQgaGFzaCA9IGlkLmhhc2hDb2RlKCk7Ci0JCWhhc2ggPSAxNyAqIGhhc2ggKyBnZXRWZXJzaW9uKCkuaGFzaENvZGUoKTsKLQkJaGFzaCA9IDE3ICogaGFzaCArIGNsYXNzaWZpZXIuaGFzaENvZGUoKTsKLQkJcmV0dXJuIGhhc2g7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGlkICsgJy8nICsgY2xhc3NpZmllciArICcvJyArIGdldFZlcnNpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJQXJ0aWZhY3RLZXkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJQXJ0aWZhY3RLZXkgYWsgPSAoSUFydGlmYWN0S2V5KSBvYmo7Ci0JCXJldHVybiBhay5nZXRJZCgpLmVxdWFscyhpZCkgJiYgYWsuZ2V0VmVyc2lvbigpLmVxdWFscyhnZXRWZXJzaW9uKCkpICYmIGFrLmdldENsYXNzaWZpZXIoKS5lcXVhbHMoY2xhc3NpZmllcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9FeHRlcm5hbEZvcm0oKSB7Ci0JCVN0cmluZ0J1ZmZlciBkYXRhID0gbmV3IFN0cmluZ0J1ZmZlcihjbGFzc2lmaWVyKS5hcHBlbmQoU0VQQVJBVE9SKTsKLQkJZGF0YS5hcHBlbmQoaWQpLmFwcGVuZChTRVBBUkFUT1IpOwotCQlkYXRhLmFwcGVuZCh2ZXJzaW9uLnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gZGF0YS50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL0luc3RhbGxhYmxlVW5pdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL0luc3RhbGxhYmxlVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDNmY2M2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9JbnN0YWxsYWJsZVVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgR2VudWl0ZWMsIExMQyAtIGFkZGVkIGxpY2Vuc2Ugc3VwcG9ydAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuT3JkZXJlZFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbGFibGVVbml0IGltcGxlbWVudHMgSUluc3RhbGxhYmxlVW5pdCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBPcmRlcmVkUHJvcGVydGllcyBOT19QUk9QRVJUSUVTID0gbmV3IE9yZGVyZWRQcm9wZXJ0aWVzKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvdmlkZWRDYXBhYmlsaXR5W10gTk9fUFJPVklERVMgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5WzBdOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIE5PX1JFUVVJUkVTID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVswXTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUb3VjaHBvaW50RGF0YVtdIE5PX1RPVUNIUE9JTlRfREFUQSA9IG5ldyBUb3VjaHBvaW50RGF0YVswXTsKLQotCVN0cmluZyBhcHBsaWNhYmlsaXR5RmlsdGVyOwotCXByaXZhdGUgSUFydGlmYWN0S2V5W10gYXJ0aWZhY3RzOwotCXByaXZhdGUgU3RyaW5nIGZpbHRlcjsKLQotCXByaXZhdGUgU3RyaW5nIGlkOwotCi0JcHJpdmF0ZSBPcmRlcmVkUHJvcGVydGllcyBwcm9wZXJ0aWVzOwotCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3ZpZGVkQ2FwYWJpbGl0aWVzID0gTk9fUFJPVklERVM7Ci0JcHJpdmF0ZSBSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlczsKLQotCXByaXZhdGUgYm9vbGVhbiBzaW5nbGV0b247Ci0KLQlwcml2YXRlIEFycmF5TGlzdCB0b3VjaHBvaW50RGF0YSA9IG51bGw7Ci0KLQlwcml2YXRlIFRvdWNocG9pbnRUeXBlIHRvdWNocG9pbnRUeXBlOwotCi0JcHJpdmF0ZSBWZXJzaW9uIHZlcnNpb247Ci0KLQlwcml2YXRlIElVcGRhdGVEZXNjcmlwdG9yIHVwZGF0ZUluZm87Ci0JcHJpdmF0ZSBMaWNlbnNlIGxpY2Vuc2U7Ci0JcHJpdmF0ZSBDb3B5cmlnaHQgY29weXJpZ2h0OwotCi0JcHVibGljIEluc3RhbGxhYmxlVW5pdCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0aWVzKE1hcCBuZXdQcm9wZXJ0aWVzKSB7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCQlwcm9wZXJ0aWVzID0gbmV3IE9yZGVyZWRQcm9wZXJ0aWVzKG5ld1Byb3BlcnRpZXMuc2l6ZSgpKTsKLQkJcHJvcGVydGllcy5wdXRBbGwobmV3UHJvcGVydGllcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvdmlkZWRDYXBhYmlsaXR5KFByb3ZpZGVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5KSB7Ci0JCWlmIChwcm92aWRlZENhcGFiaWxpdGllcyAhPSBudWxsICYmIHByb3ZpZGVkQ2FwYWJpbGl0aWVzLmxlbmd0aCA+IDApIHsKLQkJCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHJlc3VsdCA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbcHJvdmlkZWRDYXBhYmlsaXRpZXMubGVuZ3RoICsgMV07Ci0JCQlyZXN1bHRbMF0gPSBjYXBhYmlsaXR5OwotCQkJU3lzdGVtLmFycmF5Y29weShwcm92aWRlZENhcGFiaWxpdGllcywgMCwgcmVzdWx0LCAxLCBwcm92aWRlZENhcGFiaWxpdGllcy5sZW5ndGgpOwotCQkJcHJvdmlkZWRDYXBhYmlsaXRpZXMgPSByZXN1bHQ7Ci0JCX0gZWxzZSB7Ci0JCQlwcm92aWRlZENhcGFiaWxpdGllcyA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7Y2FwYWJpbGl0eX07Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRUb3VjaHBvaW50RGF0YShUb3VjaHBvaW50RGF0YSBuZXdEYXRhKSB7Ci0JCWVuc3VyZVRvdWNocG9pbnREYXRhQ2FwYWNpdHkoMSk7Ci0JCXRvdWNocG9pbnREYXRhLmFkZChuZXdEYXRhKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgdG9Db21wYXJlVG8pIHsKLQkJaWYgKCEodG9Db21wYXJlVG8gaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVVbml0KSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUlJbnN0YWxsYWJsZVVuaXQgb3RoZXIgPSAoSUluc3RhbGxhYmxlVW5pdCkgdG9Db21wYXJlVG87Ci0JCWlmIChnZXRJZCgpLmNvbXBhcmVUbyhvdGhlci5nZXRJZCgpKSA9PSAwKQotCQkJcmV0dXJuIChnZXRWZXJzaW9uKCkuY29tcGFyZVRvKG90aGVyLmdldFZlcnNpb24oKSkpOwotCQlyZXR1cm4gZ2V0SWQoKS5jb21wYXJlVG8ob3RoZXIuZ2V0SWQoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZVRvdWNocG9pbnREYXRhQ2FwYWNpdHkoaW50IHNpemUpIHsKLQkJaWYgKHRvdWNocG9pbnREYXRhICE9IG51bGwpIHsKLQkJCXRvdWNocG9pbnREYXRhLmVuc3VyZUNhcGFjaXR5KHNpemUpOwotCQl9IGVsc2UgewotCQkJdG91Y2hwb2ludERhdGEgPSBuZXcgQXJyYXlMaXN0KHNpemUpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSUluc3RhbGxhYmxlVW5pdCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZpbmFsIElJbnN0YWxsYWJsZVVuaXQgb3RoZXIgPSAoSUluc3RhbGxhYmxlVW5pdCkgb2JqOwotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLmdldElkKCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIWlkLmVxdWFscyhvdGhlci5nZXRJZCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGdldFZlcnNpb24oKSA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIuZ2V0VmVyc2lvbigpICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFnZXRWZXJzaW9uKCkuZXF1YWxzKG90aGVyLmdldFZlcnNpb24oKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYWJpbGl0eUZpbHRlcigpIHsKLQkJcmV0dXJuIGFwcGxpY2FiaWxpdHlGaWx0ZXI7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdEtleVtdIGdldEFydGlmYWN0cygpIHsKLQkJcmV0dXJuIGFydGlmYWN0czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50W10gZ2V0RnJhZ21lbnRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFuIDxpPnVubW9kaWZpYWJsZSBjb3B5PC9pPiBvZiB0aGUgcHJvcGVydGllcwotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGFsbGFibGUgdW5pdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIDxpPnVubW9kaWZpYWJsZSBjb3B5PC9pPiBvZiB0aGUgSVUgcHJvcGVydGllcy4KLQkgKi8KLQlwdWJsaWMgTWFwIGdldFByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBPcmRlcmVkUHJvcGVydGllcy51bm1vZGlmaWFibGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBwcm9wZXJ0aWVzKCkuZ2V0UHJvcGVydHkoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgUHJvdmlkZWRDYXBhYmlsaXR5W10gZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKSB7Ci0JCXJldHVybiAocHJvdmlkZWRDYXBhYmlsaXRpZXMgIT0gbnVsbCA/IHByb3ZpZGVkQ2FwYWJpbGl0aWVzIDogTk9fUFJPVklERVMpOwotCX0KLQotCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHlbXSBnZXRSZXF1aXJlZENhcGFiaWxpdGllcygpIHsKLQkJcmV0dXJuIHJlcXVpcmVzICE9IG51bGwgPyByZXF1aXJlcyA6IE5PX1JFUVVJUkVTOwotCi0JfQotCi0JcHVibGljIFRvdWNocG9pbnREYXRhW10gZ2V0VG91Y2hwb2ludERhdGEoKSB7Ci0JCXJldHVybiAodG91Y2hwb2ludERhdGEgPT0gbnVsbCA/IE5PX1RPVUNIUE9JTlRfREFUQSAvLwotCQkJCTogKFRvdWNocG9pbnREYXRhW10pIHRvdWNocG9pbnREYXRhLnRvQXJyYXkobmV3IFRvdWNocG9pbnREYXRhW3RvdWNocG9pbnREYXRhLnNpemUoKV0pKTsKLQl9Ci0KLQlwdWJsaWMgVG91Y2hwb2ludFR5cGUgZ2V0VG91Y2hwb2ludFR5cGUoKSB7Ci0JCXJldHVybiB0b3VjaHBvaW50VHlwZSAhPSBudWxsID8gdG91Y2hwb2ludFR5cGUgOiBUb3VjaHBvaW50VHlwZS5OT05FOwotCX0KLQotCXB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWZpbmFsIGludCBwcmltZSA9IDMxOwotCQlpbnQgcmVzdWx0ID0gMTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGlkID09IG51bGwpID8gMCA6IGlkLmhhc2hDb2RlKCkpOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoZ2V0VmVyc2lvbigpID09IG51bGwpID8gMCA6IGdldFZlcnNpb24oKS5oYXNoQ29kZSgpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZyYWdtZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xldG9uKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCXByaXZhdGUgT3JkZXJlZFByb3BlcnRpZXMgcHJvcGVydGllcygpIHsKLQkJcmV0dXJuIChwcm9wZXJ0aWVzICE9IG51bGwgPyBwcm9wZXJ0aWVzIDogTk9fUFJPUEVSVElFUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXBwbGljYWJpbGl0eUZpbHRlcihTdHJpbmcgbGRhcEZpbHRlcikgewotCQlhcHBsaWNhYmlsaXR5RmlsdGVyID0gbGRhcEZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdHMoSUFydGlmYWN0S2V5W10gdmFsdWUpIHsKLQkJYXJ0aWZhY3RzID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FwYWJpbGl0aWVzKFByb3ZpZGVkQ2FwYWJpbGl0eVtdIGV4cG9ydGVkQ2FwYWJpbGl0aWVzKSB7Ci0JCXByb3ZpZGVkQ2FwYWJpbGl0aWVzID0gZXhwb3J0ZWRDYXBhYmlsaXRpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQkvLyBUT0RPOiByZXNvbHZlIHRoZSBzY2hpem9waHJlbmlhIGJldHdlZW4gdGhlIHNpbmdsZXRvbiBpbW11dGFibGUgZGF0YQotCS8vCSAgIAkgYW5kIHRoZSBwdWJsaWMgcmV0dXJuZWQgdG91Y2hwb2ludCBkYXRhIGFycmF5LgotCXB1YmxpYyB2b2lkIHNldEltbXV0YWJsZVRvdWNocG9pbnREYXRhKFRvdWNocG9pbnREYXRhIGltbXV0YWJsZURhdGEpIHsKLQkJZW5zdXJlVG91Y2hwb2ludERhdGFDYXBhY2l0eSg0KTsKLQkJdG91Y2hwb2ludERhdGEuYWRkKGltbXV0YWJsZURhdGEpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgc2V0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIChwcm9wZXJ0aWVzICE9IG51bGwgPyAoU3RyaW5nKSBwcm9wZXJ0aWVzLnJlbW92ZShrZXkpIDogbnVsbCk7Ci0JCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCQlwcm9wZXJ0aWVzID0gbmV3IE9yZGVyZWRQcm9wZXJ0aWVzKCk7Ci0JCXJldHVybiAoU3RyaW5nKSBwcm9wZXJ0aWVzLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGNhcGFiaWxpdGllcykgewotCQlpZiAoY2FwYWJpbGl0aWVzID09IE5PX1JFUVVJUkVTKSB7Ci0JCQl0aGlzLnJlcXVpcmVzID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCS8vY29weSBhcnJheSBmb3Igc2FmZXR5Ci0JCQl0aGlzLnJlcXVpcmVzID0gKFJlcXVpcmVkQ2FwYWJpbGl0eVtdKSBjYXBhYmlsaXRpZXMuY2xvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNpbmdsZXRvbihib29sZWFuIHNpbmdsZXRvbikgewotCQl0aGlzLnNpbmdsZXRvbiA9IHNpbmdsZXRvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUb3VjaHBvaW50VHlwZShUb3VjaHBvaW50VHlwZSB0eXBlKSB7Ci0JCXRoaXMudG91Y2hwb2ludFR5cGUgPSAodHlwZSAhPSBUb3VjaHBvaW50VHlwZS5OT05FID8gdHlwZSA6IG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oVmVyc2lvbiBuZXdWZXJzaW9uKSB7Ci0JCXRoaXMudmVyc2lvbiA9IChuZXdWZXJzaW9uICE9IG51bGwgPyBuZXdWZXJzaW9uIDogVmVyc2lvbi5lbXB0eVZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBpZCArICcgJyArIGdldFZlcnNpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdCB1bnJlc29sdmVkKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQlwdWJsaWMgSVVwZGF0ZURlc2NyaXB0b3IgZ2V0VXBkYXRlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIHVwZGF0ZUluZm87Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlRGVzY3JpcHRvcihJVXBkYXRlRGVzY3JpcHRvciB1cGRhdGVJbmZvKSB7Ci0JCXRoaXMudXBkYXRlSW5mbyA9IHVwZGF0ZUluZm87Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGljZW5zZShMaWNlbnNlIGxpY2Vuc2UpIHsKLQkJdGhpcy5saWNlbnNlID0gbGljZW5zZTsKLQl9Ci0KLQlwdWJsaWMgTGljZW5zZSBnZXRMaWNlbnNlKCkgewotCQlyZXR1cm4gbGljZW5zZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb3B5cmlnaHQoQ29weXJpZ2h0IGNvcHlyaWdodCkgewotCQl0aGlzLmNvcHlyaWdodCA9IGNvcHlyaWdodDsKLQl9Ci0KLQlwdWJsaWMgQ29weXJpZ2h0IGdldENvcHlyaWdodCgpIHsKLQkJcmV0dXJuIGNvcHlyaWdodDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvSW5zdGFsbGFibGVVbml0RnJhZ21lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9JbnN0YWxsYWJsZVVuaXRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzhiNzI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9JbnN0YWxsYWJsZVVuaXRGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXRGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLlJlcXVpcmVkQ2FwYWJpbGl0eTsKLQotcHVibGljIGNsYXNzIEluc3RhbGxhYmxlVW5pdEZyYWdtZW50IGV4dGVuZHMgSW5zdGFsbGFibGVVbml0IGltcGxlbWVudHMgSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50IHsKLQotCXByaXZhdGUgUmVxdWlyZWRDYXBhYmlsaXR5W10gaG9zdFJlcXVpcmVtZW50czsKLQotCXB1YmxpYyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIb3N0KFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGhvc3RSZXF1aXJlbWVudHMpIHsKLQkJaWYgKGhvc3RSZXF1aXJlbWVudHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy5ob3N0UmVxdWlyZW1lbnRzID0gaG9zdFJlcXVpcmVtZW50czsKLQkJYWRkUmVxdWlyZWRDYXBhYmlsaXR5KGhvc3RSZXF1aXJlbWVudHMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRSZXF1aXJlZENhcGFiaWxpdHkoUmVxdWlyZWRDYXBhYmlsaXR5W10gdG9BZGQpIHsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gY3VycmVudCA9IHN1cGVyLmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlc3VsdCA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbY3VycmVudC5sZW5ndGggKyB0b0FkZC5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnQsIDAsIHJlc3VsdCwgMCwgY3VycmVudC5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRvQWRkLCAwLCByZXN1bHQsIGN1cnJlbnQubGVuZ3RoLCB0b0FkZC5sZW5ndGgpOwotCQlzZXRSZXF1aXJlZENhcGFiaWxpdGllcyhyZXN1bHQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRnJhZ21lbnQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHlbXSBnZXRIb3N0KCkgewotCQlyZXR1cm4gaG9zdFJlcXVpcmVtZW50czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmRiNTYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUgYW5kIGFzc2lnbiB0byBmaWVsZHMgYmVsb3cKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL01ldGFkYXRhQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvTWV0YWRhdGFBY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhMDNlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvTWV0YWRhdGFBY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIE1ldGFkYXRhQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9NRVRBREFUQSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlNZXRhZGF0YUFjdGl2YXRvci5jb250ZXh0ID0gYUNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGFDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJTWV0YWRhdGFBY3RpdmF0b3IuY29udGV4dCA9IG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvUmVzb2x2ZWRJbnN0YWxsYWJsZVVuaXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9SZXNvbHZlZEluc3RhbGxhYmxlVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjFjZWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9SZXNvbHZlZEluc3RhbGxhYmxlVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAJCUlCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCQlHZW51aXRlYywgTExDIC0gYWRkZWQgbGljZW5zZSBzdXBwb3J0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFJlc29sdmVkSW5zdGFsbGFibGVVbml0IGltcGxlbWVudHMgSUluc3RhbGxhYmxlVW5pdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdFtdIE5PX0lVID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbMF07Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXRbXSBmcmFnbWVudHMgPSBOT19JVTsKLQlwcm90ZWN0ZWQgSUluc3RhbGxhYmxlVW5pdCBvcmlnaW5hbDsKLQotCXB1YmxpYyBSZXNvbHZlZEluc3RhbGxhYmxlVW5pdChJSW5zdGFsbGFibGVVbml0IHJlc29sdmVkKSB7Ci0JCXRoaXMub3JpZ2luYWwgPSByZXNvbHZlZDsKLQl9Ci0KLQlwdWJsaWMgUmVzb2x2ZWRJbnN0YWxsYWJsZVVuaXQoSUluc3RhbGxhYmxlVW5pdCByZXNvbHZlZCwgSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50W10gZnJhZ21lbnRzKSB7Ci0JCXRoaXMub3JpZ2luYWwgPSByZXNvbHZlZDsKLQkJdGhpcy5mcmFnbWVudHMgPSBmcmFnbWVudHM7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFtdIGdldEZyYWdtZW50cygpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGZyYWdtZW50cyAhPSBudWxsKQotCQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGZyYWdtZW50cykpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5zaXplKCk7IGkrKykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBmcmFnbWVudCA9IChJSW5zdGFsbGFibGVVbml0KSByZXN1bHQuZ2V0KGkpOwotCQkJaWYgKGZyYWdtZW50LmlzUmVzb2x2ZWQoKSkKLQkJCQlyZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoZnJhZ21lbnQuZ2V0RnJhZ21lbnRzKCkpKTsKLQkJfQotCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFtdKSByZXN1bHQudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0S2V5W10gZ2V0QXJ0aWZhY3RzKCkgewotCQlyZXR1cm4gb3JpZ2luYWwuZ2V0QXJ0aWZhY3RzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWx0ZXIoKSB7Ci0JCXJldHVybiBvcmlnaW5hbC5nZXRGaWx0ZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gb3JpZ2luYWwuZ2V0SWQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHsKLQkJcmV0dXJuIG9yaWdpbmFsLmdldFByb3BlcnR5KGtleSk7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gb3JpZ2luYWwuZ2V0UHJvcGVydGllcygpOwotCX0KLQotCXB1YmxpYyBQcm92aWRlZENhcGFiaWxpdHlbXSBnZXRQcm92aWRlZENhcGFiaWxpdGllcygpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KG9yaWdpbmFsLmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCkpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChmcmFnbWVudHNbaV0uZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKSkpOwotCQl9Ci0JCXJldHVybiBvcmlnaW5hbC5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpOwotCX0KLQotCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHlbXSBnZXRSZXF1aXJlZENhcGFiaWxpdGllcygpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KG9yaWdpbmFsLmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCkpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChmcmFnbWVudHNbaV0uZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSkpOwotCQl9Ci0JCXJldHVybiAoUmVxdWlyZWRDYXBhYmlsaXR5W10pIHJlc3VsdC50b0FycmF5KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbcmVzdWx0LnNpemUoKV0pOwotCi0JfQotCi0JcHVibGljIFRvdWNocG9pbnREYXRhW10gZ2V0VG91Y2hwb2ludERhdGEoKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChvcmlnaW5hbC5nZXRUb3VjaHBvaW50RGF0YSgpKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUb3VjaHBvaW50RGF0YVtdIGRhdGEgPSBmcmFnbWVudHNbaV0uZ2V0VG91Y2hwb2ludERhdGEoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGF0YS5sZW5ndGg7IGorKykgewotCQkJCXJlc3VsdC5hZGQoZGF0YVtqXSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChUb3VjaHBvaW50RGF0YVtdKSByZXN1bHQudG9BcnJheShuZXcgVG91Y2hwb2ludERhdGFbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBUb3VjaHBvaW50VHlwZSBnZXRUb3VjaHBvaW50VHlwZSgpIHsKLQkJcmV0dXJuIG9yaWdpbmFsLmdldFRvdWNocG9pbnRUeXBlKCk7Ci0JfQotCi0JcHVibGljIFZlcnNpb24gZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIG9yaWdpbmFsLmdldFZlcnNpb24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZyYWdtZW50KCkgewotCQlyZXR1cm4gb3JpZ2luYWwuaXNGcmFnbWVudCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xldG9uKCkgewotCQlyZXR1cm4gb3JpZ2luYWwuaXNTaW5nbGV0b24oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkvL1RPRE8gVGhpcyBpcyBwcmV0dHkgdWdseS4uLi4KLQkJYm9vbGVhbiByZXN1bHQgPSBvcmlnaW5hbC5lcXVhbHMob2JqKTsKLQkJaWYgKHJlc3VsdCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqIGluc3RhbmNlb2YgUmVzb2x2ZWRJbnN0YWxsYWJsZVVuaXQpCi0JCQlyZXR1cm4gb3JpZ2luYWwuZXF1YWxzKCgoUmVzb2x2ZWRJbnN0YWxsYWJsZVVuaXQpIG9iaikub3JpZ2luYWwpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gb3JpZ2luYWwuaGFzaENvZGUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIltSXSIgKyBvcmlnaW5hbC50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXQgZ2V0T3JpZ2luYWwoKSB7Ci0JCXJldHVybiBvcmlnaW5hbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgdG9Db21wYXJlVG8pIHsKLQkJaWYgKCEodG9Db21wYXJlVG8gaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVVbml0KSkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUlJbnN0YWxsYWJsZVVuaXQgb3RoZXIgPSAoSUluc3RhbGxhYmxlVW5pdCkgdG9Db21wYXJlVG87Ci0JCWlmIChnZXRJZCgpLmNvbXBhcmVUbyhvdGhlci5nZXRJZCgpKSA9PSAwKQotCQkJcmV0dXJuIChnZXRWZXJzaW9uKCkuY29tcGFyZVRvKG90aGVyLmdldFZlcnNpb24oKSkpOwotCQlyZXR1cm4gZ2V0SWQoKS5jb21wYXJlVG8ob3RoZXIuZ2V0SWQoKSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXNvbHZlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXQgdW5yZXNvbHZlZCgpIHsKLQkJcmV0dXJuIG9yaWdpbmFsLnVucmVzb2x2ZWQoKTsKLQl9Ci0KLQlwdWJsaWMgSVVwZGF0ZURlc2NyaXB0b3IgZ2V0VXBkYXRlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG9yaWdpbmFsLmdldFVwZGF0ZURlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgTGljZW5zZSBnZXRMaWNlbnNlKCkgewotCQlyZXR1cm4gb3JpZ2luYWwuZ2V0TGljZW5zZSgpOwotCX0KLQotCXB1YmxpYyBDb3B5cmlnaHQgZ2V0Q29weXJpZ2h0KCkgewotCQlyZXR1cm4gb3JpZ2luYWwuZ2V0Q29weXJpZ2h0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvVXBkYXRlRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL1VwZGF0ZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3OTIxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvVXBkYXRlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JVXBkYXRlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlRGVzY3JpcHRvciBpbXBsZW1lbnRzIElVcGRhdGVEZXNjcmlwdG9yIHsKLQlwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFZlcnNpb25SYW5nZSByYW5nZTsKLQlwcml2YXRlIGludCBzZXZlcml0eTsKLQotCXB1YmxpYyBVcGRhdGVEZXNjcmlwdG9yKFN0cmluZyBpZCwgVmVyc2lvblJhbmdlIHJhbmdlLCBpbnQgc2V2ZXJpdHksIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMucmFuZ2UgPSByYW5nZTsKLQkJdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgVmVyc2lvblJhbmdlIGdldFJhbmdlKCkgewotCQlyZXR1cm4gcmFuZ2U7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIHNldmVyaXR5OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVXBkYXRlT2YoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlpZiAoIWlkLmVxdWFscyhpdS5nZXRJZCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHJhbmdlLmlzSW5jbHVkZWQoaXUuZ2V0VmVyc2lvbigpKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUwMDlhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9Db3B5cmlnaHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9Db3B5cmlnaHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRkMTU0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvQ29weXJpZ2h0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogVGhlIDxjb2RlPkNvcHlyaWdodDwvY29kZT4gY2xhc3MgcmVwcmVzZW50cyBhIHNvZnR3YXJlIGNvcHlyaWdodC4gIEEgY29weXJpZ2h0IGhhcyAKLSAqIHJlcXVpcmVkIGJvZHkgdGV4dCB3aGljaCBtYXkgYmUgdGhlIGZ1bGwgdGV4dCBvciBhbiBhbm5vdGF0aW9uLiAgQW4gb3B0aW9uYWwgVVJMIGZpZWxkIGNhbiBiZSBzcGVjaWZpZWQKLSAqIHdoaWNoIGxpbmtzIHRvIGZ1bGwgdGV4dC4gIAotICovCi1wdWJsaWMgY2xhc3MgQ29weXJpZ2h0IHsKLQkvKioKLQkgKiBUaGUgPGNvZGU+Ym9keTwvY29kZT4gY29udGFpbnMgdGhlIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBjb3lwcmlnaHQuIFRoaXMgbWF5Ci0JICogYmUgYSBzdW1tYXJ5IGZvciBhIGNvcHlyaWdodCBzcGVjaWZpZWQgaW4gYSBVUkwuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYm9keTsKLQotCS8qKgotCSAqIFRoZSA8Y29kZT51cmw8L2NvZGU+IGlzIHRoZSBVUkwgb2YgdGhlIGNvcHlyaWdodC4KLQkgKi8KLQlwcml2YXRlIFVSTCB1cmw7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGNvcHlyaWdodC4KLQkgKiBUaGUgYm9keSBzaG91bGQgY29udGFpbiB0aGUgZnVsbCB0ZXh0IG9mIHRoZSBjb3B5cmlnaHQuCi0JICogQHBhcmFtIHVybFN0cmluZyB0aGUgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIFVSTCBvZiB0aGUgZnVsbCBjb3B5cmlnaHQgdGV4dCwgbWF5IGJlIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogQHBhcmFtIGJvZHkgdGhlIGNvcHlyaWdodCBib2R5LCBjYW5ub3QgYmUgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHRoZSA8Y29kZT5ib2R5PC9jb2RlPiBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb3B5cmlnaHQoU3RyaW5nIHVybFN0cmluZywgU3RyaW5nIGJvZHkpIHsKLQkJaWYgKGJvZHkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJvZHkgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsU3RyaW5nICE9IG51bGwpCi0JCQl0cnkgewotCQkJCXVybCA9IG5ldyBVUkwodXJsU3RyaW5nKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdXJsID0gbnVsbDsKLQkJCX0KLQkJdGhpcy5ib2R5ID0gYm9keTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgY29udGFpbmluZyB0aGUgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGljZW5zZS4KLQkgKiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGljZW5zZSBib2R5LgotCSAqIEByZXR1cm4gdGhlIGxpY2Vuc2UgYm9keSwgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvZHkoKSB7Ci0JCXJldHVybiBib2R5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9JQXJ0aWZhY3RLZXkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9JQXJ0aWZhY3RLZXkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZhYzcxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvSUFydGlmYWN0S2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFByb3ZpZGUgc3RhbmRhcmRpemVkIGFydGlmYWN0IGluZm9ybWF0aW9uIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSAKLSAqIGNvcnJlc3BvbmRpbmcgYnl0ZXMgKHBlcmhhcHMgbm90IHN0b3JlZCBhcyBhIGZpbGUpLiAKLSAqIDxwPgotICogQXJ0aWZhY3Qga2V5cyByZXByZXNlbnQgYm90aCBhIHVuaXF1ZSBvcGFxdWUgaWRlbnRpZmllciBhcyB3ZWxsIGFzIHN0cnVjdHVyZWQgCi0gKiBhbmQgc3RhbmRhcmRpemVkIHBpZWNlcyBvZiBpbmZvcm1hdGlvbi4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElBcnRpZmFjdEtleSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjbGFzc2lmaWVyIGZvciB0aGlzIGFydGlmYWN0IGtleS4gVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBlbXB0eS4KLQkgKiBAcmV0dXJuIHRoZSBjbGFzc2lmaWVyIHNlZ21lbnQgb2YgdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzaWZpZXIoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGlkIGZvciB0aGlzIGFydGlmYWN0IGtleS4gVGhlIHJldHVybmVkIHZhbHVlIGNhbiBiZSBlbXB0eS4KLQkgKiBAcmV0dXJuIHRoZSBjbGFzc2lmaWVyIHNlZ21lbnQgb2YgdGhlIGtleS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2ZXJzaW9uIGZvciB0aGlzIGFydGlmYWN0IGtleS4gCi0JICogQHJldHVybiB0aGUgdmVyc2lvbiBzZWdtZW50IG9mIHRoZSBrZXkuCi0JICovCi0JcHVibGljIFZlcnNpb24gZ2V0VmVyc2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2Fub25pY2FsIHN0cmluZyBmb3JtIG9mIHRoaXMgYXJ0aWZhY3Qga2V5LgotCSAqIEByZXR1cm4gdGhlIGNhbm9uaWNhbCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMga2V5Ci0JICovCi0JcHVibGljIFN0cmluZyB0b0V4dGVybmFsRm9ybSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDM5NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogCQlJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAkJR2VudWl0ZWMsIExMQyAtIGFkZGVkIGxpY2Vuc2Ugc3VwcG9ydAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUluc3RhbGxhYmxlVW5pdCBleHRlbmRzIENvbXBhcmFibGUgewotCi0JLyoqCi0JICogQSBjYXBhYmlsaXR5IG5hbWVzcGFjZSByZXByZXNlbnRpbmcgYSBwYXJ0aWN1bGFyIHByb2ZpbGUgZmxhdm9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9GTEFWT1IgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5mbGF2b3IiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIGNhcGFiaWxpdHkgbmFtZXNwYWNlIHJlcHJlc2VudGluZyBhIHBhcnRpY3VsYXIgSW5zdGFsbGFibGVVbml0IGJ5IGlkLgotCSAqIEVhY2ggSW5zdGFsbGFibGVVbml0IGF1dG9tYXRpY2FsbHkgcHJvdmlkZXMgYSBjYXBhYmlsaXR5IGluIHRoaXMgbmFtZXNwYWNlIHJlcHJlc2VudGluZwotCSAqIGl0c2VsZiwgYW5kIG90aGVyIEluc3RhbGxhYmxlVW5pdHMgY2FuIHJlcXVpcmUgc3VjaCBhIGNhcGFiaWxpdHkgdG8gc3RhdGUgdGhhdCB0aGV5Ci0JICogcmVxdWlyZSBhIHBhcnRpY3VsYXIgSW5zdGFsbGFibGVVbml0IHRvIGJlIHByZXNlbnQuCi0JICogCi0JICogQHNlZSBJSW5zdGFsbGFibGVVbml0I2dldElkKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FU1BBQ0VfSVVfSUQgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgcHJvcGVydHkga2V5ICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wYXJ0aWFsLml1IjwvY29kZT4pIGZvciBhIAotCSAqIGJvb2xlYW4gcHJvcGVydHkgaW5kaWNhdGluZyB0aGUgSVUgaXMgZ2VuZXJhdGVkIGZyb20gaW5jb21wbGV0ZSBpbmZvcm1hdGlvbiBhbmQKLQkgKiBzaG91bGQgYmUgcmVwbGFjZWQgYnkgdGhlIGNvbXBsZXRlIElVIGlmIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9QQVJUSUFMX0lVID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucGFydGlhbC5pdSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgcHJvcGVydHkga2V5ICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLnByb2ZpbGUiPC9jb2RlPikgZm9yIGEgCi0JICogYm9vbGVhbiBwcm9wZXJ0eSBpbmRpY2F0aW5nIHRoYXQgYW4gaW5zdGFsbGFibGUgdW5pdCBpcyBhIHByb2ZpbGUuCi0JICogCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVFlQRV9QUk9GSUxFID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5wcm9maWxlIjsgLy8kTk9OLU5MUy0xJAkgCi0KLQkvKioKLQkgKiBBIHByb3BlcnR5IGtleSAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5jYXRlZ29yeSI8L2NvZGU+KSBmb3IgYSAKLQkgKiBib29sZWFuIHByb3BlcnR5IGluZGljYXRpbmcgdGhhdCBhbiBpbnN0YWxsYWJsZSB1bml0IGlzIGEgY2F0ZWdvcnkuCi0JICogCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVFlQRV9DQVRFR09SWSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIHByb3BlcnR5IGtleSAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5mcmFnbWVudCI8L2NvZGU+KSBmb3IgYSAKLQkgKiBib29sZWFuIHByb3BlcnR5IGluZGljYXRpbmcgdGhhdCBhbiBpbnN0YWxsYWJsZSB1bml0IGlzIGEgZnJhZ21lbnQuCi0JICogCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVFlQRV9GUkFHTUVOVCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZnJhZ21lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIHByb3BlcnR5IGtleSAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5ncm91cCI8L2NvZGU+KSBmb3IgYSAKLQkgKiBib29sZWFuIHByb3BlcnR5IGluZGljYXRpbmcgdGhhdCBhbiBpbnN0YWxsYWJsZSB1bml0IGlzIGEgZ3JvdXAuCi0JICogCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVFlQRV9HUk9VUCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIHByb3BlcnR5IGtleSAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5wYXRjaCI8L2NvZGU+KSBmb3IgYSAKLQkgKiBib29sZWFuIHByb3BlcnR5IGluZGljYXRpbmcgdGhhdCBhbiBpbnN0YWxsYWJsZSB1bml0IGlzIGEgZ3JvdXAuCi0JICogCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfVFlQRV9QQVRDSCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUucGF0Y2giOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIHByb3BlcnR5IGtleSAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5sb2NrIjwvY29kZT4pIGZvciBhbgotCSAqIGludGVnZXIgcHJvcGVydHkgaW5kaWNhdGluZyBob3cgYW4gaW5zdGFsbGFibGUgdW5pdCBpcyBsb2NrZWQgaW4gaXRzIHByb2ZpbGUuCi0JICogVGhlIGludGVnZXIgaXMgYSBiaXQtbWFzayBpbmRpY2F0aW5nIHRoZSBkaWZmZXJlbnQgbG9ja3MgZGVmaW5lZCBvbiB0aGUgaW5zdGFsbGFibGUKLQkgKiB1bml0LiAgVGhlIHByb3BlcnR5IHNob3VsZCBiZSBvYnRhaW5lZCBmcm9tIGEgcHJvZmlsZSB1c2luZyAKLQkgKiBJUHJvZmlsZSNnZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LCBTdHJpbmcpLgotCSAqIAotCSAqIEBzZWUgI0xPQ0tfVU5JTlNUQUxMCi0JICogQHNlZSAjTE9DS19VUERBVEUKLQkgKiBAc2VlICNMT0NLX05PTkUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BST0ZJTEVfTE9DS0VEX0lVID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5sb2NrIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9UT0RPIE1vdmUgdG8gVUkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BST0ZJTEVfUk9PVF9JVSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUucm9vdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgcHJvcGVydHkga2V5ICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb250YWN0IjwvY29kZT4pIGZvciBhIAotCSAqIFN0cmluZyBwcm9wZXJ0eSBjb250YWluaW5nIGEgY29udGFjdCBhZGRyZXNzIHdoZXJlIHByb2JsZW1zIGNhbiBiZSByZXBvcnRlZCwgCi0JICogc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzLgotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0NPTlRBQ1QgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb250YWN0IjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEEgcHJvcGVydHkga2V5ICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kZXNjcmlwdGlvbiI8L2NvZGU+KSBmb3IgYSAKLQkgKiBTdHJpbmcgcHJvcGVydHkgY29udGFpbmluZyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBpbnN0YWxsYWJsZSB1bml0LgotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0RFU0NSSVBUSU9OID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIHByb3BlcnR5IGtleSAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGVzY3JpcHRpb24udXJsIjwvY29kZT4pIGZvciBhIAotCSAqIFN0cmluZyBwcm9wZXJ0eSBjb250YWluaW5nIGEgVVJMIHRvIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgaW5zdGFsbGFibGUgdW5pdC4KLQkgKiAKLQkgKiBAc2VlICNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9ERVNDUklQVElPTl9VUkwgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kZXNjcmlwdGlvbi51cmwiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQSBwcm9wZXJ0eSBrZXkgKHZhbHVlIDxjb2RlPiJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRvYy51cmwiPC9jb2RlPikgZm9yIGEgCi0JICogU3RyaW5nIHByb3BlcnR5IGNvbnRhaW5pbmcgYSBVUkwgZm9yIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIGluc3RhbGxhYmxlIHVuaXQuCi0JICogCi0JICogQHNlZSAjZ2V0UHJvcGVydHkoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRE9DX1VSTCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRvYy51cmwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBIHByb3BlcnR5IGtleSAodmFsdWUgPGNvZGU+Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZSI8L2NvZGU+KSBmb3IgYSAKLQkgKiBTdHJpbmcgcHJvcGVydHkgY29udGFpbmluZyBhIGh1bWFuLXJlYWRhYmxlIG5hbWUgZm9yIHRoZSBpbnN0YWxsYWJsZSB1bml0LgotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEEgcHJvcGVydHkga2V5ICh2YWx1ZSA8Y29kZT4ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlciI8L2NvZGU+KSBmb3IgYSAKLQkgKiBTdHJpbmcgcHJvcGVydHkgY29udGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmVuZG9yIG9yIHByb3ZpZGVyIG9mIHRoZSAKLQkgKiBpbnN0YWxsYWJsZSB1bml0LgotCSAqIAotCSAqIEBzZWUgI2dldFByb3BlcnR5KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX1BST1ZJREVSID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIGluZGljYXRlIHRoYXQgYW4gaW5zdGFsbGFibGUgdW5pdCBpcyBub3QgbG9ja2VkIGluIGFueXdheS4KLQkgKiBAc2VlICNQUk9QX1BST0ZJTEVfTE9DS0VEX0lVCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgTE9DS19OT05FID0gMDsKLQkvKioKLQkgKiBDb25zdGFudCB1c2VkIHRvIGluZGljYXRlIHRoYXQgYW4gaW5zdGFsbGFibGUgdW5pdCBpcyBsb2NrZWQgc28gdGhhdCBpdCBtYXkKLQkgKiBub3QgYmUgdW5pbnN0YWxsZWQuCi0JICogQHNlZSAjUFJPUF9QUk9GSUxFX0xPQ0tFRF9JVQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IExPQ0tfVU5JTlNUQUxMID0gMSA8PCAwOwotCS8qKgotCSAqIENvbnN0YW50IHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhbiBpbnN0YWxsYWJsZSB1bml0IGlzIGxvY2tlZCBzbyB0aGF0IGl0IG1heQotCSAqIG5vdCBiZSB1cGRhdGVkLiB1cGRhdGVzLgotCSAqIEBzZWUgI1BST1BfUFJPRklMRV9MT0NLRURfSVUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBMT0NLX1VQREFURSA9IDEgPDwgMTsKLQotCXB1YmxpYyBJQXJ0aWZhY3RLZXlbXSBnZXRBcnRpZmFjdHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpbHRlciBvbiB0aGlzIGluc3RhbGxhYmxlIHVuaXQuIFRoZSBmaWx0ZXIgaXMgbWF0Y2hlZCBhZ2FpbnN0Ci0JICogdGhlIHNlbGVjdGlvbiBjb250ZXh0IG9mIHRoZSBwcm9maWxlIHRoZSB1bml0IGlzIGluc3RhbGxlZCBpbnRvLiBBbiBJVSB3aWxsIG5vdAotCSAqIGJlIGluc3RhbGxlZCBpZiBpdCBoYXMgYSBmaWx0ZXIgY29uZGl0aW9uIHRoYXQgaXMgbm90IHNhdGlzZmllZCBieSB0aGUgY29udGV4dC4KLQkgKiAKLQkgKiBTZWUgUHJvZmlsZSNnZXRTZWxlY3Rpb25Db250ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmcmFnbWVudHMgdGhhdCBoYXZlIGJlZW4gYm91bmQgdG8gdGhpcyBpbnN0YWxsYWJsZSB1bml0LCBvcgotCSAqIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoaXMgdW5pdCBpcyBub3QgcmVzb2x2ZWQuCi0JICogCi0JICogQHNlZSAjaXNSZXNvbHZlZCgpCi0JICogQHJldHVybiBUaGUgZnJhZ21lbnRzIGJvdW5kIHRvIHRoaXMgaW5zdGFsbGFibGUgdW5pdCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50W10gZ2V0RnJhZ21lbnRzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCk7Ci0KLQkvKioKLQkgKiBHZXQgYW4gPGk+dW5tb2RpZmlhYmxlIGNvcHk8L2k+IG9mIHRoZSBwcm9wZXJ0aWVzCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0YWxsYWJsZSB1bml0LgotCSAqIAotCSAqIEByZXR1cm4gYW4gPGk+dW5tb2RpZmlhYmxlIGNvcHk8L2k+IG9mIHRoZSBJVSBwcm9wZXJ0aWVzLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcygpOwotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5KTsKLQotCXB1YmxpYyBQcm92aWRlZENhcGFiaWxpdHlbXSBnZXRQcm92aWRlZENhcGFiaWxpdGllcygpOwotCi0JcHVibGljIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCk7Ci0KLQlwdWJsaWMgVG91Y2hwb2ludERhdGFbXSBnZXRUb3VjaHBvaW50RGF0YSgpOwotCi0JcHVibGljIFRvdWNocG9pbnRUeXBlIGdldFRvdWNocG9pbnRUeXBlKCk7Ci0KLQlwdWJsaWMgVmVyc2lvbiBnZXRWZXJzaW9uKCk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZyYWdtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpbnN0YWxsYWJsZSB1bml0IGhhcyBiZWVuIHJlc29sdmVkLiBBIHJlc29sdmVkCi0JICogaW5zdGFsbGFibGUgdW5pdCByZXByZXNlbnRzIHRoZSB1bmlvbiBvZiBhbiBpbnN0YWxsYWJsZSB1bml0IGFuZCBzb21lCi0JICogZnJhZ21lbnRzLgotCSAqIAotCSAqIEBzZWUgI2dldEZyYWdtZW50cygpCi0JICogQHNlZSAjdW5yZXNvbHZlZCgpCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGluc3RhbGxhYmxlIHVuaXQgaXMgcmVzb2x2ZWQsIGFuZCAKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUmVzb2x2ZWQoKTsKLQotCXB1YmxpYyBib29sZWFuIGlzU2luZ2xldG9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1bnJlc29sdmVkIGVxdWl2YWxlbnQgb2YgdGhpcyBpbnN0YWxsYWJsZSB1bml0LiBJZiB0aGlzIHVuaXQgaXMKLQkgKiBhbHJlYWR5IHVucmVzb2x2ZWQsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHJlY2VpdmVyLiBPdGhlcndpc2UsIHRoaXMKLQkgKiBtZXRob2QgcmV0dXJucyBhbiBpbnN0YWxsYWJsZSB1bml0IHdpdGggdGhlIHNhbWUgaWQgYW5kIHZlcnNpb24sIGJ1dCB3aXRob3V0Ci0JICogYW55IGZyYWdtZW50cyBhdHRhY2hlZC4KLQkgKiAKLQkgKiBAc2VlICNnZXRGcmFnbWVudHMoKQotCSAqIEBzZWUgI2lzUmVzb2x2ZWQoKQotCSAqIEByZXR1cm4gVGhlIHVucmVzb2x2ZWQgZXF1aXZhbGVudCBvZiB0aGlzIHVuaXQKLQkgKi8KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdCB1bnJlc29sdmVkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgdGhpcyBpbnN0YWxsYWJsZSB1bml0IGlzIGFuIHVwZGF0ZSBvZi4KLQkgKiBAcmV0dXJuIFRoZSBsaW5lYWdlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnN0YWxsYWJsZSB1bml0Ci0JICovCi0JcHVibGljIElVcGRhdGVEZXNjcmlwdG9yIGdldFVwZGF0ZURlc2NyaXB0b3IoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpY2Vuc2UgdGhhdCBhcHBsaWVzIHRvIHRoaXMgaW5zdGFsbGFibGUgdW5pdC4KLQkgKiBAcmV0dXJuIHRoZSBsaWNlbnNlIHRoYXQgYXBwbGllcyB0byB0aGlzIGluc3RhbGxhYmxlIHVuaXQgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgTGljZW5zZSBnZXRMaWNlbnNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb3B5cmlnaHQgdGhhdCBhcHBsaWVzIHRvIHRoaXMgaW5zdGFsbGFibGUgdW5pdC4KLQkgKiBAcmV0dXJuIHRoZSBjb3B5cmlnaHQgdGhhdCBhcHBsaWVzIHRvIHRoaXMgaW5zdGFsbGFibGUgdW5pdCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBDb3B5cmlnaHQgZ2V0Q29weXJpZ2h0KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXRGcmFnbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXRGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDRkZTY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhOwotCi1wdWJsaWMgaW50ZXJmYWNlIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCBleHRlbmRzIElJbnN0YWxsYWJsZVVuaXQgewotCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHlbXSBnZXRIb3N0KCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXRQYXRjaC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL0lJbnN0YWxsYWJsZVVuaXRQYXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDdiN2UwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9JSW5zdGFsbGFibGVVbml0UGF0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhOwotCi1wdWJsaWMgaW50ZXJmYWNlIElJbnN0YWxsYWJsZVVuaXRQYXRjaCBleHRlbmRzIElJbnN0YWxsYWJsZVVuaXQgewotCVJlcXVpcmVkQ2FwYWJpbGl0eVtdW10gZ2V0QXBwbGljYWJpbGl0eVNjb3BlKCk7Ci0KLQlSZXF1aXJlbWVudENoYW5nZVtdIGdldFJlcXVpcmVtZW50c0NoYW5nZSgpOwotCi0JUmVxdWlyZWRDYXBhYmlsaXR5IGdldExpZmVDeWNsZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL0lVcGRhdGVEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvSVVwZGF0ZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhiM2Y0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvSVVwZGF0ZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotcHVibGljIGludGVyZmFjZSBJVXBkYXRlRGVzY3JpcHRvciB7Ci0JcHVibGljIGZpbmFsIGludCBOT1JNQUwgPSAwOwotCXB1YmxpYyBmaW5hbCBpbnQgSElHSCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiBhbiBpbnN0YWxsYWJsZSB1bml0IHRoYXQgdGhlIGluc3RhbGxhYmxlIHVuaXQgY29udGFpbmluZyB0aGlzIG9iamVjdCBpcyBhbiB1cGRhdGUgZm9yLgotCSAqIEByZXR1cm4gQW4gaW5zdGFsbGFibGUgdW5pdCBpZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIFRoZSByYW5nZSBvZiB0aGUgaW5zdGFsbGFibGUgdW5pdCB0aGF0IHRoZSBpbnN0YWxsYWJsZSB1bml0IGNvbnRhaW5pbmcgdGhpcyBvYmplY3QgaXMgYW4gdXBkYXRlIGZvci4KLQkgKiBAcmV0dXJuIEEgdmVyc2lvbiByYW5nZQotCSAqLwotCXB1YmxpYyBWZXJzaW9uUmFuZ2UgZ2V0UmFuZ2UoKTsKLQotCS8qKgotCSAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdXBkYXRlLiBUaGlzIGFsbG93cyB0byBleHBsYWluIHdoYXQgdGhlIHVwZGF0ZSBpcyBhYm91dC4KLQkgKiBAcmV0dXJuIEEgZGVzY3JpcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBUaGUgaW1wb3J0YW5jZSBvZiB0aGUgdXBkYXRlIGRlc2NyaXB0b3IgcmVwcmVzZW50ZWQgYXMgYSBpbnQuCi0JICogQHJldHVybiBUaGUgc2V2ZXJpdHkuCi0JICovCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpOwotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGFuIGluc3RhbGxhYmxlIHVuaXQgaXMgYW4gdXBkYXRlIGZvciB0aGUgaW5zdGFsbGFibGUgdW5pdCBwYXNzZWQgIAotCSAqIEBwYXJhbSBpdSB0aGUgaW5zdGFsbGFibGUgdW5pdCBjaGVja2VkCi0JICogQHJldHVybiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBhbiBpbnN0YWxsYWJsZSB1bml0IGlzIGFuIHVwZGF0ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZU9mKElJbnN0YWxsYWJsZVVuaXQgaXUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL0luc3RhbGxhYmxlVW5pdFBhdGNoLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvSW5zdGFsbGFibGVVbml0UGF0Y2guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjYThhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvSW5zdGFsbGFibGVVbml0UGF0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5JbnN0YWxsYWJsZVVuaXQ7Ci0KLXB1YmxpYyBjbGFzcyBJbnN0YWxsYWJsZVVuaXRQYXRjaCBleHRlbmRzIEluc3RhbGxhYmxlVW5pdCBpbXBsZW1lbnRzIElJbnN0YWxsYWJsZVVuaXRQYXRjaCB7Ci0JcHJpdmF0ZSBSZXF1aXJlbWVudENoYW5nZVtdIGNoYW5nZXM7Ci0JcHJpdmF0ZSBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHNjb3BlOwotCXByaXZhdGUgUmVxdWlyZWRDYXBhYmlsaXR5IGxpZmVDeWNsZTsKLQotCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVtZW50c0NoYW5nZShSZXF1aXJlbWVudENoYW5nZVtdIGNoYW5nZXMpIHsKLQkJdGhpcy5jaGFuZ2VzID0gY2hhbmdlczsKLQl9Ci0KLQlwdWJsaWMgUmVxdWlyZW1lbnRDaGFuZ2VbXSBnZXRSZXF1aXJlbWVudHNDaGFuZ2UoKSB7Ci0JCXJldHVybiBjaGFuZ2VzOwotCX0KLQotCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHkgZ2V0TGlmZUN5Y2xlKCkgewotCQlyZXR1cm4gbGlmZUN5Y2xlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpZmVDeWNsZShSZXF1aXJlZENhcGFiaWxpdHkgbGlmZUN5Y2xlKSB7Ci0JCWlmIChsaWZlQ3ljbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdGhpcy5saWZlQ3ljbGUgPSBsaWZlQ3ljbGU7Ci0JCWFkZFJlcXVpcmVkQ2FwYWJpbGl0eShuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge2xpZmVDeWNsZX0pOwotCX0KLQotCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIGdldEFwcGxpY2FiaWxpdHlTY29wZSgpIHsKLQkJcmV0dXJuIHNjb3BlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFwcGxpY2FiaWxpdHlTY29wZShSZXF1aXJlZENhcGFiaWxpdHlbXVtdIGFwcGx5VG8pIHsKLQkJc2NvcGUgPSBhcHBseVRvOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRSZXF1aXJlZENhcGFiaWxpdHkoUmVxdWlyZWRDYXBhYmlsaXR5W10gdG9BZGQpIHsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gY3VycmVudCA9IHN1cGVyLmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlc3VsdCA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbY3VycmVudC5sZW5ndGggKyB0b0FkZC5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGN1cnJlbnQsIDAsIHJlc3VsdCwgMCwgY3VycmVudC5sZW5ndGgpOwotCQlTeXN0ZW0uYXJyYXljb3B5KHRvQWRkLCAwLCByZXN1bHQsIGN1cnJlbnQubGVuZ3RoLCB0b0FkZC5sZW5ndGgpOwotCQlzZXRSZXF1aXJlZENhcGFiaWxpdGllcyhyZXN1bHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9MaWNlbnNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvTGljZW5zZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2Q5ZWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9MaWNlbnNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBHZW51aXRlYywgTExDIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAJCUdlbnVpdGVjLCBMTEMgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAkJSUJNIENvcnBvcmF0aW9uIC0gb3B0aW9uYWwgVVJMIGZpZWxkIGluc3RlYWQgb2YgcmVxdWlyZWQgbmFtZQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgPGNvZGU+TGljZW5zZTwvY29kZT4gY2xhc3MgcmVwcmVzZW50cyBhIHNvZnR3YXJlIGxpY2Vuc2UuICBBIGxpY2Vuc2UgaGFzIHJlcXVpcmVkIGJvZHkgdGV4dAotICogd2hpY2ggbWF5IGJlIHRoZSBmdWxsIHRleHQgb3IgYW4gYW5ub3RhdGlvbi4gIEFuIG9wdGlvbmFsIFVSTCBmaWVsZCBjYW4gYmUgc3BlY2lmaWVkCi0gKiB3aGljaCBsaW5rcyB0byBmdWxsIHRleHQuICBMaWNlbnNlcyBjYW4gYmUgZWFzaWx5IGNvbXBhcmVkIHVzaW5nIHRoZWlyIGRpZ2VzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWNlbnNlIHsKLQkvKioKLQkgKiBUaGUgPGNvZGU+Ym9keTwvY29kZT4gY29udGFpbnMgdGhlIGRlc2NyaXB0aXZlIHRleHQgZm9yIHRoZSBsaWNlbnNlLiBUaGlzIG1heQotCSAqIGJlIGEgc3VtbWFyeSBmb3IgYSBmdWxsIGxpY2Vuc2Ugc3BlY2lmaWVkIGluIGEgVVJMLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIGJvZHk7Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+dXJsPC9jb2RlPiBpcyB0aGUgVVJMIG9mIHRoZSBsaWNlbnNlLgotCSAqLwotCXByaXZhdGUgVVJMIHVybDsKLQotCS8qKgotCSAqIFRoZSA8Y29kZT5kaWdlc3Q8L2NvZGU+IGlzIHRoZSBjYWNoZWQgbWVzc2FnZSBkaWdlc3Qgb2YgdGhlIG5vcm1hbGl6ZWQgYm9keQotCSAqLwotCXByaXZhdGUgQmlnSW50ZWdlciBkaWdlc3Q7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGxpY2Vuc2Ugb2JqZWN0IHdoaWNoIGlzIGlkZW50aWZpZWQgYnkgdXNlcnMgdXNpbmcgdGhlIDxjb2RlPmJvZHk8L2NvZGU+IGZpZWxkLgotCSAqIFRoZSBib2R5IHNob3VsZCBjb250YWluIGVpdGhlciB0aGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG9yIGFuIGFubm90YXRpb24gZm9yIGEgbGljZW5zZQotCSAqIGZ1bGx5IHNwZWNpZmllZCBpbiB0aGUgVVJMIGF0IHVybFN0cmluZy4KLQkgKiBAcGFyYW0gdXJsU3RyaW5nIHRoZSBzdHJpbmcgZGVzY3JpYmluZyB0aGUgVVJMIG9mIHRoZSBmdWxsIGxpY2Vuc2UsIG1heSBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEBwYXJhbSBib2R5IHRoZSBsaWNlbnNlIGJvZHksIGNhbm5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4gdGhlIDxjb2RlPmJvZHk8L2NvZGU+IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIExpY2Vuc2UoU3RyaW5nIHVybFN0cmluZywgU3RyaW5nIGJvZHkpIHsKLQkJaWYgKGJvZHkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImJvZHkgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXJsU3RyaW5nICE9IG51bGwpCi0JCQl0cnkgewotCQkJCXVybCA9IG5ldyBVUkwodXJsU3RyaW5nKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdXJsID0gbnVsbDsKLQkJCX0KLQkJdGhpcy5ib2R5ID0gYm9keTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgY29udGFpbmluZyB0aGUgZnVsbCBkZXNjcmlwdGlvbiBvZiB0aGUgbGljZW5zZS4KLQkgKiBNYXkgYmUgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGljZW5zZSBib2R5LgotCSAqIEByZXR1cm4gdGhlIGxpY2Vuc2UgYm9keSwgbmV2ZXIgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvZHkoKSB7Ci0JCXJldHVybiBib2R5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1lc3NhZ2UgZGlnZXN0IG9mIHRoZSBsaWNlbnNlIGJvZHkuICBUaGUgZGlnZXN0IGlzIGNhbGN1bGF0ZWQgb24gYSBub3JtYWxpemVkCi0JICogdmVyc2lvbiBvZiB0aGUgbGljZW5zZSB3aGVyZSBhbGwgd2hpdGVzcGFjZSBoYXMgYmVlbiByZWR1Y2VkIHRvIG9uZSBzcGFjZS4KLQkgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIGRpZ2VzdCBhcyBhIDxjb2RlPkJpZ0ludGVnZXI8L2NvZGU+LCBuZXZlciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgQmlnSW50ZWdlciBnZXREaWdlc3QoKSB7Ci0JCWlmIChkaWdlc3QgPT0gbnVsbCkKLQkJCWRpZ2VzdCA9IGNhbGN1bGF0ZUxpY2Vuc2VEaWdlc3QoKTsKLQkJcmV0dXJuIGRpZ2VzdDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gdGhpcykKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBMaWNlbnNlKSB7Ci0JCQlMaWNlbnNlIG90aGVyID0gKExpY2Vuc2UpIG9iajsKLQkJCWlmIChvdGhlci5nZXREaWdlc3QoKS5lcXVhbHMoZ2V0RGlnZXN0KCkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZ2V0RGlnZXN0KCkuaGFzaENvZGUoKTsKLQl9Ci0KLQlwcml2YXRlIEJpZ0ludGVnZXIgY2FsY3VsYXRlTGljZW5zZURpZ2VzdCgpIHsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBub3JtYWxpemUoZ2V0Qm9keSgpKTsKLQkJdHJ5IHsKLQkJCU1lc3NhZ2VEaWdlc3QgYWxnb3JpdGhtID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWFsZ29yaXRobS5yZXNldCgpOwotCQkJYWxnb3JpdGhtLnVwZGF0ZShtZXNzYWdlLmdldEJ5dGVzKCJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJYnl0ZVtdIGRpZ2VzdEJ5dGVzID0gYWxnb3JpdGhtLmRpZ2VzdCgpOwotCQkJcmV0dXJuIG5ldyBCaWdJbnRlZ2VyKDEsIGRpZ2VzdEJ5dGVzKTsKLQkJfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZSBhbGwgc2VxdWVuY2VzIG9mIHdoaXRlc3BhY2Ugd2l0aCBhIHNpbmdsZSB3aGl0ZXNwYWNlIGNoYXJhY3Rlci4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIGxpY2Vuc2UpIHsKLQkJU3RyaW5nIHRleHQgPSBsaWNlbnNlLnRyaW0oKTsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGxlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWNoYXIgYyA9IHRleHQuY2hhckF0KGkpOwotCQkJYm9vbGVhbiBmb3VuZFdoaXRlc3BhY2UgPSBmYWxzZTsKLQkJCXdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpICYmIGkgPCBsZW5ndGgpIHsKLQkJCQlmb3VuZFdoaXRlc3BhY2UgPSB0cnVlOwotCQkJCWMgPSB0ZXh0LmNoYXJBdCgrK2kpOwotCQkJfQotCQkJaWYgKGZvdW5kV2hpdGVzcGFjZSkKLQkJCQlyZXN1bHQuYXBwZW5kKCcgJyk7Ci0JCQlpZiAoaSA8IGxlbmd0aCkKLQkJCQlyZXN1bHQuYXBwZW5kKGMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvTWV0YWRhdGFGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvTWV0YWRhdGFGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYjhmMGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL01ldGFkYXRhRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgR2VudWl0ZWMsIExMQwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIEEgZmFjdG9yeSBjbGFzcyBmb3IgaW5zdGFudGlhdGluZyB2YXJpb3VzIHAyIG1ldGFkYXRhIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZXRhZGF0YUZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gewotCQlwcm90ZWN0ZWQgSW5zdGFsbGFibGVVbml0IHVuaXQ7Ci0KLQkJcHVibGljIEluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZFRvdWNocG9pbnREYXRhKFRvdWNocG9pbnREYXRhIGRhdGEpIHsKLQkJCUFzc2VydC5pc05vdE51bGwoZGF0YSk7Ci0JCQl1bml0KCkuYWRkVG91Y2hwb2ludERhdGEoZGF0YSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRBcHBsaWNhYmlsaXR5RmlsdGVyKFN0cmluZyBsZGFwRmlsdGVyKSB7Ci0JCQl1bml0KCkuc2V0QXBwbGljYWJpbGl0eUZpbHRlcihsZGFwRmlsdGVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEFydGlmYWN0cyhJQXJ0aWZhY3RLZXlbXSB2YWx1ZSkgewotCQkJdW5pdCgpLnNldEFydGlmYWN0cyh2YWx1ZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRDYXBhYmlsaXRpZXMoUHJvdmlkZWRDYXBhYmlsaXR5W10gZXhwb3J0ZWRDYXBhYmlsaXRpZXMpIHsKLQkJCXVuaXQoKS5zZXRDYXBhYmlsaXRpZXMoZXhwb3J0ZWRDYXBhYmlsaXRpZXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RmlsdGVyKFN0cmluZyBmaWx0ZXIpIHsKLQkJCXVuaXQoKS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQkJdW5pdCgpLnNldElkKGlkKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldExpY2Vuc2UoTGljZW5zZSBsaWNlbnNlKSB7Ci0JCQl1bml0KCkuc2V0TGljZW5zZShsaWNlbnNlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvcHlyaWdodChDb3B5cmlnaHQgY29weXJpZ2h0KSB7Ci0JCQl1bml0KCkuc2V0Q29weXJpZ2h0KGNvcHlyaWdodCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJCXVuaXQoKS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGNhcGFiaWxpdGllcykgewotCQkJdW5pdCgpLnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTaW5nbGV0b24oYm9vbGVhbiBzaW5nbGV0b24pIHsKLQkJCXVuaXQoKS5zZXRTaW5nbGV0b24oc2luZ2xldG9uKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFRvdWNocG9pbnRUeXBlKFRvdWNocG9pbnRUeXBlIHR5cGUpIHsKLQkJCXVuaXQoKS5zZXRUb3VjaHBvaW50VHlwZSh0eXBlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oVmVyc2lvbiBuZXdWZXJzaW9uKSB7Ci0JCQl1bml0KCkuc2V0VmVyc2lvbihuZXdWZXJzaW9uKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFVwZGF0ZURlc2NyaXB0b3IoSVVwZGF0ZURlc2NyaXB0b3IgdXBkYXRlSW5mbykgewotCQkJdW5pdCgpLnNldFVwZGF0ZURlc2NyaXB0b3IodXBkYXRlSW5mbyk7Ci0JCX0KLQotCQlJbnN0YWxsYWJsZVVuaXQgdW5pdCgpIHsKLQkJCWlmICh1bml0ID09IG51bGwpCi0JCQkJdW5pdCA9IG5ldyBJbnN0YWxsYWJsZVVuaXQoKTsKLQkJCXJldHVybiB1bml0OwotCQl9Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCB1bml0Q3JlYXRlKCkgewotCQkJSUluc3RhbGxhYmxlVW5pdCByZXN1bHQgPSB1bml0KCk7Ci0JCQl0aGlzLnVuaXQgPSBudWxsOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBleHRlbmRzIEluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIHsKLQkJcHVibGljIHZvaWQgc2V0SG9zdChSZXF1aXJlZENhcGFiaWxpdHlbXSBob3N0UmVxdWlyZW1lbnRzKSB7Ci0JCQkoKEluc3RhbGxhYmxlVW5pdEZyYWdtZW50KSB1bml0KCkpLnNldEhvc3QoaG9zdFJlcXVpcmVtZW50cyk7Ci0JCX0KLQotCQlJbnN0YWxsYWJsZVVuaXQgdW5pdCgpIHsKLQkJCWlmICh1bml0ID09IG51bGwpCi0JCQkJdW5pdCA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCgpOwotCQkJcmV0dXJuIHVuaXQ7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIEluc3RhbGxhYmxlVW5pdFBhdGNoRGVzY3JpcHRpb24gZXh0ZW5kcyBJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiB7Ci0JCXB1YmxpYyB2b2lkIHNldFJlcXVpcmVtZW50Q2hhbmdlcyhSZXF1aXJlbWVudENoYW5nZVtdIGNoYW5nZXMpIHsKLQkJCSgoSW5zdGFsbGFibGVVbml0UGF0Y2gpIHVuaXQoKSkuc2V0UmVxdWlyZW1lbnRzQ2hhbmdlKGNoYW5nZXMpOwotCQl9Ci0KLQkJSW5zdGFsbGFibGVVbml0IHVuaXQoKSB7Ci0JCQlpZiAodW5pdCA9PSBudWxsKQotCQkJCXVuaXQgPSBuZXcgSW5zdGFsbGFibGVVbml0UGF0Y2goKTsKLQkJCXJldHVybiB1bml0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0QXBwbGljYWJpbGl0eVNjb3BlKFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10gYXBwbHlUbykgewotCQkJKChJbnN0YWxsYWJsZVVuaXRQYXRjaCkgdW5pdCgpKS5zZXRBcHBsaWNhYmlsaXR5U2NvcGUoYXBwbHlUbyk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRMaWZlQ3ljbGUoUmVxdWlyZWRDYXBhYmlsaXR5IGxpZmVDeWNsZSkgewotCQkJKChJbnN0YWxsYWJsZVVuaXRQYXRjaCkgdW5pdCgpKS5zZXRMaWZlQ3ljbGUobGlmZUN5Y2xlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNpbmdsZXRvbiB0b3VjaHBvaW50IGRhdGEgZm9yIGEgdG91Y2hwb2ludCB3aXRoIG5vIGluc3RydWN0aW9ucy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBUb3VjaHBvaW50RGF0YSBFTVBUWV9UT1VDSFBPSU5UX0RBVEEgPSBuZXcgVG91Y2hwb2ludERhdGEoQ29sbGVjdGlvbnMuRU1QVFlfTUFQKTsKLQotCXByaXZhdGUgc3RhdGljIFRvdWNocG9pbnRUeXBlW10gdHlwZUNhY2hlID0gbmV3IFRvdWNocG9pbnRUeXBlWzVdOwotCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHR5cGVDYWNoZU9mZnNldDsKLQotCS8qKgotCSAqIFJldHVybnMgYW4ge0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9IGJhc2VkIG9uIHRoZSBnaXZlbiAKLQkgKiBkZXNjcmlwdGlvbi4gIE9uY2UgdGhlIGluc3RhbGxhYmxlIHVuaXQgaGFzIGJlZW4gY3JlYXRlZCwgdGhlIGluZm9ybWF0aW9uIGlzIAotCSAqIGRpc2NhcmRlZCBmcm9tIHRoZSBkZXNjcmlwdGlvbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdW5pdCB0byBjcmVhdGUKLQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGluc3RhbGxhYmxlIHVuaXQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlSW5zdGFsbGFibGVVbml0KEluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZGVzY3JpcHRpb24pOwotCQlyZXR1cm4gZGVzY3JpcHRpb24udW5pdENyZWF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4ge0BsaW5rIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudH0gYmFzZWQgb24gdGhlIGdpdmVuIAotCSAqIGRlc2NyaXB0aW9uLiAgT25jZSB0aGUgZnJhZ21lbnQgaGFzIGJlZW4gY3JlYXRlZCwgdGhlIGluZm9ybWF0aW9uIGlzIAotCSAqIGRpc2NhcmRlZCBmcm9tIHRoZSBkZXNjcmlwdGlvbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdW5pdCB0byBjcmVhdGUKLQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGluc3RhbGxhYmxlIHVuaXQgZnJhZ21lbnQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCBjcmVhdGVJbnN0YWxsYWJsZVVuaXRGcmFnbWVudChJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZGVzY3JpcHRpb24pOwotCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCkgZGVzY3JpcHRpb24udW5pdENyZWF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4ge0BsaW5rIElJbnN0YWxsYWJsZVVuaXRQYXRjaH0gYmFzZWQgb24gdGhlIGdpdmVuIAotCSAqIGRlc2NyaXB0aW9uLiAgT25jZSB0aGUgcGF0Y2ggaW5zdGFsbGFibGUgdW5pdCBoYXMgYmVlbiBjcmVhdGVkLCB0aGUgaW5mb3JtYXRpb24gaXMgCi0JICogZGlzY2FyZGVkIGZyb20gdGhlIGRlc2NyaXB0aW9uIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB1bml0IHRvIGNyZWF0ZQotCSAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgaW5zdGFsbGFibGUgdW5pdCBwYXRjaAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdFBhdGNoIGNyZWF0ZUluc3RhbGxhYmxlVW5pdFBhdGNoKEluc3RhbGxhYmxlVW5pdFBhdGNoRGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChkZXNjcmlwdGlvbik7Ci0JCXJldHVybiAoSUluc3RhbGxhYmxlVW5pdFBhdGNoKSBkZXNjcmlwdGlvbi51bml0Q3JlYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHtAbGluayBQcm92aWRlZENhcGFiaWxpdHl9IHdpdGggdGhlIGdpdmVuIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZXNwYWNlIFRoZSBjYXBhYmlsaXR5IG5hbWVzcGFjZQotCSAqIEBwYXJhbSBuYW1lIFRoZSBjYXBhYmlsaXR5IG5hbWUKLQkgKiBAcGFyYW0gdmVyc2lvbiBUaGUgY2FwYWJpbGl0eSB2ZXJzaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm92aWRlZENhcGFiaWxpdHkgY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJcmV0dXJuIG5ldyBQcm92aWRlZENhcGFiaWxpdHkobmFtZXNwYWNlLCBuYW1lLCB2ZXJzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEge0BsaW5rIFJlcXVpcmVkQ2FwYWJpbGl0eX0gd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lc3BhY2UgVGhlIGNhcGFiaWxpdHkgbmFtZXNwYWNlCi0JICogQHBhcmFtIG5hbWUgVGhlIHJlcXVpcmVkIGNhcGFiaWxpdHkgbmFtZQotCSAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdmVyc2lvbnMgdGhhdCBhcmUgcmVxdWlyZWQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogdG8gaW5kaWNhdGUgdGhhdCBhbnkgdmVyc2lvbiB3aWxsIGRvLgotCSAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciB1c2VkIHRvIGV2YWx1YXRlIHdoZXRoZXIgdGhpcyBjYXBhYmlsaXR5IGlzIGFwcGxpY2FibGUgaW4gdGhlCi0JICogY3VycmVudCBlbnZpcm9ubWVudCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gaW5kaWNhdGUgdGhpcyBjYXBhYmlsaXR5IGlzIGFsd2F5cyBhcHBsaWNhYmxlCi0JICogQHBhcmFtIG9wdGlvbmFsIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgcmVxdWlyZWQgY2FwYWJpbGl0eSBpcyBvcHRpb25hbCwKLQkgKiBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiBAcGFyYW0gbXVsdGlwbGUgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBjYXBhYmlsaXR5IGNhbiBiZSBzYXRpc2ZpZWQgYnkgbXVsdGlwbGUgcHJvdmlkZWQgY2FwYWJpbGl0aWVzLCBvciBpdCByZXF1aXJlcyBleGFjdGx5IG9uZSBtYXRjaAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVxdWlyZWRDYXBhYmlsaXR5IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgVmVyc2lvblJhbmdlIHJhbmdlLCBTdHJpbmcgZmlsdGVyLCBib29sZWFuIG9wdGlvbmFsLCBib29sZWFuIG11bHRpcGxlKSB7Ci0JCXJldHVybiBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5KG5hbWVzcGFjZSwgbmFtZSwgcmFuZ2UsIGZpbHRlciwgb3B0aW9uYWwsIG11bHRpcGxlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlcXVpcmVkQ2FwYWJpbGl0eSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIG5hbWUsIFZlcnNpb25SYW5nZSByYW5nZSwgU3RyaW5nIGZpbHRlciwgYm9vbGVhbiBvcHRpb25hbCwgYm9vbGVhbiBtdWx0aXBsZSwgYm9vbGVhbiBncmVlZHkpIHsKLQkJcmV0dXJuIG5ldyBSZXF1aXJlZENhcGFiaWxpdHkobmFtZXNwYWNlLCBuYW1lLCByYW5nZSwgZmlsdGVyLCBvcHRpb25hbCwgbXVsdGlwbGUsIGdyZWVkeSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiB7QGxpbmsgSUluc3RhbGxhYmxlVW5pdH0gdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbgotCSAqIHVuaXQgYm91bmQgdG8gdGhlIGdpdmVuIGZyYWdtZW50cy4KLQkgKiAKLQkgKiBAc2VlIElJbnN0YWxsYWJsZVVuaXQjaXNSZXNvbHZlZCgpCi0JICogQHBhcmFtIHVuaXQgVGhlIHVuaXQgdG8gYmUgYm91bmQKLQkgKiBAcGFyYW0gZnJhZ21lbnRzIFRoZSBmcmFnbWVudHMgdG8gYmUgYm91bmQKLQkgKiBAcmV0dXJuIEEgcmVzb2x2ZWQgaW5zdGFsbGFibGUgdW5pdAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVSZXNvbHZlZEluc3RhbGxhYmxlVW5pdChJSW5zdGFsbGFibGVVbml0IHVuaXQsIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFtdIGZyYWdtZW50cykgewotCQlpZiAodW5pdC5pc1Jlc29sdmVkKCkpCi0JCQlyZXR1cm4gdW5pdDsKLQkJQXNzZXJ0LmlzTm90TnVsbCh1bml0KTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmcmFnbWVudHMpOwotCQlyZXR1cm4gbmV3IFJlc29sdmVkSW5zdGFsbGFibGVVbml0KHVuaXQsIGZyYWdtZW50cyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBUb3VjaHBvaW50RGF0YX0gd2l0aCB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb25zLgotCSAqIAotCSAqIEBwYXJhbSBpbnN0cnVjdGlvbnMgVGhlIGluc3RydWN0aW9ucyBmb3IgdGhlIHRvdWNocG9pbnQgZGF0YS4KLQkgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHRvdWNocG9pbnQgZGF0YQotCSAqLwotCXB1YmxpYyBzdGF0aWMgVG91Y2hwb2ludERhdGEgY3JlYXRlVG91Y2hwb2ludERhdGEoTWFwIGluc3RydWN0aW9ucykgewotCQlBc3NlcnQuaXNOb3ROdWxsKGluc3RydWN0aW9ucyk7Ci0JCS8vY29weSB0aGUgbWFwIHRvIHByb3RlY3QgYWdhaW5zdCBzdWJzZXF1ZW50IGNoYW5nZSBieSBjYWxsZXIKLQkJcmV0dXJuIGluc3RydWN0aW9ucy5pc0VtcHR5KCkgPyBFTVBUWV9UT1VDSFBPSU5UX0RBVEEgOiBuZXcgVG91Y2hwb2ludERhdGEobmV3IExpbmtlZEhhc2hNYXAoaW5zdHJ1Y3Rpb25zKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHtAbGluayBUb3VjaHBvaW50VHlwZX0gd2l0aCB0aGUgZ2l2ZW4gaWQgYW5kIHZlcnNpb24uCi0JICogCi0JICogQHBhcmFtIGlkIFRoZSB0b3VjaHBvaW50IGlkCi0JICogQHBhcmFtIHZlcnNpb24gVGhlIHRvdWNocG9pbnQgdmVyc2lvbgotCSAqIEByZXR1cm4gQSB0b3VjaHBvaW50IHR5cGUgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gaWQgYW5kIHZlcnNpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRvdWNocG9pbnRUeXBlIGNyZWF0ZVRvdWNocG9pbnRUeXBlKFN0cmluZyBpZCwgVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHZlcnNpb24pOwotCQlUb3VjaHBvaW50VHlwZSByZXN1bHQgPSBnZXRDYWNoZWRUb3VjaHBvaW50VHlwZShpZCwgdmVyc2lvbik7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCXJlc3VsdCA9IG5ldyBUb3VjaHBvaW50VHlwZShpZCwgdmVyc2lvbik7Ci0JCXB1dENhY2hlZFRvdWNocG9pbnRUeXBlKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVG91Y2hwb2ludFR5cGUgZ2V0Q2FjaGVkVG91Y2hwb2ludFR5cGUoU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJc3luY2hyb25pemVkICh0eXBlQ2FjaGUpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZUNhY2hlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHR5cGVDYWNoZVtpXSAhPSBudWxsICYmIHR5cGVDYWNoZVtpXS5nZXRJZCgpLmVxdWFscyhpZCkgJiYgdHlwZUNhY2hlW2ldLmdldFZlcnNpb24oKS5lcXVhbHModmVyc2lvbikpCi0JCQkJCXJldHVybiB0eXBlQ2FjaGVbaV07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwdXRDYWNoZWRUb3VjaHBvaW50VHlwZShUb3VjaHBvaW50VHlwZSByZXN1bHQpIHsKLQkJLy9zaW1wbGUgcm90YXRpbmcgYnVmZmVyCi0JCXR5cGVDYWNoZVt0eXBlQ2FjaGVPZmZzZXRdID0gcmVzdWx0OwotCQl0eXBlQ2FjaGVPZmZzZXQgPSAodHlwZUNhY2hlT2Zmc2V0ICsgMSkgJSB0eXBlQ2FjaGUubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVVwZGF0ZURlc2NyaXB0b3IgY3JlYXRlVXBkYXRlRGVzY3JpcHRvcihTdHJpbmcgaWQsIFZlcnNpb25SYW5nZSByYW5nZSwgaW50IHNldmVyaXR5LCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIG5ldyBVcGRhdGVEZXNjcmlwdG9yKGlkLCByYW5nZSwgc2V2ZXJpdHksIGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIExpY2Vuc2UgY3JlYXRlTGljZW5zZShTdHJpbmcgdXJsLCBTdHJpbmcgbGljZW5zZUJvZHkpIHsKLQkJcmV0dXJuIG5ldyBMaWNlbnNlKHVybCwgbGljZW5zZUJvZHkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29weXJpZ2h0IGNyZWF0ZUNvcHlyaWdodChTdHJpbmcgdXJsLCBTdHJpbmcgY29weXJpZ2h0Qm9keSkgewotCQlyZXR1cm4gbmV3IENvcHlyaWdodCh1cmwsIGNvcHlyaWdodEJvZHkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL1Byb3ZpZGVkQ2FwYWJpbGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL1Byb3ZpZGVkQ2FwYWJpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2VmYjE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9Qcm92aWRlZENhcGFiaWxpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkFzc2VydDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBEZXNjcmliZXMgYSBjYXBhYmlsaXR5IGFzIGV4cG9zZWQgb3IgcmVxdWlyZWQgYnkgYW4gaW5zdGFsbGFibGUgdW5pdAotICovCi1wdWJsaWMgY2xhc3MgUHJvdmlkZWRDYXBhYmlsaXR5IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWVzcGFjZTsKLQlwcml2YXRlIGZpbmFsIFZlcnNpb24gdmVyc2lvbjsKLQotCVByb3ZpZGVkQ2FwYWJpbGl0eShTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobmFtZXNwYWNlKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChuYW1lKTsKLQkJdGhpcy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb24gPT0gbnVsbCA/IFZlcnNpb24uZW1wdHlWZXJzaW9uIDogdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0JCWlmIChvdGhlciBpbnN0YW5jZW9mIFByb3ZpZGVkQ2FwYWJpbGl0eSkgewotCQkJUHJvdmlkZWRDYXBhYmlsaXR5IG90aGVyQ2FwYWJpbGl0eSA9IChQcm92aWRlZENhcGFiaWxpdHkpIG90aGVyOwotCQkJcmV0dXJuIG90aGVyQ2FwYWJpbGl0eS5uYW1lc3BhY2UuZXF1YWxzKG5hbWVzcGFjZSkgJiYgb3RoZXJDYXBhYmlsaXR5Lm5hbWUuZXF1YWxzKG5hbWUpICYmIG90aGVyQ2FwYWJpbGl0eS52ZXJzaW9uLmVxdWFscyh2ZXJzaW9uKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgVmVyc2lvbiBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlLmhhc2hDb2RlKCkgKiBuYW1lLmhhc2hDb2RlKCkgKiB2ZXJzaW9uLmhhc2hDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogVE9ETyBUaGUgbmFtZSBvZiB0aGlzIG1ldGhvZCBpcyBiYWNrd2FyZHMuIEEgcHJvdmlkZWQgY2FwYWJpbGl0eSBkb2VzIG5vdAotCSAqIGdldCBzYXRpc2ZpZWQgLSBpdCBpcyB0aGUgcmVxdWlyZWQgY2FwYWJpbGl0eSB0aGF0IGlzIHNhdGlzZmllZCBvciBub3QuIEl0IHNob3VsZCBiZSAic2F0aXNmaWVzIgotCSAqIG9yICJpc1NhdGlzZmllZCIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdGlzZmllZEJ5KFJlcXVpcmVkQ2FwYWJpbGl0eSBjYW5kaWRhdGUpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsIHx8ICFnZXROYW1lKCkuZXF1YWxzKGNhbmRpZGF0ZS5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZ2V0TmFtZXNwYWNlKCkgPT0gbnVsbCB8fCAhZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKGNhbmRpZGF0ZS5nZXROYW1lc3BhY2UoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjYW5kaWRhdGUuZ2V0UmFuZ2UoKS5pc0luY2x1ZGVkKHZlcnNpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2UgKyAnLycgKyBuYW1lICsgJy8nICsgdmVyc2lvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9SZXF1aXJlZENhcGFiaWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9SZXF1aXJlZENhcGFiaWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwNThhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvUmVxdWlyZWRDYXBhYmlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGE7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci0KLS8qKgotICogQSByZXF1aXJlZCBjYXBhYmlsaXR5IHJlcHJlc2VudHMgc29tZSBleHRlcm5hbCBjb25zdHJhaW50IG9uIGFuIHtAbGluayBJSW5zdGFsbGFibGVVbml0fS4KLSAqIEVhY2ggY2FwYWJpbGl0eSByZXByZXNlbnRzIHNvbWV0aGluZyBhbiB7QGxpbmsgSUluc3RhbGxhYmxlVW5pdH0gbmVlZHMgdGhhdAotICogaXQgZXhwZWN0cyB0byBiZSBwcm92aWRlZCBieSBhbm90aGVyIHtAbGluayBJSW5zdGFsbGFibGVVbml0fS4gQ2FwYWJpbGl0aWVzIGFyZQotICogZW50aXJlbHkgZ2VuZXJpYywgYW5kIGFyZSBpbnRlbmRlZCB0byBiZSBjYXBhYmxlIG9mIHJlcHJlc2VudGluZyBhbnl0aGluZyB0aGF0Ci0gKiBhbiB7QGxpbmsgSUluc3RhbGxhYmxlVW5pdH0gbWF5IG5lZWQgZWl0aGVyIGF0IGluc3RhbGwgdGltZSwgb3IgYXQgcnVudGltZS4KLSAqIDxwPgotICogQ2FwYWJpbGl0aWVzIGFyZSBzZWdtZW50ZWQgaW50byBuYW1lc3BhY2VzLiAgQW55b25lIGNhbiBpbnRyb2R1Y2UgbmV3IAotICogY2FwYWJpbGl0eSBuYW1lc3BhY2VzLiBTb21lIHdlbGwta25vd24gbmFtZXNwYWNlcyBhcmUgaW50cm9kdWNlZCBkaXJlY3RseQotICogYnkgdGhlIHByb3Zpc2lvbmluZyBmcmFtZXdvcmsuCi0gKiAKLSAqIEBzZWUgSUluc3RhbGxhYmxlVW5pdCNOQU1FU1BBQ0VfSVVfSUQKLSAqLwotcHVibGljIGNsYXNzIFJlcXVpcmVkQ2FwYWJpbGl0eSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gTk9fU0VMRUNUT1JTID0gbmV3IFN0cmluZ1swXTsKLQotCXByaXZhdGUgU3RyaW5nIGZpbHRlcjsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gbXVsdGlwbGU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsvL25ldmVyIG51bGwKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lc3BhY2U7Ly9uZXZlciBudWxsCi0JcHJpdmF0ZSBib29sZWFuIG9wdGlvbmFsOwotCXByaXZhdGUgYm9vbGVhbiBncmVlZHkgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgVmVyc2lvblJhbmdlIHJhbmdlOy8vbmV2ZXIgbnVsbAotCXByaXZhdGUgU3RyaW5nW10gc2VsZWN0b3JzID0gTk9fU0VMRUNUT1JTOy8vbmV2ZXIgbnVsbAotCi0JUmVxdWlyZWRDYXBhYmlsaXR5KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBWZXJzaW9uUmFuZ2UgcmFuZ2UsIFN0cmluZyBmaWx0ZXIsIGJvb2xlYW4gb3B0aW9uYWwsIGJvb2xlYW4gbXVsdGlwbGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChuYW1lc3BhY2UpOwotCQlBc3NlcnQuaXNOb3ROdWxsKG5hbWUpOwotCQl0aGlzLm5hbWVzcGFjZSA9IG5hbWVzcGFjZTsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJdGhpcy5yYW5nZSA9IHJhbmdlID09IG51bGwgPyBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSA6IHJhbmdlOwotCQl0aGlzLm9wdGlvbmFsID0gb3B0aW9uYWw7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCQl0aGlzLm11bHRpcGxlID0gbXVsdGlwbGU7Ci0JfQotCi0JUmVxdWlyZWRDYXBhYmlsaXR5KFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBWZXJzaW9uUmFuZ2UgcmFuZ2UsIFN0cmluZyBmaWx0ZXIsIGJvb2xlYW4gb3B0aW9uYWwsIGJvb2xlYW4gbXVsdGlwbGUsIGJvb2xlYW4gZ3JlZWR5KSB7Ci0JCXRoaXMobmFtZXNwYWNlLCBuYW1lLCByYW5nZSwgZmlsdGVyLCBvcHRpb25hbCwgbXVsdGlwbGUpOwotCQl0aGlzLmdyZWVkeSA9IGdyZWVkeTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZmluYWwgUmVxdWlyZWRDYXBhYmlsaXR5IG90aGVyID0gKFJlcXVpcmVkQ2FwYWJpbGl0eSkgb2JqOwotCQlpZiAoZmlsdGVyID09IG51bGwpIHsKLQkJCWlmIChvdGhlci5maWx0ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIWZpbHRlci5lcXVhbHMob3RoZXIuZmlsdGVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG11bHRpcGxlICE9IG90aGVyLm11bHRpcGxlKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIW5hbWUuZXF1YWxzKG90aGVyLm5hbWUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIW5hbWVzcGFjZS5lcXVhbHMob3RoZXIubmFtZXNwYWNlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9wdGlvbmFsICE9IG90aGVyLm9wdGlvbmFsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIXJhbmdlLmVxdWFscyhvdGhlci5yYW5nZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gZmlsdGVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmFuZ2Ugb2YgdmVyc2lvbnMgdGhhdCBzYXRpc2Z5IHRoaXMgcmVxdWlyZWQgY2FwYWJpbGl0eS4gUmV0dXJucwotCSAqIGFuIGVtcHR5IHZlcnNpb24gcmFuZ2UgKHtAbGluayBWZXJzaW9uUmFuZ2UjZW1wdHlSYW5nZX0gaWYgYW55IHZlcnNpb24KLQkgKiB3aWxsIHNhdGlzZnkgdGhlIGNhcGFiaWxpdHkuCi0JICogQHJldHVybiB0aGUgcmFuZ2Ugb2YgdmVyc2lvbnMgdGhhdCBzYXRpc2Z5IHRoaXMgcmVxdWlyZWQgY2FwYWJpbGl0eS4KLQkgKi8KLQlwdWJsaWMgVmVyc2lvblJhbmdlIGdldFJhbmdlKCkgewotCQlyZXR1cm4gcmFuZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvcGVydGllcyB0byB1c2UgZm9yIGV2YWx1YXRpbmcgcmVxdWlyZWQgY2FwYWJpbGl0eSBmaWx0ZXJzIAotCSAqIGRvd25zdHJlYW0gZnJvbSB0aGlzIGNhcGFiaWxpdHkuIEZvciBleGFtcGxlLCBpZiB0aGUgc2VsZWN0b3IgImRvYyIKLQkgKiBpcyBwcm92aWRlZCwgdGhlbiBhIGRvd25zdHJlYW0gSW5zdGFsbGFibGVVbml0IHdpdGggYSByZXF1aXJlZCBjYXBhYmlsaXR5Ci0JICogZmlsdGVyZWQgd2l0aCAiZG9jPXRydWUiIHdpbGwgYmUgaW5jbHVkZWQuCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldFNlbGVjdG9ycygpIHsKLQkJcmV0dXJuIHNlbGVjdG9yczsKLQl9Ci0KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLQkJaW50IHJlc3VsdCA9IDE7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKChmaWx0ZXIgPT0gbnVsbCkgPyAwIDogZmlsdGVyLmhhc2hDb2RlKCkpOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIChtdWx0aXBsZSA/IDEyMzEgOiAxMjM3KTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBuYW1lLmhhc2hDb2RlKCk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgbmFtZXNwYWNlLmhhc2hDb2RlKCk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKG9wdGlvbmFsID8gMTIzMSA6IDEyMzcpOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIHJhbmdlLmhhc2hDb2RlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNNdWx0aXBsZSgpIHsKLQkJcmV0dXJuIG11bHRpcGxlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKSB7Ci0JCXJldHVybiBvcHRpb25hbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoU3RyaW5nIGZpbHRlcikgewotCQl0aGlzLmZpbHRlciA9IGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RvcnMoU3RyaW5nW10gc2VsZWN0b3JzKSB7Ci0JCXRoaXMuc2VsZWN0b3JzID0gc2VsZWN0b3JzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzR3JlZWR5KCkgewotCQlyZXR1cm4gZ3JlZWR5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAicmVxdWlyZWRDYXBhYmlsaXR5OiAiICsgbmFtZXNwYWNlICsgJy8nICsgbmFtZSArICcvJyArIHJhbmdlOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL1JlcXVpcmVtZW50Q2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvUmVxdWlyZW1lbnRDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhNzhlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvUmVxdWlyZW1lbnRDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBSZXF1aXJlbWVudENoYW5nZSB7Ci0JcHJpdmF0ZSBSZXF1aXJlZENhcGFiaWxpdHkgYXBwbHlPbjsKLQlwcml2YXRlIFJlcXVpcmVkQ2FwYWJpbGl0eSBuZXdWYWx1ZTsKLQotCXB1YmxpYyBSZXF1aXJlbWVudENoYW5nZShSZXF1aXJlZENhcGFiaWxpdHkgYXBwbHlPbjIsIFJlcXVpcmVkQ2FwYWJpbGl0eSBuZXdWYWx1ZTIpIHsKLQkJaWYgKGFwcGx5T24yID09IG51bGwgJiYgbmV3VmFsdWUyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXRoaXMuYXBwbHlPbiA9IGFwcGx5T24yOwotCQl0aGlzLm5ld1ZhbHVlID0gbmV3VmFsdWUyOwotCX0KLQotCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHkgYXBwbHlPbigpIHsKLQkJcmV0dXJuIGFwcGx5T247Ci0JfQotCi0JcHVibGljIFJlcXVpcmVkQ2FwYWJpbGl0eSBuZXdWYWx1ZSgpIHsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoZXMoUmVxdWlyZWRDYXBhYmlsaXR5IHRvTWF0Y2gpIHsKLQkJaWYgKCF0b01hdGNoLmdldE5hbWVzcGFjZSgpLmVxdWFscyhhcHBseU9uLmdldE5hbWVzcGFjZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCF0b01hdGNoLmdldE5hbWUoKS5lcXVhbHMoYXBwbHlPbi5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodG9NYXRjaC5nZXRSYW5nZSgpLmVxdWFscyhhcHBseU9uLmdldFJhbmdlKCkpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGludGVyc2VjdCh0b01hdGNoLmdldFJhbmdlKCksIGFwcGx5T24uZ2V0UmFuZ2UoKSkgPT0gbnVsbCA/IGZhbHNlIDogdHJ1ZTsKLQl9Ci0KLQlib29sZWFuIG1hdGNoZXMoUmVxdWlyZW1lbnRDaGFuZ2UgdG9NYXRjaCkgewotCQlyZXR1cm4gbWF0Y2hlcyh0b01hdGNoLmFwcGx5T24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIFJlcXVpcmVtZW50Q2hhbmdlIG1lcmdlKFJlcXVpcmVtZW50Q2hhbmdlIHIyKSB7Ci0JCVZlcnNpb25SYW5nZSByZXN1bHQgPSBpbnRlcnNlY3QobmV3VmFsdWUoKS5nZXRSYW5nZSgpLCByMi5uZXdWYWx1ZSgpLmdldFJhbmdlKCkpOwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBSZXF1aXJlbWVudENoYW5nZShhcHBseU9uLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KGFwcGx5T24uZ2V0TmFtZXNwYWNlKCksIGFwcGx5T24uZ2V0TmFtZSgpLCByZXN1bHQsIG51bGwsIGZhbHNlLCBmYWxzZSkpOwotCX0KLQotCXByaXZhdGUgVmVyc2lvblJhbmdlIGludGVyc2VjdChWZXJzaW9uUmFuZ2UgcjEsIFZlcnNpb25SYW5nZSByMikgewotCQlWZXJzaW9uIHJlc3VsdE1pbiA9IG51bGw7Ci0JCWJvb2xlYW4gcmVzdWx0TWluSW5jbHVkZWQgPSBmYWxzZTsKLQkJVmVyc2lvbiByZXN1bHRNYXggPSBudWxsOwotCQlib29sZWFuIHJlc3VsdE1heEluY2x1ZGVkID0gZmFsc2U7Ci0KLQkJaW50IG1pbkNvbXBhcmUgPSByMS5nZXRNaW5pbXVtKCkuY29tcGFyZVRvKHIyLmdldE1pbmltdW0oKSk7Ci0JCWlmIChtaW5Db21wYXJlIDwgMCkgewotCQkJcmVzdWx0TWluID0gcjIuZ2V0TWluaW11bSgpOwotCQkJcmVzdWx0TWluSW5jbHVkZWQgPSByMi5nZXRJbmNsdWRlTWluaW11bSgpOwotCQl9IGVsc2UgaWYgKG1pbkNvbXBhcmUgPiAwKSB7Ci0JCQlyZXN1bHRNaW4gPSByMS5nZXRNaW5pbXVtKCk7Ci0JCQlyZXN1bHRNaW5JbmNsdWRlZCA9IHIxLmdldEluY2x1ZGVNaW5pbXVtKCk7Ci0JCX0gZWxzZSBpZiAobWluQ29tcGFyZSA9PSAwKSB7Ci0JCQlyZXN1bHRNaW4gPSByMS5nZXRNaW5pbXVtKCk7Ci0JCQlyZXN1bHRNaW5JbmNsdWRlZCA9IHIxLmdldEluY2x1ZGVNaW5pbXVtKCkgJiYgcjIuZ2V0SW5jbHVkZU1pbmltdW0oKTsKLQkJfQotCi0JCWludCBtYXhDb21wYXJlID0gcjEuZ2V0TWF4aW11bSgpLmNvbXBhcmVUbyhyMi5nZXRNYXhpbXVtKCkpOwotCQlpZiAobWF4Q29tcGFyZSA+IDApIHsKLQkJCXJlc3VsdE1heCA9IHIyLmdldE1heGltdW0oKTsKLQkJCXJlc3VsdE1heEluY2x1ZGVkID0gcjIuZ2V0SW5jbHVkZU1heGltdW0oKTsKLQkJfSBlbHNlIGlmIChtYXhDb21wYXJlIDwgMCkgewotCQkJcmVzdWx0TWF4ID0gcjEuZ2V0TWF4aW11bSgpOwotCQkJcmVzdWx0TWF4SW5jbHVkZWQgPSByMS5nZXRJbmNsdWRlTWF4aW11bSgpOwotCQl9IGVsc2UgaWYgKG1heENvbXBhcmUgPT0gMCkgewotCQkJcmVzdWx0TWF4ID0gcjEuZ2V0TWF4aW11bSgpOwotCQkJcmVzdWx0TWF4SW5jbHVkZWQgPSByMS5nZXRJbmNsdWRlTWF4aW11bSgpICYmIHIyLmdldEluY2x1ZGVNYXhpbXVtKCk7Ci0JCX0KLQotCQlpbnQgcmVzdWx0UmFuZ2VDb21wYXJpc29uID0gcmVzdWx0TWluLmNvbXBhcmVUbyhyZXN1bHRNYXgpOwotCQlpZiAocmVzdWx0UmFuZ2VDb21wYXJpc29uIDwgMCkKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHJlc3VsdE1pbiwgcmVzdWx0TWluSW5jbHVkZWQsIHJlc3VsdE1heCwgcmVzdWx0TWF4SW5jbHVkZWQpOwotCQllbHNlIGlmIChyZXN1bHRSYW5nZUNvbXBhcmlzb24gPT0gMCAmJiByZXN1bHRNaW5JbmNsdWRlZCA9PSByZXN1bHRNYXhJbmNsdWRlZCkKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHJlc3VsdE1pbiwgcmVzdWx0TWluSW5jbHVkZWQsIHJlc3VsdE1heCwgcmVzdWx0TWF4SW5jbHVkZWQpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBhdGlibGUoUmVxdWlyZW1lbnRDaGFuZ2Ugb3RoZXIpIHsKLQkJcmV0dXJuIGludGVyc2VjdChuZXdWYWx1ZS5nZXRSYW5nZSgpLCBvdGhlci5uZXdWYWx1ZS5nZXRSYW5nZSgpKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWZpbmFsIGludCBwcmltZSA9IDMxOwotCQlpbnQgcmVzdWx0ID0gMTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGFwcGx5T24gPT0gbnVsbCkgPyAwIDogYXBwbHlPbi5oYXNoQ29kZSgpKTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKG5ld1ZhbHVlID09IG51bGwpID8gMCA6IG5ld1ZhbHVlLmhhc2hDb2RlKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmaW5hbCBSZXF1aXJlbWVudENoYW5nZSBvdGhlciA9IChSZXF1aXJlbWVudENoYW5nZSkgb2JqOwotCQlpZiAoYXBwbHlPbiA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIuYXBwbHlPbiAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghYXBwbHlPbi5lcXVhbHMob3RoZXIuYXBwbHlPbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIubmV3VmFsdWUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0gZWxzZSBpZiAoIW5ld1ZhbHVlLmVxdWFscyhvdGhlci5uZXdWYWx1ZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9Ub3VjaHBvaW50RGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL1RvdWNocG9pbnREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMzFhZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL1RvdWNocG9pbnREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1wdWJsaWMgY2xhc3MgVG91Y2hwb2ludERhdGEgewotCi0JLyoqCi0JICogTWFwIG9mIChTdHJpbmctPlN0cmluZykuIFRoZSB2YWx1ZXMgcmVwcmVzZW50IHRoZSBpbnN0cnVjdGlvbnMuIFRoZSBzZXQgCi0JICogb2Yga2V5cyBzdXBwb3J0ZWQgaXMgdXAgdG8gdGhlIHRvdWNocG9pbnQgdGhhdCB3aWxsIHByb2Nlc3MgdGhlc2UgCi0JICogaW5zdHJ1Y3Rpb25zLiBUaGlzIG1hcCBpcyBuZXZlciBudWxsLgotCSAqLwotCXByaXZhdGUgTWFwIGluc3RydWN0aW9uczsKLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWZpbmFsIGludCBwcmltZSA9IDMxOwotCQlpbnQgcmVzdWx0ID0gMTsKLQkJcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyAoKGluc3RydWN0aW9ucyA9PSBudWxsKSA/IDAgOiBpbnN0cnVjdGlvbnMuaGFzaENvZGUoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZpbmFsIFRvdWNocG9pbnREYXRhIG90aGVyID0gKFRvdWNocG9pbnREYXRhKSBvYmo7Ci0JCWlmIChpbnN0cnVjdGlvbnMgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLmluc3RydWN0aW9ucyAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghaW5zdHJ1Y3Rpb25zLmVxdWFscyhvdGhlci5pbnN0cnVjdGlvbnMpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlUb3VjaHBvaW50RGF0YShNYXAgaW5zdHJ1Y3Rpb25zKSB7Ci0JCXRoaXMuaW5zdHJ1Y3Rpb25zID0gaW5zdHJ1Y3Rpb25zOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5zdHJ1Y3Rpb25zKFN0cmluZyBpbnN0cnVjdGlvbktleSkgewotCQlyZXR1cm4gKFN0cmluZykgaW5zdHJ1Y3Rpb25zLmdldChpbnN0cnVjdGlvbktleSk7Ci0JfQotCi0JLy8gUmV0dXJuIGFuIHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbnMKLQkvLyBpbiB0aGUgdG91Y2hwb2ludCBkYXRhLgotCXB1YmxpYyBNYXAgZ2V0SW5zdHJ1Y3Rpb25zKCkgewotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGluc3RydWN0aW9ucyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL1RvdWNocG9pbnRUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvVG91Y2hwb2ludFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkMTMxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvVG91Y2hwb2ludFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogSWRlbnRpZmllcyBhIHBhcnRpY3VsYXIgdG91Y2hwb2ludC4gQSB0b3VjaHBvaW50IGlzIGlkZW50aWZpZWQgYnkgYW4gaWQgCi0gKiBhbmQgYSB2ZXJzaW9uLgotICovCi1wdWJsaWMgY2xhc3MgVG91Y2hwb2ludFR5cGUgewotCS8qKgotCSAqIEEgdG91Y2hwb2ludCB0eXBlIGluZGljYXRpbmcgdGhhdCB0aGUgIm51bGwiIHRvdWNocG9pbnQgc2hvdWxkIGJlIHVzZWQuCi0JICogVGhlIG51bGwgdG91Y2hwb2ludCBkb2VzIG5vdCBwYXJ0aWNpcGF0ZSBpbiBhbnkgaW5zdGFsbCBwaGFzZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRvdWNocG9pbnRUeXBlIE5PTkUgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludFR5cGUoIm51bGwiLCBWZXJzaW9uLmVtcHR5VmVyc2lvbik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGlkOy8vbmV2ZXIgbnVsbAotCXByaXZhdGUgVmVyc2lvbiB2ZXJzaW9uOy8vbmV2ZXIgbnVsbAotCi0JVG91Y2hwb2ludFR5cGUoU3RyaW5nIGlkLCBWZXJzaW9uIGFWZXJzaW9uKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy52ZXJzaW9uID0gYVZlcnNpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChzdXBlci5lcXVhbHMob2JqKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJVG91Y2hwb2ludFR5cGUgb3RoZXIgPSAoVG91Y2hwb2ludFR5cGUpIG9iajsKLQkJcmV0dXJuIGlkLmVxdWFscyhvdGhlci5pZCkgJiYgdmVyc2lvbi5lcXVhbHMob3RoZXIudmVyc2lvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiAzMSAqIGlkLmhhc2hDb2RlKCkgKyB2ZXJzaW9uLmhhc2hDb2RlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJUb3VjaHBvaW50OiAiICsgaWQgKyAnICcgKyBnZXRWZXJzaW9uKCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL3F1ZXJ5L0NhcGFiaWxpdHlRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL3F1ZXJ5L0NhcGFiaWxpdHlRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTY5ODJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9xdWVyeS9DYXBhYmlsaXR5UXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci0KLS8qKgotICogQSBxdWVyeSB0aGF0IHNlYXJjaGVzIGZvciB7QGxpbmsgSUluc3RhbGxhYmxlVW5pdH0gaW5zdGFuY2VzIHRoYXQgcHJvdmlkZQotICogY2FwYWJpbGl0aWVzIHRoYXQgbWF0Y2ggb25lIG9yIG1vcmUgcmVxdWlyZWQgY2FwYWJpbGl0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgQ2FwYWJpbGl0eVF1ZXJ5IGV4dGVuZHMgUXVlcnkgewotCXByaXZhdGUgUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZWQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHF1ZXJ5IG9uIHRoZSBnaXZlbiByZXF1aXJlZCBjYXBhYmlsaXR5LgotCSAqIEBwYXJhbSByZXF1aXJlZCBUaGUgcmVxdWlyZWQgY2FwYWJpbGl0eQotCSAqLwotCXB1YmxpYyBDYXBhYmlsaXR5UXVlcnkoUmVxdWlyZWRDYXBhYmlsaXR5IHJlcXVpcmVkKSB7Ci0JCXRoaXMucmVxdWlyZWQgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge3JlcXVpcmVkfTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHF1ZXJ5IG9uIHRoZSBnaXZlbiByZXF1aXJlZCBjYXBhYmlsaXRpZXMuIFRoZSBpbnN0YWxsYWJsZQotCSAqIHVuaXQgbXVzdCBwcm92aWRlIGNhcGFiaWxpdGllcyB0aGF0IG1hdGNoIGFsbCBvZiB0aGUgZ2l2ZW4gcmVxdWlyZWQgY2FwYWJpbGl0aWVzCi0JICogZm9yIHRoaXMgcXVlcnkgdG8gYmUgc2F0aXNmaWVkLgotCSAqIEBwYXJhbSByZXF1aXJlZCBUaGUgcmVxdWlyZWQgY2FwYWJpbGl0aWVzCi0JICovCi0JcHVibGljIENhcGFiaWxpdHlRdWVyeShSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZCkgewotCQl0aGlzLnJlcXVpcmVkID0gcmVxdWlyZWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVxdWlyZWQgY2FwYWJpbGl0eSB0aGF0IHRoaXMgcXVlcnkgaXMgbWF0Y2hpbmcgYWdhaW5zdC4KLQkgKiBAcmV0dXJuIHRoZSByZXF1aXJlZCBjYXBhYmlsaXR5IHRoYXQgdGhpcyBxdWVyeSBpcyBtYXRjaGluZyBhZ2FpbnN0LgotCSAqLwotCXB1YmxpYyBSZXF1aXJlZENhcGFiaWxpdHlbXSBnZXRSZXF1aXJlZENhcGFiaWxpdGllcygpIHsKLQkJcmV0dXJuIHJlcXVpcmVkOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIucXVlcnkyLlF1ZXJ5I2lzTWF0Y2goamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgSUluc3RhbGxhYmxlVW5pdCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgY2FuZGlkYXRlID0gKElJbnN0YWxsYWJsZVVuaXQpIG9iamVjdDsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdmlkZXMgPSBjYW5kaWRhdGUuZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZC5sZW5ndGg7IGkrKykgewotCQkJYm9vbGVhbiBzYXRpc2ZpZWQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvdmlkZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAocHJvdmlkZXNbal0uaXNTYXRpc2ZpZWRCeShyZXF1aXJlZFtpXSkpIHsKLQkJCQkJc2F0aXNmaWVkID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFzYXRpc2ZpZWQpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9xdWVyeS9JVVByb3BlcnR5UXVlcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9xdWVyeS9JVVByb3BlcnR5UXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyNTFhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvcXVlcnkvSVVQcm9wZXJ0eVF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LlF1ZXJ5OwotCi0vKioKLSAqIEEgcXVlcnkgdGhhdCBzZWFyY2hlcyBmb3Ige0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9IGluc3RhbmNlcyB0aGF0IGhhdmUKLSAqIGEgcHJvcGVydHkgd2hvc2UgdmFsdWUgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgdmFsdWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBJVVByb3BlcnR5UXVlcnkgZXh0ZW5kcyBRdWVyeSB7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHlOYW1lOwotCXByaXZhdGUgU3RyaW5nIHByb3BlcnR5VmFsdWU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHF1ZXJ5IG9uIHRoZSBnaXZlbiBwcm9wZXJ0eSBuYW1lIGFuZCB2YWx1ZS4KLQkgKi8KLQlwdWJsaWMgSVVQcm9wZXJ0eVF1ZXJ5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotCQl0aGlzLnByb3BlcnR5VmFsdWUgPSBwcm9wZXJ0eVZhbHVlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIucXVlcnkyLlF1ZXJ5I2lzTWF0Y2goamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgSUluc3RhbGxhYmxlVW5pdCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgY2FuZGlkYXRlID0gKElJbnN0YWxsYWJsZVVuaXQpIG9iamVjdDsKLQkJU3RyaW5nIHZhbHVlID0gZ2V0UHJvcGVydHkoY2FuZGlkYXRlLCBwcm9wZXJ0eU5hbWUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiAodmFsdWUuZXF1YWxzKHByb3BlcnR5VmFsdWUpIHx8IHByb3BlcnR5VmFsdWUgPT0gbnVsbCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdCBpdSwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGl1LmdldFByb3BlcnR5KG5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi9tZXRhZGF0YS9xdWVyeS9JbnN0YWxsYWJsZVVuaXRRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL3F1ZXJ5L0luc3RhbGxhYmxlVW5pdFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZGI5ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL3F1ZXJ5L0luc3RhbGxhYmxlVW5pdFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIEEgcXVlcnkgdGhhdCBtYXRjaGVzIG9uIHRoZSBpZCBhbmQgdmVyc2lvbiBvZiBhbiB7QGxpbmsgSUluc3RhbGxhYmxlVW5pdH0uCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnN0YWxsYWJsZVVuaXRRdWVyeSBleHRlbmRzIFF1ZXJ5IHsKLQkvKioKLQkgKiBBIGNvbnZlbmllbmNlIHF1ZXJ5IHRoYXQgd2lsbCBtYXRjaCBhbnkge0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9Ci0JICogaXQgZW5jb3VudGVycy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEluc3RhbGxhYmxlVW5pdFF1ZXJ5IEFOWSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShudWxsKTsKLQotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgZmluYWwgVmVyc2lvblJhbmdlIHJhbmdlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHF1ZXJ5IHRoYXQgd2lsbCBtYXRjaCBhbnkge0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9IHdpdGggdGhlIGdpdmVuCi0JICogaWQsIHJlZ2FyZGxlc3Mgb2YgdmVyc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gaWQgVGhlIGluc3RhbGxhYmxlIHVuaXQgaWQgdG8gbWF0Y2gsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvIG1hdGNoIGFueSBpZAotCSAqLwotCXB1YmxpYyBJbnN0YWxsYWJsZVVuaXRRdWVyeShTdHJpbmcgaWQpIHsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnJhbmdlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcXVlcnkgdGhhdCB3aWxsIG1hdGNoIGFueSB7QGxpbmsgSUluc3RhbGxhYmxlVW5pdH0gd2l0aCB0aGUgZ2l2ZW4KLQkgKiBpZCwgYW5kIHdob3NlIHZlcnNpb24gZmFsbHMgaW4gdGhlIHByb3ZpZGVkIHJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBpZCBUaGUgaW5zdGFsbGFibGUgdW5pdCBpZCB0byBtYXRjaCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gbWF0Y2ggYW55IGlkCi0JICogQHBhcmFtIHJhbmdlIFRoZSB2ZXJzaW9uIHJhbmdlIHRvIG1hdGNoCi0JICovCi0JcHVibGljIEluc3RhbGxhYmxlVW5pdFF1ZXJ5KFN0cmluZyBpZCwgVmVyc2lvblJhbmdlIHJhbmdlKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy5yYW5nZSA9IHJhbmdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBxdWVyeSB0aGF0IHdpbGwgbWF0Y2ggYW55IHtAbGluayBJSW5zdGFsbGFibGVVbml0fSB3aXRoIHRoZSBnaXZlbgotCSAqIGlkIGFuZCB2ZXJzaW9uLgotCSAqIAotCSAqIEBwYXJhbSBpZCBUaGUgaW5zdGFsbGFibGUgdW5pdCBpZCB0byBtYXRjaCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gbWF0Y2ggYW55IGlkCi0JICogQHBhcmFtIHZlcnNpb24gVGhlIHByZWNpc2UgdmVyc2lvbiB0aGF0IGEgbWF0Y2hpbmcgdW5pdCBtdXN0IGhhdmUKLQkgKi8KLQlwdWJsaWMgSW5zdGFsbGFibGVVbml0UXVlcnkoU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnJhbmdlID0gbmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCB2ZXJzaW9uLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpZCB0aGF0IHRoaXMgcXVlcnkgd2lsbCBtYXRjaCBhZ2FpbnN0LgotCSAqIEByZXR1cm4gVGhlIGluc3RhbGxhYmxlIHVuaXQgaXQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmVyc2lvbiByYW5nZSB0aGF0IHRoaXMgcXVlcnkgd2lsbCBtYXRjaCBhZ2FpbnN0LgotCSAqIEByZXR1cm4gVGhlIGluc3RhbGxhYmxlIHVuaXQgdmVyc2lvbiByYW5nZS4KLQkgKi8KLQlwdWJsaWMgVmVyc2lvblJhbmdlIGdldFJhbmdlKCkgewotCQlyZXR1cm4gcmFuZ2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5xdWVyeTIuUXVlcnkjaXNNYXRjaChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTWF0Y2goT2JqZWN0IG9iamVjdCkgewotCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVVbml0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSUluc3RhbGxhYmxlVW5pdCBjYW5kaWRhdGUgPSAoSUluc3RhbGxhYmxlVW5pdCkgb2JqZWN0OwotCQlpZiAoaWQgIT0gbnVsbCAmJiAhaWQuZXF1YWxzKGNhbmRpZGF0ZS5nZXRJZCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHJhbmdlICE9IG51bGwgJiYgIXJhbmdlLmlzSW5jbHVkZWQoY2FuZGlkYXRlLmdldFZlcnNpb24oKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL21ldGFkYXRhL3F1ZXJ5L1VwZGF0ZVF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvcXVlcnkvVXBkYXRlUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I3MGJmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvbWV0YWRhdGEvcXVlcnkvVXBkYXRlUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSVVwZGF0ZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVF1ZXJ5IGV4dGVuZHMgUXVlcnkgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCB1cGRhdGVGcm9tOwotCi0JcHVibGljIFVwZGF0ZVF1ZXJ5KElJbnN0YWxsYWJsZVVuaXQgdXBkYXRlRnJvbSkgewotCQl0aGlzLnVwZGF0ZUZyb20gPSB1cGRhdGVGcm9tOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWF0Y2goT2JqZWN0IG9iaikgewotCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVVbml0KSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSUluc3RhbGxhYmxlVW5pdCBjYW5kaWRhdGUgPSAoSUluc3RhbGxhYmxlVW5pdCkgb2JqOwotCQlJVXBkYXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gY2FuZGlkYXRlLmdldFVwZGF0ZURlc2NyaXB0b3IoKTsKLQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCAmJiBkZXNjcmlwdG9yLmlzVXBkYXRlT2YodXBkYXRlRnJvbSkgJiYgdXBkYXRlRnJvbS5nZXRWZXJzaW9uKCkuY29tcGFyZVRvKGNhbmRpZGF0ZS5nZXRWZXJzaW9uKCkpIDwgMCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjM3OTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIG91dHB1dD0iYmluX2FudCIgcGF0aD0ic3JjX2FudCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNDA3M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGVtcC5mb2xkZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5leHRlcm5hbFRvb2xCdWlsZGVycy9CdWlsZCBNZXRhZGF0YSBHZW5lcmF0b3IgQW50IFRhc2tzLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIE1ldGFkYXRhIEdlbmVyYXRvciBBbnQgVGFza3MubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzljM2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIE1ldGFkYXRhIEdlbmVyYXRvciBBbnQgVGFza3MubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9UQVJHRVRTX1VQREFURUQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5ERUZBVUxUX1ZNX0lOU1RBTEwiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuQVRUUl9SRUZSRVNIX1NDT1BFIiB2YWx1ZT0iJHtwcm9qZWN0fSIvPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iNCIvPgotPC9saXN0QXR0cmlidXRlPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkNMQVNTUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC51aS5BbnRDbGFzc3BhdGhQcm92aWRlciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkRFRkFVTFRfQ0xBU1NQQVRIIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWx9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9IiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfVFJJR0dFUlNfQ09ORklHVVJFRCIgdmFsdWU9InRydWUiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIFB1Ymxpc2hlciBBbnQgVGFza3MubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgUHVibGlzaGVyIEFudCBUYXNrcy5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZWVjOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQnVpbGQgUHVibGlzaGVyIEFudCBUYXNrcy5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UuYW50LkFudEJ1aWxkZXJMYXVuY2hDb25maWd1cmF0aW9uVHlwZSI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5BVFRSX1RBUkdFVFNfVVBEQVRFRCIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuYW50LnVpLkRFRkFVTFRfVk1fSU5TVEFMTCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5BVFRSX1JFRlJFU0hfU0NPUEUiIHZhbHVlPSIke3dvcmtzcGFjZX0iLz4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfUEFUSFMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iMSIvPgotPC9saXN0QXR0cmlidXRlPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkNMQVNTUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC51aS5BbnRDbGFzc3BhdGhQcm92aWRlciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkRFRkFVTFRfQ0xBU1NQQVRIIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWx9Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5BVFRSX1JVTl9CVUlMRF9LSU5EUyIgdmFsdWU9IiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfVFJJR0dFUlNfQ09ORklHVVJFRCIgdmFsdWU9InRydWUiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGE0M2ZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xCdWlsZGVyPC9uYW1lPgotCQkJPHRyaWdnZXJzPmZ1bGwsaW5jcmVtZW50YWwsPC90cmlnZ2Vycz4KLQkJCTxhcmd1bWVudHM+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+TGF1bmNoQ29uZmlnSGFuZGxlPC9rZXk+Ci0JCQkJCTx2YWx1ZT4mbHQ7cHJvamVjdCZndDsvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0J1aWxkIFB1Ymxpc2hlciBBbnQgVGFza3MubGF1bmNoPC92YWx1ZT4KLQkJCQk8L2RpY3Rpb25hcnk+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYmJiNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotI1N1biBNYXIgMDkgMTc6MDM6MzIgRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYWxsdGhyb3VnaENhc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhdGFsT3B0aW9uYWxFcnJvcj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubnVsbFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBhcmFtZXRlckFzc2lnbm1lbnQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG90ZW50aWFsTnVsbFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmF3VHlwZVJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX2xvY2FsX3ZhcmlhYmxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uX29uX21lbWJlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbl9vbl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYTY3ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotI1NhdCBNYXIgMDggMTU6Mzg6NTUgRVNUIDIwMDgKLWNsZWFudXBfc2V0dGluZ3NfdmVyc2lvbj0yCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT11c2VyCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5qYXZhZG9jPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTk5Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcz48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJnZXR0ZXJjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBnZXR0ZXIgbWV0aG9kIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmNvbW1lbnQiIG5hbWVcPSJnZXR0ZXJjb21tZW50Ij4vKipcclxuICogQHJldHVybiB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ic2V0dGVyY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3Igc2V0dGVyIG1ldGhvZCIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJjb21tZW50IiBuYW1lXD0ic2V0dGVyY29tbWVudCI+LyoqXHJcbiAqIEBwYXJhbSAke3BhcmFtfSB0aGUgJHtiYXJlX2ZpZWxkX25hbWV9IHRvIHNldFxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNvbnN0cnVjdG9yY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgY3JlYXRlZCBjb25zdHJ1Y3RvcnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jjb21tZW50IiBuYW1lXD0iY29uc3RydWN0b3Jjb21tZW50Ij4vKipcclxuICogJHt0YWdzfVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpbGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIEphdmEgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuZmlsZWNvbW1lbnQiIG5hbWVcPSJmaWxlY29tbWVudCI+LyoqXHJcbiAqIFxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9InR5cGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBjcmVhdGVkIHR5cGVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLnR5cGVjb21tZW50IiBuYW1lXD0idHlwZWNvbW1lbnQiPi8qKlxyXG4gKlxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImZpZWxkY29tbWVudF9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29tbWVudCBmb3IgZmllbGRzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmZpZWxkY29tbWVudCIgbmFtZVw9ImZpZWxkY29tbWVudCIvPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im1ldGhvZGNvbW1lbnRfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvbW1lbnQgZm9yIG5vbi1vdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubWV0aG9kY29tbWVudCIgbmFtZVw9Im1ldGhvZGNvbW1lbnQiPi8qKlxyXG4gKiAke3RhZ3N9XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ib3ZlcnJpZGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBvdmVycmlkaW5nIG1ldGhvZHMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMub3ZlcnJpZGVjb21tZW50IiBuYW1lXD0ib3ZlcnJpZGVjb21tZW50Ij4vKiAobm9uLUphdmFkb2MpXHJcbiAqICR7c2VlX3RvX292ZXJyaWRkZW59XHJcbiAqLzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iZGVsZWdhdGVjb21tZW50X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb21tZW50IGZvciBkZWxlZ2F0ZSBtZXRob2RzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmRlbGVnYXRlY29tbWVudCIgbmFtZVw9ImRlbGVnYXRlY29tbWVudCI+LyoqXHJcbiAqICR7dGFnc31cclxuICogJHtzZWVfdG9fdGFyZ2V0fVxyXG4gKi88L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9Im5ld3R5cGVfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9Ik5ld2x5IGNyZWF0ZWQgZmlsZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMubmV3dHlwZSIgbmFtZVw9Im5ld3R5cGUiPiR7cGFja2FnZV9kZWNsYXJhdGlvbn1cclxuXHJcbiR7dHlwZWNvbW1lbnR9XHJcbiR7dHlwZV9kZWNsYXJhdGlvbn08L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNsYXNzYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBuZXcgY2xhc3MgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY2xhc3Nib2R5IiBuYW1lXD0iY2xhc3Nib2R5Ij5cclxuPC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJpbnRlcmZhY2Vib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBpbnRlcmZhY2UgdHlwZSBib2RpZXMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuaW50ZXJmYWNlYm9keSIgbmFtZVw9ImludGVyZmFjZWJvZHkiPlxyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImVudW1ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBlbnVtIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmVudW1ib2R5IiBuYW1lXD0iZW51bWJvZHkiPlxyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImFubm90YXRpb25ib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIG5ldyBhbm5vdGF0aW9uIHR5cGUgYm9kaWVzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmFubm90YXRpb25ib2R5IiBuYW1lXD0iYW5ub3RhdGlvbmJvZHkiPlxyXG48L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImNhdGNoYmxvY2tfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gbmV3IGNhdGNoIGJsb2NrcyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5jYXRjaGJsb2NrIiBuYW1lXD0iY2F0Y2hibG9jayI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9ja1xyXG4ke2V4Y2VwdGlvbl92YXJ9LnByaW50U3RhY2tUcmFjZSgpOzwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0ibWV0aG9kYm9keV9jb250ZXh0IiBkZWxldGVkXD0iZmFsc2UiIGRlc2NyaXB0aW9uXD0iQ29kZSBpbiBjcmVhdGVkIG1ldGhvZCBzdHVicyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5tZXRob2Rib2R5IiBuYW1lXD0ibWV0aG9kYm9keSI+Ly8gJHt0b2RvfSBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YlxyXG4ke2JvZHlfc3RhdGVtZW50fTwvdGVtcGxhdGU+PHRlbXBsYXRlIGF1dG9pbnNlcnRcPSJ0cnVlIiBjb250ZXh0XD0iY29uc3RydWN0b3Jib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgY29uc3RydWN0b3Igc3R1YnMiIGVuYWJsZWRcPSJ0cnVlIiBpZFw9Im9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmNvZGV0ZW1wbGF0ZXMuY29uc3RydWN0b3Jib2R5IiBuYW1lXD0iY29uc3RydWN0b3Jib2R5Ij4ke2JvZHlfc3RhdGVtZW50fVxyXG4vLyAke3RvZG99IEF1dG8tZ2VuZXJhdGVkIGNvbnN0cnVjdG9yIHN0dWI8L3RlbXBsYXRlPjx0ZW1wbGF0ZSBhdXRvaW5zZXJ0XD0idHJ1ZSIgY29udGV4dFw9ImdldHRlcmJvZHlfY29udGV4dCIgZGVsZXRlZFw9ImZhbHNlIiBkZXNjcmlwdGlvblw9IkNvZGUgaW4gY3JlYXRlZCBnZXR0ZXJzIiBlbmFibGVkXD0idHJ1ZSIgaWRcPSJvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jb2RldGVtcGxhdGVzLmdldHRlcmJvZHkiIG5hbWVcPSJnZXR0ZXJib2R5Ij5yZXR1cm4gJHtmaWVsZH07PC90ZW1wbGF0ZT48dGVtcGxhdGUgYXV0b2luc2VydFw9InRydWUiIGNvbnRleHRcPSJzZXR0ZXJib2R5X2NvbnRleHQiIGRlbGV0ZWRcPSJmYWxzZSIgZGVzY3JpcHRpb25cPSJDb2RlIGluIGNyZWF0ZWQgc2V0dGVycyIgZW5hYmxlZFw9InRydWUiIGlkXD0ib3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY29kZXRlbXBsYXRlcy5zZXR0ZXJib2R5IiBuYW1lXD0ic2V0dGVyYm9keSI+JHtmaWVsZH0gXD0gJHtwYXJhbX07PC90ZW1wbGF0ZT48L3RlbXBsYXRlcz4KLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX21ldGhvZHM9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5jb3JyZWN0X2luZGVudGF0aW9uPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZV9jaGFuZ2VzX29ubHk9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdHlwZV9hYnN0cmFjdF9pZl9taXNzaW5nX21ldGhvZD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUwN2NlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1NhdCBNYXIgMDggMTQ6NTM6MjEgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9FY2xpcHNlIGluc3RhbGwgcHVibGlzaGVyLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvRWNsaXBzZSBpbnN0YWxsIHB1Ymxpc2hlci5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ODdkZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9FY2xpcHNlIGluc3RhbGwgcHVibGlzaGVyLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuRXF1aW5veExhdW5jaGVyIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlL0VjbGlwc2UgaW5zdGFsbCBwdWJsaXNoZXIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdF9hdXRvX3N0YXJ0IiB2YWx1ZT0iZmFsc2UiLz4KLTxpbnRBdHRyaWJ1dGUga2V5PSJkZWZhdWx0X3N0YXJ0X2xldmVsIiB2YWx1ZT0iNCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItY29uc29sZSAmIzEzOyYjMTA7LWNvbnNvbGVsb2cmIzEzOyYjMTA7LWFwcGxpY2F0aW9uIG9yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLkluc3RhbGxQdWJsaXNoZXImIzEzOyYjMTA7LW1ldGFkYXRhUmVwb3NpdG9yeSBmaWxlOmQ6L3RlbXAvcmVwb3MmIzEzOyYjMTA7LWFydGlmYWN0UmVwb3NpdG9yeSBmaWxlOmQ6L3RlbXAvcmVwb3MmIzEzOyYjMTA7LXNvdXJjZSBkOlxpMDMwNS56aXBcZWNsaXBzZSYjMTM7JiMxMDstdG9wIG9yZy5lY2xpcHNlLnNkay5mZWF0dXJlLmdyb3VwJiMxMzsmIzEwOy1jb25maWdzIHdpbjMyLndpbjMyLng4NiYjMTM7JiMxMDstaWQgc2RrJiMxMzsmIzEwOy12ZXJzaW9uIDMuNC4wLmkwMzA1JiMxMzsmIzEwOy1mbGF2b3IgdG9vbGluZyYjMTM7JiMxMDstcHVibGlzaEFydGlmYWN0cyYjMTM7JiMxMDstYXBwZW5kIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InBkZS52ZXJzaW9uIiB2YWx1ZT0iMy4zIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InNob3dfc2VsZWN0ZWRfb25seSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idGFyZ2V0X2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzKjMuMS4yMDAudjIwMDcxMjAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlKjMuMy4wLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcioxLjAuMTAwLnYyMDA4MDMwM0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lKjMuNC4wLnYyMDA4MDMxMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSozLjQuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgqMy4yLjEwMC52MjAwNzA1MDJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2KjEuMC4xMDAudjIwMDgwMjAxYUBkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IqMy4yLjIwMC52MjAwODAxMDdAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMqMy4yLjIwMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uKjMuNC4wLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5qb2JzKjMuNC4wLnYyMDA4MDMxMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaSozLjQuMC52MjAwODAzMTBAOixvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCoxLjAuMTAwLnYyMDA4MDMxMzEwMzBAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmNvcmUubmV0KjEuMC4xMDAuSTIwMDgwMjI2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeSozLjIuMjAwLnYyMDA3MDcxN0BkZWZhdWx0OmZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlTmFtZWRKUkUiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlcioxLjAuMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmKjEuMy4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlcioyLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHkqMS4zLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZmFiMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXI7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAKLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjEvRm91bmRhdGlvbi0xLjEsCi0gSjJTRS0xLjQKLUltcG9ydC1QYWNrYWdlOiBqYXZheC54bWwucGFyc2VycywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7Y29tbW9uPXNwbGl0LAotIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3gsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeSwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQ7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5wbHVnaW5jb252ZXJzaW9uO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXI7dmVyc2lvbj0iMS4yLjAiLAotIG9yZy5lY2xpcHNlLm9zZ2kudXRpbDt2ZXJzaW9uPSIxLjEuMCIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuNC4wIiwKLSBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbjt2ZXJzaW9uPSIxLjIuMCIsCi0gb3JnLm9zZ2kudXRpbC50cmFja2VyO3ZlcnNpb249IjEuMy4zIiwKLSBvcmcudzNjLmRvbSwKLSBvcmcueG1sLnNheCwKLSBvcmcueG1sLnNheC5oZWxwZXJzCi1CdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuQWN0aXZhdG9yCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkayIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci5wcm9kdWN0LAotIG9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC5zd3QudG9vbHM7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9Ub2FzdCBiYWNrZW5kIHB1Ymxpc2hlci5sYXVuY2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL1RvYXN0IGJhY2tlbmQgcHVibGlzaGVyLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiZjg5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL1RvYXN0IGJhY2tlbmQgcHVibGlzaGVyLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuRXF1aW5veExhdW5jaGVyIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlL1RvYXN0IGJhY2tlbmQgcHVibGlzaGVyIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfYXV0b19zdGFydCIgdmFsdWU9ImZhbHNlIi8+Ci08aW50QXR0cmlidXRlIGtleT0iZGVmYXVsdF9zdGFydF9sZXZlbCIgdmFsdWU9IjQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iaW5jbHVkZU9wdGlvbmFsIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLWNvbnNvbGUgJiMxMzsmIzEwOy1jb25zb2xlbG9nJiMxMzsmIzEwOy1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci5JbnN0YWxsUHVibGlzaGVyJiMxMzsmIzEwOy1tZXRhZGF0YVJlcG9zaXRvcnkgZmlsZTpkOi9kZW1vcy90b2FzdC9yZXBvcyYjMTM7JiMxMDstYXJ0aWZhY3RSZXBvc2l0b3J5IGZpbGU6ZDovZGVtb3MvdG9hc3QvcmVwb3MmIzEzOyYjMTA7JiMxMDsmIzEwOy1zb3VyY2UgZDovZGVtb3MvdG9hc3QvYnVpbGQvYmFja2VuZCYjMTM7JiMxMDstdG9wIG9yZy5lcXVpbm94b3NnaS50b2FzdC5iYWNrZW5kLmZlYXR1cmUuZmVhdHVyZS5ncm91cCYjMTM7JiMxMDstY29uZmlncyB3aW4zMi53aW4zMi54ODYmIzEzOyYjMTA7LWlkIG9yZy5lcXVpbm94b3NnaS50b2FzdC5iYWNrZW5kLmJhc2UmIzEzOyYjMTA7LXZlcnNpb24gMS4wLjAmIzEzOyYjMTA7LWZsYXZvciB0b2FzdCYjMTM7JiMxMDstYXBwZW5kJiMxMzsmIzEwOy1zdGFydEFsbCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5uZXQqMS4wLjEwMC5JMjAwODAyMjZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMqMy4xLjIwMC52MjAwNzEyMDNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkqMy40LjAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCoxLjAuMTAwLnYyMDA4MDMxMzEwMzBAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSozLjQuMC52MjAwODAzMTBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2kqMy40LjAudjIwMDgwMzEwQDosb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYqMS4wLjEwMC52MjAwODAyMDFhQGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcyozLjIuMjAwLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSozLjMuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IqMy4yLjIwMC52MjAwODAxMDdAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuam9icyozLjQuMC52MjAwODAzMTBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIqMS4wLjEwMC52MjAwODAzMDNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uKjMuNC4wLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VOYW1lZEpSRSIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ3b3Jrc3BhY2VfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlcioxLjAuMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbiowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eSoxLjMuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZioxLjMuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIqMi4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL1RvYXN0IGNsaWVudCBwdWJsaXNoZXIubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9Ub2FzdCBjbGllbnQgcHVibGlzaGVyLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5ODk2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL1RvYXN0IGNsaWVudCBwdWJsaXNoZXIubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5FcXVpbm94TGF1bmNoZXIiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhcHBlbmQuYXJncyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljQWRkIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljVmFsaWRhdGUiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImJvb3RzdHJhcCIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNoZWNrZWQiIHZhbHVlPSJbTk9ORV0iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJDb25maWciIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNvbmZpZ0xvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmUvVG9hc3QgY2xpZW50IHB1Ymxpc2hlciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0X2F1dG9fc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPGludEF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfc3RhcnRfbGV2ZWwiIHZhbHVlPSI0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1jb25zb2xlICYjMTM7JiMxMDstY29uc29sZWxvZyYjMTM7JiMxMDstYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIuSW5zdGFsbFB1Ymxpc2hlciYjMTM7JiMxMDstbWV0YWRhdGFSZXBvc2l0b3J5IGZpbGU6ZDovZGVtb3MvdG9hc3QvcmVwb3MmIzEzOyYjMTA7LWFydGlmYWN0UmVwb3NpdG9yeSBmaWxlOmQ6L2RlbW9zL3RvYXN0L3JlcG9zJiMxMzsmIzEwOyYjMTA7JiMxMDstc291cmNlIGQ6L2RlbW9zL3RvYXN0L2J1aWxkL2NsaWVudCYjMTM7JiMxMDstdG9wIG9yZy5lcXVpbm94b3NnaS50b2FzdC5hcHAuYmFzZS5mZWF0dXJlLmZlYXR1cmUuZ3JvdXAmIzEzOyYjMTA7LWNvbmZpZ3Mgd2luMzIud2luMzIueDg2JiMxMzsmIzEwOy1pZCBvcmcuZXF1aW5veG9zZ2kudG9hc3QuY2xpZW50LmJhc2UmIzEzOyYjMTA7LXZlcnNpb24gMS4wLjAmIzEzOyYjMTA7LWZsYXZvciB0b2FzdCYjMTM7JiMxMDstYXBwZW5kJiMxMzsmIzEwOy1zdGFydEFsbCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5uZXQqMS4wLjEwMC5JMjAwODAyMjZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMqMy4xLjIwMC52MjAwNzEyMDNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkqMy40LjAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCoxLjAuMTAwLnYyMDA4MDMxMzEwMzBAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSozLjQuMC52MjAwODAzMTBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2kqMy40LjAudjIwMDgwMzEwQDosb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYqMS4wLjEwMC52MjAwODAyMDFhQGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcyozLjIuMjAwLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSozLjMuMC52MjAwODAyMDFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IqMy4yLjIwMC52MjAwODAxMDdAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuam9icyozLjQuMC52MjAwODAzMTBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIqMS4wLjEwMC52MjAwODAzMDNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uKjMuNC4wLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VOYW1lZEpSRSIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ3b3Jrc3BhY2VfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlcioxLjAuMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbiowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eSoxLjMuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZioxLjMuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIqMi4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFiMWUwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotc291cmNlLmFudF90YXNrcy9nZW5lcmF0b3ItYW50Lmphcj1zcmNfYW50Lwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHByb2ZpbGVzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFudF90YXNrcy9nZW5lcmF0b3ItYW50LmphcixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotamFycy5jb21waWxlLm9yZGVyPS4sYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyCi1leHRyYS5hbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIgPSBwbGF0Zm9ybTovcGx1Z2luL29yZy5hcGFjaGUuYW50Ci1qYXJzLmV4dHJhLmNsYXNzcGF0aCA9IHBsYXRmb3JtOi9wbHVnaW4vb3JnLmFwYWNoZS5hbnQvbGliL2FudC5qYXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNkOGQyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJ1bmRsZU5hbWUgPSBFcXVpbm94IFByb3Zpc2lvbmluZyBQdWJsaXNoZXIKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3NDVhYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gaWQ9Ikluc3RhbGxQdWJsaXNoZXIiIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbgotICAgICAgICAgICAgY2FyZGluYWxpdHk9IjEiCi0gICAgICAgICAgICB0aHJlYWQ9Im1haW4iCi0gICAgICAgICAgICB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5JbnN0YWxsUHVibGlzaGVyQXBwbGljYXRpb24iPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uIGlkPSJQcm9kdWN0UHVibGlzaGVyIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+Ci0gICAgICA8YXBwbGljYXRpb24KLSAgICAgICAgICAgIGNhcmRpbmFsaXR5PSIxIgotICAgICAgICAgICAgdGhyZWFkPSJtYWluIgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuUHJvZHVjdFB1Ymxpc2hlckFwcGxpY2F0aW9uIj4KLSAgICAgICAgIDwvcnVuPgotICAgICAgPC9hcHBsaWNhdGlvbj4KLSAgIDwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuYW50LmNvcmUuYW50VGFza3MiPgotCQk8YW50VGFzawotCQkJbGlicmFyeT0iYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyIgotCQkJbmFtZT0icDIuZ2VuZXJhdG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLmFudC5HZW5lcmF0b3JUYXNrIj4KLQkJPC9hbnRUYXNrPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuYW50LmNvcmUuZXh0cmFDbGFzc3BhdGhFbnRyaWVzIj4KLQkJPGV4dHJhQ2xhc3NwYXRoRW50cnkgbGlicmFyeT0iYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyIi8+Ci0JPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9DREMtMS4wX0ZvdW5kYXRpb24tMS4wLnByb2ZpbGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0NEQy0xLjBfRm91bmRhdGlvbi0xLjAucHJvZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1N2EyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0NEQy0xLjBfRm91bmRhdGlvbi0xLjAucHJvZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzID0gXAotIGphdmF4Lm1pY3JvZWRpdGlvbi5pbwotb3JnLm9zZ2kuZnJhbWV3b3JrLmJvb3RkZWxlZ2F0aW9uID0gXAotIGphdmF4Lm1pY3JvZWRpdGlvbi5pbwotb3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50ID0gXAotIE9TR2kvTWluaW11bS0xLjAsXAotIE9TR2kvTWluaW11bS0xLjEsXAotIENEQy0xLjAvRm91bmRhdGlvbi0xLjAKLW9zZ2kuamF2YS5wcm9maWxlLm5hbWUgPSBDREMtMS4wL0ZvdW5kYXRpb24tMS4wCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0NEQy0xLjFfRm91bmRhdGlvbi0xLjEucHJvZmlsZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvQ0RDLTEuMV9Gb3VuZGF0aW9uLTEuMS5wcm9maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQzMDBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvQ0RDLTEuMV9Gb3VuZGF0aW9uLTEuMS5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSBcCi0gamF2YXgubWljcm9lZGl0aW9uLmlvLFwKLSBqYXZheC5taWNyb2VkaXRpb24ucGtpLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLng1MDAKLW9yZy5vc2dpLmZyYW1ld29yay5ib290ZGVsZWdhdGlvbiA9IFwKLSBqYXZheC5taWNyb2VkaXRpb24uaW8sXAotIGphdmF4Lm1pY3JvZWRpdGlvbi5wa2ksXAotIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMAotb3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50ID0gXAotIE9TR2kvTWluaW11bS0xLjAsXAotIE9TR2kvTWluaW11bS0xLjEsXAotIENEQy0xLjAvRm91bmRhdGlvbi0xLjAsXAotIENEQy0xLjEvRm91bmRhdGlvbi0xLjEKLW9zZ2kuamF2YS5wcm9maWxlLm5hbWUgPSBDREMtMS4xL0ZvdW5kYXRpb24tMS4xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0oyU0UtMS4yLnByb2ZpbGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0oyU0UtMS4yLnByb2ZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4Zjk3M2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9KMlNFLTEuMi5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSBcCi0gamF2YXguYWNjZXNzaWJpbGl0eSxcCi0gamF2YXguc3dpbmcsXAotIGphdmF4LnN3aW5nLmJvcmRlcixcCi0gamF2YXguc3dpbmcuY29sb3JjaG9vc2VyLFwKLSBqYXZheC5zd2luZy5ldmVudCxcCi0gamF2YXguc3dpbmcuZmlsZWNob29zZXIsXAotIGphdmF4LnN3aW5nLnBsYWYsXAotIGphdmF4LnN3aW5nLnBsYWYuYmFzaWMsXAotIGphdmF4LnN3aW5nLnBsYWYubWV0YWwsXAotIGphdmF4LnN3aW5nLnBsYWYubXVsdGksXAotIGphdmF4LnN3aW5nLnRhYmxlLFwKLSBqYXZheC5zd2luZy50ZXh0LFwKLSBqYXZheC5zd2luZy50ZXh0Lmh0bWwsXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbC5wYXJzZXIsXAotIGphdmF4LnN3aW5nLnRleHQucnRmLFwKLSBqYXZheC5zd2luZy50cmVlLFwKLSBqYXZheC5zd2luZy51bmRvLFwKLSBvcmcub21nLkNPUkJBLFwKLSBvcmcub21nLkNPUkJBLkR5bkFueVBhY2thZ2UsXAotIG9yZy5vbWcuQ09SQkEuT1JCUGFja2FnZSxcCi0gb3JnLm9tZy5DT1JCQS5wb3J0YWJsZSxcCi0gb3JnLm9tZy5DT1JCQS5UeXBlQ29kZVBhY2thZ2UsXAotIG9yZy5vbWcuQ29zTmFtaW5nLFwKLSBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZQotb3JnLm9zZ2kuZnJhbWV3b3JrLmJvb3RkZWxlZ2F0aW9uID0gXAotIHN1bi4qLFwKLSBjb20uc3VuLioKLW9yZy5vc2dpLmZyYW1ld29yay5leGVjdXRpb25lbnZpcm9ubWVudCA9IFwKLSBKUkUtMS4xLFwKLSBKMlNFLTEuMgotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IEoyU0UtMS4yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0oyU0UtMS4zLnByb2ZpbGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0oyU0UtMS4zLnByb2ZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZGJkZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9KMlNFLTEuMy5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSBcCi0gamF2YXguYWNjZXNzaWJpbGl0eSxcCi0gamF2YXgubmFtaW5nLFwKLSBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LFwKLSBqYXZheC5uYW1pbmcuZXZlbnQsXAotIGphdmF4Lm5hbWluZy5sZGFwLFwKLSBqYXZheC5uYW1pbmcuc3BpLFwKLSBqYXZheC5ybWksXAotIGphdmF4LnJtaS5DT1JCQSxcCi0gamF2YXguc291bmQubWlkaSxcCi0gamF2YXguc291bmQubWlkaS5zcGksXAotIGphdmF4LnNvdW5kLnNhbXBsZWQsXAotIGphdmF4LnNvdW5kLnNhbXBsZWQuc3BpLFwKLSBqYXZheC5zd2luZyxcCi0gamF2YXguc3dpbmcuYm9yZGVyLFwKLSBqYXZheC5zd2luZy5jb2xvcmNob29zZXIsXAotIGphdmF4LnN3aW5nLmV2ZW50LFwKLSBqYXZheC5zd2luZy5maWxlY2hvb3NlcixcCi0gamF2YXguc3dpbmcucGxhZixcCi0gamF2YXguc3dpbmcucGxhZi5iYXNpYyxcCi0gamF2YXguc3dpbmcucGxhZi5tZXRhbCxcCi0gamF2YXguc3dpbmcucGxhZi5tdWx0aSxcCi0gamF2YXguc3dpbmcudGFibGUsXAotIGphdmF4LnN3aW5nLnRleHQsXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbCxcCi0gamF2YXguc3dpbmcudGV4dC5odG1sLnBhcnNlcixcCi0gamF2YXguc3dpbmcudGV4dC5ydGYsXAotIGphdmF4LnN3aW5nLnRyZWUsXAotIGphdmF4LnN3aW5nLnVuZG8sXAotIGphdmF4LnRyYW5zYWN0aW9uLFwKLSBvcmcub21nLkNPUkJBLFwKLSBvcmcub21nLkNPUkJBXzJfMyxcCi0gb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUsXAotIG9yZy5vbWcuQ09SQkEuRHluQW55UGFja2FnZSxcCi0gb3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlLFwKLSBvcmcub21nLkNPUkJBLnBvcnRhYmxlLFwKLSBvcmcub21nLkNPUkJBLlR5cGVDb2RlUGFja2FnZSxcCi0gb3JnLm9tZy5Db3NOYW1pbmcsXAotIG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRQYWNrYWdlLFwKLSBvcmcub21nLlNlbmRpbmdDb250ZXh0LFwKLSBvcmcub21nLnN0dWIuamF2YS5ybWkKLW9yZy5vc2dpLmZyYW1ld29yay5ib290ZGVsZWdhdGlvbiA9IFwKLSBqYXZheC4qLFwKLSBvcmcub21nLiosXAotIHN1bi4qLFwKLSBjb20uc3VuLioKLW9yZy5vc2dpLmZyYW1ld29yay5leGVjdXRpb25lbnZpcm9ubWVudCA9IFwKLSBPU0dpL01pbmltdW0tMS4wLFwKLSBPU0dpL01pbmltdW0tMS4xLFwKLSBKUkUtMS4xLFwKLSBKMlNFLTEuMixcCi0gSjJTRS0xLjMKLW9zZ2kuamF2YS5wcm9maWxlLm5hbWUgPSBKMlNFLTEuMwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9KMlNFLTEuNC5wcm9maWxlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9KMlNFLTEuNC5wcm9maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzA3Yzk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvSjJTRS0xLjQucHJvZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyA9IFwKLSBqYXZheC5hY2Nlc3NpYmlsaXR5LFwKLSBqYXZheC5jcnlwdG8sXAotIGphdmF4LmNyeXB0by5pbnRlcmZhY2VzLFwKLSBqYXZheC5jcnlwdG8uc3BlYyxcCi0gamF2YXguaW1hZ2VpbyxcCi0gamF2YXguaW1hZ2Vpby5ldmVudCxcCi0gamF2YXguaW1hZ2Vpby5tZXRhZGF0YSxcCi0gamF2YXguaW1hZ2Vpby5wbHVnaW5zLmpwZWcsXAotIGphdmF4LmltYWdlaW8uc3BpLFwKLSBqYXZheC5pbWFnZWlvLnN0cmVhbSxcCi0gamF2YXgubmFtaW5nLFwKLSBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LFwKLSBqYXZheC5uYW1pbmcuZXZlbnQsXAotIGphdmF4Lm5hbWluZy5sZGFwLFwKLSBqYXZheC5uYW1pbmcuc3BpLFwKLSBqYXZheC5uZXQsXAotIGphdmF4Lm5ldC5zc2wsXAotIGphdmF4LnByaW50LFwKLSBqYXZheC5wcmludC5hdHRyaWJ1dGUsXAotIGphdmF4LnByaW50LmF0dHJpYnV0ZS5zdGFuZGFyZCxcCi0gamF2YXgucHJpbnQuZXZlbnQsXAotIGphdmF4LnJtaSxcCi0gamF2YXgucm1pLkNPUkJBLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmtlcmJlcm9zLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLnNwaSxcCi0gamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLFwKLSBqYXZheC5zZWN1cml0eS5jZXJ0LFwKLSBqYXZheC5zb3VuZC5taWRpLFwKLSBqYXZheC5zb3VuZC5taWRpLnNwaSxcCi0gamF2YXguc291bmQuc2FtcGxlZCxcCi0gamF2YXguc291bmQuc2FtcGxlZC5zcGksXAotIGphdmF4LnNxbCxcCi0gamF2YXguc3dpbmcsXAotIGphdmF4LnN3aW5nLmJvcmRlcixcCi0gamF2YXguc3dpbmcuY29sb3JjaG9vc2VyLFwKLSBqYXZheC5zd2luZy5ldmVudCxcCi0gamF2YXguc3dpbmcuZmlsZWNob29zZXIsXAotIGphdmF4LnN3aW5nLnBsYWYsXAotIGphdmF4LnN3aW5nLnBsYWYuYmFzaWMsXAotIGphdmF4LnN3aW5nLnBsYWYubWV0YWwsXAotIGphdmF4LnN3aW5nLnBsYWYubXVsdGksXAotIGphdmF4LnN3aW5nLnRhYmxlLFwKLSBqYXZheC5zd2luZy50ZXh0LFwKLSBqYXZheC5zd2luZy50ZXh0Lmh0bWwsXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbC5wYXJzZXIsXAotIGphdmF4LnN3aW5nLnRleHQucnRmLFwKLSBqYXZheC5zd2luZy50cmVlLFwKLSBqYXZheC5zd2luZy51bmRvLFwKLSBqYXZheC50cmFuc2FjdGlvbixcCi0gamF2YXgudHJhbnNhY3Rpb24ueGEsXAotIGphdmF4LnhtbC5wYXJzZXJzLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLmRvbSxcCi0gamF2YXgueG1sLnRyYW5zZm9ybS5zYXgsXAotIGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLFwKLSBvcmcuaWV0Zi5qZ3NzLFwKLSBvcmcub21nLkNPUkJBLFwKLSBvcmcub21nLkNPUkJBXzJfMyxcCi0gb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUsXAotIG9yZy5vbWcuQ09SQkEuRHluQW55UGFja2FnZSxcCi0gb3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlLFwKLSBvcmcub21nLkNPUkJBLnBvcnRhYmxlLFwKLSBvcmcub21nLkNPUkJBLlR5cGVDb2RlUGFja2FnZSxcCi0gb3JnLm9tZy5Db3NOYW1pbmcsXAotIG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRFeHRQYWNrYWdlLFwKLSBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZSxcCi0gb3JnLm9tZy5EeW5hbWljLFwKLSBvcmcub21nLkR5bmFtaWNBbnksXAotIG9yZy5vbWcuRHluYW1pY0FueS5EeW5BbnlGYWN0b3J5UGFja2FnZSxcCi0gb3JnLm9tZy5EeW5hbWljQW55LkR5bkFueVBhY2thZ2UsXAotIG9yZy5vbWcuSU9QLFwKLSBvcmcub21nLklPUC5Db2RlY0ZhY3RvcnlQYWNrYWdlLFwKLSBvcmcub21nLklPUC5Db2RlY1BhY2thZ2UsXAotIG9yZy5vbWcuTWVzc2FnaW5nLFwKLSBvcmcub21nLlBvcnRhYmxlSW50ZXJjZXB0b3IsXAotIG9yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvci5PUkJJbml0SW5mb1BhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuQ3VycmVudFBhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BTWFuYWdlclBhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BUGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5wb3J0YWJsZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5TZXJ2YW50TG9jYXRvclBhY2thZ2UsXAotIG9yZy5vbWcuU2VuZGluZ0NvbnRleHQsXAotIG9yZy5vbWcuc3R1Yi5qYXZhLnJtaSxcCi0gb3JnLnczYy5kb20sXAotIG9yZy54bWwuc2F4LFwKLSBvcmcueG1sLnNheC5leHQsXAotIG9yZy54bWwuc2F4LmhlbHBlcnMKLW9yZy5vc2dpLmZyYW1ld29yay5ib290ZGVsZWdhdGlvbiA9IFwKLSBqYXZheC4qLFwKLSBvcmcuaWV0Zi5qZ3NzLFwKLSBvcmcub21nLiosXAotIG9yZy53M2MuKixcCi0gb3JnLnhtbC4qLFwKLSBzdW4uKixcCi0gY29tLnN1bi4qCi1vcmcub3NnaS5mcmFtZXdvcmsuZXhlY3V0aW9uZW52aXJvbm1lbnQgPSBcCi0gT1NHaS9NaW5pbXVtLTEuMCxcCi0gT1NHaS9NaW5pbXVtLTEuMSxcCi0gSlJFLTEuMSxcCi0gSjJTRS0xLjIsXAotIEoyU0UtMS4zLFwKLSBKMlNFLTEuNAotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0oyU0UtMS41LnByb2ZpbGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0oyU0UtMS41LnByb2ZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyM2Q2Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9KMlNFLTEuNS5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzID0gXAotIGphdmF4LmFjY2Vzc2liaWxpdHksXAotIGphdmF4LmFjdGl2aXR5LFwKLSBqYXZheC5jcnlwdG8sXAotIGphdmF4LmNyeXB0by5pbnRlcmZhY2VzLFwKLSBqYXZheC5jcnlwdG8uc3BlYyxcCi0gamF2YXguaW1hZ2VpbyxcCi0gamF2YXguaW1hZ2Vpby5ldmVudCxcCi0gamF2YXguaW1hZ2Vpby5tZXRhZGF0YSxcCi0gamF2YXguaW1hZ2Vpby5wbHVnaW5zLmJtcCxcCi0gamF2YXguaW1hZ2Vpby5wbHVnaW5zLmpwZWcsXAotIGphdmF4LmltYWdlaW8uc3BpLFwKLSBqYXZheC5pbWFnZWlvLnN0cmVhbSxcCi0gamF2YXgubWFuYWdlbWVudCxcCi0gamF2YXgubWFuYWdlbWVudC5sb2FkaW5nLFwKLSBqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4sXAotIGphdmF4Lm1hbmFnZW1lbnQubW9uaXRvcixcCi0gamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4sXAotIGphdmF4Lm1hbmFnZW1lbnQucmVsYXRpb24sXAotIGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLFwKLSBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWksXAotIGphdmF4Lm1hbmFnZW1lbnQudGltZXIsXAotIGphdmF4Lm5hbWluZyxcCi0gamF2YXgubmFtaW5nLmRpcmVjdG9yeSxcCi0gamF2YXgubmFtaW5nLmV2ZW50LFwKLSBqYXZheC5uYW1pbmcubGRhcCxcCi0gamF2YXgubmFtaW5nLnNwaSxcCi0gamF2YXgubmV0LFwKLSBqYXZheC5uZXQuc3NsLFwKLSBqYXZheC5wcmludCxcCi0gamF2YXgucHJpbnQuYXR0cmlidXRlLFwKLSBqYXZheC5wcmludC5hdHRyaWJ1dGUuc3RhbmRhcmQsXAotIGphdmF4LnByaW50LmV2ZW50LFwKLSBqYXZheC5ybWksXAotIGphdmF4LnJtaS5DT1JCQSxcCi0gamF2YXgucm1pLnNzbCxcCi0gamF2YXguc2VjdXJpdHkuYXV0aCxcCi0gamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjayxcCi0gamF2YXguc2VjdXJpdHkuYXV0aC5rZXJiZXJvcyxcCi0gamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbixcCi0gamF2YXguc2VjdXJpdHkuYXV0aC5zcGksXAotIGphdmF4LnNlY3VyaXR5LmF1dGgueDUwMCxcCi0gamF2YXguc2VjdXJpdHkuY2VydCxcCi0gamF2YXguc2VjdXJpdHkuc2FzbCxcCi0gamF2YXguc2VydmxldCxcCi0gamF2YXguc2VydmxldC5odHRwLFwKLSBqYXZheC5zb3VuZC5taWRpLFwKLSBqYXZheC5zb3VuZC5taWRpLnNwaSxcCi0gamF2YXguc291bmQuc2FtcGxlZCxcCi0gamF2YXguc291bmQuc2FtcGxlZC5zcGksXAotIGphdmF4LnNxbCxcCi0gamF2YXguc3FsLnJvd3NldCxcCi0gamF2YXguc3FsLnJvd3NldC5zZXJpYWwsXAotIGphdmF4LnNxbC5yb3dzZXQuc3BpLFwKLSBqYXZheC5zd2luZyxcCi0gamF2YXguc3dpbmcuYm9yZGVyLFwKLSBqYXZheC5zd2luZy5jb2xvcmNob29zZXIsXAotIGphdmF4LnN3aW5nLmV2ZW50LFwKLSBqYXZheC5zd2luZy5maWxlY2hvb3NlcixcCi0gamF2YXguc3dpbmcucGxhZixcCi0gamF2YXguc3dpbmcucGxhZi5iYXNpYyxcCi0gamF2YXguc3dpbmcucGxhZi5tZXRhbCxcCi0gamF2YXguc3dpbmcucGxhZi5tdWx0aSxcCi0gamF2YXguc3dpbmcucGxhZi5zeW50aCxcCi0gamF2YXguc3dpbmcudGFibGUsXAotIGphdmF4LnN3aW5nLnRleHQsXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbCxcCi0gamF2YXguc3dpbmcudGV4dC5odG1sLnBhcnNlcixcCi0gamF2YXguc3dpbmcudGV4dC5ydGYsXAotIGphdmF4LnN3aW5nLnRyZWUsXAotIGphdmF4LnN3aW5nLnVuZG8sXAotIGphdmF4LnRyYW5zYWN0aW9uLFwKLSBqYXZheC50cmFuc2FjdGlvbi54YSxcCi0gamF2YXgueG1sLFwKLSBqYXZheC54bWwuZGF0YXR5cGUsXAotIGphdmF4LnhtbC5uYW1lc3BhY2UsXAotIGphdmF4LnhtbC5wYXJzZXJzLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLmRvbSxcCi0gamF2YXgueG1sLnRyYW5zZm9ybS5zYXgsXAotIGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLFwKLSBqYXZheC54bWwudmFsaWRhdGlvbixcCi0gamF2YXgueG1sLnhwYXRoLFwKLSBvcmcuaWV0Zi5qZ3NzLFwKLSBvcmcub21nLkNPUkJBLFwKLSBvcmcub21nLkNPUkJBXzJfMyxcCi0gb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUsXAotIG9yZy5vbWcuQ09SQkEuRHluQW55UGFja2FnZSxcCi0gb3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlLFwKLSBvcmcub21nLkNPUkJBLnBvcnRhYmxlLFwKLSBvcmcub21nLkNPUkJBLlR5cGVDb2RlUGFja2FnZSxcCi0gb3JnLm9tZy5Db3NOYW1pbmcsXAotIG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRFeHRQYWNrYWdlLFwKLSBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZSxcCi0gb3JnLm9tZy5EeW5hbWljLFwKLSBvcmcub21nLkR5bmFtaWNBbnksXAotIG9yZy5vbWcuRHluYW1pY0FueS5EeW5BbnlGYWN0b3J5UGFja2FnZSxcCi0gb3JnLm9tZy5EeW5hbWljQW55LkR5bkFueVBhY2thZ2UsXAotIG9yZy5vbWcuSU9QLFwKLSBvcmcub21nLklPUC5Db2RlY0ZhY3RvcnlQYWNrYWdlLFwKLSBvcmcub21nLklPUC5Db2RlY1BhY2thZ2UsXAotIG9yZy5vbWcuTWVzc2FnaW5nLFwKLSBvcmcub21nLlBvcnRhYmxlSW50ZXJjZXB0b3IsXAotIG9yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvci5PUkJJbml0SW5mb1BhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuQ3VycmVudFBhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BTWFuYWdlclBhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BUGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5wb3J0YWJsZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5TZXJ2YW50TG9jYXRvclBhY2thZ2UsXAotIG9yZy5vbWcuU2VuZGluZ0NvbnRleHQsXAotIG9yZy5vbWcuc3R1Yi5qYXZhLnJtaSxcCi0gb3JnLnczYy5kb20sXAotIG9yZy53M2MuZG9tLmJvb3RzdHJhcCxcCi0gb3JnLnczYy5kb20uZXZlbnRzLFwKLSBvcmcudzNjLmRvbS5scyxcCi0gb3JnLnhtbC5zYXgsXAotIG9yZy54bWwuc2F4LmV4dCxcCi0gb3JnLnhtbC5zYXguaGVscGVycwotb3JnLm9zZ2kuZnJhbWV3b3JrLmJvb3RkZWxlZ2F0aW9uID0gXAotIGphdmF4LiosXAotIG9yZy5pZXRmLmpnc3MsXAotIG9yZy5vbWcuKixcCi0gb3JnLnczYy4qLFwKLSBvcmcueG1sLiosXAotIHN1bi4qLFwKLSBjb20uc3VuLioKLW9yZy5vc2dpLmZyYW1ld29yay5leGVjdXRpb25lbnZpcm9ubWVudCA9IFwKLSBPU0dpL01pbmltdW0tMS4wLFwKLSBPU0dpL01pbmltdW0tMS4xLFwKLSBKUkUtMS4xLFwKLSBKMlNFLTEuMixcCi0gSjJTRS0xLjMsXAotIEoyU0UtMS40LFwKLSBKMlNFLTEuNQotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IEoyU0UtMS41CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL0pSRS0xLjEucHJvZmlsZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvSlJFLTEuMS5wcm9maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YThkOGZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvSlJFLTEuMS5wcm9maWxlCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSAKLW9yZy5vc2dpLmZyYW1ld29yay5ib290ZGVsZWdhdGlvbiA9IFwKLSBzdW4uKixcCi0gY29tLnN1bi4qCi1vcmcub3NnaS5mcmFtZXdvcmsuZXhlY3V0aW9uZW52aXJvbm1lbnQgPSBcCi0gSlJFLTEuMQotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IEpSRS0xLjEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvSmF2YVNFLTEuNi5wcm9maWxlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9KYXZhU0UtMS42LnByb2ZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjN2FiY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9KYXZhU0UtMS42LnByb2ZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLW9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMgPSBcCi0gamF2YXguYWNjZXNzaWJpbGl0eSxcCi0gamF2YXguYWN0aXZpdHksXAotIGphdmF4LmNyeXB0byxcCi0gamF2YXguY3J5cHRvLmludGVyZmFjZXMsXAotIGphdmF4LmNyeXB0by5zcGVjLFwKLSBqYXZheC5pbWFnZWlvLFwKLSBqYXZheC5pbWFnZWlvLmV2ZW50LFwKLSBqYXZheC5pbWFnZWlvLm1ldGFkYXRhLFwKLSBqYXZheC5pbWFnZWlvLnBsdWdpbnMuYm1wLFwKLSBqYXZheC5pbWFnZWlvLnBsdWdpbnMuanBlZyxcCi0gamF2YXguaW1hZ2Vpby5zcGksXAotIGphdmF4LmltYWdlaW8uc3RyZWFtLFwKLSBqYXZheC5tYW5hZ2VtZW50LFwKLSBqYXZheC5tYW5hZ2VtZW50LmxvYWRpbmcsXAotIGphdmF4Lm1hbmFnZW1lbnQubW9kZWxtYmVhbixcCi0gamF2YXgubWFuYWdlbWVudC5tb25pdG9yLFwKLSBqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbixcCi0gamF2YXgubWFuYWdlbWVudC5yZWxhdGlvbixcCi0gamF2YXgubWFuYWdlbWVudC5yZW1vdGUsXAotIGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLnJtaSxcCi0gamF2YXgubWFuYWdlbWVudC50aW1lcixcCi0gamF2YXgubmFtaW5nLFwKLSBqYXZheC5uYW1pbmcuZGlyZWN0b3J5LFwKLSBqYXZheC5uYW1pbmcuZXZlbnQsXAotIGphdmF4Lm5hbWluZy5sZGFwLFwKLSBqYXZheC5uYW1pbmcuc3BpLFwKLSBqYXZheC5uZXQsXAotIGphdmF4Lm5ldC5zc2wsXAotIGphdmF4LnByaW50LFwKLSBqYXZheC5wcmludC5hdHRyaWJ1dGUsXAotIGphdmF4LnByaW50LmF0dHJpYnV0ZS5zdGFuZGFyZCxcCi0gamF2YXgucHJpbnQuZXZlbnQsXAotIGphdmF4LnJtaSxcCi0gamF2YXgucm1pLkNPUkJBLFwKLSBqYXZheC5ybWkuc3NsLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmtlcmJlcm9zLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLFwKLSBqYXZheC5zZWN1cml0eS5hdXRoLnNwaSxcCi0gamF2YXguc2VjdXJpdHkuYXV0aC54NTAwLFwKLSBqYXZheC5zZWN1cml0eS5jZXJ0LFwKLSBqYXZheC5zZWN1cml0eS5zYXNsLFwKLSBqYXZheC5zb3VuZC5taWRpLFwKLSBqYXZheC5zb3VuZC5taWRpLnNwaSxcCi0gamF2YXguc291bmQuc2FtcGxlZCxcCi0gamF2YXguc291bmQuc2FtcGxlZC5zcGksXAotIGphdmF4LnNxbCxcCi0gamF2YXguc3FsLnJvd3NldCxcCi0gamF2YXguc3FsLnJvd3NldC5zZXJpYWwsXAotIGphdmF4LnNxbC5yb3dzZXQuc3BpLFwKLSBqYXZheC5zd2luZyxcCi0gamF2YXguc3dpbmcuYm9yZGVyLFwKLSBqYXZheC5zd2luZy5jb2xvcmNob29zZXIsXAotIGphdmF4LnN3aW5nLmV2ZW50LFwKLSBqYXZheC5zd2luZy5maWxlY2hvb3NlcixcCi0gamF2YXguc3dpbmcucGxhZixcCi0gamF2YXguc3dpbmcucGxhZi5iYXNpYyxcCi0gamF2YXguc3dpbmcucGxhZi5tZXRhbCxcCi0gamF2YXguc3dpbmcucGxhZi5tdWx0aSxcCi0gamF2YXguc3dpbmcucGxhZi5zeW50aCxcCi0gamF2YXguc3dpbmcudGFibGUsXAotIGphdmF4LnN3aW5nLnRleHQsXAotIGphdmF4LnN3aW5nLnRleHQuaHRtbCxcCi0gamF2YXguc3dpbmcudGV4dC5odG1sLnBhcnNlcixcCi0gamF2YXguc3dpbmcudGV4dC5ydGYsXAotIGphdmF4LnN3aW5nLnRyZWUsXAotIGphdmF4LnN3aW5nLnVuZG8sXAotIGphdmF4LnRyYW5zYWN0aW9uLFwKLSBqYXZheC50cmFuc2FjdGlvbi54YSxcCi0gamF2YXgueG1sLFwKLSBqYXZheC54bWwuZGF0YXR5cGUsXAotIGphdmF4LnhtbC5uYW1lc3BhY2UsXAotIGphdmF4LnhtbC5wYXJzZXJzLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLFwKLSBqYXZheC54bWwudHJhbnNmb3JtLmRvbSxcCi0gamF2YXgueG1sLnRyYW5zZm9ybS5zYXgsXAotIGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLFwKLSBqYXZheC54bWwudmFsaWRhdGlvbixcCi0gamF2YXgueG1sLnhwYXRoLFwKLSBvcmcuaWV0Zi5qZ3NzLFwKLSBvcmcub21nLkNPUkJBLFwKLSBvcmcub21nLkNPUkJBXzJfMyxcCi0gb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUsXAotIG9yZy5vbWcuQ09SQkEuRHluQW55UGFja2FnZSxcCi0gb3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlLFwKLSBvcmcub21nLkNPUkJBLnBvcnRhYmxlLFwKLSBvcmcub21nLkNPUkJBLlR5cGVDb2RlUGFja2FnZSxcCi0gb3JnLm9tZy5Db3NOYW1pbmcsXAotIG9yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRFeHRQYWNrYWdlLFwKLSBvcmcub21nLkNvc05hbWluZy5OYW1pbmdDb250ZXh0UGFja2FnZSxcCi0gb3JnLm9tZy5EeW5hbWljLFwKLSBvcmcub21nLkR5bmFtaWNBbnksXAotIG9yZy5vbWcuRHluYW1pY0FueS5EeW5BbnlGYWN0b3J5UGFja2FnZSxcCi0gb3JnLm9tZy5EeW5hbWljQW55LkR5bkFueVBhY2thZ2UsXAotIG9yZy5vbWcuSU9QLFwKLSBvcmcub21nLklPUC5Db2RlY0ZhY3RvcnlQYWNrYWdlLFwKLSBvcmcub21nLklPUC5Db2RlY1BhY2thZ2UsXAotIG9yZy5vbWcuTWVzc2FnaW5nLFwKLSBvcmcub21nLlBvcnRhYmxlSW50ZXJjZXB0b3IsXAotIG9yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvci5PUkJJbml0SW5mb1BhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuQ3VycmVudFBhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BTWFuYWdlclBhY2thZ2UsXAotIG9yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BUGFja2FnZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5wb3J0YWJsZSxcCi0gb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5TZXJ2YW50TG9jYXRvclBhY2thZ2UsXAotIG9yZy5vbWcuU2VuZGluZ0NvbnRleHQsXAotIG9yZy5vbWcuc3R1Yi5qYXZhLnJtaSxcCi0gb3JnLnczYy5kb20sXAotIG9yZy53M2MuZG9tLmJvb3RzdHJhcCxcCi0gb3JnLnczYy5kb20uZXZlbnRzLFwKLSBvcmcudzNjLmRvbS5scyxcCi0gb3JnLnhtbC5zYXgsXAotIG9yZy54bWwuc2F4LmV4dCxcCi0gb3JnLnhtbC5zYXguaGVscGVycwotb3JnLm9zZ2kuZnJhbWV3b3JrLmJvb3RkZWxlZ2F0aW9uID0gXAotIGphdmF4LiosXAotIG9yZy5pZXRmLmpnc3MsXAotIG9yZy5vbWcuKixcCi0gb3JnLnczYy4qLFwKLSBvcmcueG1sLiosXAotIHN1bi4qLFwKLSBjb20uc3VuLioKLW9yZy5vc2dpLmZyYW1ld29yay5leGVjdXRpb25lbnZpcm9ubWVudCA9IFwKLSBPU0dpL01pbmltdW0tMS4wLFwKLSBPU0dpL01pbmltdW0tMS4xLFwKLSBKUkUtMS4xLFwKLSBKMlNFLTEuMixcCi0gSjJTRS0xLjMsXAotIEoyU0UtMS40LFwKLSBKMlNFLTEuNSxcCi0gSmF2YVNFLTEuNgotb3NnaS5qYXZhLnByb2ZpbGUubmFtZSA9IEphdmFTRS0xLjYKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvcHJvZmlsZXMvT1NHaV9NaW5pbXVtLTEuMC5wcm9maWxlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9PU0dpX01pbmltdW0tMS4wLnByb2ZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YzJkM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9PU0dpX01pbmltdW0tMS4wLnByb2ZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMywgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotb3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyA9IAotb3JnLm9zZ2kuZnJhbWV3b3JrLmJvb3RkZWxlZ2F0aW9uID0gXAotIHN1bi4qLFwKLSBjb20uc3VuLioKLW9yZy5vc2dpLmZyYW1ld29yay5leGVjdXRpb25lbnZpcm9ubWVudCA9IFwKLSBPU0dpL01pbmltdW0tMS4wCi1vc2dpLmphdmEucHJvZmlsZS5uYW1lID0gT1NHaS9NaW5pbXVtLTEuMApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9wcm9maWxlcy9PU0dpX01pbmltdW0tMS4xLnByb2ZpbGUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL09TR2lfTWluaW11bS0xLjEucHJvZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4YjY2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3Byb2ZpbGVzL09TR2lfTWluaW11bS0xLjEucHJvZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1vcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzID0gCi1vcmcub3NnaS5mcmFtZXdvcmsuYm9vdGRlbGVnYXRpb24gPSBcCi0gc3VuLiosXAotIGNvbS5zdW4uKgotb3JnLm9zZ2kuZnJhbWV3b3JrLmV4ZWN1dGlvbmVudmlyb25tZW50ID0gXAotIE9TR2kvTWluaW11bS0xLjAsXAotIE9TR2kvTWluaW11bS0xLjEKLW9zZ2kuamF2YS5wcm9maWxlLm5hbWUgPSBPU0dpL01pbmltdW0tMS4xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NjcmlwdHMvYnVpbGRFeHRyYUpBUi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjA2NjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zY3JpcHRzL2J1aWxkRXh0cmFKQVIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IG5hbWU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIiBkZWZhdWx0PSJtYWluIiBiYXNlZGlyPSIuLiI+Ci0KLQk8dGFyZ2V0IG5hbWU9Im1haW4iIGRlcGVuZHM9ImNsZWFuLCBhbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIiPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJwcm9wZXJ0aWVzIj4KLQkJPHByb3BlcnR5IG5hbWU9InBsdWdpbiIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2VuZXJhdG9yLmFwcCIvPgotCQk8cHJvcGVydHkgbmFtZT0idGVtcC5mb2xkZXIiIHZhbHVlPSIke2Jhc2VkaXJ9L3RlbXAuZm9sZGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwbHVnaW4uZGVzdGluYXRpb24iIHZhbHVlPSIke2Jhc2VkaXJ9Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJidWlsZC5yZXN1bHQuZm9sZGVyIiB2YWx1ZT0iJHtiYXNlZGlyfS9hbnRfdGFza3MiLz4KLQkJPHByb3BlcnR5IG5hbWU9InZlcnNpb24uc3VmZml4IiB2YWx1ZT0iXzMuMS4wIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KRFRDb21waWxlckFkYXB0ZXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyIiBkZXBlbmRzPSJpbml0IiB1bmxlc3M9ImFudF90YXNrcy9nZW5lcmF0b3ItYW50LmphciI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0ZGlyIiB2YWx1ZT0iJHt0ZW1wLmZvbGRlcn0vYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyLmJpbiIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0vYW50X3Rhc2tzL2dlbmVyYXRvci1hbnQuamFyLmJpbiIvPgotCQk8bWtkaXIgZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIuYmluIi8+Ci0JCTwhLS0gY29tcGlsZSB0aGUgc291cmNlIGNvZGUgLS0+Ci0JCTxqYXZhYyBkZXN0ZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIuYmluIiBmYWlsb25lcnJvcj0idHJ1ZSIgdmVyYm9zZT0idHJ1ZSIgZGVidWc9Im9uIj4KLQkJCTxjbGFzc3BhdGg+Ci0JCQkJPGRpcnNldCBkaXI9IiR7YmFzZWRpcn0vLi4iPgotCQkJCQk8aW5jbHVkZSBuYW1lPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci9iaW4iLz4KLQkJCQkJPGluY2x1ZGUgbmFtZT0ib3JnLmVjbGlwc2Uub3NnaS9iaW4iLz4KLQkJCQk8L2RpcnNldD4KLQkJCQk8ZmlsZXNldCBkaXI9IiR7ZWNsaXBzZS5ob21lfSI+Ci0JCQkJCTxpbmNsdWRlIG5hbWU9InBsdWdpbnMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IqLmphciIvPgotCQkJCQk8aW5jbHVkZSBuYW1lPSJwbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2kqLmphciIvPgotCQkJCTwvZmlsZXNldD4KLQkJCTwvY2xhc3NwYXRoPgotCQkJPHNyYyBwYXRoPSJzcmNfYW50LyIvPgotCQk8L2phdmFjPgotCQk8IS0tIGNvcHkgbmVjZXNzYXJ5IHJlc291cmNlcyAtLT4KLQkJPGNvcHkgdG9kaXI9IiR7dGVtcC5mb2xkZXJ9L2FudF90YXNrcy9nZW5lcmF0b3ItYW50Lmphci5iaW4iPgotCQkJPGZpbGVzZXQgZGlyPSJzcmNfYW50LyIgZXhjbHVkZXM9IioqLyouamF2YSIvPgotCQk8L2NvcHk+Ci0JCTxta2RpciBkaXI9IiR7YnVpbGQucmVzdWx0LmZvbGRlcn0iLz4KLQkJPGphciBqYXJmaWxlPSIke2J1aWxkLnJlc3VsdC5mb2xkZXJ9L2dlbmVyYXRvci1hbnQuamFyIiBiYXNlZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfS9hbnRfdGFza3MvZ2VuZXJhdG9yLWFudC5qYXIuYmluIi8+Ci0JCTxkZWxldGUgZGlyPSIke3RlbXAuZm9sZGVyfSIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJjbGVhbiIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxkZWxldGUgZmlsZT0iJHtidWlsZC5yZXN1bHQuZm9sZGVyfS9nZW5lcmF0b3ItYW50LmphciIvPgotCQk8ZGVsZXRlIGRpcj0iJHt0ZW1wLmZvbGRlcn0iLz4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9BYnN0cmFjdFB1Ymxpc2hlckFwcGxpY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9BYnN0cmFjdFB1Ymxpc2hlckFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZDU2N2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvQWJzdHJhY3RQdWJsaXNoZXJBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5Qcm92aXNpb25pbmdFdmVudEJ1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5NZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWdpc3RyYXRpb247Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFB1Ymxpc2hlckFwcGxpY2F0aW9uIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uIHsKLQotCS8vIFRoZSBtYXBwaW5nIHJ1bGVzIGZvciBpbi1wbGFjZSBnZW5lcmF0aW9uIG5lZWQgdG8gY29uc3RydWN0IHBhdGhzIGludG8gdGhlIHN0cnVjdHVyZQotCS8vIG9mIGFuIGVjbGlwc2UgaW5zdGFsbGF0aW9uOyBpbiB0aGUgZnV0dXJlIHRoZSBkZWZhdWx0IGFydGlmYWN0IG1hcHBpbmcgZGVjbGFyZWQgaW4KLQkvLyBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkgbWF5IGNoYW5nZSwgZm9yIGV4YW1wbGUsIHRvIG5vdCBoYXZlIGEgJ2J1bmRsZXMnIGRpcmVjdG9yeQotCS8vIGluc3RlYWQgb2YgYSAncGx1Z2lucycgZGlyZWN0b3J5LCBzbyBhIHNlcGFyYXRlIGNvbnN0YW50IGlzIGRlZmluZWQgYW5kIHVzZWQgaGVyZS4KLQlzdGF0aWMgZmluYWwgcHJvdGVjdGVkIFN0cmluZ1tdW10gSU5QTEFDRV9NQVBQSU5HX1JVTEVTID0geyB7IigmIChjbGFzc2lmaWVyPW9zZ2kuYnVuZGxlKSAoZm9ybWF0PXBhY2tlZCkiLCAiJHtyZXBvVXJsfS9mZWF0dXJlcy8ke2lkfV8ke3ZlcnNpb259Lmphci5wYWNrLmd6In0sIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQl7IigmIChjbGFzc2lmaWVyPW9zZ2kuYnVuZGxlKSkiLCAiJHtyZXBvVXJsfS9wbHVnaW5zLyR7aWR9XyR7dmVyc2lvbn0uamFyIn0sIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQl7IigmIChjbGFzc2lmaWVyPWJpbmFyeSkpIiwgIiR7cmVwb1VybH0vYmluYXJ5LyR7aWR9XyR7dmVyc2lvbn0ifSwgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCXsiKCYgKGNsYXNzaWZpZXI9b3JnLmVjbGlwc2UudXBkYXRlLmZlYXR1cmUpKSIsICIke3JlcG9Vcmx9L2ZlYXR1cmVzLyR7aWR9XyR7dmVyc2lvbn0uamFyIn19OyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCi0Jc3RhdGljIGZpbmFsIHB1YmxpYyBTdHJpbmcgUFVCTElTSF9QQUNLX0ZJTEVTX0FTX1NJQkxJTkdTID0gInB1Ymxpc2hQYWNrRmlsZXNBc1NpYmxpbmdzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIGRlZmF1bHRBcnRpZmFjdE1hbmFnZXI7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbkRlZmF1bHRBcnRpZmFjdE1hbmFnZXI7Ci0JcHJpdmF0ZSBNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIGRlZmF1bHRNZXRhZGF0YU1hbmFnZXI7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbkRlZmF1bHRNZXRhZGF0YU1hbmFnZXI7Ci0JcHJpdmF0ZSBJUHJvdmlzaW9uaW5nRXZlbnRCdXMgYnVzOwotCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb25CdXM7Ci0JcHJvdGVjdGVkIFB1Ymxpc2hlckluZm8gaW5mbzsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNvdXJjZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1ldGFkYXRhTG9jYXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyBtZXRhZGF0YVJlcG9OYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgYXJ0aWZhY3RMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGFydGlmYWN0UmVwb05hbWU7Ci0JLy93aGV0aGVyIHJlcG9zaXRvcnkgeG1sIGZpbGVzIHNob3VsZCBiZSBjb21wcmVzc2VkCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29tcHJlc3MgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnBsYWNlID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYXBwZW5kID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gcmV1c2VQYWNrZWRGaWxlcyA9IGZhbHNlOwotCXByb3RlY3RlZCBTdHJpbmdbXSBjb25maWd1cmF0aW9uczsKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoUHVibGlzaGVySW5mbyBpbmZvKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJaWYgKGlucGxhY2UpIHsKLQkJCUZpbGUgbG9jYXRpb24gPSBuZXcgRmlsZShzb3VyY2UpOwotCQkJdHJ5IHsKLQkJCQlpZiAobWV0YWRhdGFMb2NhdGlvbiA9PSBudWxsKQotCQkJCQltZXRhZGF0YUxvY2F0aW9uID0gbG9jYXRpb24udG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJCWlmIChhcnRpZmFjdExvY2F0aW9uID09IG51bGwpCi0JCQkJCWFydGlmYWN0TG9jYXRpb24gPSBsb2NhdGlvbi50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vIG91Z2h0IG5vdCBoYXBwZW4uLi4KLQkJCX0KLQkJCWluZm8uc2V0QXJ0aWZhY3RPcHRpb25zKGluZm8uZ2V0QXJ0aWZhY3RPcHRpb25zKCkgfCBJUHVibGlzaGVySW5mby5BX0lOREVYIHwgSVB1Ymxpc2hlckluZm8uQV9QVUJMSVNIKTsKLQkJfSBlbHNlCi0JCQlpbmZvLnNldEFydGlmYWN0T3B0aW9ucyhpbmZvLmdldEFydGlmYWN0T3B0aW9ucygpIHwgSVB1Ymxpc2hlckluZm8uQV9JTkRFWCB8IElQdWJsaXNoZXJJbmZvLkFfUFVCTElTSCB8IElQdWJsaXNoZXJJbmZvLkFfT1ZFUldSSVRFKTsKLQkJaW5pdGlhbGl6ZVJlcG9zaXRvcmllcyhpbmZvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplUmVwb3NpdG9yaWVzKFB1Ymxpc2hlckluZm8gaW5mbykgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWluZm8uc2V0QXJ0aWZhY3RSZXBvc2l0b3J5KFB1Ymxpc2hlci5jcmVhdGVBcnRpZmFjdFJlcG9zaXRvcnkoYXJ0aWZhY3RMb2NhdGlvbiwgYXJ0aWZhY3RSZXBvTmFtZSwgYXBwZW5kLCBjb21wcmVzcywgcmV1c2VQYWNrZWRGaWxlcykpOwotCQlpbmZvLnNldE1ldGFkYXRhUmVwb3NpdG9yeShQdWJsaXNoZXIuY3JlYXRlTWV0YWRhdGFSZXBvc2l0b3J5KG1ldGFkYXRhTG9jYXRpb24sIG1ldGFkYXRhUmVwb05hbWUsIGFwcGVuZCwgY29tcHJlc3MpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzQ29tbWFuZExpbmVBcmd1bWVudHMoU3RyaW5nW10gYXJncywgUHVibGlzaGVySW5mbyBpbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGFyZ3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBjaGVjayBmb3IgYXJncyB3aXRob3V0IHBhcmFtZXRlcnMgKGkuZS4sIGEgZmxhZyBhcmcpCi0JCQlwcm9jZXNzRmxhZyhhcmdzW2ldLCBpbmZvKTsKLQotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aCBwYXJhbWV0ZXJzLiBJZiB3ZSBhcmUgYXQgdGhlIGxhc3QgYXJndW1lbnQgb3IgaWYgdGhlIG5leHQgb25lCi0JCQkvLyBoYXMgYSAnLScgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciwgdGhlbiB3ZSBjYW4ndCBoYXZlIGFuIGFyZyB3aXRoIGEgcGFybSBzbyBjb250aW51ZS4KLQkJCWlmIChpID09IGFyZ3MubGVuZ3RoIC0gMSB8fCBhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCXByb2Nlc3NQYXJhbWV0ZXIoYXJnc1tpXSwgYXJnc1srK2ldLCBpbmZvKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NQYXJhbWV0ZXIoU3RyaW5nIGFyZywgU3RyaW5nIHBhcmFtZXRlciwgUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLW1ldGFkYXRhUmVwb3NpdG9yeSIpIHx8IGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItbXIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQltZXRhZGF0YUxvY2F0aW9uID0gcGFyYW1ldGVyOwotCi0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLW1ldGFkYXRhUmVwb3NpdG9yeU5hbWUiKSkgLy8kTk9OLU5MUy0xJAotCQkJbWV0YWRhdGFSZXBvTmFtZSA9IHBhcmFtZXRlcjsKLQotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1zb3VyY2UiKSkgLy8kTk9OLU5MUy0xJAotCQkJc291cmNlID0gcGFyYW1ldGVyOwotCi0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLWFydGlmYWN0UmVwb3NpdG9yeSIpIHwgYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1hciIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWFydGlmYWN0TG9jYXRpb24gPSBwYXJhbWV0ZXI7Ci0KLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItYXJ0aWZhY3RSZXBvc2l0b3J5TmFtZSIpKSAvLyROT04tTkxTLTEkCi0JCQlhcnRpZmFjdFJlcG9OYW1lID0gcGFyYW1ldGVyOwotCi0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLWNvbmZpZ3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJaW5mby5zZXRDb25maWd1cmF0aW9ucyhBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24uZ2V0QXJyYXlGcm9tU3RyaW5nKHBhcmFtZXRlciwgIiwiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRmxhZyhTdHJpbmcgYXJnLCBQdWJsaXNoZXJJbmZvIGluZm8pIHsKLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItcHVibGlzaEFydGlmYWN0cyIpIHx8IGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItcGEiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpbmZvLnNldEFydGlmYWN0T3B0aW9ucyhpbmZvLmdldEFydGlmYWN0T3B0aW9ucygpIHwgSVB1Ymxpc2hlckluZm8uQV9QVUJMSVNIKTsKLQotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1wdWJsaXNoQXJ0aWZhY3RSZXBvc2l0b3J5IikgfHwgYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1wYXIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlpbmZvLnNldEFydGlmYWN0T3B0aW9ucyhpbmZvLmdldEFydGlmYWN0T3B0aW9ucygpIHwgSVB1Ymxpc2hlckluZm8uQV9JTkRFWCk7Ci0KLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItb3ZlcndyaXRlQXJ0aWZhY3RzIikpIC8vJE5PTi1OTFMtMSQgCi0JCQlpbmZvLnNldEFydGlmYWN0T3B0aW9ucyhpbmZvLmdldEFydGlmYWN0T3B0aW9ucygpIHwgSVB1Ymxpc2hlckluZm8uQV9PVkVSV1JJVEUpOwotCi0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLWFwcGVuZCIpKSAvLyROT04tTkxTLTEkCi0JCQlhcHBlbmQgPSB0cnVlOwotCi0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLWNvbXByZXNzIikpIC8vJE5PTi1OTFMtMSQKLQkJCWNvbXByZXNzID0gdHJ1ZTsKLQotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1yZXVzZVBhY2syMDBGaWxlcyIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXVzZVBhY2tlZEZpbGVzID0gdHJ1ZTsKLQotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1pbnBsYWNlIikpIC8vJE5PTi1OTFMtMSQKLQkJCWlucGxhY2UgPSB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWdpc3RlckRlZmF1bHRBcnRpZmFjdFJlcG9NYW5hZ2VyKCkgewotCQlpZiAoU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSkgPT0gbnVsbCkgewotCQkJZGVmYXVsdEFydGlmYWN0TWFuYWdlciA9IG5ldyBBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCk7Ci0JCQlyZWdpc3RyYXRpb25EZWZhdWx0QXJ0aWZhY3RNYW5hZ2VyID0gQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpLCBkZWZhdWx0QXJ0aWZhY3RNYW5hZ2VyLCBudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWdpc3RlckRlZmF1bHRNZXRhZGF0YVJlcG9NYW5hZ2VyKCkgewotCQlpZiAoU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSkgPT0gbnVsbCkgewotCQkJZGVmYXVsdE1ldGFkYXRhTWFuYWdlciA9IG5ldyBNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKCk7Ci0JCQlyZWdpc3RyYXRpb25EZWZhdWx0TWV0YWRhdGFNYW5hZ2VyID0gQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpLCBkZWZhdWx0TWV0YWRhdGFNYW5hZ2VyLCBudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZWdpc3RlckV2ZW50QnVzKCkgewotCQlpZiAoU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm92aXNpb25pbmdFdmVudEJ1cy5TRVJWSUNFX05BTUUpID09IG51bGwpIHsKLQkJCWJ1cyA9IG5ldyBQcm92aXNpb25pbmdFdmVudEJ1cygpOwotCQkJcmVnaXN0cmF0aW9uQnVzID0gQWN0aXZhdG9yLmdldENvbnRleHQoKS5yZWdpc3RlclNlcnZpY2UoSVByb3Zpc2lvbmluZ0V2ZW50QnVzLlNFUlZJQ0VfTkFNRSwgYnVzLCBudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyBPYmplY3QgcnVuKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24gewotCQlpbmZvID0gY3JlYXRlUHVibGlzaGVySW5mbygpOwotCQlwcm9jZXNzQ29tbWFuZExpbmVBcmd1bWVudHMoYXJncywgaW5mbyk7Ci0JCU9iamVjdCByZXN1bHQgPSBydW4oaW5mbyk7Ci0JCWlmIChyZXN1bHQgIT0gSUFwcGxpY2F0aW9uLkVYSVRfT0spCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGFyZ3NbaV0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBQdWJsaXNoZXJJbmZvIGNyZWF0ZVB1Ymxpc2hlckluZm8oKSB7Ci0JCXJldHVybiBuZXcgUHVibGlzaGVySW5mbygpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgcnVuKFB1Ymxpc2hlckluZm8gaW5mbykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJlZ2lzdGVyRXZlbnRCdXMoKTsKLQkJcmVnaXN0ZXJEZWZhdWx0TWV0YWRhdGFSZXBvTWFuYWdlcigpOwotCQlyZWdpc3RlckRlZmF1bHRBcnRpZmFjdFJlcG9NYW5hZ2VyKCk7Ci0JCWluaXRpYWxpemUoaW5mbyk7Ci0JCXZhbGlkYXRlSW5mbyhpbmZvKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLm1lc3NhZ2VfZ2VuZXJhdGluZ01ldGFkYXRhLCBpbmZvLmdldFN1bW1hcnkoKSkpOwotCi0JCWxvbmcgYmVmb3JlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCUlQdWJsaXNoaW5nQWN0aW9uW10gYWN0aW9ucyA9IGNyZWF0ZUFjdGlvbnMoKTsKLQkJUHVibGlzaGVyIHB1Ymxpc2hlciA9IGNyZWF0ZVB1Ymxpc2hlcihpbmZvKTsKLQkJSVN0YXR1cyByZXN1bHQgPSBwdWJsaXNoZXIucHVibGlzaChhY3Rpb25zKTsKLQkJbG9uZyBhZnRlciA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCWlmIChyZXN1bHQuaXNPSygpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oTkxTLmJpbmQoTWVzc2FnZXMubWVzc2FnZV9nZW5lcmF0aW9uQ29tcGxldGVkLCBTdHJpbmcudmFsdWVPZigoYWZ0ZXIgLSBiZWZvcmUpIC8gMTAwMCkpKTsKLQkJCXJldHVybiBJQXBwbGljYXRpb24uRVhJVF9PSzsKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4ocmVzdWx0KTsKLQkJcmV0dXJuIG5ldyBJbnRlZ2VyKDEpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJUHVibGlzaGluZ0FjdGlvbltdIGNyZWF0ZUFjdGlvbnMoKTsKLQotCXByb3RlY3RlZCBQdWJsaXNoZXIgY3JlYXRlUHVibGlzaGVyKFB1Ymxpc2hlckluZm8gaW5mbykgewotCQlyZXR1cm4gbmV3IFB1Ymxpc2hlcihpbmZvKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUluZm8oUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCS8vCQlpZiAoaW5mby5nZXRCYXNlTG9jYXRpb24oKSA9PSBudWxsICYmIGluZm8uZ2V0UHJvZHVjdCgpID09IG51bGwpIHsKLQkJLy8JCQlTeXN0ZW0ub3V0LnByaW50bG4oTWVzc2FnZXMuZXhjZXB0aW9uX2Jhc2VMb2NhdGlvbk5vdFNwZWNpZmllZCk7Ci0JCS8vCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKC0xKTsKLQkJLy8JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBydW4oKFN0cmluZ1tdKSBjb250ZXh0LmdldEFyZ3VtZW50cygpLmdldCgiYXBwbGljYXRpb24uYXJncyIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCWlmIChyZWdpc3RyYXRpb25EZWZhdWx0TWV0YWRhdGFNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXJlZ2lzdHJhdGlvbkRlZmF1bHRNZXRhZGF0YU1hbmFnZXIudW5yZWdpc3RlcigpOwotCQkJcmVnaXN0cmF0aW9uRGVmYXVsdE1ldGFkYXRhTWFuYWdlciA9IG51bGw7Ci0JCX0KLQkJaWYgKHJlZ2lzdHJhdGlvbkRlZmF1bHRBcnRpZmFjdE1hbmFnZXIgIT0gbnVsbCkgewotCQkJcmVnaXN0cmF0aW9uRGVmYXVsdEFydGlmYWN0TWFuYWdlci51bnJlZ2lzdGVyKCk7Ci0JCQlyZWdpc3RyYXRpb25EZWZhdWx0QXJ0aWZhY3RNYW5hZ2VyID0gbnVsbDsKLQkJfQotCQlpZiAocmVnaXN0cmF0aW9uQnVzICE9IG51bGwpIHsKLQkJCXJlZ2lzdHJhdGlvbkJ1cy51bnJlZ2lzdGVyKCk7Ci0JCQlyZWdpc3RyYXRpb25CdXMgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLQkJdGhpcy5hcnRpZmFjdExvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0YWRhdGFMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pIHsKLQkJdGhpcy5tZXRhZGF0YUxvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV1c2VFeGlzdGluZ1BhY2syMDBGaWxlcygpIHsKLQkJcmV0dXJuIHJldXNlUGFja2VkRmlsZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmV1c2VFeGlzdGluZ1BhY2tlZEZpbGVzKGJvb2xlYW4gdmFsdWUpIHsKLQkJcmV1c2VQYWNrZWRGaWxlcyA9IHZhbHVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9BYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThkZmZjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9BYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbiBpbXBsZW1lbnRzIElQdWJsaXNoaW5nQWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTX0lTID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX1JPT1QgPSAyOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHX1NFR01FTlRfU0VQQVJBVE9SID0gIi4iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb252ZXJ0IGEgbGlzdCBvZiB0b2tlbnMgaW50byBhbiBhcnJheS4gVGhlIGxpc3Qgc2VwYXJhdG9yIGhhcyB0byBiZQotCSAqIHNwZWNpZmllZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldEFycmF5RnJvbVN0cmluZyhTdHJpbmcgbGlzdCwgU3RyaW5nIHNlcGFyYXRvcikgewotCQlpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5zID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaXN0LCBzZXBhcmF0b3IpOyB0b2tlbnMuaGFzTW9yZVRva2VucygpOykgewotCQkJU3RyaW5nIHRva2VuID0gdG9rZW5zLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCWlmICghdG9rZW4uZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hZGQodG9rZW4pOwotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzdHJpbmcgYXJyYXkgb2YgeyB3cywgb3MsIGFyY2ggfSBhcyBwYXJzZWQgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nCi0JICogQHBhcmFtIGNvbmZpZ1NwZWMgdGhlIHN0cmluZyB0byBwYXJzZQotCSAqIEByZXR1cm4gdGhlIHdzLCBvcywgYXJjaCBmb3JtIG9mIHRoZSBnaXZlbiBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHBhcnNlQ29uZmlnU3BlYyhTdHJpbmcgY29uZmlnU3BlYykgewotCQlTdHJpbmdbXSByZXN1bHQgPSBnZXRBcnJheUZyb21TdHJpbmcoY29uZmlnU3BlYywgQ09ORklHX1NFR01FTlRfU0VQQVJBVE9SKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBMREFQIGZpbHRlciBmb3JtIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gY29uZmlnIHNwZWMuICBSZXR1cm5zCi0JICogYW4gZW1wdHkgU3RyaW5nIGlmIHRoZSBzcGVjIGRvZXMgbm90IGlkZW50aWZ5IGFuIHdzLCBvcyBvciBhcmNoLgotCSAqIEBwYXJhbSBjb25maWdTcGVjIGEgY29uZmlnIHNwZWMgdG8gZmlsdGVyCi0JICogQHJldHVybiB0aGUgTERBUCBmaWx0ZXIgZm9yIHRoZSBnaXZlbiBzcGVjLiAgCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRmlsdGVyU3BlYyhTdHJpbmcgY29uZmlnU3BlYykgewotCQlTdHJpbmdbXSBjb25maWcgPSBwYXJzZUNvbmZpZ1NwZWMoY29uZmlnU3BlYyk7Ci0JCWlmIChjb25maWdbMF0gIT0gbnVsbCB8fCBjb25maWdbMV0gIT0gbnVsbCB8fCBjb25maWdbMl0gIT0gbnVsbCkgewotCQkJU3RyaW5nIGZpbHRlcldzID0gY29uZmlnWzBdICE9IG51bGwgPyAiKG9zZ2kud3M9IiArIGNvbmZpZ1swXSArICIpIiA6ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJU3RyaW5nIGZpbHRlck9zID0gY29uZmlnWzFdICE9IG51bGwgPyAiKG9zZ2kub3M9IiArIGNvbmZpZ1sxXSArICIpIiA6ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJU3RyaW5nIGZpbHRlckFyY2ggPSBjb25maWdbMl0gIT0gbnVsbCA/ICIob3NnaS5hcmNoPSIgKyBjb25maWdbMl0gKyAiKSIgOiAiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCXJldHVybiAiKCYgIiArIGZpbHRlcldzICsgZmlsdGVyT3MgKyBmaWx0ZXJBcmNoICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBub3JtYWxpemVkIHN0cmluZyBmb3JtIG9mIHRoZSBnaXZlbiBjb25maWcgc3BlYy4gIFRoaXMgaXMgdXNlZnVsIGZvciBwdXR0aW5nCi0JICogaW4gSVUgaWRzIGV0Yy4gTm90ZSB0aGF0IHRoZSByZXN1bHQgaXMgbm90IGludGVuZGVkIHRvIGJlIG1hY2hpbmUgcmVhZGFibGUgKGkuZS4sIHBhcnNlQ29uZmlnU3BlYwotCSAqIG1heSBub3Qgd29yayBvbiB0aGUgcmVzdWx0KS4KLQkgKiBAcGFyYW0gY29uZmlnU3BlYyB0aGUgY29uZmlnIHNwZWMgdG8gZm9ybWF0Ci0JICogQHJldHVybiB0aGUgcmVhZGFibGUgZm9ybWF0IG9mIHRoZSBnaXZlbiBjb25maWcgc3BlYwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUlkU3RyaW5nKFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCVN0cmluZ1tdIGNvbmZpZyA9IHBhcnNlQ29uZmlnU3BlYyhjb25maWdTcGVjKTsKLQkJcmV0dXJuIGNvbmZpZ1swXSArICcuJyArIGNvbmZpZ1sxXSArICcuJyArIGNvbmZpZ1syXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjYW5vbmljYWwgZm9ybSBvZiBjb25maWcgc3BlYyB3aXRoIHRoZSBnaXZlbiB3cywgb3MgYW5kIGFyY2guCi0JICogTm90ZSB0aGF0IHRoZSByZXN1bHQgaXMgaW50ZW5kZWQgdG8gYmUgbWFjaGluZSByZWFkYWJsZSAoaS5lLiwgcGFyc2VDb25maWdTcGVjCi0JICogd2lsbCBwYXJzZSB0aGUgdGhlIHJlc3VsdCkuCi0JICogQHBhcmFtIHdzIHRoZSB3aW5kb3cgc3lzdGVtCi0JICogQHBhcmFtIG9zIHRoZSBvcGVyYXRpbmcgc3lzdGVtCi0JICogQHBhcmFtIGFyY2ggdGhlIG1hY2hpbmUgYXJjaGl0ZWN0dXJlCi0JICogQHJldHVybiB0aGUgbWFjaGluZSByZWFkYWJsZSBmb3JtYXQgb2YgdGhlIGdpdmVuIGNvbmZpZyBzcGVjCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlQ29uZmlnU3BlYyhTdHJpbmcgd3MsIFN0cmluZyBvcywgU3RyaW5nIGFyY2gpIHsKLQkJcmV0dXJuIHdzICsgJy4nICsgb3MgKyAnLicgKyBhcmNoOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hBcnRpZmFjdChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIEZpbGVbXSBmaWxlcywgSVB1Ymxpc2hlckluZm8gaW5mbywgaW50IG1vZGUpIHsKLQkJcHVibGlzaEFydGlmYWN0KGRlc2NyaXB0b3IsIGZpbGVzLCBudWxsLCBpbmZvLCBtb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoQXJ0aWZhY3QoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBGaWxlIGJhc2UsIEZpbGVbXSBmaWxlcywgSVB1Ymxpc2hlckluZm8gaW5mbywgaW50IG1vZGUpIHsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeSBkZXN0aW5hdGlvbiA9IGluZm8uZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KCk7Ci0JCWlmIChkZXNjcmlwdG9yID09IG51bGwgfHwgZGVzdGluYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBwdWJsaXNoIHRoZSBnaXZlbiBmaWxlcwotCQlwdWJsaXNoQXJ0aWZhY3QoZGVzY3JpcHRvciwgZmlsZXMsIG51bGwsIGluZm8sIG1vZGUpOwotCi0JCS8vIGlmIHdlIGFyZSBhc3NpbWlsYXRpbmcgcGFjazIwMCBmaWxlcyB0aGVuIGFkZCB0aGUgcGFja2VkIGRlc2NyaXB0b3IKLQkJLy8gaW50byB0aGUgcmVwbyBhc3N1bWluZyBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgotCQlib29sZWFuIHJldXNlID0gInRydWUiLmVxdWFscyhkZXN0aW5hdGlvbi5nZXRQcm9wZXJ0aWVzKCkuZ2V0KEFic3RyYWN0UHVibGlzaGVyQXBwbGljYXRpb24uUFVCTElTSF9QQUNLX0ZJTEVTX0FTX1NJQkxJTkdTKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGJhc2UgIT0gbnVsbCAmJiByZXVzZSAmJiAoaW5mby5nZXRBcnRpZmFjdE9wdGlvbnMoKSAmIElQdWJsaXNoZXJJbmZvLkFfUFVCTElTSCkgPiAwKSB7Ci0JCQlGaWxlIHBhY2tGaWxlID0gbmV3IFBhdGgoYmFzZS5nZXRBYnNvbHV0ZVBhdGgoKSkuYWRkRmlsZUV4dGVuc2lvbigicGFjay5neiIpLnRvRmlsZSgpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocGFja0ZpbGUuZXhpc3RzKCkpIHsKLQkJCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGFkMjAwID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlUGFjazIwMEFydGlmYWN0RGVzY3JpcHRvcihkZXNjcmlwdG9yLmdldEFydGlmYWN0S2V5KCksIHBhY2tGaWxlLCBkZXNjcmlwdG9yLmdldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuQVJUSUZBQ1RfU0laRSkpOwotCQkJCXB1Ymxpc2hBcnRpZmFjdChhZDIwMCwgbmV3IEZpbGVbXSB7cGFja0ZpbGV9LCBudWxsLCBpbmZvLCBBU19JUyB8IElOQ0xVREVfUk9PVCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoQXJ0aWZhY3QoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBGaWxlW10gZmlsZXMsIEZpbGUgcm9vdCwgSVB1Ymxpc2hlckluZm8gaW5mbywgaW50IG1vZGUpIHsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeSBkZXN0aW5hdGlvbiA9IGluZm8uZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KCk7Ci0KLQkJLy8gaWYgdGhlIGRlc3RpbmF0aW9uIGFscmVhZHkgY29udGFpbnMgdGhlIGRlc2NyaXB0b3IsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCi0JCWlmIChkZXN0aW5hdGlvbi5jb250YWlucyhkZXNjcmlwdG9yKSkKLQkJCXJldHVybjsKLQkJLy8gaWYgYWxsIHdlIGFyZSBkb2luZyBpcyBpbmRleGluZyB0aGluZ3MgdGhlbiBhZGQgdGhlIGRlc2NyaXB0b3IgYW5kIGdldCBvbiB3aXRoIHRpCi0JCWlmICgoaW5mby5nZXRBcnRpZmFjdE9wdGlvbnMoKSAmIElQdWJsaXNoZXJJbmZvLkFfUFVCTElTSCkgPT0gMCkgewotCQkJZGVzdGluYXRpb24uYWRkRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gb3ZlcndyaXRlID0gKGluZm8uZ2V0QXJ0aWZhY3RPcHRpb25zKCkgJiBJUHVibGlzaGVySW5mby5BX09WRVJXUklURSkgPiAwOwotCQkvLyBpZiB0aGVyZSBpcyBqdXN0IG9uZSBmaWxlIGFuZCB0aGUgbW9kZSBpcyBhcy1pcywganVzdCBjb3B5IHRoZSBmaWxlIGludG8gdGhlIHJlcG8KLQkJaWYgKCgobW9kZSAmIEFTX0lTKSA+IDApICYmIGZpbGVzLmxlbmd0aCA9PSAxKSB7Ci0JCQl0cnkgewotCQkJCU91dHB1dFN0cmVhbSBvdXRwdXQgPSBkZXN0aW5hdGlvbi5nZXRPdXRwdXRTdHJlYW0oZGVzY3JpcHRvciwgb3ZlcndyaXRlKTsKLQkJCQlpZiAob3V0cHV0ID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQlvdXRwdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0cHV0KTsKLQkJCQlGaWxlVXRpbHMuY29weVN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGVzWzBdKSksIHRydWUsIG91dHB1dCwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ0hlbHBlci5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkVycm9yIHB1Ymxpc2hpbmcgYXJ0aWZhY3RzIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvLyBvdGhlcndpc2UsIHppcCB1cCB0aGUgZmlsZXMgYW5kIGNvcHkgdGhlIHppcCBpbnRvIHRoZSByZXBvCi0JCQlGaWxlIHRlbXBGaWxlID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJT3V0cHV0U3RyZWFtIG91dHB1dCA9IGRlc3RpbmF0aW9uLmdldE91dHB1dFN0cmVhbShkZXNjcmlwdG9yLCBvdmVyd3JpdGUpOwotCQkJCWlmIChvdXRwdXQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCW91dHB1dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShvdXRwdXQpOwotCQkJCXRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgicDIuZ2VuZXJhdG9yIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpZiAocm9vdCA9PSBudWxsKQotCQkJCQlGaWxlVXRpbHMuemlwKGZpbGVzLCB0ZW1wRmlsZSwgKG1vZGUgJiBJTkNMVURFX1JPT1QpID4gMCk7Ci0JCQkJZWxzZQotCQkJCQlGaWxlVXRpbHMuemlwKGZpbGVzLCB0ZW1wRmlsZSwgcm9vdCk7Ci0JCQkJaWYgKG91dHB1dCAhPSBudWxsKQotCQkJCQlGaWxlVXRpbHMuY29weVN0cmVhbShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHRlbXBGaWxlKSksIHRydWUsIG91dHB1dCwgdHJ1ZSk7Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ0hlbHBlci5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkVycm9yIHB1Ymxpc2hpbmcgYXJ0aWZhY3RzIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGZpbmFsbHkgewotCQkJCWlmICh0ZW1wRmlsZSAhPSBudWxsKQotCQkJCQl0ZW1wRmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBJU3RhdHVzIHBlcmZvcm0oSVB1Ymxpc2hlckluZm8gaW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZTBjYWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dCA9IG51bGw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9CdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE5MDQ0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9CdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5wbHVnaW5jb252ZXJzaW9uLlBsdWdpbkNvbnZlcnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnBsdWdpbmNvbnZlcnNpb24uUGx1Z2luQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVIgPSAiZGlyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUiA9ICJqYXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfRklMRU5BTUVfREVTQ1JJUFRPUiA9ICJmZWF0dXJlLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0ZJTEVOQU1FX0RFU0NSSVBUT1IgPSAicGx1Z2luLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBR01FTlRfRklMRU5BTUVfREVTQ1JJUFRPUiA9ICJmcmFnbWVudC54bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCVU5ETEVfU0hBUEUgPSAiRWNsaXBzZS1CdW5kbGVTaGFwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CVU5ETEVfTE9DQUxJWkFUSU9OID0gInBsdWdpbiI7IC8vJE5PTi1OTFMtMSQJCi0JLy8Jc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0ZJTEVfRVhURU5TSU9OID0gIi5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCS8vCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1RfTE9DQUxJWkFUSU9OUyA9ICJlY2xpcHNlLnAyLm1hbmlmZXN0LmxvY2FsaXphdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JLy8KLQkvLwlzdGF0aWMgZmluYWwgTG9jYWxlIERFRkFVTFRfTE9DQUxFID0gbmV3IExvY2FsZSgiZGYiLCAiTFQiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkvLwlzdGF0aWMgZmluYWwgTG9jYWxlIFBTRVVET19MT0NBTEUgPSBuZXcgTG9jYWxlKCJ6eiIsICJaWiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCi0JU3RhdGVPYmplY3RGYWN0b3J5IGZhY3Rvcnk7Ci0JU3RhdGUgc3RhdGU7Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeSBnZXRCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVBsYXRmb3JtQWRtaW4gcGxhdGZvcm1BZG1pbiA9IChQbGF0Zm9ybUFkbWluKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoY29udGV4dCwgUGxhdGZvcm1BZG1pbi5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAocGxhdGZvcm1BZG1pbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUGxhdGZvcm1BZG1pbiBub3QgcmVnaXN0ZXJlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeShwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeShTdGF0ZU9iamVjdEZhY3RvcnkgZmFjdG9yeSwgU3RhdGUgc3RhdGUpIHsKLQkJdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKLQkJdGhpcy5zdGF0ZSA9IHN0YXRlOwotCQkvL1RPRE8gZmluZCBhIHN0YXRlIGFuZCBhIGZhY3Rvcnkgd2hlbiBub3QgcHJvdmlkZWQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQbHVnaW5Db252ZXJ0ZXIgYWNxdWlyZVBsdWdpbkNvbnZlcnRlcigpIHsKLQkJcmV0dXJuIChQbHVnaW5Db252ZXJ0ZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBQbHVnaW5Db252ZXJ0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBEaWN0aW9uYXJ5IGNvbnZlcnRQbHVnaW5NYW5pZmVzdChGaWxlIGJ1bmRsZUxvY2F0aW9uLCBib29sZWFuIGxvZ0NvbnZlcnNpb25FeGNlcHRpb24pIHsKLQkJUGx1Z2luQ29udmVydGVyIGNvbnZlcnRlcjsKLQkJdHJ5IHsKLQkJCWNvbnZlcnRlciA9IGFjcXVpcmVQbHVnaW5Db252ZXJ0ZXIoKTsKLQkJCWlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJVbmFibGUgdG8gYXF1aXJlIFBsdWdpbkNvbnZlcnRlciBzZXJ2aWNlIGR1cmluZyBnZW5lcmF0aW9uIGZvcjogIiArIGJ1bmRsZUxvY2F0aW9uKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gY29udmVydGVyLmNvbnZlcnRNYW5pZmVzdChidW5kbGVMb2NhdGlvbiwgZmFsc2UsIG51bGwsIHRydWUsIG51bGwpOwotCQl9IGNhdGNoIChQbHVnaW5Db252ZXJzaW9uRXhjZXB0aW9uIGNvbnZlcnRFeGNlcHRpb24pIHsKLQkJCS8vIG9ubHkgbG9nIHRoZSBleGNlcHRpb24gaWYgd2UgaGFkIGEgcGx1Z2luLnhtbCBvciBmcmFnbWVudC54bWwgYW5kIHdlIGZhaWxlZCBjb252ZXJzaW9uCi0JCQlpZiAoYnVuZGxlTG9jYXRpb24uZ2V0TmFtZSgpLmVxdWFscyhGRUFUVVJFX0ZJTEVOQU1FX0RFU0NSSVBUT1IpKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKCFuZXcgRmlsZShidW5kbGVMb2NhdGlvbiwgUExVR0lOX0ZJTEVOQU1FX0RFU0NSSVBUT1IpLmV4aXN0cygpICYmICFuZXcgRmlsZShidW5kbGVMb2NhdGlvbiwgRlJBR01FTlRfRklMRU5BTUVfREVTQ1JJUFRPUikuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAobG9nQ29udmVyc2lvbkV4Y2VwdGlvbikgewotCQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEFjdGl2YXRvci5JRCwgMCwgTkxTLmJpbmQoTWVzc2FnZXMuZXhjZXB0aW9uX2Vycm9yQ29udmVydGluZywgYnVuZGxlTG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkpLCBjb252ZXJ0RXhjZXB0aW9uKTsKLQkJCQlMb2dIZWxwZXIubG9nKHN0YXR1cyk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBnZXRCdW5kbGVEZXNjcmlwdGlvbihEaWN0aW9uYXJ5IGVuaGFuY2VkTWFuaWZlc3QsIEZpbGUgYnVuZGxlTG9jYXRpb24pIHsKLQkJdHJ5IHsKLQkJCUJ1bmRsZURlc2NyaXB0aW9uIGRlc2NyaXB0b3IgPSBmYWN0b3J5LmNyZWF0ZUJ1bmRsZURlc2NyaXB0aW9uKHN0YXRlLCBlbmhhbmNlZE1hbmlmZXN0LCBidW5kbGVMb2NhdGlvbiAhPSBudWxsID8gYnVuZGxlTG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCkgOiBudWxsLCAxKTsgLy9UT0RPIERvIHdlIG5lZWQgdG8gaGF2ZSBhIHJlYWwgYnVuZGxlIGlkCi0JCQlkZXNjcmlwdG9yLnNldFVzZXJPYmplY3QoZW5oYW5jZWRNYW5pZmVzdCk7Ci0JCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoTWVzc2FnZXMuZXhjZXB0aW9uX3N0YXRlQWRkaXRpb24sIGJ1bmRsZUxvY2F0aW9uID09IG51bGwgPyBudWxsIDogYnVuZGxlTG9jYXRpb24uZ2V0QWJzb2x1dGVGaWxlKCkpOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQWN0aXZhdG9yLklELCBtZXNzYWdlLCBlKTsKLQkJCUxvZ0hlbHBlci5sb2coc3RhdHVzKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIEJ1bmRsZURlc2NyaXB0aW9uIGdldEJ1bmRsZURlc2NyaXB0aW9uKEZpbGUgYnVuZGxlTG9jYXRpb24pIHsKLQkJRGljdGlvbmFyeSBtYW5pZmVzdCA9IGxvYWRNYW5pZmVzdChidW5kbGVMb2NhdGlvbik7Ci0JCWlmIChtYW5pZmVzdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRCdW5kbGVEZXNjcmlwdGlvbihtYW5pZmVzdCwgYnVuZGxlTG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyBCdW5kbGVEZXNjcmlwdGlvbiBnZXRCdW5kbGVEZXNjcmlwdGlvbihJbnB1dFN0cmVhbSBtYW5pZmVzdFN0cmVhbSwgRmlsZSBidW5kbGVMb2NhdGlvbikgewotCQlIYXNodGFibGUgZW50cmllcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJdHJ5IHsKLQkJCU1hbmlmZXN0RWxlbWVudC5wYXJzZUJ1bmRsZU1hbmlmZXN0KG1hbmlmZXN0U3RyZWFtLCBlbnRyaWVzKTsKLQkJCXJldHVybiBnZXRCdW5kbGVEZXNjcmlwdGlvbihlbnRyaWVzLCBidW5kbGVMb2NhdGlvbik7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHJlYWRpbmcgdGhlIGJ1bmRsZSBkZXNjcmlwdGlvbi4iOwotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgbWVzc2FnZSwgZSk7Ci0JCQlMb2dIZWxwZXIubG9nKHN0YXR1cyk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9ICJBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSByZWFkaW5nIHRoZSBidW5kbGUgZGVzY3JpcHRpb24uIjsKLQkJCUlTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIG1lc3NhZ2UsIGUpOwotCQkJTG9nSGVscGVyLmxvZyhzdGF0dXMpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGljdGlvbmFyeSBsb2FkTWFuaWZlc3QoRmlsZSBidW5kbGVMb2NhdGlvbikgewotCQlJbnB1dFN0cmVhbSBtYW5pZmVzdFN0cmVhbSA9IG51bGw7Ci0JCVppcEZpbGUgamFyRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoImphciIuZXF1YWxzSWdub3JlQ2FzZShuZXcgUGF0aChidW5kbGVMb2NhdGlvbi5nZXROYW1lKCkpLmdldEZpbGVFeHRlbnNpb24oKSkgJiYgYnVuZGxlTG9jYXRpb24uaXNGaWxlKCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWphckZpbGUgPSBuZXcgWmlwRmlsZShidW5kbGVMb2NhdGlvbiwgWmlwRmlsZS5PUEVOX1JFQUQpOwotCQkJCVppcEVudHJ5IG1hbmlmZXN0RW50cnkgPSBqYXJGaWxlLmdldEVudHJ5KEphckZpbGUuTUFOSUZFU1RfTkFNRSk7Ci0JCQkJaWYgKG1hbmlmZXN0RW50cnkgIT0gbnVsbCkgewotCQkJCQltYW5pZmVzdFN0cmVhbSA9IGphckZpbGUuZ2V0SW5wdXRTdHJlYW0obWFuaWZlc3RFbnRyeSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlGaWxlIG1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBKYXJGaWxlLk1BTklGRVNUX05BTUUpOwotCQkJCWlmIChtYW5pZmVzdEZpbGUuZXhpc3RzKCkpCi0JCQkJCW1hbmlmZXN0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShtYW5pZmVzdEZpbGUpKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy9pZ25vcmUgYnV0IGxvZwotCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQWN0aXZhdG9yLklELCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgYnVuZGxlIG1hbmlmZXN0LiIsIGUpKTsKLQkJfQotCi0JCURpY3Rpb25hcnkgbWFuaWZlc3QgPSBudWxsOwotCQlpZiAobWFuaWZlc3RTdHJlYW0gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlNYXAgbWFuaWZlc3RNYXAgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VCdW5kbGVNYW5pZmVzdChtYW5pZmVzdFN0cmVhbSwgbnVsbCk7Ci0JCQkJLy8gVE9ETyB0ZW1wb3JhcnkgaGFjay4gIFdlIGFyZSByZWFkaW5nIGEgTWFwIGJ1dCBldmVyeW9uZSB3YW50cyBhIERpY3Rpb25hcnkgc28gY29udmVydC4KLQkJCQkvLyByZWFsIGFuc3dlciBpcyB0byBoYXZlIHBlb3BsZSBleHBlY3QgYSBNYXAgYnV0IHRoYXQgaXMgYSB3aWRlciBjaGFuZ2UuCi0JCQkJbWFuaWZlc3QgPSBuZXcgSGFzaHRhYmxlKG1hbmlmZXN0TWFwKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0aGUgYnVuZGxlIG1hbmlmZXN0LiIsIGUpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkFuIGVycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgdGhlIGJ1bmRsZSBtYW5pZmVzdC4iLCBlKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChqYXJGaWxlICE9IG51bGwpCi0JCQkJCQlqYXJGaWxlLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKLQkJCQkJLy9JZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQltYW5pZmVzdCA9IGNvbnZlcnRQbHVnaW5NYW5pZmVzdChidW5kbGVMb2NhdGlvbiwgdHJ1ZSk7Ci0JCX0KLQotCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vRGVhbCB3aXRoIHRoZSBwcmUtMy4wIHBsdWctaW4gc2hhcGUgd2hvIGhhdmUgYSBkZWZhdWx0IGphciBtYW5pZmVzdC5tZgotCQlpZiAobWFuaWZlc3QuZ2V0KG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSkgPT0gbnVsbCkKLQkJCW1hbmlmZXN0ID0gY29udmVydFBsdWdpbk1hbmlmZXN0KGJ1bmRsZUxvY2F0aW9uLCB0cnVlKTsKLQotCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBpZiB0aGUgYnVuZGxlIGl0c2VsZiBkb2VzIG5vdCBkZWZpbmUgaXRzIHNoYXBlLCBpbmZlciB0aGUgc2hhcGUgZnJvbSB0aGUgY3VycmVudCBmb3JtCi0JCWlmIChtYW5pZmVzdC5nZXQoQlVORExFX1NIQVBFKSA9PSBudWxsKQotCQkJbWFuaWZlc3QucHV0KEJVTkRMRV9TSEFQRSwgYnVuZGxlTG9jYXRpb24uaXNEaXJlY3RvcnkoKSA/IERJUiA6IEpBUik7Ci0JCWdldE1hbmlmZXN0TG9jYWxpemF0aW9ucyhtYW5pZmVzdCwgYnVuZGxlTG9jYXRpb24pOwotCQkvLyBsb2NhbGl6ZU1hbmlmZXN0KG1hbmlmZXN0LCBidW5kbGVMb2NhdGlvbik7Ci0JCXJldHVybiBtYW5pZmVzdDsKLQl9Ci0KLQkvLwlwcml2YXRlIFByb3BlcnRpZXMgbG9hZFByb3BlcnRpZXMoRmlsZSBidW5kbGVMb2NhdGlvbiwgU3RyaW5nIGxvY2FsaXphdGlvbkZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8JCVByb3BlcnRpZXMgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXMoKTsKLQkvLwkJSW5wdXRTdHJlYW0gcHJvcGVydHlTdHJlYW0gPSBudWxsOwotCS8vCQl0cnkgewotCS8vCQkJdHJ5IHsKLQkvLwkJCQlpZiAoYnVuZGxlTG9jYXRpb24uaXNEaXJlY3RvcnkoKSkKLQkvLwkJCQkJcHJvcGVydHlTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBsb2NhbGl6YXRpb25GaWxlKSk7Ci0JLy8JCQkJZWxzZSB7Ci0JLy8JCQkJCVVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG5ldyBVUkwoImphcjoiICsgYnVuZGxlTG9jYXRpb24udG9VUkwoKS50b0V4dGVybmFsRm9ybSgpICsgIiEvIiArIGxvY2FsaXphdGlvbkZpbGUpLm9wZW5Db25uZWN0aW9uKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8vCQkJCQljb25uZWN0aW9uLnNldFVzZUNhY2hlcyhmYWxzZSk7Ci0JLy8JCQkJCXByb3BlcnR5U3RyZWFtID0gY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCS8vCQkJCX0KLQkvLwkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JLy8JCQkJLy8gaWYgdGhlcmUgaXMgbm8gbWVzc2FnZXMgZmlsZSB0aGVuIGp1c3QgcmV0dXJuOwotCS8vCQkJCXJldHVybiByZXN1bHQ7Ci0JLy8JCQl9Ci0JLy8JCQlyZXN1bHQubG9hZChwcm9wZXJ0eVN0cmVhbSk7Ci0JLy8JCX0gZmluYWxseSB7Ci0JLy8JCQlpZiAocHJvcGVydHlTdHJlYW0gIT0gbnVsbCkKLQkvLwkJCQlwcm9wZXJ0eVN0cmVhbS5jbG9zZSgpOwotCS8vCQl9Ci0JLy8JCXJldHVybiByZXN1bHQ7Ci0JLy8JfQotCi0JLy8gQ29sbGVjdCB0aGUgbWFuaWZlc3QgbG9jYWxpemF0aW9ucyBmcm9tIHRoZSBidW5kbGUgZGlyZWN0b3J5Ci0JLy8gYW5kIHN0b3JlIHRoZW0gaW4gdGhlIG1hbmlmZXN0LgotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0TWFuaWZlc3RMb2NhbGl6YXRpb25zKERpY3Rpb25hcnkgbWFuaWZlc3QsIEZpbGUgYnVuZGxlTG9jYXRpb24pIHsKLQkJLy8JCU1hcCBsb2NhbGl6YXRpb25zOwotCQkvLwkJTG9jYWxlIGRlZmF1bHRMb2NhbGUgPSBudWxsOyAvLyA9IExvY2FsZS5FTkdMSVNIOyAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIEdlbmVyYXRvckluZm8KLQkJLy8JCVN0cmluZyBidW5kbGVMb2NhbGl6YXRpb24gPSAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9MT0NBTElaQVRJT04pOwotCQkvLwkJaWYgKGJ1bmRsZUxvY2FsaXphdGlvbiA9PSBudWxsIHx8IGJ1bmRsZUxvY2FsaXphdGlvbi50cmltKCkubGVuZ3RoKCkgPT0gMCkKLQkJLy8JCQlidW5kbGVMb2NhbGl6YXRpb24gPSBERUZBVUxUX0JVTkRMRV9MT0NBTElaQVRJT047Ci0JCS8vCi0JCS8vCQlpZiAoImphciIuZXF1YWxzSWdub3JlQ2FzZShuZXcgUGF0aChidW5kbGVMb2NhdGlvbi5nZXROYW1lKCkpLmdldEZpbGVFeHRlbnNpb24oKSkgJiYgLy8kTk9OLU5MUy0xJAotCQkvLwkJCQlidW5kbGVMb2NhdGlvbi5pc0ZpbGUoKSkgewotCQkvLwkJCWxvY2FsaXphdGlvbnMgPSBnZXRKYXJNYW5pZmVzdExvY2FsaXphdGlvbihidW5kbGVMb2NhdGlvbiwgYnVuZGxlTG9jYWxpemF0aW9uLCBtYW5pZmVzdCwgZGVmYXVsdExvY2FsZSk7Ci0JCS8vCQl9IGVsc2UgewotCQkvLwkJCWxvY2FsaXphdGlvbnMgPSBnZXREaXJNYW5pZmVzdExvY2FsaXphdGlvbihidW5kbGVMb2NhdGlvbiwgYnVuZGxlTG9jYWxpemF0aW9uLCBtYW5pZmVzdCwgZGVmYXVsdExvY2FsZSk7Ci0JCS8vCQl9Ci0JCS8vCi0JCS8vCQlpZiAobG9jYWxpemF0aW9ucy5zaXplKCkgPiAwKSB7Ci0JCS8vCQkJbWFuaWZlc3QucHV0KE1BTklGRVNUX0xPQ0FMSVpBVElPTlMsIGxvY2FsaXphdGlvbnMpOwotCQkvLwkJfQotCX0KLQotCS8vCXByaXZhdGUgTWFwIGdldEphck1hbmlmZXN0TG9jYWxpemF0aW9uKEZpbGUgYnVuZGxlTG9jYXRpb24sIFN0cmluZyBidW5kbGVMb2NhbGl6YXRpb24sIERpY3Rpb25hcnkgbWFuaWZlc3QsIExvY2FsZSBkZWZhdWx0TG9jYWxlKSB7Ci0JLy8JCVppcEZpbGUgamFyRmlsZSA9IG51bGw7Ci0JLy8JCU1hcCBsb2NhbGl6YXRpb25zID0gbmV3IEhhc2hNYXAoNCk7Ci0JLy8JCXRyeSB7Ci0JLy8JCQlqYXJGaWxlID0gbmV3IFppcEZpbGUoYnVuZGxlTG9jYXRpb24sIFppcEZpbGUuT1BFTl9SRUFEKTsKLQkvLwkJCWZvciAoRW51bWVyYXRpb24gZW50cmllcyA9IGphckZpbGUuZW50cmllcygpOyBlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpOykgewotCS8vCQkJCVppcEVudHJ5IG5leHRFbnRyeSA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOwotCS8vCQkJCVN0cmluZyBuZXh0TmFtZSA9IG5leHRFbnRyeS5nZXROYW1lKCk7Ci0JLy8JCQkJU3RyaW5nIGxvY2FsZVN0cmluZyA9IGdldExvY2FsZVN0cmluZyhuZXh0TmFtZSwgYnVuZGxlTG9jYWxpemF0aW9uKTsKLQkvLwotCS8vCQkJCWlmICghbmV4dEVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgbG9jYWxlU3RyaW5nICE9IG51bGwpIHsKLQkvLwkJCQkJTG9jYWxlIG5leHRMb2NhbGUgPSBnZXRMb2NhbGUobG9jYWxlU3RyaW5nKTsKLQkvLwkJCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQkvLwkJCQkJdHJ5IHsKLQkvLwkJCQkJCXN0cmVhbSA9IGphckZpbGUuZ2V0SW5wdXRTdHJlYW0obmV4dEVudHJ5KTsKLQkvLwkJCQkJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JLy8JCQkJCQlwcm9wZXJ0aWVzLmxvYWQoc3RyZWFtKTsKLQkvLwkJCQkJCVByb3BlcnRpZXMgbG9jYWxpemVkU3RyaW5ncyA9IGdldExvY2FsaXplZFByb3BlcnRpZXMobWFuaWZlc3QsIHByb3BlcnRpZXMpOwotCS8vCQkJCQkJaWYgKGxvY2FsaXplZFN0cmluZ3Muc2l6ZSgpID4gMCkgewotCS8vCQkJCQkJCWxvY2FsaXphdGlvbnMucHV0KG5leHRMb2NhbGUsIGxvY2FsaXplZFN0cmluZ3MpOwotCS8vCQkJCQkJCWlmIChERUZBVUxUX0xPQ0FMRS5lcXVhbHMobmV4dExvY2FsZSkgJiYgZGVmYXVsdExvY2FsZSAhPSBudWxsKSB7Ci0JLy8JCQkJCQkJCWxvY2FsaXphdGlvbnMucHV0KG5leHRMb2NhbGUsIGxvY2FsaXplZFN0cmluZ3MpOwotCS8vCQkJCQkJCX0KLQkvLwkJCQkJCX0KLQkvLwkJCQkJfSBmaW5hbGx5IHsKLQkvLwkJCQkJCWlmIChzdHJlYW0gIT0gbnVsbCkKLQkvLwkJCQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkvLwkJCQkJfQotCS8vCQkJCX0KLQkvLwkJCX0KLQkvLwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JLy8JCQlpb2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JLy8JCX0gZmluYWxseSB7Ci0JLy8JCQlpZiAoamFyRmlsZSAhPSBudWxsKSB7Ci0JLy8JCQkJdHJ5IHsKLQkvLwkJCQkJamFyRmlsZS5jbG9zZSgpOwotCS8vCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCS8vCQkJCQkvLyBkbyBub3RoaW5nCi0JLy8JCQkJfQotCS8vCQkJfQotCS8vCQl9Ci0JLy8KLQkvLwkJcmV0dXJuIGxvY2FsaXphdGlvbnM7Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSBNYXAgZ2V0RGlyTWFuaWZlc3RMb2NhbGl6YXRpb24oRmlsZSBidW5kbGVMb2NhdGlvbiwgU3RyaW5nIGJ1bmRsZUxvY2FsaXphdGlvbiwgRGljdGlvbmFyeSBtYW5pZmVzdCwgTG9jYWxlIGRlZmF1bHRMb2NhbGUpIHsKLQkvLwkJRmlsZSBsb2NhbGl6YXRpb25QYXRoID0gbmV3IEZpbGUoYnVuZGxlTG9jYXRpb24sIGJ1bmRsZUxvY2FsaXphdGlvbik7Ci0JLy8JCUZpbGUgbG9jYWxpemF0aW9uRGlyID0gbG9jYWxpemF0aW9uUGF0aC5nZXRQYXJlbnRGaWxlKCk7Ci0JLy8JCVN0cmluZyBsb2NhbGl6YXRpb25GaWxlID0gbG9jYWxpemF0aW9uUGF0aC5nZXROYW1lKCk7Ci0JLy8JCVN0cmluZ1tdIGxvY2FsaXphdGlvbkZpbGVzID0gbG9jYWxpemF0aW9uRGlyLmxpc3QobmV3IExvY2FsaXphdGlvbkZpbGVGaWx0ZXIobG9jYWxpemF0aW9uRmlsZSkpOwotCS8vCi0JLy8JCUhhc2hNYXAgbG9jYWxpemF0aW9ucyA9IG51bGw7Ci0JLy8KLQkvLwkJaWYgKGxvY2FsaXphdGlvbkZpbGVzICE9IG51bGwpIHsKLQkvLwkJCWxvY2FsaXphdGlvbnMgPSBuZXcgSGFzaE1hcChsb2NhbGl6YXRpb25GaWxlcy5sZW5ndGgpOwotCS8vCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbGl6YXRpb25GaWxlcy5sZW5ndGg7IGkrKykgewotCS8vCQkJCVN0cmluZyBuZXh0RmlsZSA9IGxvY2FsaXphdGlvbkZpbGVzW2ldOwotCS8vCQkJCUxvY2FsZSBuZXh0TG9jYWxlID0gZ2V0TG9jYWxlKGdldExvY2FsZVN0cmluZyhuZXh0RmlsZSwgbG9jYWxpemF0aW9uRmlsZSkpOwotCS8vCi0JLy8JCQkJdHJ5IHsKLQkvLwkJCQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbG9hZFByb3BlcnRpZXMoYnVuZGxlTG9jYXRpb24sIG5leHRGaWxlKTsKLQkvLwkJCQkJUHJvcGVydGllcyBsb2NhbGl6ZWRTdHJpbmdzID0gZ2V0TG9jYWxpemVkUHJvcGVydGllcyhtYW5pZmVzdCwgcHJvcGVydGllcyk7Ci0JLy8JCQkJCWlmIChsb2NhbGl6ZWRTdHJpbmdzLnNpemUoKSA+IDApIHsKLQkvLwkJCQkJCWxvY2FsaXphdGlvbnMucHV0KG5leHRMb2NhbGUsIGxvY2FsaXplZFN0cmluZ3MpOwotCS8vCQkJCQkJaWYgKERFRkFVTFRfTE9DQUxFLmVxdWFscyhuZXh0TG9jYWxlKSAmJiBkZWZhdWx0TG9jYWxlICE9IG51bGwpIHsKLQkvLwkJCQkJCQlsb2NhbGl6YXRpb25zLnB1dChuZXh0TG9jYWxlLCBsb2NhbGl6ZWRTdHJpbmdzKTsKLQkvLwkJCQkJCX0KLQkvLwkJCQkJfQotCS8vCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCS8vCQkJCQlpb2UucHJpbnRTdGFja1RyYWNlKCk7Ci0JLy8JCQkJfQotCS8vCQkJfQotCS8vCQl9Ci0JLy8KLQkvLwkJcmV0dXJuIGxvY2FsaXphdGlvbnM7Ci0JLy8JfQotCi0JLy8JcHJpdmF0ZSBjbGFzcyBMb2NhbGl6YXRpb25GaWxlRmlsdGVyIGltcGxlbWVudHMgRmlsZW5hbWVGaWx0ZXIgewotCS8vCi0JLy8JCVN0cmluZyBmaWxlbmFtZVByZWZpeDsKLQkvLwotCS8vCQlwdWJsaWMgTG9jYWxpemF0aW9uRmlsZUZpbHRlcihTdHJpbmcgZmlsZW5hbWVQcmVmaXgpIHsKLQkvLwkJCXRoaXMuZmlsZW5hbWVQcmVmaXggPSBmaWxlbmFtZVByZWZpeDsKLQkvLwkJfQotCS8vCi0JLy8JCS8qIChub24tSmF2YWRvYykKLQkvLwkJICogQHNlZSBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyI2FjY2VwdChqYXZhLmlvLkZpbGUsIGphdmEubGFuZy5TdHJpbmcpCi0JLy8JCSAqLwotCS8vCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXJlY3RvcnksIFN0cmluZyBmaWxlbmFtZSkgewotCS8vCQkJcmV0dXJuIChnZXRMb2NhbGVTdHJpbmcoZmlsZW5hbWUsIGZpbGVuYW1lUHJlZml4KSAhPSBudWxsID8gdHJ1ZSA6IGZhbHNlKTsKLQkvLwkJfQotCS8vCX0KLQotCS8vCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldExvY2FsZVN0cmluZyhTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBmaWxlbmFtZVByZWZpeCkgewotCS8vCQlTdHJpbmcgbG9jYWxlU3RyaW5nID0gbnVsbDsKLQkvLwkJaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoZmlsZW5hbWVQcmVmaXgpICYmIGZpbGVuYW1lLmVuZHNXaXRoKFBST1BFUlRJRVNfRklMRV9FWFRFTlNJT04pKSB7Ci0JLy8JCQlpZiAoZmlsZW5hbWUubGVuZ3RoKCkgPiBmaWxlbmFtZVByZWZpeC5sZW5ndGgoKSArIFBST1BFUlRJRVNfRklMRV9FWFRFTlNJT04ubGVuZ3RoKCkpIHsKLQkvLwkJCQlsb2NhbGVTdHJpbmcgPSBmaWxlbmFtZS5zdWJzdHJpbmcoZmlsZW5hbWVQcmVmaXgubGVuZ3RoKCkgKyAxLCBmaWxlbmFtZS5sZW5ndGgoKSAtIFBST1BFUlRJRVNfRklMRV9FWFRFTlNJT04ubGVuZ3RoKCkpOwotCS8vCQkJfSBlbHNlIHsKLQkvLwkJCQlsb2NhbGVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCS8vCQkJfQotCS8vCQl9Ci0JLy8JCXJldHVybiBsb2NhbGVTdHJpbmc7Ci0JLy8JfQotCi0JLy8Jc3RhdGljIHByaXZhdGUgTG9jYWxlIGdldExvY2FsZShTdHJpbmcgbG9jYWxlU3RyaW5nKSB7Ci0JLy8JCUxvY2FsZSBsb2NhbGUgPSBERUZBVUxUX0xPQ0FMRTsKLQkvLwkJaWYgKGxvY2FsZVN0cmluZy5sZW5ndGgoKSA9PSA1ICYmIGxvY2FsZVN0cmluZy5pbmRleE9mKCdfJykgPT0gMikgewotCS8vCQkJbG9jYWxlID0gbmV3IExvY2FsZShsb2NhbGVTdHJpbmcuc3Vic3RyaW5nKDAsIDIpLCBsb2NhbGVTdHJpbmcuc3Vic3RyaW5nKDMsIDUpKTsKLQkvLwkJfSBlbHNlIGlmIChsb2NhbGVTdHJpbmcubGVuZ3RoKCkgPT0gMikgewotCS8vCQkJbG9jYWxlID0gbmV3IExvY2FsZShsb2NhbGVTdHJpbmcuc3Vic3RyaW5nKDAsIDIpKTsKLQkvLwkJfQotCS8vCQlyZXR1cm4gbG9jYWxlOwotCS8vCX0KLQkvLwotCS8vCXN0YXRpYyBwcml2YXRlIFByb3BlcnRpZXMgZ2V0TG9jYWxpemVkUHJvcGVydGllcyhEaWN0aW9uYXJ5IG1hbmlmZXN0LCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkvLwkJLy8gV2FsayBvdmVyIHRoZSBtYW5pZmVzdCBhbmQgZmluZCBhbGwgJXh4eCB3aXRoIHRoZSBzdHJpbmcgdmFsdWUKLQkvLwkJLy8gaW4gdGhlIHByb3BlcnRpZXMgZmlsZSBhbmQgY29weSB0aGVtIHRvIHRoZSBsb2NhbGl6ZWQgcHJvcGVydGllcy4KLQkvLwkJUHJvcGVydGllcyBsb2NhbGl6ZWRQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkvLwkJZm9yIChFbnVtZXJhdGlvbiBlID0gbWFuaWZlc3Qua2V5cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotCS8vCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkvLwkJCU9iamVjdCB2YWx1ZSA9IG1hbmlmZXN0LmdldChrZXkpOwotCS8vCQkJaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JLy8JCQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgdmFsdWU7Ci0JLy8JCQkJaWYgKHN0cmluZ1ZhbHVlLnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JLy8JCQkJCVN0cmluZyBuZXdWYWx1ZSA9IHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoc3RyaW5nVmFsdWUuc3Vic3RyaW5nKDEpKTsKLQkvLwkJCQkJaWYgKG5ld1ZhbHVlICE9IG51bGwpCi0JLy8JCQkJCQlsb2NhbGl6ZWRQcm9wZXJ0aWVzLnB1dChrZXksIG5ld1ZhbHVlKTsKLQkvLwkJCQl9Ci0JLy8JCQl9Ci0JLy8JCX0KLQkvLwkJcmV0dXJuIGxvY2FsaXplZFByb3BlcnRpZXM7Ci0JLy8JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9Db21wb3VuZFF1ZXJ5YWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvQ29tcG91bmRRdWVyeWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M5M2FhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9Db21wb3VuZFF1ZXJ5YWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuKjsKLQotcHVibGljIGNsYXNzIENvbXBvdW5kUXVlcnlhYmxlIGltcGxlbWVudHMgSVF1ZXJ5YWJsZSB7Ci0KLQlJUXVlcnlhYmxlW10gY2hpbGRyZW47Ci0KLQlwdWJsaWMgQ29tcG91bmRRdWVyeWFibGUoSVF1ZXJ5YWJsZVtdIGNoaWxkcmVuKSB7Ci0JCXRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdG9yIHF1ZXJ5KFF1ZXJ5IHF1ZXJ5LCBDb2xsZWN0b3IgY29sbGVjdG9yLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJU3ViTW9uaXRvciBzdWIgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgY2hpbGRyZW4ubGVuZ3RoICogMTApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkJY2hpbGRyZW5baV0ucXVlcnkocXVlcnksIGNvbGxlY3Rvciwgc3ViLm5ld0NoaWxkKDEpKTsKLQkJc3ViLmRvbmUoKTsKLQkJcmV0dXJuIGNvbGxlY3RvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9GaWxlU2V0RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvRmlsZVNldERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI5MjFjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9GaWxlU2V0RGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlU2V0RGVzY3JpcHRvciB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcga2V5OwotCXByaXZhdGUgU3RyaW5nIGNvbmZpZ1NwZWMgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZpbGVzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIEFycmF5TGlzdCBwZXJtaXNzaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIFN0cmluZyBsaW5rcyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRmlsZVNldERlc2NyaXB0b3IoU3RyaW5nIGtleSwgU3RyaW5nIGNvbmZpZ1NwZWMpIHsKLQkJdGhpcy5rZXkgPSBrZXk7Ci0JCXRoaXMuY29uZmlnU3BlYyA9IGNvbmZpZ1NwZWM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsZXMoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWZpbGVzID0gcHJvcGVydHk7Ci0JfQotCi0JLy8gYSBwZXJtaXNzaW9uIHNwZWMgaXMgeyA8cGVybT4sIGZpbGUgcGF0dGVybnMgfQotCXB1YmxpYyB2b2lkIGFkZFBlcm1pc3Npb25zKFN0cmluZ1tdIHByb3BlcnR5KSB7Ci0JCXBlcm1pc3Npb25zLmFkZChwcm9wZXJ0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlua3MoU3RyaW5nIHByb3BlcnR5KSB7Ci0JCWxpbmtzID0gcHJvcGVydHk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb25maWdTcGVjKCkgewotCQlyZXR1cm4gY29uZmlnU3BlYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpbmtzKCkgewotCQlyZXR1cm4gbGlua3M7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdW10gZ2V0UGVybWlzc2lvbnMoKSB7Ci0JCXJldHVybiAoU3RyaW5nW11bXSkgcGVybWlzc2lvbnMudG9BcnJheShuZXcgU3RyaW5nW3Blcm1pc3Npb25zLnNpemUoKV1bXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlcygpIHsKLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvR2VuZXJhdG9yQnVuZGxlSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvR2VuZXJhdG9yQnVuZGxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmNmNWI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0dlbmVyYXRvckJ1bmRsZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkhlYWRlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5CdW5kbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgR2VuZXJhdG9yQnVuZGxlSW5mbyBleHRlbmRzIEJ1bmRsZUluZm8gewotCS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0xFVkVMID0gLTE7Ci0KLQkvLwlwcml2YXRlIFN0cmluZyBzeW1ib2xpY05hbWU7Ci0JLy8JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLQkvLwlwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLQkvLwlwcml2YXRlIGludCBleHBlY3RlZFN0YXRlOwotCS8vCXByaXZhdGUgaW50IHN0YXJ0TGV2ZWwgPSBOT19MRVZFTDsKLQkvLwlwcml2YXRlIFN0cmluZyBtYW5pZmVzdDsKLQotCXByaXZhdGUgU3RyaW5nIHNwZWNpYWxDb25maWdDb21tYW5kczsKLQlwcml2YXRlIFN0cmluZyBzcGVjaWFsVW5jb25maWdDb21tYW5kczsKLQotCXB1YmxpYyBHZW5lcmF0b3JCdW5kbGVJbmZvKEJ1bmRsZUluZm8gYkluZm8pIHsKLQkJc3VwZXIuc2V0QnVuZGxlSWQoYkluZm8uZ2V0QnVuZGxlSWQoKSk7Ci0JCXN1cGVyLnNldExvY2F0aW9uKGJJbmZvLmdldExvY2F0aW9uKCkpOwotCQlzdXBlci5zZXRNYW5pZmVzdChiSW5mby5nZXRNYW5pZmVzdCgpKTsKLQkJc3VwZXIuc2V0TWFya2VkQXNTdGFydGVkKGJJbmZvLmlzTWFya2VkQXNTdGFydGVkKCkpOwotCQlzdXBlci5zZXRSZXNvbHZlZChiSW5mby5pc1Jlc29sdmVkKCkpOwotCQlzdXBlci5zZXRTdGFydExldmVsKGJJbmZvLmdldFN0YXJ0TGV2ZWwoKSk7Ci0JCXN1cGVyLnNldFN5bWJvbGljTmFtZShiSW5mby5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCXN1cGVyLnNldFZlcnNpb24oYkluZm8uZ2V0VmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJhdG9yQnVuZGxlSW5mbygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjb25zdHJ1Y3RvciBzdHViCi0JfQotCi0JLy8JLyogKG5vbi1KYXZhZG9jKQotCS8vCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JLy8JICovCi0JLy8JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkvLwkJaW50IHJlc3VsdCA9IHN5bWJvbGljTmFtZSA9PSBudWxsID8gMCA6IHN5bWJvbGljTmFtZS5oYXNoQ29kZSgpOwotCS8vCQlyZXN1bHQgPSByZXN1bHQgKyAodmVyc2lvbiA9PSBudWxsID8gMCA6IHZlcnNpb24uaGFzaENvZGUoKSk7Ci0JLy8JCXJlc3VsdCA9IHJlc3VsdCArIChsb2NhdGlvbiA9PSBudWxsID8gMCA6IGxvY2F0aW9uLmhhc2hDb2RlKCkpOwotCS8vCQlyZXR1cm4gcmVzdWx0OwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyBTdHJpbmcgZ2V0U3ltYm9saWNOYW1lKCkgewotCS8vCQlyZXR1cm4gc3ltYm9saWNOYW1lOwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkvLwkJcmV0dXJuIHZlcnNpb247Ci0JLy8JfQotCS8vCi0JLy8JcHVibGljIGludCBleHBlY3RlZFN0YXRlKCkgewotCS8vCQlyZXR1cm4gZXhwZWN0ZWRTdGF0ZTsKLQkvLwl9Ci0JLy8KLQkvLwlwdWJsaWMgaW50IGdldFN0YXJ0TGV2ZWwoKSB7Ci0JLy8JCXJldHVybiBzdGFydExldmVsOwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKSB7Ci0JLy8JCXJldHVybiBsb2NhdGlvbjsKLQkvLwl9Ci0JLy8KLQkvLwlwdWJsaWMgdm9pZCBzZXRTeW1ib2xpY05hbWUoU3RyaW5nIGlkKSB7Ci0JLy8JCXN5bWJvbGljTmFtZSA9IGlkOwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLQkvLwkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkvLwl9Ci0JLy8KLQkvLwlwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZFN0YXRlKGludCBzdGF0ZSkgewotCS8vCQlleHBlY3RlZFN0YXRlID0gc3RhdGU7Ci0JLy8JfQotCS8vCi0JLy8JcHVibGljIHZvaWQgc2V0U3RhcnRMZXZlbChpbnQgbGV2ZWwpIHsKLQkvLwkJdGhpcy5zdGFydExldmVsID0gbGV2ZWw7Ci0JLy8JfQotCS8vCi0JLy8JcHVibGljIHZvaWQgc2V0TG9jYXRpb24oU3RyaW5nIGxvY2F0aW9uKSB7Ci0JLy8JCXRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKLQkvLwl9Ci0JLy8KLQkvLwlwdWJsaWMgdm9pZCBzZXRNYW5pZmVzdChTdHJpbmcgbWFuaWZlc3QpIHsKLQkvLwkJdGhpcy5tYW5pZmVzdCA9IG1hbmlmZXN0OwotCS8vCX0KLQkvLwkKLQkvLwlwdWJsaWMgU3RyaW5nIGdldE1hbmlmZXN0KCkgewotCS8vCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JLy8JfQotCS8vCQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lhbENvbmZpZ0NvbW1hbmRzKCkgewotCQlyZXR1cm4gc3BlY2lhbENvbmZpZ0NvbW1hbmRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNwZWNpYWxDb25maWdDb21tYW5kcyhTdHJpbmcgc3BlY2lhbENvbmZpZ0NvbW1hbmRzKSB7Ci0JCXRoaXMuc3BlY2lhbENvbmZpZ0NvbW1hbmRzID0gc3BlY2lhbENvbmZpZ0NvbW1hbmRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY2lhbFVuY29uZmlnQ29tbWFuZHMoKSB7Ci0JCXJldHVybiBzcGVjaWFsVW5jb25maWdDb21tYW5kczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTcGVjaWFsVW5jb25maWdDb21tYW5kcyhTdHJpbmcgc3BlY2lhbFVuY29uZmlnQ29tbWFuZHMpIHsKLQkJdGhpcy5zcGVjaWFsVW5jb25maWdDb21tYW5kcyA9IHNwZWNpYWxVbmNvbmZpZ0NvbW1hbmRzOwotCX0KLQotCS8vCS8qIChub24tSmF2YWRvYykKLQkvLwkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JLy8JICovCi0JLy8JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0b0NvbXBhcmUpIHsKLQkvLwkJaWYgKHRvQ29tcGFyZSBpbnN0YW5jZW9mIEdlbmVyYXRvckJ1bmRsZUluZm8pIHsKLQkvLwkJCUdlbmVyYXRvckJ1bmRsZUluZm8gaW5mbyA9IChHZW5lcmF0b3JCdW5kbGVJbmZvKSB0b0NvbXBhcmU7Ci0JLy8JCQlpZiAoaW5mby5zeW1ib2xpY05hbWUuZXF1YWxzKHN5bWJvbGljTmFtZSkgJiYgaW5mby52ZXJzaW9uLmVxdWFscyh2ZXJzaW9uKSAmJiAoaW5mby5sb2NhdGlvbiA9PSBudWxsIHx8IGxvY2F0aW9uID09IG51bGwgPyB0cnVlIDogaW5mby5sb2NhdGlvbi5lcXVhbHMobG9jYXRpb24pKSkKLQkvLwkJCQlyZXR1cm4gdHJ1ZTsKLQkvLwkJfQotCS8vCQlyZXR1cm4gZmFsc2U7Ci0JLy8JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHN1cGVyU3QgPSBzdXBlci50b1N0cmluZygpOwotCQlpZiAoc3VwZXJTdC5sZW5ndGgoKSA+IDApCi0JCQlidWZmZXIuYXBwZW5kKHN1cGVyU3Quc3Vic3RyaW5nKDAsIHN1cGVyU3QubGVuZ3RoKCkgLSAxKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiwgdGhpcy5zcGVjaWFsQ29uZmlnQ29tbWFuZHM9Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCh0aGlzLnNwZWNpYWxDb25maWdDb21tYW5kcyk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRGcm9tTWFuaWZlc3QoU3RyaW5nIG1hbmlmZXN0KSB7Ci0JCXRyeSB7Ci0JCQlzdXBlci5zZXRNYW5pZmVzdChtYW5pZmVzdCk7Ci0JCQlIZWFkZXJzIGhlYWRlcnMgPSBIZWFkZXJzLnBhcnNlTWFuaWZlc3QobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1hbmlmZXN0LmdldEJ5dGVzKCkpKTsKLQkJCU1hbmlmZXN0RWxlbWVudFtdIGVsZW1lbnQgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VIZWFkZXIoImJzbiIsIChTdHJpbmcpIGhlYWRlcnMuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXN1cGVyLnNldFN5bWJvbGljTmFtZShlbGVtZW50WzBdLmdldFZhbHVlKCkpOwotCQkJc3VwZXIuc2V0VmVyc2lvbigoU3RyaW5nKSBoZWFkZXJzLmdldChDb25zdGFudHMuQlVORExFX1ZFUlNJT04pKTsKLQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0lQcm9kdWN0RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvSVByb2R1Y3REZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZDFjMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvSVByb2R1Y3REZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVByb2R1Y3REZXNjcmlwdG9yIHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGF1bmNoZXJOYW1lKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGFsbCBidW5kbGVzIGluIHRoaXMgcHJvZHVjdC4KLQkgKiBAcGFyYW0gaW5jbHVkZUZyYWdtZW50cyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSBmcmFnbWVudHMgaW4gdGhlIHJldHVybiB2YWx1ZQotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgYnVuZGxlcyBpbiB0aGlzIHByb2R1Y3QKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRCdW5kbGVzKGJvb2xlYW4gaW5jbHVkZUZyYWdtZW50cyk7Ci0KLQlwdWJsaWMgTGlzdCBnZXRGcmFnbWVudHMoKTsKLQotCXB1YmxpYyBMaXN0IGdldEZlYXR1cmVzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbmZpZ0luaVBhdGgoU3RyaW5nIG9zKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BsYXNoTG9jYXRpb24oKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdE5hbWUoKTsKLQotCXB1YmxpYyBib29sZWFuIHVzZUZlYXR1cmVzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0Vk1Bcmd1bWVudHMoU3RyaW5nIG9zKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZ3JhbUFyZ3VtZW50cyhTdHJpbmcgb3MpOwotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvSVB1Ymxpc2hlckluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0lQdWJsaXNoZXJJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZTI5ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvSVB1Ymxpc2hlckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGludGVyZmFjZSBJUHVibGlzaGVySW5mbyB7Ci0KLQkvKioKLQkgKiBBIGJpdHdpc2UgZmxhZyB0byBzYXkgd2hldGhlciBvciBub3QgdGhlIGluZGV4IGZvciB0aGUgYXJ0aWZhY3QgcmVwb3NpdG9yeSBzaG91bGQKLQkgKiBiZSB1cGRhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFfSU5ERVggPSAxOwotCi0JLyoqCi0JICogQSBiaXR3aXNlIGZsYWcgdG8gc2F5IHdoZXRoZXIgb3IgdGhlIGFydGlmYWN0cyB0aGVtc2VsdmVzIHNob3VsZCBiZSBwdWJsaXNoZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQV9QVUJMSVNIID0gMjsKLQotCS8qKgotCSAqIEEgYml0d2lzZSBmbGFnIHRvIHNheSB3aGV0aGVyIG9yIG5vdCB0byBvdmVyd3JpdGUgZGlzayBjb250ZW50IGRpc2NvdmVyZWQKLQkgKiBpbiB0aGUgcmVwb3NpdG9yeSB3aGVuIHB1Ymxpc2hpbmcgYW4gYXJ0aWZhY3QKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBX09WRVJXUklURSA9IDQ7Ci0KLQkvKioKLQkgKiBBIGJpdHdpc2UgZmxhZyB0byBzYXkgd2hldGhlciBvciBub3QgdG8gbGVhdmUgdGhlIGRpc2sgY29udGVudCBkaXNjb3ZlcmVkCi0JICogYXMgaXMgd2hlbiBwdWJsaXNoaW5nIGFuIGFydGlmYWN0LiAgVGhhdCBpcywgaWYgYSBkaXJlY3RvcnkgaXMgZGlzY292ZXJlZCwgaXQgaXMKLQkgKiBsZWZ0IGFzIGEgZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFfQVNfSVMgPSA4OwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXJ0aWZhY3QgcmVwb3NpdG9yeSBpbnRvIHdoaWNoIGFueSBwdWJsaXNoYWJsZSBhcnRpZmFjdHMgYXJlIHB1Ymxpc2hlZAotCSAqIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICogQHJldHVybiBhIGRlc3RpbmF0aW9uIGFydGlmYWN0IHJlcG9zaXRvcnkgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBnZXRBcnRpZmFjdFJlcG9zaXRvcnkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGFkYXRhIHJlcG9zaXRvcnkgaW50byB3aGljaCBhbnkgcHVibGlzaGFibGUgbWV0YWRhdGEgaXMgcHVibGlzaGVkCi0JICogb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZS4KLQkgKiBAcmV0dXJuIGEgZGVzdGluYXRpb24gbWV0YWRhdGEgcmVwb3NpdG9yeSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGdldE1ldGFkYXRhUmVwb3NpdG9yeSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhcnRpZmFjdHMgdGhlbXNlbHZlcyBzaG91bGQgYmUgcHVibGlzaGVkLgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXJ0aWZhY3RzIHNob3VsZCBiZSBwdWJsaXNoZWQuICAKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXJ0aWZhY3RPcHRpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIGFkdmljZSBmb3IgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24gb2YgV1MsIE9TIGFuZCBBUkNIIHdoZXJlIHRoZQotCSAqIGFkdmljZSBpcyBvZiB0aGUgZ2l2ZW4gdHlwZS4gIElmIG1lcmdlRGVmYXVsdCBpcyA8Y29kZT50cnVlPC9jb2RlPiB0aGVuIHRoZSBhZHZpY2UgZm9yCi0JICogdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBpcyBtZXJnZWQgaW50byB0aGUgcmVzdWx0LgotCSAqIEBwYXJhbSBjb25maWdTcGVjIHRoZSBjb25maWd1cmF0aW9uIHRvIHF1ZXJ5LiAgTm90ZSB0aGF0IHRoZSBnaXZlbiBjb25maWd1cmF0aW9uCi0JICogbXVzdCBzcGVjaWZ5IHZhbHVlcyBmb3IgV1MsIE9TIGFuZCBBUkNILgotCSAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIG9mIGFkdmljZSB0byBsb29rIGZvcgotCSAqIEBwYXJhbSBtZXJnZURlZmF1bHQgd2hldGhlciBvciBub3QgdG8gbWVyZ2UgaW4gdGhlIGFkdmljZSBjb21tb24gdG8gYWxsIGNvbmZpZ3VyYXRpb25zCi0JICogQHJldHVybiB0aGUgc2V0IG9mIGFkdmljZSBvZiB0aGUgZ2l2ZW4gdHlwZSBmb3IgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZHZpY2UoU3RyaW5nIGNvbmZpZ1NwZWMsIGJvb2xlYW4gaW5jbHVkZURlZmF1bHQsIFN0cmluZyBpZCwgVmVyc2lvbiB2ZXJzaW9uLCBDbGFzcyB0eXBlKTsKLQotCS8qKgotCSAqIEFkZCB0aGUgZ2l2ZW4gYWR2aWNlIHRvIHRoZSBzZXQgb2YgcHVibGlzaGluZyBhZHZpY2VzLiAgCi0JICogQHBhcmFtIGFkdmljZSB0aGUgYWR2aWNlIHRvIHJldGFpbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFkdmljZShJUHVibGlzaGluZ0FkdmljZSBhZHZpY2UpOwotCi0JcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyYXRpb25zKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JUHVibGlzaGVyUmVzdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JUHVibGlzaGVyUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTU3NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvSVB1Ymxpc2hlclJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLQotcHVibGljIGludGVyZmFjZSBJUHVibGlzaGVyUmVzdWx0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVJHRV9NQVRDSElORyA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUVSR0VfQUxMX1JPT1QgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1FUkdFX0FMTF9OT05fUk9PVCA9IDI7Ci0KLQkvLyB0eXBlIG1hcmtlcnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gInJvb3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX1JPT1QgPSAibm9uX3Jvb3QiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgdm9pZCBhZGRJVShJSW5zdGFsbGFibGVVbml0IGl1LCBTdHJpbmcgdHlwZSk7Ci0KLQlwdWJsaWMgdm9pZCBhZGRJVXMoQ29sbGVjdGlvbiBpdXMsIFN0cmluZyB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElVcyBpbiB0aGlzIHJlc3VsdCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRJVXMoU3RyaW5nIGlkLCBTdHJpbmcgdHlwZSk7Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdCBnZXRJVShTdHJpbmcgaWQsIFN0cmluZyB0eXBlKTsKLQotCXB1YmxpYyB2b2lkIG1lcmdlKElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0LCBpbnQgbW9kZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JUHVibGlzaGluZ0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvSVB1Ymxpc2hpbmdBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVjMWFkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JUHVibGlzaGluZ0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQdWJsaXNoaW5nQWN0aW9uIHsKLQotCUlTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JUHVibGlzaGluZ0FkdmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvSVB1Ymxpc2hpbmdBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRlYTlmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JUHVibGlzaGluZ0FkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlcjsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQdWJsaXNoaW5nQWR2aWNlIHsKLQotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZShTdHJpbmcgY29uZmlnU3BlYywgYm9vbGVhbiBpbmNsdWRlRGVmYXVsdCwgU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24pOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9JbnN0YWxsUHVibGlzaGVyQXBwbGljYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0luc3RhbGxQdWJsaXNoZXJBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmYzYjI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL0luc3RhbGxQdWJsaXNoZXJBcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9ucy5FY2xpcHNlSW5zdGFsbEFjdGlvbjsKLQotcHVibGljIGNsYXNzIEluc3RhbGxQdWJsaXNoZXJBcHBsaWNhdGlvbiBleHRlbmRzIEFic3RyYWN0UHVibGlzaGVyQXBwbGljYXRpb24gewotCi0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb24gPSAiMS4wLjAiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBuYW1lOwotCXByb3RlY3RlZCBTdHJpbmcgZmxhdm9yOwotCXByb3RlY3RlZCBTdHJpbmdbXSB0b3BMZXZlbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydDsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gcm9vdEV4Y2x1c2lvbnM7Ci0KLQlwdWJsaWMgSW5zdGFsbFB1Ymxpc2hlckFwcGxpY2F0aW9uKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NGbGFnKFN0cmluZyBhcmcsIFB1Ymxpc2hlckluZm8gaW5mbykgewotCQlzdXBlci5wcm9jZXNzRmxhZyhhcmcsIGluZm8pOwotCi0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLXN0YXJ0QWxsIikpIC8vJE5PTi1OTFMtMSQKLQkJCXN0YXJ0ID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzUGFyYW1ldGVyKFN0cmluZyBhcmcsIFN0cmluZyBwYXJhbWV0ZXIsIFB1Ymxpc2hlckluZm8gaW5mbykgewotCQlzdXBlci5wcm9jZXNzUGFyYW1ldGVyKGFyZywgcGFyYW1ldGVyLCBpbmZvKTsKLQotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi1pZCIpKSAvLyROT04tTkxTLTEkCi0JCQlpZCA9IHBhcmFtZXRlcjsKLQotCQlpZiAoYXJnLmVxdWFsc0lnbm9yZUNhc2UoIi12ZXJzaW9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCXZlcnNpb24gPSBwYXJhbWV0ZXI7Ci0KLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItbmFtZSIpKSAvLyROT04tTkxTLTEkCi0JCQluYW1lID0gcGFyYW1ldGVyOwotCi0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLWZsYXZvciIpKSAvLyROT04tTkxTLTEkCi0JCQlmbGF2b3IgPSBwYXJhbWV0ZXI7Ci0KLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItdG9wIikpIC8vJE5PTi1OTFMtMSQKLQkJCXRvcExldmVsID0gQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uLmdldEFycmF5RnJvbVN0cmluZyhwYXJhbWV0ZXIsICIsIik7Ci0KLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItcm9vdEV4Y2x1c2lvbnMiKSkgLy8kTk9OLU5MUy0xJAotCQkJcm9vdEV4Y2x1c2lvbnMgPSBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24uZ2V0QXJyYXlGcm9tU3RyaW5nKHBhcmFtZXRlciwgIiwiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVB1Ymxpc2hpbmdBY3Rpb25bXSBjcmVhdGVBY3Rpb25zKCkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHQuYWRkKGNyZWF0ZUVjbGlwc2VJbnN0YWxsQWN0aW9uKCkpOwotCQlyZXR1cm4gKElQdWJsaXNoaW5nQWN0aW9uW10pIHJlc3VsdC50b0FycmF5KG5ldyBJUHVibGlzaGluZ0FjdGlvbltyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBJUHVibGlzaGluZ0FjdGlvbiBjcmVhdGVFY2xpcHNlSW5zdGFsbEFjdGlvbigpIHsKLQkJU3RyaW5nW10gZXhjbHVzaW9ucyA9IGdldEJhc2VFeGNsdXNpb25zKCk7Ci0JCWlmIChyb290RXhjbHVzaW9ucyAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2V4Y2x1c2lvbnMubGVuZ3RoICsgcm9vdEV4Y2x1c2lvbnMubGVuZ3RoXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZXhjbHVzaW9ucywgMCwgcmVzdWx0LCAwLCBleGNsdXNpb25zLmxlbmd0aCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHJvb3RFeGNsdXNpb25zLCAwLCByZXN1bHQsIGV4Y2x1c2lvbnMubGVuZ3RoLCByb290RXhjbHVzaW9ucy5sZW5ndGgpOwotCQkJZXhjbHVzaW9ucyA9IHJlc3VsdDsKLQkJfQotCQlyZXR1cm4gbmV3IEVjbGlwc2VJbnN0YWxsQWN0aW9uKHNvdXJjZSwgaWQsIHZlcnNpb24sIG5hbWUsIGZsYXZvciwgdG9wTGV2ZWwsIGV4Y2x1c2lvbnMsIHN0YXJ0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0QmFzZUV4Y2x1c2lvbnMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW10geyJwbHVnaW5zIiwgImZlYXR1cmVzIiwgImNvbmZpZ3VyYXRpb24ifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk4ZDI4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9lcnJvckNvbnZlcnRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX291dHB1dFN0cmVhbTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fZXJyb3JQYXJzaW5nVXBkYXRlU2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fc3RhdGVBZGRpdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fc291cmNlRGlyZWN0b3J5SW52YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fYXJ0aWZhY3RSZXBvTG9jYXRpb25VUkw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX2FydGlmYWN0UmVwb05vdFdyaXRhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9tZXRhZGF0YVJlcG9Mb2NhdGlvblVSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fbWV0YWRhdGFSZXBvTm90V3JpdGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX2Jhc2VMb2NhdGlvbk5vdFNwZWNpZmllZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1lc3NhZ2VfZ2VuZXJhdGluZ01ldGFkYXRhOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1lc3NhZ2VfZ2VuZXJhdGlvbkNvbXBsZXRlZDsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL01ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiM2M3M2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEdlbnVpdGVjLCBMTEMgLSBhZGRlZCBsaWNlbnNlIHN1cHBvcnQKLSAqICAgICBDb2RlIDkgLSBPbmdvaW5nIGRldmVsb3BtZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5CdW5kbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk1hbmlmZXN0RWxlbWVudDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotcHVibGljIGNsYXNzIE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyIHsKLQkvKioKLQkgKiBBIGNhcGFiaWxpdHkgbmFtZXNwYWNlIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBFY2xpcHNlIHJlc291cmNlIChidW5kbGUsIGZlYXR1cmUsIHNvdXJjZSBidW5kbGUsIGV0YykKLQkgKiBAc2VlIFJlcXVpcmVkQ2FwYWJpbGl0eSNnZXROYW1lc3BhY2UoKQotCSAqIEBzZWUgUHJvdmlkZWRDYXBhYmlsaXR5I2dldE5hbWVzcGFjZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0VDTElQU0VfVFlQRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgY2FwYWJpbGl0eSBuYW1lIGluIHRoZSB7QGxpbmsgI05BTUVTUEFDRV9FQ0xJUFNFX1RZUEV9IG5hbWVzcGFjZSAKLQkgKiByZXByZXNlbnRpbmcgYW5kIE9TR2kgYnVuZGxlIHJlc291cmNlCi0JICogQHNlZSBSZXF1aXJlZENhcGFiaWxpdHkjZ2V0TmFtZSgpCi0JICogQHNlZSBQcm92aWRlZENhcGFiaWxpdHkjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9FQ0xJUFNFX0JVTkRMRSA9ICJidW5kbGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQSBjYXBhYmlsaXR5IG5hbWUgaW4gdGhlIHtAbGluayAjTkFNRVNQQUNFX0VDTElQU0VfVFlQRX0gbmFtZXNwYWNlIAotCSAqIHJlcHJlc2VudGluZyBhIGZlYXR1cmUKLQkgKiBAc2VlIFJlcXVpcmVkQ2FwYWJpbGl0eSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VDTElQU0VfRkVBVFVSRSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBjYXBhYmlsaXR5IG5hbWUgaW4gdGhlIHtAbGluayAjTkFNRVNQQUNFX0VDTElQU0VfVFlQRX0gbmFtZXNwYWNlIAotCSAqIHJlcHJlc2VudGluZyBhIHNvdXJjZSBidW5kbGUKLQkgKiBAc2VlIFJlcXVpcmVkQ2FwYWJpbGl0eSNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0VDTElQU0VfU09VUkNFID0gInNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgY2FwYWJpbGl0eSBuYW1lc3BhY2UgcmVwcmVzZW50aW5nIHRoZSBsb2NhbGl6YXRpb24gKHRyYW5zbGF0aW9uKQotCSAqIG9mIHN0cmluZ3MgZnJvbSBhIHNwZWNpZmllZCBJVSBpbiBhIHNwZWNpZmllZCBsb2NhbGUKLQkgKiBAc2VlIFJlcXVpcmVkQ2FwYWJpbGl0eSNnZXROYW1lc3BhY2UoKQotCSAqIEBzZWUgUHJvdmlkZWRDYXBhYmlsaXR5I2dldE5hbWVzcGFjZSgpCi0JICogVE9ETzogdGhpcyBzaG91bGQgYmUgaW4gQVBJLCBwcm9iYWJseSBpbiBJSW5zdGFsbGFibGVVbml0Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX0lVX0xPQ0FMSVpBVElPTiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIE9ubHkgY2VydGFpbiBwcm9wZXJ0aWVzIGluIHRoZSBidW5kbGUgbWFuaWZlc3QgYXJlIGFzc3VtZWQgdG8gYmUgbG9jYWxpemVkLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gQlVORExFX0xPQ0FMSVpFRF9QUk9QRVJUSUVTID0ge0NvbnN0YW50cy5CVU5ETEVfTkFNRSwgQ29uc3RhbnRzLkJVTkRMRV9ERVNDUklQVElPTiwgQ29uc3RhbnRzLkJVTkRMRV9WRU5ET1IsIENvbnN0YW50cy5CVU5ETEVfQ09OVEFDVEFERFJFU1MsIENvbnN0YW50cy5CVU5ETEVfRE9DVVJMLCBDb25zdGFudHMuQlVORExFX1VQREFURUxPQ0FUSU9OfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVU5ETEVfTE9DQUxJWkFUSU9OX0lOREVYID0gQlVORExFX0xPQ0FMSVpFRF9QUk9QRVJUSUVTLmxlbmd0aDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEJVTkRMRV9JVV9QUk9QRVJUWV9NQVAgPSB7Q29uc3RhbnRzLkJVTkRMRV9OQU1FLCBJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgQ29uc3RhbnRzLkJVTkRMRV9ERVNDUklQVElPTiwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX0RFU0NSSVBUSU9OLCBDb25zdGFudHMuQlVORExFX1ZFTkRPUiwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BST1ZJREVSLCBDb25zdGFudHMuQlVORExFX0NPTlRBQ1RBRERSRVNTLCBJSW5zdGFsbGFibGVVbml0LlBST1BfQ09OVEFDVCwgQ29uc3RhbnRzLkJVTkRMRV9ET0NVUkwsIElJbnN0YWxsYWJsZVVuaXQuUFJPUF9ET0NfVVJMfTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVBBQklMSVRZX05TX0pBVkFfUEFDS0FHRSA9ICJqYXZhLnBhY2thZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfTlNfT1NHSV9CVU5ETEUgPSAib3NnaS5idW5kbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfTlNfT1NHSV9GUkFHTUVOVCA9ICJvc2dpLmZyYWdtZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQQUJJTElUWV9OU19VUERBVEVfRkVBVFVSRSA9ICJvcmcuZWNsaXBzZS51cGRhdGUuZmVhdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlcnNpb24gREVGQVVMVF9KUkVfVkVSU0lPTiA9IG5ldyBWZXJzaW9uKCIxLjYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUNMSVBTRV9GRUFUVVJFX0NMQVNTSUZJRVIgPSAib3JnLmVjbGlwc2UudXBkYXRlLmZlYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NHSV9CVU5ETEVfQ0xBU1NJRklFUiA9ICJvc2dpLmJ1bmRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5BUllfQVJUSUZBQ1RfQ0xBU1NJRklFUiA9ICJiaW5hcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlNUQUxMX0ZFQVRVUkVTX0ZJTFRFUiA9ICIob3JnLmVjbGlwc2UudXBkYXRlLmluc3RhbGwuZmVhdHVyZXM9dHJ1ZSkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVV9OQU1FU1BBQ0UgPSBJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRDsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMQVVOQ0hFUl9JRF9QUkVGSVggPSAib3JnLmVjbGlwc2UubGF1bmNoZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0xJUFNFX0lOU1RBTExfSEFORExFUl9QUk9QID0gIm9yZy5lY2xpcHNlLnVwZGF0ZS5pbnN0YWxsSGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vVE9ETyAtIG5lZWQgdG8gY29tZSB1cCB3aXRoIGEgd2F5IHRvIGluZmVyIGxhdW5jaGVyIHZlcnNpb24KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uIExBVU5DSEVSX1ZFUlNJT04gPSBuZXcgVmVyc2lvbigxLCAwLCAwKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFZlcnNpb24gdmVyc2lvbk1heCA9IG5ldyBWZXJzaW9uKEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRSwgSW50ZWdlci5NQVhfVkFMVUUpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBUb3VjaHBvaW50VHlwZSBUT1VDSFBPSU5UX05BVElWRSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50VHlwZSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYXRpdmUiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRvdWNocG9pbnRUeXBlIFRPVUNIUE9JTlRfT1NHSSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50VHlwZSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpIiwgbmV3IFZlcnNpb24oMSwgMCwgMCkpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByb3ZpZGVkQ2FwYWJpbGl0eSBCVU5ETEVfQ0FQQUJJTElUWSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoTkFNRVNQQUNFX0VDTElQU0VfVFlQRSwgVFlQRV9FQ0xJUFNFX0JVTkRMRSwgbmV3IFZlcnNpb24oMSwgMCwgMCkpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgUHJvdmlkZWRDYXBhYmlsaXR5IEZFQVRVUkVfQ0FQQUJJTElUWSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoTkFNRVNQQUNFX0VDTElQU0VfVFlQRSwgVFlQRV9FQ0xJUFNFX0ZFQVRVUkUsIG5ldyBWZXJzaW9uKDEsIDAsIDApKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFByb3ZpZGVkQ2FwYWJpbGl0eSBTT1VSQ0VfQlVORExFX0NBUEFCSUxJVFkgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KE5BTUVTUEFDRV9FQ0xJUFNFX1RZUEUsIFRZUEVfRUNMSVBTRV9TT1VSQ0UsIG5ldyBWZXJzaW9uKDEsIDAsIDApKTsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9CVU5ETEVfTE9DQUxJWkFUSU9OID0gInBsdWdpbiI7IC8vJE5PTi1OTFMtMSQJCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUSUVTX0ZJTEVfRVhURU5TSU9OID0gIi5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUFOSUZFU1RfTE9DQUxJWkFUSU9OUyA9ICJlY2xpcHNlLnAyLm1hbmlmZXN0LmxvY2FsaXphdGlvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgTG9jYWxlIERFRkFVTFRfTE9DQUxFID0gbmV3IExvY2FsZSgiZGYiLCAiTFQiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQlzdGF0aWMgZmluYWwgTG9jYWxlIFBTRVVET19MT0NBTEUgPSBuZXcgTG9jYWxlKCJ6eiIsICJaWiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3REZXNjcmlwdG9yIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRvcihJQXJ0aWZhY3RLZXkga2V5LCBGaWxlIHBhdGhPbkRpc2spIHsKLQkJLy9UT0RPIHRoaXMgc2l6ZSBjYWxjdWxhdGlvbiBpcyBib2d1cwotCQlBcnRpZmFjdERlc2NyaXB0b3IgcmVzdWx0ID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvcihrZXkpOwotCQlpZiAocGF0aE9uRGlzayAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5BUlRJRkFDVF9TSVpFLCBMb25nLnRvU3RyaW5nKHBhdGhPbkRpc2subGVuZ3RoKCkpKTsKLQkJCS8vIFRPRE8gLSB0aGlzIGlzIHdyb25nIGJ1dCBJJ20gdGVzdGluZyBhIHdvcmstYXJvdW5kIGZvciBidWcgMjA1ODQyCi0JCQlyZXN1bHQuc2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5ET1dOTE9BRF9TSVpFLCBMb25nLnRvU3RyaW5nKHBhdGhPbkRpc2subGVuZ3RoKCkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0RGVzY3JpcHRvciBjcmVhdGVQYWNrMjAwQXJ0aWZhY3REZXNjcmlwdG9yKElBcnRpZmFjdEtleSBrZXksIEZpbGUgcGF0aE9uRGlzaywgU3RyaW5nIGluc3RhbGxTaXplKSB7Ci0JCWZpbmFsIFN0cmluZyBQQUNLRURfRk9STUFUID0gInBhY2tlZCI7IC8vJE5PTi1OTFMtMSQKLQkJLy9UT0RPIHRoaXMgc2l6ZSBjYWxjdWxhdGlvbiBpcyBib2d1cwotCQlBcnRpZmFjdERlc2NyaXB0b3IgcmVzdWx0ID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvcihrZXkpOwotCQlpZiAocGF0aE9uRGlzayAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5BUlRJRkFDVF9TSVpFLCBpbnN0YWxsU2l6ZSk7Ci0JCQkvLyBUT0RPIC0gdGhpcyBpcyB3cm9uZyBidXQgSSdtIHRlc3RpbmcgYSB3b3JrLWFyb3VuZCBmb3IgYnVnIDIwNTg0MgotCQkJcmVzdWx0LnNldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuRE9XTkxPQURfU0laRSwgTG9uZy50b1N0cmluZyhwYXRoT25EaXNrLmxlbmd0aCgpKSk7Ci0JCX0KLQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gc3RlcHMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10ge25ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5QYWNrMjAwVW5wYWNrZXIiLCBudWxsLCB0cnVlKX07IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LnNldFByb2Nlc3NpbmdTdGVwcyhzdGVwcyk7Ci0JCXJlc3VsdC5zZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkZPUk1BVCwgUEFDS0VEX0ZPUk1BVCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3RLZXkgY3JlYXRlQnVuZGxlQXJ0aWZhY3RLZXkoU3RyaW5nIGJzbiwgU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIG5ldyBBcnRpZmFjdEtleShPU0dJX0JVTkRMRV9DTEFTU0lGSUVSLCBic24sIG5ldyBWZXJzaW9uKHZlcnNpb24pKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlSVVGcmFnbWVudChTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgZmxhdm9yLCBTdHJpbmcgY29uZmlnU3BlYywgTWFwIHRvdWNocG9pbnREYXRhKSB7Ci0JCUluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24gY3UgPSBuZXcgSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgcmVzdWx0SWQgPSBmbGF2b3IgKyBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24uY3JlYXRlSWRTdHJpbmcoY29uZmlnU3BlYykgKyBpZDsKLQkJY3Uuc2V0SWQocmVzdWx0SWQpOwotCQlWZXJzaW9uIHJlc3VsdFZlcnNpb24gPSBuZXcgVmVyc2lvbih2ZXJzaW9uKTsKLQkJY3Uuc2V0VmVyc2lvbihyZXN1bHRWZXJzaW9uKTsKLQotCQljdS5zZXRGaWx0ZXIoQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uLmNyZWF0ZUZpbHRlclNwZWMoY29uZmlnU3BlYykpOwotCQljdS5zZXRIb3N0KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgaWQsIG5ldyBWZXJzaW9uUmFuZ2UocmVzdWx0VmVyc2lvbiwgdHJ1ZSwgcmVzdWx0VmVyc2lvbiwgdHJ1ZSksIG51bGwsIGZhbHNlLCBmYWxzZSl9KTsKLQkJY3Uuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJY3Uuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlU2VsZkNhcGFiaWxpdHkocmVzdWx0SWQsIHJlc3VsdFZlcnNpb24pfSk7Ci0KLQkJY3UuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGN1KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlQnVuZGxlQ29uZmlndXJhdGlvblVuaXQoU3RyaW5nIGhvc3RJZCwgVmVyc2lvbiBob3N0VmVyc2lvbiwgYm9vbGVhbiBpc0J1bmRsZUZyYWdtZW50LCBHZW5lcmF0b3JCdW5kbGVJbmZvIGNvbmZpZ0luZm8sIFN0cmluZyBjb25maWd1cmF0aW9uRmxhdm9yLCBTdHJpbmcgZmlsdGVyKSB7Ci0JCWlmIChjb25maWdJbmZvID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGN1ID0gbmV3IEluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGNvbmZpZ1VuaXRJZCA9IGNvbmZpZ3VyYXRpb25GbGF2b3IgKyBob3N0SWQ7Ci0JCWN1LnNldElkKGNvbmZpZ1VuaXRJZCk7Ci0JCWN1LnNldFZlcnNpb24oaG9zdFZlcnNpb24pOwotCi0JCS8vSW5kaWNhdGUgdGhlIElVIHRvIHdoaWNoIHRoaXMgQ1UgYXBwbHkKLQkJY3Uuc2V0SG9zdChuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10geyAvLwotCQkJCU1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoQ0FQQUJJTElUWV9OU19PU0dJX0JVTkRMRSwgaG9zdElkLCBuZXcgVmVyc2lvblJhbmdlKGhvc3RWZXJzaW9uLCB0cnVlLCB2ZXJzaW9uTWF4LCB0cnVlKSwgbnVsbCwgZmFsc2UsIGZhbHNlKSwgLy8gCi0JCQkJCQlNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KE5BTUVTUEFDRV9FQ0xJUFNFX1RZUEUsIFRZUEVfRUNMSVBTRV9CVU5ETEUsIG5ldyBWZXJzaW9uUmFuZ2UobmV3IFZlcnNpb24oMSwgMCwgMCksIHRydWUsIG5ldyBWZXJzaW9uKDIsIDAsIDApLCBmYWxzZSksIG51bGwsIGZhbHNlLCBmYWxzZSl9KTsKLQotCQkvL0FkZHMgY2FwYWJpbGl0aWVzIGZvciBmcmFnbWVudCwgc2VsZiwgYW5kIGRlc2NyaWJpbmcgdGhlIGZsYXZvciBzdXBwb3J0ZWQKLQkJY3Uuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJY3Uuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7Y3JlYXRlU2VsZkNhcGFiaWxpdHkoY29uZmlnVW5pdElkLCBob3N0VmVyc2lvbiksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfRkxBVk9SLCBjb25maWd1cmF0aW9uRmxhdm9yLCBuZXcgVmVyc2lvbigxLCAwLCAwKSl9KTsKLQotCQlNYXAgdG91Y2hwb2ludERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQl0b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCAiaW5zdGFsbEJ1bmRsZShidW5kbGU6JHthcnRpZmFjdH0pIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuaW5zdGFsbCIsICJ1bmluc3RhbGxCdW5kbGUoYnVuZGxlOiR7YXJ0aWZhY3R9KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJjb25maWd1cmUiLCBjcmVhdGVDb25maWdTY3JpcHQoY29uZmlnSW5mbywgaXNCdW5kbGVGcmFnbWVudCkpOyAvLyROT04tTkxTLTEkCi0JCXRvdWNocG9pbnREYXRhLnB1dCgidW5jb25maWd1cmUiLCBjcmVhdGVVbmNvbmZpZ1NjcmlwdChjb25maWdJbmZvLCBpc0J1bmRsZUZyYWdtZW50KSk7IC8vJE5PTi1OTFMtMSQKLQkJY3UuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCWN1LnNldEZpbHRlcihmaWx0ZXIpOwotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChjdSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUJ1bmRsZUlVKEJ1bmRsZURlc2NyaXB0aW9uIGJkLCBNYXAgbWFuaWZlc3QsIGJvb2xlYW4gaXNGb2xkZXJQbHVnaW4sIElBcnRpZmFjdEtleSBrZXkpIHsKLQkJTWFwIG1hbmlmZXN0TG9jYWxpemF0aW9ucyA9IG51bGw7Ci0JCWlmIChtYW5pZmVzdCAhPSBudWxsICYmIGJkLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJbWFuaWZlc3RMb2NhbGl6YXRpb25zID0gZ2V0TWFuaWZlc3RMb2NhbGl6YXRpb25zKG1hbmlmZXN0LCBuZXcgRmlsZShiZC5nZXRMb2NhdGlvbigpKSk7Ci0JCX0KLQotCQlyZXR1cm4gY3JlYXRlQnVuZGxlSVUoYmQsIG1hbmlmZXN0LCBpc0ZvbGRlclBsdWdpbiwga2V5LCBtYW5pZmVzdExvY2FsaXphdGlvbnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVCdW5kbGVJVShCdW5kbGVEZXNjcmlwdGlvbiBiZCwgTWFwIG1hbmlmZXN0LCBib29sZWFuIGlzRm9sZGVyUGx1Z2luLCBJQXJ0aWZhY3RLZXkga2V5LCBNYXAgbWFuaWZlc3RMb2NhbGl6YXRpb25zKSB7Ci0JCWJvb2xlYW4gaXNCaW5hcnlCdW5kbGUgPSB0cnVlOwotCQlpZiAobWFuaWZlc3QgIT0gbnVsbCAmJiBtYW5pZmVzdC5jb250YWluc0tleSgiRWNsaXBzZS1Tb3VyY2VCdW5kbGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpc0JpbmFyeUJ1bmRsZSA9IGZhbHNlOwotCQl9Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlpdS5zZXRTaW5nbGV0b24oYmQuaXNTaW5nbGV0b24oKSk7Ci0JCWl1LnNldElkKGJkLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJaXUuc2V0VmVyc2lvbihiZC5nZXRWZXJzaW9uKCkpOwotCQlpdS5zZXRGaWx0ZXIoYmQuZ2V0UGxhdGZvcm1GaWx0ZXIoKSk7Ci0KLQkJaXUuc2V0VXBkYXRlRGVzY3JpcHRvcihNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVXBkYXRlRGVzY3JpcHRvcihiZC5nZXRTeW1ib2xpY05hbWUoKSwgbmV3IFZlcnNpb25SYW5nZShuZXcgVmVyc2lvbigwLCAwLCAwKSwgdHJ1ZSwgYmQuZ2V0VmVyc2lvbigpLCBmYWxzZSksIElVcGRhdGVEZXNjcmlwdG9yLk5PUk1BTCwgbnVsbCkpOwotCi0JCWJvb2xlYW4gaXNGcmFnbWVudCA9IGJkLmdldEhvc3QoKSAhPSBudWxsOwotCQkvLwkJYm9vbGVhbiByZXF1aXJlc0FGcmFnbWVudCA9IGlzRnJhZ21lbnQgPyBmYWxzZSA6IHJlcXVpcmVBRnJhZ21lbnQoYmQsIG1hbmlmZXN0KTsKLQotCQkvL1Byb2Nlc3MgdGhlIHJlcXVpcmVkIGJ1bmRsZXMKLQkJQnVuZGxlU3BlY2lmaWNhdGlvbiByZXF1aXJlZEJ1bmRsZXNbXSA9IGJkLmdldFJlcXVpcmVkQnVuZGxlcygpOwotCQlBcnJheUxpc3QgcmVxc0RlcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vCQlpZiAocmVxdWlyZXNBRnJhZ21lbnQpCi0JCS8vCQkJcmVxc0RlcHMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoQ0FQQUJJTElUWV9UWVBFX09TR0lfRlJBR01FTlRTLCBiZC5nZXRTeW1ib2xpY05hbWUoKSwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSkpOwotCQlpZiAoaXNGcmFnbWVudCkKLQkJCXJlcXNEZXBzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KENBUEFCSUxJVFlfTlNfT1NHSV9CVU5ETEUsIGJkLmdldEhvc3QoKS5nZXROYW1lKCksIGJkLmdldEhvc3QoKS5nZXRWZXJzaW9uUmFuZ2UoKSwgbnVsbCwgZmFsc2UsIGZhbHNlKSk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcmVxdWlyZWRCdW5kbGVzLmxlbmd0aDsgaisrKQotCQkJcmVxc0RlcHMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoQ0FQQUJJTElUWV9OU19PU0dJX0JVTkRMRSwgcmVxdWlyZWRCdW5kbGVzW2pdLmdldE5hbWUoKSwgcmVxdWlyZWRCdW5kbGVzW2pdLmdldFZlcnNpb25SYW5nZSgpID09IFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlID8gbnVsbCA6IHJlcXVpcmVkQnVuZGxlc1tqXS5nZXRWZXJzaW9uUmFuZ2UoKSwgbnVsbCwgcmVxdWlyZWRCdW5kbGVzW2pdLmlzT3B0aW9uYWwoKSwgZmFsc2UpKTsKLQotCQkvLyBQcm9jZXNzIHRoZSBpbXBvcnQgcGFja2FnZXMKLQkJSW1wb3J0UGFja2FnZVNwZWNpZmljYXRpb24gb3NnaUltcG9ydHNbXSA9IGJkLmdldEltcG9ydFBhY2thZ2VzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3NnaUltcG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCS8vIFRPRE8gd2UgbmVlZCB0byBzb3J0IG91dCBob3cgd2Ugd2FudCB0byBoYW5kbGUgd2lsZC1jYXJkZWQgZHluYW1pYyBpbXBvcnRzIC0gZm9yIG5vdyB3ZSBpZ25vcmUgdGhlbQotCQkJSW1wb3J0UGFja2FnZVNwZWNpZmljYXRpb24gaW1wb3J0U3BlYyA9IG9zZ2lJbXBvcnRzW2ldOwotCQkJU3RyaW5nIGltcG9ydFBhY2thZ2VOYW1lID0gaW1wb3J0U3BlYy5nZXROYW1lKCk7Ci0JCQlpZiAoaW1wb3J0UGFja2FnZU5hbWUuaW5kZXhPZignKicpICE9IC0xKQotCQkJCWNvbnRpbnVlOwotCi0JCQlWZXJzaW9uUmFuZ2UgdmVyc2lvblJhbmdlID0gaW1wb3J0U3BlYy5nZXRWZXJzaW9uUmFuZ2UoKSA9PSBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSA/IG51bGwgOiBpbXBvcnRTcGVjLmdldFZlcnNpb25SYW5nZSgpOwotCi0JCQkvL1RPRE8gdGhpcyBuZWVkcyB0byBiZSByZWZpbmVkIHRvIHRha2UgaW50byBhY2NvdW50IGFsbCB0aGUgYXR0cmlidXRlIGhhbmRsZWQgYnkgaW1wb3J0cwotCQkJcmVxc0RlcHMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoQ0FQQUJJTElUWV9OU19KQVZBX1BBQ0tBR0UsIGltcG9ydFBhY2thZ2VOYW1lLCB2ZXJzaW9uUmFuZ2UsIG51bGwsIGlzT3B0aW9uYWwoaW1wb3J0U3BlYyksIGZhbHNlKSk7Ci0JCX0KLQkJaXUuc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKFJlcXVpcmVkQ2FwYWJpbGl0eVtdKSByZXFzRGVwcy50b0FycmF5KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbcmVxc0RlcHMuc2l6ZSgpXSkpOwotCi0JCS8vIENyZWF0ZSBzZXQgb2YgcHJvdmlkZWQgY2FwYWJpbGl0aWVzCi0JCUFycmF5TGlzdCBwcm92aWRlZENhcGFiaWxpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcHJvdmlkZWRDYXBhYmlsaXRpZXMuYWRkKGNyZWF0ZVNlbGZDYXBhYmlsaXR5KGJkLmdldFN5bWJvbGljTmFtZSgpLCBiZC5nZXRWZXJzaW9uKCkpKTsKLQkJcHJvdmlkZWRDYXBhYmlsaXRpZXMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoQ0FQQUJJTElUWV9OU19PU0dJX0JVTkRMRSwgYmQuZ2V0U3ltYm9saWNOYW1lKCksIGJkLmdldFZlcnNpb24oKSkpOwotCi0JCS8vIFByb2Nlc3MgdGhlIGV4cG9ydCBwYWNrYWdlCi0JCUV4cG9ydFBhY2thZ2VEZXNjcmlwdGlvbiBleHBvcnRzW10gPSBiZC5nZXRFeHBvcnRQYWNrYWdlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cG9ydHMubGVuZ3RoOyBpKyspIHsKLQkJCS8vVE9ETyBtYWtlIHN1cmUgdGhhdCB3ZSBzdXBwb3J0IGFsbCB0aGUgcmVmaW5lbWVudCBvbiB0aGUgZXhwb3J0cwotCQkJcHJvdmlkZWRDYXBhYmlsaXRpZXMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoQ0FQQUJJTElUWV9OU19KQVZBX1BBQ0tBR0UsIGV4cG9ydHNbaV0uZ2V0TmFtZSgpLCBleHBvcnRzW2ldLmdldFZlcnNpb24oKSA9PSBWZXJzaW9uLmVtcHR5VmVyc2lvbiA/IG51bGwgOiBleHBvcnRzW2ldLmdldFZlcnNpb24oKSkpOwotCQl9Ci0JCS8vIEhlcmUgd2UgYWRkIGEgYnVuZGxlIGNhcGFiaWxpdHkgdG8gaWRlbnRpZnkgYnVuZGxlcwotCQlpZiAoaXNCaW5hcnlCdW5kbGUpCi0JCQlwcm92aWRlZENhcGFiaWxpdGllcy5hZGQoQlVORExFX0NBUEFCSUxJVFkpOwotCQllbHNlCi0JCQlwcm92aWRlZENhcGFiaWxpdGllcy5hZGQoU09VUkNFX0JVTkRMRV9DQVBBQklMSVRZKTsKLQotCQlpZiAoaXNGcmFnbWVudCkKLQkJCXByb3ZpZGVkQ2FwYWJpbGl0aWVzLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KENBUEFCSUxJVFlfTlNfT1NHSV9GUkFHTUVOVCwgYmQuZ2V0SG9zdCgpLmdldE5hbWUoKSwgYmQuZ2V0VmVyc2lvbigpKSk7Ci0KLQkJaWYgKG1hbmlmZXN0TG9jYWxpemF0aW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBtYW5pZmVzdExvY2FsaXphdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQkJTG9jYWxlIGxvY2FsZSA9IChMb2NhbGUpIGl0ZXIubmV4dCgpOwotCQkJCVByb3BlcnRpZXMgdHJhbnNsYXRlZFN0cmluZ3MgPSAoUHJvcGVydGllcykgbWFuaWZlc3RMb2NhbGl6YXRpb25zLmdldChsb2NhbGUpOwotCQkJCUVudW1lcmF0aW9uIHByb3BlcnR5S2V5cyA9IHRyYW5zbGF0ZWRTdHJpbmdzLnByb3BlcnR5TmFtZXMoKTsKLQkJCQl3aGlsZSAocHJvcGVydHlLZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJCVN0cmluZyBuZXh0S2V5ID0gKFN0cmluZykgcHJvcGVydHlLZXlzLm5leHRFbGVtZW50KCk7Ci0JCQkJCWl1LnNldFByb3BlcnR5KGxvY2FsZS50b1N0cmluZygpICsgJy4nICsgbmV4dEtleSwgdHJhbnNsYXRlZFN0cmluZ3MuZ2V0UHJvcGVydHkobmV4dEtleSkpOwotCQkJCX0KLQkJCQlwcm92aWRlZENhcGFiaWxpdGllcy5hZGQobWFrZVRyYW5zbGF0aW9uQ2FwYWJpbGl0eShiZC5nZXRTeW1ib2xpY05hbWUoKSwgbG9jYWxlKSk7Ci0JCQl9Ci0JCX0KLQotCQlpdS5zZXRDYXBhYmlsaXRpZXMoKFByb3ZpZGVkQ2FwYWJpbGl0eVtdKSBwcm92aWRlZENhcGFiaWxpdGllcy50b0FycmF5KG5ldyBQcm92aWRlZENhcGFiaWxpdHlbcHJvdmlkZWRDYXBhYmlsaXRpZXMuc2l6ZSgpXSkpOwotCi0JCWl1LnNldEFydGlmYWN0cyhuZXcgSUFydGlmYWN0S2V5W10ge2tleX0pOwotCi0JCWl1LnNldFRvdWNocG9pbnRUeXBlKFRPVUNIUE9JTlRfT1NHSSk7Ci0KLQkJLy8gU2V0IGNlcnRhaW4gcHJvcGVydGllcyBmcm9tIHRoZSBtYW5pZmVzdCBoZWFkZXIgYXR0cmlidXRlcyBhcyBJVSBwcm9wZXJ0aWVzLgotCQkvLyBUaGUgdmFsdWVzIG9mIHRoZXNlIGF0dHJpYnV0ZXMgbWF5IGJlIGxvY2FsaXplZCAoc3RyaW5ncyBzdGFydGluZyB3aXRoICclJykKLQkJLy8gd2l0aCB0aGUgdHJhbnNsYXRlZCB2YWx1ZXMgYXBwZWFyaW5nIGluIHRoZSBsb2NhbGl6YXRpb24gSVUgZnJhZ21lbnRzCi0JCS8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVuZGxlIElVLgotCQlpZiAobWFuaWZlc3QgIT0gbnVsbCkgewotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCBCVU5ETEVfSVVfUFJPUEVSVFlfTUFQLmxlbmd0aCkgewotCQkJCWlmIChtYW5pZmVzdC5jb250YWluc0tleShCVU5ETEVfSVVfUFJPUEVSVFlfTUFQW2ldKSkgewotCQkJCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQlVORExFX0lVX1BST1BFUlRZX01BUFtpXSk7Ci0JCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJaXUuc2V0UHJvcGVydHkoQlVORExFX0lVX1BST1BFUlRZX01BUFtpICsgMV0sIHZhbHVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpICs9IDI7Ci0JCQl9Ci0JCX0KLQotCQkvLyBEZWZpbmUgdGhlIGltbXV0YWJsZSBtZXRhZGF0YSBmb3IgdGhpcyBJVS4gSW4gdGhpcyBjYXNlIGltbXV0YWJsZSBtZWFucwotCQkvLyB0aGF0IHRoaXMgaXMgc29tZXRoaW5nIHRoYXQgd2lsbCBub3QgaW1wYWN0IHRoZSBjb25maWd1cmF0aW9uLgotCQlNYXAgdG91Y2hwb2ludERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAoaXNGb2xkZXJQbHVnaW4pCi0JCQl0b3VjaHBvaW50RGF0YS5wdXQoInppcHBlZCIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoIm1hbmlmZXN0IiwgdG9NYW5pZmVzdFN0cmluZyhtYW5pZmVzdCkpOyAvLyROT04tTkxTLTEkCi0JCWl1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCi0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGl1KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlSG9zdExvY2FsaXphdGlvbkZyYWdtZW50KElJbnN0YWxsYWJsZVVuaXQgYnVuZGxlSVUsIEJ1bmRsZURlc2NyaXB0aW9uIGJkLCBTdHJpbmcgaG9zdElkLCBTdHJpbmdbXSBob3N0QnVuZGxlTWFuaWZlc3RWYWx1ZXMsIFNldCBsb2NhbGl6YXRpb25JVXMpIHsKLQkJTWFwIGhvc3RMb2NhbGl6YXRpb25zID0gZ2V0SG9zdExvY2FsaXphdGlvbnMobmV3IEZpbGUoYmQuZ2V0TG9jYXRpb24oKSksIGhvc3RCdW5kbGVNYW5pZmVzdFZhbHVlcyk7Ci0JCWlmIChob3N0TG9jYWxpemF0aW9ucyAhPSBudWxsKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgbG9jYWxpemF0aW9uRnJhZ21lbnQgPSBjcmVhdGVMb2NhbGl6YXRpb25GcmFnbWVudE9mSG9zdChiZCwgaG9zdElkLCBob3N0QnVuZGxlTWFuaWZlc3RWYWx1ZXMsIGhvc3RMb2NhbGl6YXRpb25zKTsKLQkJCWxvY2FsaXphdGlvbklVcy5hZGQobG9jYWxpemF0aW9uRnJhZ21lbnQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAcGFyYW0gaG9zdElkCi0JICogQHBhcmFtIGJkCi0JICogQHBhcmFtIGxvY2FsZQotCSAqIEBwYXJhbSBsb2NhbGl6ZWRTdHJpbmdzCi0JICogQHJldHVybiBpbnN0YWxsYWJsZVVuaXRGcmFnbWVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCBjcmVhdGVMb2NhbGl6YXRpb25GcmFnbWVudE9mSG9zdChCdW5kbGVEZXNjcmlwdGlvbiBiZCwgU3RyaW5nIGhvc3RJZCwgU3RyaW5nW10gaG9zdE1hbmlmZXN0VmFsdWVzLCBNYXAgaG9zdExvY2FsaXphdGlvbnMpIHsKLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBmcmFnbWVudCA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgZnJhZ21lbnRJZCA9IG1ha2VIb3N0TG9jYWxpemF0aW9uRnJhZ21lbnRJZChiZC5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCWZyYWdtZW50LnNldElkKGZyYWdtZW50SWQpOwotCQlmcmFnbWVudC5zZXRWZXJzaW9uKGJkLmdldFZlcnNpb24oKSk7IC8vIFRPRE86IGlzIHRoaXMgYSBtZWFuaW5nZnVsIHZlcnNpb24/Ci0KLQkJSG9zdFNwZWNpZmljYXRpb24gaG9zdFNwZWMgPSBiZC5nZXRIb3N0KCk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIGhvc3RSZXFzID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBob3N0U3BlYy5nZXROYW1lKCksIGhvc3RTcGVjLmdldFZlcnNpb25SYW5nZSgpLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKX07Ci0JCWZyYWdtZW50LnNldEhvc3QoaG9zdFJlcXMpOwotCi0JCWZyYWdtZW50LnNldFNpbmdsZXRvbih0cnVlKTsKLQkJZnJhZ21lbnQuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQotCQkvLyBDcmVhdGUgYSBwcm92aWRlZCBjYXBhYmlsaXR5IGZvciBlYWNoIGxvY2FsZSBhbmQgYWRkIHRoZSB0cmFuc2xhdGVkIHByb3BlcnRpZXMuCi0JCUFycmF5TGlzdCBwcm92aWRlZENhcGFiaWxpdGllcyA9IG5ldyBBcnJheUxpc3QoaG9zdExvY2FsaXphdGlvbnMua2V5U2V0KCkuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gaG9zdExvY2FsaXphdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlMb2NhbGUgbG9jYWxlID0gKExvY2FsZSkgaXRlci5uZXh0KCk7Ci0JCQlQcm9wZXJ0aWVzIHRyYW5zbGF0ZWRTdHJpbmdzID0gKFByb3BlcnRpZXMpIGhvc3RMb2NhbGl6YXRpb25zLmdldChsb2NhbGUpOwotCi0JCQlFbnVtZXJhdGlvbiBwcm9wZXJ0eUtleXMgPSB0cmFuc2xhdGVkU3RyaW5ncy5wcm9wZXJ0eU5hbWVzKCk7Ci0JCQl3aGlsZSAocHJvcGVydHlLZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIG5leHRLZXkgPSAoU3RyaW5nKSBwcm9wZXJ0eUtleXMubmV4dEVsZW1lbnQoKTsKLQkJCQlmcmFnbWVudC5zZXRQcm9wZXJ0eShsb2NhbGUudG9TdHJpbmcoKSArICcuJyArIG5leHRLZXksIHRyYW5zbGF0ZWRTdHJpbmdzLmdldFByb3BlcnR5KG5leHRLZXkpKTsKLQkJCX0KLQkJCXByb3ZpZGVkQ2FwYWJpbGl0aWVzLmFkZChtYWtlVHJhbnNsYXRpb25DYXBhYmlsaXR5KGhvc3RJZCwgbG9jYWxlKSk7Ci0JCX0KLQkJZnJhZ21lbnQuc2V0Q2FwYWJpbGl0aWVzKChQcm92aWRlZENhcGFiaWxpdHlbXSkgcHJvdmlkZWRDYXBhYmlsaXRpZXMudG9BcnJheShuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W3Byb3ZpZGVkQ2FwYWJpbGl0aWVzLnNpemUoKV0pKTsKLQotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdEZyYWdtZW50KGZyYWdtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcmV0dXJuIHRoZSBpZCBmb3IgdGhlIGl1IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGxvY2FsaXplZCBwcm9wZXJ0aWVzCi0JICogCQkgICBmb3IgdGhlIGJ1bmRsZSB3aXRoIHRoZSBnaXZlbiBpZAotCSAqLwotCS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlQnVuZGxlTG9jYWxpemF0aW9uRnJhZ21lbnRJZChTdHJpbmcgaWQpIHsKLQkvLwkJcmV0dXJuIGlkICsgIi50cmFuc2xhdGVkX3Byb3BlcnRpZXMiOyAvLyROT04tTkxTLTEkCi0JLy8JfQotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqIEByZXR1cm4gdGhlIGlkIGZvciB0aGUgaXUgZnJhZ21lbnQgY29udGFpbmluZyBsb2NhbGl6ZWQgcHJvcGVydGllcwotCSAqIAkJICAgZm9yIHRoZSBmcmFnbWVudCB3aXRoIHRoZSBnaXZlbiBpZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZUhvc3RMb2NhbGl6YXRpb25GcmFnbWVudElkKFN0cmluZyBpZCkgewotCQlyZXR1cm4gaWQgKyAiLnRyYW5zbGF0ZWRfaG9zdF9wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3ZpZGVkQ2FwYWJpbGl0eSBtYWtlVHJhbnNsYXRpb25DYXBhYmlsaXR5KFN0cmluZyBob3N0SWQsIExvY2FsZSBsb2NhbGUpIHsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoTkFNRVNQQUNFX0lVX0xPQ0FMSVpBVElPTiwgbG9jYWxlLnRvU3RyaW5nKCksIG5ldyBWZXJzaW9uKDEsIDAsIDApKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIElVIGNvcnJlc3BvbmRpbmcgdG8gYW4gdXBkYXRlIHNpdGUgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIGNhdGVnb3J5IGRlc2NyaXB0b3IKLQkgKiBAcGFyYW0gZmVhdHVyZUlVcyBUaGUgSVVzIG9mIHRoZSBmZWF0dXJlcyB0aGF0IGJlbG9uZyB0byB0aGUgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gcGFyZW50Q2F0ZWdvcnkgVGhlIHBhcmVudCBjYXRlZ29yeSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBAcmV0dXJuIGFuIElVIHJlcHJlc2VudGluZyB0aGUgY2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlQ2F0ZWdvcnlJVShTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnksIFNldCBmZWF0dXJlSVVzLCBJSW5zdGFsbGFibGVVbml0IHBhcmVudENhdGVnb3J5KSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGNhdCA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJY2F0LnNldFNpbmdsZXRvbih0cnVlKTsKLQkJY2F0LnNldElkKGNhdGVnb3J5LmdldE5hbWUoKSk7Ci0JCWNhdC5zZXRWZXJzaW9uKFZlcnNpb24uZW1wdHlWZXJzaW9uKTsKLQkJY2F0LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBjYXRlZ29yeS5nZXRMYWJlbCgpKTsKLQkJY2F0LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9ERVNDUklQVElPTiwgY2F0ZWdvcnkuZ2V0RGVzY3JpcHRpb24oKSk7Ci0KLQkJQXJyYXlMaXN0IHJlcXNDb25maWd1cmF0aW9uVW5pdHMgPSBuZXcgQXJyYXlMaXN0KGZlYXR1cmVJVXMuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGZlYXR1cmVJVXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlWZXJzaW9uUmFuZ2UgcmFuZ2UgPSBuZXcgVmVyc2lvblJhbmdlKGl1LmdldFZlcnNpb24oKSwgdHJ1ZSwgaXUuZ2V0VmVyc2lvbigpLCB0cnVlKTsKLQkJCXJlcXNDb25maWd1cmF0aW9uVW5pdHMuYWRkKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGl1LmdldElkKCksIHJhbmdlLCBpdS5nZXRGaWx0ZXIoKSwgZmFsc2UsIGZhbHNlKSk7Ci0JCX0KLQkJLy9ub3RlIHRoYXQgdXBkYXRlIHNpdGVzIGRvbid0IGN1cnJlbnRseSBzdXBwb3J0IG5lc3RlZCBjYXRlZ29yaWVzLCBidXQgaXQgbWF5IGJlIHVzZWZ1bCB0byBhZGQgaW4gdGhlIGZ1dHVyZQotCQlpZiAocGFyZW50Q2F0ZWdvcnkgIT0gbnVsbCkgewotCQkJcmVxc0NvbmZpZ3VyYXRpb25Vbml0cy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgcGFyZW50Q2F0ZWdvcnkuZ2V0SWQoKSwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIHBhcmVudENhdGVnb3J5LmdldEZpbHRlcigpLCBmYWxzZSwgZmFsc2UpKTsKLQkJfQotCQljYXQuc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKFJlcXVpcmVkQ2FwYWJpbGl0eVtdKSByZXFzQ29uZmlndXJhdGlvblVuaXRzLnRvQXJyYXkobmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtyZXFzQ29uZmlndXJhdGlvblVuaXRzLnNpemUoKV0pKTsKLQkJY2F0LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGNhdGVnb3J5LmdldE5hbWUoKSwgVmVyc2lvbi5lbXB0eVZlcnNpb24pfSk7Ci0JCWNhdC5zZXRBcnRpZmFjdHMobmV3IElBcnRpZmFjdEtleVswXSk7Ci0JCWNhdC5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9DQVRFR09SWSwgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChjYXQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVDb25maWdTY3JpcHQoR2VuZXJhdG9yQnVuZGxlSW5mbyBjb25maWdJbmZvLCBib29sZWFuIGlzQnVuZGxlRnJhZ21lbnQpIHsKLQkJaWYgKGNvbmZpZ0luZm8gPT0gbnVsbCkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBjb25maWdTY3JpcHQgPSAiIjsvLyROT04tTkxTLTEkCi0JCWlmICghaXNCdW5kbGVGcmFnbWVudCAmJiBjb25maWdJbmZvLmdldFN0YXJ0TGV2ZWwoKSAhPSBCdW5kbGVJbmZvLk5PX0xFVkVMKSB7Ci0JCQljb25maWdTY3JpcHQgKz0gInNldFN0YXJ0TGV2ZWwoc3RhcnRMZXZlbDoiICsgY29uZmlnSW5mby5nZXRTdGFydExldmVsKCkgKyAiKTsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoIWlzQnVuZGxlRnJhZ21lbnQgJiYgY29uZmlnSW5mby5pc01hcmtlZEFzU3RhcnRlZCgpKSB7Ci0JCQljb25maWdTY3JpcHQgKz0gIm1hcmtTdGFydGVkKHN0YXJ0ZWQ6IHRydWUpOyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChjb25maWdJbmZvLmdldFNwZWNpYWxDb25maWdDb21tYW5kcygpICE9IG51bGwpIHsKLQkJCWNvbmZpZ1NjcmlwdCArPSBjb25maWdJbmZvLmdldFNwZWNpYWxDb25maWdDb21tYW5kcygpOwotCQl9Ci0KLQkJcmV0dXJuIGNvbmZpZ1NjcmlwdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlRGVmYXVsdEJ1bmRsZUNvbmZpZ1NjcmlwdChHZW5lcmF0b3JCdW5kbGVJbmZvIGNvbmZpZ0luZm8pIHsKLQkJcmV0dXJuIGNyZWF0ZUNvbmZpZ1NjcmlwdChjb25maWdJbmZvLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZURlZmF1bHRCdW5kbGVDb25maWd1cmF0aW9uVW5pdChHZW5lcmF0b3JCdW5kbGVJbmZvIGNvbmZpZ0luZm8sIEdlbmVyYXRvckJ1bmRsZUluZm8gdW5jb25maWdJbmZvLCBTdHJpbmcgY29uZmlndXJhdGlvbkZsYXZvcikgewotCQlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGN1ID0gbmV3IEluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGNvbmZpZ1VuaXRJZCA9IGNyZWF0ZURlZmF1bHRDb25maWdVbml0SWQoT1NHSV9CVU5ETEVfQ0xBU1NJRklFUiwgY29uZmlndXJhdGlvbkZsYXZvcik7Ci0JCWN1LnNldElkKGNvbmZpZ1VuaXRJZCk7Ci0JCVZlcnNpb24gY29uZmlnVW5pdFZlcnNpb24gPSBuZXcgVmVyc2lvbigxLCAwLCAwKTsKLQkJY3Uuc2V0VmVyc2lvbihjb25maWdVbml0VmVyc2lvbik7Ci0KLQkJLy8gQWRkIGNhcGFiaWxpdGllcyBmb3IgZnJhZ21lbnQsIHNlbGYsIGFuZCBkZXNjcmliaW5nIHRoZSBmbGF2b3Igc3VwcG9ydGVkCi0JCWN1LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0ZSQUdNRU5ULCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCWN1LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge2NyZWF0ZVNlbGZDYXBhYmlsaXR5KGNvbmZpZ1VuaXRJZCwgY29uZmlnVW5pdFZlcnNpb24pLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0ZMQVZPUiwgY29uZmlndXJhdGlvbkZsYXZvciwgbmV3IFZlcnNpb24oMSwgMCwgMCkpfSk7Ci0KLQkJLy8gQ3JlYXRlIGEgcmVxdWlyZWQgY2FwYWJpbGl0eSBvbiBidW5kbGVzCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoTkFNRVNQQUNFX0VDTElQU0VfVFlQRSwgVFlQRV9FQ0xJUFNFX0JVTkRMRSwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCB0cnVlKX07Ci0JCWN1LnNldEhvc3QocmVxcyk7Ci0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJdG91Y2hwb2ludERhdGEucHV0KCJpbnN0YWxsIiwgImluc3RhbGxCdW5kbGUoYnVuZGxlOiR7YXJ0aWZhY3R9KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmluc3RhbGwiLCAidW5pbnN0YWxsQnVuZGxlKGJ1bmRsZToke2FydGlmYWN0fSkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRvdWNocG9pbnREYXRhLnB1dCgiY29uZmlndXJlIiwgY3JlYXRlRGVmYXVsdEJ1bmRsZUNvbmZpZ1NjcmlwdChjb25maWdJbmZvKSk7IC8vJE5PTi1OTFMtMSQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmNvbmZpZ3VyZSIsIGNyZWF0ZURlZmF1bHRCdW5kbGVVbmNvbmZpZ1NjcmlwdCh1bmNvbmZpZ0luZm8pKTsgLy8kTk9OLU5MUy0xJAotCi0JCWN1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChjdSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZURlZmF1bHRCdW5kbGVVbmNvbmZpZ1NjcmlwdChHZW5lcmF0b3JCdW5kbGVJbmZvIHVuY29uZmlnSW5mbykgewotCQlyZXR1cm4gY3JlYXRlVW5jb25maWdTY3JpcHQodW5jb25maWdJbmZvLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlRGVmYXVsdENvbmZpZ1VuaXRJZChTdHJpbmcgY2xhc3NpZmllciwgU3RyaW5nIGNvbmZpZ3VyYXRpb25GbGF2b3IpIHsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25GbGF2b3IgKyAiLiIgKyBjbGFzc2lmaWVyICsgIi5kZWZhdWx0IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZURlZmF1bHRGZWF0dXJlQ29uZmlndXJhdGlvblVuaXQoU3RyaW5nIGNvbmZpZ3VyYXRpb25GbGF2b3IpIHsKLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBjdSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBjb25maWdVbml0SWQgPSBjcmVhdGVEZWZhdWx0Q29uZmlnVW5pdElkKEVDTElQU0VfRkVBVFVSRV9DTEFTU0lGSUVSLCBjb25maWd1cmF0aW9uRmxhdm9yKTsKLQkJY3Uuc2V0SWQoY29uZmlnVW5pdElkKTsKLQkJVmVyc2lvbiBjb25maWdVbml0VmVyc2lvbiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApOwotCQljdS5zZXRWZXJzaW9uKGNvbmZpZ1VuaXRWZXJzaW9uKTsKLQotCQkvLyBBZGQgY2FwYWJpbGl0aWVzIGZvciBmcmFnbWVudCwgc2VsZiwgYW5kIGRlc2NyaWJpbmcgdGhlIGZsYXZvciBzdXBwb3J0ZWQKLQkJY3Uuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJY3Uuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7Y3JlYXRlU2VsZkNhcGFiaWxpdHkoY29uZmlnVW5pdElkLCBjb25maWdVbml0VmVyc2lvbiksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfRkxBVk9SLCBjb25maWd1cmF0aW9uRmxhdm9yLCBuZXcgVmVyc2lvbigxLCAwLCAwKSl9KTsKLQotCQkvLyBDcmVhdGUgYSByZXF1aXJlZCBjYXBhYmlsaXR5IG9uIGZlYXR1cmVzCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoTkFNRVNQQUNFX0VDTElQU0VfVFlQRSwgVFlQRV9FQ0xJUFNFX0ZFQVRVUkUsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCB0cnVlLCB0cnVlKX07Ci0JCWN1LnNldEhvc3QocmVxcyk7Ci0KLQkJY3Uuc2V0RmlsdGVyKElOU1RBTExfRkVBVFVSRVNfRklMVEVSKTsKLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJdG91Y2hwb2ludERhdGEucHV0KCJpbnN0YWxsIiwgImluc3RhbGxGZWF0dXJlKGZlYXR1cmU6JHthcnRpZmFjdH0sZmVhdHVyZUlkOmRlZmF1bHQsZmVhdHVyZVZlcnNpb246ZGVmYXVsdCkiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmluc3RhbGwiLCAidW5pbnN0YWxsRmVhdHVyZShmZWF0dXJlOiR7YXJ0aWZhY3R9LGZlYXR1cmVJZDpkZWZhdWx0LGZlYXR1cmVWZXJzaW9uOmRlZmF1bHQpIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWN1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCi0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGN1KTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25Vbml0Rm9yU291cmNlQnVuZGxlcyhTdHJpbmcgY29uZmlndXJhdGlvbkZsYXZvcikgewotCQlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGN1ID0gbmV3IEluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGNvbmZpZ1VuaXRJZCA9IGNyZWF0ZURlZmF1bHRDb25maWdVbml0SWQoInNvdXJjZSIsIGNvbmZpZ3VyYXRpb25GbGF2b3IpOyAvLyROT04tTkxTLTEkCi0JCWN1LnNldElkKGNvbmZpZ1VuaXRJZCk7Ci0JCVZlcnNpb24gY29uZmlnVW5pdFZlcnNpb24gPSBuZXcgVmVyc2lvbigxLCAwLCAwKTsKLQkJY3Uuc2V0VmVyc2lvbihjb25maWdVbml0VmVyc2lvbik7Ci0KLQkJLy8gQWRkIGNhcGFiaWxpdGllcyBmb3IgZnJhZ21lbnQsIHNlbGYsIGFuZCBkZXNjcmliaW5nIHRoZSBmbGF2b3Igc3VwcG9ydGVkCi0JCWN1LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0ZSQUdNRU5ULCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCWN1LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge2NyZWF0ZVNlbGZDYXBhYmlsaXR5KGNvbmZpZ1VuaXRJZCwgY29uZmlnVW5pdFZlcnNpb24pLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0ZMQVZPUiwgY29uZmlndXJhdGlvbkZsYXZvciwgbmV3IFZlcnNpb24oMSwgMCwgMCkpfSk7Ci0KLQkJLy8gQ3JlYXRlIGEgcmVxdWlyZWQgY2FwYWJpbGl0eSBvbiBzb3VyY2UgcHJvdmlkZXJzCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoTkFNRVNQQUNFX0VDTElQU0VfVFlQRSwgVFlQRV9FQ0xJUFNFX1NPVVJDRSwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIHRydWUpfTsKLQkJY3Uuc2V0SG9zdChyZXFzKTsKLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQotCQl0b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCAiYWRkU291cmNlQnVuZGxlKGJ1bmRsZToke2FydGlmYWN0fSkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRvdWNocG9pbnREYXRhLnB1dCgidW5pbnN0YWxsIiwgInJlbW92ZVNvdXJjZUJ1bmRsZShidW5kbGU6JHthcnRpZmFjdH0pIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQljdS5hZGRUb3VjaHBvaW50RGF0YShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludERhdGEodG91Y2hwb2ludERhdGEpKTsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoY3UpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRXh0cmFQcm9wZXJ0aWVzKElJbnN0YWxsYWJsZVVuaXQgaWl1LCBQcm9wZXJ0aWVzIGV4dHJhUHJvcGVydGllcykgewotCQlpZiAoaWl1IGluc3RhbmNlb2YgSW5zdGFsbGFibGVVbml0KSB7Ci0JCQlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSW5zdGFsbGFibGVVbml0KSBpaXU7Ci0KLQkJCWZvciAoRW51bWVyYXRpb24gZSA9IGV4dHJhUHJvcGVydGllcy5wcm9wZXJ0eU5hbWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaXUuc2V0UHJvcGVydHkobmFtZSwgZXh0cmFQcm9wZXJ0aWVzLmdldFByb3BlcnR5KG5hbWUpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdFtdIGNyZWF0ZUVjbGlwc2VJVShCdW5kbGVEZXNjcmlwdGlvbiBiZCwgTWFwIG1hbmlmZXN0LCBib29sZWFuIGlzRm9sZGVyUGx1Z2luLCBJQXJ0aWZhY3RLZXkga2V5LCBQcm9wZXJ0aWVzIGV4dHJhUHJvcGVydGllcykgewotCQlBcnJheUxpc3QgaXVzQ3JlYXRlZCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IGNyZWF0ZUJ1bmRsZUlVKGJkLCBtYW5pZmVzdCwgaXNGb2xkZXJQbHVnaW4sIGtleSk7Ci0JCWFkZEV4dHJhUHJvcGVydGllcyhpdSwgZXh0cmFQcm9wZXJ0aWVzKTsKLQkJaXVzQ3JlYXRlZC5hZGQoaXUpOwotCi0JCXJldHVybiAoSUluc3RhbGxhYmxlVW5pdFtdKSAoaXVzQ3JlYXRlZC50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W2l1c0NyZWF0ZWQuc2l6ZSgpXSkpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3RLZXkgY3JlYXRlRmVhdHVyZUFydGlmYWN0S2V5KFN0cmluZyBmc24sIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiBuZXcgQXJ0aWZhY3RLZXkoRUNMSVBTRV9GRUFUVVJFX0NMQVNTSUZJRVIsIGZzbiwgbmV3IFZlcnNpb24odmVyc2lvbikpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUZlYXR1cmVKYXJJVShGZWF0dXJlIGZlYXR1cmUsIEFycmF5TGlzdCBjaGlsZElVcywgYm9vbGVhbiBpc0V4cGxvZGVkLCBQcm9wZXJ0aWVzIGV4dHJhUHJvcGVydGllcykgewotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdSA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGlkID0gZ2V0VHJhbnNmb3JtZWRJZChmZWF0dXJlLmdldElkKCksIC8qaXNQbHVnaW4qL2ZhbHNlLCAvKmlzR3JvdXAqL2ZhbHNlKTsKLQkJaXUuc2V0SWQoaWQpOwotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbihmZWF0dXJlLmdldFZlcnNpb24oKSk7Ci0JCWl1LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCWlmIChmZWF0dXJlLmdldExpY2Vuc2UoKSAhPSBudWxsKQotCQkJaXUuc2V0TGljZW5zZShuZXcgTGljZW5zZShmZWF0dXJlLmdldExpY2Vuc2VVUkwoKSwgZmVhdHVyZS5nZXRMaWNlbnNlKCkpKTsKLQkJaWYgKGZlYXR1cmUuZ2V0Q29weXJpZ2h0KCkgIT0gbnVsbCkKLQkJCWl1LnNldENvcHlyaWdodChuZXcgQ29weXJpZ2h0KGZlYXR1cmUuZ2V0Q29weXJpZ2h0VVJMKCksIGZlYXR1cmUuZ2V0Q29weXJpZ2h0KCkpKTsKLQotCQkvLyBUaGUgcmVxdWlyZWQgY2FwYWJpbGl0aWVzIGFyZSBub3Qgc3BlY2lmaWVkIGF0IHRoaXMgbGV2ZWwgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRoZSBmZWF0dXJlIGphciB0byBiZSBhdHRyYWN0aXZlIHRvIGluc3RhbGwuCi0KLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoVE9VQ0hQT0lOVF9PU0dJKTsKLQkJaXUuc2V0RmlsdGVyKElOU1RBTExfRkVBVFVSRVNfRklMVEVSKTsKLQkJaXUuc2V0U2luZ2xldG9uKHRydWUpOwotCi0JCWlmIChmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIGluc3RhbGxIYW5kbGVyUHJvcGVydHkgPSAiaGFuZGxlcj0iICsgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlcigpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmIChmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyTGlicmFyeSgpICE9IG51bGwpCi0JCQkJaW5zdGFsbEhhbmRsZXJQcm9wZXJ0eSArPSAiLCBsaWJyYXJ5PSIgKyBmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyTGlicmFyeSgpOyAvLyROT04tTkxTLTEkCi0KLQkJCWlmIChmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyVVJMKCkgIT0gbnVsbCkKLQkJCQlpbnN0YWxsSGFuZGxlclByb3BlcnR5ICs9ICIsIHVybD0iICsgZmVhdHVyZS5nZXRJbnN0YWxsSGFuZGxlclVSTCgpOyAvLyROT04tTkxTLTEkCi0KLQkJCWl1LnNldFByb3BlcnR5KEVDTElQU0VfSU5TVEFMTF9IQU5ETEVSX1BST1AsIGluc3RhbGxIYW5kbGVyUHJvcGVydHkpOwotCQl9Ci0KLQkJaXUuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7Y3JlYXRlU2VsZkNhcGFiaWxpdHkoaWQsIHZlcnNpb24pLCBGRUFUVVJFX0NBUEFCSUxJVFksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoQ0FQQUJJTElUWV9OU19VUERBVEVfRkVBVFVSRSwgZmVhdHVyZS5nZXRJZCgpLCB2ZXJzaW9uKX0pOwotCQlpdS5zZXRBcnRpZmFjdHMobmV3IElBcnRpZmFjdEtleVtdIHtjcmVhdGVGZWF0dXJlQXJ0aWZhY3RLZXkoZmVhdHVyZS5nZXRJZCgpLCB2ZXJzaW9uLnRvU3RyaW5nKCkpfSk7Ci0KLQkJLy8gbGluayBpbiBhbGwgdGhlIGNoaWxkcmVuIChpZiBhbnkpIGFzIHJlcXVpcmVtZW50cy4KLQkJLy8gVE9ETyBjb25zaWRlciBpZiB0aGVzZSBzaG91bGQgYmUgbGlua2VkIGFzIGV4YWN0IHZlcnNpb24gbnVtYmVycy4gIFNob3VsZCBiZSBvayBidXQgbWF5IGJlIGJyaXR0bGUuCi0JCWlmIChjaGlsZElVcyAhPSBudWxsKSB7Ci0JCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZCA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbY2hpbGRJVXMuc2l6ZSgpXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRJVXMuc2l6ZSgpOyBpKyspIHsKLQkJCQlJSW5zdGFsbGFibGVVbml0IGNoaWxkID0gKElJbnN0YWxsYWJsZVVuaXQpIGNoaWxkSVVzLmdldChpKTsKLQkJCQlyZXF1aXJlZFtpXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSVVfTkFNRVNQQUNFLCBjaGlsZC5nZXRJZCgpLCBuZXcgVmVyc2lvblJhbmdlKGNoaWxkLmdldFZlcnNpb24oKSwgdHJ1ZSwgY2hpbGQuZ2V0VmVyc2lvbigpLCB0cnVlKSwgSU5TVEFMTF9GRUFUVVJFU19GSUxURVIsIGZhbHNlLCBmYWxzZSk7Ci0JCQl9Ci0JCQlpdS5zZXRSZXF1aXJlZENhcGFiaWxpdGllcyhyZXF1aXJlZCk7Ci0JCX0KLQotCQlpZiAoaXNFeHBsb2RlZCkgewotCQkJLy8gRGVmaW5lIHRoZSBpbW11dGFibGUgbWV0YWRhdGEgZm9yIHRoaXMgSVUuIEluIHRoaXMgY2FzZSBpbW11dGFibGUgbWVhbnMKLQkJCS8vIHRoYXQgdGhpcyBpcyBzb21ldGhpbmcgdGhhdCB3aWxsIG5vdCBpbXBhY3QgdGhlIGNvbmZpZ3VyYXRpb24uCi0JCQlNYXAgdG91Y2hwb2ludERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQkJdG91Y2hwb2ludERhdGEucHV0KCJ6aXBwZWQiLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWl1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQl9Ci0KLQkJaWYgKGV4dHJhUHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBlID0gZXh0cmFQcm9wZXJ0aWVzLnByb3BlcnR5TmFtZXMoKTsKLQkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaXUuc2V0UHJvcGVydHkobmFtZSwgZXh0cmFQcm9wZXJ0aWVzLmdldFByb3BlcnR5KG5hbWUpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGl1KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBtb3ZlZCB0byBGZWF0dXJlc0FjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVHcm91cElVKEZlYXR1cmUgZmVhdHVyZSwgSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlSVUpIHsKLQkJcmV0dXJuIGNyZWF0ZUdyb3VwSVUoZmVhdHVyZSwgZmVhdHVyZUlVLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBtb3ZlZCB0byBGZWF0dXJlc0FjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVHcm91cElVKEZlYXR1cmUgZmVhdHVyZSwgSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlSVUsIFByb3BlcnRpZXMgZXh0cmFQcm9wZXJ0aWVzKSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgaWQgPSBnZXRUcmFuc2Zvcm1lZElkKGZlYXR1cmUuZ2V0SWQoKSwgLyppc1BsdWdpbiovZmFsc2UsIC8qaXNHcm91cCovdHJ1ZSk7Ci0JCWl1LnNldElkKGlkKTsKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24oZmVhdHVyZS5nZXRWZXJzaW9uKCkpOwotCQlpdS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQlpdS5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgZmVhdHVyZS5nZXRMYWJlbCgpKTsKLQkJaWYgKGZlYXR1cmUuZ2V0TGljZW5zZSgpICE9IG51bGwpCi0JCQlpdS5zZXRMaWNlbnNlKG5ldyBMaWNlbnNlKGZlYXR1cmUuZ2V0TGljZW5zZVVSTCgpLCBmZWF0dXJlLmdldExpY2Vuc2UoKSkpOwotCQlpZiAoZmVhdHVyZS5nZXRDb3B5cmlnaHQoKSAhPSBudWxsKQotCQkJaXUuc2V0Q29weXJpZ2h0KG5ldyBDb3B5cmlnaHQoZmVhdHVyZS5nZXRDb3B5cmlnaHRVUkwoKSwgZmVhdHVyZS5nZXRDb3B5cmlnaHQoKSkpOwotCQlpdS5zZXRVcGRhdGVEZXNjcmlwdG9yKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVVcGRhdGVEZXNjcmlwdG9yKGlkLCBuZXcgVmVyc2lvblJhbmdlKG5ldyBWZXJzaW9uKDAsIDAsIDApLCB0cnVlLCBuZXcgVmVyc2lvbihmZWF0dXJlLmdldFZlcnNpb24oKSksIGZhbHNlKSwgSVVwZGF0ZURlc2NyaXB0b3IuTk9STUFMLCBudWxsKSk7Ci0KLQkJRmVhdHVyZUVudHJ5IGVudHJpZXNbXSA9IGZlYXR1cmUuZ2V0RW50cmllcygpOwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZCA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbZW50cmllcy5sZW5ndGggKyAxXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlWZXJzaW9uUmFuZ2UgcmFuZ2UgPSBnZXRWZXJzaW9uUmFuZ2UoZW50cmllc1tpXSk7Ci0JCQlyZXF1aXJlZFtpXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSVVfTkFNRVNQQUNFLCBnZXRUcmFuc2Zvcm1lZElkKGVudHJpZXNbaV0uZ2V0SWQoKSwgZW50cmllc1tpXS5pc1BsdWdpbigpLCAvKmlzR3JvdXAqL3RydWUpLCByYW5nZSwgZ2V0RmlsdGVyKGVudHJpZXNbaV0pLCBlbnRyaWVzW2ldLmlzT3B0aW9uYWwoKSwgZmFsc2UpOwotCQl9Ci0JCXJlcXVpcmVkW2VudHJpZXMubGVuZ3RoXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSVVfTkFNRVNQQUNFLCBmZWF0dXJlSVUuZ2V0SWQoKSwgbmV3IFZlcnNpb25SYW5nZShmZWF0dXJlSVUuZ2V0VmVyc2lvbigpLCB0cnVlLCBmZWF0dXJlSVUuZ2V0VmVyc2lvbigpLCB0cnVlKSwgSU5TVEFMTF9GRUFUVVJFU19GSUxURVIsIGZhbHNlLCBmYWxzZSk7Ci0JCWl1LnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKHJlcXVpcmVkKTsKLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoVG91Y2hwb2ludFR5cGUuTk9ORSk7Ci0JCWl1LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0dST1VQLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCS8vIFRPRE86IHNob3VsZG4ndCB0aGUgZmlsdGVyIGZvciB0aGUgZ3JvdXAgYmUgY29uc3RydWN0ZWQgZnJvbSBvcywgd3MsIGFyY2gsIG5sCi0JCS8vIAkJIG9mIHRoZSBmZWF0dXJlPwotCQkvLyBpdS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJaXUuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7Y3JlYXRlU2VsZkNhcGFiaWxpdHkoaWQsIHZlcnNpb24pfSk7Ci0KLQkJaWYgKGV4dHJhUHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBlID0gZXh0cmFQcm9wZXJ0aWVzLnByb3BlcnR5TmFtZXMoKTsKLQkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaXUuc2V0UHJvcGVydHkobmFtZSwgZXh0cmFQcm9wZXJ0aWVzLmdldFByb3BlcnR5KG5hbWUpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGl1KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIElVcyBhbmQgYXJ0aWZhY3QgZGVzY3JpcHRvcnMgZm9yIHRoZSBKUkUuICBUaGUgcmVzdWx0aW5nIElVcyBhcmUgYWRkZWQKLQkgKiB0byB0aGUgZ2l2ZW4gc2V0LCBhbmQgdGhlIHJlc3VsdGluZyBhcnRpZmFjdCBkZXNjcmlwdG9yLCBpZiBhbnksIGlzIHJldHVybmVkLgotCSAqIElmIHRoZSBqcmVMb2NhdGlvbiBpcyA8Y29kZT5udWxsPC9jb2RlPiwgZGVmYXVsdCBpbmZvcm1hdGlvbiBpcyBnZW5lcmF0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3REZXNjcmlwdG9yIGNyZWF0ZUpSRURhdGEoRmlsZSBqcmVMb2NhdGlvbiwgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlpdS5zZXRTaW5nbGV0b24oZmFsc2UpOwotCQlTdHJpbmcgaWQgPSAiYS5qcmUiOyAvLyROT04tTkxTLTEkCi0JCVZlcnNpb24gdmVyc2lvbiA9IERFRkFVTFRfSlJFX1ZFUlNJT047Ci0JCWl1LnNldElkKGlkKTsKLQkJaXUuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoVE9VQ0hQT0lOVF9OQVRJVkUpOwotCi0JCWlmIChqcmVMb2NhdGlvbiA9PSBudWxsIHx8ICFqcmVMb2NhdGlvbi5leGlzdHMoKSkgewotCQkJLy8gc2V0IHNvbWUgcmVhc29uYWJsZSBkZWZhdWx0cwotCQkJaXUuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJCWl1LnNldENhcGFiaWxpdGllcyhnZW5lcmF0ZUpSRUNhcGFiaWxpdHkoaWQsIHZlcnNpb24sIG51bGwpKTsKLQkJCXJlc3VsdHMuYWRkSVUoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdSksIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlnZW5lcmF0ZUpSRUlVRGF0YShpdSwgaWQsIHZlcnNpb24sIGpyZUxvY2F0aW9uKTsKLQotCQkvL0dlbmVyYXRlIGFydGlmYWN0IGZvciBKUkUKLQkJSUFydGlmYWN0S2V5IGtleSA9IG5ldyBBcnRpZmFjdEtleShCSU5BUllfQVJUSUZBQ1RfQ0xBU1NJRklFUiwgaWQsIHZlcnNpb24pOwotCQlpdS5zZXRBcnRpZmFjdHMobmV3IElBcnRpZmFjdEtleVtdIHtrZXl9KTsKLQkJcmVzdWx0cy5hZGRJVShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGl1KSwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQotCQkvL0NyZWF0ZSBjb25maWcgaW5mbyBmb3IgdGhlIENVCi0JCUluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24gY3UgPSBuZXcgSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgY29uZmlnSWQgPSAiY29uZmlnLiIgKyBpZDsvLyROT04tTkxTLTEkCi0JCWN1LnNldElkKGNvbmZpZ0lkKTsKLQkJY3Uuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJY3Uuc2V0SG9zdChuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGlkLCBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIHZlcnNpb25NYXgsIHRydWUpLCBudWxsLCBmYWxzZSwgZmFsc2UpfSk7Ci0JCWN1LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0ZSQUdNRU5ULCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCWN1LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge2NyZWF0ZVNlbGZDYXBhYmlsaXR5KGNvbmZpZ0lkLCB2ZXJzaW9uKX0pOwotCQljdS5zZXRUb3VjaHBvaW50VHlwZShUT1VDSFBPSU5UX05BVElWRSk7Ci0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZyBjb25maWd1cmF0aW9uRGF0YSA9ICJ1bnppcChzb3VyY2U6QGFydGlmYWN0LCB0YXJnZXQ6JHtpbnN0YWxsRm9sZGVyfSk7IjsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCBjb25maWd1cmF0aW9uRGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHVuQ29uZmlndXJhdGlvbkRhdGEgPSAiY2xlYW51cHppcChzb3VyY2U6QGFydGlmYWN0LCB0YXJnZXQ6JHtpbnN0YWxsRm9sZGVyfSk7IjsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuaW5zdGFsbCIsIHVuQ29uZmlndXJhdGlvbkRhdGEpOyAvLyROT04tTkxTLTEkCi0JCWN1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQlyZXN1bHRzLmFkZElVKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoY3UpLCBJUHVibGlzaGVyUmVzdWx0LlJPT1QpOwotCi0JCS8vQ3JlYXRlIHRoZSBhcnRpZmFjdCBkZXNjcmlwdG9yCi0JCXJldHVybiBjcmVhdGVBcnRpZmFjdERlc2NyaXB0b3Ioa2V5LCBqcmVMb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBBcnRpZmFjdEtleSBjcmVhdGVMYXVuY2hlckFydGlmYWN0S2V5KFN0cmluZyBpZCwgVmVyc2lvbiB2ZXJzaW9uKSB7Ci0JCXJldHVybiBuZXcgQXJ0aWZhY3RLZXkoQklOQVJZX0FSVElGQUNUX0NMQVNTSUZJRVIsIGlkLCB2ZXJzaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIElVcyBhbmQgYXJ0aWZhY3RzIGZvciB0aGUgTGF1bmNoZXIgZXhlY3V0YWJsZS4gVGhlIHJlc3VsdGluZyBJVXMgYXJlIGFkZGVkCi0JICogdG8gdGhlIGdpdmVuIHNldCwgYW5kIHRoZSByZXN1bHRpbmcgYXJ0aWZhY3QgZGVzY3JpcHRvciBpcyByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBcnRpZmFjdERlc2NyaXB0b3IgY3JlYXRlTGF1bmNoZXJJVShGaWxlIGxhdW5jaGVyLCBTdHJpbmcgY29uZmlndXJhdGlvbkZsYXZvciwgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRhbnRJVXMpIHsKLQkJaWYgKGxhdW5jaGVyID09IG51bGwgfHwgIWxhdW5jaGVyLmV4aXN0cygpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy9DcmVhdGUgdGhlIElVCi0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlpdS5zZXRTaW5nbGV0b24odHJ1ZSk7Ci0JCVN0cmluZyBsYXVuY2hlcklkID0gTEFVTkNIRVJfSURfUFJFRklYICsgJ18nICsgbGF1bmNoZXIuZ2V0TmFtZSgpOwotCQlpdS5zZXRJZChsYXVuY2hlcklkKTsKLQkJaXUuc2V0VmVyc2lvbihMQVVOQ0hFUl9WRVJTSU9OKTsKLQotCQlJQXJ0aWZhY3RLZXkga2V5ID0gY3JlYXRlTGF1bmNoZXJBcnRpZmFjdEtleShsYXVuY2hlcklkLCBMQVVOQ0hFUl9WRVJTSU9OKTsKLQkJaXUuc2V0QXJ0aWZhY3RzKG5ldyBJQXJ0aWZhY3RLZXlbXSB7a2V5fSk7Ci0JCWl1LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge2NyZWF0ZVNlbGZDYXBhYmlsaXR5KGxhdW5jaGVySWQsIExBVU5DSEVSX1ZFUlNJT04pfSk7Ci0JCWl1LnNldFRvdWNocG9pbnRUeXBlKFRPVUNIUE9JTlRfTkFUSVZFKTsKLQkJcmVzdWx0YW50SVVzLmFkZElVKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXUpLCBJUHVibGlzaGVyUmVzdWx0LlJPT1QpOwotCi0JCS8vQ3JlYXRlIHRoZSBDVQotCQlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGN1ID0gbmV3IEluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGNvbmZpZ1VuaXRJZCA9IGNvbmZpZ3VyYXRpb25GbGF2b3IgKyBsYXVuY2hlcklkOwotCQljdS5zZXRJZChjb25maWdVbml0SWQpOwotCQljdS5zZXRWZXJzaW9uKExBVU5DSEVSX1ZFUlNJT04pOwotCQljdS5zZXRIb3N0KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgbGF1bmNoZXJJZCwgbmV3IFZlcnNpb25SYW5nZShMQVVOQ0hFUl9WRVJTSU9OLCB0cnVlLCB2ZXJzaW9uTWF4LCB0cnVlKSwgbnVsbCwgZmFsc2UsIGZhbHNlKX0pOwotCQljdS5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9GUkFHTUVOVCwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQljdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtjcmVhdGVTZWxmQ2FwYWJpbGl0eShjb25maWdVbml0SWQsIExBVU5DSEVSX1ZFUlNJT04pfSk7Ci0JCWN1LnNldFRvdWNocG9pbnRUeXBlKFRPVUNIUE9JTlRfTkFUSVZFKTsKLQkJTWFwIHRvdWNocG9pbnREYXRhID0gbmV3IEhhc2hNYXAoKTsKLQkJU3RyaW5nIGNvbmZpZ3VyYXRpb25EYXRhID0gInVuemlwKHNvdXJjZTpAYXJ0aWZhY3QsIHRhcmdldDoke2luc3RhbGxGb2xkZXJ9KTsiOyAvLyROT04tTkxTLTEkCi0JCUVudmlyb25tZW50SW5mbyBpbmZvID0gKEVudmlyb25tZW50SW5mbykgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEVudmlyb25tZW50SW5mby5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAoIWluZm8uZ2V0T1MoKS5lcXVhbHMob3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50cy5PU19XSU4zMikpIHsKLQkJCWlmIChpbmZvLmdldE9TKCkuZXF1YWxzKG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHMuT1NfTUFDT1NYKSkgewotCQkJCWNvbmZpZ3VyYXRpb25EYXRhICs9ICIgY2htb2QodGFyZ2V0RGlyOiR7aW5zdGFsbEZvbGRlcn0vRWNsaXBzZS5hcHAvQ29udGVudHMvTWFjT1MsIHRhcmdldEZpbGU6ZWNsaXBzZSwgcGVybWlzc2lvbnM6NzU1KTsiOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGNvbmZpZyA9IEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5jcmVhdGVDb25maWdTcGVjKG51bGwsICJtYWNvc3giLCBudWxsKTsKLQkJCQlnZW5lcmF0ZUxhdW5jaGVyU2V0dGVyKCJFY2xpcHNlIiwgbGF1bmNoZXJJZCwgTEFVTkNIRVJfVkVSU0lPTiwgY29uZmlnLCByZXN1bHRhbnRJVXMpOwotCQkJfSBlbHNlCi0JCQkJY29uZmlndXJhdGlvbkRhdGEgKz0gIiBjaG1vZCh0YXJnZXREaXI6JHtpbnN0YWxsRm9sZGVyfSwgdGFyZ2V0RmlsZToiICsgbGF1bmNoZXIuZ2V0TmFtZSgpICsgIiwgcGVybWlzc2lvbnM6NzU1KTsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyBjb25maWcgPSBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24uY3JlYXRlQ29uZmlnU3BlYyhudWxsLCAid2luMzIiLCBudWxsKTsKLQkJCWdlbmVyYXRlTGF1bmNoZXJTZXR0ZXIoImVjbGlwc2UiLCBsYXVuY2hlcklkLCBMQVVOQ0hFUl9WRVJTSU9OLCBjb25maWcsIHJlc3VsdGFudElVcyk7Ci0JCX0KLQkJdG91Y2hwb2ludERhdGEucHV0KCJpbnN0YWxsIiwgY29uZmlndXJhdGlvbkRhdGEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB1bkNvbmZpZ3VyYXRpb25EYXRhID0gImNsZWFudXB6aXAoc291cmNlOkBhcnRpZmFjdCwgdGFyZ2V0OiR7aW5zdGFsbEZvbGRlcn0pOyI7IC8vJE5PTi1OTFMtMSQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmluc3RhbGwiLCB1bkNvbmZpZ3VyYXRpb25EYXRhKTsgLy8kTk9OLU5MUy0xJAotCQljdS5hZGRUb3VjaHBvaW50RGF0YShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludERhdGEodG91Y2hwb2ludERhdGEpKTsKLQkJcmVzdWx0YW50SVVzLmFkZElVKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXRGcmFnbWVudChjdSksIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0KLQkJLy9DcmVhdGUgdGhlIGFydGlmYWN0IGRlc2NyaXB0b3IKLQkJcmV0dXJuIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRvcihrZXksIGxhdW5jaGVyKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZ2VuZXJhdGVMYXVuY2hlclNldHRlcihTdHJpbmcgbGF1bmNoZXJOYW1lLCBTdHJpbmcgaXVJZCwgVmVyc2lvbiB2ZXJzaW9uLCBTdHJpbmcgY29uZmlnU3BlYywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHQpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXVkID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgaWQgPSBpdUlkICsgJy4nICsgbGF1bmNoZXJOYW1lOwotCQlpdWQuc2V0SWQoaWQpOwotCQlpdWQuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJaXVkLnNldFRvdWNocG9pbnRUeXBlKE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLlRPVUNIUE9JTlRfT1NHSSk7Ci0JCWl1ZC5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVTZWxmQ2FwYWJpbGl0eShpZCwgdmVyc2lvbil9KTsKLQotCQlTdHJpbmcgZmlsdGVyID0gQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uLmNyZWF0ZUZpbHRlclNwZWMoY29uZmlnU3BlYyk7Ci0JCWlmIChmaWx0ZXIubGVuZ3RoKCkgPiAwKQotCQkJaXVkLnNldEZpbHRlcihmaWx0ZXIpOwotCQlNYXAgdG91Y2hwb2ludERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQl0b3VjaHBvaW50RGF0YS5wdXQoImNvbmZpZ3VyZSIsICJzZXRMYXVuY2hlck5hbWUobmFtZToiICsgbGF1bmNoZXJOYW1lICsgIikiKTsKLQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmNvbmZpZ3VyZSIsICJzZXRMYXVuY2hlck5hbWUoKSIpOwotCQlpdWQuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCXJlc3VsdC5hZGRJVShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGl1ZCksIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm92aWRlZENhcGFiaWxpdHkgY3JlYXRlU2VsZkNhcGFiaWxpdHkoU3RyaW5nIGluc3RhbGxhYmxlVW5pdElkLCBWZXJzaW9uIGluc3RhbGxhYmxlVW5pdFZlcnNpb24pIHsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoSVVfTkFNRVNQQUNFLCBpbnN0YWxsYWJsZVVuaXRJZCwgaW5zdGFsbGFibGVVbml0VmVyc2lvbik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZVVuY29uZmlnU2NyaXB0KEdlbmVyYXRvckJ1bmRsZUluZm8gdW5jb25maWdJbmZvLCBib29sZWFuIGlzQnVuZGxlRnJhZ21lbnQpIHsKLQkJaWYgKHVuY29uZmlnSW5mbyA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB1bmNvbmZpZ1NjcmlwdCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKCFpc0J1bmRsZUZyYWdtZW50ICYmIHVuY29uZmlnSW5mby5nZXRTdGFydExldmVsKCkgIT0gQnVuZGxlSW5mby5OT19MRVZFTCkgewotCQkJdW5jb25maWdTY3JpcHQgKz0gInNldFN0YXJ0TGV2ZWwoc3RhcnRMZXZlbDoiICsgQnVuZGxlSW5mby5OT19MRVZFTCArICIpOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmICghaXNCdW5kbGVGcmFnbWVudCAmJiB1bmNvbmZpZ0luZm8uaXNNYXJrZWRBc1N0YXJ0ZWQoKSkgewotCQkJdW5jb25maWdTY3JpcHQgKz0gIm1hcmtTdGFydGVkKHN0YXJ0ZWQ6IGZhbHNlKTsiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAodW5jb25maWdJbmZvLmdldFNwZWNpYWxVbmNvbmZpZ0NvbW1hbmRzKCkgIT0gbnVsbCkgewotCQkJdW5jb25maWdTY3JpcHQgKz0gdW5jb25maWdJbmZvLmdldFNwZWNpYWxVbmNvbmZpZ0NvbW1hbmRzKCk7Ci0JCX0KLQkJcmV0dXJuIHVuY29uZmlnU2NyaXB0OwotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvdmlkZWRDYXBhYmlsaXR5W10gZ2VuZXJhdGVKUkVDYXBhYmlsaXR5KFN0cmluZyBpbnN0YWxsYWJsZVVuaXRJZCwgVmVyc2lvbiBpbnN0YWxsYWJsZVVuaXRWZXJzaW9uLCBJbnB1dFN0cmVhbSBwcm9maWxlU3RyZWFtKSB7Ci0JCWlmIChwcm9maWxlU3RyZWFtID09IG51bGwpIHsKLQkJCS8vdXNlIHRoZSAxLjYgcHJvZmlsZSBzdG9yZWQgaW4gdGhlIGdlbmVyYXRvciBidW5kbGUKLQkJCXRyeSB7Ci0JCQkJcHJvZmlsZVN0cmVhbSA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi9wcm9maWxlcy9KYXZhU0UtMS42LnByb2ZpbGUiKS5vcGVuU3RyZWFtKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwotCQl0cnkgewotCQkJcC5sb2FkKHByb2ZpbGVTdHJlYW0pOwotCQkJTWFuaWZlc3RFbGVtZW50W10ganJlUGFja2FnZXMgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VIZWFkZXIoIm9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMiLCAoU3RyaW5nKSBwLmdldCgib3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlQcm92aWRlZENhcGFiaWxpdHlbXSBleHBvcnRlZFBhY2thZ2VBc0NhcGFiaWxpdGllcyA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbanJlUGFja2FnZXMubGVuZ3RoICsgMV07Ci0JCQlleHBvcnRlZFBhY2thZ2VBc0NhcGFiaWxpdGllc1swXSA9IGNyZWF0ZVNlbGZDYXBhYmlsaXR5KGluc3RhbGxhYmxlVW5pdElkLCBpbnN0YWxsYWJsZVVuaXRWZXJzaW9uKTsKLQkJCWZvciAoaW50IGkgPSAxOyBpIDw9IGpyZVBhY2thZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJZXhwb3J0ZWRQYWNrYWdlQXNDYXBhYmlsaXRpZXNbaV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KENBUEFCSUxJVFlfTlNfSkFWQV9QQUNLQUdFLCBqcmVQYWNrYWdlc1tpIC0gMV0uZ2V0VmFsdWUoKSwgbnVsbCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZXhwb3J0ZWRQYWNrYWdlQXNDYXBhYmlsaXRpZXM7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHByb2ZpbGVTdHJlYW0gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCXByb2ZpbGVTdHJlYW0uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vaWdub3JlIHNlY29uZGFyeSBmYWlsdXJlCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5WzBdOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2VuZXJhdGVKUkVJVURhdGEoSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUsIFN0cmluZyBpbnN0YWxsYWJsZVVuaXRJZCwgVmVyc2lvbiBpbnN0YWxsYWJsZVVuaXRWZXJzaW9uLCBGaWxlIGpyZUxvY2F0aW9uKSB7Ci0JCS8vTG9vayBmb3IgYSBKUkUgcHJvZmlsZSBmaWxlIHRvIHNldCB2ZXJzaW9uIGFuZCBjYXBhYmlsaXRpZXMKLQkJRmlsZVtdIHByb2ZpbGVzID0ganJlTG9jYXRpb24ubGlzdEZpbGVzKG5ldyBGaWxlRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgcGF0aG5hbWUpIHsKLQkJCQlyZXR1cm4gcGF0aG5hbWUuZ2V0QWJzb2x1dGVQYXRoKCkuZW5kc1dpdGgoIi5wcm9maWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSk7Ci0JCWlmIChwcm9maWxlcy5sZW5ndGggIT0gMSkgewotCQkJaXUuc2V0VmVyc2lvbihERUZBVUxUX0pSRV9WRVJTSU9OKTsKLQkJCWl1LnNldENhcGFiaWxpdGllcyhnZW5lcmF0ZUpSRUNhcGFiaWxpdHkoaW5zdGFsbGFibGVVbml0SWQsIGluc3RhbGxhYmxlVW5pdFZlcnNpb24sIG51bGwpKTsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmcgcHJvZmlsZU5hbWUgPSBwcm9maWxlc1swXS5nZXRBYnNvbHV0ZVBhdGgoKS5zdWJzdHJpbmcocHJvZmlsZXNbMF0uZ2V0QWJzb2x1dGVQYXRoKCkubGFzdEluZGV4T2YoJy8nKSk7Ci0JCVZlcnNpb24gdmVyc2lvbiA9IERFRkFVTFRfSlJFX1ZFUlNJT047Ci0JCS8vVE9ETyBGaW5kIGEgYmV0dGVyIHdheSB0byBkZXRlcm1pbmUgSlJFIHZlcnNpb24KLQkJaWYgKHByb2ZpbGVOYW1lLmluZGV4T2YoIjEuNiIpID4gMCkgeyAvLyROT04tTkxTLTEkCi0JCQl2ZXJzaW9uID0gbmV3IFZlcnNpb24oIjEuNiIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocHJvZmlsZU5hbWUuaW5kZXhPZigiMS41IikgPiAwKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZlcnNpb24gPSBuZXcgVmVyc2lvbigiMS41Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmIChwcm9maWxlTmFtZS5pbmRleE9mKCIxLjQiKSA+IDApIHsgLy8kTk9OLU5MUy0xJAotCQkJdmVyc2lvbiA9IG5ldyBWZXJzaW9uKCIxLjQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWl1LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCXRyeSB7Ci0JCQlpdS5zZXRDYXBhYmlsaXRpZXMoZ2VuZXJhdGVKUkVDYXBhYmlsaXR5KGluc3RhbGxhYmxlVW5pdElkLCBpbnN0YWxsYWJsZVVuaXRWZXJzaW9uLCBuZXcgRmlsZUlucHV0U3RyZWFtKHByb2ZpbGVzWzBdKSkpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy9TaG91bGRuJ3QgaGFwcGVuLCBidXQgaWdub3JlIGFuZCBmYWxsIHRocm91Z2ggdG8gdXNlIGRlZmF1bHQKLQkJfQotCX0KLQotCS8vICBtb3ZlZCB0byBGZWF0dXJlQWN0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RmlsdGVyKEZlYXR1cmVFbnRyeSBlbnRyeSkgewotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlyZXN1bHQuYXBwZW5kKCIoJiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChlbnRyeS5nZXRGaWx0ZXIoKSAhPSBudWxsKQotCQkJcmVzdWx0LmFwcGVuZChlbnRyeS5nZXRGaWx0ZXIoKSk7Ci0JCWlmIChlbnRyeS5nZXRPUygpICE9IG51bGwpCi0JCQlyZXN1bHQuYXBwZW5kKCIob3NnaS5vcz0iICsgZW50cnkuZ2V0T1MoKSArICcpJyk7Ly8kTk9OLU5MUy0xJAotCQlpZiAoZW50cnkuZ2V0V1MoKSAhPSBudWxsKQotCQkJcmVzdWx0LmFwcGVuZCgiKG9zZ2kud3M9IiArIGVudHJ5LmdldFdTKCkgKyAnKScpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGVudHJ5LmdldEFyY2goKSAhPSBudWxsKQotCQkJcmVzdWx0LmFwcGVuZCgiKG9zZ2kuYXJjaD0iICsgZW50cnkuZ2V0QXJjaCgpICsgJyknKTsvLyROT04tTkxTLTEkCi0JCWlmIChlbnRyeS5nZXROTCgpICE9IG51bGwpCi0JCQlyZXN1bHQuYXBwZW5kKCIob3NnaS5ubD0iICsgZW50cnkuZ2V0TkwoKSArICcpJyk7Ly8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0Lmxlbmd0aCgpID09IDIpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLy8gbW92ZWQgdG8gRmVhdHVyZUFjdGlvbgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRyYW5zZm9ybWVkSWQoU3RyaW5nIG9yaWdpbmFsLCBib29sZWFuIGlzUGx1Z2luLCBib29sZWFuIGlzR3JvdXApIHsKLQkJcmV0dXJuIChpc1BsdWdpbiA/IG9yaWdpbmFsIDogb3JpZ2luYWwgKyAoaXNHcm91cCA/ICIuZmVhdHVyZS5ncm91cCIgOiAiLmZlYXR1cmUuamFyIikpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCX0KLQotCS8vIG1vdmVkIHRvIEZlYXR1cmVBY3Rpb24KLQlwdWJsaWMgc3RhdGljIFZlcnNpb25SYW5nZSBnZXRWZXJzaW9uUmFuZ2UoRmVhdHVyZUVudHJ5IGVudHJ5KSB7Ci0JCVN0cmluZyB2ZXJzaW9uU3BlYyA9IGVudHJ5LmdldFZlcnNpb24oKTsKLQkJaWYgKHZlcnNpb25TcGVjID09IG51bGwpCi0JCQkvLyBUT0RPIHNob3VsZCByZWFsbHkgYmUgcmV0dXJuaW5nIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlIGhlcmUuLi4KLQkJCXJldHVybiBudWxsOwotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbih2ZXJzaW9uU3BlYyk7Ci0JCWlmICghZW50cnkuaXNSZXF1aXJlcygpKSB7Ci0JCQlpZiAoIjAuMC4wIi5lcXVhbHMoZW50cnkuZ2V0VmVyc2lvbigpKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZTsKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIHZlcnNpb24sIHRydWUpOwotCQl9Ci0JCVN0cmluZyBtYXRjaCA9IGVudHJ5LmdldE1hdGNoKCk7Ci0JCWlmIChtYXRjaCA9PSBudWxsKQotCQkJLy8gVE9ETyBzaG91bGQgcmVhbGx5IGJlIHJldHVybmluZyBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSBoZXJlLi4uCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG1hdGNoLmVxdWFscygicGVyZmVjdCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCB2ZXJzaW9uLCB0cnVlKTsKLQkJaWYgKG1hdGNoLmVxdWFscygiZXF1aXZhbGVudCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVZlcnNpb24gdXBwZXIgPSBuZXcgVmVyc2lvbih2ZXJzaW9uLmdldE1ham9yKCksIHZlcnNpb24uZ2V0TWlub3IoKSArIDEsIDApOwotCQkJcmV0dXJuIG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgdXBwZXIsIGZhbHNlKTsKLQkJfQotCQlpZiAobWF0Y2guZXF1YWxzKCJjb21wYXRpYmxlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJVmVyc2lvbiB1cHBlciA9IG5ldyBWZXJzaW9uKHZlcnNpb24uZ2V0TWFqb3IoKSArIDEsIDAsIDApOwotCQkJcmV0dXJuIG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgdXBwZXIsIGZhbHNlKTsKLQkJfQotCQlpZiAobWF0Y2guZXF1YWxzKCJncmVhdGVyT3JFcXVhbCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCBuZXcgVmVyc2lvblJhbmdlKG51bGwpLmdldE1heGltdW0oKSwgdHJ1ZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNPcHRpb25hbChJbXBvcnRQYWNrYWdlU3BlY2lmaWNhdGlvbiBpbXBvcnRlZFBhY2thZ2UpIHsKLQkJaWYgKGltcG9ydGVkUGFja2FnZS5nZXREaXJlY3RpdmUoQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFKS5lcXVhbHMoSW1wb3J0UGFja2FnZVNwZWNpZmljYXRpb24uUkVTT0xVVElPTl9EWU5BTUlDKSB8fCBpbXBvcnRlZFBhY2thZ2UuZ2V0RGlyZWN0aXZlKENvbnN0YW50cy5SRVNPTFVUSU9OX0RJUkVDVElWRSkuZXF1YWxzKEltcG9ydFBhY2thZ2VTcGVjaWZpY2F0aW9uLlJFU09MVVRJT05fT1BUSU9OQUwpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9NYW5pZmVzdFN0cmluZyhNYXAgcCkgewotCQlpZiAocCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbGxlY3Rpb24gcHJvcGVydGllcyA9IHAuZW50cnlTZXQoKTsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByb3BlcnRpZXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJTWFwLkVudHJ5IGFQcm9wZXJ0eSA9IChNYXAuRW50cnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChhUHJvcGVydHkuZ2V0S2V5KCkuZXF1YWxzKEJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeS5CVU5ETEVfU0hBUEUpKQotCQkJCWNvbnRpbnVlOwotCQkJcmVzdWx0LmFwcGVuZChhUHJvcGVydHkuZ2V0S2V5KCkpLmFwcGVuZCgiOiAiKS5hcHBlbmQoYVByb3BlcnR5LmdldFZhbHVlKCkpLmFwcGVuZCgnXG4nKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyBSZXR1cm4gYSBtYXAgZnJvbSBsb2NhbGUgdG8gcHJvcGVydHkgc2V0IGZvciB0aGUgbWFuaWZlc3QgbG9jYWxpemF0aW9ucwotCS8vIGZyb20gdGhlIGdpdmVuIGJ1bmRsZSBkaXJlY3RvcnkgYW5kIGdpdmVuIGJ1bmRsZSBsb2NhbGl6YXRpb24gcGF0aC9uYW1lCi0JLy8gbWFuaWZlc3QgcHJvcGVydHkgdmFsdWUuCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGdldE1hbmlmZXN0TG9jYWxpemF0aW9ucyhNYXAgbWFuaWZlc3QsIEZpbGUgYnVuZGxlTG9jYXRpb24pIHsKLQkJTWFwIGxvY2FsaXphdGlvbnM7Ci0JCUxvY2FsZSBkZWZhdWx0TG9jYWxlID0gbnVsbDsgLy8gPSBMb2NhbGUuRU5HTElTSDsgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBHZW5lcmF0b3JJbmZvCi0JCVN0cmluZ1tdIGJ1bmRsZU1hbmlmZXN0VmFsdWVzID0gZ2V0TWFuaWZlc3RDYWNoZWRWYWx1ZXMobWFuaWZlc3QpOwotCQlTdHJpbmcgYnVuZGxlTG9jYWxpemF0aW9uID0gYnVuZGxlTWFuaWZlc3RWYWx1ZXNbQlVORExFX0xPQ0FMSVpBVElPTl9JTkRFWF07Ci0KLQkJaWYgKCJqYXIiLmVxdWFsc0lnbm9yZUNhc2UobmV3IFBhdGgoYnVuZGxlTG9jYXRpb24uZ2V0TmFtZSgpKS5nZXRGaWxlRXh0ZW5zaW9uKCkpICYmIC8vJE5PTi1OTFMtMSQKLQkJCQlidW5kbGVMb2NhdGlvbi5pc0ZpbGUoKSkgewotCQkJbG9jYWxpemF0aW9ucyA9IGdldEphck1hbmlmZXN0TG9jYWxpemF0aW9uKGJ1bmRsZUxvY2F0aW9uLCBidW5kbGVMb2NhbGl6YXRpb24sIGRlZmF1bHRMb2NhbGUsIGJ1bmRsZU1hbmlmZXN0VmFsdWVzKTsKLQkJfSBlbHNlIHsKLQkJCWxvY2FsaXphdGlvbnMgPSBnZXREaXJNYW5pZmVzdExvY2FsaXphdGlvbihidW5kbGVMb2NhdGlvbiwgYnVuZGxlTG9jYWxpemF0aW9uLCBkZWZhdWx0TG9jYWxlLCBidW5kbGVNYW5pZmVzdFZhbHVlcyk7Ci0JCX0KLQotCQlyZXR1cm4gbG9jYWxpemF0aW9uczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldE1hbmlmZXN0Q2FjaGVkVmFsdWVzKE1hcCBtYW5pZmVzdCkgewotCQlTdHJpbmdbXSBjYWNoZWRWYWx1ZXMgPSBuZXcgU3RyaW5nW0JVTkRMRV9MT0NBTElaRURfUFJPUEVSVElFUy5sZW5ndGggKyAxXTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5CVU5ETEVfTE9DQUxJWkVEX1BST1BFUlRJRVMubGVuZ3RoOyBqKyspIHsKLQkJCVN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIG1hbmlmZXN0LmdldChCVU5ETEVfTE9DQUxJWkVEX1BST1BFUlRJRVNbal0pOwotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAxICYmIHZhbHVlLmNoYXJBdCgwKSA9PSAnJScpIHsKLQkJCQljYWNoZWRWYWx1ZXNbal0gPSB2YWx1ZS5zdWJzdHJpbmcoMSk7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIGxvY2FsaXphdGlvbkZpbGUgPSAoU3RyaW5nKSBtYW5pZmVzdC5nZXQob3JnLm9zZ2kuZnJhbWV3b3JrLkNvbnN0YW50cy5CVU5ETEVfTE9DQUxJWkFUSU9OKTsKLQkJY2FjaGVkVmFsdWVzW0JVTkRMRV9MT0NBTElaQVRJT05fSU5ERVhdID0gKGxvY2FsaXphdGlvbkZpbGUgIT0gbnVsbCA/IGxvY2FsaXphdGlvbkZpbGUgOiBERUZBVUxUX0JVTkRMRV9MT0NBTElaQVRJT04pOwotCQlyZXR1cm4gY2FjaGVkVmFsdWVzOwotCX0KLQotCS8vIFJldHVybiBhIG1hcCBmcm9tIGxvY2FsZSB0byBwcm9wZXJ0eSBzZXQgZm9yIHRoZSBtYW5pZmVzdCBsb2NhbGl6YXRpb25zCi0JLy8gZnJvbSB0aGUgZ2l2ZW4gYnVuZGxlIGRpcmVjdG9yeSBhbmQgZ2l2ZW4gYnVuZGxlIGxvY2FsaXphdGlvbiBwYXRoL25hbWUKLQkvLyBtYW5pZmVzdCBwcm9wZXJ0eSB2YWx1ZS4KLQlwdWJsaWMgc3RhdGljIE1hcCBnZXRIb3N0TG9jYWxpemF0aW9ucyhGaWxlIGJ1bmRsZUxvY2F0aW9uLCBTdHJpbmdbXSBob3N0QnVuZGxlTWFuaWZlc3RWYWx1ZXMpIHsKLQkJTWFwIGxvY2FsaXphdGlvbnM7Ci0JCUxvY2FsZSBkZWZhdWx0TG9jYWxlID0gbnVsbDsgLy8gPSBMb2NhbGUuRU5HTElTSDsgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBHZW5lcmF0b3JJbmZvCi0JCVN0cmluZyBob3N0QnVuZGxlTG9jYWxpemF0aW9uID0gaG9zdEJ1bmRsZU1hbmlmZXN0VmFsdWVzW0JVTkRMRV9MT0NBTElaQVRJT05fSU5ERVhdOwotCi0JCWlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKG5ldyBQYXRoKGJ1bmRsZUxvY2F0aW9uLmdldE5hbWUoKSkuZ2V0RmlsZUV4dGVuc2lvbigpKSAmJiAvLyROT04tTkxTLTEkCi0JCQkJYnVuZGxlTG9jYXRpb24uaXNGaWxlKCkpIHsKLQkJCWxvY2FsaXphdGlvbnMgPSBnZXRKYXJNYW5pZmVzdExvY2FsaXphdGlvbihidW5kbGVMb2NhdGlvbiwgaG9zdEJ1bmRsZUxvY2FsaXphdGlvbiwgZGVmYXVsdExvY2FsZSwgaG9zdEJ1bmRsZU1hbmlmZXN0VmFsdWVzKTsKLQkJfSBlbHNlIHsKLQkJCWxvY2FsaXphdGlvbnMgPSBnZXREaXJNYW5pZmVzdExvY2FsaXphdGlvbihidW5kbGVMb2NhdGlvbiwgaG9zdEJ1bmRsZUxvY2FsaXphdGlvbiwgZGVmYXVsdExvY2FsZSwgaG9zdEJ1bmRsZU1hbmlmZXN0VmFsdWVzKTsKLQkJfQotCi0JCXJldHVybiBsb2NhbGl6YXRpb25zOwotCX0KLQotCXByaXZhdGUgc3RhdGljIE1hcCBnZXRKYXJNYW5pZmVzdExvY2FsaXphdGlvbihGaWxlIGJ1bmRsZUxvY2F0aW9uLCBTdHJpbmcgYnVuZGxlTG9jYWxpemF0aW9uLCBMb2NhbGUgZGVmYXVsdExvY2FsZSwgU3RyaW5nW10gYnVuZGxlTWFuaWZlc3RWYWx1ZXMpIHsKLQkJWmlwRmlsZSBqYXJGaWxlID0gbnVsbDsKLQkJTWFwIGxvY2FsaXphdGlvbnMgPSBuZXcgSGFzaE1hcCg0KTsKLQkJdHJ5IHsKLQkJCWphckZpbGUgPSBuZXcgWmlwRmlsZShidW5kbGVMb2NhdGlvbiwgWmlwRmlsZS5PUEVOX1JFQUQpOwotCQkJZm9yIChFbnVtZXJhdGlvbiBlbnRyaWVzID0gamFyRmlsZS5lbnRyaWVzKCk7IGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJWmlwRW50cnkgbmV4dEVudHJ5ID0gKFppcEVudHJ5KSBlbnRyaWVzLm5leHRFbGVtZW50KCk7Ci0JCQkJU3RyaW5nIG5leHROYW1lID0gbmV4dEVudHJ5LmdldE5hbWUoKTsKLQkJCQlTdHJpbmcgbG9jYWxlU3RyaW5nID0gZ2V0TG9jYWxlU3RyaW5nKG5leHROYW1lLCBidW5kbGVMb2NhbGl6YXRpb24pOwotCi0JCQkJaWYgKCFuZXh0RW50cnkuaXNEaXJlY3RvcnkoKSAmJiBsb2NhbGVTdHJpbmcgIT0gbnVsbCkgewotCQkJCQlMb2NhbGUgbmV4dExvY2FsZSA9IGdldExvY2FsZShsb2NhbGVTdHJpbmcpOwotCQkJCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCQkJCQl0cnkgewotCQkJCQkJc3RyZWFtID0gamFyRmlsZS5nZXRJbnB1dFN0cmVhbShuZXh0RW50cnkpOwotCQkJCQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQkJCXByb3BlcnRpZXMubG9hZChzdHJlYW0pOwotCQkJCQkJUHJvcGVydGllcyBsb2NhbGl6ZWRTdHJpbmdzID0gZ2V0TG9jYWxpemVkUHJvcGVydGllcyhidW5kbGVNYW5pZmVzdFZhbHVlcywgcHJvcGVydGllcyk7Ci0JCQkJCQlpZiAobG9jYWxpemVkU3RyaW5ncy5zaXplKCkgPiAwKSB7Ci0JCQkJCQkJbG9jYWxpemF0aW9ucy5wdXQobmV4dExvY2FsZSwgbG9jYWxpemVkU3RyaW5ncyk7Ci0JCQkJCQkJaWYgKERFRkFVTFRfTE9DQUxFLmVxdWFscyhuZXh0TG9jYWxlKSAmJiBkZWZhdWx0TG9jYWxlICE9IG51bGwpIHsKLQkJCQkJCQkJbG9jYWxpemF0aW9ucy5wdXQobmV4dExvY2FsZSwgbG9jYWxpemVkU3RyaW5ncyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJaWYgKHN0cmVhbSAhPSBudWxsKQotCQkJCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCWlvZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChqYXJGaWxlICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlqYXJGaWxlLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbG9jYWxpemF0aW9uczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgZ2V0RGlyTWFuaWZlc3RMb2NhbGl6YXRpb24oRmlsZSBidW5kbGVMb2NhdGlvbiwgU3RyaW5nIGJ1bmRsZUxvY2FsaXphdGlvbiwgTG9jYWxlIGRlZmF1bHRMb2NhbGUsIFN0cmluZ1tdIGhvc3RCdW5kbGVNYW5pZmVzdFZhbHVlcykgewotCQlGaWxlIGxvY2FsaXphdGlvblBhdGggPSBuZXcgRmlsZShidW5kbGVMb2NhdGlvbiwgYnVuZGxlTG9jYWxpemF0aW9uKTsKLQkJRmlsZSBsb2NhbGl6YXRpb25EaXIgPSBsb2NhbGl6YXRpb25QYXRoLmdldFBhcmVudEZpbGUoKTsKLQkJZmluYWwgU3RyaW5nIGxvY2FsaXphdGlvbkZpbGUgPSBsb2NhbGl6YXRpb25QYXRoLmdldE5hbWUoKTsKLQkJTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIgZm9vID0gbmV3IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyKCk7Ci0JCVN0cmluZ1tdIGxvY2FsaXphdGlvbkZpbGVzID0gbG9jYWxpemF0aW9uRGlyLmxpc3QoZm9vLm5ldyBMb2NhbGl6YXRpb25GaWxlRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyZWN0b3J5LCBTdHJpbmcgZmlsZW5hbWUpIHsKLQkJCQlyZXR1cm4gKGdldExvY2FsZVN0cmluZyhmaWxlbmFtZSwgbG9jYWxpemF0aW9uRmlsZSkgIT0gbnVsbCA/IHRydWUgOiBmYWxzZSk7Ci0JCQl9Ci0JCX0pOwotCi0JCUhhc2hNYXAgbG9jYWxpemF0aW9ucyA9IG51bGw7Ci0KLQkJaWYgKGxvY2FsaXphdGlvbkZpbGVzICE9IG51bGwpIHsKLQkJCWxvY2FsaXphdGlvbnMgPSBuZXcgSGFzaE1hcChsb2NhbGl6YXRpb25GaWxlcy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbGl6YXRpb25GaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuZXh0RmlsZSA9IGxvY2FsaXphdGlvbkZpbGVzW2ldOwotCQkJCUxvY2FsZSBuZXh0TG9jYWxlID0gZ2V0TG9jYWxlKGdldExvY2FsZVN0cmluZyhuZXh0RmlsZSwgbG9jYWxpemF0aW9uRmlsZSkpOwotCi0JCQkJdHJ5IHsKLQkJCQkJUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbG9hZFByb3BlcnRpZXMoYnVuZGxlTG9jYXRpb24sIG5leHRGaWxlKTsKLQkJCQkJUHJvcGVydGllcyBsb2NhbGl6ZWRTdHJpbmdzID0gZ2V0TG9jYWxpemVkUHJvcGVydGllcyhob3N0QnVuZGxlTWFuaWZlc3RWYWx1ZXMsIHByb3BlcnRpZXMpOwotCQkJCQlpZiAobG9jYWxpemVkU3RyaW5ncy5zaXplKCkgPiAwKSB7Ci0JCQkJCQlsb2NhbGl6YXRpb25zLnB1dChuZXh0TG9jYWxlLCBsb2NhbGl6ZWRTdHJpbmdzKTsKLQkJCQkJCWlmIChERUZBVUxUX0xPQ0FMRS5lcXVhbHMobmV4dExvY2FsZSkgJiYgZGVmYXVsdExvY2FsZSAhPSBudWxsKSB7Ci0JCQkJCQkJbG9jYWxpemF0aW9ucy5wdXQobmV4dExvY2FsZSwgbG9jYWxpemVkU3RyaW5ncyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJaW9lLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBsb2NhbGl6YXRpb25zOwotCX0KLQotCXByaXZhdGUgYWJzdHJhY3QgY2xhc3MgTG9jYWxpemF0aW9uRmlsZUZpbHRlciBpbXBsZW1lbnRzIEZpbGVuYW1lRmlsdGVyIHsKLQotCQlwdWJsaWMgTG9jYWxpemF0aW9uRmlsZUZpbHRlcigpIHsKLQkJCS8vIE5vdGhpbmcgdG8gZG8KLQkJfQotCi0JCS8qIChub24tSmF2YWRvYykKLQkJICogQHNlZSBqYXZhLmlvLkZpbGVuYW1lRmlsdGVyI2FjY2VwdChqYXZhLmlvLkZpbGUsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXJlY3RvcnksIFN0cmluZyBmaWxlbmFtZSk7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxlU3RyaW5nKFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIGZpbGVuYW1lUHJlZml4KSB7Ci0JCVN0cmluZyBsb2NhbGVTdHJpbmcgPSBudWxsOwotCQlpZiAoZmlsZW5hbWUuc3RhcnRzV2l0aChmaWxlbmFtZVByZWZpeCkgJiYgZmlsZW5hbWUuZW5kc1dpdGgoUFJPUEVSVElFU19GSUxFX0VYVEVOU0lPTikpIHsKLQkJCWlmIChmaWxlbmFtZS5sZW5ndGgoKSA+IGZpbGVuYW1lUHJlZml4Lmxlbmd0aCgpICsgUFJPUEVSVElFU19GSUxFX0VYVEVOU0lPTi5sZW5ndGgoKSkgewotCQkJCWxvY2FsZVN0cmluZyA9IGZpbGVuYW1lLnN1YnN0cmluZyhmaWxlbmFtZVByZWZpeC5sZW5ndGgoKSArIDEsIGZpbGVuYW1lLmxlbmd0aCgpIC0gUFJPUEVSVElFU19GSUxFX0VYVEVOU0lPTi5sZW5ndGgoKSk7Ci0JCQl9IGVsc2UgewotCQkJCWxvY2FsZVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxvY2FsZVN0cmluZzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIGxvYWRQcm9wZXJ0aWVzKEZpbGUgYnVuZGxlTG9jYXRpb24sIFN0cmluZyBsb2NhbGl6YXRpb25GaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm9wZXJ0aWVzIHJlc3VsdCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCUlucHV0U3RyZWFtIHByb3BlcnR5U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGJ1bmRsZUxvY2F0aW9uLmlzRGlyZWN0b3J5KCkpCi0JCQkJCXByb3BlcnR5U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShidW5kbGVMb2NhdGlvbiwgbG9jYWxpemF0aW9uRmlsZSkpOwotCQkJCWVsc2UgewotCQkJCQlVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBuZXcgVVJMKCJqYXI6IiArIGJ1bmRsZUxvY2F0aW9uLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSArICIhLyIgKyBsb2NhbGl6YXRpb25GaWxlKS5vcGVuQ29ubmVjdGlvbigpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJY29ubmVjdGlvbi5zZXRVc2VDYWNoZXMoZmFsc2UpOwotCQkJCQlwcm9wZXJ0eVN0cmVhbSA9IGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIHRoZXJlIGlzIG5vIG1lc3NhZ2VzIGZpbGUgdGhlbiBqdXN0IHJldHVybjsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQkJcmVzdWx0LmxvYWQocHJvcGVydHlTdHJlYW0pOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKHByb3BlcnR5U3RyZWFtICE9IG51bGwpCi0JCQkJcHJvcGVydHlTdHJlYW0uY2xvc2UoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwcml2YXRlIExvY2FsZSBnZXRMb2NhbGUoU3RyaW5nIGxvY2FsZVN0cmluZykgewotCQlMb2NhbGUgbG9jYWxlID0gREVGQVVMVF9MT0NBTEU7Ci0JCWlmIChsb2NhbGVTdHJpbmcubGVuZ3RoKCkgPT0gNSAmJiBsb2NhbGVTdHJpbmcuaW5kZXhPZignXycpID09IDIpIHsKLQkJCWxvY2FsZSA9IG5ldyBMb2NhbGUobG9jYWxlU3RyaW5nLnN1YnN0cmluZygwLCAyKSwgbG9jYWxlU3RyaW5nLnN1YnN0cmluZygzLCA1KSk7Ci0JCX0gZWxzZSBpZiAobG9jYWxlU3RyaW5nLmxlbmd0aCgpID09IDIpIHsKLQkJCWxvY2FsZSA9IG5ldyBMb2NhbGUobG9jYWxlU3RyaW5nLnN1YnN0cmluZygwLCAyKSk7Ci0JCX0KLQkJcmV0dXJuIGxvY2FsZTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBQcm9wZXJ0aWVzIGdldExvY2FsaXplZFByb3BlcnRpZXMoU3RyaW5nW10gYnVuZGxlTWFuaWZlc3RLZXlzLCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJUHJvcGVydGllcyBsb2NhbGl6ZWRQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBCVU5ETEVfTE9DQUxJWkVEX1BST1BFUlRJRVMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBrZXkgPSBidW5kbGVNYW5pZmVzdEtleXNbaV07Ci0JCQlpZiAoa2V5ICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbG9jYWxpemVkVmFsdWUgPSBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KGtleSk7Ci0JCQkJaWYgKGxvY2FsaXplZFZhbHVlICE9IG51bGwpCi0JCQkJCWxvY2FsaXplZFByb3BlcnRpZXMucHV0KGtleSwgbG9jYWxpemVkVmFsdWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsb2NhbGl6ZWRQcm9wZXJ0aWVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgT2JqZWN0W10gY3JlYXRlRmVhdHVyZVJvb3RGaWxlSVUoU3RyaW5nIGZlYXR1cmVJZCwgU3RyaW5nIGZlYXR1cmVWZXJzaW9uLCBGaWxlIGxvY2F0aW9uLCBGaWxlU2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlpdS5zZXRTaW5nbGV0b24odHJ1ZSk7Ci0JCVN0cmluZyBpZCA9IGZlYXR1cmVJZCArICdfJyArIGRlc2NyaXB0b3IuZ2V0S2V5KCk7Ci0JCWl1LnNldElkKGlkKTsKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24oZmVhdHVyZVZlcnNpb24pOwotCQlpdS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQlpdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtjcmVhdGVTZWxmQ2FwYWJpbGl0eShpZCwgdmVyc2lvbil9KTsKLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoVE9VQ0hQT0lOVF9OQVRJVkUpOwotCQlTdHJpbmcgY29uZmlnU3BlYyA9IGRlc2NyaXB0b3IuZ2V0Q29uZmlnU3BlYygpOwotCQlpZiAoY29uZmlnU3BlYyAhPSBudWxsKQotCQkJaXUuc2V0RmlsdGVyKEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5jcmVhdGVGaWx0ZXJTcGVjKGNvbmZpZ1NwZWMpKTsKLQkJRmlsZVtdIGZpbGVSZXN1bHQgPSBhdHRhY2hGaWxlcyhpdSwgZGVzY3JpcHRvciwgbG9jYXRpb24pOwotCQlzZXR1cExpbmtzKGl1LCBkZXNjcmlwdG9yKTsKLQkJc2V0dXBQZXJtaXNzaW9ucyhpdSwgZGVzY3JpcHRvcik7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCBpdVJlc3VsdCA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXUpOwotCQkvLyBuZWVkIHRvIHJldHVybiBib3RoIHRoZSBpdSBhbmQgYW55IGZpbGVzLgotCQlyZXR1cm4gbmV3IE9iamVjdFtdIHtpdVJlc3VsdCwgZmlsZVJlc3VsdH07Ci0JfQotCi0JLy8gYXR0YWNoIHRoZSBkZXNjcmliZWQgZmlsZXMgZnJvbSB0aGUgZ2l2ZW4gbG9jYXRpb24gdG8gdGhlIGdpdmVuIGl1IGRlc2NyaXB0aW9uLiAgUmV0dXJuCi0JLy8gdGhlIGxpc3Qgb2YgZmlsZXMgaWRlbnRpZmllZC4KLQlwcml2YXRlIHN0YXRpYyBGaWxlW10gYXR0YWNoRmlsZXMoSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUsIEZpbGVTZXREZXNjcmlwdG9yIGRlc2NyaXB0b3IsIEZpbGUgbG9jYXRpb24pIHsKLQkJU3RyaW5nIGZpbGVMaXN0ID0gZGVzY3JpcHRvci5nZXRGaWxlcygpOwotCQlTdHJpbmdbXSBmaWxlU3BlY3MgPSBnZXRBcnJheUZyb21TdHJpbmcoZmlsZUxpc3QsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZVtdIGZpbGVzID0gbmV3IEZpbGVbZmlsZVNwZWNzLmxlbmd0aF07Ci0JCWlmIChmaWxlU3BlY3MubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlU3BlY3MubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgc3BlYyA9IGZpbGVTcGVjc1tpXTsKLQkJCQlpZiAoc3BlYy5zdGFydHNXaXRoKCJmaWxlOiIpKQotCQkJCQlzcGVjID0gc3BlYy5zdWJzdHJpbmcoNSk7Ci0JCQkJZmlsZXNbaV0gPSBuZXcgRmlsZShsb2NhdGlvbiwgc3BlYyk7Ci0JCQl9Ci0JCX0KLQkJLy8gYWRkIHRvdWNocG9pbnQgYWN0aW9ucyB0byB1bnppcCBhbmQgY2xlYW51cCBhcyBuZWVkZWQKLQkJLy8gVE9ETyBuZWVkIHRvIHN1cHBvcnQgZmFuY3kgcm9vdCBmaWxlIGxvY2F0aW9uIHNwZWNzCi0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKDIpOwotCQlTdHJpbmcgY29uZmlndXJhdGlvbkRhdGEgPSAidW56aXAoc291cmNlOkBhcnRpZmFjdCwgdGFyZ2V0OiR7aW5zdGFsbEZvbGRlcn0pOyI7IC8vJE5PTi1OTFMtMSQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJpbnN0YWxsIiwgY29uZmlndXJhdGlvbkRhdGEpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB1bkNvbmZpZ3VyYXRpb25EYXRhID0gImNsZWFudXB6aXAoc291cmNlOkBhcnRpZmFjdCwgdGFyZ2V0OiR7aW5zdGFsbEZvbGRlcn0pOyI7IC8vJE5PTi1OTFMtMSQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmluc3RhbGwiLCB1bkNvbmZpZ3VyYXRpb25EYXRhKTsgLy8kTk9OLU5MUy0xJAotCQlpdS5hZGRUb3VjaHBvaW50RGF0YShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludERhdGEodG91Y2hwb2ludERhdGEpKTsKLQotCQkvLyBwcmltZSB0aGUgSVUgd2l0aCBhbiBhcnRpZmFjdCBrZXkgdGhhdCB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlIHppcHBlZCB1cCByb290IGZpbGVzLgotCQlJQXJ0aWZhY3RLZXkga2V5ID0gY3JlYXRlTGF1bmNoZXJBcnRpZmFjdEtleShpdS5nZXRJZCgpLCBpdS5nZXRWZXJzaW9uKCkpOwotCQlpdS5zZXRBcnRpZmFjdHMobmV3IElBcnRpZmFjdEtleVtdIHtrZXl9KTsKLQkJcmV0dXJuIGZpbGVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0dXBQZXJtaXNzaW9ucyhJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdSwgRmlsZVNldERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlNYXAgdG91Y2hwb2ludERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQlTdHJpbmdbXVtdIHBlcm1zTGlzdCA9IGRlc2NyaXB0b3IuZ2V0UGVybWlzc2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwZXJtc0xpc3QubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZ1tdIHBlcm1TcGVjID0gcGVybXNMaXN0W2ldOwotCQkJU3RyaW5nIGNvbmZpZ3VyYXRpb25EYXRhID0gIiBjaG1vZCh0YXJnZXREaXI6JHtpbnN0YWxsRm9sZGVyfSwgdGFyZ2V0RmlsZToiICsgcGVybVNwZWNbMV0gKyAiLCBwZXJtaXNzaW9uczoiICsgcGVybVNwZWNbMF0gKyAiKTsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJdG91Y2hwb2ludERhdGEucHV0KCJpbnN0YWxsIiwgY29uZmlndXJhdGlvbkRhdGEpOyAvLyROT04tTkxTLTEkCi0JCQlpdS5hZGRUb3VjaHBvaW50RGF0YShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludERhdGEodG91Y2hwb2ludERhdGEpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgc2V0dXBMaW5rcyhJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdSwgRmlsZVNldERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkvLyBUT0RPIHNldHVwIHRoZSBsaW5rIHN1cHBvcnQuCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRBcnJheUZyb21TdHJpbmcoU3RyaW5nIGxpc3QsIFN0cmluZyBzZXBhcmF0b3IpIHsKLQkJaWYgKGxpc3QgPT0gbnVsbCB8fCBsaXN0LnRyaW0oKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGlzdCwgc2VwYXJhdG9yKTsgdG9rZW5zLmhhc01vcmVUb2tlbnMoKTspIHsKLQkJCVN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQlpZiAoIXRva2VuLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQuYWRkKHRva2VuKTsKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSByZXN1bHQudG9BcnJheShuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL1Byb2R1Y3RQdWJsaXNoZXJBcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvUHJvZHVjdFB1Ymxpc2hlckFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMTE0MjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvUHJvZHVjdFB1Ymxpc2hlckFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9ucy5Qcm9kdWN0QWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgUHJvZHVjdFB1Ymxpc2hlckFwcGxpY2F0aW9uIGV4dGVuZHMgQWJzdHJhY3RQdWJsaXNoZXJBcHBsaWNhdGlvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBwcm9kdWN0OwotCXByaXZhdGUgU3RyaW5nIGV4ZWN1dGFibGVzOwotCXByaXZhdGUgU3RyaW5nIGZsYXZvcjsKLQotCXB1YmxpYyBQcm9kdWN0UHVibGlzaGVyQXBwbGljYXRpb24oKSB7Ci0JfQotCi0JcHJvdGVjdGVkIElQdWJsaXNoaW5nQWN0aW9uW10gY3JlYXRlQWN0aW9ucygpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmVzdWx0LmFkZChjcmVhdGVQcm9kdWN0QWN0aW9uKCkpOwotCQlyZXR1cm4gKElQdWJsaXNoaW5nQWN0aW9uW10pIHJlc3VsdC50b0FycmF5KG5ldyBJUHVibGlzaGluZ0FjdGlvbltyZXN1bHQuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBJUHVibGlzaGluZ0FjdGlvbiBjcmVhdGVQcm9kdWN0QWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IFByb2R1Y3RBY3Rpb24oc291cmNlLCBwcm9kdWN0LCBmbGF2b3IsIG5ldyBGaWxlKGV4ZWN1dGFibGVzKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1BhcmFtZXRlcihTdHJpbmcgYXJnLCBTdHJpbmcgcGFyYW1ldGVyLCBQdWJsaXNoZXJJbmZvIGluZm8pIHsKLQkJc3VwZXIucHJvY2Vzc1BhcmFtZXRlcihhcmcsIHBhcmFtZXRlciwgaW5mbyk7Ci0KLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItcHJvZHVjdEZpbGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJcHJvZHVjdCA9IHBhcmFtZXRlcjsKLQkJaWYgKGFyZy5lcXVhbHNJZ25vcmVDYXNlKCItZXhlY3V0YWJsZXMiKSkgLy8kTk9OLU5MUy0xJAotCQkJZXhlY3V0YWJsZXMgPSBwYXJhbWV0ZXI7Ci0JCWlmIChhcmcuZXF1YWxzSWdub3JlQ2FzZSgiLWZsYXZvciIpKSAvLyROT04tTkxTLTEkCi0JCQlmbGF2b3IgPSBwYXJhbWV0ZXI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9QdWJsaXNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL1B1Ymxpc2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzliNzg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL1B1Ymxpc2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgUHVibGlzaGVyIHsKLQlzdGF0aWMgZmluYWwgcHVibGljIFN0cmluZyBQVUJMSVNIX1BBQ0tfRklMRVNfQVNfU0lCTElOR1MgPSAicHVibGlzaFBhY2tGaWxlc0FzU2libGluZ3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElQdWJsaXNoZXJJbmZvIGluZm87Ci0JcHJpdmF0ZSBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHM7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbWV0YWRhdGEgcmVwb3NpdG9yeSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBzZXR0aW5ncy4gIElmIGEgcmVwbyBhdCB0aGUgCi0JICogZ2l2ZW4gbG9jYXRpb24gYWxyZWFkeSBleGlzdHMsIGl0IGlzIHVwZGF0ZWQgd2l0aCB0aGUgc2V0dGluZ3MgYW5kIHJldHVybmVkLiAgSWYgbm8gcmVwb3NpdG9yeQotCSAqIGlzIGZvdW5kIHRoZW4gYSBuZXcgU2ltcGxlIHJlcG9zaXRvcnkgaXMgY3JlYXRlZCwgY29uZmlndXJlZCBhbmQgcmV0dXJuZWQKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIFVSTCBsb2NhdGlvbiBvZiB0aGUgcmVwbwotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByZXBvCi0JICogQHBhcmFtIGFwcGVuZCB3aGV0aGVyIG9yIG5vdCB0aGUgcmVwbyBzaG91bGQgYXBwZW5kZWQgb3IgY2xlYXJlZAotCSAqIEBwYXJhbSBjb21wcmVzcyB3aGV0aGVyIG9yIG5vdCB0byBjb21wcmVzcyB0aGUgcmVwb3NpdG9yeSBpbmRleAotCSAqIEByZXR1cm4gdGhlIGRpc2NvdmVyZWQgb3IgY3JlYXRlZCByZXBvc2l0b3J5Ci0JICogQHRocm93cyBQcm92aXNpb25FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZXRhZGF0YVJlcG9zaXRvcnkgY3JlYXRlTWV0YWRhdGFSZXBvc2l0b3J5KFN0cmluZyBsb2NhdGlvbiwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gYXBwZW5kLCBib29sZWFuIGNvbXByZXNzKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJVVJMIHVybDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fbWV0YWRhdGFSZXBvTG9jYXRpb25VUkwsIGxvY2F0aW9uKSk7Ci0JCX0KLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5jb250ZXh0LCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQl0cnkgewotCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXN1bHQgPSBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KHVybCwgbnVsbCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQuc2V0UHJvcGVydHkoSVJlcG9zaXRvcnkuUFJPUF9DT01QUkVTU0VELCBjb21wcmVzcyA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCWlmICghcmVzdWx0LmlzTW9kaWZpYWJsZSgpKQotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmV4Y2VwdGlvbl9tZXRhZGF0YVJlcG9Ob3RXcml0YWJsZSwgdXJsKSk7Ci0JCQkJaWYgKCFhcHBlbmQpCi0JCQkJCXJlc3VsdC5yZW1vdmVBbGwoKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy9mYWxsIHRocm91Z2ggYW5kIGNyZWF0ZSBhIG5ldyByZXBvc2l0b3J5Ci0JCX0KLQotCQkvLyAJdGhlIGdpdmVuIHJlcG8gbG9jYXRpb24gaXMgbm90IGFuIGV4aXN0aW5nIHJlcG8gc28gd2UgaGF2ZSB0byBjcmVhdGUgc29tZXRoaW5nCi0JCS8vIFRPRE8gZm9yIG5vdyBjcmVhdGUgYSByYW5kb20gcmVwbyBieSBkZWZhdWx0LgotCQlTdHJpbmcgcmVwb3NpdG9yeU5hbWUgPSBuYW1lID09IG51bGwgPyBsb2NhdGlvbiArICIgLSBtZXRhZGF0YSIgOiBuYW1lOyAvLyROT04tTkxTLTEkCi0JCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVzdWx0ID0gbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KHVybCwgcmVwb3NpdG9yeU5hbWUsIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlRZUEVfU0lNUExFX1JFUE9TSVRPUlkpOwotCQltYW5hZ2VyLmFkZFJlcG9zaXRvcnkocmVzdWx0LmdldExvY2F0aW9uKCkpOwotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlyZXN1bHQuc2V0UHJvcGVydHkoSVJlcG9zaXRvcnkuUFJPUF9DT01QUkVTU0VELCBjb21wcmVzcyA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJ0aWZhY3QgcmVwb3NpdG9yeSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBzZXR0aW5ncy4gIElmIGEgcmVwbyBhdCB0aGUgCi0JICogZ2l2ZW4gbG9jYXRpb24gYWxyZWFkeSBleGlzdHMsIGl0IGlzIHVwZGF0ZWQgd2l0aCB0aGUgc2V0dGluZ3MgYW5kIHJldHVybmVkLiAgSWYgbm8gcmVwb3NpdG9yeQotCSAqIGlzIGZvdW5kIHRoZW4gYSBuZXcgU2ltcGxlIHJlcG9zaXRvcnkgaXMgY3JlYXRlZCwgY29uZmlndXJlZCBhbmQgcmV0dXJuZWQKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIFVSTCBsb2NhdGlvbiBvZiB0aGUgcmVwbwotCSAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSByZXBvCi0JICogQHBhcmFtIGFwcGVuZCB3aGV0aGVyIG9yIG5vdCB0aGUgcmVwbyBzaG91bGQgYXBwZW5kZWQgb3IgY2xlYXJlZAotCSAqIEBwYXJhbSBjb21wcmVzcyB3aGV0aGVyIG9yIG5vdCB0byBjb21wcmVzcyB0aGUgcmVwb3NpdG9yeSBpbmRleAotCSAqIEBwYXJhbSByZXVzZVBhY2tlZEZpbGVzIHdoZXRoZXIgb3Igbm90IHRvIGluY2x1ZGUgZGlzY292ZXJlZCBQYWNrMjAwIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5Ci0JICogQHJldHVybiB0aGUgZGlzY292ZXJlZCBvciBjcmVhdGVkIHJlcG9zaXRvcnkKLQkgKiBAdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0UmVwb3NpdG9yeSBjcmVhdGVBcnRpZmFjdFJlcG9zaXRvcnkoU3RyaW5nIGxvY2F0aW9uLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBhcHBlbmQsIGJvb2xlYW4gY29tcHJlc3MsIGJvb2xlYW4gcmV1c2VQYWNrZWRGaWxlcykgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuY29udGV4dCwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJVVJMIHVybDsKLQkJdHJ5IHsKLQkJCXVybCA9IG5ldyBVUkwobG9jYXRpb24pOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fYXJ0aWZhY3RSZXBvTG9jYXRpb25VUkwsIGxvY2F0aW9uKSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVzdWx0ID0gbWFuYWdlci5sb2FkUmVwb3NpdG9yeSh1cmwsIG51bGwpOwotCQkJaWYgKCFyZXN1bHQuaXNNb2RpZmlhYmxlKCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fYXJ0aWZhY3RSZXBvTm90V3JpdGFibGUsIHVybCkpOwotCQkJcmVzdWx0LnNldFByb3BlcnR5KElSZXBvc2l0b3J5LlBST1BfQ09NUFJFU1NFRCwgY29tcHJlc3MgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCWlmIChyZXVzZVBhY2tlZEZpbGVzKQotCQkJCXJlc3VsdC5zZXRQcm9wZXJ0eShQVUJMSVNIX1BBQ0tfRklMRVNfQVNfU0lCTElOR1MsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghYXBwZW5kKQotCQkJCXJlc3VsdC5yZW1vdmVBbGwoKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL2ZhbGwgdGhyb3VnaCBhbmQgY3JlYXRlIGEgbmV3IHJlcG9zaXRvcnkKLQkJfQotCi0JCS8vIAl0aGUgZ2l2ZW4gcmVwbyBsb2NhdGlvbiBpcyBub3QgYW4gZXhpc3RpbmcgcmVwbyBzbyB3ZSBoYXZlIHRvIGNyZWF0ZSBzb21ldGhpbmcKLQkJLy8gVE9ETyBmb3Igbm93IGNyZWF0ZSBhIFNpbXBsZSByZXBvIGJ5IGRlZmF1bHQuCi0JCVN0cmluZyByZXBvc2l0b3J5TmFtZSA9IG5hbWUgIT0gbnVsbCA/IG5hbWUgOiBsb2NhdGlvbiArICIgLSBhcnRpZmFjdHMiOyAvLyROT04tTkxTLTEkCi0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVzdWx0ID0gbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KHVybCwgcmVwb3NpdG9yeU5hbWUsIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLlRZUEVfU0lNUExFX1JFUE9TSVRPUlkpOwotCQltYW5hZ2VyLmFkZFJlcG9zaXRvcnkocmVzdWx0LmdldExvY2F0aW9uKCkpOwotCQkvLyBUT0RPIHRoZXJlIG11c3QgYmUgc29tZXRoaW5nIHdlIGhhdmUgdG8gZG8gdG8gc2V0IHVwIHRoZSBtYXBwaW5nIHJ1bGVzIGhlcmUuLi4KLQkJLy8JCWlmIChpbnBsYWNlKSB7Ci0JCS8vCQl9Ci0JCXJlc3VsdC5zZXRQcm9wZXJ0eShJUmVwb3NpdG9yeS5QUk9QX0NPTVBSRVNTRUQsIGNvbXByZXNzID8gInRydWUiIDogImZhbHNlIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWlmIChyZXVzZVBhY2tlZEZpbGVzKQotCQkJcmVzdWx0LnNldFByb3BlcnR5KFBVQkxJU0hfUEFDS19GSUxFU19BU19TSUJMSU5HUywgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBQdWJsaXNoZXIoSVB1Ymxpc2hlckluZm8gaW5mbykgewotCQl0aGlzLmluZm8gPSBpbmZvOwotCQlyZXN1bHRzID0gbmV3IFB1Ymxpc2hlclJlc3VsdCgpOwotCX0KLQotCXB1YmxpYyBQdWJsaXNoZXIoSVB1Ymxpc2hlckluZm8gaW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCXRoaXMuaW5mbyA9IGluZm87Ci0JCXRoaXMucmVzdWx0cyA9IHJlc3VsdHM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcHVibGlzaChJUHVibGlzaGluZ0FjdGlvbltdIGFjdGlvbnMpIHsKLQkJLy8gcnVuIGFsbCB0aGUgYWN0aW9ucwotCQlNdWx0aVN0YXR1cyBmaW5hbFN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cygidGhpcyIsIDAsICJwdWJsaXNoaW5nIHJlc3VsdCIsIG51bGwpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gYWN0aW9uc1tpXS5wZXJmb3JtKGluZm8sIHJlc3VsdHMpOwotCQkJZmluYWxTdGF0dXMubWVyZ2Uoc3RhdHVzKTsKLQkJfQotCQlpZiAoIWZpbmFsU3RhdHVzLmlzT0soKSkKLQkJCXJldHVybiBmaW5hbFN0YXR1czsKLQotCQkvLyBpZiB0aGVyZSB3ZXJlIG5vIGVycm9ycywgcHVibGlzaCBhbGwgdGhlIGl1cy4KLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSBtZXRhZGF0YVJlcG9zaXRvcnkgPSBpbmZvLmdldE1ldGFkYXRhUmVwb3NpdG9yeSgpOwotCQlpZiAobWV0YWRhdGFSZXBvc2l0b3J5ICE9IG51bGwpIHsKLQkJCUNvbGxlY3Rpb24gaXVzID0gcmVzdWx0cy5nZXRJVXMobnVsbCwgbnVsbCk7Ci0JCQltZXRhZGF0YVJlcG9zaXRvcnkuYWRkSW5zdGFsbGFibGVVbml0cygoSUluc3RhbGxhYmxlVW5pdFtdKSBpdXMudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFtpdXMuc2l6ZSgpXSkpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL1B1Ymxpc2hlckluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL1B1Ymxpc2hlckluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1NzUxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9QdWJsaXNoZXJJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoZXJJbmZvIGltcGxlbWVudHMgSVB1Ymxpc2hlckluZm8gewotCi0JcHJpdmF0ZSBpbnQgYXJ0aWZhY3RPcHRpb25zID0gMDsKLQlwcml2YXRlIElNZXRhZGF0YVJlcG9zaXRvcnkgbWV0YWRhdGFSZXBvc2l0b3J5OwotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeSBhcnRpZmFjdFJlcG9zaXRvcnk7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBjb25maWd1cmF0aW9uczsKLQlwcml2YXRlIExpc3QgYWR2aWNlTGlzdCA9IG5ldyBBcnJheUxpc3QoMTEpOwotCi0JcHVibGljIHZvaWQgYWRkQWR2aWNlKElQdWJsaXNoaW5nQWR2aWNlIGFkdmljZSkgewotCQlhZHZpY2VMaXN0LmFkZChhZHZpY2UpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldEFkdmljZShTdHJpbmcgY29uZmlnU3BlYywgYm9vbGVhbiBpbmNsdWRlRGVmYXVsdCwgU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24sIENsYXNzIHR5cGUpIHsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gYWR2aWNlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvYmplY3QgPSBpLm5leHQoKTsKLQkJCWlmICh0eXBlLmlzSW5zdGFuY2Uob2JqZWN0KSAmJiAoKElQdWJsaXNoaW5nQWR2aWNlKSBvYmplY3QpLmlzQXBwbGljYWJsZShjb25maWdTcGVjLCBpbmNsdWRlRGVmYXVsdCwgaWQsIHZlcnNpb24pKQotCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGdldEFydGlmYWN0UmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeTsKLQl9Ci0KLQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBnZXRNZXRhZGF0YVJlcG9zaXRvcnkoKSB7Ci0JCXJldHVybiBtZXRhZGF0YVJlcG9zaXRvcnk7Ci0JfQotCi0JcHVibGljIGludCBnZXRBcnRpZmFjdE9wdGlvbnMoKSB7Ci0JCXJldHVybiBhcnRpZmFjdE9wdGlvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RSZXBvc2l0b3J5KElBcnRpZmFjdFJlcG9zaXRvcnkgdmFsdWUpIHsKLQkJYXJ0aWZhY3RSZXBvc2l0b3J5ID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TWV0YWRhdGFSZXBvc2l0b3J5KElNZXRhZGF0YVJlcG9zaXRvcnkgdmFsdWUpIHsKLQkJbWV0YWRhdGFSZXBvc2l0b3J5ID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RPcHRpb25zKGludCB2YWx1ZSkgewotCQlhcnRpZmFjdE9wdGlvbnMgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJhdGlvbnMoKSB7Ci0JCXJldHVybiBjb25maWd1cmF0aW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9ucyhTdHJpbmdbXSB2YWx1ZSkgewotCQljb25maWd1cmF0aW9ucyA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3VtbWFyeSgpIHsKLQkJcmV0dXJuICJzb21lIHRleHQgdGhhdCBkZXNjcmliZXMgdGhpcyBzZXR1cCI7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9QdWJsaXNoZXJSZXN1bHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL1B1Ymxpc2hlclJlc3VsdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmM4MzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL1B1Ymxpc2hlclJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci0KLXB1YmxpYyBjbGFzcyBQdWJsaXNoZXJSZXN1bHQgaW1wbGVtZW50cyBJUHVibGlzaGVyUmVzdWx0IHsKLQkvLyB0eXBlIG1hcmtlcnMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gInJvb3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9OX1JPT1QgPSAibm9uX3Jvb3QiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBUaGUgc2V0IG9mIHRvcCBsZXZlbCBJVXMKLQlmaW5hbCBNYXAgcm9vdElVcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvLyBUaGUgc2V0IG9mIGludGVybmFsIGFuZCBsZWFmIElVcwotCWZpbmFsIE1hcCBub25Sb290SVVzID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyB2b2lkIGFkZElVKElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZyB0eXBlKSB7Ci0JCWlmICh0eXBlID09IFJPT1QpCi0JCQlhZGRJVShyb290SVVzLCBpdS5nZXRJZCgpLCBpdSk7Ci0JCWlmICh0eXBlID09IE5PTl9ST09UKQotCQkJYWRkSVUobm9uUm9vdElVcywgaXUuZ2V0SWQoKSwgaXUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZElVcyhDb2xsZWN0aW9uIGl1cywgU3RyaW5nIHR5cGUpIHsKLQkJZm9yIChJdGVyYXRvciBpID0gaXVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCWFkZElVKChJSW5zdGFsbGFibGVVbml0KSBpLm5leHQoKSwgdHlwZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZElVKE1hcCBtYXAsIFN0cmluZyBpZCwgSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlTZXQgaXVzID0gKFNldCkgbWFwLmdldChpZCk7Ci0JCWlmIChpdXMgPT0gbnVsbCkgewotCQkJaXVzID0gbmV3IEhhc2hTZXQoMTEpOwotCQkJbWFwLnB1dChpZCwgaXVzKTsKLQkJfQotCQlpdXMuYWRkKGl1KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBJVXMgZ2VuZXJhdGVkIGR1cmluZyB0aGlzIGV4ZWN1dGlvbiBvZiB0aGUgZ2VuZXJhdG9yLgotCSAqLwotCXB1YmxpYyBNYXAgZ2V0R2VuZXJhdGVkSVVzKFN0cmluZyB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCUhhc2hNYXAgYWxsID0gbmV3IEhhc2hNYXAoKTsKLQkJCWFsbC5wdXRBbGwocm9vdElVcyk7Ci0JCQlhbGwucHV0QWxsKG5vblJvb3RJVXMpOwotCQkJcmV0dXJuIGFsbDsKLQkJfQotCQlpZiAodHlwZSA9PSBST09UKQotCQkJcmV0dXJuIHJvb3RJVXM7Ci0JCWlmICh0eXBlID09IE5PTl9ST09UKQotCQkJcmV0dXJuIG5vblJvb3RJVXM7Ci0JCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgSVUgdHlwZTogIiArIHR5cGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gVE9ETyB0aGlzIG1ldGhvZCByZWFsbHkgc2hvdWxkIG5vdCBiZSBuZWVkZWQgYXMgaXQganVzdCByZXR1cm5zIHRoZSBmaXJzdAotCS8vIG1hdGNoaW5nIElVIG5vbi1kZXRlcm1pbmlzdGljYWxseS4KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdCBnZXRJVShTdHJpbmcgaWQsIFN0cmluZyB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG51bGwgfHwgdHlwZSA9PSBST09UKSB7Ci0JCQlDb2xsZWN0aW9uIGl1cyA9IChDb2xsZWN0aW9uKSByb290SVVzLmdldChpZCk7Ci0JCQlpZiAoaXVzICE9IG51bGwgJiYgaXVzLnNpemUoKSA+IDApCi0JCQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0KSBpdXMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCX0KLQkJaWYgKHR5cGUgPT0gbnVsbCB8fCB0eXBlID09IE5PTl9ST09UKSB7Ci0JCQlDb2xsZWN0aW9uIGl1cyA9IChDb2xsZWN0aW9uKSBub25Sb290SVVzLmdldChpZCk7Ci0JCQlpZiAoaXVzICE9IG51bGwgJiYgaXVzLnNpemUoKSA+IDApCi0JCQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0KSBpdXMuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSVVzIGluIHRoaXMgcmVzdWx0IHdpdGggdGhlIGdpdmVuIGlkLgotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldElVcyhTdHJpbmcgaWQsIFN0cmluZyB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlyZXN1bHQuYWRkQWxsKGlkID09IG51bGwgPyBmbGF0dGVuKHJvb3RJVXMudmFsdWVzKCkpIDogKENvbGxlY3Rpb24pIHJvb3RJVXMuZ2V0KGlkKSk7Ci0JCQlyZXN1bHQuYWRkQWxsKGlkID09IG51bGwgPyBmbGF0dGVuKG5vblJvb3RJVXMudmFsdWVzKCkpIDogKENvbGxlY3Rpb24pIG5vblJvb3RJVXMuZ2V0KGlkKSk7Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCWlmICh0eXBlID09IFJPT1QpCi0JCQlyZXR1cm4gaWQgPT0gbnVsbCA/IGZsYXR0ZW4ocm9vdElVcy52YWx1ZXMoKSkgOiAoQ29sbGVjdGlvbikgcm9vdElVcy5nZXQoaWQpOwotCQlpZiAodHlwZSA9PSBOT05fUk9PVCkKLQkJCXJldHVybiBpZCA9PSBudWxsID8gZmxhdHRlbihub25Sb290SVVzLnZhbHVlcygpKSA6IChDb2xsZWN0aW9uKSBub25Sb290SVVzLmdldChpZCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgTGlzdCBmbGF0dGVuKENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IHZhbHVlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXRbXSBpdXMgPSAoSUluc3RhbGxhYmxlVW5pdFtdKSBpLm5leHQoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgaXVzLmxlbmd0aDsgaisrKQotCQkJCXJlc3VsdC5hZGQoaXVzW2pdKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIG1lcmdlKElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0LCBpbnQgbW9kZSkgewotCQlpZiAobW9kZSA9PSBNRVJHRV9NQVRDSElORykgewotCQkJYWRkSVVzKHJlc3VsdC5nZXRJVXMobnVsbCwgUk9PVCksIFJPT1QpOwotCQkJYWRkSVVzKHJlc3VsdC5nZXRJVXMobnVsbCwgTk9OX1JPT1QpLCBOT05fUk9PVCk7Ci0JCX0gZWxzZSBpZiAobW9kZSA9PSBNRVJHRV9BTExfUk9PVCkgewotCQkJYWRkSVVzKHJlc3VsdC5nZXRJVXMobnVsbCwgUk9PVCksIFJPT1QpOwotCQkJYWRkSVVzKHJlc3VsdC5nZXRJVXMobnVsbCwgTk9OX1JPT1QpLCBST09UKTsKLQkJfSBlbHNlIGlmIChtb2RlID09IE1FUkdFX0FMTF9OT05fUk9PVCkgewotCQkJYWRkSVVzKHJlc3VsdC5nZXRJVXMobnVsbCwgUk9PVCksIE5PTl9ST09UKTsKLQkJCWFkZElVcyhyZXN1bHQuZ2V0SVVzKG51bGwsIE5PTl9ST09UKSwgTk9OX1JPT1QpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0Fic3RyYWN0QWR2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0Fic3RyYWN0QWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMGRjYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9BYnN0cmFjdEFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLklQdWJsaXNoaW5nQWR2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdEFkdmljZSBpbXBsZW1lbnRzIElQdWJsaXNoaW5nQWR2aWNlIHsKLQotCXB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZShTdHJpbmcgY29uZmlnU3BlYywgYm9vbGVhbiBpbmNsdWRlRGVmYXVsdCwgU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJcmV0dXJuIG1hdGNoQ29uZmlnKGNvbmZpZ1NwZWMsIGluY2x1ZGVEZWZhdWx0KSAmJiBtYXRjaElkKGlkKSAmJiBtYXRjaFZlcnNpb24odmVyc2lvbik7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hWZXJzaW9uKFZlcnNpb24gdmVyc2lvbikgewotCQlWZXJzaW9uIGFkdmljZVZlcnNpb24gPSBnZXRWZXJzaW9uKCk7Ci0JCWlmIChhZHZpY2VWZXJzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gdmVyc2lvbi5lcXVhbHMoYWR2aWNlVmVyc2lvbik7Ci0JCVZlcnNpb25SYW5nZSByYW5nZSA9IGdldFZlcnNpb25SYW5nZSgpOwotCQlpZiAocmFuZ2UgIT0gbnVsbCkKLQkJCXJldHVybiByYW5nZS5pc0luY2x1ZGVkKHZlcnNpb24pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmVyc2lvbiBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmVyc2lvblJhbmdlIGdldFZlcnNpb25SYW5nZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hJZChTdHJpbmcgaWQpIHsKLQkJU3RyaW5nIGFkdmljZUlkID0gZ2V0SWQoKTsKLQkJcmV0dXJuIGFkdmljZUlkID09IG51bGwgPyB0cnVlIDogYWR2aWNlSWQuZXF1YWxzKGlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaENvbmZpZyhTdHJpbmcgY29uZmlnU3BlYywgYm9vbGVhbiBpbmNsdWRlRGVmYXVsdCkgewotCQlTdHJpbmcgYWR2aWNlQ29uZmlnU3BlYyA9IGdldENvbmZpZ1NwZWMoKTsKLQkJaWYgKGFkdmljZUNvbmZpZ1NwZWMgPT0gbnVsbCkKLQkJCXJldHVybiBpbmNsdWRlRGVmYXVsdDsKLQkJU3RyaW5nW10gZnVsbCA9IEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5wYXJzZUNvbmZpZ1NwZWMoY29uZmlnU3BlYyk7Ci0JCVN0cmluZ1tdIHBhcnRpYWwgPSBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24ucGFyc2VDb25maWdTcGVjKGFkdmljZUNvbmZpZ1NwZWMpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpYWwubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzdHJpbmcgPSBwYXJ0aWFsW2ldOwotCQkJaWYgKHN0cmluZyAhPSBudWxsICYmICFzdHJpbmcuZXF1YWxzKGZ1bGxbaV0pKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ1NwZWMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9BY2N1bXVsYXRlQ29uZmlnRGF0YUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9BY2N1bXVsYXRlQ29uZmlnRGF0YUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWNkZTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQWNjdW11bGF0ZUNvbmZpZ0RhdGFBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5Db25maWdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTGF1bmNoZXJEYXRhOwotCi1wdWJsaWMgY2xhc3MgQWNjdW11bGF0ZUNvbmZpZ0RhdGFBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgY29uZmlnU3BlYzsKLQlwcml2YXRlIERhdGFMb2FkZXIgbG9hZGVyOwotCi0JcHVibGljIEFjY3VtdWxhdGVDb25maWdEYXRhQWN0aW9uKElQdWJsaXNoZXJJbmZvIGluZm8sIFN0cmluZyBjb25maWdTcGVjLCBGaWxlIGNvbmZpZ3VyYXRpb25Mb2NhdGlvbiwgRmlsZSBleGVjdXRhYmxlTG9jYXRpb24pIHsKLQkJdGhpcy5jb25maWdTcGVjID0gY29uZmlnU3BlYzsKLQkJbG9hZGVyID0gbmV3IERhdGFMb2FkZXIoY29uZmlndXJhdGlvbkxvY2F0aW9uLCBleGVjdXRhYmxlTG9jYXRpb24pOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHBlcmZvcm0oSVB1Ymxpc2hlckluZm8gaW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCXN0b3JlQ29uZmlnRGF0YShpbmZvLCBjb25maWdTcGVjLCByZXN1bHRzKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVDb25maWdEYXRhKElQdWJsaXNoZXJJbmZvIGluZm8sIFN0cmluZyBjb25maWdTcGVjLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdCkgewotCQlDb25maWdEYXRhIGRhdGEgPSBsb2FkZXIuZ2V0Q29uZmlnRGF0YSgpOwotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbmZvLmFkZEFkdmljZShuZXcgQ29uZmlnQWR2aWNlKGRhdGEsIGNvbmZpZ1NwZWMpKTsKLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IGxvYWRlci5nZXRMYXVuY2hlckRhdGEoKTsKLQkJaWYgKGxhdW5jaGVyRGF0YSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbmZvLmFkZEFkdmljZShuZXcgTGF1bmNoaW5nQWR2aWNlKGxhdW5jaGVyRGF0YSwgY29uZmlnU3BlYykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQnJhbmRlZEV4ZWN1dGFibGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQnJhbmRlZEV4ZWN1dGFibGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ2ZjMzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0JyYW5kZWRFeGVjdXRhYmxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlcy5Qcm9kdWN0RmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci5wcm9kdWN0LkJyYW5kaW5nSXJvbjsKLQotcHVibGljIGNsYXNzIEJyYW5kZWRFeGVjdXRhYmxlQWN0aW9uIGV4dGVuZHMgRXF1aW5veEV4ZWN1dGFibGVBY3Rpb24gewotCi0JcHJpdmF0ZSBQcm9kdWN0RmlsZSBwcm9kdWN0OwotCi0JcHVibGljIEJyYW5kZWRFeGVjdXRhYmxlQWN0aW9uKEV4ZWN1dGFibGVzRGVzY3JpcHRvciBleGVjdXRhYmxlcywgU3RyaW5nIHByb2R1Y3RMb2NhdGlvbiwgU3RyaW5nIGZsYXZvciwgU3RyaW5nIGNvbmZpZ1NwZWMpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5leGVjdXRhYmxlcyA9IGV4ZWN1dGFibGVzOwotCQl0aGlzLmZsYXZvciA9IGZsYXZvcjsKLQkJdGhpcy5jb25maWdTcGVjID0gY29uZmlnU3BlYzsKLQkJcHJvZHVjdCA9IGxvYWRQcm9kdWN0KHByb2R1Y3RMb2NhdGlvbik7Ci0JCWlkQmFzZSA9IHByb2R1Y3QuZ2V0UHJvZHVjdE5hbWUoKTsKLQkJdmVyc2lvblNwZWMgPSBwcm9kdWN0LmdldFZlcnNpb24oKTsKLQl9Ci0KLQlwcml2YXRlIFByb2R1Y3RGaWxlIGxvYWRQcm9kdWN0KFN0cmluZyBwcm9kdWN0TG9jYXRpb24pIHsKLQkJUHJvZHVjdEZpbGUgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IG5ldyBQcm9kdWN0RmlsZShwcm9kdWN0TG9jYXRpb24pOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy9UT0RPCi0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidW5hYmxlIHRvIGxvYWQgcHJvZHVjdCBmaWxlIik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQnJhbmRzIGEgY29weSBvZiB0aGUgZ2l2ZW4gZXhlY3V0YWJsZSBkZXNjcmlwdG9yIHdpdGggdGhlIGluZm9ybWF0aW9uIGluIHRoZSAKLQkgKiBjdXJyZW50IHByb2R1Y3QgZGVmaW5pdGlvbi4gIFRoZSBmaWxlcyBkZXNjcmliZWQgaW4gdGhlIGRlc2NyaXB0b3IgYXJlIGFsc28gY29waWVkCi0JICogdG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24gdG8gYXZvaWQgZGVzdHJ1Y3RpdmUgbW9kaWZpY2F0aW9uCi0JICogQHBhcmFtIHRoZSBleGVjdXRhYmxlIGRlc2NyaXB0b3IgdG8gYnJhbmQuCi0JICogQHJldHVybiB0aGUgbmV3IGRlc2NyaXB0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRXhlY3V0YWJsZXNEZXNjcmlwdG9yIGJyYW5kRXhlY3V0YWJsZXMoRXhlY3V0YWJsZXNEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJRXhlY3V0YWJsZXNEZXNjcmlwdG9yIHJlc3VsdCA9IG5ldyBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JCXJlc3VsdC5tYWtlVGVtcG9yYXJ5Q29weSgpOwotCQlCcmFuZGluZ0lyb24gaXJvbiA9IG5ldyBCcmFuZGluZ0lyb24oKTsKLQkJU3RyaW5nIG9zID0gcGFyc2VDb25maWdTcGVjKGNvbmZpZ1NwZWMpWzFdOwotCQlpcm9uLnNldEljb25zKHByb2R1Y3QuZ2V0SWNvbnMob3MpKTsKLQkJaXJvbi5zZXROYW1lKHByb2R1Y3QuZ2V0TGF1bmNoZXJOYW1lKCkpOwotCQlpcm9uLnNldE9TKG9zKTsKLQkJaXJvbi5zZXRSb290KHJlc3VsdC5nZXRMb2NhdGlvbigpLmdldEFic29sdXRlUGF0aCgpKTsKLQkJdHJ5IHsKLQkJCWlyb24uYnJhbmQoKTsKLQkJCXJlc3VsdC5zZXRFeGVjdXRhYmxlTmFtZShwcm9kdWN0LmdldExhdW5jaGVyTmFtZSgpLCB0cnVlKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0J1bmRsZVNoYXBlQWR2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0J1bmRsZVNoYXBlQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTQyMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9CdW5kbGVTaGFwZUFkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBCdW5kbGVTaGFwZUFkdmljZSBleHRlbmRzIEFic3RyYWN0QWR2aWNlIGltcGxlbWVudHMgSUJ1bmRsZVNoYXBlQWR2aWNlIHsKLQotCXByaXZhdGUgU3RyaW5nIHNoYXBlOwotCXByaXZhdGUgVmVyc2lvbiB2ZXJzaW9uOwotCXByaXZhdGUgU3RyaW5nIGlkOwotCi0JcHVibGljIEJ1bmRsZVNoYXBlQWR2aWNlKFN0cmluZyBpZCwgVmVyc2lvbiB2ZXJzaW9uLCBTdHJpbmcgc2hhcGUpIHsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCQl0aGlzLnNoYXBlID0gc2hhcGU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXByb3RlY3RlZCBWZXJzaW9uIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2hhcGUoKSB7Ci0JCXJldHVybiBzaGFwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQnVuZGxlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9CdW5kbGVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2MWE3ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9CdW5kbGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLio7Ci0KLS8qKgotICogUHVibGlzaCBJVXMgZm9yIGFsbCBvZiB0aGUgYnVuZGxlcyBpbiB0aGUgZ2l2ZW4gc2V0IG9mIGxvY2F0aW9ucy4gIFRoZSBsb2NhdGlvbnMgY2FuIAotICogYmUgYWN0dWFsIGxvY2F0aW9ucyBvZiB0aGUgYnVuZGxlcyBvciBmb2xkZXJzIG9mIGJ1bmRsZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBCdW5kbGVzQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SID0gIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19FQ0xJUFNFX1VQREFURV9DT05GSUdVUkFUT1IgPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRmlsZVtdIGxvY2F0aW9uczsKLQlwcml2YXRlIFN0YXRlT2JqZWN0RmFjdG9yeSBzdGF0ZU9iamVjdEZhY3Rvcnk7Ci0KLQlwdWJsaWMgQnVuZGxlc0FjdGlvbihGaWxlW10gbG9jYXRpb25zKSB7Ci0JCXRoaXMubG9jYXRpb25zID0gZXhwYW5kTG9jYXRpb25zKGxvY2F0aW9ucyk7Ci0JCS8vIFRPRE8gbmVlZCB0byBmaWd1cmUgYSBiZXR0ZXIgd2F5IG9mIGNvbmZpZ3VyaW5nIHRoZSBnZW5lcmF0b3IuLi4KLQkJUGxhdGZvcm1BZG1pbiBwbGF0Zm9ybUFkbWluID0gKFBsYXRmb3JtQWRtaW4pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBQbGF0Zm9ybUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChwbGF0Zm9ybUFkbWluICE9IG51bGwpCi0JCQlzdGF0ZU9iamVjdEZhY3RvcnkgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBwZXJmb3JtKElQdWJsaXNoZXJJbmZvIGluZm8sIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0cykgewotCQlCdW5kbGVEZXNjcmlwdGlvbltdIGJ1bmRsZXMgPSBnZXRCdW5kbGVEZXNjcmlwdGlvbnMobG9jYXRpb25zKTsKLQkJZ2VuZXJhdGVCdW5kbGVJVXMoYnVuZGxlcywgcmVzdWx0cywgaW5mbyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgRmlsZVtdIGV4cGFuZExvY2F0aW9ucyhGaWxlW10gbGlzdCkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlleHBhbmRMb2NhdGlvbnMobGlzdCwgcmVzdWx0KTsKLQkJcmV0dXJuIChGaWxlW10pIHJlc3VsdC50b0FycmF5KG5ldyBGaWxlW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhwYW5kTG9jYXRpb25zKEZpbGVbXSBsaXN0LCBBcnJheUxpc3QgcmVzdWx0KSB7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBsb2NhdGlvbiA9IGxpc3RbaV07Ci0JCQlpZiAobG9jYXRpb24uaXNEaXJlY3RvcnkoKSkgewotCQkJCS8vIGlmIHRoZSBsb2NhdGlvbiBpcyBpdHNlbGYgYSBidW5kbGUsIGp1c3QgYWRkIGl0LiAgT3RoZXJ3aXNlIHIgZG93bgotCQkJCWlmICghbmV3IEZpbGUobG9jYXRpb24sICJNRVRBLUlORi9NQU5JRkVTVC5NRiIpLmV4aXN0cygpKSAvLyROT04tTkxTLTEkCi0JCQkJCWV4cGFuZExvY2F0aW9ucyhsb2NhdGlvbi5saXN0RmlsZXMoKSwgcmVzdWx0KTsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdC5hZGQobG9jYXRpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlyZXN1bHQuYWRkKGxvY2F0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlQnVuZGxlSVVzKEJ1bmRsZURlc2NyaXB0aW9uW10gYnVuZGxlcywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHQsIElQdWJsaXNoZXJJbmZvIGluZm8pIHsKLQkJLy8gQ29tcHV0aW5nIHRoZSBwYXRoIGZvciBsb2NhbGl6ZWQgcHJvcGVydHkgZmlsZXMgaW4gYSBOTCBmcmFnbWVudCBidW5kbGUKLQkJLy8gcmVxdWlyZXMgdGhlIEJVTkRMRV9MT0NBTElaQVRJT04gcHJvcGVydHkgZnJvbSB0aGUgbWFuaWZlc3Qgb2YgdGhlIGhvc3QgYnVuZGxlLAotCQkvLyBzbyBhIGZpcnN0IHBhc3MgaXMgZG9uZSBvdmVyIGFsbCB0aGUgYnVuZGxlcyB0byBjYWNoZSB0aGlzIHZhbHVlIGFzIHdlbGwgYXMgdGhlIHRhZ3MKLQkJLy8gZnJvbSB0aGUgbWFuaWZlc3QgZm9yIHRoZSBsb2NhbGl6YWJsZSBwcm9wZXJ0aWVzLgotCQlmaW5hbCBpbnQgQ0FDSEVfUEhBU0UgPSAwOwotCQlmaW5hbCBpbnQgR0VORVJBVEVfUEhBU0UgPSAxOwotCQlNYXAgYnVuZGxlTG9jYWxpemF0aW9uTWFwID0gbmV3IEhhc2hNYXAoYnVuZGxlcy5sZW5ndGgpOwotCQlTZXQgbG9jYWxpemF0aW9uSVVzID0gbmV3IEhhc2hTZXQoMzIpOwotCQlmb3IgKGludCBwaGFzZSA9IENBQ0hFX1BIQVNFOyBwaGFzZSA8PSBHRU5FUkFURV9QSEFTRTsgcGhhc2UrKykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQnVuZGxlRGVzY3JpcHRpb24gYmQgPSBidW5kbGVzW2ldOwotCQkJCS8vIEEgYnVuZGxlIG1heSBiZSBudWxsIGlmIHRoZSBhc3NvY2lhdGVkIHBsdWctaW4gZG9lcyBub3QgaGF2ZSBhIG1hbmlmZXN0IGZpbGUgLQotCQkJCS8vIGZvciBleGFtcGxlLCBvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLmo5Ci0JCQkJaWYgKGJkICE9IG51bGwgJiYgYmQuZ2V0U3ltYm9saWNOYW1lKCkgIT0gbnVsbCAmJiBiZC5nZXRWZXJzaW9uKCkgIT0gbnVsbCkgewotCQkJCQlNYXAgYnVuZGxlTWFuaWZlc3QgPSAoTWFwKSBiZC5nZXRVc2VyT2JqZWN0KCk7Ci0KLQkJCQkJaWYgKHBoYXNlID09IENBQ0hFX1BIQVNFKSB7Ci0JCQkJCQlpZiAoYnVuZGxlTWFuaWZlc3QgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZ1tdIGNhY2hlZFZhbHVlcyA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmdldE1hbmlmZXN0Q2FjaGVkVmFsdWVzKGJ1bmRsZU1hbmlmZXN0KTsKLQkJCQkJCQlidW5kbGVMb2NhbGl6YXRpb25NYXAucHV0KG1ha2VTaW1wbGVLZXkoYmQpLCBjYWNoZWRWYWx1ZXMpOwotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJSUFydGlmYWN0S2V5IGtleSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUJ1bmRsZUFydGlmYWN0S2V5KGJkLmdldFN5bWJvbGljTmFtZSgpLCBiZC5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0JCQkJCQlGaWxlIGxvY2F0aW9uID0gbmV3IEZpbGUoYmQuZ2V0TG9jYXRpb24oKSk7Ci0JCQkJCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGFkID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlQXJ0aWZhY3REZXNjcmlwdG9yKGtleSwgbG9jYXRpb24pOwotCQkJCQkJYWRkUHJvcGVydGllcygoQXJ0aWZhY3REZXNjcmlwdG9yKSBhZCwgbG9jYXRpb24sIGluZm8pOwotCQkJCQkJSUFydGlmYWN0UmVwb3NpdG9yeSBkZXN0aW5hdGlvbiA9IGluZm8uZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KCk7Ci0JCQkJCQkvLyBkb24ndCBjb25zaWRlciBhbnkgYWR2aWNlIGhlcmUgYXMgd2Ugd2FudCB0byBrbm93IGFib3V0IHRoZSByZWFsIGZvcm0gb24gZGlzawotCQkJCQkJYm9vbGVhbiBpc0RpciA9IGlzRGlyKGJkLCBpbmZvKTsKLQkJCQkJCS8vIGlmIHRoZSBhcnRpZmFjdCBpcyBhIGRpciBhbmQgd2UgYXJlIG5vdCBkb2luZyAiQVNfSVMiLCB6aXAgaXQgdXAuCi0JCQkJCQlpZiAoaXNEaXIgJiYgISgoaW5mby5nZXRBcnRpZmFjdE9wdGlvbnMoKSAmIElQdWJsaXNoZXJJbmZvLkFfQVNfSVMpID4gMCkpCi0JCQkJCQkJcHVibGlzaEFydGlmYWN0KGFkLCBuZXcgRmlsZShiZC5nZXRMb2NhdGlvbigpKSwgbmV3IEZpbGUoYmQuZ2V0TG9jYXRpb24oKSkubGlzdEZpbGVzKCksIGluZm8sIElOQ0xVREVfUk9PVCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcHVibGlzaEFydGlmYWN0KGFkLCBuZXcgRmlsZShiZC5nZXRMb2NhdGlvbigpKSwgbmV3IEZpbGVbXSB7bmV3IEZpbGUoYmQuZ2V0TG9jYXRpb24oKSl9LCBpbmZvLCBBU19JUyB8IElOQ0xVREVfUk9PVCk7Ci0JCQkJCQlJSW5zdGFsbGFibGVVbml0IGJ1bmRsZUlVID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlQnVuZGxlSVUoYmQsIGJ1bmRsZU1hbmlmZXN0LCBpc0Rpciwga2V5KTsKLQotCQkJCQkJaWYgKGlzRnJhZ21lbnQoYmQpKSB7Ci0JCQkJCQkJLy8gVE9ETzogQ2FuIE5MIGZyYWdtZW50cyBiZSBtdWx0aS1ob3N0PyAgV2hhdCBzcGVjaWFsIGhhbmRsaW5nCi0JCQkJCQkJLy8JCSBpcyByZXF1aXJlZCBmb3IgbXVsdGktaG9zdCBmcmFnbWVudHMgaW4gZ2VuZXJhbD8KLQkJCQkJCQlTdHJpbmcgaG9zdElkID0gYmQuZ2V0SG9zdCgpLmdldE5hbWUoKTsKLQkJCQkJCQlTdHJpbmcgaG9zdEtleSA9IG1ha2VTaW1wbGVLZXkoaG9zdElkKTsKLQkJCQkJCQlTdHJpbmdbXSBjYWNoZWRWYWx1ZXMgPSAoU3RyaW5nW10pIGJ1bmRsZUxvY2FsaXphdGlvbk1hcC5nZXQoaG9zdEtleSk7Ci0KLQkJCQkJCQlpZiAoY2FjaGVkVmFsdWVzICE9IG51bGwpIHsKLQkJCQkJCQkJTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlSG9zdExvY2FsaXphdGlvbkZyYWdtZW50KGJ1bmRsZUlVLCBiZCwgaG9zdElkLCBjYWNoZWRWYWx1ZXMsIGxvY2FsaXphdGlvbklVcyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlyZXN1bHQuYWRkSVUoYnVuZGxlSVUsIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0JCQkJCQlyZXN1bHQuYWRkSVVzKGxvY2FsaXphdGlvbklVcywgSVB1Ymxpc2hlclJlc3VsdC5OT05fUk9PVCk7Ci0JCQkJCQlsb2NhbGl6YXRpb25JVXMuY2xlYXIoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFkZCBhbGwgb2YgdGhlIGFkdmljZSBmb3IgdGhlIGJ1bmRsZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24gdG8gdGhlIGdpdmVuIGRlc2NyaXB0b3IuCi0JICogQHBhcmFtIGRlc2NyaXB0b3IgdGhlIGRlc2NyaXB0b3IgdG8gZGVjb3JhdGUKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBidW5kbGUKLQkgKiBAcGFyYW0gaW5mbyB0aGUgcHVibGlzaGVyIGluZm8gc3VwcGx5aW5nIHRoZSBhZHZpY2UKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUHJvcGVydGllcyhBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwgRmlsZSBsb2NhdGlvbiwgSVB1Ymxpc2hlckluZm8gaW5mbykgewotCQlDb2xsZWN0aW9uIGFkdmljZSA9IGluZm8uZ2V0QWR2aWNlKG51bGwsIGZhbHNlLCBudWxsLCBudWxsLCBJQnVuZGxlQWR2aWNlLmNsYXNzKTsKLQkJZm9yIChJdGVyYXRvciBpID0gYWR2aWNlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJSUJ1bmRsZUFkdmljZSBlbnRyeSA9IChJQnVuZGxlQWR2aWNlKSBpLm5leHQoKTsKLQkJCVByb3BlcnRpZXMgcHJvcHMgPSBlbnRyeS5nZXRQcm9wZXJ0aWVzKGxvY2F0aW9uKTsKLQkJCWlmIChwcm9wcyA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJZm9yIChJdGVyYXRvciBqID0gcHJvcHMua2V5U2V0KCkuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7Ci0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGoubmV4dCgpOwotCQkJCWRlc2NyaXB0b3Iuc2V0UmVwb3NpdG9yeVByb3BlcnR5KGtleSwgcHJvcHMuZ2V0UHJvcGVydHkoa2V5KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEaXIoQnVuZGxlRGVzY3JpcHRpb24gYnVuZGxlLCBJUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCUNvbGxlY3Rpb24gYWR2aWNlID0gaW5mby5nZXRBZHZpY2UobnVsbCwgdHJ1ZSwgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLCBidW5kbGUuZ2V0VmVyc2lvbigpLCBJQnVuZGxlU2hhcGVBZHZpY2UuY2xhc3MpOwotCQkvLyBpZiB0aGUgYWR2aWNlIGhhcyBhIHNoYXBlLCB1c2UgaXQKLQkJaWYgKGFkdmljZSAhPSBudWxsICYmICFhZHZpY2UuaXNFbXB0eSgpKSB7Ci0JCQkvLyB3ZSBrbm93IHRoZXJlIGlzIHNvbWUgYWR2aWNlIGJ1dCBpZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lLCB0YWtlIHRoZSBmaXJzdC4KLQkJCVN0cmluZyBzaGFwZSA9ICgoSUJ1bmRsZVNoYXBlQWR2aWNlKSBhZHZpY2UuaXRlcmF0b3IoKS5uZXh0KCkpLmdldFNoYXBlKCk7Ci0JCQlpZiAoc2hhcGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gc2hhcGUuZXF1YWxzKElCdW5kbGVTaGFwZUFkdmljZS5ESVIpOwotCQl9Ci0JCS8vIG90aGVyd2lzZSBnbyB3aXRoIHdoYXRldmVyIHdlIGZpZ3VyZWQgb3V0IGZyb20gdGhlIG1hbmlmZXN0IG9yIHRoZSBzaGFwZSBvbiBkaXNrCi0JCU1hcCBtYW5pZmVzdCA9IChNYXApIGJ1bmRsZS5nZXRVc2VyT2JqZWN0KCk7Ci0JCVN0cmluZyBmb3JtYXQgPSAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5LkJVTkRMRV9TSEFQRSk7Ci0JCXJldHVybiBCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkuRElSLmVxdWFscyhmb3JtYXQpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIG1ha2VTaW1wbGVLZXkoQnVuZGxlRGVzY3JpcHRpb24gYmQpIHsKLQkJLy8gVE9ETzogY2FuJ3QgdXNlIHRoZSBidW5kbGUgdmVyc2lvbiBpbiB0aGUga2V5IGZvciB0aGUgQnVuZGxlTG9jYWxpemF0aW9uCi0JCS8vCQkgcHJvcGVydHkgbWFwIHNpbmNlIHRoZSBob3N0IHNwZWNpZmljYXRpb24gZm9yIGEgZnJhZ21lbnQgaGFzIGEKLQkJLy8JCSB2ZXJzaW9uIHJhbmdlLCBub3QgYSB2ZXJzaW9uLiBIZW5jZSwgdGhpcyBtZWNoYW5pc20gZm9yIGZpbmRpbmcKLQkJLy8gCQkgbWFuaWZlc3QgbG9jYWxpemF0aW9uIHByb3BlcnR5IGZpbGVzIG1heSBicmVhayB1bmRlciBjaGFuZ2VzCi0JCS8vCQkgdG8gdGhlIEJ1bmRsZUxvY2FsaXphdGlvbiBwcm9wZXJ0eSBvZiBhIGJ1bmRsZS4KLQkJcmV0dXJuIG1ha2VTaW1wbGVLZXkoYmQuZ2V0U3ltYm9saWNOYW1lKCkgLyosIGJkLmdldFZlcnNpb24oKSAqLyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgbWFrZVNpbXBsZUtleShTdHJpbmcgaWQgLyosIFZlcnNpb24gdmVyc2lvbiAqLykgewotCQlyZXR1cm4gaWQ7IC8vICsgJ18nICsgdmVyc2lvbi50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50KEJ1bmRsZURlc2NyaXB0aW9uIGJkKSB7Ci0JCXJldHVybiAoYmQuZ2V0SG9zdCgpICE9IG51bGwgPyB0cnVlIDogZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBCdW5kbGVEZXNjcmlwdGlvbltdIGdldEJ1bmRsZURlc2NyaXB0aW9ucyhGaWxlW10gYnVuZGxlTG9jYXRpb25zKSB7Ci0JCWlmIChidW5kbGVMb2NhdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQnVuZGxlRGVzY3JpcHRpb25bMF07Ci0JCWJvb2xlYW4gYWRkU2ltcGxlQ29uZmlndXJhdG9yID0gZmFsc2U7Ci0JCWJvb2xlYW4gc2NJbiA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZUxvY2F0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFhZGRTaW1wbGVDb25maWd1cmF0b3IpCi0JCQkJYWRkU2ltcGxlQ29uZmlndXJhdG9yID0gYnVuZGxlTG9jYXRpb25zW2ldLnRvU3RyaW5nKCkuaW5kZXhPZihPUkdfRUNMSVBTRV9VUERBVEVfQ09ORklHVVJBVE9SKSA+IDA7Ci0JCQlpZiAoIXNjSW4pIHsKLQkJCQlzY0luID0gYnVuZGxlTG9jYXRpb25zW2ldLnRvU3RyaW5nKCkuaW5kZXhPZihPUkdfRUNMSVBTRV9FUVVJTk9YX1NJTVBMRUNPTkZJR1VSQVRPUikgPiAwOwotCQkJCWlmIChzY0luKQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoc2NJbikKLQkJCWFkZFNpbXBsZUNvbmZpZ3VyYXRvciA9IGZhbHNlOwotCQlCdW5kbGVEZXNjcmlwdGlvbltdIHJlc3VsdCA9IG5ldyBCdW5kbGVEZXNjcmlwdGlvbltidW5kbGVMb2NhdGlvbnMubGVuZ3RoICsgKGFkZFNpbXBsZUNvbmZpZ3VyYXRvciA/IDEgOiAwKV07Ci0JCUJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeSBmYWN0b3J5ID0gZ2V0QnVuZGxlRmFjdG9yeSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZUxvY2F0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJcmVzdWx0W2ldID0gZmFjdG9yeS5nZXRCdW5kbGVEZXNjcmlwdGlvbihidW5kbGVMb2NhdGlvbnNbaV0pOwotCQl9Ci0JCWlmIChhZGRTaW1wbGVDb25maWd1cmF0b3IpIHsKLQkJCS8vIEFkZCBzaW1wbGUgY29uZmlndXJhdG9yIHRvIHRoZSBsaXN0IG9mIGJ1bmRsZXMKLQkJCXRyeSB7Ci0JCQkJVVJMIGNvbmZpZ3VyYXRvclVSTCA9IEZpbGVMb2NhdG9yLnRvRmlsZVVSTChBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KE9SR19FQ0xJUFNFX0VRVUlOT1hfU0lNUExFQ09ORklHVVJBVE9SICsgIi5qYXIiKSk7Ci0JCQkJaWYgKGNvbmZpZ3VyYXRvclVSTCA9PSBudWxsKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBmaW5kIHNpbXBsZWNvbmZpZ3VyYXRvciBidW5kbGUiKTsKLQkJCQllbHNlIHsKLQkJCQkJRmlsZSBsb2NhdGlvbiA9IG5ldyBGaWxlKGNvbmZpZ3VyYXRvclVSTC5nZXRGaWxlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJlc3VsdFtyZXN1bHQubGVuZ3RoIC0gMV0gPSBmYWN0b3J5LmdldEJ1bmRsZURlc2NyaXB0aW9uKGxvY2F0aW9uKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkgZ2V0QnVuZGxlRmFjdG9yeSgpIHsKLQkJcmV0dXJuIG5ldyBCdW5kbGVEZXNjcmlwdGlvbkZhY3Rvcnkoc3RhdGVPYmplY3RGYWN0b3J5LCBudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQ29uZmlnQWR2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0NvbmZpZ0FkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWE5ZWI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvQ29uZmlnQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5Db25maWdEYXRhOwotCi1wdWJsaWMgY2xhc3MgQ29uZmlnQWR2aWNlIGV4dGVuZHMgQWJzdHJhY3RBZHZpY2UgaW1wbGVtZW50cyBJQ29uZmlnQWR2aWNlIHsKLQotCXByaXZhdGUgQ29uZmlnRGF0YSBkYXRhOwotCXByaXZhdGUgU3RyaW5nIGNvbmZpZ1NwZWM7Ci0KLQlwdWJsaWMgQ29uZmlnQWR2aWNlKENvbmZpZ0RhdGEgZGF0YSwgU3RyaW5nIGNvbmZpZ1NwZWMpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJdGhpcy5jb25maWdTcGVjID0gY29uZmlnU3BlYzsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlSW5mb1tdIGdldEJ1bmRsZXMoKSB7Ci0JCXJldHVybiBkYXRhLmdldEJ1bmRsZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ1NwZWMoKSB7Ci0JCXJldHVybiBjb25maWdTcGVjOwotCX0KLQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJcmVzdWx0LnB1dEFsbChkYXRhLmdldEZ3RGVwZW5kZW50UHJvcHMoKSk7Ci0JCXJlc3VsdC5wdXRBbGwoZGF0YS5nZXRGd0luZGVwZW5kZW50UHJvcHMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0NvbmZpZ0NVc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Db25maWdDVXNBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI1ZjRiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0NvbmZpZ0NVc0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTWFuaWZlc3RFbGVtZW50OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotCi0vKioKLSAqIFB1Ymxpc2ggQ1VzIGZvciBhbGwgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBpbiB0aGUgY3VycmVudCByZXN1bHQuCi0gKiBUaGlzIGFkZHMgY29uZmlnLXNwZWNpZmljIENVcyB0byBjYXB0dXJlIHN0YXJ0IGxldmVscyBldGMgZm91bmQgaW4gdGhlIGNvbmZpZy5pbmkKLSAqIGV0YyBmb3IgaXMgb3MsIHdzLCBhcmNoIGNvbWJpbmF0aW9uIHNlZW4gc28gZmFyLgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnQ1VzQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19FQ0xJUFNFX1VQREFURV9DT05GSUdVUkFUT1IgPSAib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIHZlcnNpb247Ci0JcHJvdGVjdGVkIFN0cmluZyBpZDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZsYXZvcjsKLQotCXB1YmxpYyBDb25maWdDVXNBY3Rpb24oSVB1Ymxpc2hlckluZm8gaW5mbywgU3RyaW5nIGZsYXZvciwgU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbikgewotCQl0aGlzLmZsYXZvciA9IGZsYXZvcjsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHBlcmZvcm0oSVB1Ymxpc2hlckluZm8gaW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCS8vIGdlbmVyYXRpb24gZnJvbSByZW1lbWJlcmVkIGNvbmZpZy5pbmkncwotCQkvLyB3ZSBoYXZlIE4gcGxhdGZvcm1zLCBnZW5lcmF0ZSBhIENVIGZvciBlYWNoCi0JCS8vIFRPRE8gdHJ5IGFuZCBmaW5kIGNvbW1vbiBwcm9wZXJ0aWVzIGFjcm9zcyBwbGF0Zm9ybXMKLQkJU3RyaW5nW10gY29uZmlnU3BlY3MgPSBpbmZvLmdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnU3BlY3MubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBjb25maWdTcGVjID0gY29uZmlnU3BlY3NbaV07Ci0JCQlDb2xsZWN0aW9uIGNvbmZpZ0FkdmljZSA9IGluZm8uZ2V0QWR2aWNlKGNvbmZpZ1NwZWMsIGZhbHNlLCBudWxsLCBudWxsLCBJQ29uZmlnQWR2aWNlLmNsYXNzKTsKLQkJCUJ1bmRsZUluZm9bXSBidW5kbGVzID0gZmlsbEluQnVuZGxlcyhjb25maWdBZHZpY2UsIHJlc3VsdHMpOwotCQkJZ2VuZXJhdGVCdW5kbGVDb25maWdJVXMoaW5mbywgYnVuZGxlcywgY29uZmlnU3BlYywgcmVzdWx0cyk7Ci0KLQkJCUNvbGxlY3Rpb24gbGF1bmNoaW5nQWR2aWNlID0gaW5mby5nZXRBZHZpY2UoY29uZmlnU3BlYywgZmFsc2UsIG51bGwsIG51bGwsIElMYXVuY2hpbmdBZHZpY2UuY2xhc3MpOwotCQkJcHVibGlzaEluaUlVcyhjb25maWdBZHZpY2UsIGxhdW5jaGluZ0FkdmljZSwgcmVzdWx0cywgY29uZmlnU3BlYyk7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLy8gdGhlcmUgc2VlbSB0byBiZSBjYXNlcyB3aGVyZSB0aGUgYnVuZGxlIGluZm9zIGFyZSBub3QgZmlsbGVkIGluIHdpdGggc3ltYm9saWMgbmFtZSBhbmQgdmVyc2lvbi4KLQkvLyBmaWxsIGluIHRoZSBtaXNzaW5nIGRhdGEuCi0JcHJpdmF0ZSBCdW5kbGVJbmZvW10gZmlsbEluQnVuZGxlcyhDb2xsZWN0aW9uIGNvbmZpZ0FkdmljZSwgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaiA9IGNvbmZpZ0FkdmljZS5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKLQkJCUlDb25maWdBZHZpY2UgYWR2aWNlID0gKElDb25maWdBZHZpY2UpIGoubmV4dCgpOwotCQkJQnVuZGxlSW5mb1tdIGJ1bmRsZXMgPSBhZHZpY2UuZ2V0QnVuZGxlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJQnVuZGxlSW5mbyBidW5kbGVJbmZvID0gYnVuZGxlc1tpXTsKLQkJCQkvLyBwcmltZSB0aGUgcmVzdWx0IHdpdGggdGhlIGN1cnJlbnQgaW5mby4gIFRoaXMgd2lsbCBiZSByZXBsYWNlZCBpZiB0aGVyZSBpcyBtb3JlIGluZm8uLi4KLQkJCQlpZiAoKGJ1bmRsZUluZm8uZ2V0U3ltYm9saWNOYW1lKCkgIT0gbnVsbCAmJiBidW5kbGVJbmZvLmdldFZlcnNpb24oKSAhPSBudWxsKSB8fCBidW5kbGVJbmZvLmdldExvY2F0aW9uKCkgPT0gbnVsbCkKLQkJCQkJcmVzdWx0LmFkZChidW5kbGVzW2ldKTsKLQkJCQllbHNlIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUZpbGUgbG9jYXRpb24gPSBuZXcgRmlsZShuZXcgVVJMKGJ1bmRsZUluZm8uZ2V0TG9jYXRpb24oKSkuZ2V0UGF0aCgpKTsKLQkJCQkJCURpY3Rpb25hcnkgbWFuaWZlc3QgPSBCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkubG9hZE1hbmlmZXN0KGxvY2F0aW9uKTsKLQkJCQkJCWlmIChtYW5pZmVzdCA9PSBudWxsKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJR2VuZXJhdG9yQnVuZGxlSW5mbyBuZXdJbmZvID0gbmV3IEdlbmVyYXRvckJ1bmRsZUluZm8oYnVuZGxlSW5mbyk7Ci0JCQkJCQlNYW5pZmVzdEVsZW1lbnRbXSBlbGVtZW50ID0gTWFuaWZlc3RFbGVtZW50LnBhcnNlSGVhZGVyKCJkdW1teS1ic24iLCAoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJbmV3SW5mby5zZXRTeW1ib2xpY05hbWUoZWxlbWVudFswXS5nZXRWYWx1ZSgpKTsKLQkJCQkJCW5ld0luZm8uc2V0VmVyc2lvbigoU3RyaW5nKSBtYW5pZmVzdC5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKSk7Ci0JCQkJCQlyZXN1bHQuYWRkKG5ld0luZm8pOwotCQkJCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKEJ1bmRsZUluZm9bXSkgcmVzdWx0LnRvQXJyYXkobmV3IEJ1bmRsZUluZm9bcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBwdWJsaXNoSW5pSVVzKENvbGxlY3Rpb24gY29uZmlnQWR2aWNlLCBDb2xsZWN0aW9uIGxhdW5jaGluZ0FkdmljZSwgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzLCBTdHJpbmcgY29uZmlnU3BlYykgewotCQlpZiAoY29uZmlnQWR2aWNlLmlzRW1wdHkoKSAmJiBsYXVuY2hpbmdBZHZpY2UuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBjb25maWd1cmVEYXRhID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHVuY29uZmlndXJlRGF0YSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKCFjb25maWdBZHZpY2UuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdbXSBkYXRhU3RyaW5ncyA9IGdldENvbmZpZ3VyYXRpb25TdHJpbmdzKGNvbmZpZ0FkdmljZSk7Ci0JCQljb25maWd1cmVEYXRhICs9IGRhdGFTdHJpbmdzWzBdOwotCQkJdW5jb25maWd1cmVEYXRhICs9IGRhdGFTdHJpbmdzWzFdOwotCQl9Ci0KLQkJaWYgKCFsYXVuY2hpbmdBZHZpY2UuaXNFbXB0eSgpKSB7Ci0JCQlTdHJpbmdbXSBkYXRhU3RyaW5ncyA9IGdldExhdW5jaGVyQ29uZmlnU3RyaW5ncyhsYXVuY2hpbmdBZHZpY2UpOwotCQkJY29uZmlndXJlRGF0YSArPSBkYXRhU3RyaW5nc1swXTsKLQkJCXVuY29uZmlndXJlRGF0YSArPSBkYXRhU3RyaW5nc1sxXTsKLQkJfQotCi0JCS8vIGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gY29uZmlndXJlIG9yIHVuY29uZmlndXJlLCB0aGVuIGRvbid0IGV2ZW4gYm90aGVyIGdlbmVyYXRpbmcgdGhpcyBJVQotCQlpZiAoY29uZmlndXJlRGF0YS5sZW5ndGgoKSA9PSAwICYmIHVuY29uZmlndXJlRGF0YS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXRvdWNocG9pbnREYXRhLnB1dCgiY29uZmlndXJlIiwgY29uZmlndXJlRGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJdG91Y2hwb2ludERhdGEucHV0KCJ1bmNvbmZpZ3VyZSIsIHVuY29uZmlndXJlRGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJSUluc3RhbGxhYmxlVW5pdCBjdSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUlVRnJhZ21lbnQoaWQsIHZlcnNpb24sIGZsYXZvciwgY29uZmlnU3BlYywgdG91Y2hwb2ludERhdGEpOwotCQlyZXN1bHRzLmFkZElVKGN1LCBJUHVibGlzaGVyUmVzdWx0LlJPT1QpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRDb25maWd1cmF0aW9uU3RyaW5ncyhDb2xsZWN0aW9uIGNvbmZpZ0FkdmljZSkgewotCQlTdHJpbmcgY29uZmlndXJhdGlvbkRhdGEgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdW5jb25maWd1cmF0aW9uRGF0YSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoSXRlcmF0b3IgaSA9IGNvbmZpZ0FkdmljZS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUlDb25maWdBZHZpY2UgYWR2aWNlID0gKElDb25maWdBZHZpY2UpIGkubmV4dCgpOwotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFkdmljZS5nZXRQcm9wZXJ0aWVzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJRW50cnkgYVByb3BlcnR5ID0gKEVudHJ5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJU3RyaW5nIGtleSA9ICgoU3RyaW5nKSBhUHJvcGVydHkuZ2V0S2V5KCkpOwotCQkJCWlmIChrZXkuZXF1YWxzKCJvc2dpLmZyYW1ld29ya0NsYXNzUGF0aCIpIHx8IGtleS5lcXVhbHMoIm9zZ2kuZnJhbWV3b3JrIikgfHwga2V5LmVxdWFscygib3NnaS5idW5kbGVzIikgfHwga2V5LmVxdWFscygiZW9mIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJY29udGludWU7Ci0JCQkJY29uZmlndXJhdGlvbkRhdGEgKz0gInNldFByb2dyYW1Qcm9wZXJ0eShwcm9wTmFtZToiICsga2V5ICsgIiwgcHJvcFZhbHVlOiIgKyAoKFN0cmluZykgYVByb3BlcnR5LmdldFZhbHVlKCkpICsgIik7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl1bmNvbmZpZ3VyYXRpb25EYXRhICs9ICJzZXRQcm9ncmFtUHJvcGVydHkocHJvcE5hbWU6IiArIGtleSArICIsIHByb3BWYWx1ZTopOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU3RyaW5nW10ge2NvbmZpZ3VyYXRpb25EYXRhLCB1bmNvbmZpZ3VyYXRpb25EYXRhfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0TGF1bmNoZXJDb25maWdTdHJpbmdzKENvbGxlY3Rpb24gbGF1bmNoaW5nQWR2aWNlKSB7Ci0JCVN0cmluZyBjb25maWd1cmF0aW9uRGF0YSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB1bmNvbmZpZ3VyYXRpb25EYXRhID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlmb3IgKEl0ZXJhdG9yIGogPSBsYXVuY2hpbmdBZHZpY2UuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7Ci0JCQlJTGF1bmNoaW5nQWR2aWNlIGFkdmljZSA9IChJTGF1bmNoaW5nQWR2aWNlKSBqLm5leHQoKTsKLQkJCVN0cmluZ1tdIGp2bUFyZ3MgPSBhZHZpY2UuZ2V0Vk1Bcmd1bWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwganZtQXJncy5sZW5ndGg7IGkrKykgewotCQkJCWNvbmZpZ3VyYXRpb25EYXRhICs9ICJhZGRKdm1BcmcoanZtQXJnOiIgKyBqdm1BcmdzW2ldICsgIik7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJdW5jb25maWd1cmF0aW9uRGF0YSArPSAicmVtb3ZlSnZtQXJnKGp2bUFyZzoiICsganZtQXJnc1tpXSArICIpOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJU3RyaW5nW10gcHJvZ3JhbUFyZ3MgPSBhZHZpY2UuZ2V0UHJvZ3JhbUFyZ3VtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9ncmFtQXJncy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBwcm9ncmFtQXJnID0gcHJvZ3JhbUFyZ3NbaV07Ci0JCQkJaWYgKHByb2dyYW1BcmcuZXF1YWxzKCItLWxhdW5jaGVyLmxpYnJhcnkiKSB8fCBwcm9ncmFtQXJnLmVxdWFscygiLXN0YXJ0dXAiKSB8fCBwcm9ncmFtQXJnLmVxdWFscygiLWNvbmZpZ3VyYXRpb24iKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJaSsrOwotCQkJCWNvbmZpZ3VyYXRpb25EYXRhICs9ICJhZGRQcm9ncmFtQXJnKHByb2dyYW1Bcmc6IiArIHByb2dyYW1BcmcgKyAiKTsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl1bmNvbmZpZ3VyYXRpb25EYXRhICs9ICJyZW1vdmVQcm9ncmFtQXJnKHByb2dyYW1Bcmc6IiArIHByb2dyYW1BcmcgKyAiKTsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFN0cmluZ1tdIHtjb25maWd1cmF0aW9uRGF0YSwgdW5jb25maWd1cmF0aW9uRGF0YX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVCdW5kbGVDb25maWdJVXMoSVB1Ymxpc2hlckluZm8gaW5mbywgQnVuZGxlSW5mb1tdIGJ1bmRsZXMsIFN0cmluZyBjb25maWdTcGVjLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdCkgewotCQlpZiAoYnVuZGxlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBjdUlkUHJlZml4ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGZpbHRlciA9IG51bGw7Ci0JCWlmIChjb25maWdTcGVjICE9IG51bGwpIHsKLQkJCWN1SWRQcmVmaXggPSBjcmVhdGVJZFN0cmluZyhjb25maWdTcGVjKTsKLQkJCWZpbHRlciA9IGNyZWF0ZUZpbHRlclNwZWMoY29uZmlnU3BlYyk7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCUdlbmVyYXRvckJ1bmRsZUluZm8gYnVuZGxlID0gY3JlYXRlR2VuZXJhdG9yQnVuZGxlSW5mbyhpbmZvLCBidW5kbGVzW2ldLCByZXN1bHQpOwotCQkJaWYgKGJ1bmRsZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAoYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLmVxdWFscyhPUkdfRUNMSVBTRV9VUERBVEVfQ09ORklHVVJBVE9SKSkgewotCQkJCWJ1bmRsZS5zZXRTdGFydExldmVsKEJ1bmRsZUluZm8uTk9fTEVWRUwpOwotCQkJCWJ1bmRsZS5zZXRNYXJrZWRBc1N0YXJ0ZWQoZmFsc2UpOwotCQkJCWJ1bmRsZS5zZXRTcGVjaWFsQ29uZmlnQ29tbWFuZHMoInNldFByb2dyYW1Qcm9wZXJ0eShwcm9wTmFtZTpvcmcuZWNsaXBzZS51cGRhdGUucmVjb25jaWxlLCBwcm9wVmFsdWU6ZmFsc2UpOyIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnVuZGxlLnNldFNwZWNpYWxVbmNvbmZpZ0NvbW1hbmRzKCJzZXRQcm9ncmFtUHJvcGVydHkocHJvcE5hbWU6b3JnLmVjbGlwc2UudXBkYXRlLnJlY29uY2lsZSwgcHJvcFZhbHVlOik7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSBpZiAoYnVuZGxlLmdldFN0YXJ0TGV2ZWwoKSA9PSBCdW5kbGVJbmZvLk5PX0xFVkVMICYmICFidW5kbGUuaXNNYXJrZWRBc1N0YXJ0ZWQoKSkgewotCQkJCS8vIHRoaXMgYnVuZGxlIGRvZXMgbm90IHJlcXVpcmUgYW55IHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbiwgdGhlIHBsdWctaW4gZGVmYXVsdCBJVSB3aWxsIGhhbmRsZSBpbnN0YWxsaW5nIGl0Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCUlJbnN0YWxsYWJsZVVuaXQgY3UgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVCdW5kbGVDb25maWd1cmF0aW9uVW5pdChidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCksIG5ldyBWZXJzaW9uKGJ1bmRsZS5nZXRWZXJzaW9uKCkpLCBmYWxzZSwgYnVuZGxlLCBmbGF2b3IgKyBjdUlkUHJlZml4LCBmaWx0ZXIpOwotCQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCQkvLyBQcm9kdWN0IFF1ZXJ5IHdpbGwgcnVuIGFnYWluc3QgdGhlIHJlcG8sIG1ha2Ugc3VyZSB0aGVzZSBDVXMgYXJlIGluIGJlZm9yZSB0aGVuCi0JCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSBtZXRhZGF0YVJlcG9zaXRvcnkgPSBpbmZvLmdldE1ldGFkYXRhUmVwb3NpdG9yeSgpOwotCQkJCWlmIChtZXRhZGF0YVJlcG9zaXRvcnkgIT0gbnVsbCkgewotCQkJCQltZXRhZGF0YVJlcG9zaXRvcnkuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtjdX0pOwotCQkJCX0KLQkJCQlyZXN1bHQuYWRkSVUoY3UsIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgR2VuZXJhdG9yQnVuZGxlSW5mbyBjcmVhdGVHZW5lcmF0b3JCdW5kbGVJbmZvKElQdWJsaXNoZXJJbmZvIGluZm8sIEJ1bmRsZUluZm8gYnVuZGxlSW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHQpIHsKLQkJaWYgKGJ1bmRsZUluZm8uZ2V0TG9jYXRpb24oKSAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBHZW5lcmF0b3JCdW5kbGVJbmZvKGJ1bmRsZUluZm8pOwotCi0JCVN0cmluZyBuYW1lID0gYnVuZGxlSW5mby5nZXRTeW1ib2xpY05hbWUoKTsKLQotCQkvL2Vhc3kgY2FzZTogZG8gd2UgaGF2ZSBhIG1hdGNoaW5nIElVPwotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gcmVzdWx0LmdldElVKG5hbWUsIG51bGwpOwotCQlpZiAoaXUgIT0gbnVsbCkgewotCQkJYnVuZGxlSW5mby5zZXRWZXJzaW9uKGl1LmdldFZlcnNpb24oKS50b1N0cmluZygpKTsKLQkJCXJldHVybiBuZXcgR2VuZXJhdG9yQnVuZGxlSW5mbyhidW5kbGVJbmZvKTsKLQkJfQotCi0JCS8vaGFyZGVyOiB0cnkgaWRfdmVyc2lvbgotCQlpbnQgaSA9IG5hbWUuaW5kZXhPZignXycpOwotCQl3aGlsZSAoaSA+IC0xKSB7Ci0JCQlWZXJzaW9uIHZlcnNpb24gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQl2ZXJzaW9uID0gbmV3IFZlcnNpb24obmFtZS5zdWJzdHJpbmcoaSkpOwotCQkJCWJ1bmRsZUluZm8uc2V0U3ltYm9saWNOYW1lKG5hbWUuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCQlidW5kbGVJbmZvLnNldFZlcnNpb24odmVyc2lvbi50b1N0cmluZygpKTsKLQkJCQlyZXR1cm4gbmV3IEdlbmVyYXRvckJ1bmRsZUluZm8oYnVuZGxlSW5mbyk7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vIHRoZSAnXycgZm91bmQgd2FzIHByb2JhYmx5IHBhcnQgb2YgdGhlIHN5bWJvbGljIGlkCi0JCQkJaSA9IG5hbWUuaW5kZXhPZignXycsIGkpOwotCQkJfQotCQl9Ci0KLQkJLy9RdWVyeSB0aGUgcmVwbwotCQlRdWVyeSBxdWVyeSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShuYW1lKTsKLQkJQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBDb2xsZWN0b3IoKTsKLQkJSXRlcmF0b3IgbWF0Y2hlcyA9IGluZm8uZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KCkucXVlcnkocXVlcnksIGNvbGxlY3RvciwgbnVsbCkuaXRlcmF0b3IoKTsKLQkJLy9waWNrIHRoZSBuZXdlc3QgbWF0Y2gKLQkJSUluc3RhbGxhYmxlVW5pdCBuZXdlc3QgPSBudWxsOwotCQl3aGlsZSAobWF0Y2hlcy5oYXNOZXh0KCkpIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgY2FuZGlkYXRlID0gKElJbnN0YWxsYWJsZVVuaXQpIG1hdGNoZXMubmV4dCgpOwotCQkJaWYgKG5ld2VzdCA9PSBudWxsIHx8IChuZXdlc3QuZ2V0VmVyc2lvbigpLmNvbXBhcmVUbyhjYW5kaWRhdGUuZ2V0VmVyc2lvbigpKSA8IDApKQotCQkJCW5ld2VzdCA9IGNhbmRpZGF0ZTsKLQkJfQotCQlpZiAobmV3ZXN0ICE9IG51bGwpIHsKLQkJCWJ1bmRsZUluZm8uc2V0VmVyc2lvbihuZXdlc3QuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCkpOwotCQkJcmV0dXJuIG5ldyBHZW5lcmF0b3JCdW5kbGVJbmZvKGJ1bmRsZUluZm8pOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0RhdGFMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRGF0YUxvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmNkOGNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRGF0YUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuZnJhbWV3b3JrYWRtaW4uZXF1aW5veC5FcXVpbm94RndDb25maWdGaWxlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5QYWNrYWdlQWRtaW47Ci0KLXB1YmxpYyBjbGFzcyBEYXRhTG9hZGVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBGSUxURVJfT0JKRUNUQ0xBU1MgPSAiKCIgKyBDb25zdGFudHMuT0JKRUNUQ0xBU1MgKyAiPSIgKyBGcmFtZXdvcmtBZG1pbi5jbGFzcy5nZXROYW1lKCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGZpbHRlckZ3TmFtZSA9ICIoIiArIEZyYW1ld29ya0FkbWluLlNFUlZJQ0VfUFJPUF9LRVlfRldfTkFNRSArICI9RXF1aW5veCkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvL1N0cmluZyBmaWx0ZXJGd1ZlcnNpb24gPSAiKCIgKyBGcmFtZXdvcmtBZG1pbi5TRVJWSUNFX1BST1BfS0VZX0ZXX1ZFUlNJT04gKyAiPSIgKyBwcm9wcy5nZXRQcm9wZXJ0eSgiZXF1aW5veC5mdy52ZXJzaW9uIikgKyAiKSI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGZpbHRlckxhdW5jaGVyTmFtZSA9ICIoIiArIEZyYW1ld29ya0FkbWluLlNFUlZJQ0VfUFJPUF9LRVlfTEFVTkNIRVJfTkFNRSArICI9RWNsaXBzZS5leGUpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLy9TdHJpbmcgZmlsdGVyTGF1bmNoZXJWZXJzaW9uID0gIigiICsgRnJhbWV3b3JrQWRtaW4uU0VSVklDRV9QUk9QX0tFWV9MQVVOQ0hFUl9WRVJTSU9OICsgIj0iICsgcHJvcHMuZ2V0UHJvcGVydHkoImVxdWlub3gubGF1bmNoZXIudmVyc2lvbiIpICsgIikiOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBmcmFtZXdvcmtBZG1pbkZpbGx0ZXIgPSAiKCYiICsgRklMVEVSX09CSkVDVENMQVNTICsgZmlsdGVyRndOYW1lICsgZmlsdGVyTGF1bmNoZXJOYW1lICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9FUVVJTk9YX1NJTVBMRUNPTkZJR1VSQVRPUl9NQU5JUFVMQVRPUiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JHX0VDTElQU0VfRVFVSU5PWF9GUkFNRVdPUktBRE1JTl9FUVVJTk9YID0gIm9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3I7Ci0JcHJpdmF0ZSBGaWxlIGNvbmZpZ3VyYXRpb25Mb2NhdGlvbjsKLQotCXB1YmxpYyBEYXRhTG9hZGVyKEZpbGUgY29uZmlndXJhdGlvbkxvY2F0aW9uLCBGaWxlIGV4ZWN1dGFibGVMb2NhdGlvbikgewotCQl0aGlzLmNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9IGNvbmZpZ3VyYXRpb25Mb2NhdGlvbjsKLQkJaW5pdGlhbGl6ZUZyYW1ld29ya01hbmlwdWxhdG9yKGNvbmZpZ3VyYXRpb25Mb2NhdGlvbi5nZXRQYXJlbnRGaWxlKCksIGV4ZWN1dGFibGVMb2NhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGcmFtZXdvcmtNYW5pcHVsYXRvcihGaWxlIGNvbmZpZywgRmlsZSBleGVjdXRhYmxlKSB7Ci0JCWdldEZyYW1ld29ya01hbmlwdWxhdG9yKCk7Ci0KLQkJTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCQlsYXVuY2hlckRhdGEuc2V0RndQZXJzaXN0ZW50RGF0YUxvY2F0aW9uKGNvbmZpZywgdHJ1ZSk7Ci0JCWxhdW5jaGVyRGF0YS5zZXRMYXVuY2hlcihleGVjdXRhYmxlKTsKLQkJdHJ5IHsKLQkJCW1hbmlwdWxhdG9yLmxvYWQoKTsKLQkJfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUyKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllMi5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIGUyKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllMi5wcmludFN0YWNrVHJhY2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUyLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIENvbmZpZ0RhdGEgZ2V0Q29uZmlnRGF0YSgpIHsKLQkJaWYgKG1hbmlwdWxhdG9yID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlFcXVpbm94RndDb25maWdGaWxlUGFyc2VyIHBhcnNlciA9IG5ldyBFcXVpbm94RndDb25maWdGaWxlUGFyc2VyKEFjdGl2YXRvci5nZXRDb250ZXh0KCkpOwotCQl0cnkgewotCQkJcGFyc2VyLnJlYWRGd0NvbmZpZyhtYW5pcHVsYXRvciwgY29uZmlndXJhdGlvbkxvY2F0aW9uKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpOwotCX0KLQotCXB1YmxpYyBMYXVuY2hlckRhdGEgZ2V0TGF1bmNoZXJEYXRhKCkgewotCQlyZXR1cm4gbWFuaXB1bGF0b3IgPT0gbnVsbCA/IG51bGwgOiBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKTsKLQl9Ci0KLQkvKioKLQkgKiBPYnRhaW5zIHRoZSBmcmFtZXdvcmsgbWFuaXB1bGF0b3IgaW5zdGFuY2UuIFRocm93cyBhbiBleGNlcHRpb24KLQkgKiBpZiBpdCBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZ2V0RnJhbWV3b3JrTWFuaXB1bGF0b3IoKSB7Ci0JCUZyYW1ld29ya0FkbWluIGFkbWluID0gZ2V0RnJhbWV3b3JrQWRtaW4oKTsKLQkJaWYgKGFkbWluID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRnJhbWV3b3JrIGFkbWluIHNlcnZpY2Ugbm90IGZvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaXB1bGF0b3IgPSBhZG1pbi5nZXRNYW5pcHVsYXRvcigpOwotCQlpZiAobWFuaXB1bGF0b3IgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGcmFtZXdvcmsgbWFuaXB1bGF0b3Igbm90IGZvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIEZyYW1ld29ya0FkbWluIGdldEZyYW1ld29ya0FkbWluKCkgewotCQlGcmFtZXdvcmtBZG1pbiBmcmFtZXdvcmtBZG1pbiA9IChGcmFtZXdvcmtBZG1pbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEZyYW1ld29ya0FkbWluLmNsYXNzLmdldE5hbWUoKSwgZnJhbWV3b3JrQWRtaW5GaWxsdGVyKTsKLQkJaWYgKGZyYW1ld29ya0FkbWluID09IG51bGwpIHsKLQkJCXN0YXJ0QnVuZGxlKE9SR19FQ0xJUFNFX0VRVUlOT1hfRlJBTUVXT1JLQURNSU5fRVFVSU5PWCk7Ci0JCQlzdGFydEJ1bmRsZShPUkdfRUNMSVBTRV9FUVVJTk9YX1NJTVBMRUNPTkZJR1VSQVRPUl9NQU5JUFVMQVRPUik7Ci0JCQlmcmFtZXdvcmtBZG1pbiA9IChGcmFtZXdvcmtBZG1pbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEZyYW1ld29ya0FkbWluLmNsYXNzLmdldE5hbWUoKSwgZnJhbWV3b3JrQWRtaW5GaWxsdGVyKTsKLQkJfQotCQlyZXR1cm4gZnJhbWV3b3JrQWRtaW47Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN0YXJ0QnVuZGxlKFN0cmluZyBidW5kbGVJZCkgewotCQlQYWNrYWdlQWRtaW4gcGFja2FnZUFkbWluID0gKFBhY2thZ2VBZG1pbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIFBhY2thZ2VBZG1pbi5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAocGFja2FnZUFkbWluID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQnVuZGxlW10gYnVuZGxlcyA9IHBhY2thZ2VBZG1pbi5nZXRCdW5kbGVzKGJ1bmRsZUlkLCBudWxsKTsKLQkJaWYgKGJ1bmRsZXMgIT0gbnVsbCAmJiBidW5kbGVzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCWlmICgoYnVuZGxlc1swXS5nZXRTdGF0ZSgpICYgQnVuZGxlLlJFU09MVkVEKSA+IDApIHsKLQkJCQkJCWJ1bmRsZXNbMF0uc3RhcnQoKTsKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQl9Ci0JCQkJfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gZmFpbGVkLCB0cnkgbmV4dCBidW5kbGUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRGVmYXVsdENVc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9EZWZhdWx0Q1VzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhOTk2NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9EZWZhdWx0Q1VzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLio7Ci0KLS8qKgotICogUHVibGlzaCBJVXMgdGhhdCBpbnN0YWxsL2NvbmZpZ3VyZSB0aGUgc3RhbmRhcmQgdGhpbmdzIGxpa2UgYnVuZGxlcywgZmVhdHVyZXMgYW5kIHNvdXJjZSBidW5kbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q1VzQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIGZsYXZvcjsKLQlwcml2YXRlIGludCBzdGFydExldmVsOwotCXByaXZhdGUgYm9vbGVhbiBzdGFydDsKLQotCXB1YmxpYyBEZWZhdWx0Q1VzQWN0aW9uKElQdWJsaXNoZXJJbmZvIGluZm8sIFN0cmluZyBmbGF2b3IsIGludCBzdGFydExldmVsLCBib29sZWFuIHN0YXJ0KSB7Ci0JCXRoaXMuZmxhdm9yID0gZmxhdm9yOwotCQl0aGlzLnN0YXJ0TGV2ZWwgPSBzdGFydExldmVsOwotCQl0aGlzLnN0YXJ0ID0gc3RhcnQ7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJZ2VuZXJhdGVEZWZhdWx0Q29uZmlnSVUocmVzdWx0cyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlRGVmYXVsdENvbmZpZ0lVKElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0KSB7Ci0JCS8vCQlUT0RPIHRoaXMgaXMgYSBiaXQgb2YgYSBoYWNrLiAgV2UgbmVlZCB0byBoYXZlIHRoZSBkZWZhdWx0IElVIGZyYWdtZW50IGdlbmVyYXRlZCB3aXRoIGNvZGUgdGhhdCBjb25maWd1cmVzCi0JCS8vCQlhbmQgdW5jb25maWd1cmVzLiAgVGhlIEdlbmVyYXRvciBzaG91bGQgYmUgZGVjb3VwbGVkIGZyb20gYW55IHBhcnRpY3VsYXIgcHJvdmlkZXIgYnV0IGl0IGlzIG5vdCBjbGVhcgotCQkvLwkJdGhhdCB3ZSBzaG91bGQgYWRkIHRoZSBjcmVhdGUqIG1ldGhvZHMgdG8gSUdlbmVyYXRvckluZm8uLi4KLQkJLy8JCU1vY2tCdW5kbGVEZXNjcmlwdGlvbiBiZDEgPSBuZXcgTW9ja0J1bmRsZURlc2NyaXB0aW9uKCJkZWZhdWx0Q29uZmlndXJlIik7Ci0JCS8vCQlNb2NrQnVuZGxlRGVzY3JpcHRpb24gYmQyID0gbmV3IE1vY2tCdW5kbGVEZXNjcmlwdGlvbigiZGVmYXVsdFVuY29uZmlndXJlIik7Ci0JCXJlc3VsdC5hZGRJVShNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVEZWZhdWx0QnVuZGxlQ29uZmlndXJhdGlvblVuaXQoY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25CdW5kbGVJbmZvKCksIGNyZWF0ZURlZmF1bHRVbmNvbmZpZ3VyYXRpb25CdW5kbGVJbmZvKCksIGZsYXZvciksIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0JCXJlc3VsdC5hZGRJVShNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVEZWZhdWx0RmVhdHVyZUNvbmZpZ3VyYXRpb25Vbml0KGZsYXZvciksIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0JCXJlc3VsdC5hZGRJVShNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVEZWZhdWx0Q29uZmlndXJhdGlvblVuaXRGb3JTb3VyY2VCdW5kbGVzKGZsYXZvciksIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0JfQotCi0JcHJvdGVjdGVkIEdlbmVyYXRvckJ1bmRsZUluZm8gY3JlYXRlRGVmYXVsdENvbmZpZ3VyYXRpb25CdW5kbGVJbmZvKCkgewotCQlHZW5lcmF0b3JCdW5kbGVJbmZvIHJlc3VsdCA9IG5ldyBHZW5lcmF0b3JCdW5kbGVJbmZvKCk7Ci0JCXJlc3VsdC5zZXRTeW1ib2xpY05hbWUoImRlZmF1bHRDb25maWd1cmUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuc2V0VmVyc2lvbigiMS4wLjAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuc2V0U3RhcnRMZXZlbChzdGFydExldmVsKTsKLQkJcmVzdWx0LnNldE1hcmtlZEFzU3RhcnRlZChzdGFydCk7Ci0JCS8vIFRoZXNlIHNob3VsZCBqdXN0IGJlIGluIHRoZSBpbnN0YWxsIHNlY3Rpb24gbm93Ci0JCS8vCQlyZXN1bHQuc2V0U3BlY2lhbENvbmZpZ0NvbW1hbmRzKCJpbnN0YWxsQnVuZGxlKGJ1bmRsZToke2FydGlmYWN0fSk7Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEdlbmVyYXRvckJ1bmRsZUluZm8gY3JlYXRlRGVmYXVsdFVuY29uZmlndXJhdGlvbkJ1bmRsZUluZm8oKSB7Ci0JCUdlbmVyYXRvckJ1bmRsZUluZm8gcmVzdWx0ID0gbmV3IEdlbmVyYXRvckJ1bmRsZUluZm8oKTsKLQkJcmVzdWx0LnNldFN5bWJvbGljTmFtZSgiZGVmYXVsdFVuY29uZmlndXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LnNldFZlcnNpb24oIjEuMC4wIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gVGhlc2Ugc2hvdWxkIGp1c3QgYmUgaW4gdGhlIHVuaW5zdGFsbCBzZWN0aW9uIG5vdwotCQkvLwkJcmVzdWx0LnNldFNwZWNpYWxDb25maWdDb21tYW5kcygidW5pbnN0YWxsQnVuZGxlKGJ1bmRsZToke2FydGlmYWN0fSk7Iik7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0VjbGlwc2VJbnN0YWxsQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0VjbGlwc2VJbnN0YWxsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MTBlZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9FY2xpcHNlSW5zdGFsbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLio7Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlSW5zdGFsbEFjdGlvbiBpbXBsZW1lbnRzIElQdWJsaXNoaW5nQWN0aW9uIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIHNvdXJjZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvbiA9ICIxLjAuMCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7Ci0JcHJvdGVjdGVkIFN0cmluZyBmbGF2b3I7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIHRvcExldmVsOwotCXByb3RlY3RlZCBJUHVibGlzaGVySW5mbyBpbmZvOwotCXByb3RlY3RlZCBTdHJpbmdbXSBub25Sb290RmlsZXM7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBFY2xpcHNlSW5zdGFsbEFjdGlvbigpIHsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZUluc3RhbGxBY3Rpb24oU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyBmbGF2b3IsIFN0cmluZ1tdIHRvcExldmVsLCBTdHJpbmdbXSBub25Sb290RmlsZXMsIGJvb2xlYW4gc3RhcnQpIHsKLQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5uYW1lID0gbmFtZSA9PSBudWxsID8gaWQgOiBuYW1lOwotCQl0aGlzLmZsYXZvciA9IGZsYXZvcjsKLQkJdGhpcy50b3BMZXZlbCA9IHRvcExldmVsOwotCQl0aGlzLm5vblJvb3RGaWxlcyA9IG5vblJvb3RGaWxlczsKLQkJdGhpcy5zdGFydCA9IHN0YXJ0OwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHBlcmZvcm0oSVB1Ymxpc2hlckluZm8gaW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCXRoaXMuaW5mbyA9IGluZm87Ci0JCUlQdWJsaXNoaW5nQWN0aW9uW10gYWN0aW9ucyA9IGNyZWF0ZUFjdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aDsgaSsrKQotCQkJYWN0aW9uc1tpXS5wZXJmb3JtKGluZm8sIHJlc3VsdHMpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVB1Ymxpc2hpbmdBY3Rpb25bXSBjcmVhdGVBY3Rpb25zKCkgewotCQljcmVhdGVBZHZpY2UoKTsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gY3JlYXRlIGFuIGFjdGlvbiB0aGF0IGp1c3QgcHVibGlzaGVzIHRoZSByYXcgYnVuZGxlcyBhbmQgZmVhdHVyZXMKLQkJSVB1Ymxpc2hpbmdBY3Rpb24gYWN0aW9uID0gbmV3IE1lcmdlUmVzdWx0c0FjdGlvbihuZXcgSVB1Ymxpc2hpbmdBY3Rpb25bXSB7Y3JlYXRlRmVhdHVyZXNBY3Rpb24oKSwgY3JlYXRlQnVuZGxlc0FjdGlvbigpfSwgSVB1Ymxpc2hlclJlc3VsdC5NRVJHRV9BTExfTk9OX1JPT1QpOwotCQlyZXN1bHQuYWRkKGFjdGlvbik7Ci0JCXJlc3VsdC5hZGRBbGwoY3JlYXRlRXhlY3V0YWJsZXNBY3Rpb25zKGluZm8uZ2V0Q29uZmlndXJhdGlvbnMoKSkpOwotCQlyZXN1bHQuYWRkKGNyZWF0ZVJvb3RGaWxlc0FjdGlvbigpKTsKLQkJcmVzdWx0LmFkZChjcmVhdGVFcXVpbm94TGF1bmNoZXJGcmFnbWVudHNBY3Rpb24oKSk7Ci0JCXJlc3VsdC5hZGRBbGwoY3JlYXRlQWNjdW11bGF0ZUNvbmZpZ0RhdGFBY3Rpb25zKGluZm8uZ2V0Q29uZmlndXJhdGlvbnMoKSkpOwotCQlyZXN1bHQuYWRkKGNyZWF0ZUpSRUFjdGlvbigpKTsKLQkJcmVzdWx0LmFkZChjcmVhdGVDb25maWdDVXNBY3Rpb24oKSk7Ci0JCXJlc3VsdC5hZGQoY3JlYXRlRGVmYXVsdENVc0FjdGlvbigpKTsKLQkJcmVzdWx0LmFkZChjcmVhdGVSb290SVVBY3Rpb24oKSk7Ci0JCXJldHVybiAoSVB1Ymxpc2hpbmdBY3Rpb25bXSkgcmVzdWx0LnRvQXJyYXkobmV3IElQdWJsaXNoaW5nQWN0aW9uW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQWR2aWNlKCkgewotCQljcmVhdGVSb290RmlsZXNBZHZpY2UoKTsKLQkJY3JlYXRlUm9vdEFkdmljZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJvb3RBZHZpY2UoKSB7Ci0JCWluZm8uYWRkQWR2aWNlKG5ldyBSb290SVVBZHZpY2UoZ2V0VG9wTGV2ZWwoKSkpOwotCX0KLQotCXByb3RlY3RlZCBJUHVibGlzaGluZ0FjdGlvbiBjcmVhdGVEZWZhdWx0Q1VzQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IERlZmF1bHRDVXNBY3Rpb24oaW5mbywgZmxhdm9yLCA0LCBzdGFydCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQdWJsaXNoaW5nQWN0aW9uIGNyZWF0ZVJvb3RJVUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBSb290SVVBY3Rpb24oaWQsIHZlcnNpb24sIG5hbWUsIGluZm8pOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGdldFRvcExldmVsKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0b3BMZXZlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQdWJsaXNoaW5nQWN0aW9uIGNyZWF0ZUpSRUFjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBKUkVBY3Rpb24oaW5mbywgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQdWJsaXNoaW5nQWN0aW9uIGNyZWF0ZUVxdWlub3hMYXVuY2hlckZyYWdtZW50c0FjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBFcXVpbm94TGF1bmNoZXJDVUFjdGlvbihmbGF2b3IpOwotCX0KLQotCXByb3RlY3RlZCBDb2xsZWN0aW9uIGNyZWF0ZUFjY3VtdWxhdGVDb25maWdEYXRhQWN0aW9ucyhTdHJpbmdbXSBjb25maWdzKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdChjb25maWdzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlncy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGNvbmZpZ1NwZWMgPSBjb25maWdzW2ldOwotCQkJRmlsZSBjb25maWd1cmF0aW9uID0gY29tcHV0ZUNvbmZpZ3VyYXRpb25Mb2NhdGlvbihjb25maWdTcGVjKTsKLQkJCVN0cmluZyBvcyA9IEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5wYXJzZUNvbmZpZ1NwZWMoY29uZmlnU3BlYylbMV07Ci0JCQlGaWxlIGV4ZWN1dGFibGUgPSBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IuZmluZEV4ZWN1dGFibGUob3MsIGNvbXB1dGVFeGVjdXRhYmxlTG9jYXRpb24oY29uZmlnU3BlYyksICJlY2xpcHNlIik7IC8vJE5PTi1OTFMtMSQKLQkJCUlQdWJsaXNoaW5nQWN0aW9uIGFjdGlvbiA9IG5ldyBBY2N1bXVsYXRlQ29uZmlnRGF0YUFjdGlvbihpbmZvLCBjb25maWdTcGVjLCBjb25maWd1cmF0aW9uLCBleGVjdXRhYmxlKTsKLQkJCXJlc3VsdC5hZGQoYWN0aW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBJUHVibGlzaGluZ0FjdGlvbiBjcmVhdGVDb25maWdDVXNBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQ29uZmlnQ1VzQWN0aW9uKGluZm8sIGZsYXZvciwgaWQsIHZlcnNpb24pOwotCX0KLQotCXByb3RlY3RlZCBJUHVibGlzaGluZ0FjdGlvbiBjcmVhdGVGZWF0dXJlc0FjdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBGZWF0dXJlc0FjdGlvbihuZXcgRmlsZVtdIHtuZXcgRmlsZShzb3VyY2UsICJmZWF0dXJlcyIpfSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29sbGVjdGlvbiBjcmVhdGVFeGVjdXRhYmxlc0FjdGlvbnMoU3RyaW5nW10gY29uZmlnU3BlY3MpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KGNvbmZpZ1NwZWNzLmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnU3BlY3MubGVuZ3RoOyBpKyspIHsKLQkJCUV4ZWN1dGFibGVzRGVzY3JpcHRvciBleGVjdXRhYmxlcyA9IGNvbXB1dGVFeGVjdXRhYmxlcyhjb25maWdTcGVjc1tpXSk7Ci0JCQlJUHVibGlzaGluZ0FjdGlvbiBhY3Rpb24gPSBuZXcgRXF1aW5veEV4ZWN1dGFibGVBY3Rpb24oZXhlY3V0YWJsZXMsIGNvbmZpZ1NwZWNzW2ldLCBpZCwgdmVyc2lvbiwgZmxhdm9yKTsKLQkJCXJlc3VsdC5hZGQoYWN0aW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBJUHVibGlzaGluZ0FjdGlvbiBjcmVhdGVSb290RmlsZXNBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgUm9vdEZpbGVzQWN0aW9uKGluZm8sIGlkLCB2ZXJzaW9uLCBmbGF2b3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVJvb3RGaWxlc0FkdmljZSgpIHsKLQkJRmlsZVtdIGJhc2VFeGNsdXNpb25zID0gY29tcHV0ZVJvb3RGaWxlRXhjbHVzaW9ucygpOwotCQlpZiAoYmFzZUV4Y2x1c2lvbnMgIT0gbnVsbCkKLQkJCWluZm8uYWRkQWR2aWNlKG5ldyBSb290RmlsZXNBZHZpY2UobnVsbCwgbnVsbCwgYmFzZUV4Y2x1c2lvbnMsIG51bGwpKTsKLQkJU3RyaW5nW10gY29uZmlncyA9IGluZm8uZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKQotCQkJaW5mby5hZGRBZHZpY2UoY29tcHV0ZVJvb3RGaWxlQWR2aWNlKGNvbmZpZ3NbaV0pKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVB1Ymxpc2hpbmdBZHZpY2UgY29tcHV0ZVJvb3RGaWxlQWR2aWNlKFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCUZpbGUgcm9vdCA9IGNvbXB1dGVSb290RmlsZVJvb3QoY29uZmlnU3BlYyk7Ci0JCUZpbGVbXSBpbmNsdXNpb25zID0gY29tcHV0ZVJvb3RGaWxlSW5jbHVzaW9ucyhjb25maWdTcGVjKTsKLQkJRmlsZVtdIGV4Y2x1c2lvbnMgPSBjb21wdXRlUm9vdEZpbGVFeGNsdXNpb25zKGNvbmZpZ1NwZWMpOwotCQlyZXR1cm4gbmV3IFJvb3RGaWxlc0FkdmljZShyb290LCBpbmNsdXNpb25zLCBleGNsdXNpb25zLCBjb25maWdTcGVjKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZVtdIGNvbXB1dGVSb290RmlsZUV4Y2x1c2lvbnMoU3RyaW5nIGNvbmZpZ1NwZWMpIHsKLQkJcmV0dXJuIGNvbXB1dGVFeGVjdXRhYmxlcyhjb25maWdTcGVjKS5nZXRGaWxlcygpOwotCX0KLQotCXByb3RlY3RlZCBGaWxlW10gY29tcHV0ZVJvb3RGaWxlRXhjbHVzaW9ucygpIHsKLQkJaWYgKG5vblJvb3RGaWxlcyA9PSBudWxsIHx8IG5vblJvb3RGaWxlcy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vblJvb3RGaWxlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGZpbGVuYW1lID0gbm9uUm9vdEZpbGVzW2ldOwotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZW5hbWUpOwotCQkJaWYgKGZpbGUuaXNBYnNvbHV0ZSgpKQotCQkJCXJlc3VsdC5hZGQoZmlsZSk7Ci0JCQllbHNlCi0JCQkJcmVzdWx0LmFkZChuZXcgRmlsZShzb3VyY2UsIGZpbGVuYW1lKSk7Ci0JCX0KLQkJcmV0dXJuIChGaWxlW10pIHJlc3VsdC50b0FycmF5KG5ldyBGaWxlW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRXhlY3V0YWJsZXNEZXNjcmlwdG9yIGNvbXB1dGVFeGVjdXRhYmxlcyhTdHJpbmcgY29uZmlnU3BlYykgewotCQlTdHJpbmcgb3MgPSBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24ucGFyc2VDb25maWdTcGVjKGNvbmZpZ1NwZWMpWzFdOwotCQlyZXR1cm4gRXhlY3V0YWJsZXNEZXNjcmlwdG9yLmNyZWF0ZURlc2NyaXB0b3Iob3MsICJlY2xpcHNlIiwgY29tcHV0ZUV4ZWN1dGFibGVMb2NhdGlvbihjb25maWdTcGVjKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBjb21wdXRlUm9vdEZpbGVSb290KFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCXJldHVybiBuZXcgRmlsZShzb3VyY2UpOwotCX0KLQotCXByb3RlY3RlZCBGaWxlW10gY29tcHV0ZVJvb3RGaWxlSW5jbHVzaW9ucyhTdHJpbmcgY29uZmlnU3BlYykgewotCQlyZXR1cm4gbmV3IEZpbGVbXSB7bmV3IEZpbGUoc291cmNlKX07Ci0JfQotCi0JcHJvdGVjdGVkIEZpbGUgY29tcHV0ZUV4ZWN1dGFibGVMb2NhdGlvbihTdHJpbmcgY29uZmlnU3BlYykgewotCQlyZXR1cm4gbmV3IEZpbGUoc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmlsZSBjb21wdXRlQ29uZmlndXJhdGlvbkxvY2F0aW9uKFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCXJldHVybiBuZXcgRmlsZShzb3VyY2UsICJjb25maWd1cmF0aW9uL2NvbmZpZy5pbmkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBJUHVibGlzaGluZ0FjdGlvbiBjcmVhdGVCdW5kbGVzQWN0aW9uKCkgewotCQlyZXR1cm4gbmV3IEJ1bmRsZXNBY3Rpb24obmV3IEZpbGVbXSB7bmV3IEZpbGUoc291cmNlLCAicGx1Z2lucyIpfSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRXF1aW5veEV4ZWN1dGFibGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRXF1aW5veEV4ZWN1dGFibGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUzYTI5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0VxdWlub3hFeGVjdXRhYmxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgRXF1aW5veEV4ZWN1dGFibGVBY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb24gewotCi0JcHJvdGVjdGVkIFN0cmluZyBjb25maWdTcGVjOwotCXByb3RlY3RlZCBTdHJpbmcgaWRCYXNlOwotCXByb3RlY3RlZCBTdHJpbmcgdmVyc2lvblNwZWMgPSAiMS4wLjAiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIEV4ZWN1dGFibGVzRGVzY3JpcHRvciBleGVjdXRhYmxlczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZsYXZvcjsKLQotCXByb3RlY3RlZCBFcXVpbm94RXhlY3V0YWJsZUFjdGlvbigpIHsKLQl9Ci0KLQlwdWJsaWMgRXF1aW5veEV4ZWN1dGFibGVBY3Rpb24oRXhlY3V0YWJsZXNEZXNjcmlwdG9yIGV4ZWN1dGFibGVzLCBTdHJpbmcgY29uZmlnU3BlYywgU3RyaW5nIGlkQmFzZSwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBmbGF2b3IpIHsKLQkJdGhpcy5leGVjdXRhYmxlcyA9IGV4ZWN1dGFibGVzOwotCQl0aGlzLmNvbmZpZ1NwZWMgPSBjb25maWdTcGVjOwotCQl0aGlzLmlkQmFzZSA9IGlkQmFzZSA9PSBudWxsID8gIm9yZy5lY2xpcHNlIiA6IGlkQmFzZTsgLy8kTk9OLU5MUy0xJAotCQkvLyBpZiB0aGUgZ2l2ZW4gdmVyc2lvbiBpcyBub3QgdGhlIGRlZmF1bHQgInJlcGxhY2UgbWUiIHZlcnNpb24gdGhlbiBzYXZlIGl0Ci0JCWlmICh2ZXJzaW9uICE9IG51bGwgJiYgIXZlcnNpb24uZXF1YWxzKCIwLjAuMCIpKSAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnZlcnNpb25TcGVjID0gdmVyc2lvbjsKLQkJdGhpcy5mbGF2b3IgPSBmbGF2b3I7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJZ2VuZXJhdGVFeGVjdXRhYmxlSVVzKGluZm8sIHJlc3VsdHMpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgSVVzIGFuZCBDVXMgZm9yIHRoZSBmaWxlcyB0aGF0IG1ha2UgdXAgdGhlIGxhdW5jaGVyIGZvciBhIGdpdmVuCi0JICogd3Mvb3MvYXJjaCBjb21iaW5hdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUV4ZWN1dGFibGVJVXMoSVB1Ymxpc2hlckluZm8gaW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHQpIHsKLQkJLy8gQ3JlYXRlIHRoZSBJVSBmb3IgdGhlIGV4ZWN1dGFibGUKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWl1LnNldFNpbmdsZXRvbih0cnVlKTsKLQkJU3RyaW5nIGlkUHJlZml4ID0gaWRCYXNlICsgIi5leGVjdXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZXhlY3V0YWJsZUlkID0gaWRQcmVmaXggKyAnLicgKyBjcmVhdGVJZFN0cmluZyhjb25maWdTcGVjKTsKLQkJaXUuc2V0SWQoZXhlY3V0YWJsZUlkKTsKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24odmVyc2lvblNwZWMpOwotCQlpdS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQlTdHJpbmcgZmlsdGVyID0gY3JlYXRlRmlsdGVyU3BlYyhjb25maWdTcGVjKTsKLQkJaXUuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCUlBcnRpZmFjdEtleSBrZXkgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVMYXVuY2hlckFydGlmYWN0S2V5KGV4ZWN1dGFibGVJZCwgdmVyc2lvbik7Ci0JCWl1LnNldEFydGlmYWN0cyhuZXcgSUFydGlmYWN0S2V5W10ge2tleX0pOwotCQlpdS5zZXRUb3VjaHBvaW50VHlwZShNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5UT1VDSFBPSU5UX05BVElWRSk7Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eSBsYXVuY2hlckNhcGFiaWxpdHkgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KGZsYXZvciArIGlkQmFzZSwgaWRQcmVmaXgsIHZlcnNpb24pOyAvLyROT04tTkxTLTEkCi0JCWl1LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZVNlbGZDYXBhYmlsaXR5KGV4ZWN1dGFibGVJZCwgdmVyc2lvbiksIGxhdW5jaGVyQ2FwYWJpbGl0eX0pOwotCi0JCS8vIHNldHVwIGEgcmVxdWlyZW1lbnQgYmV0d2VlbiB0aGUgZXhlY3V0YWJsZSBhbmQgdGhlIGxhdW5jaGVyIGZyYWdtZW50IHRoYXQgaGFzIHRoZSBzaGFyZWQgbGlicmFyeQotCQlTdHJpbmdbXSBjb25maWcgPSBwYXJzZUNvbmZpZ1NwZWMoY29uZmlnU3BlYyk7Ci0JCVN0cmluZyB3cyA9IGNvbmZpZ1swXTsKLQkJU3RyaW5nIG9zID0gY29uZmlnWzFdOwotCQlTdHJpbmcgYXJjaCA9IGNvbmZpZ1syXTsKLQkJU3RyaW5nIGxhdW5jaGVyRnJhZ21lbnQgPSBFcXVpbm94TGF1bmNoZXJDVUFjdGlvbi5PUkdfRUNMSVBTRV9FUVVJTk9YX0xBVU5DSEVSICsgJy4nICsgd3MgKyAnLicgKyBvczsKLQkJaWYgKCFDb25zdGFudHMuT1NfTUFDT1NYLmVxdWFscyhvcykpCi0JCQlsYXVuY2hlckZyYWdtZW50ICs9ICcuJyArIGFyY2g7Ci0JCWl1LnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgbGF1bmNoZXJGcmFnbWVudCwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIGZpbHRlciwgZmFsc2UsIGZhbHNlKX0pOwotCQlyZXN1bHQuYWRkSVUoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdSksIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0KLQkJLy8gQ3JlYXRlIHRoZSBDVSB0aGF0IGluc3RhbGxzL2NvbmZpZ3VyZXMgdGhlIGV4ZWN1dGFibGUKLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBjdSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBjb25maWdVbml0SWQgPSBmbGF2b3IgKyBleGVjdXRhYmxlSWQ7Ci0JCWN1LnNldElkKGNvbmZpZ1VuaXRJZCk7Ci0JCWN1LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCWN1LnNldEZpbHRlcihmaWx0ZXIpOwotCQljdS5zZXRIb3N0KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgZXhlY3V0YWJsZUlkLCBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIHZlcnNpb24sIHRydWUpLCBudWxsLCBmYWxzZSwgZmFsc2UpfSk7Ci0JCWN1LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0ZSQUdNRU5ULCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCS8vVE9ETyBidWcgMjE4ODkwLCB3b3VsZCBsaWtlIHRoZSBmcmFnbWVudCB0byBwcm92aWRlIHRoZSBsYXVuY2hlciBjYXBhYmlsaXR5IGFzIHdlbGwsIGJ1dCBjYW4ndCByaWdodCBub3cuCi0JCWN1LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZVNlbGZDYXBhYmlsaXR5KGNvbmZpZ1VuaXRJZCwgdmVyc2lvbil9KTsKLQotCQkvLyBUT0RPIHRlbXBvcmFyeSBtZWFzdXJlIGZvciBoYW5kbGluZyB0aGUgRWNsaXBzZSBsYXVuY2hlciBmZWF0dXJlIGZpbGVzLgotCQlFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgZmlsZXMgPSBicmFuZEV4ZWN1dGFibGVzKGV4ZWN1dGFibGVzKTsKLQotCQljdS5zZXRUb3VjaHBvaW50VHlwZShNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5UT1VDSFBPSU5UX05BVElWRSk7Ci0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZyBjb25maWd1cmF0aW9uRGF0YSA9ICJ1bnppcChzb3VyY2U6QGFydGlmYWN0LCB0YXJnZXQ6JHtpbnN0YWxsRm9sZGVyfSk7IjsgLy8kTk9OLU5MUy0xJAotCQlGaWxlW10gZmlsZUxpc3QgPSBmaWxlcy5nZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGZpbGUgPSBmaWxlTGlzdFtpXTsKLQkJCWlmIChDb25zdGFudHMuT1NfTUFDT1NYLmVxdWFscyhvcykpIHsKLQkJCQlGaWxlIG1hY09TRm9sZGVyID0gbmV3IEZpbGUoZmlsZSwgIkNvbnRlbnRzL01hY09TIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAobWFjT1NGb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQkJRmlsZVtdIGxhdW5jaGVyRmlsZXMgPSBtYWNPU0ZvbGRlci5saXN0RmlsZXMoKTsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBsYXVuY2hlckZpbGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQljb25maWd1cmF0aW9uRGF0YSArPSAiIGNobW9kKHRhcmdldERpcjoke2luc3RhbGxGb2xkZXJ9LyIgKyBmaWxlLmdldE5hbWUoKSArICIvQ29udGVudHMvTWFjT1MvLCB0YXJnZXRGaWxlOiIgKyBsYXVuY2hlckZpbGVzW2pdLmdldE5hbWUoKSArICIsIHBlcm1pc3Npb25zOjc1NSk7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCWlmIChuZXcgUGF0aChsYXVuY2hlckZpbGVzW2pdLmdldE5hbWUoKSkuZ2V0RmlsZUV4dGVuc2lvbigpID09IG51bGwpCi0JCQkJCQkJTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuZ2VuZXJhdGVMYXVuY2hlclNldHRlcihsYXVuY2hlckZpbGVzW2pdLmdldE5hbWUoKSwgZXhlY3V0YWJsZUlkLCB2ZXJzaW9uLCBjb25maWdTcGVjLCByZXN1bHQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFDb25zdGFudHMuT1NfV0lOMzIuZXF1YWxzKG9zKSAmJiAhQ29uc3RhbnRzLk9TX01BQ09TWC5lcXVhbHMob3MpKSB7Ci0JCQkJY29uZmlndXJhdGlvbkRhdGEgKz0gIiBjaG1vZCh0YXJnZXREaXI6JHtpbnN0YWxsRm9sZGVyfSwgdGFyZ2V0RmlsZToiICsgZmlsZS5nZXROYW1lKCkgKyAiLCBwZXJtaXNzaW9uczo3NTUpOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS8vIGlmIHRoZSBmaWxlIGhhcyBubyBleHRlbnNpb24gdGhlbiBpdCBpcyB0aGUgZXhlY3V0YWJsZS4gIE5vdCB0aGUgYmVzdCBydWxlIGJ1dCBvayBmb3Igbm93Ci0JCQkJaWYgKG5ldyBQYXRoKGZpbGUuZ2V0TmFtZSgpKS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCkKLQkJCQkJTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuZ2VuZXJhdGVMYXVuY2hlclNldHRlcihmaWxlLmdldE5hbWUoKSwgZXhlY3V0YWJsZUlkLCB2ZXJzaW9uLCBjb25maWdTcGVjLCByZXN1bHQpOwotCQkJfQotCQl9Ci0JCXRvdWNocG9pbnREYXRhLnB1dCgiaW5zdGFsbCIsIGNvbmZpZ3VyYXRpb25EYXRhKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdW5Db25maWd1cmF0aW9uRGF0YSA9ICJjbGVhbnVwemlwKHNvdXJjZTpAYXJ0aWZhY3QsIHRhcmdldDoke2luc3RhbGxGb2xkZXJ9KTsiOyAvLyROT04tTkxTLTEkCi0JCXRvdWNocG9pbnREYXRhLnB1dCgidW5pbnN0YWxsIiwgdW5Db25maWd1cmF0aW9uRGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJY3UuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdW5pdCA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoY3UpOwotCQlyZXN1bHQuYWRkSVUodW5pdCwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQotCQkvL0NyZWF0ZSB0aGUgYXJ0aWZhY3QgZGVzY3JpcHRvci4gIHdlIGhhdmUgc2V2ZXJhbCBmaWxlcyBzbyBubyBwYXRoIG9uIGRpc2sKLQkJSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlQXJ0aWZhY3REZXNjcmlwdG9yKGtleSwgbnVsbCk7Ci0JCXB1Ymxpc2hBcnRpZmFjdChkZXNjcmlwdG9yLCBmaWxlTGlzdCwgZmlsZXMuZ2V0TG9jYXRpb24oKSwgaW5mbywgSU5DTFVERV9ST09UKTsKLQkJaWYgKGZpbGVzLmlzVGVtcG9yYXJ5KCkpCi0JCQlGaWxlVXRpbHMuZGVsZXRlQWxsKGZpbGVzLmdldExvY2F0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgYnJhbmRFeGVjdXRhYmxlcyhFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgcmVzdWx0ID0gbmV3IEV4ZWN1dGFibGVzRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJcmVzdWx0Lm1ha2VUZW1wb3JhcnlDb3B5KCk7Ci0JCUZpbGVbXSBsaXN0ID0gZGVzY3JpcHRvci5nZXRGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQltdW5nZUxhdW5jaGVyRmlsZU5hbWUobGlzdFtpXSwgZGVzY3JpcHRvcik7Ci0JCXJlc3VsdC5zZXRFeGVjdXRhYmxlTmFtZSgiZWNsaXBzZSIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQFRPRE8gVGhpcyBtZXRob2QgaXMgYSB0ZW1wb3JhcnkgaGFjayB0byByZW5hbWUgdGhlIGxhdW5jaGVyLmV4ZSBmaWxlcwotCSAqIHRvIGVjbGlwc2UuZXhlIChvciAibGF1bmNoZXIiIHRvICJlY2xpcHNlIikuIEV2ZW50dWFsbHkgd2Ugd2lsbCBlaXRoZXIgaGFuZC1jcmFmdAotCSAqIG1ldGFkYXRhL2FydGlmYWN0cyBmb3IgbGF1bmNoZXJzLCBvciBhbHRlciB0aGUgZGVsdGEgcGFjayB0byBjb250YWluIGVjbGlwc2UtYnJhbmRlZAotCSAqIGxhdW5jaGVycy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbXVuZ2VMYXVuY2hlckZpbGVOYW1lKEZpbGUgZmlsZSwgRXhlY3V0YWJsZXNEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscygibGF1bmNoZXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIG5ld0ZpbGUgPSBuZXcgRmlsZShmaWxlLmdldFBhcmVudEZpbGUoKSwgImVjbGlwc2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJZmlsZS5yZW5hbWVUbyhuZXdGaWxlKTsgLy8kTk9OLU5MUy0xJAotCQkJZGVzY3JpcHRvci5yZXBsYWNlKGZpbGUsIG5ld0ZpbGUpOwotCQl9IGVsc2UgaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFscygibGF1bmNoZXIuZXhlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBuZXdGaWxlID0gbmV3IEZpbGUoZmlsZS5nZXRQYXJlbnRGaWxlKCksICJlY2xpcHNlLmV4ZSIpOyAvLyROT04tTkxTLTEkCi0JCQlmaWxlLnJlbmFtZVRvKG5ld0ZpbGUpOyAvLyROT04tTkxTLTEkCi0JCQlkZXNjcmlwdG9yLnJlcGxhY2UoZmlsZSwgbmV3RmlsZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRXF1aW5veExhdW5jaGVyQ1VBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRXF1aW5veExhdW5jaGVyQ1VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyMjUzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0VxdWlub3hMYXVuY2hlckNVQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIENyZWF0ZSBDVXMgZm9yIGFsbCBFcXVpbm94IGxhdW5jaGVyIElVcyAobm90IGZyYWdtZW50cykgZm91bmQgaW4gdGhlIGN1cnJlbnQgcmVzdWx0cwotICogc3VjaCB0aGF0IHRoZSBjb3JyZXNwb25kaW5nIGhvc3QgSVUgaXMgY29uZmlndXJlZCBhcyB0aGUgbGF1bmNoLmxpYnJhcnkuICAKLSAqLwotcHVibGljIGNsYXNzIEVxdWlub3hMYXVuY2hlckNVQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19FQ0xJUFNFX0VRVUlOT1hfTEFVTkNIRVIgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGZsYXZvcjsKLQotCXB1YmxpYyBFcXVpbm94TGF1bmNoZXJDVUFjdGlvbihTdHJpbmcgZmxhdm9yKSB7Ci0JCXRoaXMuZmxhdm9yID0gZmxhdm9yOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHBlcmZvcm0oSVB1Ymxpc2hlckluZm8gaW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCWNyZWF0ZUxhdW5jaGVyQ1VzKHJlc3VsdHMpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgYWxsIGtub3duIElVcyBpbiB0aGUgcmVzdWx0IHRoYXQgYXJlIHBhcnQgb2YgdGhlIEVxdWlub3ggbGF1bmNoZXIuIAotCSAqIEBwYXJhbSByZXN1bHRzIHRoZSByZXN1bHRzIHRvIHNjYW4gYW5kIHN1cHBsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlTGF1bmNoZXJDVXMoSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCUNvbGxlY3Rpb24gbGF1bmNoZXJzID0gZ2V0SVVzKHJlc3VsdHMuZ2V0SVVzKG51bGwsIG51bGwpLCBPUkdfRUNMSVBTRV9FUVVJTk9YX0xBVU5DSEVSKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbGF1bmNoZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBsYXVuY2hlcklVID0gKElJbnN0YWxsYWJsZVVuaXQpIGkubmV4dCgpOwotCQkJLy8gc2tpcCBvdmVyIHNvdXJjZSBidW5kbGVzIGFuZCBmcmFnbWVudHMKLQkJCS8vIFRPRE8gc2hvdWxkIHdlIHVzZSB0aGUgc291cmNlIHByb3BlcnR5IGhlcmUgcmF0aGVyIHRoYW4gbWFnaWMgbmFtZSBtYXRjaGluZz8KLQkJCWlmIChsYXVuY2hlcklVLmdldElkKCkuZW5kc1dpdGgoIi5zb3VyY2UiKSB8fCBsYXVuY2hlcklVLmlzRnJhZ21lbnQoKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJR2VuZXJhdG9yQnVuZGxlSW5mbyBidW5kbGUgPSBuZXcgR2VuZXJhdG9yQnVuZGxlSW5mbygpOwotCQkJYnVuZGxlLnNldFN5bWJvbGljTmFtZShsYXVuY2hlcklVLmdldElkKCkpOwotCQkJYnVuZGxlLnNldFZlcnNpb24obGF1bmNoZXJJVS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0JCQlidW5kbGUuc2V0U3BlY2lhbENvbmZpZ0NvbW1hbmRzKCJhZGRQcm9ncmFtQXJnKHByb2dyYW1Bcmc6LXN0YXJ0dXApO2FkZFByb2dyYW1BcmcocHJvZ3JhbUFyZzpAYXJ0aWZhY3QpOyIpOyAvLyROT04tTkxTLTEkCi0JCQlidW5kbGUuc2V0U3BlY2lhbFVuY29uZmlnQ29tbWFuZHMoInJlbW92ZVByb2dyYW1BcmcocHJvZ3JhbUFyZzotc3RhcnR1cCk7cmVtb3ZlUHJvZ3JhbUFyZyhwcm9ncmFtQXJnOkBhcnRpZmFjdCk7Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBmaWx0ZXIgPSBsYXVuY2hlcklVLmdldEZpbHRlcigpOwotCQkJSUluc3RhbGxhYmxlVW5pdCBjdSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUJ1bmRsZUNvbmZpZ3VyYXRpb25Vbml0KGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSwgbmV3IFZlcnNpb24oYnVuZGxlLmdldFZlcnNpb24oKSksIGZhbHNlLCBidW5kbGUsIGZsYXZvciwgZmlsdGVyKTsKLQkJCWlmIChjdSAhPSBudWxsKQotCQkJCXJlc3VsdHMuYWRkSVUoY3UsIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gZ2V0SVVzKENvbGxlY3Rpb24gaXVzLCBTdHJpbmcgcHJlZml4KSB7Ci0JCVNldCByZXN1bHQgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gaXVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgdG1wID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmICh0bXAuZ2V0SWQoKS5zdGFydHNXaXRoKHByZWZpeCkpCi0JCQkJcmVzdWx0LmFkZCh0bXApOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9FeGVjdXRhYmxlc0Rlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRXhlY3V0YWJsZXNEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZjFhMDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9FeGVjdXRhYmxlc0Rlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5BYnN0cmFjdFB1Ymxpc2hpbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgewotCi0JcHJpdmF0ZSBGaWxlIGxvY2F0aW9uOwotCXByaXZhdGUgU2V0IGZpbGVzOwotCXByaXZhdGUgU3RyaW5nIGV4ZWN1dGFibGVOYW1lOwotCXByaXZhdGUgYm9vbGVhbiB0ZW1wb3JhcnkgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBvczsKLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBmaW5kRXhlY3V0YWJsZShTdHJpbmcgb3MsIEZpbGUgcm9vdCwgU3RyaW5nIGJhc2VOYW1lKSB7Ci0JCS8vIFRPRE8gdGhpcyBtYXkgbmVlZCB0byBnZXQgbW9yZSBpbnRlbGxpZ2VudAotCQkvLyBpZiBNYWNPUyBpdHMgZ29pbmcgdG8gYmUgYmFzZU5hbWUuYXBwL0NvbnRlbnRzL01hY09TL2Jhc2VOYW1lCi0JCWlmIChDb25zdGFudHMuT1NfTUFDT1NYLmVxdWFscyhvcykpIHsKLQkJCXJldHVybiBuZXcgRmlsZShyb290LCBiYXNlTmFtZSArICIuYXBwL0NvbnRlbnRzL01hY09TLyIgKyBiYXNlTmFtZSk7Ci0JCX0KLQkJLy8gaWYgaXQgaXMgbm90IE1hYyBhbmQgbm90IFdpbmRvd3MgaXQgbXVzdCBiZSBhIFVOSVggZmxhdm9yCi0JCWlmICghQ29uc3RhbnRzLk9TX1dJTjMyLmVxdWFscyhvcykpIHsKLQkJCXJldHVybiBuZXcgRmlsZShyb290LCBiYXNlTmFtZSk7Ci0JCX0KLQkJLy8gb3RoZXJ3aXNlIHdlIGFyZSBsZWZ0IHdpdGggd2luZG93cwotCQlyZXR1cm4gbmV3IEZpbGUocm9vdCwgYmFzZU5hbWUgKyAiLmV4ZSIpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGV4ZWN1dGFibGVzIGZvbGRlciBmb3IgdGhlIGdpdmVuIGNvbmZpZ1NwZWMuICBUaGUgZm9sZGVyCi0JICogaXMgZXhwZWN0ZWQgdG8gYmUgcGFydCBvZiB0aGUgc3RhbmRhcmQgRWNsaXBzZSBleGVjdXRhYmxlcyBmZWF0dXJlIHdob3NlIHN0cnVjdHVyZSBpcyAKLQkgKiBlbWJlZGRlZCBoZXJlLgotCSAqIEBwYXJhbSBleGVjdXRhYmxlc0ZlYXR1cmVMb2NhdGlvbiB0aGUgbG9jYXRpb24gb2YgdGhlIGV4ZWN1dGFibGVzIGZlYXR1cmUKLQkgKiBAcGFyYW0gY29uZmlnU3BlYyB0aGUgY29uZmlndXJhdGlvbiB0byBsb29rdXAKLQkgKiBAcmV0dXJuIHRoZSByb290IGxvY2F0aW9uIG9mIHRoZSByZXF1ZXN0ZWQgZXhlY3V0YWJsZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEV4ZWN1dGFibGVzRGVzY3JpcHRvciBjcmVhdGVFeGVjdXRhYmxlc0Zyb21GZWF0dXJlKEZpbGUgZXhlY3V0YWJsZXNGZWF0dXJlTG9jYXRpb24sIFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCS8vIFRPRE8gY29uc2lkZXIgaGFuZGxpbmcgSkFSJ2QgZmVhdHVyZXMgaGVyZS4uLgotCQlpZiAoZXhlY3V0YWJsZXNGZWF0dXJlTG9jYXRpb24gPT0gbnVsbCB8fCAhZXhlY3V0YWJsZXNGZWF0dXJlTG9jYXRpb24uZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nW10gY29uZmlnID0gQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uLnBhcnNlQ29uZmlnU3BlYyhjb25maWdTcGVjKTsKLQkJRmlsZSByZXN1bHQgPSBuZXcgRmlsZShleGVjdXRhYmxlc0ZlYXR1cmVMb2NhdGlvbiwgImJpbi8iICsgY29uZmlnWzBdICsgIi8iICsgY29uZmlnWzFdICsgIi8iICsgY29uZmlnWzJdKTsKLQkJaWYgKCFyZXN1bHQuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIG5ldyBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IoY29uZmlnWzFdLCAibGF1bmNoZXIiLCByZXN1bHQsIG5ldyBGaWxlW10ge3Jlc3VsdH0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBleGVjdXRhYmxlIGRlc2NyaXB0b3IgYmFzZWQgb24gdGhlIGdpdmVuIGxvY2F0aW9uLCBvcyBhbmQgbmFtZS4KLQkgKiBUaGlzIG1ldGhvZCBpcyB0eXBpY2FsbHkgdXNlZCB0byBpZGVudGlmeSB0aGUgZXhlY3V0YWJsZSByZWxhdGVkIGZpbGVzIGluIGV4aXN0aW5nCi0JICogdW5tYW5hZ2VkIGNvbmZpZ3VyYXRpb25zLgotCSAqIEBwYXJhbSBvcwotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBleGVjdXRhYmxlCi0JICogQHJldHVybiB0aGUgY3JlYXRlZCBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgY3JlYXRlRGVzY3JpcHRvcihTdHJpbmcgb3MsIFN0cmluZyBleGVjdXRhYmxlLCBGaWxlIGxvY2F0aW9uKSB7Ci0JCWlmIChDb25zdGFudHMuT1NfTUFDT1NYLmVxdWFscyhvcykpCi0JCQlyZXR1cm4gY3JlYXRlTWFjRGVzY3JpcHRvcihvcywgZXhlY3V0YWJsZSwgbG9jYXRpb24pOwotCi0JCS8vIGlmIGl0IGlzIG5vdCBNYWMgYW5kIG5vdCBXaW5kb3dzIGl0IG11c3QgYmUgYSBVTklYIGZsYXZvcgotCQlpZiAoIUNvbnN0YW50cy5PU19XSU4zMi5lcXVhbHMob3MpKQotCQkJcmV0dXJuIGNyZWF0ZVVuaXhEZXNjcmlwdG9yKG9zLCBleGVjdXRhYmxlLCBsb2NhdGlvbik7Ci0KLQkJLy8gTm90aGluZyBlbHNlIHNvIGl0IG11c3QgYmUgV2luZG93cwotCQlyZXR1cm4gY3JlYXRlV2luZG93c0Rlc2NyaXB0b3Iob3MsIGV4ZWN1dGFibGUsIGxvY2F0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgY3JlYXRlV2luZG93c0Rlc2NyaXB0b3IoU3RyaW5nIG9zLCBTdHJpbmcgZXhlY3V0YWJsZSwgRmlsZSBsb2NhdGlvbikgewotCQlFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgcmVzdWx0ID0gbmV3IEV4ZWN1dGFibGVzRGVzY3JpcHRvcihvcywgZXhlY3V0YWJsZSwgbG9jYXRpb24sIG51bGwpOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShsb2NhdGlvbiwgZXhlY3V0YWJsZSArICIuZXhlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZpbGUuaXNGaWxlKCkpCi0JCQlyZXN1bHQuYWRkRmlsZShmaWxlKTsKLQkJZmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uLCAiZWNsaXBzZWMuZXhlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZpbGUuaXNGaWxlKCkpCi0JCQlyZXN1bHQuYWRkRmlsZShmaWxlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgY3JlYXRlVW5peERlc2NyaXB0b3IoU3RyaW5nIG9zLCBTdHJpbmcgZXhlY3V0YWJsZSwgRmlsZSBsb2NhdGlvbikgewotCQlFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgcmVzdWx0ID0gbmV3IEV4ZWN1dGFibGVzRGVzY3JpcHRvcihvcywgZXhlY3V0YWJsZSwgbG9jYXRpb24sIG51bGwpOwotCQlGaWxlW10gZmlsZXMgPSBsb2NhdGlvbi5saXN0RmlsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGZpbGVzICE9IG51bGwgJiYgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZXh0ZW5zaW9uID0gbmV3IFBhdGgoZmlsZXNbaV0uZ2V0TmFtZSgpKS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlpZiAoZmlsZXNbaV0uaXNGaWxlKCkgJiYgKGV4dGVuc2lvbiA9PSBudWxsIHx8IGV4dGVuc2lvbi5lcXVhbHMoInNvIikpKSAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0LmFkZEZpbGUoZmlsZXNbaV0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXhlY3V0YWJsZXNEZXNjcmlwdG9yIGNyZWF0ZU1hY0Rlc2NyaXB0b3IoU3RyaW5nIG9zLCBTdHJpbmcgZXhlY3V0YWJsZSwgRmlsZSBsb2NhdGlvbikgewotCQlGaWxlIGZpbGVzW10gPSBsb2NhdGlvbi5saXN0RmlsZXMobmV3IEZpbGVuYW1lRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyLCBTdHJpbmcgbmFtZSkgewotCQkJCXJldHVybiBuYW1lLnN1YnN0cmluZyhuYW1lLmxlbmd0aCgpIC0gNCwgbmFtZS5sZW5ndGgoKSkuZXF1YWxzSWdub3JlQ2FzZSgiLmFwcCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gbmV3IEV4ZWN1dGFibGVzRGVzY3JpcHRvcihvcywgZXhlY3V0YWJsZSwgbG9jYXRpb24sIGZpbGVzKTsKLQl9Ci0KLQlwdWJsaWMgRXhlY3V0YWJsZXNEZXNjcmlwdG9yKFN0cmluZyBvcywgU3RyaW5nIGV4ZWN1dGFibGUsIEZpbGUgbG9jYXRpb24sIEZpbGVbXSBmaWxlcykgewotCQl0aGlzLm9zID0gb3M7Ci0JCXRoaXMuZXhlY3V0YWJsZU5hbWUgPSBleGVjdXRhYmxlOwotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JCWlmIChmaWxlcyA9PSBudWxsKQotCQkJdGhpcy5maWxlcyA9IG5ldyBIYXNoU2V0KDExKTsKLQkJZWxzZSB7Ci0JCQl0aGlzLmZpbGVzID0gbmV3IEhhc2hTZXQoZmlsZXMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0JCQkJYWRkQWxsRmlsZXMoZmlsZXNbaV0pOwotCQl9Ci0JfQotCi0JcHVibGljIEV4ZWN1dGFibGVzRGVzY3JpcHRvcihFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQl0aGlzLm9zID0gZGVzY3JpcHRvci5vczsKLQkJdGhpcy5sb2NhdGlvbiA9IGRlc2NyaXB0b3IubG9jYXRpb247Ci0JCXRoaXMuZXhlY3V0YWJsZU5hbWUgPSBkZXNjcmlwdG9yLmV4ZWN1dGFibGVOYW1lOwotCQl0aGlzLnRlbXBvcmFyeSA9IGRlc2NyaXB0b3IudGVtcG9yYXJ5OwotCQl0aGlzLmZpbGVzID0gbmV3IEhhc2hTZXQoZGVzY3JpcHRvci5maWxlcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQWxsRmlsZXMoRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmlzRmlsZSgpKQotCQkJZmlsZXMuYWRkKHJlbGF0aXZpemUoZmlsZSkpOwotCQllbHNlIHsKLQkJCUZpbGUgYWJzb2x1dGUgPSBmaWxlLmlzQWJzb2x1dGUoKSA/IGZpbGUgOiBuZXcgRmlsZShsb2NhdGlvbiwgZmlsZS5nZXRQYXRoKCkpOwotCQkJRmlsZVtdIGxpc3QgPSBhYnNvbHV0ZS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCQlhZGRBbGxGaWxlcyhsaXN0W2ldKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZpbGUoRmlsZSBmaWxlKSB7Ci0JCWZpbGVzLmFkZChyZWxhdGl2aXplKGZpbGUpKTsKLQl9Ci0KLQkvLyBkbyBhIHNpbXBsZSByZWxhdGl2aXphdGlvbiBieSByZW1vdmluZyBhbGwgdGhlIGJpdHMgYmVmb3JlIHRoZSBsb2NhdGlvbgotCXByaXZhdGUgRmlsZSByZWxhdGl2aXplKEZpbGUgZmlsZSkgewotCQlpZiAoIWZpbGUuaXNBYnNvbHV0ZSgpKQotCQkJcmV0dXJuIGZpbGU7Ci0JCVN0cmluZyBwYXRoID0gZmlsZS5nZXRQYXRoKCk7Ci0JCWlmICghcGF0aC5zdGFydHNXaXRoKGxvY2F0aW9uLmdldFBhdGgoKSkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGZpbGUudG9TdHJpbmcoKSArICIgbXVzdCBiZSByZWxhdGVkIHRvICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKGxvY2F0aW9uLmdldFBhdGgoKS5sZW5ndGgoKSk7Ci0JCS8vIHRyaW0gb2ZmIGFueSBzZXBhcmF0b3IuICBUaGlzIGFjY29tb2RhdGVzIHBlb3BsZSB3aG8gc2V0IHRoZSBsb2NhdGlvbiB3aXRoIGEgdHJhaWxpbmcgLwotCQlpZiAocGF0aC5zdGFydHNXaXRoKCIvIikgfHwgcGF0aC5zdGFydHNXaXRoKCJcXCIpKSAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOwotCQlyZXR1cm4gbmV3IEZpbGUocGF0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRmlsZShGaWxlIGZpbGUpIHsKLQkJZmlsZXMucmVtb3ZlKHJlbGF0aXZpemUoZmlsZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2UoRmlsZSBvbGRGaWxlLCBGaWxlIG5ld0ZpbGUpIHsKLQkJcmVtb3ZlRmlsZShvbGRGaWxlKTsKLQkJYWRkRmlsZShuZXdGaWxlKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZVtdIGdldEZpbGVzKCkgewotCQlGaWxlW10gcmVzdWx0ID0gKEZpbGVbXSkgZmlsZXMudG9BcnJheShuZXcgRmlsZVtmaWxlcy5zaXplKCldKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0JCQlyZXN1bHRbaV0gPSBuZXcgRmlsZShsb2NhdGlvbiwgcmVzdWx0W2ldLmdldFBhdGgoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFeGVjdXRhYmxlTmFtZSgpIHsKLQkJcmV0dXJuIGV4ZWN1dGFibGVOYW1lOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldEV4ZWN1dGFibGUoKSB7Ci0JCXJldHVybiBmaW5kRXhlY3V0YWJsZShvcywgbG9jYXRpb24sIGV4ZWN1dGFibGVOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKEZpbGUgdmFsdWUpIHsKLQkJbG9jYXRpb24gPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1RlbXBvcmFyeSgpIHsKLQkJcmV0dXJuIHRlbXBvcmFyeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGVjdXRhYmxlTmFtZShTdHJpbmcgdmFsdWUsIGJvb2xlYW4gdXBkYXRlRmlsZXMpIHsKLQkJaWYgKHVwZGF0ZUZpbGVzKQotCQkJdXBkYXRlRXhlY3V0YWJsZU5hbWUodmFsdWUpOwotCQlleGVjdXRhYmxlTmFtZSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIG1ha2VUZW1wb3JhcnlDb3B5KCkgewotCQlpZiAoaXNUZW1wb3JhcnkoKSkKLQkJCXJldHVybjsKLQkJRmlsZSB0ZW1wRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInAyLmJyYW5kaW5nSXJvbiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl0ZW1wRmlsZS5kZWxldGUoKTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGZpbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCQlGaWxlVXRpbHMuY29weShsb2NhdGlvbiwgdGVtcEZpbGUsIChGaWxlKSBpLm5leHQoKSwgdHJ1ZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJFcnJvciBwdWJsaXNoaW5nIGFydGlmYWN0cyIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWxvY2F0aW9uID0gdGVtcEZpbGU7Ci0JCXRlbXBvcmFyeSA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhlIGV4ZWN1dGFibGUgcmVwcmVzZW50ZWQgYnkgdGhpcyBkZXNjcmlwdG9yIGhhcyBiZWVuIGJyYW5kZWQgdGhlbiBhIG1lc3MKLQkgKiBvZiBmaWxlcyBoYXZlIGJlZW4gcmVuYW1lZC4gIEhlcmUgc2NhbiB0aGUgZGVzY3JpcHRvcidzIGZpbGUgbGlzdCBhbmQgdXBkYXRlIHRoZSBuYW1lcwotCSAqIHRha2luZyBpbnRvIGFjY291biB0aGUgZGlmZmVyZW50IGxheW91dCBvbiBkaWZmZXJlbnQgT1Nlcy4KLQkgKiBAcGFyYW0gbmV3TmFtZSB0aGUgbmV3IG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUV4ZWN1dGFibGVOYW1lKFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChuZXdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoZXhlY3V0YWJsZU5hbWUpKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgdGFyZ2V0SW5pID0gZXhlY3V0YWJsZU5hbWUgKyAiLmluaSI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHRhcmdldEV4ZWN1dGFibGUgPSBleGVjdXRhYmxlTmFtZTsKLQkJU3RyaW5nIGV4ZWN1dGFibGVFeHRlbnNpb24gPSBDb25zdGFudHMuT1NfV0lOMzIuZXF1YWxzKG9zKSA/ICIuZXhlIiA6ICIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJdGFyZ2V0RXhlY3V0YWJsZSA9IGV4ZWN1dGFibGVOYW1lICsgZXhlY3V0YWJsZUV4dGVuc2lvbjsKLQkJZm9yIChJdGVyYXRvciBpID0gZmlsZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlGaWxlIGZpbGUgPSAoRmlsZSkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgYmFzZSA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0KLQkJCS8vIHVzZSBTdHJpbmcgY29uY2F0ZW5hdGlvbiBoZXJlIGJlY2F1c2UgbmV3IEZpbGUoIiIsICJmb28iKSBpcyBhYnNvbHV0ZSBvbiBhdCBsZWFzdCB3aW5kb3dzLi4uCi0JCQliYXNlID0gYmFzZSA9PSBudWxsID8gIiIgOiBiYXNlICsgIi8iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChDb25zdGFudHMuT1NfTUFDT1NYLmVxdWFscyhvcykgJiYgYmFzZS5zdGFydHNXaXRoKGV4ZWN1dGFibGVOYW1lICsgIi5hcHAiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWJhc2UgPSBuZXdOYW1lICsgIi5hcHAiICsgYmFzZS5zdWJzdHJpbmcoZXhlY3V0YWJsZU5hbWUubGVuZ3RoKCkgKyA0KTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UodGFyZ2V0RXhlY3V0YWJsZSkpCi0JCQkJcmVwbGFjZShmaWxlLCBuZXcgRmlsZShiYXNlICsgbmV3TmFtZSArIGV4ZWN1dGFibGVFeHRlbnNpb24pKTsKLQkJCWVsc2UgaWYgKGZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UodGFyZ2V0SW5pKSkKLQkJCQlyZXBsYWNlKGZpbGUsIG5ldyBGaWxlKGJhc2UgKyBuZXdOYW1lICsgIi5pbmkiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UgaWYgKENvbnN0YW50cy5PU19NQUNPU1guZXF1YWxzKG9zKSkKLQkJCQlyZXBsYWNlKGZpbGUsIG5ldyBGaWxlKGJhc2UgKyBmaWxlLmdldE5hbWUoKSkpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9GZWF0dXJlc0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9GZWF0dXJlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjZiMTAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvRmVhdHVyZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogUHVibGlzaCBJVXMgZm9yIGFsbCBvZiB0aGUgZmVhdHVyZXMgaW4gdGhlIGdpdmVuIHNldCBvZiBsb2NhdGlvbnMuICBUaGUgbG9jYXRpb25zIGNhbiAKLSAqIGJlIGFjdHVhbCBsb2NhdGlvbnMgb2YgdGhlIGZlYXR1cmVzIG9yIGZvbGRlcnMgb2YgZmVhdHVyZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlc0FjdGlvbiBleHRlbmRzIEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTF9GRUFUVVJFU19GSUxURVIgPSAiKG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnN0YWxsLmZlYXR1cmVzPXRydWUpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIEZlYXR1cmVbXSBmZWF0dXJlTGlzdDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRyYW5zZm9ybWVkSWQoU3RyaW5nIG9yaWdpbmFsLCBib29sZWFuIGlzUGx1Z2luLCBib29sZWFuIGlzR3JvdXApIHsKLQkJcmV0dXJuIChpc1BsdWdpbiA/IG9yaWdpbmFsIDogb3JpZ2luYWwgKyAoaXNHcm91cCA/ICIuZmVhdHVyZS5ncm91cCIgOiAiLmZlYXR1cmUuamFyIikpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0S2V5IGNyZWF0ZUZlYXR1cmVBcnRpZmFjdEtleShTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiBuZXcgQXJ0aWZhY3RLZXkoTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuRUNMSVBTRV9GRUFUVVJFX0NMQVNTSUZJRVIsIGlkLCBuZXcgVmVyc2lvbih2ZXJzaW9uKSk7Ci0JfQotCi0JcHVibGljIEZlYXR1cmVzQWN0aW9uKEZpbGVbXSBsb2NhdGlvbnMpIHsKLQkJZmVhdHVyZUxpc3QgPSBnZXRGZWF0dXJlcyhleHBhbmRMb2NhdGlvbnMobG9jYXRpb25zKSk7Ci0JfQotCi0JcHVibGljIEZlYXR1cmVzQWN0aW9uKEZlYXR1cmVbXSBmZWF0dXJlTGlzdCkgewotCQl0aGlzLmZlYXR1cmVMaXN0ID0gZmVhdHVyZUxpc3Q7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJZ2VuZXJhdGVGZWF0dXJlSVVzKGZlYXR1cmVMaXN0LCByZXN1bHRzLCBpbmZvKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlW10gZXhwYW5kTG9jYXRpb25zKEZpbGVbXSBsaXN0KSB7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWV4cGFuZExvY2F0aW9ucyhsaXN0LCByZXN1bHQpOwotCQlyZXR1cm4gKEZpbGVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IEZpbGVbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBleHBhbmRMb2NhdGlvbnMoRmlsZVtdIGxpc3QsIEFycmF5TGlzdCByZXN1bHQpIHsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGxvY2F0aW9uID0gbGlzdFtpXTsKLQkJCWlmIChsb2NhdGlvbi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJLy8gaWYgdGhlIGxvY2F0aW9uIGlzIGl0c2VsZiBhIGZlYXR1cmUsIGp1c3QgYWRkIGl0LiAgT3RoZXJ3aXNlIHIgZG93bgotCQkJCWlmICghbmV3IEZpbGUobG9jYXRpb24sICJmZWF0dXJlLnhtbCIpLmV4aXN0cygpKQotCQkJCQlleHBhbmRMb2NhdGlvbnMobG9jYXRpb24ubGlzdEZpbGVzKCksIHJlc3VsdCk7Ci0JCQkJZWxzZQotCQkJCQlyZXN1bHQuYWRkKGxvY2F0aW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0LmFkZChsb2NhdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUZlYXR1cmVJVXMoRmVhdHVyZVtdIGZlYXR1cmVzLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdCwgSVB1Ymxpc2hlckluZm8gaW5mbykgewotCQkvLyBCdWlsZCBGZWF0dXJlIElVcywgYW5kIGFkZCB0aGVtIHRvIGFueSBjb3JyZXNwb25kaW5nIGNhdGVnb3JpZXMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZXNbaV07Ci0JCQkvLyBUaGUgSVUgaGllcmFyY2h5IG11c3QgYmUgYnVpbHQgZnJvbSB0aGUgYm90dG9tIHVwIHNvIGRvIHRoZSByb290IGZpbGVzIGZpcnN0LgotCQkJQXJyYXlMaXN0IGNoaWxkSVVzID0gZ2VuZXJhdGVSb290RmlsZUlVcyhmZWF0dXJlLCByZXN1bHQsIGluZm8pOwotCQkJSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlSVUgPSBjcmVhdGVGZWF0dXJlSmFySVUoZmVhdHVyZSwgY2hpbGRJVXMsIGluZm8pOwotCQkJcHVibGlzaEZlYXR1cmVBcnRpZmFjdHMoZmVhdHVyZSwgZmVhdHVyZUlVLCBpbmZvKTsKLQkJCWdhdGhlckJ1bmRsZVNoYXBlQWR2aWNlKGZlYXR1cmUsIGluZm8pOwotCQkJLy8gY3JlYXRlIHRoZSBhc3NvY2lhdGVkIGdyb3VwIGFuZCByZWdpc3RlciB0aGUgZmVhdHVyZSBhbmQgZ3JvdXAgaW4gdGhlIHJlc3VsdC4KLQkJCUlJbnN0YWxsYWJsZVVuaXQgZ3JvdXBJVSA9IGNyZWF0ZUdyb3VwSVUoZmVhdHVyZSwgZmVhdHVyZUlVLCBudWxsKTsKLQkJCXJlc3VsdC5hZGRJVShncm91cElVLCBJUHVibGlzaGVyUmVzdWx0LlJPT1QpOwotCQkJcmVzdWx0LmFkZElVKGZlYXR1cmVJVSwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUZlYXR1cmVKYXJJVShGZWF0dXJlIGZlYXR1cmUsIEFycmF5TGlzdCBjaGlsZElVcywgSVB1Ymxpc2hlckluZm8gaW5mbykgewotCQkvLyBjcmVhdGUgdGhlIGJhc2ljIGZlYXR1cmUgSVUgd2l0aCBhbGwgdGhlIGNoaWxkcmVuCi0JCVN0cmluZyBsb2NhdGlvbiA9IGZlYXR1cmUuZ2V0TG9jYXRpb24oKTsKLQkJYm9vbGVhbiBpc0V4cGxvZGVkID0gKGxvY2F0aW9uLmVuZHNXaXRoKCIuamFyIikgPyBmYWxzZSA6IHRydWUpOyAvLyROT04tTkxTLTEkCi0JCVByb3BlcnRpZXMgcHJvcHMgPSBnZXRGZWF0dXJlQWR2aWNlKGZlYXR1cmUsIGluZm8pOwotCQlJSW5zdGFsbGFibGVVbml0IGZlYXR1cmVJVSA9IGNyZWF0ZUZlYXR1cmVKYXJJVShmZWF0dXJlLCBjaGlsZElVcywgaXNFeHBsb2RlZCwgcHJvcHMpOwotCQlyZXR1cm4gZmVhdHVyZUlVOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHB1Ymxpc2hGZWF0dXJlQXJ0aWZhY3RzKEZlYXR1cmUgZmVhdHVyZSwgSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlSVUsIElQdWJsaXNoZXJJbmZvIGluZm8pIHsKLQkJLy8gYWRkIGFsbCB0aGUgYXJ0aWZhY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmVhdHVyZQotCQkvLyBUT0RPIHRoaXMgaXMgYSBsaXR0bGUgc3RyYW5nZS4gIElmIHRoZXJlIGFyZSBzZXZlcmFsIGFydGlmYWN0cywgaG93IGRvIHdlIGtub3cgd2hpY2ggZmlsZXMgZ28gd2l0aAotCQkvLyB3aGljaCBhcnRpZmFjdHMgd2hlbiB3ZSBwdWJsaXNoIHRoZW0/ICBGb3Igbm93IGl0IHdvdWxkIGJlIHN1cnByaXNpbmcgdG8gaGF2ZSBtb3JlIHRoYW4gb25lCi0JCS8vIGFydGlmYWN0IHBlciBmZWF0dXJlIElVLgotCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBmZWF0dXJlSVUuZ2V0QXJ0aWZhY3RzKCk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgYXJ0aWZhY3RzLmxlbmd0aDsgaisrKSB7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmZWF0dXJlLmdldExvY2F0aW9uKCkpOwotCQkJSUFydGlmYWN0RGVzY3JpcHRvciBhZCA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUFydGlmYWN0RGVzY3JpcHRvcihhcnRpZmFjdHNbal0sIGZpbGUpOwotCQkJLy8gaWYgdGhlIGFydGlmYWN0IGlzIGEgZGlyIGFuZCB3ZSBhcmUgbm90IGRvaW5nICJBU19JUyIsIHppcCBpdCB1cC4KLQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkgJiYgISgoaW5mby5nZXRBcnRpZmFjdE9wdGlvbnMoKSAmIElQdWJsaXNoZXJJbmZvLkFfQVNfSVMpID4gMCkpCi0JCQkJcHVibGlzaEFydGlmYWN0KGFkLCBmaWxlLmxpc3RGaWxlcygpLCBpbmZvLCBJTkNMVURFX1JPT1QpOwotCQkJZWxzZQotCQkJCXB1Ymxpc2hBcnRpZmFjdChhZCwgbmV3IEZpbGVbXSB7ZmlsZX0sIGluZm8sIEFTX0lTIHwgSU5DTFVERV9ST09UKTsKLQkJfQotCX0KLQotCXByaXZhdGUgUHJvcGVydGllcyBnZXRGZWF0dXJlQWR2aWNlKEZlYXR1cmUgZmVhdHVyZSwgSVB1Ymxpc2hlckluZm8gaW5mbykgewotCQlQcm9wZXJ0aWVzIHJlc3VsdCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCUNvbGxlY3Rpb24gYWR2aWNlID0gaW5mby5nZXRBZHZpY2UobnVsbCwgZmFsc2UsIG51bGwsIG51bGwsIElGZWF0dXJlQWR2aWNlLmNsYXNzKTsKLQkJZm9yIChJdGVyYXRvciBpID0gYWR2aWNlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJSUZlYXR1cmVBZHZpY2UgZW50cnkgPSAoSUZlYXR1cmVBZHZpY2UpIGkubmV4dCgpOwotCQkJUHJvcGVydGllcyBwcm9wcyA9IGVudHJ5LmdldFByb3BlcnRpZXMoZmVhdHVyZSwgbnVsbCk7Ci0JCQlpZiAocHJvcHMgIT0gbnVsbCkKLQkJCQlyZXN1bHQucHV0QWxsKHByb3BzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBBcnJheUxpc3QgZ2VuZXJhdGVSb290RmlsZUlVcyhGZWF0dXJlIGZlYXR1cmUsIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0LCBJUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCUZpbGUgbG9jYXRpb24gPSBuZXcgRmlsZShmZWF0dXJlLmdldExvY2F0aW9uKCkpOwotCQlQcm9wZXJ0aWVzIHByb3BzID0gbG9hZFByb3BlcnRpZXMobG9jYXRpb24sICJidWlsZC5wcm9wZXJ0aWVzIik7Ci0JCXJldHVybiBnZW5lcmF0ZVJvb3RGaWxlSVVzKGZlYXR1cmUuZ2V0SWQoKSwgZmVhdHVyZS5nZXRWZXJzaW9uKCksIHByb3BzLCBsb2NhdGlvbiwgcmVzdWx0LCBpbmZvKTsKLQl9Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBnZW5lcmF0ZVJvb3RGaWxlSVVzKFN0cmluZyBmZWF0dXJlSWQsIFN0cmluZyBmZWF0dXJlVmVyc2lvbiwgUHJvcGVydGllcyBwcm9wcywgRmlsZSBsb2NhdGlvbiwgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHQsIElQdWJsaXNoZXJJbmZvIGluZm8pIHsKLQkJQXJyYXlMaXN0IGl1cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRmlsZVNldERlc2NyaXB0b3JbXSByb290RmlsZURlc2NyaXB0b3JzID0gZ2V0Um9vdEZpbGVEZXNjcmlwdG9ycyhwcm9wcyk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcm9vdEZpbGVEZXNjcmlwdG9ycy5sZW5ndGg7IGkrKykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IGdlbmVyYXRlUm9vdEZpbGVJVShmZWF0dXJlSWQsIGZlYXR1cmVWZXJzaW9uLCBsb2NhdGlvbiwgcm9vdEZpbGVEZXNjcmlwdG9yc1tpXSwgcmVzdWx0LCBpbmZvKTsKLQkJCWl1cy5hZGQoaXUpOwotCQl9Ci0JCXJldHVybiBpdXM7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGxvYWRQcm9wZXJ0aWVzKEZpbGUgbG9jYXRpb24sIFN0cmluZyBmaWxlKSB7Ci0JCVByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotCQlGaWxlIHRlbXBGaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGlmIHRoZSBmZWF0dXJlIGlzIGEgZGlyIHRoZW4ganVzdCByZXR1cm4gdGhlIGxvY2F0aW9uCi0JCQlpZiAoIWxvY2F0aW9uLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkvLyBvdGhlcndpc2UgZXh0cmFjdCB0aGUgSkFSIGludG8gYSB0ZW1wIGxvY2F0aW9uIGFuZCByZXR1cm4gdGhhdCBsb2NhdGlvbgotCQkJCXRlbXBGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgicDIuZ2VuZXJhdG9yIiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlGaWxlVXRpbHMudW56aXBGaWxlKGxvY2F0aW9uLCB0ZW1wRmlsZSk7Ci0JCQkJbG9jYXRpb24gPSB0ZW1wRmlsZTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShsb2NhdGlvbiwgZmlsZSkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9wcy5sb2FkKGluKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAoaW4gIT0gbnVsbCkKLQkJCQkJCWluLmNsb3NlKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUgaWYgaXQgaXMganVzdCBhIGZpbGUgbm90IGZvdW5kLgotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJFcnJvciBwYXJzaW5nICIgKyBmaWxlLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkVycm9yIHB1Ymxpc2hpbmcgYXJ0aWZhY3RzIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQlpZiAodGVtcEZpbGUgIT0gbnVsbCkKLQkJCQl0ZW1wRmlsZS5kZWxldGUoKTsKLQkJfQotCQlyZXR1cm4gcHJvcHM7Ci0JfQotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGdlbmVyYXRlUm9vdEZpbGVJVShTdHJpbmcgZmVhdHVyZUlkLCBTdHJpbmcgZmVhdHVyZVZlcnNpb24sIEZpbGUgbG9jYXRpb24sIEZpbGVTZXREZXNjcmlwdG9yIHJvb3RGaWxlLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdCwgSVB1Ymxpc2hlckluZm8gaW5mbykgewotCQlPYmplY3RbXSBpdUFuZEZpbGVzID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlRmVhdHVyZVJvb3RGaWxlSVUoZmVhdHVyZUlkLCBmZWF0dXJlVmVyc2lvbiwgbG9jYXRpb24sIHJvb3RGaWxlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdVJlc3VsdCA9IChJSW5zdGFsbGFibGVVbml0KSBpdUFuZEZpbGVzWzBdOwotCQlGaWxlW10gZmlsZVJlc3VsdCA9IChGaWxlW10pIGl1QW5kRmlsZXNbMV07Ci0JCWlmIChmaWxlUmVzdWx0ICE9IG51bGwgJiYgZmlsZVJlc3VsdC5sZW5ndGggPiAwKSB7Ci0JCQlJQXJ0aWZhY3RLZXkgYXJ0aWZhY3QgPSBpdVJlc3VsdC5nZXRBcnRpZmFjdHMoKVswXTsKLQkJCUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvcihhcnRpZmFjdCk7Ci0JCQlwdWJsaXNoQXJ0aWZhY3QoZGVzY3JpcHRvciwgZmlsZVJlc3VsdCwgaW5mbywgMCk7Ci0JCX0KLQkJcmVzdWx0LmFkZElVKGl1UmVzdWx0LCBJUHVibGlzaGVyUmVzdWx0Lk5PTl9ST09UKTsKLQkJcmV0dXJuIGl1UmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBGaWxlU2V0RGVzY3JpcHRvcltdIGdldFJvb3RGaWxlRGVzY3JpcHRvcnMoUHJvcGVydGllcyBwcm9wcykgewotCQlIYXNoTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IHByb3BzLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIHByb3BlcnR5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQkvLyB3ZSBvbmx5IGNhcmUgYWJvdXQgcm9vdCBwcm9wZXJ0aWVzCi0JCQlpZiAoIXByb3BlcnR5LnN0YXJ0c1dpdGgoInJvb3QuIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZ1tdIHNwZWMgPSBnZXRBcnJheUZyb21TdHJpbmcocHJvcGVydHksICIuIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBkZXNjcmlwdG9yS2V5ID0gc3BlY1swXTsKLQkJCVN0cmluZyBjb25maWdTcGVjID0gbnVsbDsKLQkJCS8vIGlmIHRoZSBzcGVjIGlzIDQgb3IgbW9yZSB0aGVuIHRoZXJlIG11c3QgYmUgYSBjb25maWcgaW52b2x2ZWQgdG8gZ2V0IGl0Ci0JCQlpZiAoc3BlYy5sZW5ndGggPiAzKSB7Ci0JCQkJY29uZmlnU3BlYyA9IGNyZWF0ZUNvbmZpZ1NwZWMoc3BlY1syXSwgc3BlY1sxXSwgc3BlY1szXSk7Ci0JCQkJZGVzY3JpcHRvcktleSArPSAiLiIgKyBjcmVhdGVJZFN0cmluZyhjb25maWdTcGVjKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlGaWxlU2V0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKEZpbGVTZXREZXNjcmlwdG9yKSByZXN1bHQuZ2V0KGRlc2NyaXB0b3JLZXkpOwotCQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCWRlc2NyaXB0b3IgPSBuZXcgRmlsZVNldERlc2NyaXB0b3IoZGVzY3JpcHRvcktleSwgY29uZmlnU3BlYyk7Ci0JCQkJcmVzdWx0LnB1dChkZXNjcmlwdG9yS2V5LCBkZXNjcmlwdG9yKTsKLQkJCX0KLQkJCS8vIGlmIHRoZSBsYXN0IHNlZ21lbnQgaW4gdGhlIHNwZWMgaXMgImxpbmsiIAotCQkJaWYgKHNwZWNbc3BlYy5sZW5ndGggLSAxXSA9PSAibGluayIpIC8vJE5PTi1OTFMtMSQKLQkJCQlkZXNjcmlwdG9yLnNldExpbmtzKHByb3BzLmdldFByb3BlcnR5KHByb3BlcnR5KSk7Ci0JCQllbHNlIHsKLQkJCQkvLyBpZiB0aGUgc2Vjb25kIGxhc3Qgc2VnbWVudCBpcyAicGVybWlzc2lvbnMiIAotCQkJCWlmIChzcGVjW3NwZWMubGVuZ3RoIC0gMl0uZXF1YWxzKCJwZXJtaXNzaW9ucyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWRlc2NyaXB0b3IuYWRkUGVybWlzc2lvbnMobmV3IFN0cmluZ1tdIHtzcGVjW3NwZWMubGVuZ3RoIC0gMV0sIHByb3BzLmdldFByb3BlcnR5KHByb3BlcnR5KX0pOwotCQkJCWVsc2UgewotCQkJCQkvLyBzbyBpdCBpcyBub3QgYSBsaW5rIG9yIGEgcGVybWlzc2lvbnMsIGl0IG11c3QgYmUgYSBzdHJhaWdodCBmaWxlIGNvcHkgKHdpdGggb3Igd2l0aG91dCBhIGNvbmZpZykKLQkJCQkJZGVzY3JpcHRvci5zZXRGaWxlcyhwcm9wcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlDb2xsZWN0aW9uIHZhbHVlcyA9IHJlc3VsdC52YWx1ZXMoKTsKLQkJcmV0dXJuIChGaWxlU2V0RGVzY3JpcHRvcltdKSB2YWx1ZXMudG9BcnJheShuZXcgRmlsZVNldERlc2NyaXB0b3JbdmFsdWVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEdhdGhlciBhbnkgYWR2aWNlIHdlIGNhbiBmcm9tIHRoZSBnaXZlbiBmZWF0dXJlLiAgSW4gcGFydGljdWxhciwgaXQgbWF5IGhhdmUKLQkgKiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2hhcGUgb2YgdGhlIGJ1bmRsZXMgaXQgaW5jbHVkZXMuICBUaGUgZGlzY292ZXJlZCBhZHZpY2UgaXMKLQkgKiBhZGRlZCB0byB0aGUgZ2l2ZW4gcmVzdWx0LgotCSAqIEBwYXJhbSBmZWF0dXJlIHRoZSBmZWF0dXJlIHRvIHByb2Nlc3MKLQkgKiBAcGFyYW0gaW5mbyB0aGUgcHVibGlzaGluZyBpbmZvIHRvIHVwZGF0ZQotCSAqLwotCXB1YmxpYyB2b2lkIGdhdGhlckJ1bmRsZVNoYXBlQWR2aWNlKEZlYXR1cmUgZmVhdHVyZSwgSVB1Ymxpc2hlckluZm8gaW5mbykgewotCQlGZWF0dXJlRW50cnkgZW50cmllc1tdID0gZmVhdHVyZS5nZXRFbnRyaWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZUVudHJ5IGVudHJ5ID0gZW50cmllc1tpXTsKLQkJCWlmIChlbnRyeS5pc1VucGFjaygpICYmIGVudHJ5LmlzUGx1Z2luKCkgJiYgIWVudHJ5LmlzUmVxdWlyZXMoKSkKLQkJCQlpbmZvLmFkZEFkdmljZShuZXcgQnVuZGxlU2hhcGVBZHZpY2UoZW50cnkuZ2V0SWQoKSwgbmV3IFZlcnNpb24oZW50cnkuZ2V0VmVyc2lvbigpKSwgSUJ1bmRsZVNoYXBlQWR2aWNlLkRJUikpOwotCQl9Ci0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlRmVhdHVyZUphcklVKEZlYXR1cmUgZmVhdHVyZSwgQXJyYXlMaXN0IGNoaWxkSVVzLCBib29sZWFuIGlzRXhwbG9kZWQsIFByb3BlcnRpZXMgZXh0cmFQcm9wZXJ0aWVzKSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGl1ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlTdHJpbmcgaWQgPSBnZXRUcmFuc2Zvcm1lZElkKGZlYXR1cmUuZ2V0SWQoKSwgLyppc1BsdWdpbiovZmFsc2UsIC8qaXNHcm91cCovZmFsc2UpOwotCQlpdS5zZXRJZChpZCk7Ci0JCVZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKGZlYXR1cmUuZ2V0VmVyc2lvbigpKTsKLQkJaXUuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJaWYgKGZlYXR1cmUuZ2V0TGljZW5zZSgpICE9IG51bGwpCi0JCQlpdS5zZXRMaWNlbnNlKG5ldyBMaWNlbnNlKGZlYXR1cmUuZ2V0TGljZW5zZVVSTCgpLCBmZWF0dXJlLmdldExpY2Vuc2UoKSkpOwotCQlpZiAoZmVhdHVyZS5nZXRDb3B5cmlnaHQoKSAhPSBudWxsKQotCQkJaXUuc2V0Q29weXJpZ2h0KG5ldyBDb3B5cmlnaHQoZmVhdHVyZS5nZXRDb3B5cmlnaHRVUkwoKSwgZmVhdHVyZS5nZXRDb3B5cmlnaHQoKSkpOwotCi0JCS8vIFRoZSByZXF1aXJlZCBjYXBhYmlsaXRpZXMgYXJlIG5vdCBzcGVjaWZpZWQgYXQgdGhpcyBsZXZlbCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlIGZlYXR1cmUgamFyIHRvIGJlIGF0dHJhY3RpdmUgdG8gaW5zdGFsbC4KLQotCQlpdS5zZXRUb3VjaHBvaW50VHlwZShNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5UT1VDSFBPSU5UX09TR0kpOwotCQlpdS5zZXRGaWx0ZXIoSU5TVEFMTF9GRUFUVVJFU19GSUxURVIpOwotCQlpdS5zZXRTaW5nbGV0b24odHJ1ZSk7Ci0KLQkJaWYgKGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXIoKSAhPSBudWxsICYmIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXIoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgaW5zdGFsbEhhbmRsZXJQcm9wZXJ0eSA9ICJoYW5kbGVyPSIgKyBmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyKCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJMaWJyYXJ5KCkgIT0gbnVsbCkKLQkJCQlpbnN0YWxsSGFuZGxlclByb3BlcnR5ICs9ICIsIGxpYnJhcnk9IiArIGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJMaWJyYXJ5KCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKGZlYXR1cmUuZ2V0SW5zdGFsbEhhbmRsZXJVUkwoKSAhPSBudWxsKQotCQkJCWluc3RhbGxIYW5kbGVyUHJvcGVydHkgKz0gIiwgdXJsPSIgKyBmZWF0dXJlLmdldEluc3RhbGxIYW5kbGVyVVJMKCk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaXUuc2V0UHJvcGVydHkoTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuRUNMSVBTRV9JTlNUQUxMX0hBTkRMRVJfUFJPUCwgaW5zdGFsbEhhbmRsZXJQcm9wZXJ0eSk7Ci0JCX0KLQotCQlpdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVTZWxmQ2FwYWJpbGl0eShpZCwgdmVyc2lvbiksIE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLkZFQVRVUkVfQ0FQQUJJTElUWSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5DQVBBQklMSVRZX05TX1VQREFURV9GRUFUVVJFLCBmZWF0dXJlLmdldElkKCksIHZlcnNpb24pfSk7Ci0JCWl1LnNldEFydGlmYWN0cyhuZXcgSUFydGlmYWN0S2V5W10ge2NyZWF0ZUZlYXR1cmVBcnRpZmFjdEtleShmZWF0dXJlLmdldElkKCksIHZlcnNpb24udG9TdHJpbmcoKSl9KTsKLQotCQkvLyBsaW5rIGluIGFsbCB0aGUgY2hpbGRyZW4gKGlmIGFueSkgYXMgcmVxdWlyZW1lbnRzLgotCQkvLyBUT0RPIGNvbnNpZGVyIGlmIHRoZXNlIHNob3VsZCBiZSBsaW5rZWQgYXMgZXhhY3QgdmVyc2lvbiBudW1iZXJzLiAgU2hvdWxkIGJlIG9rIGJ1dCBtYXkgYmUgYnJpdHRsZS4KLQkJaWYgKGNoaWxkSVVzICE9IG51bGwpIHsKLQkJCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtjaGlsZElVcy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZElVcy5zaXplKCk7IGkrKykgewotCQkJCUlJbnN0YWxsYWJsZVVuaXQgY2hpbGQgPSAoSUluc3RhbGxhYmxlVW5pdCkgY2hpbGRJVXMuZ2V0KGkpOwotCQkJCXJlcXVpcmVkW2ldID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5JVV9OQU1FU1BBQ0UsIGNoaWxkLmdldElkKCksIG5ldyBWZXJzaW9uUmFuZ2UoY2hpbGQuZ2V0VmVyc2lvbigpLCB0cnVlLCBjaGlsZC5nZXRWZXJzaW9uKCksIHRydWUpLCBJTlNUQUxMX0ZFQVRVUkVTX0ZJTFRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJCX0KLQkJCWl1LnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKHJlcXVpcmVkKTsKLQkJfQotCi0JCWlmIChpc0V4cGxvZGVkKSB7Ci0JCQkvLyBEZWZpbmUgdGhlIGltbXV0YWJsZSBtZXRhZGF0YSBmb3IgdGhpcyBJVS4gSW4gdGhpcyBjYXNlIGltbXV0YWJsZSBtZWFucwotCQkJLy8gdGhhdCB0aGlzIGlzIHNvbWV0aGluZyB0aGF0IHdpbGwgbm90IGltcGFjdCB0aGUgY29uZmlndXJhdGlvbi4KLQkJCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl0b3VjaHBvaW50RGF0YS5wdXQoInppcHBlZCIsICJ0cnVlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaXUuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCX0KLQotCQlpZiAoZXh0cmFQcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCUVudW1lcmF0aW9uIGUgPSBleHRyYVByb3BlcnRpZXMucHJvcGVydHlOYW1lcygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpdS5zZXRQcm9wZXJ0eShuYW1lLCBleHRyYVByb3BlcnRpZXMuZ2V0UHJvcGVydHkobmFtZSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXUpOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUdyb3VwSVUoRmVhdHVyZSBmZWF0dXJlLCBJSW5zdGFsbGFibGVVbml0IGZlYXR1cmVJVSwgUHJvcGVydGllcyBleHRyYVByb3BlcnRpZXMpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCVN0cmluZyBpZCA9IGdldFRyYW5zZm9ybWVkSWQoZmVhdHVyZS5nZXRJZCgpLCAvKmlzUGx1Z2luKi9mYWxzZSwgLyppc0dyb3VwKi90cnVlKTsKLQkJaXUuc2V0SWQoaWQpOwotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbihmZWF0dXJlLmdldFZlcnNpb24oKSk7Ci0JCWl1LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCWl1LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9OQU1FLCBmZWF0dXJlLmdldExhYmVsKCkpOwotCQlpZiAoZmVhdHVyZS5nZXRMaWNlbnNlKCkgIT0gbnVsbCkKLQkJCWl1LnNldExpY2Vuc2UobmV3IExpY2Vuc2UoZmVhdHVyZS5nZXRMaWNlbnNlVVJMKCksIGZlYXR1cmUuZ2V0TGljZW5zZSgpKSk7Ci0JCWlmIChmZWF0dXJlLmdldENvcHlyaWdodCgpICE9IG51bGwpCi0JCQlpdS5zZXRDb3B5cmlnaHQobmV3IENvcHlyaWdodChmZWF0dXJlLmdldENvcHlyaWdodFVSTCgpLCBmZWF0dXJlLmdldENvcHlyaWdodCgpKSk7Ci0JCWl1LnNldFVwZGF0ZURlc2NyaXB0b3IoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVVwZGF0ZURlc2NyaXB0b3IoaWQsIG5ldyBWZXJzaW9uUmFuZ2UobmV3IFZlcnNpb24oMCwgMCwgMCksIHRydWUsIG5ldyBWZXJzaW9uKGZlYXR1cmUuZ2V0VmVyc2lvbigpKSwgZmFsc2UpLCBJVXBkYXRlRGVzY3JpcHRvci5OT1JNQUwsIG51bGwpKTsKLQotCQkvLyBnZW5lcmF0ZSByZXF1aXJlbWVudHMgZm9yIHRoZSBmZWF0dXJlIGluY2x1c2lvbnMvcmVxdWlyZW1lbnQgCi0JCUZlYXR1cmVFbnRyeSBlbnRyaWVzW10gPSBmZWF0dXJlLmdldEVudHJpZXMoKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZWQgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W2VudHJpZXMubGVuZ3RoICsgMV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJVmVyc2lvblJhbmdlIHJhbmdlID0gZ2V0VmVyc2lvblJhbmdlKGVudHJpZXNbaV0pOwotCQkJcmVxdWlyZWRbaV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBnZXRUcmFuc2Zvcm1lZElkKGVudHJpZXNbaV0uZ2V0SWQoKSwgZW50cmllc1tpXS5pc1BsdWdpbigpLCAvKmlzR3JvdXAqL3RydWUpLCByYW5nZSwgZ2V0RmlsdGVyKGVudHJpZXNbaV0pLCBlbnRyaWVzW2ldLmlzT3B0aW9uYWwoKSwgZmFsc2UpOwotCQl9Ci0JCXJlcXVpcmVkW2VudHJpZXMubGVuZ3RoXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGZlYXR1cmVJVS5nZXRJZCgpLCBuZXcgVmVyc2lvblJhbmdlKGZlYXR1cmVJVS5nZXRWZXJzaW9uKCksIHRydWUsIGZlYXR1cmVJVS5nZXRWZXJzaW9uKCksIHRydWUpLCBJTlNUQUxMX0ZFQVRVUkVTX0ZJTFRFUiwgZmFsc2UsIGZhbHNlKTsKLQkJaXUuc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMocmVxdWlyZWQpOwotCQlpdS5zZXRUb3VjaHBvaW50VHlwZShUb3VjaHBvaW50VHlwZS5OT05FKTsKLQkJaXUuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfR1JPVVAsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJLy8gVE9ETzogc2hvdWxkbid0IHRoZSBmaWx0ZXIgZm9yIHRoZSBncm91cCBiZSBjb25zdHJ1Y3RlZCBmcm9tIG9zLCB3cywgYXJjaCwgbmwKLQkJLy8gCQkgb2YgdGhlIGZlYXR1cmU/Ci0JCS8vIGl1LnNldEZpbHRlcihmaWx0ZXIpOwotCQlpdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVTZWxmQ2FwYWJpbGl0eShpZCwgdmVyc2lvbil9KTsKLQotCQlpZiAoZXh0cmFQcm9wZXJ0aWVzICE9IG51bGwpIHsKLQkJCUVudW1lcmF0aW9uIGUgPSBleHRyYVByb3BlcnRpZXMucHJvcGVydHlOYW1lcygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpdS5zZXRQcm9wZXJ0eShuYW1lLCBleHRyYVByb3BlcnRpZXMuZ2V0UHJvcGVydHkobmFtZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGl1KTsKLQl9Ci0KLQlwdWJsaWMgVmVyc2lvblJhbmdlIGdldFZlcnNpb25SYW5nZShGZWF0dXJlRW50cnkgZW50cnkpIHsKLQkJU3RyaW5nIHZlcnNpb25TcGVjID0gZW50cnkuZ2V0VmVyc2lvbigpOwotCQlpZiAodmVyc2lvblNwZWMgPT0gbnVsbCkKLQkJCS8vIFRPRE8gc2hvdWxkIHJlYWxseSBiZSByZXR1cm5pbmcgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UgaGVyZS4uLgotCQkJcmV0dXJuIG51bGw7Ci0JCVZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKHZlcnNpb25TcGVjKTsKLQkJLy8gaWYgdGhpcyBpcyBhbiBpbmNsdWRlcyB0aGVuIHJldHVybiBlaXRoZXIgYSBjb21wbGV0ZWx5IG9wZW4gcmFuZ2UgKGlmIHRoZSB2ZXJpc29uIGlzIDAuMC4wKQotCQkvLyBvciBhbiBleGFjdCByYW5nZQotCQlpZiAoIWVudHJ5LmlzUmVxdWlyZXMoKSkgewotCQkJaWYgKHZlcnNpb24uZXF1YWxzKFZlcnNpb24uZW1wdHlWZXJzaW9uKSkKLQkJCQlyZXR1cm4gVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2U7Ci0JCQlyZXR1cm4gbmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCB2ZXJzaW9uLCB0cnVlKTsKLQkJfQotCQlTdHJpbmcgbWF0Y2ggPSBlbnRyeS5nZXRNYXRjaCgpOwotCQlpZiAobWF0Y2ggPT0gbnVsbCkKLQkJCS8vIFRPRE8gc2hvdWxkIHJlYWxseSBiZSByZXR1cm5pbmcgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UgaGVyZS4uLgotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChtYXRjaC5lcXVhbHMoInBlcmZlY3QiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgdmVyc2lvbiwgdHJ1ZSk7Ci0JCWlmIChtYXRjaC5lcXVhbHMoImVxdWl2YWxlbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlWZXJzaW9uIHVwcGVyID0gbmV3IFZlcnNpb24odmVyc2lvbi5nZXRNYWpvcigpLCB2ZXJzaW9uLmdldE1pbm9yKCkgKyAxLCAwKTsKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIHVwcGVyLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKG1hdGNoLmVxdWFscygiY29tcGF0aWJsZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVZlcnNpb24gdXBwZXIgPSBuZXcgVmVyc2lvbih2ZXJzaW9uLmdldE1ham9yKCkgKyAxLCAwLCAwKTsKLQkJCXJldHVybiBuZXcgVmVyc2lvblJhbmdlKHZlcnNpb24sIHRydWUsIHVwcGVyLCBmYWxzZSk7Ci0JCX0KLQkJaWYgKG1hdGNoLmVxdWFscygiZ3JlYXRlck9yRXF1YWwiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBWZXJzaW9uUmFuZ2UodmVyc2lvbiwgdHJ1ZSwgbmV3IFZlcnNpb25SYW5nZShudWxsKS5nZXRNYXhpbXVtKCksIHRydWUpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpbHRlcihGZWF0dXJlRW50cnkgZW50cnkpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJcmVzdWx0LmFwcGVuZCgiKCYiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZW50cnkuZ2V0RmlsdGVyKCkgIT0gbnVsbCkKLQkJCXJlc3VsdC5hcHBlbmQoZW50cnkuZ2V0RmlsdGVyKCkpOwotCQlpZiAoZW50cnkuZ2V0T1MoKSAhPSBudWxsKQotCQkJcmVzdWx0LmFwcGVuZCgiKG9zZ2kub3M9IiArIGVudHJ5LmdldE9TKCkgKyAnKScpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGVudHJ5LmdldFdTKCkgIT0gbnVsbCkKLQkJCXJlc3VsdC5hcHBlbmQoIihvc2dpLndzPSIgKyBlbnRyeS5nZXRXUygpICsgJyknKTsvLyROT04tTkxTLTEkCi0JCWlmIChlbnRyeS5nZXRBcmNoKCkgIT0gbnVsbCkKLQkJCXJlc3VsdC5hcHBlbmQoIihvc2dpLmFyY2g9IiArIGVudHJ5LmdldEFyY2goKSArICcpJyk7Ly8kTk9OLU5MUy0xJAotCQlpZiAoZW50cnkuZ2V0TkwoKSAhPSBudWxsKQotCQkJcmVzdWx0LmFwcGVuZCgiKG9zZ2kubmw9IiArIGVudHJ5LmdldE5MKCkgKyAnKScpOy8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc3VsdC5sZW5ndGgoKSA9PSAyKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBGZWF0dXJlW10gZ2V0RmVhdHVyZXMoRmlsZVtdIGxvY2F0aW9ucykgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChsb2NhdGlvbnMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCUZlYXR1cmUgZmVhdHVyZSA9IG5ldyBGZWF0dXJlUGFyc2VyKCkucGFyc2UobG9jYXRpb25zW2ldKTsKLQkJCWlmIChmZWF0dXJlICE9IG51bGwpIHsKLQkJCQlmZWF0dXJlLnNldExvY2F0aW9uKGxvY2F0aW9uc1tpXS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJcmVzdWx0LmFkZChmZWF0dXJlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKEZlYXR1cmVbXSkgcmVzdWx0LnRvQXJyYXkobmV3IEZlYXR1cmVbcmVzdWx0LnNpemUoKV0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSUJ1bmRsZUFkdmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JQnVuZGxlQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNmFhNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JQnVuZGxlQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuSVB1Ymxpc2hpbmdBZHZpY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUJ1bmRsZUFkdmljZSBleHRlbmRzIElQdWJsaXNoaW5nQWR2aWNlIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNldCBvZiBleHRyYSBwcm9wZXJ0aWVzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgSVUgZm9yIHRoZSBidW5kbGUKLQkgKiBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24KLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBmZWF0dXJlIHRvIGFkdmlzZQotCSAqIEByZXR1cm4gZXh0cmEgcHJvcGVydGllcyBmb3IgdGhlIGdpdmVuIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKEZpbGUgbG9jYXRpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JQnVuZGxlU2hhcGVBZHZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSUJ1bmRsZVNoYXBlQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhMGQ5MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JQnVuZGxlU2hhcGVBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLkJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5JUHVibGlzaGluZ0FkdmljZTsKLQotcHVibGljIGludGVyZmFjZSBJQnVuZGxlU2hhcGVBZHZpY2UgZXh0ZW5kcyBJUHVibGlzaGluZ0FkdmljZSB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSID0gQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5LkRJUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVIgPSBCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkuSkFSOwotCi0JcHVibGljIFN0cmluZyBnZXRTaGFwZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JQ29uZmlnQWR2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0lDb25maWdBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwNjUyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0lDb25maWdBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLklQdWJsaXNoaW5nQWR2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uQnVuZGxlSW5mbzsKLQotcHVibGljIGludGVyZmFjZSBJQ29uZmlnQWR2aWNlIGV4dGVuZHMgSVB1Ymxpc2hpbmdBZHZpY2UgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiY29uZmlnX2FkdmljZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBCdW5kbGVJbmZvW10gZ2V0QnVuZGxlcygpOwotCi0JcHVibGljIFByb3BlcnRpZXMgZ2V0UHJvcGVydGllcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JRmVhdHVyZUFkdmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JRmVhdHVyZUFkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTNhODJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSUZlYXR1cmVBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5JUHVibGlzaGluZ0FkdmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlcy5GZWF0dXJlOwotCi1wdWJsaWMgaW50ZXJmYWNlIElGZWF0dXJlQWR2aWNlIGV4dGVuZHMgSVB1Ymxpc2hpbmdBZHZpY2UgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2V0IG9mIGV4dHJhIHByb3BlcnRpZXMgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJVSBmb3IgdGhlIGZlYXR1cmUKLQkgKiBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24KLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBmZWF0dXJlIHRvIGFkdmlzZQotCSAqIEByZXR1cm4gZXh0cmEgcHJvcGVydGllcyBmb3IgdGhlIGdpdmVuIGZlYXR1cmUKLQkgKi8KLQlwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKEZlYXR1cmUgZmVhdHVyZSwgRmlsZSBsb2NhdGlvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0lMYXVuY2hpbmdBZHZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSUxhdW5jaGluZ0FkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWFhZjA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSUxhdW5jaGluZ0FkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuSVB1Ymxpc2hpbmdBZHZpY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUxhdW5jaGluZ0FkdmljZSBleHRlbmRzIElQdWJsaXNoaW5nQWR2aWNlIHsKLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRWTUFyZ3VtZW50cygpOwotCi0JcHVibGljIFN0cmluZ1tdIGdldFByb2dyYW1Bcmd1bWVudHMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0YWJsZU5hbWUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSVJvb3RGaWxlc0FkdmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JUm9vdEZpbGVzQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxODc1OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JUm9vdEZpbGVzQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuSVB1Ymxpc2hpbmdBZHZpY2U7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJvb3RGaWxlc0FkdmljZSBleHRlbmRzIElQdWJsaXNoaW5nQWR2aWNlIHsKLQotCXB1YmxpYyBGaWxlIGdldFJvb3QoKTsKLQotCXB1YmxpYyBGaWxlW10gZ2V0SW5jbHVkZWRGaWxlcygpOwotCi0JcHVibGljIEZpbGVbXSBnZXRFeGNsdWRlZEZpbGVzKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSVJvb3RJVUFkdmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JUm9vdElVQWR2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNjhlMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9JUm9vdElVQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJUm9vdElVQWR2aWNlIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gb2YgdGhlIHJvb3QgZm9yIHRoaXMgcHVibGlzaGluZyBvcGVyYXRpb24uCi0JICogUmV0dXJuZWQgZWxlbWVudHMgYXJlIGVpdGhlciB0aGUgU3RyaW5nIGlkIG9mIHRoZSBJVXMgb3IgdGhlIElVcyB0aGVtc2VsdmVzLgotCSAqIEByZXR1cm4gdGhlIGNvbGxlY3Rpb24gb2YgY2hpbGRyZW4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRDaGlsZHJlbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSVZlcnNpb25BZHZpY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvSVZlcnNpb25BZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQzY2ViYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0lWZXJzaW9uQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5JUHVibGlzaGluZ0FkdmljZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGludGVyZmFjZSBJVmVyc2lvbkFkdmljZSBleHRlbmRzIElQdWJsaXNoaW5nQWR2aWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInZlcnNpb25fYWR2aWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX0JVTkRMRSA9ICJidW5kbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfRkVBVFVSRSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5TX1JPT1QgPSAicm9vdCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZlcnNpb24gYWR2aWNlIGZvciB0aGUgZ2l2ZW4gaWQgaW4gdGhlIGdpdmVuIG5hbWVzcGFjZS4KLQkgKiBAcGFyYW0gbmFtZXNwYWNlIHRoZSBuYW1lc3BhY2UgaW4gd2hpY2ggdG8gbG9vayBmb3IgYWR2aWNlCi0JICogQHBhcmFtIGlkIHRoZSBpdGVtIGZvciB3aGljaCBhZHZpY2UgaXMgc291Z2h0Ci0JICogQHJldHVybiB0aGUgdmVyc2lvbiBhZHZpY2UgZm91bmQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm9uZQotCSAqLwotCXB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGlkKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZlcnNpb24gYWR2aWNlIGZvciB0aGUgZ2l2ZW4gaWQgaW4gdGhlIGdpdmVuIG5hbWVzcGFjZS4KLQkgKiBAcGFyYW0gbmFtZXNwYWNlIHRoZSBuYW1lc3BhY2UgaW4gd2hpY2ggdG8gbG9vayBmb3IgYWR2aWNlCi0JICogQHBhcmFtIGlkIHRoZSBpdGVtIGZvciB3aGljaCBhZHZpY2UgaXMgc291Z2h0Ci0JICogQHBhcmFtIHZlcnNpb24gdGhlIHZlcnNpb24gYWR2aWNlIGZvciB0aGUgZ2l2ZW4gaWQgb3IgPGNvZGU+bnVsbDwvY29kZT4gdG8gcmVtb3ZlIGFkdmljZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24pOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0pSRUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9KUkVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE5M2U5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0pSRUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLQotcHVibGljIGNsYXNzIEpSRUFjdGlvbiBleHRlbmRzIEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbiB7Ci0KLQlwcml2YXRlIEZpbGUgbG9jYXRpb247Ci0KLQlwdWJsaWMgSlJFQWN0aW9uKElQdWJsaXNoZXJJbmZvIGluZm8sIEZpbGUgbG9jYXRpb24pIHsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHBlcmZvcm0oSVB1Ymxpc2hlckluZm8gaW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCUlBcnRpZmFjdERlc2NyaXB0b3IgYXJ0aWZhY3QgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVKUkVEYXRhKGxvY2F0aW9uLCByZXN1bHRzKTsKLQkJaWYgKGFydGlmYWN0ICE9IG51bGwpCi0JCQlwdWJsaXNoQXJ0aWZhY3QoYXJ0aWZhY3QsIG5ldyBGaWxlW10ge2xvY2F0aW9ufSwgaW5mbywgSU5DTFVERV9ST09UKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0xhdW5jaGluZ0FkdmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9MYXVuY2hpbmdBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0OTk5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL0xhdW5jaGluZ0FkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5MYXVuY2hlckRhdGE7Ci0KLXB1YmxpYyBjbGFzcyBMYXVuY2hpbmdBZHZpY2UgZXh0ZW5kcyBBYnN0cmFjdEFkdmljZSBpbXBsZW1lbnRzIElMYXVuY2hpbmdBZHZpY2UgewotCi0JcHJpdmF0ZSBMYXVuY2hlckRhdGEgZGF0YTsKLQlwcml2YXRlIFN0cmluZyBjb25maWdTcGVjOwotCi0JcHVibGljIExhdW5jaGluZ0FkdmljZShMYXVuY2hlckRhdGEgZGF0YSwgU3RyaW5nIGNvbmZpZ1NwZWMpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJdGhpcy5jb25maWdTcGVjID0gY29uZmlnU3BlYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbmZpZ1NwZWMoKSB7Ci0JCXJldHVybiBjb25maWdTcGVjOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQcm9ncmFtQXJndW1lbnRzKCkgewotCQlyZXR1cm4gZGF0YS5nZXRQcm9ncmFtQXJncygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRWTUFyZ3VtZW50cygpIHsKLQkJcmV0dXJuIGRhdGEuZ2V0SnZtQXJncygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0YWJsZU5hbWUoKSB7Ci0JCXJldHVybiBkYXRhLmdldExhdW5jaGVyTmFtZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Mb2NhbFVwZGF0ZVNpdGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvTG9jYWxVcGRhdGVTaXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOGJmMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Mb2NhbFVwZGF0ZVNpdGVBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXMuVXBkYXRlU2l0ZTsKLQotLyoqCi0gKiBBIHB1Ymxpc2hpbmcgYWN0aW9uIHRoYXQgcHJvY2Vzc2VzIGEgbG9jYWwgKEZpbGUtYmFzZWQpIHVwZGF0ZSBzaXRlIGFuZCBnZW5lcmF0ZXMKLSAqIG1ldGFkYXRhIGFuZCBhcnRpZmFjdHMgZm9yIHRoZSBmZWF0dXJlcywgYnVuZGxlcyBhbmQgc2l0ZSBpbmRleCAoY2F0ZWdvcmllcyBldGMpLgotICovCi1wdWJsaWMgY2xhc3MgTG9jYWxVcGRhdGVTaXRlQWN0aW9uIGltcGxlbWVudHMgSVB1Ymxpc2hpbmdBY3Rpb24gewotCXByb3RlY3RlZCBTdHJpbmcgc291cmNlOwotCXByaXZhdGUgVXBkYXRlU2l0ZSB1cGRhdGVTaXRlOwotCi0JcHJvdGVjdGVkIExvY2FsVXBkYXRlU2l0ZUFjdGlvbigpIHsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxVcGRhdGVTaXRlQWN0aW9uKFN0cmluZyBzb3VyY2UpIHsKLQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JfQotCi0JcHVibGljIExvY2FsVXBkYXRlU2l0ZUFjdGlvbihVcGRhdGVTaXRlIHVwZGF0ZVNpdGUpIHsKLQkJdGhpcy51cGRhdGVTaXRlID0gdXBkYXRlU2l0ZTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBwZXJmb3JtKElQdWJsaXNoZXJJbmZvIGluZm8sIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0cykgewotCQlJUHVibGlzaGluZ0FjdGlvbltdIGFjdGlvbnMgPSBjcmVhdGVBY3Rpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykKLQkJCWFjdGlvbnNbaV0ucGVyZm9ybShpbmZvLCByZXN1bHRzKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIElQdWJsaXNoaW5nQWN0aW9uW10gY3JlYXRlQWN0aW9ucygpIHsKLQkJY3JlYXRlQWR2aWNlKCk7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGNyZWF0ZSBhbiBhY3Rpb24gdGhhdCBqdXN0IHB1Ymxpc2hlcyB0aGUgcmF3IGJ1bmRsZXMgYW5kIGZlYXR1cmVzCi0JCUlQdWJsaXNoaW5nQWN0aW9uIGFjdGlvbiA9IG5ldyBNZXJnZVJlc3VsdHNBY3Rpb24obmV3IElQdWJsaXNoaW5nQWN0aW9uW10ge2NyZWF0ZUZlYXR1cmVzQWN0aW9uKCksIGNyZWF0ZUJ1bmRsZXNBY3Rpb24oKX0sIElQdWJsaXNoZXJSZXN1bHQuTUVSR0VfQUxMX05PTl9ST09UKTsKLQkJcmVzdWx0LmFkZChhY3Rpb24pOwotCQlyZXN1bHQuYWRkKGNyZWF0ZVNpdGVYTUxBY3Rpb24oKSk7Ci0JCXJldHVybiAoSVB1Ymxpc2hpbmdBY3Rpb25bXSkgcmVzdWx0LnRvQXJyYXkobmV3IElQdWJsaXNoaW5nQWN0aW9uW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIElQdWJsaXNoaW5nQWN0aW9uIGNyZWF0ZVNpdGVYTUxBY3Rpb24oKSB7Ci0JCWlmICh1cGRhdGVTaXRlICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IFNpdGVYTUxBY3Rpb24odXBkYXRlU2l0ZSk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IFNpdGVYTUxBY3Rpb24obmV3IEZpbGUoc291cmNlLCAic2l0ZS54bWwiKS50b1VSTCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBuZXZlciBoYXBwZW5zCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUFkdmljZSgpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVB1Ymxpc2hpbmdBY3Rpb24gY3JlYXRlRmVhdHVyZXNBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgRmVhdHVyZXNBY3Rpb24obmV3IEZpbGVbXSB7bmV3IEZpbGUoc291cmNlLCAiZmVhdHVyZXMiKX0pOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIElQdWJsaXNoaW5nQWN0aW9uIGNyZWF0ZUJ1bmRsZXNBY3Rpb24oKSB7Ci0JCXJldHVybiBuZXcgQnVuZGxlc0FjdGlvbihuZXcgRmlsZVtdIHtuZXcgRmlsZShzb3VyY2UsICJwbHVnaW5zIil9KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9NZXJnZVJlc3VsdHNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvTWVyZ2VSZXN1bHRzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOGNjZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9NZXJnZVJlc3VsdHNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuKjsKLQotcHVibGljIGNsYXNzIE1lcmdlUmVzdWx0c0FjdGlvbiBleHRlbmRzIEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbiB7Ci0KLQlwcml2YXRlIElQdWJsaXNoaW5nQWN0aW9uW10gYWN0aW9uczsKLQlwcml2YXRlIGludCBtb2RlOwotCi0JcHVibGljIE1lcmdlUmVzdWx0c0FjdGlvbihJUHVibGlzaGluZ0FjdGlvbltdIGFjdGlvbnMsIGludCBtb2RlKSB7Ci0JCXRoaXMuYWN0aW9ucyA9IGFjdGlvbnM7Ci0JCXRoaXMubW9kZSA9IG1vZGU7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY3Rpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlJUHVibGlzaGluZ0FjdGlvbiBhY3Rpb24gPSBhY3Rpb25zW2ldOwotCQkJSVB1Ymxpc2hlclJlc3VsdCByZXN1bHQgPSBuZXcgUHVibGlzaGVyUmVzdWx0KCk7Ci0JCQlhY3Rpb24ucGVyZm9ybShpbmZvLCByZXN1bHQpOwotCQkJcmVzdWx0cy5tZXJnZShyZXN1bHQsIG1vZGUpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvUHJvZHVjdEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Qcm9kdWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NWVhNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Qcm9kdWN0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLklQdWJsaXNoZXJSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuSVB1Ymxpc2hpbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXMuUHJvZHVjdEZpbGU7Ci0KLXB1YmxpYyBjbGFzcyBQcm9kdWN0QWN0aW9uIGV4dGVuZHMgRWNsaXBzZUluc3RhbGxBY3Rpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdExvY2F0aW9uOwotCXByaXZhdGUgRmlsZSBleGVjdXRhYmxlc0ZlYXR1cmVMb2NhdGlvbjsKLQotCXB1YmxpYyBQcm9kdWN0QWN0aW9uKFN0cmluZyBzb3VyY2UsIFN0cmluZyBwcm9kdWN0TG9jYXRpb24sIFN0cmluZyBmbGF2b3IsIEZpbGUgZXhlY3V0YWJsZXNGZWF0dXJlTG9jYXRpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7Ci0JCXRoaXMuZmxhdm9yID0gZmxhdm9yOwotCQl0aGlzLmV4ZWN1dGFibGVzRmVhdHVyZUxvY2F0aW9uID0gZXhlY3V0YWJsZXNGZWF0dXJlTG9jYXRpb247Ci0JCXRoaXMucHJvZHVjdExvY2F0aW9uID0gcHJvZHVjdExvY2F0aW9uOwotCX0KLQotCXByb3RlY3RlZCBJUHVibGlzaGluZ0FjdGlvbltdIGNyZWF0ZUFjdGlvbnMoKSB7Ci0JCS8vIGdlbmVyYXRlIHRoZSBhZHZpY2Ugd2UgY2FuIHVwIGZyb250LgotCQljcmVhdGVBZHZpY2UoKTsKLQotCQkvLyBjcmVhdGUgYWxsIHRoZSBhY3Rpb25zIG5lZWRlZCB0byBwdWJsaXNoIGEgcHJvZHVjdAotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBpZiB3ZSBoYXZlIGEgc291cmNlIGxvY2F0aW9uIHRoZW4gY3JlYXRlIGFjdGlvbnMgdGhhdCBwdWJsaXNoZXMgdGhlIGJ1bmRsZXMgCi0JCS8vIGFuZCBmZWF0dXJlcyBhcyB3ZWxsIGFzIHRoZSByb290IGZpbGVzLCBsYXVuY2hlcnMsIGV0Yy4KLQkJaWYgKHNvdXJjZSAhPSBudWxsKSB7Ci0JCQlJUHVibGlzaGluZ0FjdGlvbiBhY3Rpb24gPSBuZXcgTWVyZ2VSZXN1bHRzQWN0aW9uKG5ldyBJUHVibGlzaGluZ0FjdGlvbltdIHtjcmVhdGVGZWF0dXJlc0FjdGlvbigpLCBjcmVhdGVCdW5kbGVzQWN0aW9uKCl9LCBJUHVibGlzaGVyUmVzdWx0Lk1FUkdFX0FMTF9OT05fUk9PVCk7Ci0JCQlyZXN1bHQuYWRkKGFjdGlvbik7Ci0JCQlyZXN1bHQuYWRkKGNyZWF0ZUVxdWlub3hMYXVuY2hlckZyYWdtZW50c0FjdGlvbigpKTsKLQkJfQotCQkvLyBwcm9kdWN0cyBpbmNsdWRlIHRoZSBleGVjdXRhYmxlIHNvIGFkZCBhY3Rpb25zIHRvIHB1Ymxpc2ggdGhlbQotCQlyZXN1bHQuYWRkQWxsKGNyZWF0ZUV4ZWN1dGFibGVzQWN0aW9ucyhpbmZvLmdldENvbmZpZ3VyYXRpb25zKCkpKTsKLQkJLy8gYWRkIHRoZSBhY3Rpb25zIHRoYXQganVzdCBjb25maWd1cmUgdGhpbmdzLgotCQlyZXN1bHQuYWRkKGNyZWF0ZUpSRUFjdGlvbigpKTsKLQkJcmVzdWx0LmFkZChjcmVhdGVDb25maWdDVXNBY3Rpb24oKSk7Ci0JCXJlc3VsdC5hZGQoY3JlYXRlRGVmYXVsdENVc0FjdGlvbigpKTsKLQkJcmVzdWx0LmFkZChjcmVhdGVSb290SVVBY3Rpb24oKSk7Ci0JCXJldHVybiAoSVB1Ymxpc2hpbmdBY3Rpb25bXSkgcmVzdWx0LnRvQXJyYXkobmV3IElQdWJsaXNoaW5nQWN0aW9uW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIFByb2R1Y3RGaWxlIGxvYWRQcm9kdWN0KCkgewotCQlQcm9kdWN0RmlsZSBwcm9kdWN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXByb2R1Y3QgPSBuZXcgUHJvZHVjdEZpbGUocHJvZHVjdExvY2F0aW9uKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vVE9ETwotCQl9Ci0JCWlmIChwcm9kdWN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1bmFibGUgdG8gbG9hZCBwcm9kdWN0IGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcHJvZHVjdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQWR2aWNlKCkgewotCQlQcm9kdWN0RmlsZSBwcm9kdWN0ID0gbG9hZFByb2R1Y3QoKTsKLQkJY3JlYXRlUHJvZHVjdEFkdmljZShwcm9kdWN0KTsKLQkJY3JlYXRlUm9vdEFkdmljZShwcm9kdWN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVSb290QWR2aWNlKFByb2R1Y3RGaWxlIHByb2R1Y3QpIHsKLQkJQ29sbGVjdGlvbiBsaXN0OwotCQlpZiAocHJvZHVjdC51c2VGZWF0dXJlcygpKQotCQkJbGlzdCA9IGxpc3RFbGVtZW50cyhwcm9kdWN0LmdldEZlYXR1cmVzKCksICIuZmVhdHVyZS5ncm91cCIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWxpc3QgPSBsaXN0RWxlbWVudHMocHJvZHVjdC5nZXRCdW5kbGVzKHRydWUpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJaW5mby5hZGRBZHZpY2UobmV3IFJvb3RJVUFkdmljZShsaXN0KSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVByb2R1Y3RBZHZpY2UoUHJvZHVjdEZpbGUgcHJvZHVjdCkgewotCQlpZCA9IHByb2R1Y3QuZ2V0SWQoKTsKLQkJdmVyc2lvbiA9IHByb2R1Y3QuZ2V0VmVyc2lvbigpOwotCQluYW1lID0gcHJvZHVjdC5nZXRJZCgpOwotCi0JCVN0cmluZ1tdIGNvbmZpZ1NwZWNzID0gaW5mby5nZXRDb25maWd1cmF0aW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ1NwZWNzLmxlbmd0aDsgaSsrKQotCQkJaW5mby5hZGRBZHZpY2UobmV3IFByb2R1Y3RGaWxlQWR2aWNlKHByb2R1Y3QsIGNvbmZpZ1NwZWNzW2ldKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbGxlY3Rpb24gY3JlYXRlRXhlY3V0YWJsZXNBY3Rpb25zKFN0cmluZ1tdIGNvbmZpZ1NwZWNzKSB7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gbmV3IEFycmF5TGlzdChjb25maWdTcGVjcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ1NwZWNzLmxlbmd0aDsgaSsrKSB7Ci0JCQlFeGVjdXRhYmxlc0Rlc2NyaXB0b3IgZXhlY3V0YWJsZXMgPSBjb21wdXRlRXhlY3V0YWJsZXMoY29uZmlnU3BlY3NbaV0pOwotCQkJSVB1Ymxpc2hpbmdBY3Rpb24gYWN0aW9uID0gbmV3IEJyYW5kZWRFeGVjdXRhYmxlQWN0aW9uKGV4ZWN1dGFibGVzLCBwcm9kdWN0TG9jYXRpb24sIGZsYXZvciwgY29uZmlnU3BlY3NbaV0pOwotCQkJcmVzdWx0LmFkZChhY3Rpb24pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEV4ZWN1dGFibGVzRGVzY3JpcHRvciBjb21wdXRlRXhlY3V0YWJsZXMoU3RyaW5nIGNvbmZpZ1NwZWMpIHsKLQkJLy8gaWYgd2Uga25vdyBhYm91dCB0aGUgZXhlY3V0YWJsZXMgZmVhdHVyZSB0aGVuIHVzZSBpdCBhcyB0aGUgc291cmNlCi0JCUZpbGUgbG9jYXRpb24gPSBnZXRFeGVjdXRhYmxlc0ZlYXR1cmVMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJRXhlY3V0YWJsZXNEZXNjcmlwdG9yIHJlc3VsdCA9IEV4ZWN1dGFibGVzRGVzY3JpcHRvci5jcmVhdGVFeGVjdXRhYmxlc0Zyb21GZWF0dXJlKGxvY2F0aW9uLCBjb25maWdTcGVjKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCS8vIG90aGVyd2lzZSwgYXNzdW1lIHRoYXQgd2UgYXJlIHJ1bm5pbmcgYWdhaW5zdCBhbiBFY2xpcHNlIGluc3RhbGwgYW5kIGRvIHRoZSBkZWZhdWx0IHRoaW5nCi0JCXJldHVybiBzdXBlci5jb21wdXRlRXhlY3V0YWJsZXMoY29uZmlnU3BlYyk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGdldEV4ZWN1dGFibGVzRmVhdHVyZUxvY2F0aW9uKCkgewotCQlpZiAoZXhlY3V0YWJsZXNGZWF0dXJlTG9jYXRpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGVjdXRhYmxlc0ZlYXR1cmVMb2NhdGlvbjsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIFRoZSBleGVjdXRhYmxlcyB3ZXJlIG5vdCBleHBsaWNpdGx5IGxvY2F0ZWQgYnV0IHRoZSBzb3VyY2Ugd2FzIHNvIHBva2UgYXJvdW5kIGFuZCBzZWUgaWYgCi0JCS8vIHdlIGNhbiBmaW5kIHNvbWV0aGluZwotCQkvLyBUT0RPIGltcGxlbWVudCB0aGlzCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBsaXN0RWxlbWVudHMoTGlzdCBlbGVtZW50cywgU3RyaW5nIHN1ZmZpeCkgewotCQlBcnJheUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50cy5zaXplKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0JCQlyZXN1bHQuYWRkKCgoU3RyaW5nKSBpLm5leHQoKSkgKyBzdWZmaXgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Qcm9kdWN0RmlsZUFkdmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Qcm9kdWN0RmlsZUFkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2U3ZmRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvUHJvZHVjdEZpbGVBZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzLlByb2R1Y3RGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uQnVuZGxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkNvbmZpZ0RhdGE7Ci0KLS8qKgotICogUHJvdmlkZSBhZHZpY2UgZGVyaXZlZCBmcm9tIHRoZSAucHJvZHVjdCBmaWxlLiAgVGhlIHByb2R1Y3QgY2FuIGdpdmUgc29tZSBpbmZvIG9uIAotICogbGF1bmNoaW5nIGFzIHdlbGwgYXMgdGhlIGNvbmZpZ3VyYXRpb24gKGJ1bmRsZXMsIHByb3BlcnRpZXMsIC4uLikKLSAqLwotcHVibGljIGNsYXNzIFByb2R1Y3RGaWxlQWR2aWNlIGV4dGVuZHMgQWJzdHJhY3RBZHZpY2UgaW1wbGVtZW50cyBJTGF1bmNoaW5nQWR2aWNlLCBJQ29uZmlnQWR2aWNlIHsKLQotCXByaXZhdGUgUHJvZHVjdEZpbGUgcHJvZHVjdDsKLQlwcml2YXRlIFN0cmluZyBjb25maWdTcGVjOwotCXByaXZhdGUgU3RyaW5nIG9zOwotCXByaXZhdGUgQ29uZmlnRGF0YSBjb25maWdEYXRhID0gbnVsbDsKLQotCXB1YmxpYyBQcm9kdWN0RmlsZUFkdmljZShQcm9kdWN0RmlsZSBwcm9kdWN0LCBTdHJpbmcgY29uZmlnU3BlYykgewotCQl0aGlzLnByb2R1Y3QgPSBwcm9kdWN0OwotCQl0aGlzLmNvbmZpZ1NwZWMgPSBjb25maWdTcGVjOwotCQlvcyA9IEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5wYXJzZUNvbmZpZ1NwZWMoY29uZmlnU3BlYylbMV07Ci0JCWNvbmZpZ0RhdGEgPSBnZXRDb25maWdEYXRhKCk7Ci0JfQotCi0JcHJpdmF0ZSBDb25maWdEYXRhIGdldENvbmZpZ0RhdGEoKSB7Ci0JCURhdGFMb2FkZXIgbG9hZGVyID0gY3JlYXRlRGF0YUxvYWRlcigpOwotCQlDb25maWdEYXRhIHJlc3VsdDsKLQkJaWYgKGxvYWRlciAhPSBudWxsKQotCQkJcmVzdWx0ID0gbG9hZGVyLmdldENvbmZpZ0RhdGEoKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gZ2VuZXJhdGVDb25maWdEYXRhKCk7Ci0JCXJlc3VsdC5zZXRGd0luZGVwZW5kZW50UHJvcCgiZWNsaXBzZS5wcm9kdWN0IiwgcHJvZHVjdC5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbG9jYXRpb24gPSBnZXRTcGxhc2hMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRGd0luZGVwZW5kZW50UHJvcCgib3NnaS5zcGxhc2hQYXRoIiwgbG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBDb25maWdEYXRhIGdlbmVyYXRlQ29uZmlnRGF0YSgpIHsKLQkJQ29uZmlnRGF0YSByZXN1bHQgPSBuZXcgQ29uZmlnRGF0YShudWxsLCBudWxsLCBudWxsLCBudWxsKTsKLQkJaWYgKHByb2R1Y3QudXNlRmVhdHVyZXMoKSkKLQkJCXJldHVybiByZXN1bHQ7Ci0KLQkJLy8gVE9ETyBuZWVkIHRvIGRvIHNvbWV0aGluZyBtb3JlIGludGVyZXN0aW5nIGhlcmUuICBXaGF0IGlmIHVwZGF0ZS5jb25maWcgaXMgYXJvdW5kPwotCQkvLyB3aGF0IGlmIHRoZSBwcm9kdWN0IGlzIHAyIGJhc2VkIG9yIHNpbXBsZWNvbmZpZyBpcyBpbiB0aGUgbGlzdD8KLQkJTGlzdCBidW5kbGVzID0gcHJvZHVjdC5nZXRCdW5kbGVzKHRydWUpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBidW5kbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIGlkID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlCdW5kbGVJbmZvIGJ1bmRsZUluZm8gPSBuZXcgQnVuZGxlSW5mbygpOwotCQkJYnVuZGxlSW5mby5zZXRTeW1ib2xpY05hbWUoaWQpOwotCQkJcmVzdWx0LmFkZEJ1bmRsZShidW5kbGVJbmZvKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFNwbGFzaExvY2F0aW9uKCkgewotCQkvLyBUT0RPIGltcGxlbWVudCB0aGlzCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29uZmlnU3BlYygpIHsKLQkJcmV0dXJuIGNvbmZpZ1NwZWM7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFByb2dyYW1Bcmd1bWVudHMoKSB7Ci0JCVN0cmluZyBsaW5lID0gcHJvZHVjdC5nZXRQcm9ncmFtQXJndW1lbnRzKG9zKTsKLQkJcmV0dXJuIEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5nZXRBcnJheUZyb21TdHJpbmcobGluZSwgIiAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRWTUFyZ3VtZW50cygpIHsKLQkJU3RyaW5nIGxpbmUgPSBwcm9kdWN0LmdldFZNQXJndW1lbnRzKG9zKTsKLQkJcmV0dXJuIEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5nZXRBcnJheUZyb21TdHJpbmcobGluZSwgIiAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoQ29uZmlnKFN0cmluZyBzcGVjLCBib29sZWFuIGluY2x1ZGVEZWZhdWx0KSB7Ci0JCVN0cmluZyB0YXJnZXRPUyA9IEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbi5wYXJzZUNvbmZpZ1NwZWMoc3BlYylbMV07Ci0JCXJldHVybiBvcy5lcXVhbHModGFyZ2V0T1MpOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvW10gZ2V0QnVuZGxlcygpIHsKLQkJcmV0dXJuIGNvbmZpZ0RhdGEuZ2V0QnVuZGxlcygpOwotCX0KLQotCXB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7Ci0JCVByb3BlcnRpZXMgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJcmVzdWx0LnB1dEFsbChjb25maWdEYXRhLmdldEZ3RGVwZW5kZW50UHJvcHMoKSk7Ci0JCXJlc3VsdC5wdXRBbGwoY29uZmlnRGF0YS5nZXRGd0luZGVwZW5kZW50UHJvcHMoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBEYXRhTG9hZGVyIGNyZWF0ZURhdGFMb2FkZXIoKSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IHByb2R1Y3QuZ2V0Q29uZmlnSW5pUGF0aChvcyk7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJbG9jYXRpb24gPSBwcm9kdWN0LmdldENvbmZpZ0luaVBhdGgobnVsbCk7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUZpbGUgY29uZmlnRmlsZSA9IG5ldyBGaWxlKGxvY2F0aW9uKTsKLQkJaWYgKCFjb25maWdGaWxlLmlzQWJzb2x1dGUoKSkKLQkJCWNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShwcm9kdWN0LmdldExvY2F0aW9uKCkuZ2V0UGFyZW50RmlsZSgpLCBsb2NhdGlvbik7Ci0JCS8vIFRPRE8gbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gZm9yIHRoZSBsYXVuY2hlciBsb2NhdGlvbiBoZXJlLi4uCi0JCS8vIGZvciBub3cganVzdCBnaXZlIGFueSBvbGQgcGF0aCB0aGF0IGhhcyBhIHBhcmVudAotCQlyZXR1cm4gbmV3IERhdGFMb2FkZXIoY29uZmlnRmlsZSwgbmV3IEZpbGUocHJvZHVjdC5nZXRMYXVuY2hlck5hbWUoKSkuZ2V0QWJzb2x1dGVGaWxlKCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXhlY3V0YWJsZU5hbWUoKSB7Ci0JCXJldHVybiBwcm9kdWN0LmdldExhdW5jaGVyTmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvUm9vdEZpbGVzQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1Jvb3RGaWxlc0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDY2NTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvUm9vdEZpbGVzQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgUm9vdEZpbGVzQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uIHsKLQlwcml2YXRlIFN0cmluZyBpZEJhc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvblNwZWMgPSAiMS4wLjAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZmxhdm9yOwotCi0JcHVibGljIFJvb3RGaWxlc0FjdGlvbihJUHVibGlzaGVySW5mbyBpbmZvLCBTdHJpbmcgaWRCYXNlLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIGZsYXZvcikgewotCQl0aGlzLmlkQmFzZSA9IGlkQmFzZSA9PSBudWxsID8gIm9yZy5lY2xpcHNlIiA6IGlkQmFzZTsgLy8kTk9OLU5MUy0xJAotCQkvLyBpZiB0aGUgZ2l2ZW4gdmVyc2lvbiBpcyBub3QgdGhlIGRlZmF1bHQgInJlcGxhY2UgbWUiIHZlcnNpb24gdGhlbiBzYXZlIGl0Ci0JCWlmICh2ZXJzaW9uICE9IG51bGwgJiYgIXZlcnNpb24uZXF1YWxzKCIwLjAuMCIpKSAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnZlcnNpb25TcGVjID0gdmVyc2lvbjsKLQkJdGhpcy5mbGF2b3IgPSBmbGF2b3I7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybShJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJU3RyaW5nW10gY29uZmlnU3BlY3MgPSBpbmZvLmdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnU3BlY3MubGVuZ3RoOyBpKyspCi0JCQlnZW5lcmF0ZVJvb3RGaWxlSVVzKGNvbmZpZ1NwZWNzW2ldLCBpbmZvLCByZXN1bHRzKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGVzIElVcyBhbmQgQ1VzIGZvciB0aGUgZmlsZXMgdGhhdCBtYWtlIHVwIHRoZSByb290IGZpbGVzIGZvciBhIGdpdmVuCi0JICogd3Mvb3MvYXJjaCBjb21iaW5hdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZVJvb3RGaWxlSVVzKFN0cmluZyBjb25maWdTcGVjLCBJUHVibGlzaGVySW5mbyBpbmZvLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdCkgewotCQkvLyBDcmVhdGUgdGhlIElVIGZvciB0aGUgZXhlY3V0YWJsZQotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdSA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJaXUuc2V0U2luZ2xldG9uKHRydWUpOwotCQlTdHJpbmcgaWRQcmVmaXggPSBpZEJhc2UgKyAiLnJvb3RmaWxlcyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIGl1SWQgPSBpZFByZWZpeCArICcuJyArIGNyZWF0ZUlkU3RyaW5nKGNvbmZpZ1NwZWMpOwotCQlpdS5zZXRJZChpdUlkKTsKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24odmVyc2lvblNwZWMpOwotCQlpdS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQlTdHJpbmcgZmlsdGVyID0gY3JlYXRlRmlsdGVyU3BlYyhjb25maWdTcGVjKTsKLQkJaXUuc2V0RmlsdGVyKGZpbHRlcik7Ci0JCUlBcnRpZmFjdEtleSBrZXkgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVMYXVuY2hlckFydGlmYWN0S2V5KGl1SWQsIHZlcnNpb24pOwotCQlpdS5zZXRBcnRpZmFjdHMobmV3IElBcnRpZmFjdEtleVtdIHtrZXl9KTsKLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuVE9VQ0hQT0lOVF9OQVRJVkUpOwotCQlQcm92aWRlZENhcGFiaWxpdHkgbGF1bmNoZXJDYXBhYmlsaXR5ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShmbGF2b3IgKyBpZEJhc2UsIGlkUHJlZml4LCB2ZXJzaW9uKTsgLy8kTk9OLU5MUy0xJAotCQlpdS5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVTZWxmQ2FwYWJpbGl0eShpdUlkLCB2ZXJzaW9uKSwgbGF1bmNoZXJDYXBhYmlsaXR5fSk7Ci0JCXJlc3VsdC5hZGRJVShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGl1KSwgSVB1Ymxpc2hlclJlc3VsdC5ST09UKTsKLQotCQkvLyBDcmVhdGUgdGhlIENVIHRoYXQgaW5zdGFsbHMvY29uZmlndXJlcyB0aGUgZXhlY3V0YWJsZQotCQlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGN1ID0gbmV3IEluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24oKTsKLQkJU3RyaW5nIGNvbmZpZ1VuaXRJZCA9IGZsYXZvciArIGl1SWQ7Ci0JCWN1LnNldElkKGNvbmZpZ1VuaXRJZCk7Ci0JCWN1LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCWN1LnNldEZpbHRlcihmaWx0ZXIpOwotCQljdS5zZXRIb3N0KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgaXVJZCwgbmV3IFZlcnNpb25SYW5nZSh2ZXJzaW9uLCB0cnVlLCB2ZXJzaW9uLCB0cnVlKSwgbnVsbCwgZmFsc2UsIGZhbHNlKX0pOwotCQljdS5zZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9GUkFHTUVOVCwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCi0JCS8vVE9ETyBidWcgMjE4ODkwLCB3b3VsZCBsaWtlIHRoZSBmcmFnbWVudCB0byBwcm92aWRlIHRoZSBsYXVuY2hlciBjYXBhYmlsaXR5IGFzIHdlbGwsIGJ1dCBjYW4ndCByaWdodCBub3cuCi0JCWN1LnNldENhcGFiaWxpdGllcyhuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZVNlbGZDYXBhYmlsaXR5KGNvbmZpZ1VuaXRJZCwgdmVyc2lvbil9KTsKLQotCQljdS5zZXRUb3VjaHBvaW50VHlwZShNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5UT1VDSFBPSU5UX05BVElWRSk7Ci0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZyBjb25maWd1cmF0aW9uRGF0YSA9ICJ1bnppcChzb3VyY2U6QGFydGlmYWN0LCB0YXJnZXQ6JHtpbnN0YWxsRm9sZGVyfSk7IjsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCBjb25maWd1cmF0aW9uRGF0YSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHVuQ29uZmlndXJhdGlvbkRhdGEgPSAiY2xlYW51cHppcChzb3VyY2U6QGFydGlmYWN0LCB0YXJnZXQ6JHtpbnN0YWxsRm9sZGVyfSk7IjsgLy8kTk9OLU5MUy0xJAotCQl0b3VjaHBvaW50RGF0YS5wdXQoInVuaW5zdGFsbCIsIHVuQ29uZmlndXJhdGlvbkRhdGEpOyAvLyROT04tTkxTLTEkCi0JCWN1LmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQlJSW5zdGFsbGFibGVVbml0IHVuaXQgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGN1KTsKLQkJcmVzdWx0LmFkZElVKHVuaXQsIElQdWJsaXNoZXJSZXN1bHQuUk9PVCk7Ci0KLQkJLy9DcmVhdGUgdGhlIGFydGlmYWN0IGRlc2NyaXB0b3IuICB3ZSBoYXZlIHNldmVyYWwgZmlsZXMgc28gbm8gcGF0aCBvbiBkaXNrCi0JCUlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUFydGlmYWN0RGVzY3JpcHRvcihrZXksIG51bGwpOwotCQlJUm9vdEZpbGVzQWR2aWNlIGFkdmljZSA9IGdldEFkdmljZShjb25maWdTcGVjLCBpbmZvKTsKLQkJcHVibGlzaEFydGlmYWN0KGRlc2NyaXB0b3IsIGZpbHRlclJvb3RGaWxlcyhhZHZpY2UsIGluZm8pLCBhZHZpY2UuZ2V0Um9vdCgpLCBpbmZvLCBJTkNMVURFX1JPT1QpOwotCX0KLQotCXByaXZhdGUgRmlsZVtdIGZpbHRlclJvb3RGaWxlcyhJUm9vdEZpbGVzQWR2aWNlIGFkdmljZSwgSVB1Ymxpc2hlckluZm8gaW5mbykgewotCQlGaWxlW10gaW5jbHVzaW9ucyA9IGFkdmljZS5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0JCVNldCBleGNsdXNpb25zID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChhZHZpY2UuZ2V0RXhjbHVkZWRGaWxlcygpKSk7Ci0JCUFycmF5TGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5jbHVzaW9ucy5sZW5ndGg7IGkrKykKLQkJCWZpbHRlckZpbGUoaW5jbHVzaW9uc1tpXSwgZXhjbHVzaW9ucywgcmVzdWx0KTsKLQkJcmV0dXJuIChGaWxlW10pIHJlc3VsdC50b0FycmF5KG5ldyBGaWxlW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsdGVyRmlsZShGaWxlIGluY2x1c2lvbiwgQ29sbGVjdGlvbiBleGNsdXNpb25zLCBBcnJheUxpc3QgcmVzdWx0KSB7Ci0JCWlmIChleGNsdXNpb25zID09IG51bGwgfHwgIWV4Y2x1c2lvbnMuY29udGFpbnMoaW5jbHVzaW9uKSkKLQkJCWlmIChpbmNsdXNpb24uaXNEaXJlY3RvcnkoKSkgewotCQkJCUZpbGVbXSBsaXN0ID0gaW5jbHVzaW9uLmxpc3RGaWxlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykKLQkJCQkJZmlsdGVyRmlsZShsaXN0W2ldLCBleGNsdXNpb25zLCByZXN1bHQpOwotCQkJfSBlbHNlCi0JCQkJcmVzdWx0LmFkZChpbmNsdXNpb24pOwotCX0KLQotCXByaXZhdGUgSVJvb3RGaWxlc0FkdmljZSBnZXRBZHZpY2UoU3RyaW5nIGNvbmZpZ1NwZWMsIElQdWJsaXNoZXJJbmZvIGluZm8pIHsKLQkJQ29sbGVjdGlvbiBhZHZpY2UgPSBpbmZvLmdldEFkdmljZShjb25maWdTcGVjLCB0cnVlLCBudWxsLCBudWxsLCBJUm9vdEZpbGVzQWR2aWNlLmNsYXNzKTsKLQkJQXJyYXlMaXN0IGluY2x1c2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUFycmF5TGlzdCBleGNsdXNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlGaWxlIHJvb3QgPSBudWxsOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBhZHZpY2UuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJUm9vdEZpbGVzQWR2aWNlIGVudHJ5ID0gKElSb290RmlsZXNBZHZpY2UpIGkubmV4dCgpOwotCQkJLy8gVE9ETyBmb3Igbm93IHdlIHNpbXBseSBnZXQgcm9vdCBmcm9tIHRoZSBmaXJzdCBhZHZpY2UgdGhhdCBoYXMgb25lCi0JCQlpZiAocm9vdCA9PSBudWxsKQotCQkJCXJvb3QgPSBlbnRyeS5nZXRSb290KCk7Ci0JCQlGaWxlW10gbGlzdCA9IGVudHJ5LmdldEluY2x1ZGVkRmlsZXMoKTsKLQkJCWlmIChsaXN0ICE9IG51bGwpCi0JCQkJaW5jbHVzaW9ucy5hZGRBbGwoQXJyYXlzLmFzTGlzdChsaXN0KSk7Ci0JCQlsaXN0ID0gZW50cnkuZ2V0RXhjbHVkZWRGaWxlcygpOwotCQkJaWYgKGxpc3QgIT0gbnVsbCkKLQkJCQlleGNsdXNpb25zLmFkZEFsbChBcnJheXMuYXNMaXN0KGxpc3QpKTsKLQkJfQotCQlGaWxlW10gaW5jbHVkZUxpc3QgPSAoRmlsZVtdKSBpbmNsdXNpb25zLnRvQXJyYXkobmV3IEZpbGVbaW5jbHVzaW9ucy5zaXplKCldKTsKLQkJRmlsZVtdIGV4Y2x1ZGVMaXN0ID0gKEZpbGVbXSkgZXhjbHVzaW9ucy50b0FycmF5KG5ldyBGaWxlW2V4Y2x1c2lvbnMuc2l6ZSgpXSk7Ci0JCXJldHVybiBuZXcgUm9vdEZpbGVzQWR2aWNlKHJvb3QsIGluY2x1ZGVMaXN0LCBleGNsdWRlTGlzdCwgY29uZmlnU3BlYyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1Jvb3RGaWxlc0FkdmljZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Sb290RmlsZXNBZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMyMjk1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1Jvb3RGaWxlc0FkdmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBDb2RlIDkgYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqICAgQ29kZSA5IC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1wdWJsaWMgY2xhc3MgUm9vdEZpbGVzQWR2aWNlIGV4dGVuZHMgQWJzdHJhY3RBZHZpY2UgaW1wbGVtZW50cyBJUm9vdEZpbGVzQWR2aWNlIHsKLQlwcml2YXRlIEZpbGUgcm9vdDsKLQlwcml2YXRlIEZpbGVbXSBleGNsdWRlZEZpbGVzOwotCXByaXZhdGUgRmlsZVtdIGluY2x1ZGVkRmlsZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgY29uZmlnU3BlYzsKLQotCXB1YmxpYyBSb290RmlsZXNBZHZpY2UoRmlsZSByb290LCBGaWxlW10gaW5jbHVkZWRGaWxlcywgRmlsZVtdIGV4Y2x1ZGVkRmlsZXMsIFN0cmluZyBjb25maWdTcGVjKSB7Ci0JCXRoaXMucm9vdCA9IHJvb3Q7Ci0JCXRoaXMuZXhjbHVkZWRGaWxlcyA9IGV4Y2x1ZGVkRmlsZXM7Ci0JCXRoaXMuaW5jbHVkZWRGaWxlcyA9IGluY2x1ZGVkRmlsZXM7Ci0JCXRoaXMuY29uZmlnU3BlYyA9IGNvbmZpZ1NwZWM7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0Um9vdCgpIHsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb25maWdTcGVjKCkgewotCQlyZXR1cm4gY29uZmlnU3BlYzsKLQl9Ci0KLQlwdWJsaWMgRmlsZVtdIGdldEV4Y2x1ZGVkRmlsZXMoKSB7Ci0JCXJldHVybiBleGNsdWRlZEZpbGVzOwotCX0KLQotCXB1YmxpYyBGaWxlW10gZ2V0SW5jbHVkZWRGaWxlcygpIHsKLQkJcmV0dXJuIGluY2x1ZGVkRmlsZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1Jvb3RJVUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9Sb290SVVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3OWE4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1Jvb3RJVUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5JUXVlcnlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogQ3JlYXRlIGEgdG9wIGxldmVsIElVIHRoYXQgbGlzdHMgYWxsIHRoZSBjdXJyZW50IHJvb3RzIGFzIHdlbGwgYXMgYW55IGV4cGxpY2l0bHkgaWRlbnRpZmllZAotICogdG9wIGxldmVsIElVcy4KLSAqLwotcHVibGljIGNsYXNzIFJvb3RJVUFjdGlvbiBleHRlbmRzIEFic3RyYWN0UHVibGlzaGluZ0FjdGlvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyB2ZXJzaW9uOwotCXByaXZhdGUgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0JcHJpdmF0ZSBJUXVlcnlhYmxlIHJlcG9zaXRvcmllczsKLQlwcml2YXRlIENvbGxlY3Rpb24gdmVyc2lvbkFkdmljZTsKLQlwcml2YXRlIElQdWJsaXNoZXJJbmZvIGluZm87Ci0KLQlwdWJsaWMgUm9vdElVQWN0aW9uKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBuYW1lLCBJUHVibGlzaGVySW5mbyBpbmZvKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBwZXJmb3JtKElQdWJsaXNoZXJJbmZvIGluZm8sIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0cykgewotCQl0aGlzLmluZm8gPSBpbmZvOwotCQlnZW5lcmF0ZVJvb3RJVShyZXN1bHRzKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVSb290SVUoSVB1Ymxpc2hlclJlc3VsdCByZXN1bHQpIHsKLQkJQ29sbGVjdGlvbiBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJlc3VsdCk7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGRlc2NyaXB0b3IgPSBjcmVhdGVUb3BMZXZlbElVRGVzY3JpcHRpb24oY2hpbGRyZW4sIGlkLCB2ZXJzaW9uLCBuYW1lLCBudWxsLCBmYWxzZSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgcm9vdElVID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChkZXNjcmlwdG9yKTsKLQkJaWYgKHJvb3RJVSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlyZXN1bHQuYWRkSVUocm9vdElVLCBJUHVibGlzaGVyUmVzdWx0Lk5PTl9ST09UKTsKLQotCQkvLyBUT0RPIHdoeSBkbyB3ZSBjcmVhdGUgYSBjYXRlZ29yeSBoZXJlPwotCQkvLwkJcmVzdWx0LmFkZElVKGdlbmVyYXRlRGVmYXVsdENhdGVnb3J5KHJvb3RJVSwgcm9vdENhdGVnb3J5KSwgSVB1Ymxpc2hlclJlc3VsdC5OT05fUk9PVCk7Ci0JfQotCi0JcHJpdmF0ZSBDb2xsZWN0aW9uIGdldENoaWxkcmVuKElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0KSB7Ci0JCS8vIGdldCBhbnkgcm9vdHMgdGhhdCB3ZSBoYXZlIGFjY3VtbXVsYXRlZCBzbyBmYXIgYW5kIHNlYXJjaCBmb3IKLQkJLy8gY2hpbGRyZW4gZnJvbSB0aGUgYWR2aWNlLgotCQlDb2xsZWN0aW9uIGNoaWxkcmVuID0gcmVzdWx0LmdldElVcyhudWxsLCBJUHVibGlzaGVyUmVzdWx0LlJPT1QpOwotCQlDb2xsZWN0aW9uIHJvb3RBZHZpY2UgPSBpbmZvLmdldEFkdmljZShudWxsLCB0cnVlLCBudWxsLCBudWxsLCBJUm9vdElVQWR2aWNlLmNsYXNzKTsKLQkJZm9yIChJdGVyYXRvciBpID0gcm9vdEFkdmljZS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUlSb290SVVBZHZpY2UgYWR2aWNlID0gKElSb290SVVBZHZpY2UpIGkubmV4dCgpOwotCQkJQ29sbGVjdGlvbiBsaXN0ID0gYWR2aWNlLmdldENoaWxkcmVuKCk7Ci0JCQlpZiAobGlzdCAhPSBudWxsKQotCQkJCWZvciAoSXRlcmF0b3IgaiA9IGxpc3QuaXRlcmF0b3IoKTsgai5oYXNOZXh0KCk7KSB7Ci0JCQkJCU9iamVjdCBvYmplY3QgPSBqLm5leHQoKTsKLQkJCQkJLy8gaWYgdGhlIGFkdmljZSBpcyBhIHN0cmluZywgbG9vayBpdCB1cCBpbiB0aGUgcmVzdWx0LiAgaWYgbm90IHRoZXJlIHRoZW4gCi0JCQkJCS8vIHF1ZXJ5IHRoZSBrbm93biBtZXRhZGF0YSByZXBvcwotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCQlTdHJpbmcgY2hpbGRJZCA9IChTdHJpbmcpIG9iamVjdDsKLQkJCQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSByZXN1bHQuZ2V0SVUoY2hpbGRJZCwgbnVsbCk7Ci0JCQkJCQlpZiAoaXUgPT0gbnVsbCkKLQkJCQkJCQlpdSA9IHF1ZXJ5Rm9yKGNoaWxkSWQpOwotCQkJCQkJaWYgKGl1ICE9IG51bGwpCi0JCQkJCQkJY2hpbGRyZW4uYWRkKGl1KTsKLQkJCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVVbml0KQotCQkJCQkJY2hpbGRyZW4uYWRkKG9iamVjdCk7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBMb29wIG92ZXIgdGhlIGtub3duIG1ldGFkYXRhIHJlcG9zaXRvcmllcyBsb29raW5nIGZvciB0aGUgZ2l2ZW4gSVUuCi0JICogUmV0dXJuIHRoZSBmaXJzdCBJVSBmb3VuZC4KLQkgKiBAcGFyYW0gaXVJZCAgdGhlIGlkIG9mIHRoZSBJVSB0byBsb29rIGZvcgotCSAqIEByZXR1cm4gdGhlIGZpcnN0IG1hdGNoaW5nIElVIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vbmUuCi0JICovCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IHF1ZXJ5Rm9yKFN0cmluZyBpdUlkKSB7Ci0JCUluc3RhbGxhYmxlVW5pdFF1ZXJ5IHF1ZXJ5ID0gbmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KGl1SWQsIGdldFZlcnNpb25BZHZpY2UoaXVJZCkpOwotCQlpZiAocmVwb3NpdG9yaWVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29sbGVjdG9yIHJlc3VsdCA9IHJlcG9zaXRvcmllcy5xdWVyeShxdWVyeSwgbmV3IENvbGxlY3RvcigpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJaWYgKCFyZXN1bHQuaXNFbXB0eSgpKQotCQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0KSByZXN1bHQuaXRlcmF0b3IoKS5uZXh0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gY3JlYXRlVG9wTGV2ZWxJVURlc2NyaXB0aW9uKENvbGxlY3Rpb24gY2hpbGRyZW4sIFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBuYW1lLCBDb2xsZWN0aW9uIHJlcXVpcmVzLCBib29sZWFuIGNvbmZpZ3VyZUxhdW5jaGVyRGF0YSkgewotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiByb290ID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlyb290LnNldFNpbmdsZXRvbih0cnVlKTsKLQkJcm9vdC5zZXRJZChpZCk7Ci0JCXJvb3Quc2V0VmVyc2lvbihuZXcgVmVyc2lvbih2ZXJzaW9uKSk7Ci0JCXJvb3Quc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX05BTUUsIG5hbWUpOwotCi0JCUFycmF5TGlzdCByZXF1aXJlZENhcGFiaWxpdGllcyA9IG5ldyBBcnJheUxpc3QoY2hpbGRyZW4uc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJVmVyc2lvblJhbmdlIHJhbmdlID0gbmV3IFZlcnNpb25SYW5nZShpdS5nZXRWZXJzaW9uKCksIHRydWUsIGl1LmdldFZlcnNpb24oKSwgdHJ1ZSk7Ci0JCQkvLwkJCWJvb2xlYW4gaXNPcHRpb25hbCA9IGNoZWNrT3B0aW9uYWxSb290RGVwZW5kZW5jeShpdSk7Ci0JCQlyZXF1aXJlZENhcGFiaWxpdGllcy5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgaXUuZ2V0SWQoKSwgcmFuZ2UsIGl1LmdldEZpbHRlcigpLCBmYWxzZSwgZmFsc2UpKTsKLQkJfQotCQlpZiAocmVxdWlyZXMgIT0gbnVsbCkKLQkJCXJlcXVpcmVkQ2FwYWJpbGl0aWVzLmFkZEFsbChyZXF1aXJlcyk7Ci0JCXJvb3Quc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKFJlcXVpcmVkQ2FwYWJpbGl0eVtdKSByZXF1aXJlZENhcGFiaWxpdGllcy50b0FycmF5KG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbcmVxdWlyZWRDYXBhYmlsaXRpZXMuc2l6ZSgpXSkpOwotCQlyb290LnNldEFydGlmYWN0cyhuZXcgSUFydGlmYWN0S2V5WzBdKTsKLQotCQlyb290LnNldFByb3BlcnR5KCJsaW5lVXAiLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcm9vdC5zZXRVcGRhdGVEZXNjcmlwdG9yKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVVcGRhdGVEZXNjcmlwdG9yKGlkLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgSVVwZGF0ZURlc2NyaXB0b3IuTk9STUFMLCBudWxsKSk7Ci0JCXJvb3Quc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfR1JPVVAsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJcm9vdC5zZXRDYXBhYmlsaXRpZXMobmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVTZWxmQ2FwYWJpbGl0eShpZCwgbmV3IFZlcnNpb24odmVyc2lvbikpfSk7Ci0JCXJvb3Quc2V0VG91Y2hwb2ludFR5cGUoTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuVE9VQ0hQT0lOVF9PU0dJKTsKLQkJcmV0dXJuIHJvb3Q7Ci0JfQotCi0JcHJpdmF0ZSBWZXJzaW9uIGdldFZlcnNpb25BZHZpY2UoU3RyaW5nIGlkKSB7Ci0JCWlmICh2ZXJzaW9uQWR2aWNlID09IG51bGwpIHsKLQkJCXZlcnNpb25BZHZpY2UgPSBpbmZvLmdldEFkdmljZShudWxsLCB0cnVlLCBudWxsLCBudWxsLCBJVmVyc2lvbkFkdmljZS5jbGFzcyk7Ci0JCQlpZiAodmVyc2lvbkFkdmljZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaSA9IHZlcnNpb25BZHZpY2UuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJVmVyc2lvbkFkdmljZSBhZHZpY2UgPSAoSVZlcnNpb25BZHZpY2UpIGkubmV4dCgpOwotCQkJLy8gVE9ETyBoYXZlIHRvIGZpZ3VyZSBhIHdheSB0byBrbm93IHRoZSBuYW1lc3BhY2UgaGVyZS4gIGZvciBub3cganVzdCBsb29rIGV2ZXJ5d2hlcmUKLQkJCVZlcnNpb24gcmVzdWx0ID0gYWR2aWNlLmdldFZlcnNpb24oSVZlcnNpb25BZHZpY2UuTlNfQlVORExFLCBpZCk7Ci0JCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCXJlc3VsdCA9IGFkdmljZS5nZXRWZXJzaW9uKElWZXJzaW9uQWR2aWNlLk5TX0ZFQVRVUkUsIGlkKTsKLQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvUm9vdElVQWR2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1Jvb3RJVUFkdmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjhjN2FhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvUm9vdElVQWR2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IENvZGUgOSBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogICBDb2RlIDkgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotcHVibGljIGNsYXNzIFJvb3RJVUFkdmljZSBleHRlbmRzIEFic3RyYWN0QWR2aWNlIGltcGxlbWVudHMgSVJvb3RJVUFkdmljZSB7Ci0KLQlwcml2YXRlIENvbGxlY3Rpb24gY2hpbGRyZW47Ci0KLQlwdWJsaWMgUm9vdElVQWR2aWNlKENvbGxlY3Rpb24gY2hpbGRyZW4pIHsKLQkJdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENoaWxkcmVuKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1NpdGVYTUxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvU2l0ZVhNTEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTM0ZGFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2FjdGlvbnMvU2l0ZVhNTEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogQWN0aW9uIHdoaWNoIHByb2Nlc3NlcyBhIHNpdGUueG1sIGFuZCBnZW5lcmF0ZXMgY2F0ZWdvcmllcy4gIFRoZSBjYXRlZ29yaXphdGlvbiBwcm9jZXNzCi0gKiByZWxpZXMgb24gSVVzIGZvciB0aGUgdmFyaW91cyBmZWF0dXJlcyB0byBoYXZlIGFscmVhZHkgYmVlbiBnZW5lcmF0ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlWE1MQWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RQdWJsaXNoaW5nQWN0aW9uIHsKLQotCXByaXZhdGUgVXBkYXRlU2l0ZSB1cGRhdGVTaXRlOwotCXByaXZhdGUgU2l0ZUNhdGVnb3J5IGRlZmF1bHRDYXRlZ29yeTsKLQlwcml2YXRlIEhhc2hTZXQgZGVmYXVsdENhdGVnb3J5U2V0OwotCi0JcHVibGljIFNpdGVYTUxBY3Rpb24oVVJMIGxvY2F0aW9uKSB7Ci0JCXRyeSB7Ci0JCQl1cGRhdGVTaXRlID0gVXBkYXRlU2l0ZS5sb2FkKGxvY2F0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBTaXRlWE1MQWN0aW9uKFVwZGF0ZVNpdGUgdXBkYXRlU2l0ZSkgewotCQl0aGlzLnVwZGF0ZVNpdGUgPSB1cGRhdGVTaXRlOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWRlZmF1bHRDYXRlZ29yeSA9IG5ldyBTaXRlQ2F0ZWdvcnkoKTsKLQkJZGVmYXVsdENhdGVnb3J5LnNldERlc2NyaXB0aW9uKCJEZWZhdWx0IGNhdGVnb3J5IGZvciBvdGhlcndpc2UgdW5jYXRlZ29yaXplZCBmZWF0dXJlcyIpOyAvLyROT04tTkxTLTEkCi0JCWRlZmF1bHRDYXRlZ29yeS5zZXRMYWJlbCgiVW5jYXRlZ29yaXplZCIpOyAvLyROT04tTkxTLTEkCi0JCWRlZmF1bHRDYXRlZ29yeS5zZXROYW1lKCJEZWZhdWx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJZGVmYXVsdENhdGVnb3J5U2V0ID0gbmV3IEhhc2hTZXQoMSk7Ci0JCWRlZmF1bHRDYXRlZ29yeVNldC5hZGQoZGVmYXVsdENhdGVnb3J5KTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBwZXJmb3JtKElQdWJsaXNoZXJJbmZvIGluZm8sIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0cykgewotCQlnZW5lcmF0ZUNhdGVnb3JpZXMoaW5mbywgcmVzdWx0cyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUNhdGVnb3JpZXMoSVB1Ymxpc2hlckluZm8gaW5mbywgSVB1Ymxpc2hlclJlc3VsdCByZXN1bHRzKSB7Ci0JCU1hcCBjYXRlZ29yaWVzVG9GZWF0dXJlSVVzID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIGZlYXR1cmVzVG9DYXRlZ29yaWVzID0gZ2V0RmVhdHVyZVRvQ2F0ZWdvcnlNYXBwaW5ncyhpbmZvKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZmVhdHVyZXNUb0NhdGVnb3JpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlTaXRlRmVhdHVyZSBmZWF0dXJlID0gKFNpdGVGZWF0dXJlKSBpLm5leHQoKTsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSBnZXRGZWF0dXJlSVUoZmVhdHVyZSwgcmVzdWx0cyk7Ci0JCQlTZXQgY2F0ZWdvcmllcyA9IChTZXQpIGZlYXR1cmVzVG9DYXRlZ29yaWVzLmdldChmZWF0dXJlKTsKLQkJCS8vIGlmIHRoZXJlIGFyZSBubyBjYXRlZ29yaWVzIGZvciB0aGlzIGZlYXR1cmUgdGhlbiBhZGQgaXQgdG8gdGhlIGRlZmF1bHQgY2F0ZWdvcnkuCi0JCQlpZiAoY2F0ZWdvcmllcyA9PSBudWxsIHx8IGNhdGVnb3JpZXMuaXNFbXB0eSgpKQotCQkJCWNhdGVnb3JpZXMgPSBkZWZhdWx0Q2F0ZWdvcnlTZXQ7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gY2F0ZWdvcmllcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJU2l0ZUNhdGVnb3J5IGNhdGVnb3J5ID0gKFNpdGVDYXRlZ29yeSkgaXQubmV4dCgpOwotCQkJCVNldCBmZWF0dXJlSVVzID0gKFNldCkgY2F0ZWdvcmllc1RvRmVhdHVyZUlVcy5nZXQoY2F0ZWdvcnkpOwotCQkJCWlmIChmZWF0dXJlSVVzID09IG51bGwpIHsKLQkJCQkJZmVhdHVyZUlVcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCQkJCWNhdGVnb3JpZXNUb0ZlYXR1cmVJVXMucHV0KGNhdGVnb3J5LCBmZWF0dXJlSVVzKTsKLQkJCQl9Ci0JCQkJZmVhdHVyZUlVcy5hZGQoaXUpOwotCQkJfQotCQl9Ci0JCWdlbmVyYXRlQ2F0ZWdvcnlJVXMoY2F0ZWdvcmllc1RvRmVhdHVyZUlVcywgcmVzdWx0cyk7Ci0JfQotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGdldEZlYXR1cmVJVShTaXRlRmVhdHVyZSBmZWF0dXJlLCBJUHVibGlzaGVyUmVzdWx0IHJlc3VsdHMpIHsKLQkJU3RyaW5nIGlkID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuZ2V0VHJhbnNmb3JtZWRJZChmZWF0dXJlLmdldEZlYXR1cmVJZGVudGlmaWVyKCksIGZhbHNlLCB0cnVlKTsKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24oZmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpKTsKLQkJLy8gVE9ETyBsb29rIGVsc2V3aGVyZSBhcyB3ZWxsLiAgUGVyaGFwcyBpbiB0aGUgbWV0YWRhdGEgcmVwb3MgYW5kIHNvbWUgYWR2aWNlLgotCQlDb2xsZWN0aW9uIGl1cyA9IHJlc3VsdHMuZ2V0SVVzKGlkLCBudWxsKTsKLQkJZm9yIChJdGVyYXRvciBpID0gaXVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpLm5leHQoKTsKLQkJCWlmIChpdS5nZXRWZXJzaW9uKCkuZXF1YWxzKHZlcnNpb24pKQotCQkJCXJldHVybiBpdTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgbWFwcGluZyBvZiBmZWF0dXJlcyB0byBjYXRlZ29yaWVzIGFzIGRlZmluZWQgaW4gdGhlIHNpdGUueG1sLAotCSAqIGlmIGF2YWlsYWJsZS4gUmV0dXJucyBhbiBlbXB0eSBtYXAgaWYgdGhlcmUgaXMgbm90IHNpdGUueG1sLCBvciBubyBjYXRlZ29yaWVzLgotCSAqIEByZXR1cm4gQSBtYXAgb2YgU2l0ZUZlYXR1cmUgLT4gU2V0PFNpdGVDYXRlZ29yeT4uCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXRGZWF0dXJlVG9DYXRlZ29yeU1hcHBpbmdzKElQdWJsaXNoZXJJbmZvIGluZm8pIHsKLQkJSGFzaE1hcCBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmICh1cGRhdGVTaXRlID09IG51bGwpCi0JCQlyZXR1cm4gbWFwcGluZ3M7Ci0JCVNpdGVNb2RlbCBzaXRlID0gdXBkYXRlU2l0ZS5nZXRTaXRlKCk7Ci0JCWlmIChzaXRlID09IG51bGwpCi0JCQlyZXR1cm4gbWFwcGluZ3M7Ci0KLQkJLy9jb3B5IG1pcnJvciBpbmZvcm1hdGlvbiBmcm9tIHVwZGF0ZSBzaXRlIHRvIHAyIHJlcG9zaXRvcmllcwotCQlTdHJpbmcgbWlycm9ycyA9IHNpdGUuZ2V0TWlycm9yc1VSTCgpOwotCQlpZiAobWlycm9ycyAhPSBudWxsKSB7Ci0JCQkvL3JlbW92ZSBzaXRlLnhtbCBmaWxlIHJlZmVyZW5jZQotCQkJaW50IGluZGV4ID0gbWlycm9ycy5pbmRleE9mKCJzaXRlLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5kZXggIT0gLTEpCi0JCQkJbWlycm9ycyA9IG1pcnJvcnMuc3Vic3RyaW5nKDAsIGluZGV4KSArIG1pcnJvcnMuc3Vic3RyaW5nKGluZGV4ICsgOSk7Ci0JCQlpbmZvLmdldE1ldGFkYXRhUmVwb3NpdG9yeSgpLnNldFByb3BlcnR5KElSZXBvc2l0b3J5LlBST1BfTUlSUk9SU19VUkwsIG1pcnJvcnMpOwotCQkJaW5mby5nZXRBcnRpZmFjdFJlcG9zaXRvcnkoKS5zZXRQcm9wZXJ0eShJUmVwb3NpdG9yeS5QUk9QX01JUlJPUlNfVVJMLCBtaXJyb3JzKTsKLQkJfQotCi0JCVNpdGVGZWF0dXJlW10gZmVhdHVyZXMgPSBzaXRlLmdldEZlYXR1cmVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCS8vYWRkIGEgbWFwcGluZyBmb3IgZWFjaCBjYXRlZ29yeSB0aGlzIGZlYXR1cmUgYmVsb25ncyB0bwotCQkJU3RyaW5nW10gY2F0ZWdvcnlOYW1lcyA9IGZlYXR1cmVzW2ldLmdldENhdGVnb3J5TmFtZXMoKTsKLQkJCVNldCBjYXRlZ29yaWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJCW1hcHBpbmdzLnB1dChmZWF0dXJlc1tpXSwgY2F0ZWdvcmllcyk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGNhdGVnb3J5TmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBzaXRlLmdldENhdGVnb3J5KGNhdGVnb3J5TmFtZXNbal0pOwotCQkJCWlmIChjYXRlZ29yeSAhPSBudWxsKQotCQkJCQljYXRlZ29yaWVzLmFkZChjYXRlZ29yeSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyBJVXMgY29ycmVzcG9uZGluZyB0byB1cGRhdGUgc2l0ZSBjYXRlZ29yaWVzLgotCSAqIEBwYXJhbSBjYXRlZ29yaWVzVG9GZWF0dXJlcyBNYXAgb2YgU2l0ZUNhdGVnb3J5IC0+U2V0IChGZWF0dXJlIElVcyBpbiB0aGF0IGNhdGVnb3J5KS4KLQkgKiBAcGFyYW0gcmVzdWx0IFRoZSBnZW5lcmF0b3IgcmVzdWx0IGJlaW5nIGJ1aWx0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVDYXRlZ29yeUlVcyhNYXAgY2F0ZWdvcmllc1RvRmVhdHVyZXMsIElQdWJsaXNoZXJSZXN1bHQgcmVzdWx0KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBjYXRlZ29yaWVzVG9GZWF0dXJlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoU2l0ZUNhdGVnb3J5KSBpdC5uZXh0KCk7Ci0JCQlyZXN1bHQuYWRkSVUoTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlQ2F0ZWdvcnlJVShjYXRlZ29yeSwgKFNldCkgY2F0ZWdvcmllc1RvRmVhdHVyZXMuZ2V0KGNhdGVnb3J5KSwgbnVsbCksIElQdWJsaXNoZXJSZXN1bHQuTk9OX1JPT1QpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvYWN0aW9ucy9WZXJzaW9uQWR2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1ZlcnNpb25BZHZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjZTljZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9hY3Rpb25zL1ZlcnNpb25BZHZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggQ29kZSA5IGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAgIENvZGUgOSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLklQdWJsaXNoaW5nQWR2aWNlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgVmVyc2lvbkFkdmljZSBleHRlbmRzIEFic3RyYWN0QWR2aWNlIGltcGxlbWVudHMgSVZlcnNpb25BZHZpY2UgewotCi0JTWFwIHZlcnNpb25zID0gbmV3IEhhc2hNYXAoMTEpOwotCi0JLyoqCi0JICogTG9hZCB0aGUgZ2l2ZW4gbmFtZXNwYWNlIHdpdGggdmVyc2lvbiBtYXBwaW5ncyBmcm9tIHRoZSBwcm9wZXJ0aWVzIGZpbGUgYXQgCi0JICogdGhlIGdpdmVuIGxvY2F0aW9uLiAgVGhlIHByb3BlcnRpZXMgZmlsZSBpcyBleHBlY3RlZCB0byBiZSBpbiB0aGUgbm9ybWFsIGZvcm1hdAotCSAqIHByb2R1Y2VkIGFuZCBjb25zdW1lZCBieSBQREUgQnVpbGQuCi0JICogQHBhcmFtIG5hbWVzcGFjZSB0aGUgbmFtZXNwYWNlIHRvIHBvcHVsYXRlCi0JICogQHBhcmFtIGxvY2F0aW9uIHRoZSBsb2NhdGlvbiBvZiB0aGUgbWFwcGluZyBmaWxlCi0JICovCi0JcHVibGljIHZvaWQgbG9hZChTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYXRpb24pIHsKLQotCX0KLQotCXB1YmxpYyBWZXJzaW9uIGdldFZlcnNpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGlkKSB7Ci0JCU1hcCB2YWx1ZXMgPSAoTWFwKSB2ZXJzaW9ucy5nZXQobmFtZXNwYWNlKTsKLQkJLy8gaWYgbm8gb25lIHNheXMgYW55dGhpbmcgdGhlbiBkb24ndCBzYXkgYW55dGhpbmcuICBzb21lb25lIGVsc2UgbWlnaHQgaGF2ZSBhbiBvcGluaW9uCi0JCWlmICh2YWx1ZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFZlcnNpb24pIHZhbHVlcy5nZXQoaWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGlkLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJTWFwIHZhbHVlcyA9IChNYXApIHZlcnNpb25zLmdldChuYW1lc3BhY2UpOwotCQlpZiAodmFsdWVzID09IG51bGwpIHsKLQkJCS8vIGlmIHdlIGFyZSBjbGVhcmluZyB2YWx1ZXMgdGhlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCi0JCQlpZiAodmVyc2lvbiA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXZhbHVlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQl2ZXJzaW9ucy5wdXQobmFtZXNwYWNlLCB2YWx1ZXMpOwotCQl9Ci0JCWlmICh2ZXJzaW9uID09IG51bGwpCi0JCQl2YWx1ZXMucmVtb3ZlKGlkKTsKLQkJZWxzZQotCQkJdmFsdWVzLnB1dChpZCwgdmVyc2lvbik7Ci0JfQotCi0JcHVibGljIElQdWJsaXNoaW5nQWR2aWNlIG1lcmdlKElQdWJsaXNoaW5nQWR2aWNlIGFkdmljZSkgewotCQlpZiAoIShhZHZpY2UgaW5zdGFuY2VvZiBWZXJzaW9uQWR2aWNlKSkKLQkJCXJldHVybiB0aGlzOwotCQlWZXJzaW9uQWR2aWNlIHNvdXJjZSA9IChWZXJzaW9uQWR2aWNlKSBhZHZpY2U7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IHNvdXJjZS52ZXJzaW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBuYW1lc3BhY2UgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCU1hcCBteVZhbHVlcyA9IChNYXApIHZlcnNpb25zLmdldChuYW1lc3BhY2UpOwotCQkJTWFwIHNvdXJjZVZhbHVlcyA9IChNYXApIHNvdXJjZS52ZXJzaW9ucy5nZXQobmFtZXNwYWNlKTsKLQkJCWlmIChteVZhbHVlcyA9PSBudWxsKQotCQkJCXZlcnNpb25zLnB1dChuYW1lc3BhY2UsIHNvdXJjZVZhbHVlcyk7Ci0JCQllbHNlIGlmIChzb3VyY2VWYWx1ZXMgIT0gbnVsbCkKLQkJCQl2ZXJzaW9ucy5wdXQobmFtZXNwYWNlLCBtZXJnZShteVZhbHVlcywgc291cmNlVmFsdWVzKSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHJpdmF0ZSBNYXAgbWVyZ2UoTWFwIG15VmFsdWVzLCBNYXAgc291cmNlVmFsdWVzKSB7Ci0JCU1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcChteVZhbHVlcyk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IHNvdXJjZVZhbHVlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCWlmIChyZXN1bHQuZ2V0KGtleSkgPT0gbnVsbCkKLQkJCQlyZXN1bHQucHV0KGtleSwgc291cmNlVmFsdWVzLmdldChrZXkpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL0RlZmF1bHRTaXRlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9EZWZhdWx0U2l0ZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTk5ZDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL0RlZmF1bHRTaXRlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlRyYWNpbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy53M2MuZG9tLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFBhcnNlcyBhIHNpdGUueG1sIGZpbGUuCi0gKiBUaGlzIGNsYXNzIHdhcyBpbml0aWFsbHkgY29waWVkIGZyb20gb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRGVmYXVsdFNpdGVQYXJzZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U2l0ZVBhcnNlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUkNISVZFID0gImFyY2hpdmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZID0gImNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9ERUYgPSAiY2F0ZWdvcnktZGVmIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNTT0NJQVRFX1NJVEVTID0gImFzc29jaWF0ZVNpdGVzIjsgLy8kTk9OLU5MUy0xJAotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBU1NPQ0lBVEVfU0lURSA9ICJhc3NvY2lhdGVTaXRlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0lORk9fVVJMID0gImluZGV4Lmh0bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFID0gImZlYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVTID0gImZlYXR1cmVzLyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlSUk9SID0gIm1pcnJvciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTQVhQYXJzZXJGYWN0b3J5IHBhcnNlckZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9IEFjdGl2YXRvci5JRDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURSA9ICJzaXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0FSQ0hJVkUgPSAzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9DQVRFR09SWSA9IDQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0NBVEVHT1JZX0RFRiA9IDU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RFU0NSSVBUSU9OX0NBVEVHT1JZX0RFRiA9IDc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0RFU0NSSVBUSU9OX1NJVEUgPSA2OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9GRUFUVVJFID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfSUdOT1JFRF9FTEVNRU5UID0gLTE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lOSVRJQUwgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9TSVRFID0gMTsKLQotCXByaXZhdGUgaW50IGN1cnJlbnRTdGF0ZTsKLQotCXByaXZhdGUgYm9vbGVhbiBERVNDUklQVElPTl9TSVRFX0FMUkVBRFlfU0VFTiA9IGZhbHNlOwotCS8vIEN1cnJlbnQgb2JqZWN0IHN0YWNrICh1c2VkIHRvIGhvbGQgdGhlIGN1cnJlbnQgb2JqZWN0IHdlIGFyZQotCS8vIHBvcHVsYXRpbmcgaW4gdGhpcyBwbHVnaW4gZGVzY3JpcHRvcgotCVN0YWNrIG9iamVjdFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0KLQlwcml2YXRlIFNBWFBhcnNlciBwYXJzZXI7Ci0KLQkvLyBDdXJyZW50IFN0YXRlIEluZm9ybWF0aW9uCi0JU3RhY2sgc3RhdGVTdGFjayA9IG5ldyBTdGFjaygpOwotCi0JcHJpdmF0ZSBNdWx0aVN0YXR1cyBzdGF0dXM7Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgZGVidWcoU3RyaW5nIHMpIHsKLQkJVHJhY2luZy5kZWJ1ZygiRGVmYXVsdFNpdGVQYXJzZXI6ICIgKyBzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vCXByaXZhdGUgc3RhdGljIFVSTEVudHJ5W10gZ2V0QXNzb2NpYXRlU2l0ZXMoU3RyaW5nIGFzc29jaWF0ZVNpdGVzVVJMKSB7Ci0JLy8KLQkvLwkJdHJ5IHsKLQkvLwkJCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9tRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkvLwkJCURvY3VtZW50QnVpbGRlciBidWlsZGVyID0gZG9tRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkvLwkJCURvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShhc3NvY2lhdGVTaXRlc1VSTCk7Ci0JLy8JCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkvLwkJCQlyZXR1cm4gbnVsbDsKLQkvLwkJCU5vZGVMaXN0IG1pcnJvck5vZGVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoQVNTT0NJQVRFX1NJVEUpOwotCS8vCQkJVVJMRW50cnlbXSBtaXJyb3JzID0gbmV3IFVSTEVudHJ5W21pcnJvck5vZGVzLmdldExlbmd0aCgpXTsKLQkvLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWlycm9yTm9kZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCS8vCQkJCUVsZW1lbnQgbWlycm9yTm9kZSA9IChFbGVtZW50KSBtaXJyb3JOb2Rlcy5pdGVtKGkpOwotCS8vCQkJCW1pcnJvcnNbaV0gPSBuZXcgVVJMRW50cnkoKTsKLQkvLwkJCQlTdHJpbmcgaW5mb1VSTCA9IG1pcnJvck5vZGUuZ2V0QXR0cmlidXRlKCJ1cmwiKTsgLy8kTk9OLU5MUy0xJAotCS8vCQkJCVN0cmluZyBsYWJlbCA9IG1pcnJvck5vZGUuZ2V0QXR0cmlidXRlKCJsYWJlbCIpOyAvLyROT04tTkxTLTEkCi0JLy8JCQkJbWlycm9yc1tpXS5zZXRVUkwoaW5mb1VSTCk7Ci0JLy8JCQkJbWlycm9yc1tpXS5zZXRBbm5vdGF0aW9uKGxhYmVsKTsKLQkvLwotCS8vCQkJCWlmIChUcmFjaW5nLkRFQlVHX0dFTkVSQVRPUl9QQVJTSU5HKQotCS8vCQkJCQlkZWJ1ZygiUHJvY2Vzc2VkIG1pcnJvcjogdXJsOiIgKyBpbmZvVVJMICsgIiBsYWJlbDoiICsgbGFiZWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvLwkJCX0KLQkvLwkJCXJldHVybiBtaXJyb3JzOwotCS8vCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCS8vCQkJLy8gbG9nIGlmIGFic29sdXRlIHVybAotCS8vCQkJaWYgKGFzc29jaWF0ZVNpdGVzVVJMICE9IG51bGwgJiYgKGFzc29jaWF0ZVNpdGVzVVJMLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSAvLyROT04tTkxTLTEkCi0JLy8JCQkJCXx8IGFzc29jaWF0ZVNpdGVzVVJMLnN0YXJ0c1dpdGgoImh0dHBzOi8vIikgLy8kTk9OLU5MUy0xJAotCS8vCQkJCQl8fCBhc3NvY2lhdGVTaXRlc1VSTC5zdGFydHNXaXRoKCJmaWxlOi8vIikgLy8kTk9OLU5MUy0xJAotCS8vCQkJCQl8fCBhc3NvY2lhdGVTaXRlc1VSTC5zdGFydHNXaXRoKCJmdHA6Ly8iKSAvLyROT04tTkxTLTEkCi0JLy8JCQl8fCBhc3NvY2lhdGVTaXRlc1VSTC5zdGFydHNXaXRoKCJqYXI6Ly8iKSkpIC8vJE5PTi1OTFMtMSQKLQkvLwkJCQlsb2coTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfbWlycm9ycywgZSk7Ci0JLy8JCQlyZXR1cm4gbnVsbDsKLQkvLwkJfQotCS8vCX0KLQotCXN0YXRpYyBVUkxFbnRyeVtdIGdldE1pcnJvcnMoU3RyaW5nIG1pcnJvcnNVUkwpIHsKLQotCQl0cnkgewotCQkJU3RyaW5nIGNvdW50cnlDb2RlID0gTG9jYWxlLmdldERlZmF1bHQoKS5nZXRDb3VudHJ5KCkudG9Mb3dlckNhc2UoKTsKLQkJCWludCB0aW1lWm9uZSA9IChuZXcgR3JlZ29yaWFuQ2FsZW5kYXIoKSkuZ2V0KENhbGVuZGFyLlpPTkVfT0ZGU0VUKSAvICg2MCAqIDYwICogMTAwMCk7Ci0KLQkJCWlmIChtaXJyb3JzVVJMLmluZGV4T2YoIj8iKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJbWlycm9yc1VSTCA9IG1pcnJvcnNVUkwgKyAiJiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJbWlycm9yc1VSTCA9IG1pcnJvcnNVUkwgKyAiPyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW1pcnJvcnNVUkwgPSBtaXJyb3JzVVJMICsgImNvdW50cnlDb2RlPSIgKyBjb3VudHJ5Q29kZSArICImdGltZVpvbmU9IiArIHRpbWVab25lICsgIiZyZXNwb25zZVR5cGU9eG1sIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkb21GYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBkb21GYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBidWlsZGVyLnBhcnNlKG1pcnJvcnNVUkwpOwotCQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlOb2RlTGlzdCBtaXJyb3JOb2RlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKE1JUlJPUik7Ci0JCQlVUkxFbnRyeVtdIG1pcnJvcnMgPSBuZXcgVVJMRW50cnlbbWlycm9yTm9kZXMuZ2V0TGVuZ3RoKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtaXJyb3JOb2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJRWxlbWVudCBtaXJyb3JOb2RlID0gKEVsZW1lbnQpIG1pcnJvck5vZGVzLml0ZW0oaSk7Ci0JCQkJbWlycm9yc1tpXSA9IG5ldyBVUkxFbnRyeSgpOwotCQkJCVN0cmluZyBpbmZvVVJMID0gbWlycm9yTm9kZS5nZXRBdHRyaWJ1dGUoInVybCIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGxhYmVsID0gbWlycm9yTm9kZS5nZXRBdHRyaWJ1dGUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQltaXJyb3JzW2ldLnNldFVSTChpbmZvVVJMKTsKLQkJCQltaXJyb3JzW2ldLnNldEFubm90YXRpb24obGFiZWwpOwotCi0JCQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQkJCWRlYnVnKCJQcm9jZXNzZWQgbWlycm9yOiB1cmw6IiArIGluZm9VUkwgKyAiIGxhYmVsOiIgKyBsYWJlbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmV0dXJuIG1pcnJvcnM7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgaWYgYWJzb2x1dGUgdXJsCi0JCQlpZiAobWlycm9yc1VSTCAhPSBudWxsICYmIChtaXJyb3JzVVJMLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IG1pcnJvcnNVUkwuc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IG1pcnJvcnNVUkwuc3RhcnRzV2l0aCgiZmlsZTovLyIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgbWlycm9yc1VSTC5zdGFydHNXaXRoKCJmdHA6Ly8iKSAvLyROT04tTkxTLTEkCi0JCQl8fCBtaXJyb3JzVVJMLnN0YXJ0c1dpdGgoImphcjovLyIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX21pcnJvcnMsIGUpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0Jc3RhdGljIHZvaWQgbG9nKEV4Y2VwdGlvbiBlKSB7Ci0JCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJJbnRlcm5hbCBFcnJvciIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyB2b2lkIGxvZyhJU3RhdHVzIGVycm9yKSB7Ci0JCUxvZ0hlbHBlci5sb2coZXJyb3IpOwotCX0KLQotCXN0YXRpYyB2b2lkIGxvZyhTdHJpbmcgbWVzc2FnZSkgewotCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBBY3RpdmF0b3IuSUQsIG1lc3NhZ2UsIG51bGwpKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBlKSB7Ci0JCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEFjdGl2YXRvci5JRCwgbWVzc2FnZSwgZSkpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdHMgYSBzaXRlIHBhcnNlci4KLQkgKi8KLQlwdWJsaWMgRGVmYXVsdFNpdGVQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXN0YXRlU3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJb2JqZWN0U3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJc3RhdHVzID0gbnVsbDsKLQkJREVTQ1JJUFRJT05fU0lURV9BTFJFQURZX1NFRU4gPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQl0aGlzLnBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJbG9nKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJbG9nKGUpOwotCQl9Ci0KLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQlkZWJ1ZygiQ3JlYXRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogSGFuZGxlIGNoYXJhY3RlciB0ZXh0Ci0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNjaGFyYWN0ZXJzKGNoYXJbXSwgaW50LCBpbnQpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHRleHQgPSBuZXcgU3RyaW5nKGNoLCBzdGFydCwgbGVuZ3RoKTsKLQkJLy9vbmx5IHB1c2ggaWYgZGVzY3JpcHRpb24KLQkJaW50IHN0YXRlID0gKChJbnRlZ2VyKSBzdGF0ZVN0YWNrLnBlZWsoKSkuaW50VmFsdWUoKTsKLQkJaWYgKHN0YXRlID09IFNUQVRFX0RFU0NSSVBUSU9OX1NJVEUgfHwgc3RhdGUgPT0gU1RBVEVfREVTQ1JJUFRJT05fQ0FURUdPUllfREVGKQotCQkJb2JqZWN0U3RhY2sucHVzaCh0ZXh0KTsKLQotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBlbmQgb2YgZWxlbWVudCB0YWdzCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNlbmRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB7Ci0KLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlVUkxFbnRyeSBpbmZvID0gbnVsbDsKLQotCQlpbnQgc3RhdGUgPSAoKEludGVnZXIpIHN0YXRlU3RhY2sucGVlaygpKS5pbnRWYWx1ZSgpOwotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQljYXNlIFNUQVRFX0lHTk9SRURfRUxFTUVOVCA6Ci0JCQljYXNlIFNUQVRFX0FSQ0hJVkUgOgotCQkJY2FzZSBTVEFURV9DQVRFR09SWSA6Ci0JCQkJc3RhdGVTdGFjay5wb3AoKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9JTklUSUFMIDoKLQkJCQlpbnRlcm5hbEVycm9yKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX1BhcnNpbmdTdGFja0JhY2tUb0luaXRpYWxTdGF0ZSk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfU0lURSA6Ci0JCQkJc3RhdGVTdGFjay5wb3AoKTsKLQkJCQlpZiAob2JqZWN0U3RhY2sucGVlaygpIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCXRleHQgPSAoU3RyaW5nKSBvYmplY3RTdGFjay5wb3AoKTsKLQkJCQkJU2l0ZU1vZGVsIHNpdGUgPSAoU2l0ZU1vZGVsKSBvYmplY3RTdGFjay5wZWVrKCk7Ci0JCQkJCXNpdGUuZ2V0RGVzY3JpcHRpb24oKS5zZXRBbm5vdGF0aW9uKHRleHQpOwotCQkJCX0KLQkJCQkvL2RvIG5vdCBwb3AgdGhlIG9iamVjdAotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX0ZFQVRVUkUgOgotCQkJCXN0YXRlU3RhY2sucG9wKCk7Ci0JCQkJb2JqZWN0U3RhY2sucG9wKCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfQ0FURUdPUllfREVGIDoKLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOwotCQkJCWlmIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJdGV4dCA9IChTdHJpbmcpIG9iamVjdFN0YWNrLnBvcCgpOwotCQkJCQlTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoU2l0ZUNhdGVnb3J5KSBvYmplY3RTdGFjay5wZWVrKCk7Ci0JCQkJCWNhdGVnb3J5LnNldERlc2NyaXB0aW9uKHRleHQpOwotCQkJCX0KLQkJCQlvYmplY3RTdGFjay5wb3AoKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9ERVNDUklQVElPTl9TSVRFIDoKLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOwotCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCXdoaWxlIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJLy8gYWRkIHRleHQsIHByZXNlcnZpbmcgYXQgbW9zdCBvbmUgc3BhY2UgYmV0d2VlbiB0ZXh0IGZyYWdtZW50cwotCQkJCQlTdHJpbmcgbmV3VGV4dCA9IChTdHJpbmcpIG9iamVjdFN0YWNrLnBvcCgpOwotCQkJCQlpZiAodHJhaWxpbmdTcGFjZShuZXdUZXh0KSAmJiAhbGVhZGluZ1NwYWNlKHRleHQpKSB7Ci0JCQkJCQl0ZXh0ID0gIiAiICsgdGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXRleHQgPSBuZXdUZXh0LnRyaW0oKSArIHRleHQ7Ci0JCQkJCWlmIChsZWFkaW5nU3BhY2UobmV3VGV4dCkgJiYgIWxlYWRpbmdTcGFjZSh0ZXh0KSkgewotCQkJCQkJdGV4dCA9ICIgIiArIHRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQl0ZXh0ID0gdGV4dC50cmltKCk7Ci0KLQkJCQlpbmZvID0gKFVSTEVudHJ5KSBvYmplY3RTdGFjay5wb3AoKTsKLQkJCQlpZiAodGV4dCAhPSBudWxsKQotCQkJCQlpbmZvLnNldEFubm90YXRpb24odGV4dCk7Ci0KLQkJCQlTaXRlTW9kZWwgc2l0ZU1vZGVsID0gKFNpdGVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOwotCQkJCS8vIG92ZXJyaWRlIGRlc2NyaXB0aW9uLgotCQkJCS8vIGRvIG5vdCByYWlzZSBlcnJvciBhcyBwcmV2aW91cyBkZXNjcmlwdGlvbiBtYXkgYmUgZGVmYXVsdCBvbmUKLQkJCQkvLyB3aGVuIHBhcnNpbmcgc2l0ZSB0YWcKLQkJCQlpZiAoREVTQ1JJUFRJT05fU0lURV9BTFJFQURZX1NFRU4pCi0JCQkJCWRlYnVnKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX0VsZW1lbnRBbHJlYWR5U2V0LCAobmV3IFN0cmluZ1tdIHtnZXRTdGF0ZShzdGF0ZSl9KSkpOwotCQkJCXNpdGVNb2RlbC5zZXREZXNjcmlwdGlvbihpbmZvKTsKLQkJCQlERVNDUklQVElPTl9TSVRFX0FMUkVBRFlfU0VFTiA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfREVTQ1JJUFRJT05fQ0FURUdPUllfREVGIDoKLQkJCQlzdGF0ZVN0YWNrLnBvcCgpOwotCQkJCXRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCXdoaWxlIChvYmplY3RTdGFjay5wZWVrKCkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQkJLy8gYWRkIHRleHQsIHByZXNlcnZpbmcgYXQgbW9zdCBvbmUgc3BhY2UgYmV0d2VlbiB0ZXh0IGZyYWdtZW50cwotCQkJCQlTdHJpbmcgbmV3VGV4dCA9IChTdHJpbmcpIG9iamVjdFN0YWNrLnBvcCgpOwotCQkJCQlpZiAodHJhaWxpbmdTcGFjZShuZXdUZXh0KSAmJiAhbGVhZGluZ1NwYWNlKHRleHQpKSB7Ci0JCQkJCQl0ZXh0ID0gIiAiICsgdGV4dDsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXRleHQgPSBuZXdUZXh0LnRyaW0oKSArIHRleHQ7Ci0JCQkJCWlmIChsZWFkaW5nU3BhY2UobmV3VGV4dCkgJiYgIWxlYWRpbmdTcGFjZSh0ZXh0KSkgewotCQkJCQkJdGV4dCA9ICIgIiArIHRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCQl0ZXh0ID0gdGV4dC50cmltKCk7Ci0KLQkJCQlpbmZvID0gKFVSTEVudHJ5KSBvYmplY3RTdGFjay5wb3AoKTsKLQkJCQlpZiAodGV4dCAhPSBudWxsKQotCQkJCQlpbmZvLnNldEFubm90YXRpb24odGV4dCk7Ci0KLQkJCQlTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoU2l0ZUNhdGVnb3J5KSBvYmplY3RTdGFjay5wZWVrKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLQkJCQkJaW50ZXJuYWxFcnJvcihOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9FbGVtZW50QWxyZWFkeVNldCwgKG5ldyBTdHJpbmdbXSB7Z2V0U3RhdGUoc3RhdGUpLCBjYXRlZ29yeS5nZXRMYWJlbCgpfSkpKTsKLQkJCQllbHNlCi0JCQkJCWNhdGVnb3J5LnNldERlc2NyaXB0aW9uKGluZm8uZ2V0QW5ub3RhdGlvbigpKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJaW50ZXJuYWxFcnJvcihOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRW5kU3RhdGUsIChuZXcgU3RyaW5nW10ge2dldFN0YXRlKHN0YXRlKX0pKSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoVHJhY2luZy5ERUJVR19HRU5FUkFUT1JfUEFSU0lORykKLQkJCWRlYnVnKCJFbmQgRWxlbWVudDoiICsgdXJpICsgIjoiICsgbG9jYWxOYW1lICsgIjoiICsgcU5hbWUpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JLyoKLQkgKiBIYW5kbGVzIGFuIGVycm9yIHN0YXRlIHNwZWNpZmllZCBieSB0aGUgc3RhdHVzLiAgVGhlIGNvbGxlY3Rpb24gb2YgYWxsIGxvZ2dlZCBzdGF0dXMKLQkgKiBvYmplY3RzIGNhbiBiZSBhY2Nlc3NlZCB1c2luZyA8Y29kZT5nZXRTdGF0dXMoKTwvY29kZT4uCi0JICoKLQkgKiBAcGFyYW0gZXJyb3IgYSBzdGF0dXMgZGV0YWlsaW5nIHRoZSBlcnJvciBjb25kaXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgZXJyb3IoSVN0YXR1cyBlcnJvcikgewotCi0JCWlmIChzdGF0dXMgPT0gbnVsbCkgewotCQkJc3RhdHVzID0gbmV3IE11bHRpU3RhdHVzKFBMVUdJTl9JRCwgMCwgTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JQYXJzaW5nU2l0ZSwgbnVsbCk7Ci0JCX0KLQotCQlzdGF0dXMuYWRkKGVycm9yKTsKLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQlMb2dIZWxwZXIubG9nKGVycm9yKTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgZXJyb3JzCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbikKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJbG9nU3RhdHVzKGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBIYW5kbGUgZmF0YWwgZXJyb3JzCi0JICogQHNlZSBEZWZhdWx0SGFuZGxlciNmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uKQotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlsb2dTdGF0dXMoZXgpOwotCQl0aHJvdyBleDsKLQl9Ci0KLQkvKgotCSAqIHJldHVybiB0aGUgc3RhdGUgYXMgU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhdGUoaW50IHN0YXRlKSB7Ci0KLQkJc3dpdGNoIChzdGF0ZSkgewotCQkJY2FzZSBTVEFURV9JR05PUkVEX0VMRU1FTlQgOgotCQkJCXJldHVybiAiSWdub3JlZCI7IC8vJE5PTi1OTFMtMSQKLQotCQkJY2FzZSBTVEFURV9JTklUSUFMIDoKLQkJCQlyZXR1cm4gIkluaXRpYWwiOyAvLyROT04tTkxTLTEkCi0KLQkJCWNhc2UgU1RBVEVfU0lURSA6Ci0JCQkJcmV0dXJuICJTaXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JCQljYXNlIFNUQVRFX0ZFQVRVUkUgOgotCQkJCXJldHVybiAiRmVhdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQotCQkJY2FzZSBTVEFURV9BUkNISVZFIDoKLQkJCQlyZXR1cm4gIkFyY2hpdmUiOyAvLyROT04tTkxTLTEkCi0KLQkJCWNhc2UgU1RBVEVfQ0FURUdPUlkgOgotCQkJCXJldHVybiAiQ2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi0KLQkJCWNhc2UgU1RBVEVfQ0FURUdPUllfREVGIDoKLQkJCQlyZXR1cm4gIkNhdGVnb3J5IERlZiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJY2FzZSBTVEFURV9ERVNDUklQVElPTl9DQVRFR09SWV9ERUYgOgotCQkJCXJldHVybiAiRGVzY3JpcHRpb24gLyBDYXRlZ29yeSBEZWYiOyAvLyROT04tTkxTLTEkCi0KLQkJCWNhc2UgU1RBVEVfREVTQ1JJUFRJT05fU0lURSA6Ci0JCQkJcmV0dXJuICJEZXNjcmlwdGlvbiAvIFNpdGUiOyAvLyROT04tTkxTLTEkCi0KLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duU3RhdGU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBzdGF0dXMgb2JqZWN0cyBhY2N1bXVsYXRlZCBieSB0aGUgcGFyc2VyLgotCSAqCi0JICogQHJldHVybiBtdWx0aS1zdGF0dXMgY29udGFpbmluZyBhY2N1bXVsYXRlZCBzdGF0dXMsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgTXVsdGlTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVDYXRlZ29yeURlZlN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHMoRkVBVFVSRSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9GRUFUVVJFKSk7Ci0JCQlwcm9jZXNzRmVhdHVyZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQVJDSElWRSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9BUkNISVZFKSk7Ci0JCQlwcm9jZXNzQXJjaGl2ZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQ0FURUdPUllfREVGKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0NBVEVHT1JZX0RFRikpOwotCQkJcHJvY2Vzc0NhdGVnb3J5RGVmKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhERVNDUklQVElPTikpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9ERVNDUklQVElPTl9DQVRFR09SWV9ERUYpKTsKLQkJCXByb2Nlc3NJbmZvKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UKLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbGVtZW50LCAobmV3IFN0cmluZ1tdIHtlbGVtZW50TmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKX0pKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhdGVnb3J5U3RhdGUoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhERVNDUklQVElPTikpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9ERVNDUklQVElPTl9TSVRFKSk7Ci0JCQlwcm9jZXNzSW5mbyhhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoRkVBVFVSRSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9GRUFUVVJFKSk7Ci0JCQlwcm9jZXNzRmVhdHVyZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQVJDSElWRSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9BUkNISVZFKSk7Ci0JCQlwcm9jZXNzQXJjaGl2ZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHMoQ0FURUdPUllfREVGKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0NBVEVHT1JZX0RFRikpOwotCQkJcHJvY2Vzc0NhdGVnb3J5RGVmKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhDQVRFR09SWSkpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9DQVRFR09SWSkpOwotCQkJcHJvY2Vzc0NhdGVnb3J5KGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UKLQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbGVtZW50LCAobmV3IFN0cmluZ1tdIHtlbGVtZW50TmFtZSwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKX0pKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUZlYXR1cmVTdGF0ZShTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlpZiAoZWxlbWVudE5hbWUuZXF1YWxzKERFU0NSSVBUSU9OKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0RFU0NSSVBUSU9OX1NJVEUpKTsKLQkJCXByb2Nlc3NJbmZvKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhGRUFUVVJFKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0ZFQVRVUkUpKTsKLQkJCXByb2Nlc3NGZWF0dXJlKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhBUkNISVZFKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0FSQ0hJVkUpKTsKLQkJCXByb2Nlc3NBcmNoaXZlKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFscyhDQVRFR09SWV9ERUYpKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQ0FURUdPUllfREVGKSk7Ci0JCQlwcm9jZXNzQ2F0ZWdvcnlEZWYoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENBVEVHT1JZKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX0NBVEVHT1JZKSk7Ci0JCQlwcm9jZXNzQ2F0ZWdvcnkoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZQotCQkJaW50ZXJuYWxFcnJvclVua25vd25UYWcoTkxTLmJpbmQoTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93bkVsZW1lbnQsIChuZXcgU3RyaW5nW10ge2VsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpfSkpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlSW5pdGlhbFN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFscyhTSVRFKSkgewotCQkJc3RhdGVTdGFjay5wdXNoKG5ldyBJbnRlZ2VyKFNUQVRFX1NJVEUpKTsKLQkJCXByb2Nlc3NTaXRlKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgewotCQkJaW50ZXJuYWxFcnJvclVua25vd25UYWcoTkxTLmJpbmQoTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93bkVsZW1lbnQsIChuZXcgU3RyaW5nW10ge2VsZW1lbnROYW1lLCBnZXRTdGF0ZShjdXJyZW50U3RhdGUpfSkpKTsKLQkJCS8vIHdoYXQgd2UgcmVjZWl2ZWQgd2FzIG5vdCBhIHNpdGUueG1sLCBubyBuZWVkIHRvIGNvbnRpbnVlCi0JCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX0ludmFsaWRYTUxTdHJlYW0pOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2l0ZVN0YXRlKFN0cmluZyBlbGVtZW50TmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHMoREVTQ1JJUFRJT04pKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfREVTQ1JJUFRJT05fU0lURSkpOwotCQkJcHJvY2Vzc0luZm8oYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEZFQVRVUkUpKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfRkVBVFVSRSkpOwotCQkJcHJvY2Vzc0ZlYXR1cmUoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKEFSQ0hJVkUpKSB7Ci0JCQlzdGF0ZVN0YWNrLnB1c2gobmV3IEludGVnZXIoU1RBVEVfQVJDSElWRSkpOwotCQkJcHJvY2Vzc0FyY2hpdmUoYXR0cmlidXRlcyk7Ci0JCX0gZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzKENBVEVHT1JZX0RFRikpIHsKLQkJCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9DQVRFR09SWV9ERUYpKTsKLQkJCXByb2Nlc3NDYXRlZ29yeURlZihhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlCi0JCQlpbnRlcm5hbEVycm9yVW5rbm93blRhZyhOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRWxlbWVudCwgKG5ldyBTdHJpbmdbXSB7ZWxlbWVudE5hbWUsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9KSkpOwotCX0KLQotCS8qCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsRXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJZXJyb3IobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIG51bGwpKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnRlcm5hbEVycm9yVW5rbm93blRhZyhTdHJpbmcgbXNnKSB7Ci0JCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9JR05PUkVEX0VMRU1FTlQpKTsKLQkJaW50ZXJuYWxFcnJvcihtc2cpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBsZWFkaW5nU3BhY2UoU3RyaW5nIHN0cikgewotCQlpZiAoc3RyLmxlbmd0aCgpIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShzdHIuY2hhckF0KDApKTsKLQl9Ci0KLQkvKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBsb2dTdGF0dXMoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJU3RyaW5nIG5hbWUgPSBleC5nZXRTeXN0ZW1JZCgpOwotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCW5hbWUgPSBuYW1lLnN1YnN0cmluZygxICsgbmFtZS5sYXN0SW5kZXhPZigiLyIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBtc2c7Ci0JCWlmIChuYW1lLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCW1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX0Vycm9yUGFyc2luZywgKG5ldyBTdHJpbmdbXSB7ZXguZ2V0TWVzc2FnZSgpfSkpOwotCQllbHNlIHsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmdbXSB7bmFtZSwgSW50ZWdlci50b1N0cmluZyhleC5nZXRMaW5lTnVtYmVyKCkpLCBJbnRlZ2VyLnRvU3RyaW5nKGV4LmdldENvbHVtbk51bWJlcigpKSwgZXguZ2V0TWVzc2FnZSgpfTsKLQkJCW1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX0Vycm9ybGluZUNvbHVtbk1lc3NhZ2UsIHZhbHVlcyk7Ci0JCX0KLQkJZXJyb3IobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIG1zZywgZXgpKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXJzZXMgdGhlIHNwZWNpZmllZCBpbnB1dCBzdGVhbSBhbmQgY29uc3RydWN0cyBhIHNpdGUgbW9kZWwuCi0JICogVGhlIGlucHV0IHN0cmVhbSBpcyBub3QgY2xvc2VkIGFzIHBhcnQgb2YgdGhpcyBvcGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGluIGlucHV0IHN0cmVhbQotCSAqIEByZXR1cm4gc2l0ZSBtb2RlbAotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU2l0ZU1vZGVsIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXN0YXRlU3RhY2sucHVzaChuZXcgSW50ZWdlcihTVEFURV9JTklUSUFMKSk7Ci0JCWN1cnJlbnRTdGF0ZSA9ICgoSW50ZWdlcikgc3RhdGVTdGFjay5wZWVrKCkpLmludFZhbHVlKCk7Ci0JCXBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW4pLCB0aGlzKTsKLQkJaWYgKG9iamVjdFN0YWNrLmlzRW1wdHkoKSkKLQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfTm9TaXRlVGFnKTsKLQkJaWYgKG9iamVjdFN0YWNrLnBlZWsoKSBpbnN0YW5jZW9mIFNpdGVNb2RlbCkgewotCQkJcmV0dXJuIChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBvcCgpOwotCQl9Ci0JCVN0cmluZyBzdGFjayA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUl0ZXJhdG9yIGl0ZXIgPSBvYmplY3RTdGFjay5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCXN0YWNrID0gc3RhY2sgKyBpdGVyLm5leHQoKS50b1N0cmluZygpICsgIlxyXG4iOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9Xcm9uZ1BhcnNpbmdTdGFjaywgKG5ldyBTdHJpbmdbXSB7c3RhY2t9KSkpOwotCX0KLQotCS8qIAotCSAqIHByb2Nlc3MgYXJjaGl2ZSBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NBcmNoaXZlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlVUkxFbnRyeSBhcmNoaXZlID0gbmV3IFVSTEVudHJ5KCk7Ci0JCVN0cmluZyBpZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInBhdGgiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpbnRlcm5hbEVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX01pc3NpbmcsIChuZXcgU3RyaW5nW10geyJwYXRoIiwgZ2V0U3RhdGUoY3VycmVudFN0YXRlKX0pKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWFyY2hpdmUuc2V0QW5ub3RhdGlvbihpZCk7Ci0KLQkJU3RyaW5nIHVybCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh1cmwgPT0gbnVsbCB8fCB1cmwudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJaW50ZXJuYWxFcnJvcihOTFMuYmluZChNZXNzYWdlcy5EZWZhdWx0U2l0ZVBhcnNlcl9NaXNzaW5nLCAobmV3IFN0cmluZ1tdIHsiYXJjaGl2ZSIsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9KSkpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlhcmNoaXZlLnNldFVSTCh1cmwpOwotCi0JCQlTaXRlTW9kZWwgc2l0ZSA9IChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsKLQkJCXNpdGUuYWRkQXJjaGl2ZShhcmNoaXZlKTsKLQkJfQotCQlpZiAoVHJhY2luZy5ERUJVR19HRU5FUkFUT1JfUEFSU0lORykKLQkJCWRlYnVnKCJFbmQgcHJvY2Vzc2luZyBBcmNoaXZlOiBwYXRoOiIgKyBpZCArICIgdXJsOiIgKyB1cmwpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCi0JLyogCi0JICogcHJvY2VzcyB0aGUgQ2F0ZWdvcnkgIGluZm8KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NhdGVnb3J5KEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlTdHJpbmcgY2F0ZWdvcnkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJU2l0ZUZlYXR1cmUgZmVhdHVyZSA9IChTaXRlRmVhdHVyZSkgb2JqZWN0U3RhY2sucGVlaygpOwotCQlmZWF0dXJlLmFkZENhdGVnb3J5TmFtZShjYXRlZ29yeSk7Ci0KLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQlkZWJ1ZygiRW5kIHByb2Nlc3NpbmcgQ2F0ZWdvcnk6IG5hbWU6IiArIGNhdGVnb3J5KTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qIAotCSAqIHByb2Nlc3MgY2F0ZWdvcnkgZGVmIGluZm8KLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NhdGVnb3J5RGVmKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlTaXRlQ2F0ZWdvcnkgY2F0ZWdvcnkgPSBuZXcgU2l0ZUNhdGVnb3J5KCk7Ci0JCVN0cmluZyBuYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBsYWJlbCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIik7IC8vJE5PTi1OTFMtMSQKLQkJY2F0ZWdvcnkuc2V0TmFtZShuYW1lKTsKLQkJY2F0ZWdvcnkuc2V0TGFiZWwobGFiZWwpOwotCi0JCVNpdGVNb2RlbCBzaXRlID0gKFNpdGVNb2RlbCkgb2JqZWN0U3RhY2sucGVlaygpOwotCQlzaXRlLmFkZENhdGVnb3J5KGNhdGVnb3J5KTsKLQkJb2JqZWN0U3RhY2sucHVzaChjYXRlZ29yeSk7Ci0KLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQlkZWJ1ZygiRW5kIHByb2Nlc3NpbmcgQ2F0ZWdvcnlEZWY6IG5hbWU6IiArIG5hbWUgKyAiIGxhYmVsOiIgKyBsYWJlbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qIAotCSAqIHByb2Nlc3MgZmVhdHVyZSBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NGZWF0dXJlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlTaXRlRmVhdHVyZSBmZWF0dXJlID0gbmV3IFNpdGVGZWF0dXJlKCk7Ci0KLQkJLy8gZmVhdHVyZSBsb2NhdGlvbiBvbiB0aGUgc2l0ZQotCQlTdHJpbmcgdXJsSW5mbyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGlkZW50aWZpZXIgYW5kIHZlcnNpb24KLQkJU3RyaW5nIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdmVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0KLQkJYm9vbGVhbiBub1VSTCA9ICh1cmxJbmZvID09IG51bGwgfHwgdXJsSW5mby50cmltKCkuZXF1YWxzKCIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBub0lkID0gKGlkID09IG51bGwgfHwgaWQudHJpbSgpLmVxdWFscygiIikpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gbm9WZXJzaW9uID0gKHZlciA9PSBudWxsIHx8IHZlci50cmltKCkuZXF1YWxzKCIiKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBXZSBuZWVkIHRvIGhhdmUgaWQgYW5kIHZlcnNpb24sIG9yIHRoZSB1cmwsIG9yIGJvdGguCi0JCWlmIChub1VSTCkgewotCQkJaWYgKG5vSWQgfHwgbm9WZXJzaW9uKQotCQkJCWludGVybmFsRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuRGVmYXVsdFNpdGVQYXJzZXJfTWlzc2luZywgKG5ldyBTdHJpbmdbXSB7InVybCIsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9KSkpOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJLy8gZGVmYXVsdCB1cmwKLQkJCQl1cmxJbmZvID0gRkVBVFVSRVMgKyBpZCArICdfJyArIHZlcjsgLy8gCi0JCX0KLQotCQlmZWF0dXJlLnNldFVSTFN0cmluZyh1cmxJbmZvKTsKLQotCQlTdHJpbmcgdHlwZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlmZWF0dXJlLnNldFR5cGUodHlwZSk7Ci0KLQkJLy8gaWYgb25lIGlzIG51bGwsIGFuZCBub3QgdGhlIG90aGVyCi0JCWlmIChub0lkIF4gbm9WZXJzaW9uKSB7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nW10ge2lkLCB2ZXIsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9OwotCQkJbG9nKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRGZWF0dXJlUGFyc2VyX0lkT3JWZXJzaW9uSW52YWxpZCwgdmFsdWVzKSk7Ci0JCX0gZWxzZSB7Ci0JCQlmZWF0dXJlLnNldEZlYXR1cmVJZGVudGlmaWVyKGlkKTsKLQkJCWZlYXR1cmUuc2V0RmVhdHVyZVZlcnNpb24odmVyKTsKLQkJfQotCi0JCS8vIGdldCBsYWJlbCBpZiBpdCBleGlzdHMKLQkJU3RyaW5nIGxhYmVsID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibGFiZWwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJaWYgKCIiLmVxdWFscyhsYWJlbC50cmltKCkpKSAvLyROT04tTkxTLTEkCi0JCQkJbGFiZWwgPSBudWxsOwotCQl9Ci0JCWZlYXR1cmUuc2V0TGFiZWwobGFiZWwpOwotCi0JCS8vIE9TCi0JCVN0cmluZyBvcyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm9zIik7IC8vJE5PTi1OTFMtMSQKLQkJZmVhdHVyZS5zZXRPUyhvcyk7Ci0KLQkJLy8gV1MKLQkJU3RyaW5nIHdzID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgid3MiKTsgLy8kTk9OLU5MUy0xJAotCQlmZWF0dXJlLnNldFdTKHdzKTsKLQotCQkvLyBOTAotCQlTdHJpbmcgbmwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJubCIpOyAvLyROT04tTkxTLTEkCi0JCWZlYXR1cmUuc2V0TkwobmwpOwotCi0JCS8vIGFyY2gKLQkJU3RyaW5nIGFyY2ggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJhcmNoIik7IC8vJE5PTi1OTFMtMSQKLQkJZmVhdHVyZS5zZXRBcmNoKGFyY2gpOwotCi0JCS8vcGF0Y2gKLQkJU3RyaW5nIHBhdGNoID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicGF0Y2giKTsgLy8kTk9OLU5MUy0xJAotCQlmZWF0dXJlLnNldFBhdGNoKHBhdGNoKTsKLQotCQlTaXRlTW9kZWwgc2l0ZSA9IChTaXRlTW9kZWwpIG9iamVjdFN0YWNrLnBlZWsoKTsKLQkJc2l0ZS5hZGRGZWF0dXJlKGZlYXR1cmUpOwotCQlmZWF0dXJlLnNldFNpdGVNb2RlbChzaXRlKTsKLQotCQlvYmplY3RTdGFjay5wdXNoKGZlYXR1cmUpOwotCi0JCWlmIChUcmFjaW5nLkRFQlVHX0dFTkVSQVRPUl9QQVJTSU5HKQotCQkJZGVidWcoIkVuZCBQcm9jZXNzaW5nIERlZmF1bHRGZWF0dXJlIFRhZzogdXJsOiIgKyB1cmxJbmZvICsgIiB0eXBlOiIgKyB0eXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQl9Ci0KLQkvKiAKLQkgKiBwcm9jZXNzIFVSTCBpbmZvIHdpdGggZWxlbWVudCB0ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbmZvKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlVUkxFbnRyeSBpbmYgPSBuZXcgVVJMRW50cnkoKTsKLQkJU3RyaW5nIGluZm9VUkwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbmYuc2V0VVJMKGluZm9VUkwpOwotCi0JCWlmIChUcmFjaW5nLkRFQlVHX0dFTkVSQVRPUl9QQVJTSU5HKQotCQkJZGVidWcoIlByb2Nlc3NlZCBJbmZvOiB1cmw6IiArIGluZm9VUkwpOyAvLyROT04tTkxTLTEkCi0KLQkJb2JqZWN0U3RhY2sucHVzaChpbmYpOwotCX0KLQotCS8qIAotCSAqIHByb2Nlc3Mgc2l0ZSBpbmZvCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTaXRlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkvLyBjcmVhdGUgc2l0ZSBtYXAKLQkJU2l0ZU1vZGVsIHNpdGUgPSBuZXcgU2l0ZU1vZGVsKCk7Ci0KLQkJLy8gaWYgVVJMIGlzIHNwZWNpZmllZCwgaXQgcmVwbGFjZXMgdGhlIFVSTCBvZiB0aGUgc2l0ZQotCQkvLyB1c2VkIHRvIGNhbGN1bGF0ZSB0aGUgbG9jYXRpb24gb2YgZmVhdHVyZXMgYW5kIGFyY2hpdmVzCi0JCVN0cmluZyBzaXRlVVJMID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNpdGVVUkwgIT0gbnVsbCAmJiAhKCIiLmVxdWFscyhzaXRlVVJMLnRyaW0oKSkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghc2l0ZVVSTC5lbmRzV2l0aCgiLyIpICYmICFzaXRlVVJMLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc2l0ZVVSTCArPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNpdGUuc2V0TG9jYXRpb25VUkxTdHJpbmcoc2l0ZVVSTCk7Ci0JCX0KLQotCQkvLyBwcm92aWRlIGRlZmF1bHQgZGVzY3JpcHRpb24gVVJMCi0JCS8vIElmIDxkZXNjcmlwdGlvbj4gaXMgc3BlY2lmaWVkLCBmb3IgdGhlIHNpdGUsICBpdCB0YWtlcyBwcmVjZWRlbmNlCQkKLQkJVVJMRW50cnkgZGVzY3JpcHRpb24gPSBuZXcgVVJMRW50cnkoKTsKLQkJZGVzY3JpcHRpb24uc2V0VVJMKERFRkFVTFRfSU5GT19VUkwpOwotCQlzaXRlLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uKTsKLQotCQkvLyB2ZXJpZnkgd2UgY2FuIHBhcnNlIHRoZSBzaXRlIC4uLmlmIHRoZSBzaXRlIGhhcwotCQkvLyBhIGRpZmZlcmVudCB0eXBlIHRocm93IGFuIGV4Y2VwdGlvbiB0byBmb3JjZSByZXBhcnNpbmcKLQkJLy8gd2l0aCB0aGUgbWF0Y2hpbmcgcGFyc2VyCi0JCVN0cmluZyB0eXBlID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCXNpdGUuc2V0VHlwZSh0eXBlKTsKLQotCQkvLyBnZXQgbWlycm9ycywgaWYgYW55Ci0JCVN0cmluZyBtaXJyb3JzVVJMID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibWlycm9yc1VSTCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtaXJyb3JzVVJMICE9IG51bGwgJiYgbWlycm9yc1VSTC50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLwkJCVVSTEVudHJ5W10gbWlycm9ycyA9IGdldE1pcnJvcnMobWlycm9yc1VSTCk7Ci0JCQkvLwkJCWlmIChtaXJyb3JzICE9IG51bGwpCi0JCQkvLwkJCQlzaXRlLnNldE1pcnJvcnMobWlycm9ycyk7Ci0JCQkvLwkJCWVsc2UKLQotCQkJLy9TaW5jZSB3ZSBhcmUgcGFyc2luZyB0aGUgc2l0ZSBhdCBwMiBnZW5lcmF0aW9uIHRpbWUgYW5kIHRoZSAKLQkJCS8vbWlycm9ycyBtYXkgY2hhbmdlLCB0aGVyZSBpcyBubyBwb2ludCBkb2luZyB0aGUgbWlycm9yIGV4cGFuc2lvbiBub3cKLQkJCXNpdGUuc2V0TWlycm9yc1VSTFN0cmluZyhtaXJyb3JzVVJMKTsKLQkJfQotCi0JCVN0cmluZyBwYWNrMjAwID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgicGFjazIwMCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwYWNrMjAwICE9IG51bGwgJiYgbmV3IEJvb2xlYW4ocGFjazIwMCkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCXNpdGUuc2V0U3VwcG9ydHNQYWNrMjAwKHRydWUpOwotCQl9Ci0KLQkJLy8JCWlmIChhdHRyaWJ1dGVzLmdldFZhbHVlKCJkaWdlc3RVUkwiKSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCQlzaXRlLnNldERpZ2VzdEV4aXN0KHRydWUpOwotCQkvLwkJCXNpdGUuc2V0RGlnZXN0VVJMKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImRpZ2VzdFVSTCIpKTsgLy8kTk9OLU5MUy0xJAotCQkvLwotCQkvLwkJCWlmICgoYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXZhaWxhYmxlTG9jYWxlcyIpICE9IG51bGwpICYmICghYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXZhaWxhYmxlTG9jYWxlcyIpLnRyaW0oKS5lcXVhbHMoIiIpKSkgeyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCS8vCQkJCVN0cmluZ1Rva2VuaXplciBsb2NhbHMgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImF2YWlsYWJsZUxvY2FsZXMiKSwgIiwiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJLy8JCQkJU3RyaW5nW10gYXZhaWxhYmxlTG9jYWxzID0gbmV3IFN0cmluZ1tsb2NhbHMuY291bnRUb2tlbnMoKV07Ci0JCS8vCQkJCWludCBpID0gMDsKLQkJLy8JCQkJd2hpbGUgKGxvY2Fscy5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJLy8JCQkJCWF2YWlsYWJsZUxvY2Fsc1tpKytdID0gbG9jYWxzLm5leHRUb2tlbigpOwotCQkvLwkJCQl9Ci0JCS8vCQkJCQkJCQlleHRlbmRlZFNpdGUuc2V0QXZhaWxhYmxlTG9jYWxzKGF2YWlsYWJsZUxvY2Fscyk7Ci0JCS8vCQkJfQotCQkvLwkJfQotCQkvLwotCQkvLwkJaWYgKChzaXRlIGluc3RhbmNlb2YgRXh0ZW5kZWRTaXRlKSAmJiAoYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXNzb2NpYXRlU2l0ZXNVUkwiKSAhPSBudWxsKSkgeyAvLyROT04tTkxTLTEkCi0JCS8vCQkJSVVSTEVudHJ5W10gYXNzb2NpYXRlU2l0ZXMgPSBnZXRBc3NvY2lhdGVTaXRlcyhhdHRyaWJ1dGVzLmdldFZhbHVlKCJhc3NvY2lhdGVTaXRlc1VSTCIpLCBmYWN0b3J5KTsgLy8kTk9OLU5MUy0xJAotCQkvLwkJCWlmIChhc3NvY2lhdGVTaXRlcyAhPSBudWxsKQotCQkvLwkJCQkoKEV4dGVuZGVkU2l0ZSkgc2l0ZSkuc2V0QXNzb2NpYXRlU2l0ZXMoYXNzb2NpYXRlU2l0ZXMpOwotCQkvLwkJCWVsc2UKLQkJLy8JCQkJc2l0ZS5zZXRNaXJyb3JzVVJMU3RyaW5nKG1pcnJvcnNVUkwpOwotCQkvLwkJfQotCi0JCW9iamVjdFN0YWNrLnB1c2goc2l0ZSk7Ci0KLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpCi0JCQlkZWJ1ZygiRW5kIHByb2Nlc3MgU2l0ZSB0YWc6IHNpdGVVUkw6IiArIHNpdGVVUkwgKyAiIHR5cGU6IiArIHR5cGUpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JfQotCi0JLyoqCi0JICogSGFuZGxlIHN0YXJ0IG9mIGVsZW1lbnQgdGFncwotCSAqIEBzZWUgRGVmYXVsdEhhbmRsZXIjc3RhcnRFbGVtZW50KFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIEF0dHJpYnV0ZXMpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0KLQkJaWYgKFRyYWNpbmcuREVCVUdfR0VORVJBVE9SX1BBUlNJTkcpIHsKLQkJCWRlYnVnKCJTdGF0ZTogIiArIGN1cnJlbnRTdGF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRlYnVnKCJTdGFydCBFbGVtZW50OiB1cmk6IiArIHVyaSArICIgbG9jYWwgTmFtZToiICsgbG9jYWxOYW1lICsgIiBxTmFtZToiICsgcU5hbWUpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlzd2l0Y2ggKGN1cnJlbnRTdGF0ZSkgewotCQkJY2FzZSBTVEFURV9JR05PUkVEX0VMRU1FTlQgOgotCQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbGVtZW50LCAobmV3IFN0cmluZ1tdIHtsb2NhbE5hbWUsIGdldFN0YXRlKGN1cnJlbnRTdGF0ZSl9KSkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9JTklUSUFMIDoKLQkJCQloYW5kbGVJbml0aWFsU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9TSVRFIDoKLQkJCQloYW5kbGVTaXRlU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9GRUFUVVJFIDoKLQkJCQloYW5kbGVGZWF0dXJlU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9BUkNISVZFIDoKLQkJCQloYW5kbGVTaXRlU3RhdGUobG9jYWxOYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBTVEFURV9DQVRFR09SWSA6Ci0JCQkJaGFuZGxlQ2F0ZWdvcnlTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX0NBVEVHT1JZX0RFRiA6Ci0JCQkJaGFuZGxlQ2F0ZWdvcnlEZWZTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX0RFU0NSSVBUSU9OX1NJVEUgOgotCQkJCWhhbmRsZVNpdGVTdGF0ZShsb2NhbE5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX0RFU0NSSVBUSU9OX0NBVEVHT1JZX0RFRiA6Ci0JCQkJaGFuZGxlU2l0ZVN0YXRlKGxvY2FsTmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCWludGVybmFsRXJyb3JVbmtub3duVGFnKE5MUy5iaW5kKE1lc3NhZ2VzLkRlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25TdGFydFN0YXRlLCAobmV3IFN0cmluZ1tdIHtnZXRTdGF0ZShjdXJyZW50U3RhdGUpfSkpKTsKLQkJCQlicmVhazsKLQkJfQotCQlpbnQgbmV3U3RhdGUgPSAoKEludGVnZXIpIHN0YXRlU3RhY2sucGVlaygpKS5pbnRWYWx1ZSgpOwotCQlpZiAobmV3U3RhdGUgIT0gU1RBVEVfSUdOT1JFRF9FTEVNRU5UKQotCQkJY3VycmVudFN0YXRlID0gbmV3U3RhdGU7Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdHJhaWxpbmdTcGFjZShTdHJpbmcgc3RyKSB7Ci0JCWlmIChzdHIubGVuZ3RoKCkgPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHN0ci5jaGFyQXQoc3RyLmxlbmd0aCgpIC0gMSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvRGlnZXN0UGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9EaWdlc3RQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ3MDYyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9EaWdlc3RQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIERlZmF1bHQgZmVhdHVyZSBwYXJzZXIuCi0gKiBQYXJzZXMgdGhlIGZlYXR1cmUgbWFuaWZlc3QgZmlsZSBhcyBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybS4KLSAqIAotICogQHNpbmNlIDMuMAotICovCi1wdWJsaWMgY2xhc3MgRGlnZXN0UGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCXByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsKLQlwcml2YXRlIGZpbmFsIExpc3QgZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBmaW5hbCBGZWF0dXJlUGFyc2VyIGZlYXR1cmVIYW5kbGVyID0gbmV3IEZlYXR1cmVQYXJzZXIoZmFsc2UpOwotCi0JcHVibGljIERpZ2VzdFBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQkJdHJ5IHsKLQkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQl0aGlzLnBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWZlYXR1cmVIYW5kbGVyLmNoYXJhY3RlcnMoY2gsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJaWYgKCJkaWdlc3QiLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoImZlYXR1cmUiLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUZlYXR1cmUgZmVhdHVyZSA9IGZlYXR1cmVIYW5kbGVyLmdldFJlc3VsdCgpOwotCQkJZmVhdHVyZXMuYWRkKGZlYXR1cmUpOwotCQl9IGVsc2UKLQkJCWZlYXR1cmVIYW5kbGVyLmVuZEVsZW1lbnQodXJpLCBsb2NhbE5hbWUsIHFOYW1lKTsKLQl9Ci0KLQlwdWJsaWMgRmVhdHVyZVtdIHBhcnNlKEZpbGUgbG9jYXRpb24pIHsKLQkJaWYgKCFsb2NhdGlvbi5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUphckZpbGUgamFyID0gbmV3IEphckZpbGUobG9jYXRpb24pOwotCQkJSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoImRpZ2VzdC54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGphci5nZXRJbnB1dFN0cmVhbShlbnRyeSkpOwotCQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpcyksIHRoaXMpOwotCQkJcmV0dXJuIChGZWF0dXJlW10pIGZlYXR1cmVzLnRvQXJyYXkobmV3IEZlYXR1cmVbZmVhdHVyZXMuc2l6ZSgpXSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpcy5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkvLwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmICgiZGlnZXN0Ii5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJZmVhdHVyZUhhbmRsZXIuc3RhcnRFbGVtZW50KHVyaSwgbG9jYWxOYW1lLCBxTmFtZSwgYXR0cmlidXRlcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9GZWF0dXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0N2M1Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogCi0gKiBGZWF0dXJlIGluZm9ybWF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlIHsKLQotCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotCXByaXZhdGUgU3RyaW5nIHZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgaW1hZ2U7Ci0KLQlwcml2YXRlIFVSTEVudHJ5IGRlc2NyaXB0aW9uOwotCXByaXZhdGUgVVJMRW50cnkgbGljZW5zZTsKLQlwcml2YXRlIFVSTEVudHJ5IGNvcHlyaWdodDsKLQotCXByaXZhdGUgU3RyaW5nIGluc3RhbGxIYW5kbGVyOwotCXByaXZhdGUgU3RyaW5nIGluc3RhbGxIYW5kbGVyVVJMOwotCXByaXZhdGUgU3RyaW5nIGluc3RhbGxIYW5kbGVyTGlicmFyeTsKLQotCXByaXZhdGUgVVJMRW50cnkgdXBkYXRlU2l0ZTsKLQlwcml2YXRlIEFycmF5TGlzdCBkaXNjb3ZlcnlTaXRlczsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGVudHJpZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvdmlkZXJOYW1lOwotCXByaXZhdGUgU3RyaW5nIG9zOwotCXByaXZhdGUgU3RyaW5nIHdzOwotCXByaXZhdGUgU3RyaW5nIGFyY2g7Ci0JcHJpdmF0ZSBTdHJpbmcgbmw7Ci0KLQlwcml2YXRlIFN0cmluZyBsb2NhdGlvbjsKLQotCXB1YmxpYyBGZWF0dXJlKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJaWYgKGlkID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXRoaXMuaWQgPSBpZDsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREaXNjb3ZlcnlTaXRlKFN0cmluZyBsYWJlbCwgU3RyaW5nIHVybCkgewotCQlpZiAobGFiZWwgPT0gbnVsbCAmJiB1cmwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAodGhpcy5kaXNjb3ZlcnlTaXRlcyA9PSBudWxsKQotCQkJdGhpcy5kaXNjb3ZlcnlTaXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlVUkxFbnRyeSBlbnRyeSA9IG5ldyBVUkxFbnRyeSh1cmwsIGxhYmVsKTsKLQkJdGhpcy5kaXNjb3ZlcnlTaXRlcy5hZGQoZW50cnkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KEZlYXR1cmVFbnRyeSBwbHVnaW4pIHsKLQkJaWYgKGVudHJpZXMgPT0gbnVsbCkKLQkJCWVudHJpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWVudHJpZXMuYWRkKHBsdWdpbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBcmNoKCkgewotCQlyZXR1cm4gYXJjaDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvcHlyaWdodCgpIHsKLQkJaWYgKGNvcHlyaWdodCAhPSBudWxsKQotCQkJcmV0dXJuIGNvcHlyaWdodC5nZXRBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29weXJpZ2h0VVJMKCkgewotCQlpZiAoY29weXJpZ2h0ICE9IG51bGwpCi0JCQlyZXR1cm4gY29weXJpZ2h0LmdldFVSTCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLQkJCXJldHVybiBkZXNjcmlwdGlvbi5nZXRBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb25VUkwoKSB7Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotCQkJcmV0dXJuIGRlc2NyaXB0aW9uLmdldFVSTCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgVVJMRW50cnlbXSBnZXREaXNjb3ZlcnlTaXRlcygpIHsKLQkJaWYgKGRpc2NvdmVyeVNpdGVzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFVSTEVudHJ5WzBdOwotCQlyZXR1cm4gKFVSTEVudHJ5W10pIGRpc2NvdmVyeVNpdGVzLnRvQXJyYXkobmV3IFVSTEVudHJ5W2Rpc2NvdmVyeVNpdGVzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBGZWF0dXJlRW50cnlbXSBnZXRFbnRyaWVzKCkgewotCQlpZiAoZW50cmllcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBGZWF0dXJlRW50cnlbMF07Ci0JCXJldHVybiAoRmVhdHVyZUVudHJ5W10pIGVudHJpZXMudG9BcnJheShuZXcgRmVhdHVyZUVudHJ5W2VudHJpZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbGxIYW5kbGVyKCkgewotCQlyZXR1cm4gaW5zdGFsbEhhbmRsZXI7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YWxsSGFuZGxlckxpYnJhcnkoKSB7Ci0JCXJldHVybiBpbnN0YWxsSGFuZGxlckxpYnJhcnk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnN0YWxsSGFuZGxlclVSTCgpIHsKLQkJcmV0dXJuIGluc3RhbGxIYW5kbGVyVVJMOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpY2Vuc2UoKSB7Ci0JCWlmIChsaWNlbnNlICE9IG51bGwpCi0JCQlyZXR1cm4gbGljZW5zZS5nZXRBbm5vdGF0aW9uKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGljZW5zZVVSTCgpIHsKLQkJaWYgKGxpY2Vuc2UgIT0gbnVsbCkKLQkJCXJldHVybiBsaWNlbnNlLmdldFVSTCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5sb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5MKCkgewotCQlyZXR1cm4gbmw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPUygpIHsKLQkJcmV0dXJuIG9zOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvdmlkZXJOYW1lKCkgewotCQlyZXR1cm4gcHJvdmlkZXJOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VXBkYXRlU2l0ZUxhYmVsKCkgewotCQlpZiAodXBkYXRlU2l0ZSAhPSBudWxsKQotCQkJcmV0dXJuIHVwZGF0ZVNpdGUuZ2V0QW5ub3RhdGlvbigpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVwZGF0ZVNpdGVVUkwoKSB7Ci0JCWlmICh1cGRhdGVTaXRlICE9IG51bGwpCi0JCQlyZXR1cm4gdXBkYXRlU2l0ZS5nZXRVUkwoKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdTKCkgewotCQlyZXR1cm4gd3M7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0KFN0cmluZyBjb3B5cmlnaHQpIHsKLQkJaWYgKHRoaXMuY29weXJpZ2h0ID09IG51bGwpCi0JCQl0aGlzLmNvcHlyaWdodCA9IG5ldyBVUkxFbnRyeSgpOwotCQl0aGlzLmNvcHlyaWdodC5zZXRBbm5vdGF0aW9uKGNvcHlyaWdodCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29weXJpZ2h0VVJMKFN0cmluZyBjb3B5cmlnaHRVUkwpIHsKLQkJaWYgKHRoaXMuY29weXJpZ2h0ID09IG51bGwpCi0JCQl0aGlzLmNvcHlyaWdodCA9IG5ldyBVUkxFbnRyeSgpOwotCQl0aGlzLmNvcHlyaWdodC5zZXRVUkwoY29weXJpZ2h0VVJMKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJaWYgKHRoaXMuZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBuZXcgVVJMRW50cnkoKTsKLQkJdGhpcy5kZXNjcmlwdGlvbi5zZXRBbm5vdGF0aW9uKGRlc2NyaXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvblVSTChTdHJpbmcgZGVzY3JpcHRpb25VUkwpIHsKLQkJaWYgKHRoaXMuZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXRoaXMuZGVzY3JpcHRpb24gPSBuZXcgVVJMRW50cnkoKTsKLQkJdGhpcy5kZXNjcmlwdGlvbi5zZXRVUkwoZGVzY3JpcHRpb25VUkwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVudmlyb25tZW50KFN0cmluZyBvcywgU3RyaW5nIHdzLCBTdHJpbmcgYXJjaCwgU3RyaW5nIG5sKSB7Ci0JCXRoaXMub3MgPSBvczsKLQkJdGhpcy53cyA9IHdzOwotCQl0aGlzLmFyY2ggPSBhcmNoOwotCQl0aGlzLm5sID0gbmw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW1hZ2UoU3RyaW5nIGltYWdlKSB7Ci0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnN0YWxsSGFuZGxlcihTdHJpbmcgaW5zdGFsbEhhbmRsZXIpIHsKLQkJdGhpcy5pbnN0YWxsSGFuZGxlciA9IGluc3RhbGxIYW5kbGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc3RhbGxIYW5kbGVyTGlicmFyeShTdHJpbmcgaW5zdGFsbEhhbmRsZXJMaWJyYXJ5KSB7Ci0JCXRoaXMuaW5zdGFsbEhhbmRsZXJMaWJyYXJ5ID0gaW5zdGFsbEhhbmRsZXJMaWJyYXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc3RhbGxIYW5kbGVyVVJMKFN0cmluZyBpbnN0YWxsSGFuZGxlclVSTCkgewotCQl0aGlzLmluc3RhbGxIYW5kbGVyVVJMID0gaW5zdGFsbEhhbmRsZXJVUkw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaWNlbnNlKFN0cmluZyBsaWNlbnNlKSB7Ci0JCWlmICh0aGlzLmxpY2Vuc2UgPT0gbnVsbCkKLQkJCXRoaXMubGljZW5zZSA9IG5ldyBVUkxFbnRyeSgpOwotCQl0aGlzLmxpY2Vuc2Uuc2V0QW5ub3RhdGlvbihsaWNlbnNlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaWNlbnNlVVJMKFN0cmluZyBsaWNlbnNlVVJMKSB7Ci0JCWlmICh0aGlzLmxpY2Vuc2UgPT0gbnVsbCkKLQkJCXRoaXMubGljZW5zZSA9IG5ldyBVUkxFbnRyeSgpOwotCQl0aGlzLmxpY2Vuc2Uuc2V0VVJMKGxpY2Vuc2VVUkwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExvY2F0aW9uKFN0cmluZyBsb2NhdGlvbikgewotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvdmlkZXJOYW1lKFN0cmluZyB2YWx1ZSkgewotCQlwcm92aWRlck5hbWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVTaXRlTGFiZWwoU3RyaW5nIHVwZGF0ZVNpdGVMYWJlbCkgewotCQlpZiAodGhpcy51cGRhdGVTaXRlID09IG51bGwpCi0JCQl0aGlzLnVwZGF0ZVNpdGUgPSBuZXcgVVJMRW50cnkoKTsKLQkJdGhpcy51cGRhdGVTaXRlLnNldEFubm90YXRpb24odXBkYXRlU2l0ZUxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVTaXRlVVJMKFN0cmluZyB1cGRhdGVTaXRlVVJMKSB7Ci0JCWlmICh0aGlzLnVwZGF0ZVNpdGUgPT0gbnVsbCkKLQkJCXRoaXMudXBkYXRlU2l0ZSA9IG5ldyBVUkxFbnRyeSgpOwotCQl0aGlzLnVwZGF0ZVNpdGUuc2V0VVJMKHVwZGF0ZVNpdGVVUkwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdmFsdWUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogRm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiRmVhdHVyZSAiICsgaWQgKyAiIHZlcnNpb246ICIgKyB2ZXJzaW9uOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9GZWF0dXJlRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL0ZlYXR1cmVFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTk3NGM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL0ZlYXR1cmVFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlczsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlRW50cnkgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIHZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCXByaXZhdGUgU3RyaW5nIG9zOwotCXByaXZhdGUgU3RyaW5nIHdzOwotCXByaXZhdGUgU3RyaW5nIGFyY2g7Ci0JcHJpdmF0ZSBTdHJpbmcgbmw7Ci0JcHJpdmF0ZSBTdHJpbmcgbWF0Y2g7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzUGx1Z2luOwotCXByaXZhdGUgYm9vbGVhbiBpc0ZyYWdtZW50ID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGlzUmVxdWlyZXMgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gdW5wYWNrID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gb3B0aW9uYWwgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRlbXBvcmFyeSBmaWVsZCB0byBhZGQgcHJvdmlzaW9uaW5nIGZpbHRlcnMgdG8gZmVhdHVyZXMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmaWx0ZXI7Ci0KLQlwdWJsaWMgc3RhdGljIEZlYXR1cmVFbnRyeSBjcmVhdGVSZXF1aXJlcyhTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgbWF0Y2gsIFN0cmluZyBmaWx0ZXIsIGJvb2xlYW4gaXNQbHVnaW4pIHsKLQkJRmVhdHVyZUVudHJ5IHJlc3VsdCA9IG5ldyBGZWF0dXJlRW50cnkoaWQsIHZlcnNpb24sIGlzUGx1Z2luKTsKLQkJcmVzdWx0Lm1hdGNoID0gbWF0Y2g7Ci0JCXJlc3VsdC5pc1JlcXVpcmVzID0gdHJ1ZTsKLQkJLy8gZm9yIHJlcXVpcmVzIHdlIGRvbid0IGNhcmUgd2hhdCB0aGUgZm9ybSBpcyBzbyBsZWF2ZSBpdCBhcyBmYWxzZSAoSkFSJ2QpCi0JCXJlc3VsdC51bnBhY2sgPSBmYWxzZTsKLQkJaWYgKGZpbHRlciAhPSBudWxsKQotCQkJcmVzdWx0LnNldEZpbHRlcihmaWx0ZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBGZWF0dXJlRW50cnkoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbiwgYm9vbGVhbiBpc1BsdWdpbikgewotCQl0aGlzLmlkID0gaWQ7Ci0JCXRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0JCXRoaXMuaXNQbHVnaW4gPSBpc1BsdWdpbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZmluYWwgRmVhdHVyZUVudHJ5IG90aGVyID0gKEZlYXR1cmVFbnRyeSkgb2JqOwotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJaWYgKG90aGVyLmlkICE9IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKCFpZC5lcXVhbHMob3RoZXIuaWQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodmVyc2lvbiA9PSBudWxsKSB7Ci0JCQlpZiAob3RoZXIudmVyc2lvbiAhPSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfSBlbHNlIGlmICghdmVyc2lvbi5lcXVhbHMob3RoZXIudmVyc2lvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXJjaCgpIHsKLQkJcmV0dXJuIGFyY2g7Ci0JfQotCi0JLyoqCi0JICogVGVtcG9yYXJ5IG1ldGhvZCB0byBhZGQgcHJvdmlzaW9uaW5nIGZpbHRlcnMgdG8gZmVhdHVyZXMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZpbHRlcigpIHsKLQkJcmV0dXJuIGZpbHRlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlyZXR1cm4gaWQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRNYXRjaCgpIHsKLQkJcmV0dXJuIG1hdGNoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TkwoKSB7Ci0JCXJldHVybiBubDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE9TKCkgewotCQlyZXR1cm4gb3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVUkwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdTKCkgewotCQlyZXR1cm4gd3M7Ci0JfQotCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJZmluYWwgaW50IHByaW1lID0gMzE7Ci0JCWludCByZXN1bHQgPSAxOwotCQlyZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArICgoaWQgPT0gbnVsbCkgPyAwIDogaWQuaGFzaENvZGUoKSk7Ci0JCXJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKCh2ZXJzaW9uID09IG51bGwpID8gMCA6IHZlcnNpb24uaGFzaENvZGUoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGcmFnbWVudCgpIHsKLQkJcmV0dXJuIGlzRnJhZ21lbnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNPcHRpb25hbCgpIHsKLQkJcmV0dXJuIG9wdGlvbmFsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGx1Z2luKCkgewotCQlyZXR1cm4gaXNQbHVnaW47Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlcygpIHsKLQkJcmV0dXJuIGlzUmVxdWlyZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNVbnBhY2soKSB7Ci0JCXJldHVybiB1bnBhY2s7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW52aXJvbm1lbnQoU3RyaW5nIG9zLCBTdHJpbmcgd3MsIFN0cmluZyBhcmNoLCBTdHJpbmcgbmwpIHsKLQkJdGhpcy5vcyA9IG9zOwotCQl0aGlzLndzID0gd3M7Ci0JCXRoaXMuYXJjaCA9IGFyY2g7Ci0JCXRoaXMubmwgPSBubDsKLQl9Ci0KLQkvKioKLQkgKiBUZW1wb3JhcnkgbWV0aG9kIHRvIGFkZCBwcm92aXNpb25pbmcgZmlsdGVycyB0byBmZWF0dXJlcwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZpbHRlcihTdHJpbmcgZmlsdGVyKSB7Ci0JCXRoaXMuZmlsdGVyID0gZmlsdGVyOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RnJhZ21lbnQoYm9vbGVhbiB2YWx1ZSkgewotCQlpc0ZyYWdtZW50ID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoYm9vbGVhbiB2YWx1ZSkgewotCQlvcHRpb25hbCA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVucGFjayhib29sZWFuIHZhbHVlKSB7Ci0JCXVucGFjayA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVSTChTdHJpbmcgdmFsdWUpIHsKLQkJdXJsID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlyZXN1bHQuYXBwZW5kKGlzUGx1Z2luID8gIlBsdWdpbjogIiA6ICJGZWF0dXJlOiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJlc3VsdC5hcHBlbmQoaWQgIT0gbnVsbCA/IGlkLnRvU3RyaW5nKCkgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZCh2ZXJzaW9uICE9IG51bGwgPyAiICIgKyB2ZXJzaW9uLnRvU3RyaW5nKCkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvRmVhdHVyZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvRmVhdHVyZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjk0MTQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL0ZlYXR1cmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogRGVmYXVsdCBmZWF0dXJlIHBhcnNlci4KLSAqIFBhcnNlcyB0aGUgZmVhdHVyZSBtYW5pZmVzdCBmaWxlIGFzIGRlZmluZWQgYnkgdGhlIHBsYXRmb3JtLgotICogCi0gKiBAc2luY2UgMy4wCi0gKi8KLXB1YmxpYyBjbGFzcyBGZWF0dXJlUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU0FYUGFyc2VyRmFjdG9yeSBwYXJzZXJGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotCXByaXZhdGUgU0FYUGFyc2VyIHBhcnNlcjsKLQlwcml2YXRlIEZlYXR1cmUgcmVzdWx0OwotCXByaXZhdGUgVVJMIHVybDsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBjaGFyYWN0ZXJzID0gbnVsbDsKLQotCXByaXZhdGUgUHJvcGVydGllcyBtZXNzYWdlcyA9IG51bGw7Ci0KLQlwdWJsaWMgRmVhdHVyZVBhcnNlcigpIHsKLQkJdGhpcyh0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmVhdHVyZVBhcnNlcihib29sZWFuIGNyZWF0ZVBhcnNlcikgewotCQlzdXBlcigpOwotCQlpZiAoIWNyZWF0ZVBhcnNlcikKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCXBhcnNlckZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JCQl0aGlzLnBhcnNlciA9IHBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2gsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChjaGFyYWN0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNoYXJhY3RlcnMuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRmVhdHVyZSBjcmVhdGVGZWF0dXJlKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIG5ldyBGZWF0dXJlKGlkLCB2ZXJzaW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChjaGFyYWN0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICgiZGVzY3JpcHRpb24iLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdC5zZXREZXNjcmlwdGlvbihsb2NhbGl6ZShjaGFyYWN0ZXJzLnRvU3RyaW5nKCkudHJpbSgpKSk7Ci0JCX0gZWxzZSBpZiAoImxpY2Vuc2UiLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdC5zZXRMaWNlbnNlKGxvY2FsaXplKGNoYXJhY3RlcnMudG9TdHJpbmcoKS50cmltKCkpKTsKLQkJfSBlbHNlIGlmICgiY29weXJpZ2h0Ii5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQuc2V0Q29weXJpZ2h0KGxvY2FsaXplKGNoYXJhY3RlcnMudG9TdHJpbmcoKS50cmltKCkpKTsKLQkJfQotCQljaGFyYWN0ZXJzID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRmVhdHVyZSBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGxvYWRQcm9wZXJ0aWVzKEZpbGUgZGlyZWN0b3J5KSB7Ci0JCS8vc2tpcCBkaXJlY3RvcmllcyB0aGF0IGRvbid0IGNvbnRhaW4gYSBmZWF0dXJlLnByb3BlcnRpZXMgZmlsZQotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkaXJlY3RvcnksICJmZWF0dXJlLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0JCQl0cnkgewotCQkJCVByb3BlcnRpZXMgcmVzdWx0ID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQlyZXN1bHQubG9hZChpbnB1dCk7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaWYgKGlucHV0ICE9IG51bGwpCi0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGxvYWRQcm9wZXJ0aWVzKEphckZpbGUgamFyKSB7Ci0JCUphckVudHJ5IGVudHJ5ID0gamFyLmdldEphckVudHJ5KCJmZWF0dXJlLnByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpKTsKLQkJCXRyeSB7Ci0JCQkJUHJvcGVydGllcyByZXN1bHQgPSBuZXcgUHJvcGVydGllcygpOwotCQkJCXJlc3VsdC5sb2FkKGlucHV0KTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoaW5wdXQgIT0gbnVsbCkKLQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBsb2NhbGl6ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKG1lc3NhZ2VzID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiB2YWx1ZTsKLQkJaWYgKCF2YWx1ZS5zdGFydHNXaXRoKCIlIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB2YWx1ZTsKLQkJcmV0dXJuIG1lc3NhZ2VzLmdldFByb3BlcnR5KHZhbHVlLnN1YnN0cmluZygxKSwgdmFsdWUpOwotCX0KLQotCS8qKgotCSAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGFuZCBjb25zdHJ1Y3RzIGEgZmVhdHVyZS4gVGhlIGdpdmVuIGxvY2F0aW9uIAotCSAqIHNob3VsZCBiZSBlaXRoZXIgdGhlIGxvY2F0aW9uIG9mIHRoZSBmZWF0dXJlIEpBUiBvciB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcKLQkgKiB0aGUgZmVhdHVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gbG9jYXRpb24gdGhlIGxvY2F0aW9uIG9mIHRoZSBmZWF0dXJlIHRvIHBhcnNlLiAgCi0JICovCi0JcHVibGljIEZlYXR1cmUgcGFyc2UoRmlsZSBsb2NhdGlvbikgewotCQlpZiAoIWxvY2F0aW9uLmV4aXN0cygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChsb2NhdGlvbi5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkvL3NraXAgZGlyZWN0b3JpZXMgdGhhdCBkb24ndCBjb250YWluIGEgZmVhdHVyZS54bWwgZmlsZQotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUobG9jYXRpb24sICJmZWF0dXJlLnhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBsb2FkUHJvcGVydGllcyhsb2NhdGlvbik7Ci0JCQl0cnkgewotCQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0JCQkJcmV0dXJuIHBhcnNlKGlucHV0LCBwcm9wZXJ0aWVzKTsKLQkJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChsb2NhdGlvbi5nZXROYW1lKCkuZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0cnkgewotCQkJCUphckZpbGUgamFyID0gbmV3IEphckZpbGUobG9jYXRpb24pOwotCQkJCVByb3BlcnRpZXMgcHJvcGVydGllcyA9IGxvYWRQcm9wZXJ0aWVzKGphcik7Ci0JCQkJSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoImZlYXR1cmUueG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpKTsKLQkJCQlyZXR1cm4gcGFyc2UoaW5wdXQsIHByb3BlcnRpZXMpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUGFyc2UgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJuIGEgZmVhdHVyZSBvYmplY3QKLQkgKiBvciBudWxsLiBUaGlzIG1ldGhvZCBjbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgRmVhdHVyZSBwYXJzZShJbnB1dFN0cmVhbSBpbiwgUHJvcGVydGllcyBtZXNzYWdlcykgewotCQl0aGlzLm1lc3NhZ2VzID0gbWVzc2FnZXM7Ci0JCXJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGluKSwgdGhpcyk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkvLwkJCQkJVXRpbHMubG9nKGUxLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvcHlyaWdodChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJcmVzdWx0LnNldENvcHlyaWdodFVSTChhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hhcmFjdGVycyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0Rlc2NyaXB0aW9uKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlyZXN1bHQuc2V0RGVzY3JpcHRpb25VUkwoYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIikpOyAvLyROT04tTkxTLTEkCi0JCWNoYXJhY3RlcnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NEaXNjb3ZlcnlTaXRlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlyZXN1bHQuYWRkRGlzY292ZXJ5U2l0ZShhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKSwgYXR0cmlidXRlcy5nZXRWYWx1ZSgibGFiZWwiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NGZWF0dXJlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlTdHJpbmcgaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB2ZXIgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC50cmltKCkuZXF1YWxzKCIiKSAvLyROT04tTkxTLTEkCi0JCQkJfHwgdmVyID09IG51bGwgfHwgdmVyLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vCQkJU3lzdGVtLm91dC5wcmludGxuKE5MUy5iaW5kKE1lc3NhZ2VzLkZlYXR1cmVQYXJzZXJfSWRPclZlcnNpb25JbnZhbGlkLCAobmV3IFN0cmluZ1tdIHsgaWQsIHZlcn0pKSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVGZWF0dXJlKGlkLCB2ZXIpOwotCi0JCQlTdHJpbmcgb3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvcyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgd3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ3cyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJubCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgYXJjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0LnNldEVudmlyb25tZW50KG9zLCB3cywgYXJjaCwgbmwpOwotCi0JCQkvL1RPRE8gcm9vdFVSTHMKLQkJCWlmICh1cmwgIT0gbnVsbCAmJiAiZmlsZSIuZXF1YWxzKHVybC5nZXRQcm90b2NvbCgpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJRmlsZSBmID0gbmV3IEZpbGUodXJsLmdldEZpbGUoKS5yZXBsYWNlKCcvJywgRmlsZS5zZXBhcmF0b3JDaGFyKSk7Ci0JCQkJcmVzdWx0LnNldFVSTCgiZmVhdHVyZXMiICsgIi8iICsgZi5nZXRQYXJlbnRGaWxlKCkuZ2V0TmFtZSgpICsgIi8iKTsvLyArIGYuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gZXh0ZXJuYWxpemVkIFVSTHMgbWlnaHQgYmUgaW4gcmVsYXRpdmUgZm9ybSwgZW5zdXJlIHRoZXkgYXJlIGFic29sdXRlCQkJCQotCQkJCS8vCQkJCWZlYXR1cmUuc2V0VVJMKFV0aWxzLm1ha2VBYnNvbHV0ZShVdGlscy5nZXRJbnN0YWxsVVJMKCksIHVybCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQl9Ci0KLQkJCXJlc3VsdC5zZXRQcm92aWRlck5hbWUobG9jYWxpemUoYXR0cmlidXRlcy5nZXRWYWx1ZSgicHJvdmlkZXItbmFtZSIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdC5zZXRMYWJlbChsb2NhbGl6ZShhdHRyaWJ1dGVzLmdldFZhbHVlKCJsYWJlbCIpKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlc3VsdC5zZXRJbWFnZShhdHRyaWJ1dGVzLmdldFZhbHVlKCJpbWFnZSIpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkvLwkJCVV0aWxzLmRlYnVnKCJFbmQgcHJvY2VzcyBEZWZhdWx0RmVhdHVyZSB0YWc6IGlkOiIgK2lkICsgIiB2ZXI6IiArdmVyICsgIiB1cmw6IiArIGZlYXR1cmUuZ2V0VVJMKCkpOyAJIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0ltcG9ydChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZmVhdHVyZSIpOyAvLyROT04tTkxTLTEkCi0JCUZlYXR1cmVFbnRyeSBlbnRyeSA9IG51bGw7Ci0JCWlmIChpZCAhPSBudWxsKSB7Ci0JCQllbnRyeSA9IEZlYXR1cmVFbnRyeS5jcmVhdGVSZXF1aXJlcyhpZCwgYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpLCBhdHRyaWJ1dGVzLmdldFZhbHVlKCJtYXRjaCIpLCBhdHRyaWJ1dGVzLmdldFZhbHVlKCJmaWx0ZXIiKSwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9IGVsc2UgewotCQkJaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwbHVnaW4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZW50cnkgPSBGZWF0dXJlRW50cnkuY3JlYXRlUmVxdWlyZXMoaWQsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKSwgYXR0cmlidXRlcy5nZXRWYWx1ZSgibWF0Y2giKSwgYXR0cmlidXRlcy5nZXRWYWx1ZSgiZmlsdGVyIiksIHRydWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCXJlc3VsdC5hZGRFbnRyeShlbnRyeSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NJbmNsdWRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJRmVhdHVyZUVudHJ5IGVudHJ5ID0gbmV3IEZlYXR1cmVFbnRyeShhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpLCBhdHRyaWJ1dGVzLmdldFZhbHVlKCJ2ZXJzaW9uIiksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVN0cmluZyBmbGFnID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgib3B0aW9uYWwiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZmxhZyAhPSBudWxsKQotCQkJZW50cnkuc2V0T3B0aW9uYWwoQm9vbGVhbi52YWx1ZU9mKGZsYWcpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJc2V0RW52aXJvbm1lbnQoYXR0cmlidXRlcywgZW50cnkpOwotCQlyZXN1bHQuYWRkRW50cnkoZW50cnkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzSW5zdGFsbEhhbmRsZXIoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCXJlc3VsdC5zZXRJbnN0YWxsSGFuZGxlcihhdHRyaWJ1dGVzLmdldFZhbHVlKCJoYW5kbGVyIikpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5zZXRJbnN0YWxsSGFuZGxlckxpYnJhcnkoYXR0cmlidXRlcy5nZXRWYWx1ZSgibGlicmFyeSIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuc2V0SW5zdGFsbEhhbmRsZXJVUkwoYXR0cmlidXRlcy5nZXRWYWx1ZSgidXJsIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NMaWNlbnNlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlyZXN1bHQuc2V0TGljZW5zZVVSTChhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1cmwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJY2hhcmFjdGVycyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc1BsdWdpbihBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJU3RyaW5nIGlkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdmVyc2lvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChpZCA9PSBudWxsIHx8IGlkLnRyaW0oKS5lcXVhbHMoIiIpIHx8IHZlcnNpb24gPT0gbnVsbCB8fCB2ZXJzaW9uLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKE5MUy5iaW5kKCJGZWF0dXJlUGFyc2VyI3Byb2Nlc3NQbHVnaW4sIElEIHswfSBvciB2ZXJzaW9uIHsxfSBpbnZhbGlkIiwgKG5ldyBTdHJpbmdbXSB7aWQsIHZlcnNpb259KSkpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlGZWF0dXJlRW50cnkgcGx1Z2luID0gbmV3IEZlYXR1cmVFbnRyeShpZCwgdmVyc2lvbiwgdHJ1ZSk7Ci0JCQlzZXRFbnZpcm9ubWVudChhdHRyaWJ1dGVzLCBwbHVnaW4pOwotCQkJU3RyaW5nIHVucGFjayA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVucGFjayIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAodW5wYWNrICE9IG51bGwpCi0JCQkJcGx1Z2luLnNldFVucGFjayhCb29sZWFuLnZhbHVlT2YodW5wYWNrKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQlTdHJpbmcgZnJhZ21lbnQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJmcmFnbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZnJhZ21lbnQgIT0gbnVsbCkKLQkJCQlwbHVnaW4uc2V0RnJhZ21lbnQoQm9vbGVhbi52YWx1ZU9mKGZyYWdtZW50KS5ib29sZWFuVmFsdWUoKSk7Ci0JCQlTdHJpbmcgZmlsdGVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiZmlsdGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChmaWx0ZXIgIT0gbnVsbCkKLQkJCQlwbHVnaW4uc2V0RmlsdGVyKGZpbHRlcik7Ci0JCQlyZXN1bHQuYWRkRW50cnkocGx1Z2luKTsKLQotCQkJLy8JCQlVdGlscy5kZWJ1ZygiRW5kIHByb2Nlc3MgRGVmYXVsdEZlYXR1cmUgdGFnOiBpZDoiICsgaWQgKyAiIHZlcjoiICsgdmVyICsgIiB1cmw6IiArIGZlYXR1cmUuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NVcGRhdGVTaXRlKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlyZXN1bHQuc2V0VXBkYXRlU2l0ZUxhYmVsKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxhYmVsIikpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5zZXRVcGRhdGVTaXRlVVJMKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInVybCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFbnZpcm9ubWVudChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIEZlYXR1cmVFbnRyeSBlbnRyeSkgewotCQlTdHJpbmcgb3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvcyIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB3cyA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIndzIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5sID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgYXJjaCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQllbnRyeS5zZXRFbnZpcm9ubWVudChvcywgd3MsIGFyY2gsIG5sKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvLwkJVXRpbHMuZGVidWcoIlN0YXJ0IEVsZW1lbnQ6IHVyaToiICsgdXJpICsgIiBsb2NhbCBOYW1lOiIgKyBsb2NhbE5hbWUgKyAiIHFOYW1lOiIgKyBxTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCWlmICgicGx1Z2luIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzUGx1Z2luKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKCJkZXNjcmlwdGlvbiIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc0Rlc2NyaXB0aW9uKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKCJsaWNlbnNlIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzTGljZW5zZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgiY29weXJpZ2h0Ii5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzQ29weXJpZ2h0KGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKCJmZWF0dXJlIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzRmVhdHVyZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgiaW1wb3J0Ii5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzSW1wb3J0KGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKCJpbmNsdWRlcyIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvY2Vzc0luY2x1ZGVzKGF0dHJpYnV0ZXMpOwotCQl9IGVsc2UgaWYgKCJpbnN0YWxsLWhhbmRsZXIiLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXByb2Nlc3NJbnN0YWxsSGFuZGxlcihhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgidXBkYXRlIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzVXBkYXRlU2l0ZShhdHRyaWJ1dGVzKTsKLQkJfSBlbHNlIGlmICgiZGlzY292ZXJ5Ii5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm9jZXNzRGlzY292ZXJ5U2l0ZShhdHRyaWJ1dGVzKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMWFjZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXMubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRGZWF0dXJlUGFyc2VyX0lkT3JWZXJzaW9uSW52YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9Ob1NpdGVUYWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfV3JvbmdQYXJzaW5nU3RhY2s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93bkVsZW1lbnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93blN0YXJ0U3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfTWlzc2luZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9QYXJzaW5nU3RhY2tCYWNrVG9Jbml0aWFsU3RhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfRWxlbWVudEFscmVhZHlTZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfQ2F0ZWdvcnlBbHJlYWR5U2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25FbmRTdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9FcnJvclBhcnNpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRGVmYXVsdFNpdGVQYXJzZXJfRXJyb3JsaW5lQ29sdW1uTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9FcnJvclBhcnNpbmdTaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX1Vua25vd25TdGF0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWZhdWx0U2l0ZVBhcnNlcl9JbnZhbGlkWE1MU3RyZWFtOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERlZmF1bHRTaXRlUGFyc2VyX21pcnJvcnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvclJlYWRpbmdEaWdlc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JSZWFkaW5nRmVhdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvclJlYWRpbmdTaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRSZXBvc2l0b3J5TG9jYXRpb247Ci0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vIERvIG5vdCBpbnN0YW50aWF0ZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL1Byb2R1Y3RGaWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9Qcm9kdWN0RmlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTRmMGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL1Byb2R1Y3RGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBDb2RlIDkgLSBBZGRpdGlvbmFsIGZ1bmN0aW9uIGFuZCBmaXhlcwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuSVByb2R1Y3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiAKLSAqIEBzaW5jZSAzLjEKLSAqLwotcHVibGljIGNsYXNzIFByb2R1Y3RGaWxlIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBJUHJvZHVjdERlc2NyaXB0b3IgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9HUkFNX0FSR1MgPSAicHJvZ3JhbUFyZ3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0dSQU1fQVJHU19MSU5VWCA9ICJwcm9ncmFtQXJnc0xpbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPR1JBTV9BUkdTX01BQyA9ICJwcm9ncmFtQXJnc01hYyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPR1JBTV9BUkdTX1NPTEFSSVMgPSAicHJvZ3JhbUFyZ3NTb2wiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0dSQU1fQVJHU19XSU4gPSAicHJvZ3JhbUFyZ3NXaW4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZNX0FSR1MgPSAidm1BcmdzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWTV9BUkdTX0xJTlVYID0gInZtQXJnc0xpbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk1fQVJHU19NQUMgPSAidm1BcmdzTWFjIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWTV9BUkdTX1NPTEFSSVMgPSAidm1BcmdzU29sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWTV9BUkdTX1dJTiA9ICJ2bUFyZ3NXaW4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU09MQVJJU19MQVJHRSA9ICJzb2xhcmlzTGFyZ2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPTEFSSVNfTUVESVVNID0gInNvbGFyaXNNZWRpdW0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNPTEFSSVNfU01BTEwgPSAic29sYXJpc1NtYWxsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTT0xBUklTX1RJTlkgPSAic29sYXJpc1RpbnkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTjMyXzE2X0xPVyA9ICJ3aW5TbWFsbExvdyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lOMzJfMTZfSElHSCA9ICJ3aW5TbWFsbEhpZ2giOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTjMyXzI0X0xPVyA9ICJ3aW4yNExvdyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lOMzJfMzJfTE9XID0gIndpbk1lZGl1bUxvdyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0lOMzJfMzJfSElHSCA9ICJ3aW5NZWRpdW1IaWdoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBXSU4zMl80OF9MT1cgPSAid2luTGFyZ2VMb3ciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdJTjMyXzQ4X0hJR0ggPSAid2luTGFyZ2VIaWdoIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX1dJTjMyID0gIndpbjMyIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX0xJTlVYID0gImxpbnV4IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9TX1NPTEFSSVMgPSAic29sYXJpcyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPU19NQUNPU1ggPSAibWFjb3N4IjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPRFVDVCA9ICJwcm9kdWN0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfSU5JID0gImNvbmZpZ0luaSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFVTkNIRVIgPSAibGF1bmNoZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBVU5DSEVSX0FSR1MgPSAibGF1bmNoZXJBcmdzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5TID0gInBsdWdpbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVTID0gImZlYXR1cmVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTUExBU0ggPSAic3BsYXNoIjsgLy8kTk9OLU5MUy0xJAotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQX1VTRV9JQ08gPSAidXNlSWNvIjsgLy8kTk9OLU5MUy0xJAotCi0JLy9UaGVzZSBjb25zdGFudHMgZm9ybSBhIHNtYWxsIHN0YXRlIG1hY2hpbmUgdG8gcGFyc2UgdGhlIC5wcm9kdWN0IGZpbGUKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfU1RBUlQgPSAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUk9EVUNUID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfTEFVTkNIRVIgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9MQVVOQ0hFUl9BUkdTID0gMzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExVR0lOUyA9IDQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0ZFQVRVUkVTID0gNTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJPR1JBTV9BUkdTID0gNjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJPR1JBTV9BUkdTX0xJTlVYID0gNzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJPR1JBTV9BUkdTX01BQyA9IDg7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BST0dSQU1fQVJHU19TT0xBUklTID0gOTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJPR1JBTV9BUkdTX1dJTiA9IDEwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9WTV9BUkdTID0gMTE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1ZNX0FSR1NfTElOVVggPSAxMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVk1fQVJHU19NQUMgPSAxMzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfVk1fQVJHU19TT0xBUklTID0gMTQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1ZNX0FSR1NfV0lOID0gMTU7Ci0KLQlwcml2YXRlIGludCBzdGF0ZSA9IFNUQVRFX1NUQVJUOwotCi0JcHJpdmF0ZSBTQVhQYXJzZXIgcGFyc2VyOwotCXByaXZhdGUgU3RyaW5nIGxhdW5jaGVyTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgaWNvbnMgPSBuZXcgSGFzaE1hcCg2KTsKLQlwcml2YXRlIFN0cmluZyBjb25maWdQYXRoID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBpZCA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIHVzZUZlYXR1cmVzID0gZmFsc2U7Ci0JcHJpdmF0ZSBMaXN0IHBsdWdpbnMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmcmFnbWVudHMgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmZWF0dXJlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc3BsYXNoTG9jYXRpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHByb2R1Y3ROYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBhcHBsaWNhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBQcm9wZXJ0aWVzIGxhdW5jaGVyQXJncyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JcHJpdmF0ZSBmaW5hbCBNYXAgcGxhdGZvcm1TcGVjaWZpY0NvbmZpZ1BhdGhzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgRmlsZSBsb2NhdGlvbjsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBub3JtYWxpemUoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0KLQkJdGV4dCA9IHRleHQucmVwbGFjZUFsbCgiXFxyfFxcbnxcXGZ8XFx0IiwgIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiB0ZXh0LnJlcGxhY2VBbGwoIlxccysiLCAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RzIGEgZmVhdHVyZSBwYXJzZXIuCi0JICovCi0JcHVibGljIFByb2R1Y3RGaWxlKFN0cmluZyBsb2NhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubG9jYXRpb24gPSBuZXcgRmlsZShsb2NhdGlvbik7Ci0JCS8vCQl0cnkgewotCQlwYXJzZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQlwYXJzZXIgPSBwYXJzZXJGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0obG9jYXRpb24pKTsKLQkJcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbiksIHRoaXMpOwotCQlwYXJzZXIgPSBudWxsOwotCQkvLwkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCS8vCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQSV9QREVCVUlMRCwgRVhDRVBUSU9OX1BST0RVQ1RfRk9STUFULCBOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fcHJvZHVjdFBhcnNlLCBsb2NhdGlvbiksIGUpKTsKLQkJLy8JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCS8vCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQSV9QREVCVUlMRCwgRVhDRVBUSU9OX1BST0RVQ1RfRk9STUFULCBOTFMuYmluZChNZXNzYWdlcy5leGNlcHRpb25fcHJvZHVjdFBhcnNlLCBsb2NhdGlvbiksIGUpKTsKLQkJLy8JCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCS8vCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQSV9QREVCVUlMRCwgRVhDRVBUSU9OX1BST0RVQ1RfRklMRSwgTkxTLmJpbmQoTWVzc2FnZXMuZXhjZXB0aW9uX21pc3NpbmdFbGVtZW50LCBsb2NhdGlvbiksIG51bGwpKTsKLQkJLy8JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJLy8JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFBJX1BERUJVSUxELCBFWENFUFRJT05fUFJPRFVDVF9GT1JNQVQsIE5MUy5iaW5kKE1lc3NhZ2VzLmV4Y2VwdGlvbl9wcm9kdWN0UGFyc2UsIGxvY2F0aW9uKSwgZSkpOwotCQkvLwkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGF1bmNoZXJOYW1lKCkgewotCQlyZXR1cm4gbGF1bmNoZXJOYW1lOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QnVuZGxlcyhib29sZWFuIGluY2x1ZGVGcmFnbWVudHMpIHsKLQkJTGlzdCBwID0gcGx1Z2lucyAhPSBudWxsID8gcGx1Z2lucyA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWlmICghaW5jbHVkZUZyYWdtZW50cykKLQkJCXJldHVybiBwOwotCi0JCUxpc3QgZiA9IGZyYWdtZW50cyAhPSBudWxsID8gZnJhZ21lbnRzIDogQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJaW50IHNpemUgPSBwLnNpemUoKSArIGYuc2l6ZSgpOwotCQlpZiAoc2l6ZSA9PSAwKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0KLQkJTGlzdCBib3RoID0gbmV3IEFycmF5TGlzdChzaXplKTsKLQkJYm90aC5hZGRBbGwocCk7Ci0JCWJvdGguYWRkQWxsKGYpOwotCQlyZXR1cm4gYm90aDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGcmFnbWVudHMoKSB7Ci0JCWlmIChmcmFnbWVudHMgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlyZXR1cm4gZnJhZ21lbnRzOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEZlYXR1cmVzKCkgewotCQlpZiAoZmVhdHVyZXMgPT0gbnVsbCkKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQlyZXR1cm4gZmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNQbHVnaW4oU3RyaW5nIHBsdWdpbikgewotCQlyZXR1cm4gKHBsdWdpbnMgIT0gbnVsbCAmJiBwbHVnaW5zLmNvbnRhaW5zKHBsdWdpbikpIHx8IChmcmFnbWVudHMgIT0gbnVsbCAmJiBmcmFnbWVudHMuY29udGFpbnMocGx1Z2luKSk7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBzcGVjaWZpZWQgdXJsIGFuZCBjb25zdHJ1Y3RzIGEgZmVhdHVyZQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRJY29ucyhTdHJpbmcgb3MpIHsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSAoQ29sbGVjdGlvbikgaWNvbnMuZ2V0KG9zKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCXJldHVybiAoU3RyaW5nW10pIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnSW5pUGF0aChTdHJpbmcgb3MpIHsKLQkJU3RyaW5nIHNwZWNpZmljID0gKFN0cmluZykgcGxhdGZvcm1TcGVjaWZpY0NvbmZpZ1BhdGhzLmdldChvcyk7Ci0JCXJldHVybiBzcGVjaWZpYyA9PSBudWxsID8gY29uZmlnUGF0aCA6IHNwZWNpZmljOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29uZmlnSW5pUGF0aCgpIHsKLQkJcmV0dXJuIGNvbmZpZ1BhdGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BsYXNoTG9jYXRpb24oKSB7Ci0JCXJldHVybiBzcGxhc2hMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb2R1Y3ROYW1lKCkgewotCQlyZXR1cm4gcHJvZHVjdE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHVzZUZlYXR1cmVzKCkgewotCQlyZXR1cm4gdXNlRmVhdHVyZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gKHZlcnNpb24gPT0gbnVsbCkgPyAiMC4wLjAiIDogdmVyc2lvbjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Vk1Bcmd1bWVudHMoU3RyaW5nIG9zKSB7Ci0JCVN0cmluZyBrZXkgPSBudWxsOwotCQlpZiAob3MuZXF1YWxzKE9TX1dJTjMyKSkgewotCQkJa2V5ID0gVk1fQVJHU19XSU47Ci0JCX0gZWxzZSBpZiAob3MuZXF1YWxzKE9TX0xJTlVYKSkgewotCQkJa2V5ID0gVk1fQVJHU19MSU5VWDsKLQkJfSBlbHNlIGlmIChvcy5lcXVhbHMoT1NfTUFDT1NYKSkgewotCQkJa2V5ID0gVk1fQVJHU19NQUM7Ci0JCX0gZWxzZSBpZiAob3MuZXF1YWxzKE9TX1NPTEFSSVMpKSB7Ci0JCQlrZXkgPSBWTV9BUkdTX1NPTEFSSVM7Ci0JCX0KLQotCQlTdHJpbmcgcHJlZml4ID0gbGF1bmNoZXJBcmdzLmdldFByb3BlcnR5KFZNX0FSR1MpOwotCQlTdHJpbmcgcGxhdGZvcm0gPSBudWxsLCBhcmdzID0gbnVsbDsKLQkJaWYgKGtleSAhPSBudWxsKQotCQkJcGxhdGZvcm0gPSBsYXVuY2hlckFyZ3MuZ2V0UHJvcGVydHkoa2V5KTsKLQkJaWYgKHByZWZpeCAhPSBudWxsKQotCQkJYXJncyA9IHBsYXRmb3JtICE9IG51bGwgPyBwcmVmaXggKyAiICIgKyBwbGF0Zm9ybSA6IHByZWZpeDsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlhcmdzID0gcGxhdGZvcm0gIT0gbnVsbCA/IHBsYXRmb3JtIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIG5vcm1hbGl6ZShhcmdzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb2dyYW1Bcmd1bWVudHMoU3RyaW5nIG9zKSB7Ci0JCVN0cmluZyBrZXkgPSBudWxsOwotCQlpZiAob3MuZXF1YWxzKE9TX1dJTjMyKSkgewotCQkJa2V5ID0gUFJPR1JBTV9BUkdTX1dJTjsKLQkJfSBlbHNlIGlmIChvcy5lcXVhbHMoT1NfTElOVVgpKSB7Ci0JCQlrZXkgPSBQUk9HUkFNX0FSR1NfTElOVVg7Ci0JCX0gZWxzZSBpZiAob3MuZXF1YWxzKE9TX01BQ09TWCkpIHsKLQkJCWtleSA9IFBST0dSQU1fQVJHU19NQUM7Ci0JCX0gZWxzZSBpZiAob3MuZXF1YWxzKE9TX1NPTEFSSVMpKSB7Ci0JCQlrZXkgPSBQUk9HUkFNX0FSR1NfU09MQVJJUzsKLQkJfQotCi0JCVN0cmluZyBwcmVmaXggPSBsYXVuY2hlckFyZ3MuZ2V0UHJvcGVydHkoUFJPR1JBTV9BUkdTKTsKLQkJU3RyaW5nIHBsYXRmb3JtID0gbnVsbCwgYXJncyA9IG51bGw7Ci0JCWlmIChrZXkgIT0gbnVsbCkKLQkJCXBsYXRmb3JtID0gbGF1bmNoZXJBcmdzLmdldFByb3BlcnR5KGtleSk7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCkKLQkJCWFyZ3MgPSBwbGF0Zm9ybSAhPSBudWxsID8gcHJlZml4ICsgIiAiICsgcGxhdGZvcm0gOiBwcmVmaXg7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJYXJncyA9IHBsYXRmb3JtICE9IG51bGwgPyBwbGF0Zm9ybSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBub3JtYWxpemUoYXJncyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCXN3aXRjaCAoc3RhdGUpIHsKLQkJCWNhc2UgU1RBVEVfU1RBUlQgOgotCQkJCWlmIChQUk9EVUNULmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXByb2Nlc3NQcm9kdWN0KGF0dHJpYnV0ZXMpOwotCQkJCQlzdGF0ZSA9IFNUQVRFX1BST0RVQ1Q7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX1BST0RVQ1QgOgotCQkJCWlmIChDT05GSUdfSU5JLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXByb2Nlc3NDb25maWdJbmkoYXR0cmlidXRlcyk7Ci0JCQkJfSBlbHNlIGlmIChMQVVOQ0hFUi5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlwcm9jZXNzTGF1bmNoZXIoYXR0cmlidXRlcyk7Ci0JCQkJCXN0YXRlID0gU1RBVEVfTEFVTkNIRVI7Ci0JCQkJfSBlbHNlIGlmIChQTFVHSU5TLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXN0YXRlID0gU1RBVEVfUExVR0lOUzsKLQkJCQl9IGVsc2UgaWYgKEZFQVRVUkVTLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXN0YXRlID0gU1RBVEVfRkVBVFVSRVM7Ci0JCQkJfSBlbHNlIGlmIChMQVVOQ0hFUl9BUkdTLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXN0YXRlID0gU1RBVEVfTEFVTkNIRVJfQVJHUzsKLQkJCQl9IGVsc2UgaWYgKFNQTEFTSC5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzcGxhc2hMb2NhdGlvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImxvY2F0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfTEFVTkNIRVIgOgotCQkJCWlmIChPU19TT0xBUklTLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXByb2Nlc3NTb2xhcmlzKGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSBpZiAoIndpbiIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9jZXNzV2luKGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSBpZiAoT1NfTElOVVguZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJcHJvY2Vzc0xpbnV4KGF0dHJpYnV0ZXMpOwotCQkJCX0gZWxzZSBpZiAoT1NfTUFDT1NYLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXByb2Nlc3NNYWMoYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJCWlmICgiaWNvIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXByb2Nlc3NJY28oYXR0cmlidXRlcyk7Ci0JCQkJfSBlbHNlIGlmICgiYm1wIi5lcXVhbHMobG9jYWxOYW1lKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXByb2Nlc3NCbXAoYXR0cmlidXRlcyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX0xBVU5DSEVSX0FSR1MgOgotCQkJCWlmIChQUk9HUkFNX0FSR1MuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3RhdGUgPSBTVEFURV9QUk9HUkFNX0FSR1M7Ci0JCQkJfSBlbHNlIGlmIChQUk9HUkFNX0FSR1NfTElOVVguZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3RhdGUgPSBTVEFURV9QUk9HUkFNX0FSR1NfTElOVVg7Ci0JCQkJfSBlbHNlIGlmIChQUk9HUkFNX0FSR1NfTUFDLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXN0YXRlID0gU1RBVEVfUFJPR1JBTV9BUkdTX01BQzsKLQkJCQl9IGVsc2UgaWYgKFBST0dSQU1fQVJHU19TT0xBUklTLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXN0YXRlID0gU1RBVEVfUFJPR1JBTV9BUkdTX1NPTEFSSVM7Ci0JCQkJfSBlbHNlIGlmIChQUk9HUkFNX0FSR1NfV0lOLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXN0YXRlID0gU1RBVEVfUFJPR1JBTV9BUkdTX1dJTjsKLQkJCQl9IGVsc2UgaWYgKFZNX0FSR1MuZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3RhdGUgPSBTVEFURV9WTV9BUkdTOwotCQkJCX0gZWxzZSBpZiAoVk1fQVJHU19MSU5VWC5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzdGF0ZSA9IFNUQVRFX1ZNX0FSR1NfTElOVVg7Ci0JCQkJfSBlbHNlIGlmIChWTV9BUkdTX01BQy5lcXVhbHMobG9jYWxOYW1lKSkgewotCQkJCQlzdGF0ZSA9IFNUQVRFX1ZNX0FSR1NfTUFDOwotCQkJCX0gZWxzZSBpZiAoVk1fQVJHU19TT0xBUklTLmVxdWFscyhsb2NhbE5hbWUpKSB7Ci0JCQkJCXN0YXRlID0gU1RBVEVfVk1fQVJHU19TT0xBUklTOwotCQkJCX0gZWxzZSBpZiAoVk1fQVJHU19XSU4uZXF1YWxzKGxvY2FsTmFtZSkpIHsKLQkJCQkJc3RhdGUgPSBTVEFURV9WTV9BUkdTX1dJTjsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfUExVR0lOUyA6Ci0JCQkJaWYgKCJwbHVnaW4iLmVxdWFscyhsb2NhbE5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvY2Vzc1BsdWdpbihhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0KLQkJCWNhc2UgU1RBVEVfRkVBVFVSRVMgOgotCQkJCWlmICgiZmVhdHVyZSIuZXF1YWxzKGxvY2FsTmFtZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9jZXNzRmVhdHVyZShhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgewotCQlzd2l0Y2ggKHN0YXRlKSB7Ci0JCQljYXNlIFNUQVRFX1BMVUdJTlMgOgotCQkJCWlmIChQTFVHSU5TLmVxdWFscyhsb2NhbE5hbWUpKQotCQkJCQlzdGF0ZSA9IFNUQVRFX1BST0RVQ1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVRFX0ZFQVRVUkVTIDoKLQkJCQlpZiAoRkVBVFVSRVMuZXF1YWxzKGxvY2FsTmFtZSkpCi0JCQkJCXN0YXRlID0gU1RBVEVfUFJPRFVDVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfTEFVTkNIRVJfQVJHUyA6Ci0JCQkJaWYgKExBVU5DSEVSX0FSR1MuZXF1YWxzKGxvY2FsTmFtZSkpCi0JCQkJCXN0YXRlID0gU1RBVEVfUFJPRFVDVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfTEFVTkNIRVIgOgotCQkJCWlmIChMQVVOQ0hFUi5lcXVhbHMobG9jYWxOYW1lKSkKLQkJCQkJc3RhdGUgPSBTVEFURV9QUk9EVUNUOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIFNUQVRFX1BST0dSQU1fQVJHUyA6Ci0JCQljYXNlIFNUQVRFX1BST0dSQU1fQVJHU19MSU5VWCA6Ci0JCQljYXNlIFNUQVRFX1BST0dSQU1fQVJHU19NQUMgOgotCQkJY2FzZSBTVEFURV9QUk9HUkFNX0FSR1NfU09MQVJJUyA6Ci0JCQljYXNlIFNUQVRFX1BST0dSQU1fQVJHU19XSU4gOgotCQkJY2FzZSBTVEFURV9WTV9BUkdTIDoKLQkJCWNhc2UgU1RBVEVfVk1fQVJHU19MSU5VWCA6Ci0JCQljYXNlIFNUQVRFX1ZNX0FSR1NfTUFDIDoKLQkJCWNhc2UgU1RBVEVfVk1fQVJHU19TT0xBUklTIDoKLQkJCWNhc2UgU1RBVEVfVk1fQVJHU19XSU4gOgotCQkJCXN0YXRlID0gU1RBVEVfTEFVTkNIRVJfQVJHUzsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJc3dpdGNoIChzdGF0ZSkgewotCQkJY2FzZSBTVEFURV9QUk9HUkFNX0FSR1MgOgotCQkJCWFkZExhdW5jaEFyZ3VtZW50VG9NYXAoUFJPR1JBTV9BUkdTLCBTdHJpbmcudmFsdWVPZihjaCwgc3RhcnQsIGxlbmd0aCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9QUk9HUkFNX0FSR1NfTElOVVggOgotCQkJCWFkZExhdW5jaEFyZ3VtZW50VG9NYXAoUFJPR1JBTV9BUkdTX0xJTlVYLCBTdHJpbmcudmFsdWVPZihjaCwgc3RhcnQsIGxlbmd0aCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9QUk9HUkFNX0FSR1NfTUFDIDoKLQkJCQlhZGRMYXVuY2hBcmd1bWVudFRvTWFwKFBST0dSQU1fQVJHU19NQUMsIFN0cmluZy52YWx1ZU9mKGNoLCBzdGFydCwgbGVuZ3RoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVRFX1BST0dSQU1fQVJHU19TT0xBUklTIDoKLQkJCQlhZGRMYXVuY2hBcmd1bWVudFRvTWFwKFBST0dSQU1fQVJHU19TT0xBUklTLCBTdHJpbmcudmFsdWVPZihjaCwgc3RhcnQsIGxlbmd0aCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9QUk9HUkFNX0FSR1NfV0lOIDoKLQkJCQlhZGRMYXVuY2hBcmd1bWVudFRvTWFwKFBST0dSQU1fQVJHU19XSU4sIFN0cmluZy52YWx1ZU9mKGNoLCBzdGFydCwgbGVuZ3RoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVRFX1ZNX0FSR1MgOgotCQkJCWFkZExhdW5jaEFyZ3VtZW50VG9NYXAoVk1fQVJHUywgU3RyaW5nLnZhbHVlT2YoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfVk1fQVJHU19MSU5VWCA6Ci0JCQkJYWRkTGF1bmNoQXJndW1lbnRUb01hcChWTV9BUkdTX0xJTlVYLCBTdHJpbmcudmFsdWVPZihjaCwgc3RhcnQsIGxlbmd0aCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTVEFURV9WTV9BUkdTX01BQyA6Ci0JCQkJYWRkTGF1bmNoQXJndW1lbnRUb01hcChWTV9BUkdTX01BQywgU3RyaW5nLnZhbHVlT2YoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfVk1fQVJHU19TT0xBUklTIDoKLQkJCQlhZGRMYXVuY2hBcmd1bWVudFRvTWFwKFZNX0FSR1NfU09MQVJJUywgU3RyaW5nLnZhbHVlT2YoY2gsIHN0YXJ0LCBsZW5ndGgpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgU1RBVEVfVk1fQVJHU19XSU4gOgotCQkJCWFkZExhdW5jaEFyZ3VtZW50VG9NYXAoVk1fQVJHU19XSU4sIFN0cmluZy52YWx1ZU9mKGNoLCBzdGFydCwgbGVuZ3RoKSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTGF1bmNoQXJndW1lbnRUb01hcChTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGxhdW5jaGVyQXJncyA9PSBudWxsKQotCQkJbGF1bmNoZXJBcmdzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotCQlTdHJpbmcgb2xkVmFsdWUgPSBsYXVuY2hlckFyZ3MuZ2V0UHJvcGVydHkoa2V5KTsKLQkJaWYgKG9sZFZhbHVlICE9IG51bGwpCi0JCQlsYXVuY2hlckFyZ3Muc2V0UHJvcGVydHkoa2V5LCBvbGRWYWx1ZSArIHZhbHVlKTsKLQkJZWxzZQotCQkJbGF1bmNoZXJBcmdzLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzUGx1Z2luKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlTdHJpbmcgZnJhZ21lbnQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJmcmFnbWVudCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmcmFnbWVudCAhPSBudWxsICYmIG5ldyBCb29sZWFuKGZyYWdtZW50KS5ib29sZWFuVmFsdWUoKSkgewotCQkJaWYgKGZyYWdtZW50cyA9PSBudWxsKQotCQkJCWZyYWdtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZyYWdtZW50cy5hZGQoYXR0cmlidXRlcy5nZXRWYWx1ZSgiaWQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWlmIChwbHVnaW5zID09IG51bGwpCi0JCQkJcGx1Z2lucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXBsdWdpbnMuYWRkKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoImlkIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0ZlYXR1cmUoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWlmIChmZWF0dXJlcyA9PSBudWxsKQotCQkJZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZlYXR1cmVzLmFkZChhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzUHJvZHVjdChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJaWQgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCXByb2R1Y3ROYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCWFwcGxpY2F0aW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiYXBwbGljYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdXNlID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidXNlRmVhdHVyZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodXNlICE9IG51bGwpCi0JCQl1c2VGZWF0dXJlcyA9IEJvb2xlYW4udmFsdWVPZih1c2UpLmJvb2xlYW5WYWx1ZSgpOwotCQl2ZXJzaW9uID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgidmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb25maWdJbmkoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJaWYgKCJjdXN0b20iLmVxdWFscyhhdHRyaWJ1dGVzLmdldFZhbHVlKCJ1c2UiKSkpIHsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCXBhdGggPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJwYXRoIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmcgb3MgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJvcyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChvcyAhPSBudWxsICYmIG9zLmxlbmd0aCgpID4gMCkgewotCQkJLy8gVE9ETyBzaG91bGQgd2UgYWxsb3cgYSBwbGF0Zm9ybS1zcGVjaWZpYyBkZWZhdWx0IHRvIG92ZXItcmlkZSBhIGN1c3RvbSBnZW5lcmljIHBhdGg/Ci0JCQlpZiAocGF0aCAhPSBudWxsKQotCQkJCXBsYXRmb3JtU3BlY2lmaWNDb25maWdQYXRocy5wdXQob3MsIHBhdGgpOwotCQl9IGVsc2UgewotCQkJY29uZmlnUGF0aCA9IHBhdGg7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0xhdW5jaGVyKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlsYXVuY2hlck5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSWNvbihTdHJpbmcgb3MsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ29sbGVjdGlvbiBsaXN0ID0gKENvbGxlY3Rpb24pIGljb25zLmdldChvcyk7Ci0JCWlmIChsaXN0ID09IG51bGwpIHsKLQkJCWxpc3QgPSBuZXcgQXJyYXlMaXN0KDYpOwotCQkJaWNvbnMucHV0KG9zLCBsaXN0KTsKLQkJfQotCQlpZiAoIW5ldyBGaWxlKHZhbHVlKS5pc0Fic29sdXRlKCkpCi0JCQl2YWx1ZSA9IG5ldyBGaWxlKGxvY2F0aW9uLmdldFBhcmVudEZpbGUoKSwgdmFsdWUpLmdldEFic29sdXRlUGF0aCgpOwotCQlsaXN0LmFkZCh2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NTb2xhcmlzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlhZGRJY29uKE9TX1NPTEFSSVMsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoU09MQVJJU19MQVJHRSkpOwotCQlhZGRJY29uKE9TX1NPTEFSSVMsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoU09MQVJJU19NRURJVU0pKTsKLQkJYWRkSWNvbihPU19TT0xBUklTLCBhdHRyaWJ1dGVzLmdldFZhbHVlKFNPTEFSSVNfU01BTEwpKTsKLQkJYWRkSWNvbihPU19TT0xBUklTLCBhdHRyaWJ1dGVzLmdldFZhbHVlKFNPTEFSSVNfVElOWSkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzV2luKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkvLwkJdXNlSWNvID0gQm9vbGVhbi52YWx1ZU9mKGF0dHJpYnV0ZXMuZ2V0VmFsdWUoUF9VU0VfSUNPKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NJY28oQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWFkZEljb24oT1NfV0lOMzIsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInBhdGgiKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0JtcChBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJYWRkSWNvbihPU19XSU4zMiwgYXR0cmlidXRlcy5nZXRWYWx1ZShXSU4zMl8xNl9ISUdIKSk7Ci0JCWFkZEljb24oT1NfV0lOMzIsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV0lOMzJfMTZfTE9XKSk7Ci0JCWFkZEljb24oT1NfV0lOMzIsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV0lOMzJfMjRfTE9XKSk7Ci0JCWFkZEljb24oT1NfV0lOMzIsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoV0lOMzJfMzJfSElHSCkpOwotCQlhZGRJY29uKE9TX1dJTjMyLCBhdHRyaWJ1dGVzLmdldFZhbHVlKFdJTjMyXzMyX0xPVykpOwotCQlhZGRJY29uKE9TX1dJTjMyLCBhdHRyaWJ1dGVzLmdldFZhbHVlKFdJTjMyXzQ4X0hJR0gpKTsKLQkJYWRkSWNvbihPU19XSU4zMiwgYXR0cmlidXRlcy5nZXRWYWx1ZShXSU4zMl80OF9MT1cpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0xpbnV4KEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQlhZGRJY29uKE9TX0xJTlVYLCBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpY29uIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NNYWMoQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCWFkZEljb24oT1NfTUFDT1NYLCBhdHRyaWJ1dGVzLmdldFZhbHVlKCJpY29uIikpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvU2l0ZUNhdGVnb3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9TaXRlQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlNzVmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9TaXRlQ2F0ZWdvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuZmVhdHVyZXM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi0vKioKLSAqIEEgY2F0ZWdvcnkgaW4gYW4gdXBkYXRlIHNpdGUuCi0gKiAKLSAqIEJhc2VkIG9uIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLm1vZGVsLkNhdGVnb3J5TW9kZWwuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlQ2F0ZWdvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29tcGFyYXRvciBjb21wOwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCXByaXZhdGUgU3RyaW5nIGxhYmVsOwotCXByaXZhdGUgU3RyaW5nIG5hbWU7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY29tcGFyYXRvciBmb3IgY2F0ZWdvcnkgbW9kZWxzLgotCSAqIAotCSAqIEByZXR1cm4gY29tcGFyYXRvcgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENvbXBhcmF0b3IgZ2V0Q29tcGFyYXRvcigpIHsKLQkJaWYgKGNvbXAgPT0gbnVsbCkgewotCQkJY29tcCA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkJCS8qCi0JCQkJICogQHNlZSBDb21wYXJhdG9yI2NvbXBhcmUoT2JqZWN0LE9iamVjdCkKLQkJCQkgKiBSZXR1cm5zIDAgaWYgdmVyc2lvbnMgYXJlIGVxdWFsLgotCQkJCSAqIFJldHVybnMgLTEgaWYgb2JqZWN0MSBpcyBhZnRlciB0aGFuIG9iamVjdDIuCi0JCQkJICogUmV0dXJucyArMSBpZiBvYmplY3QxIGlzIGJlZm9yZSB0aGFuIG9iamVjdDIuCi0JCQkJICovCi0JCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0KLQkJCQkJU2l0ZUNhdGVnb3J5IGNhdDEgPSAoU2l0ZUNhdGVnb3J5KSBvMTsKLQkJCQkJU2l0ZUNhdGVnb3J5IGNhdDIgPSAoU2l0ZUNhdGVnb3J5KSBvMjsKLQotCQkJCQlpZiAoY2F0MS5lcXVhbHMoY2F0MikpCi0JCQkJCQlyZXR1cm4gMDsKLQkJCQkJcmV0dXJuIGNhdDEuZ2V0TmFtZSgpLmNvbXBhcmVUbyhjYXQyLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gY29tcDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgbW9kZWwgb2JqZWN0LgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU2l0ZUNhdGVnb3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbXBhcmUgdHdvIGNhdGVnb3J5IG1vZGVscyBmb3IgZXF1YWxpdHkuCi0JICogCi0JICogQHNlZSBPYmplY3QjZXF1YWxzKE9iamVjdCkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIFNpdGVDYXRlZ29yeSkgewotCQkJU2l0ZUNhdGVnb3J5IG90aGVyQ2F0ZWdvcnkgPSAoU2l0ZUNhdGVnb3J5KSBvYmo7Ci0JCQlyZXN1bHQgPSBnZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShvdGhlckNhdGVnb3J5LmdldE5hbWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgZGV0YWlsZWQgY2F0ZWdvcnkgZGVzY3JpcHRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIGNhdGVnb3J5IGRlc2NyaXB0aW9uLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIHRoZSBub24tbG9jYWxpemVkIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGUgY2F0ZWdvcnkuCi0JICogCi0JICogQHJldHVybiBub24tbG9jYWxpemVkIGRpc3BsYXlhYmxlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlIHRoZSBuYW1lIG9mIHRoZSBjYXRlZ29yeS4KLQkgKiAKLQkgKiBAcmV0dXJuIGNhdGVnb3J5IG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGUgaGFzaCBjb2RlIGZvciBjYXRlZ29yeSBtb2RlbC4KLQkgKiAKLQkgKiBAc2VlIE9iamVjdCNoYXNoQ29kZSgpCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCkuaGFzaENvZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBtb2RlbCBvYmplY3QuCi0JICogQW55IFVSTCBzdHJpbmdzIGluIHRoZSBtb2RlbCBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIAotCSAqIGJhc2UgVVJMIGFyZ3VtZW50LiBBbnkgdHJhbnNsYXRhYmxlIHN0cmluZ3MgaW4gdGhlIG1vZGVsIHRoYXQgYXJlCi0JICogc3BlY2lmaWVkIGFzIHRyYW5zbGF0aW9uIGtleXMgYXJlIGxvY2FsaXplZCB1c2luZyB0aGUgc3VwcGxpZWQgCi0JICogcmVzb3VyY2UgYnVuZGxlLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlIFVSTAotCSAqIEBwYXJhbSBidW5kbGVVUkwgcmVzb3VyY2UgYnVuZGxlIFVSTAotCSAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmUoVVJMIGJhc2UsIFVSTCBidW5kbGVVUkwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQkvLyByZXNvbHZlIGxvY2FsIGVsZW1lbnRzCi0JCS8vCQlsb2NhbGl6ZWRMYWJlbCA9IHJlc29sdmVOTFN0cmluZyhidW5kbGVVUkwsIGxhYmVsKTsKLQotCQkvLyBkZWxlZ2F0ZSB0byByZWZlcmVuY2VzCi0JCS8vCQlyZXNvbHZlUmVmZXJlbmNlKGdldERlc2NyaXB0aW9uTW9kZWwoKSwgYmFzZSwgYnVuZGxlVVJMKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjYXRlZ29yeSBkZXNjcmlwdGlvbi4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBjYXRlZ29yeSBkZXNjcmlwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGNhdGVnb3J5IGRpc3BsYXlhYmxlIGxhYmVsLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGxhYmVsIGRpc3BsYXlhYmxlIGxhYmVsLCBvciByZXNvdXJjZSBrZXkKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGFiZWwoU3RyaW5nIGxhYmVsKSB7Ci0JCXRoaXMubGFiZWwgPSBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjYXRlZ29yeSBuYW1lLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIG5hbWUgY2F0ZWdvcnkgbmFtZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9TaXRlRmVhdHVyZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvU2l0ZUZlYXR1cmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlmNDNhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9TaXRlRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKYW1lcyBEIE1pbGVzIChJQk0gQ29ycC4pIC0gYnVnIDE5MTc4MywgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gRmVhdHVyZURvd25sb2FkZXIKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi0vKioKLSAqIEEgcmVmZXJlbmNlIHRvIGEgZmVhdHVyZSBpbiBhbiB1cGRhdGUgc2l0ZS54bWwgZmlsZS4KLSAqIAotICogQmFzZWQgb24gb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuRmVhdHVyZVJlZmVyZW5jZU1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZUZlYXR1cmUgewotCi0JcHJpdmF0ZSBTdHJpbmcgYXJjaDsKLQkvLyBwZXJmb3JtYW5jZQotCXByaXZhdGUgVVJMIGJhc2U7Ci0JcHJpdmF0ZSBMaXN0IC8qIG9mIFN0cmluZyovY2F0ZWdvcnlOYW1lczsKLQlwcml2YXRlIFN0cmluZyBmZWF0dXJlSWQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZmVhdHVyZVZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbGFiZWw7Ci0JcHJpdmF0ZSBTdHJpbmcgbmw7Ci0KLQlwcml2YXRlIFN0cmluZyBvczsKLQlwcml2YXRlIFN0cmluZyBwYXRjaDsKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVzb2x2ZWQgPSBmYWxzZTsKLQlwcml2YXRlIFNpdGVNb2RlbCBzaXRlOwotCXByaXZhdGUgU3RyaW5nIHR5cGU7Ci0JcHJpdmF0ZSBVUkwgdXJsOwotCXByaXZhdGUgU3RyaW5nIHVybFN0cmluZzsKLQlwcml2YXRlIFN0cmluZyB3czsKLQotCS8qCi0JICogQ29tcGFyZXMgdHdvIFVSTCBmb3IgZXF1YWxpdHkKLQkgKiBSZXR1cm4gZmFsc2UgaWYgb25lIG9mIHRoZW0gaXMgbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYW1lVVJMKFVSTCB1cmwxLCBVUkwgdXJsMikgewotCi0JCWlmICh1cmwxID09IG51bGwgfHwgdXJsMiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodXJsMSA9PSB1cmwyKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh1cmwxLmVxdWFscyh1cmwyKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGNoZWNrIGlmIFVSTCBhcmUgZmlsZTogVVJMIGFzIHdlIG1heQotCQkvLyBoYXZlIDIgVVJMIHBvaW50aW5nIHRvIHRoZSBzYW1lIGZlYXR1cmVSZWZlcmVuY2UKLQkJLy8gYnV0IHdpdGggZGlmZmVyZW50IHJlcHJlc2VudGF0aW9uCi0JCS8vIChpLmUuIGZpbGU6L0M7LyBhbmQgZmlsZTpDOi8pCi0JCWlmICghImZpbGUiLmVxdWFsc0lnbm9yZUNhc2UodXJsMS5nZXRQcm90b2NvbCgpKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoISJmaWxlIi5lcXVhbHNJZ25vcmVDYXNlKHVybDIuZ2V0UHJvdG9jb2woKSkpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlGaWxlIGZpbGUxID0gbmV3IEZpbGUodXJsMS5nZXRGaWxlKCkpOwotCQlGaWxlIGZpbGUyID0gbmV3IEZpbGUodXJsMi5nZXRGaWxlKCkpOwotCi0JCWlmIChmaWxlMSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAoZmlsZTEuZXF1YWxzKGZpbGUyKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgU2l0ZUZlYXR1cmUoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbmFtZSBvZiBhIGNhdGVnb3J5IHRoaXMgZmVhdHVyZSBiZWxvbmdzIHRvLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5TmFtZSBjYXRlZ29yeSBuYW1lCi0JICovCi0JcHVibGljIHZvaWQgYWRkQ2F0ZWdvcnlOYW1lKFN0cmluZyBjYXRlZ29yeU5hbWUpIHsKLQkJaWYgKHRoaXMuY2F0ZWdvcnlOYW1lcyA9PSBudWxsKQotCQkJdGhpcy5jYXRlZ29yeU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAoIXRoaXMuY2F0ZWdvcnlOYW1lcy5jb250YWlucyhjYXRlZ29yeU5hbWUpKQotCQkJdGhpcy5jYXRlZ29yeU5hbWVzLmFkZChjYXRlZ29yeU5hbWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZWxheWVkUmVzb2x2ZSgpIHsKLQotCQkvLyBQRVJGOiBkZWxheSByZXNvbHV0aW9uCi0JCWlmIChyZXNvbHZlZCkKLQkJCXJldHVybjsKLQotCQkvLyByZXNvbHZlIGxvY2FsIGVsZW1lbnRzCi0JCXRyeSB7Ci0JCQl1cmwgPSBuZXcgVVJMKGJhc2UsIHVybFN0cmluZyk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLwkJCVVwZGF0ZUNvcmUud2FybigiIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbXBhcmVzIDIgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWxzIGZvciBlcXVhbGl0eQotCSAqICAKLQkgKiBAcGFyYW0gb2JqZWN0IGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIHRvIGNvbXBhcmUgd2l0aAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHR3byBtb2RlbHMgYXJlIGVxdWFsLCAKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKLQotCQlpZiAob2JqZWN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChnZXRVUkwoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmICghKG9iamVjdCBpbnN0YW5jZW9mIFNpdGVGZWF0dXJlKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTaXRlRmVhdHVyZSBmID0gKFNpdGVGZWF0dXJlKSBvYmplY3Q7Ci0KLQkJcmV0dXJuIHNhbWVVUkwoZ2V0VVJMKCksIGYuZ2V0VVJMKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWVzIG9mIGNhdGVnb3JpZXMgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZSBiZWxvbmdzIHRvLgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbmFtZXMsIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRDYXRlZ29yeU5hbWVzKCkgewotCQlpZiAoY2F0ZWdvcnlOYW1lcyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0KLQkJcmV0dXJuIChTdHJpbmdbXSkgY2F0ZWdvcnlOYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZlYXR1cmUgaWRlbnRpZmllciBhcyBhIHN0cmluZwotCSAqIAotCSAqIEByZXR1cm4gZmVhdHVyZSBpZGVudGlmaWVyCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGZWF0dXJlSWRlbnRpZmllcigpIHsKLQkJcmV0dXJuIGZlYXR1cmVJZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmZWF0dXJlIHZlcnNpb24gYXMgYSBzdHJpbmcKLQkgKiAKLQkgKiBAcmV0dXJuIGZlYXR1cmUgdmVyc2lvbiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZlYXR1cmVWZXJzaW9uKCkgewotCQlyZXR1cm4gZmVhdHVyZVZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmUgdGhlIGRpc3BsYXlhYmxlIGxhYmVsIGZvciB0aGUgZmVhdHVyZSByZWZlcmVuY2UuIElmIHRoZSBtb2RlbAotCSAqIG9iamVjdCBoYXMgYmVlbiByZXNvbHZlZCwgdGhlIGxhYmVsIGlzIGxvY2FsaXplZC4KLQkgKgotCSAqIEByZXR1cm4gZGlzcGxheWFibGUgbGFiZWwsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZSB0aGUgbm9uLWxvY2FsaXplZCBkaXNwbGF5YWJsZSBsYWJlbCBmb3IgdGhlIGZlYXR1cmUgcmVmZXJlbmNlLgotCSAqCi0JICogQHJldHVybiBub24tbG9jYWxpemVkIGRpc3BsYXlhYmxlIGxhYmVsLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsTm9uTG9jYWxpemVkKCkgewotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbmFsIGxvY2FsZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KLQkgKgotCSAqIEByZXR1cm4gdGhlIGxvY2FsZSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROTCgpIHsKLQkJcmV0dXJuIG5sOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb25hbCBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgotCSAqCi0JICogQHJldHVybiB0aGUgb3BlcmF0aW5nIHN5c3RlbSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPUygpIHsKLQkJcmV0dXJuIG9zOwotCX0KLQotCS8qKgotCSAqIEdldCBvcHRpb25hbCBzeXN0ZW0gYXJjaGl0ZWN0dXJlIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgotCSAqCi0JICogQHJldHVybiB0aGUgc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPU0FyY2goKSB7Ci0JCXJldHVybiBhcmNoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhdGNoIG1vZGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRjaCgpIHsKLQkJcmV0dXJuIHBhdGNoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpdGUgbW9kZWwgZm9yIHRoZSByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiBzaXRlIG1vZGVsCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyBTaXRlTW9kZWwgZ2V0U2l0ZU1vZGVsKCkgewotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGZlYXR1cmUgdHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGZlYXR1cmUgdHlwZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gcmVwcmVzZW50aW5nIHRoZSBkZWZhdWx0Ci0JICogZmVhdHVyZSB0eXBlIGZvciB0aGUgc2l0ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgVVJMIGZvciB0aGUgZmVhdHVyZSByZWZlcmVuY2UuCi0JICogCi0JICogQHJldHVybiB1cmwgc3RyaW5nCi0JICovCi0JcHVibGljIFVSTCBnZXRVUkwoKSB7Ci0JCWRlbGF5ZWRSZXNvbHZlKCk7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5yZXNvbHZlZCBVUkwgc3RyaW5nIGZvciB0aGUgcmVmZXJlbmNlLgotCSAqCi0JICogQHJldHVybiB1cmwgc3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkxTdHJpbmcoKSB7Ci0JCXJldHVybiB1cmxTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogR2V0IG9wdGlvbmFsIHdpbmRvd2luZyBzeXN0ZW0gc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gc3RyaW5nLCBvciA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFdTKCkgewotCQlyZXR1cm4gd3M7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgbW9kZWwgb2JqZWN0LgotCSAqIEFueSBVUkwgc3RyaW5ncyBpbiB0aGUgbW9kZWwgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSAKLQkgKiBiYXNlIFVSTCBhcmd1bWVudC4gQW55IHRyYW5zbGF0YWJsZSBzdHJpbmdzIGluIHRoZSBtb2RlbCB0aGF0IGFyZQotCSAqIHNwZWNpZmllZCBhcyB0cmFuc2xhdGlvbiBrZXlzIGFyZSBsb2NhbGl6ZWQgdXNpbmcgdGhlIHN1cHBsaWVkIAotCSAqIHJlc291cmNlIGJ1bmRsZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb2x2ZUJhc2UgVVJMCi0JICogQHBhcmFtIGJ1bmRsZVVSTCByZXNvdXJjZSBidW5kbGUgVVJMCi0JICogQGV4Y2VwdGlvbiBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNvbHZlKFVSTCByZXNvbHZlQmFzZSwgVVJMIGJ1bmRsZVVSTCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCXRoaXMuYmFzZSA9IHJlc29sdmVCYXNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN5c3RlbSBhcmNoaXRlY3R1cmUgc3BlY2lmaWNhdGlvbi4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqCi0JICogQHBhcmFtIGFyY2ggc3lzdGVtIGFyY2hpdGVjdHVyZSBzcGVjaWZpY2F0aW9uIGFzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcmNoKFN0cmluZyBhcmNoKSB7Ci0JCXRoaXMuYXJjaCA9IGFyY2g7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZXMgb2YgY2F0ZWdvcmllcyB0aGlzIGZlYXR1cmUgYmVsb25ncyB0by4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeU5hbWVzIGFuIGFycmF5IG9mIGNhdGVnb3J5IG5hbWVzCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q2F0ZWdvcnlOYW1lcyhTdHJpbmdbXSBjYXRlZ29yeU5hbWVzKSB7Ci0JCWlmIChjYXRlZ29yeU5hbWVzID09IG51bGwpCi0JCQl0aGlzLmNhdGVnb3J5TmFtZXMgPSBudWxsOwotCQllbHNlCi0JCQl0aGlzLmNhdGVnb3J5TmFtZXMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoY2F0ZWdvcnlOYW1lcykpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGZlYXR1cmUgaWRlbnRpZmllci4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlSWQgZmVhdHVyZSBpZGVudGlmaWVyCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZUlkZW50aWZpZXIoU3RyaW5nIGZlYXR1cmVJZCkgewotCQl0aGlzLmZlYXR1cmVJZCA9IGZlYXR1cmVJZDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBmZWF0dXJlIHZlcnNpb24uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKiAKLQkgKiBAcGFyYW0gZmVhdHVyZVZlcnNpb24gZmVhdHVyZSB2ZXJzaW9uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmVhdHVyZVZlcnNpb24oU3RyaW5nIGZlYXR1cmVWZXJzaW9uKSB7Ci0JCXRoaXMuZmVhdHVyZVZlcnNpb24gPSBmZWF0dXJlVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYWJlbC4KLQkgKiBAcGFyYW0gbGFiZWwgVGhlIGxhYmVsIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhYmVsKFN0cmluZyBsYWJlbCkgewotCQl0aGlzLmxhYmVsID0gbGFiZWw7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbG9jYWxlIHNwZWNpZmljYXRpb24uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKgotCSAqIEBwYXJhbSBubCBsb2NhbGUgc3BlY2lmaWNhdGlvbiBhcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TkwoU3RyaW5nIG5sKSB7Ci0JCXRoaXMubmwgPSBubDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKgotCSAqIEBwYXJhbSBvcyBvcGVyYXRpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9TKFN0cmluZyBvcykgewotCQl0aGlzLm9zID0gb3M7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgcGF0Y2ggbW9kZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXRjaChTdHJpbmcgcGF0Y2gpIHsKLQkJdGhpcy5wYXRjaCA9IHBhdGNoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNpdGUgZm9yIHRoZSByZWZlcmVuY2VkLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIHNpdGUgc2l0ZSBmb3IgdGhlIHJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpdGVNb2RlbChTaXRlTW9kZWwgc2l0ZSkgewotCQl0aGlzLnNpdGUgPSBzaXRlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHJlZmVyZW5jZWQgZmVhdHVyZSB0eXBlLgotCSAqIFRocm93cyBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlmIHRoaXMgb2JqZWN0IGlzIG1hcmtlZCByZWFkLW9ubHkuCi0JICogCi0JICogQHBhcmFtIHR5cGUgcmVmZXJlbmNlZCBmZWF0dXJlIHR5cGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdW5yZXNvbHZlZCBVUkwgZm9yIHRoZSBmZWF0dXJlIHJlZmVyZW5jZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSB1cmxTdHJpbmcgdW5yZXNvbHZlZCBVUkwgc3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VVJMU3RyaW5nKFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJdGhpcy51cmxTdHJpbmcgPSB1cmxTdHJpbmc7Ci0JCXRoaXMudXJsID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24uCi0JICogVGhyb3dzIGEgcnVudGltZSBleGNlcHRpb24gaWYgdGhpcyBvYmplY3QgaXMgbWFya2VkIHJlYWQtb25seS4KLQkgKgotCSAqIEBwYXJhbSB3cyB3aW5kb3dpbmcgc3lzdGVtIHNwZWNpZmljYXRpb24gYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdTKFN0cmluZyB3cykgewotCQl0aGlzLndzID0gd3M7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0Q2xhc3MoKS50b1N0cmluZygpICsgIiA6Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiIGF0ICIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQodXJsLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9TaXRlTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL1NpdGVNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDVkYTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL1NpdGVNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5mZWF0dXJlczsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQSBtb2RlbCBvZiBhbiB1cGRhdGUgc2l0ZS4KLSAqIAotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UudXBkYXRlLmNvcmUubW9kZWwuU2l0ZU1vZGVsLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZU1vZGVsIHsKLQotCXByaXZhdGUgTGlzdCAvKm9mIEFyY2hpdmVSZWZlcmVuY2VNb2RlbCovYXJjaGl2ZVJlZmVyZW5jZXM7Ci0JLyoqCi0JICogTWFwIG9mIFN0cmluZyAoY2F0ZWdvcnkgaWQpIC0+IFNpdGVDYXRlZ29yeQotCSAqLwotCXByaXZhdGUgTWFwIGNhdGVnb3JpZXM7Ci0JcHJpdmF0ZSBVUkxFbnRyeSBkZXNjcmlwdGlvbjsKLQkvKioKLQkgKiBNYXAgb2YgU3RyaW5nIChmZWF0dXJlIGlkKSAtPiBTaXRlRmVhdHVyZQotCSAqLwotCXByaXZhdGUgTGlzdCBmZWF0dXJlczsKLQlwcml2YXRlIFVSTCBsb2NhdGlvblVSTDsKLQlwcml2YXRlIFN0cmluZyBsb2NhdGlvblVSTFN0cmluZzsKLQlwcml2YXRlIExpc3QgLyogb2YgVVJMRW50cnkgKi9taXJyb3JzOwotCXByaXZhdGUgU3RyaW5nIG1pcnJvcnNVUkxTdHJpbmc7Ci0JcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRzUGFjazIwMDsKLQlwcml2YXRlIFN0cmluZyB0eXBlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIHNpdGUgbW9kZWwgb2JqZWN0LgotCSAqIAotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU2l0ZU1vZGVsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYW4gYXJjaGl2ZSByZWZlcmVuY2UgbW9kZWwgdG8gc2l0ZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSBhcmNoaXZlUmVmZXJlbmNlIGFyY2hpdmUgcmVmZXJlbmNlIG1vZGVsCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFyY2hpdmUoVVJMRW50cnkgYXJjaGl2ZVJlZmVyZW5jZSkgewotCQlpZiAodGhpcy5hcmNoaXZlUmVmZXJlbmNlcyA9PSBudWxsKQotCQkJdGhpcy5hcmNoaXZlUmVmZXJlbmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKCF0aGlzLmFyY2hpdmVSZWZlcmVuY2VzLmNvbnRhaW5zKGFyY2hpdmVSZWZlcmVuY2UpKQotCQkJdGhpcy5hcmNoaXZlUmVmZXJlbmNlcy5hZGQoYXJjaGl2ZVJlZmVyZW5jZSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGNhdGVnb3J5IHRvIHRoZSBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeSBjYXRlZ29yeSBtb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZENhdGVnb3J5KFNpdGVDYXRlZ29yeSBjYXRlZ29yeSkgewotCQlpZiAoY2F0ZWdvcmllcyA9PSBudWxsKQotCQkJY2F0ZWdvcmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmICghY2F0ZWdvcmllcy5jb250YWluc0tleShjYXRlZ29yeS5nZXROYW1lKCkpKQotCQkJY2F0ZWdvcmllcy5wdXQoY2F0ZWdvcnkuZ2V0TmFtZSgpLCBjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVsIHRvIHNpdGUuCi0JICogCi0JICogQHBhcmFtIGZlYXR1cmVSZWZlcmVuY2UgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRGZWF0dXJlKFNpdGVGZWF0dXJlIGZlYXR1cmVSZWZlcmVuY2UpIHsKLQkJaWYgKHRoaXMuZmVhdHVyZXMgPT0gbnVsbCkKLQkJCXRoaXMuZmVhdHVyZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMuZmVhdHVyZXMuYWRkKGZlYXR1cmVSZWZlcmVuY2UpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSBtaXJyb3Igc2l0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWlycm9yIG1pcnJvciBtb2RlbCAKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIHZvaWQgYWRkTWlycm9yKFVSTEVudHJ5IG1pcnJvcikgewotCQlpZiAodGhpcy5taXJyb3JzID09IG51bGwpCi0JCQl0aGlzLm1pcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghdGhpcy5taXJyb3JzLmNvbnRhaW5zKG1pcnJvcikpCi0JCQl0aGlzLm1pcnJvcnMuYWRkKG1pcnJvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRvU2V0TWlycm9yU2l0ZUVudHJ5TW9kZWxzKFVSTEVudHJ5W10gbmV3TWlycm9ycykgewotCQlpZiAobmV3TWlycm9ycyA9PSBudWxsIHx8IG5ld01pcnJvcnMubGVuZ3RoID09IDApCi0JCQl0aGlzLm1pcnJvcnMgPSBudWxsOwotCQllbHNlCi0JCQl0aGlzLm1pcnJvcnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QobmV3TWlycm9ycykpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgcGx1Zy1pbiBhbmQgbm9uLXBsdWctaW4gYXJjaGl2ZSByZWZlcmVuY2UgbW9kZWxzCi0JICogb24gdGhpcyBzaXRlCi0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBhcmNoaXZlIHJlZmVyZW5jZSBtb2RlbHMsIG9yIGFuIGVtcHR5IGFycmF5IGlmIHRoZXJlIGFyZQotCSAqIG5vIGFyY2hpdmVzIGtub3duIHRvIHRoaXMgc2l0ZS4KLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIFVSTEVudHJ5W10gZ2V0QXJjaGl2ZXMoKSB7Ci0JCWlmIChhcmNoaXZlUmVmZXJlbmNlcyA9PSBudWxsIHx8IGFyY2hpdmVSZWZlcmVuY2VzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBVUkxFbnRyeVswXTsKLQotCQlyZXR1cm4gKFVSTEVudHJ5W10pIGFyY2hpdmVSZWZlcmVuY2VzLnRvQXJyYXkobmV3IFVSTEVudHJ5WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNhdGVnb3J5IG1vZGVscyBmb3IgdGhpcyBzaXRlLgotCSAqIAotCSAqIEByZXR1cm4gYXJyYXkgb2Ygc2l0ZSBjYXRlZ29yeSBtb2RlbHMsIG9yIGFuIGVtcHR5IGFycmF5LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU2l0ZUNhdGVnb3J5W10gZ2V0Q2F0ZWdvcmllcygpIHsKLQkJaWYgKGNhdGVnb3JpZXMgPT0gbnVsbCB8fCBjYXRlZ29yaWVzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBTaXRlQ2F0ZWdvcnlbMF07Ci0JCXJldHVybiAoU2l0ZUNhdGVnb3J5W10pIGNhdGVnb3JpZXMudmFsdWVzKCkudG9BcnJheShuZXcgU2l0ZUNhdGVnb3J5WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjYXRlZ29yeSB3aXRoIHRoZSBnaXZlbiBuYW1lLgotCSAqIEByZXR1cm4gdGhlIGNhdGVnb3J5IHdpdGggdGhlIGdpdmVuIG5hbWUsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIFNpdGVDYXRlZ29yeSBnZXRDYXRlZ29yeShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKFNpdGVDYXRlZ29yeSkgKGNhdGVnb3JpZXMgPT0gbnVsbCA/IG51bGwgOiBjYXRlZ29yaWVzLmdldChuYW1lKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2l0ZSBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHNpdGUgZGVzY3JpcHRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBVUkxFbnRyeSBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2YgZmVhdHVyZSByZWZlcmVuY2UgbW9kZWxzIG9uIHRoaXMgc2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGZlYXR1cmUgcmVmZXJlbmNlIG1vZGVscywgb3IgYW4gZW1wdHkgYXJyYXkuCi0JICovCi0JcHVibGljIFNpdGVGZWF0dXJlW10gZ2V0RmVhdHVyZXMoKSB7Ci0JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBTaXRlRmVhdHVyZVswXTsKLQkJcmV0dXJuIChTaXRlRmVhdHVyZVtdKSBmZWF0dXJlcy50b0FycmF5KG5ldyBTaXRlRmVhdHVyZVswXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgVVJMIGZvciB0aGUgc2l0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHVybCwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldExvY2F0aW9uVVJMKCkgewotCQlyZXR1cm4gbG9jYXRpb25VUkw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5yZXNvbHZlZCBVUkwgc3RyaW5nIGZvciB0aGUgc2l0ZS4KLQkgKgotCSAqIEByZXR1cm4gdXJsIHN0cmluZywgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uVVJMU3RyaW5nKCkgewotCQlyZXR1cm4gbG9jYXRpb25VUkxTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGFycmF5IG9mIHVwZGF0ZSBzaXRlIG1pcnJvcnMKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1pcnJvciBlbnRyaWVzLCBvciBhbiBlbXB0eSBhcnJheS4KLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIFVSTEVudHJ5W10gZ2V0TWlycm9ycygpIHsKLQkJLy9kZWxheWVkUmVzb2x2ZSgpOyBubyBkZWxheTsKLQkJaWYgKG1pcnJvcnMgPT0gbnVsbCB8fCBtaXJyb3JzLnNpemUoKSA9PSAwKQotCQkJLy8gc2VlIGlmIHdlIGNhbiBnZXQgbWlycm9ycyBmcm9tIHRoZSBwcm92aWRlZCB1cmwKLQkJCWlmIChtaXJyb3JzVVJMU3RyaW5nICE9IG51bGwpCi0JCQkJZG9TZXRNaXJyb3JTaXRlRW50cnlNb2RlbHMoRGVmYXVsdFNpdGVQYXJzZXIuZ2V0TWlycm9ycyhtaXJyb3JzVVJMU3RyaW5nKSk7Ci0KLQkJaWYgKG1pcnJvcnMgPT0gbnVsbCB8fCBtaXJyb3JzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBVUkxFbnRyeVswXTsKLQkJcmV0dXJuIChVUkxFbnRyeVtdKSBtaXJyb3JzLnRvQXJyYXkobmV3IFVSTEVudHJ5WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkwgZnJvbSB3aGljaCB0aGUgbGlzdCBvZiBtaXJyb3JzIG9mIHRoaXMgc2l0ZSBjYW4gYmUgcmV0cmlldmVkLgotCSAqIAotCSAqIEBzaW5jZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciAxLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pcnJvcnNVUkwoKSB7Ci0JCXJldHVybiBtaXJyb3JzVVJMU3RyaW5nOwotCX0KLQotCS8qKiAKLQkgKiBSZXR1cm5zIHRoZSBzaXRlIHR5cGUuCi0JICogCi0JICogQHJldHVybiBzaXRlIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUGFjazIwMFN1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHN1cHBvcnRzUGFjazIwMDsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlIHRoZSBtb2RlbCBvYmplY3QuCi0JICogQW55IFVSTCBzdHJpbmdzIGluIHRoZSBtb2RlbCBhcmUgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIAotCSAqIGJhc2UgVVJMIGFyZ3VtZW50LiBBbnkgdHJhbnNsYXRhYmxlIHN0cmluZ3MgaW4gdGhlIG1vZGVsIHRoYXQgYXJlCi0JICogc3BlY2lmaWVkIGFzIHRyYW5zbGF0aW9uIGtleXMgYXJlIGxvY2FsaXplZCB1c2luZyB0aGUgc3VwcGxpZWQgCi0JICogcmVzb3VyY2UgYnVuZGxlLgotCSAqIAotCSAqIEBwYXJhbSBiYXNlIFVSTAotCSAqIEBwYXJhbSBidW5kbGVVUkwgcmVzb3VyY2UgYnVuZGxlIFVSTAotCSAqIEBleGNlcHRpb24gTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0JICogQHNpbmNlIDIuMAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc29sdmUoVVJMIGJhc2UsIFVSTCBidW5kbGVVUkwpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCi0JCS8vIEFyY2hpdmVzIGFuZCBmZWF0dXJlIGFyZSByZWxhdGl2ZSB0byBsb2NhdGlvbiBVUkwKLQkJLy8gaWYgdGhlIFNpdGUgZWxlbWVudCBoYXMgYSBVUkwgdGFnOiBzZWUgc3BlYwkKLQkJLy8JCWxvY2F0aW9uVVJMID0gcmVzb2x2ZVVSTChiYXNlLCBidW5kbGVVUkwsIGdldExvY2F0aW9uVVJMU3RyaW5nKCkpOwotCQkvLwkJaWYgKGxvY2F0aW9uVVJMID09IG51bGwpCi0JCS8vCQkJbG9jYXRpb25VUkwgPSBiYXNlOwotCQkvLwkJcmVzb2x2ZUxpc3RSZWZlcmVuY2UoZ2V0RmVhdHVyZVJlZmVyZW5jZU1vZGVscygpLCBsb2NhdGlvblVSTCwgYnVuZGxlVVJMKTsKLQkJLy8JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldEFyY2hpdmVSZWZlcmVuY2VNb2RlbHMoKSwgbG9jYXRpb25VUkwsIGJ1bmRsZVVSTCk7Ci0JCS8vCi0JCS8vCQlyZXNvbHZlUmVmZXJlbmNlKGdldERlc2NyaXB0aW9uTW9kZWwoKSwgYmFzZSwgYnVuZGxlVVJMKTsKLQkJLy8JCXJlc29sdmVMaXN0UmVmZXJlbmNlKGdldENhdGVnb3J5TW9kZWxzKCksIGJhc2UsIGJ1bmRsZVVSTCk7Ci0JCS8vCi0JCS8vCQlVUkwgdXJsID0gcmVzb2x2ZVVSTChiYXNlLCBidW5kbGVVUkwsIG1pcnJvcnNVUkxTdHJpbmcpOwotCQkvLwkJaWYgKHVybCAhPSBudWxsKQotCQkvLwkJCW1pcnJvcnNVUkxTdHJpbmcgPSB1cmwudG9TdHJpbmcoKTsKLQkJLy8KLQkJLy8JCWlmICgodGhpcyBpbnN0YW5jZW9mIEV4dGVuZGVkU2l0ZSkgJiYgKChFeHRlbmRlZFNpdGUpIHRoaXMpLmlzRGlnZXN0RXhpc3QoKSkgewotCQkvLwkJCUV4dGVuZGVkU2l0ZSBleHRlbmRlZFNpdGUgPSAoRXh0ZW5kZWRTaXRlKSB0aGlzOwotCQkvLwkJCWV4dGVuZGVkU2l0ZS5zZXRMaXRlRmVhdHVyZXMoVXBkYXRlTWFuYWdlclV0aWxzLmdldExpZ2h0RmVhdHVyZXMoZXh0ZW5kZWRTaXRlKSk7Ci0JCS8vCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2l0ZSBkZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gc2l0ZSBkZXNjcmlwdGlvbgotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihVUkxFbnRyeSBkZXNjcmlwdGlvbikgewotCQl0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdW5yZXNvbHZlZCBVUkwgZm9yIHRoZSBzaXRlLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvblVSTFN0cmluZyB1cmwgZm9yIHRoZSBzaXRlIChhcyBhIHN0cmluZykKLQkgKiBAc2luY2UgMi4wCi0JICovCi0JcHVibGljIHZvaWQgc2V0TG9jYXRpb25VUkxTdHJpbmcoU3RyaW5nIGxvY2F0aW9uVVJMU3RyaW5nKSB7Ci0JCXRoaXMubG9jYXRpb25VUkxTdHJpbmcgPSBsb2NhdGlvblVSTFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIGFkZGl0aW9uYWwgbWlycm9yIHNpdGVzCi0JICogCi0JICogQHBhcmFtIG1pcnJvcnMgYWRkaXRpb25hbCB1cGRhdGUgc2l0ZSBtaXJyb3JzCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pcnJvcnMoVVJMRW50cnlbXSBtaXJyb3JzKSB7Ci0JCWRvU2V0TWlycm9yU2l0ZUVudHJ5TW9kZWxzKG1pcnJvcnMpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG1pcnJvcnMgdXJsLiBNaXJyb3Igc2l0ZXMgd2lsbCB0aGVuIGJlIG9idGFpbmVkIGZyb20gdGhpcyBtaXJyb3IgdXJsIGxhdGVyLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNvbXBsZW1lbnRhcnkgdG8gc2V0TWlycm9yc2l0ZUVudHJ5TW9kZWxzKCksIGFuZCBvbmx5IG9uZSBvZiB0aGVzZSAKLQkgKiBtZXRob2RzIHNob3VsZCBiZSBjYWxsZWQuCi0JICogCi0JICogQHBhcmFtIG1pcnJvcnNVUkwgYWRkaXRpb25hbCB1cGRhdGUgc2l0ZSBtaXJyb3JzCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pcnJvcnNVUkxTdHJpbmcoU3RyaW5nIG1pcnJvcnNVUkwpIHsKLQkJdGhpcy5taXJyb3JzVVJMU3RyaW5nID0gbWlycm9yc1VSTDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdXBwb3J0c1BhY2syMDAoYm9vbGVhbiB2YWx1ZSkgewotCQl0aGlzLnN1cHBvcnRzUGFjazIwMCA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNpdGUgdHlwZS4KLQkgKiBUaHJvd3MgYSBydW50aW1lIGV4Y2VwdGlvbiBpZiB0aGlzIG9iamVjdCBpcyBtYXJrZWQgcmVhZC1vbmx5LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlIHNpdGUgdHlwZQotCSAqIEBzaW5jZSAyLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvVVJMRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL1VSTEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MzIyMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvVVJMRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzOwotCi1wdWJsaWMgY2xhc3MgVVJMRW50cnkgewotCXByaXZhdGUgU3RyaW5nIGFubm90YXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgdXJsOwotCi0JcHVibGljIFVSTEVudHJ5KCkgewotCX0KLQotCXB1YmxpYyBVUkxFbnRyeShTdHJpbmcgdXJsLCBTdHJpbmcgYW5ub3RhdGlvbikgewotCQl0aGlzLnVybCA9IHVybDsKLQkJdGhpcy5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9uKFN0cmluZyBhbm5vdGF0aW9uKSB7Ci0JCXRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uKCkgewotCQlyZXR1cm4gYW5ub3RhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVUkwoU3RyaW5nIHVybCkgewotCQl0aGlzLnVybCA9IHVybDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVSTCgpIHsKLQkJcmV0dXJuIHVybDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9VcGRhdGVTaXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9mZWF0dXJlcy9VcGRhdGVTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MmFhMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvVXBkYXRlU2l0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLmZlYXR1cmVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVTaXRlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OX1NFUEFSQVRPUiA9ICJfIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVJfRVhURU5TSU9OID0gIi5qYXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfRElSID0gImZlYXR1cmVzLyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0RJUiA9ICJwbHVnaW5zLyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9URU1QX0ZJTEUgPSAiZmVhdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lURV9GSUxFID0gInNpdGUueG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESVJfU0VQQVJBVE9SID0gIi8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgY2hlY2tzdW07Ci0JcHJpdmF0ZSBVUkwgbG9jYXRpb247Ci0JcHJpdmF0ZSBTaXRlTW9kZWwgc2l0ZTsKLQotCS8qCi0JICogU29tZSB2YXJpYWJsZXMgZm9yIGNhY2hpbmcuCi0JICovCi0JLy8gbWFwIG9mIFN0cmluZyAoVVJMLnRvRXh0ZXJuYWxGb3JtKCkpIHRvIFVwZGF0ZVNpdGUKLQlwcml2YXRlIHN0YXRpYyBNYXAgc2l0ZUNhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQkvLyBtYXAgb2YgU3RyaW5nIChmZWF0dXJlSURfZmVhdHVyZVZlcnNpb24pIHRvIEZlYXR1cmUKLQlwcml2YXRlIE1hcCBmZWF0dXJlQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoKLQkgKiBSZXR1cm4gYSBuZXcgVVJMIGZvciB0aGUgZ2l2ZW4gZmlsZSB3aGljaCBpcyBiYXNlZCBmcm9tIHRoZSBzcGVjaWZpZWQgcm9vdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRGaWxlVVJMKFVSTCByb290LCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlpZiAocm9vdC5nZXRQYXRoKCkuZW5kc1dpdGgoZmlsZU5hbWUpKQotCQkJcmV0dXJuIHJvb3Q7Ci0JCWlmIChyb290LmdldFBhdGgoKS5lbmRzV2l0aChTSVRFX0ZJTEUpKQotCQkJcmV0dXJuIG5ldyBVUkwocm9vdCwgZmlsZU5hbWUpOwotCQlpZiAocm9vdC5nZXRQYXRoKCkuZW5kc1dpdGgoRElSX1NFUEFSQVRPUikpCi0JCQlyZXR1cm4gbmV3IFVSTChyb290LnRvRXh0ZXJuYWxGb3JtKCkgKyBmaWxlTmFtZSk7Ci0JCXJldHVybiBuZXcgVVJMKHJvb3QudG9FeHRlcm5hbEZvcm0oKSArIERJUl9TRVBBUkFUT1IgKyBmaWxlTmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBPcGVuIGFuZCByZXR1cm4gdGhlIGlucHV0IHN0cmVhbSBmb3IgdGhlIGdpdmVuIFVSTC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRTaXRlSW5wdXRTdHJlYW0oVVJMIHVybCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0U2l0ZVVSTCh1cmwpLm9wZW5TdHJlYW0oKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5JbnZhbGlkUmVwb3NpdG9yeUxvY2F0aW9uLCB1cmwpOwotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfSU5WQUxJRF9MT0NBVElPTiwgbXNnLCBlKSk7Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkvL3NlZSBidWcgMjIxNjAwIC0gVVJMLm9wZW5TdHJlYW0gY2FuIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLkludmFsaWRSZXBvc2l0b3J5TG9jYXRpb24sIHVybCk7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9JTlZBTElEX0xPQ0FUSU9OLCBtc2csIGUpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLkVycm9yUmVhZGluZ1NpdGUsIHVybCk7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQsIG1zZywgZSkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gYSBVUkwgYmFzZWQgb24gdGhlIGdpdmVuIFVSTCwgd2hpY2ggcG9pbnRzIHRvIGEgc2l0ZS54bWwgZmlsZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBVUkwgZ2V0U2l0ZVVSTChVUkwgdXJsKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJaWYgKHVybC5nZXRQYXRoKCkuZW5kc1dpdGgoU0lURV9GSUxFKSkKLQkJCXJldHVybiB1cmw7Ci0JCWlmICh1cmwuZ2V0UGF0aCgpLmVuZHNXaXRoKERJUl9TRVBBUkFUT1IpKQotCQkJcmV0dXJuIG5ldyBVUkwodXJsLnRvRXh0ZXJuYWxGb3JtKCkgKyBTSVRFX0ZJTEUpOwotCQlyZXR1cm4gbmV3IFVSTCh1cmwudG9FeHRlcm5hbEZvcm0oKSArIERJUl9TRVBBUkFUT1IgKyBTSVRFX0ZJTEUpOwotCX0KLQotCS8qCi0JICogTG9hZCBhbmQgcmV0dXJuIGFuIHVwZGF0ZSBzaXRlIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVwZGF0ZVNpdGUgbG9hZChVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVVwZGF0ZVNpdGUgcmVzdWx0ID0gKFVwZGF0ZVNpdGUpIHNpdGVDYWNoZS5nZXQobG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSk7Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCUlucHV0U3RyZWFtIGlucHV0ID0gZ2V0U2l0ZUlucHV0U3RyZWFtKGxvY2F0aW9uKTsKLQkJdHJ5IHsKLQkJCURlZmF1bHRTaXRlUGFyc2VyIHNpdGVQYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKLQkJCUNoZWNrc3VtIGNoZWNrc3VtID0gbmV3IENSQzMyKCk7Ci0JCQlpbnB1dCA9IG5ldyBDaGVja2VkSW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW5wdXQpLCBjaGVja3N1bSk7Ci0JCQlTaXRlTW9kZWwgc2l0ZU1vZGVsID0gc2l0ZVBhcnNlci5wYXJzZShpbnB1dCk7Ci0JCQlTdHJpbmcgY2hlY2tzdW1TdHJpbmcgPSBMb25nLnRvU3RyaW5nKGNoZWNrc3VtLmdldFZhbHVlKCkpOwotCQkJcmVzdWx0ID0gbmV3IFVwZGF0ZVNpdGUoc2l0ZU1vZGVsLCBsb2NhdGlvbiwgY2hlY2tzdW1TdHJpbmcpOwotCQkJc2l0ZUNhY2hlLnB1dChsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLCByZXN1bHQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdTaXRlLCBsb2NhdGlvbik7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfUkVBRCwgbXNnLCBlKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdTaXRlLCBsb2NhdGlvbik7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfUkVBRCwgbXNnLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFBhcnNlIHRoZSBmZWF0dXJlLnhtbCBzcGVjaWZpZWQgYnkgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJuIHRoZSBmZWF0dXJlIG9iamVjdC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBGZWF0dXJlIHBhcnNlRmVhdHVyZShGZWF0dXJlUGFyc2VyIGZlYXR1cmVQYXJzZXIsIFVSTCBmZWF0dXJlVVJMKSB0aHJvd3MgSU9FeGNlcHRpb24sIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJRmlsZSBmZWF0dXJlRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoRkVBVFVSRV9URU1QX0ZJTEUsIEpBUl9FWFRFTlNJT04pOwotCQl0cnkgewotCQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oZmVhdHVyZVVSTC5vcGVuU3RyZWFtKCksIHRydWUsIG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmZWF0dXJlRmlsZSkpLCB0cnVlKTsKLQkJCXJldHVybiBmZWF0dXJlUGFyc2VyLnBhcnNlKGZlYXR1cmVGaWxlKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCS8vc2VlIGJ1ZyAyMjE2MDAgLSBVUkwub3BlblN0cmVhbSBjYW4gdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuSW52YWxpZFJlcG9zaXRvcnlMb2NhdGlvbiwgZmVhdHVyZVVSTC50b0V4dGVybmFsRm9ybSgpKTsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0lOVkFMSURfTE9DQVRJT04sIG1zZywgZSkpOwotCQl9IGZpbmFsbHkgewotCQkJZmVhdHVyZUZpbGUuZGVsZXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2l0ZSBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBVUkwgaXMgbm90IHZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShVUkwgdXJsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IGdldFNpdGVJbnB1dFN0cmVhbSh1cmwpOwotCQl0cnkgewotCQkJaW5wdXQuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaWdub3JlCi0JCX0KLQl9Ci0KLQkvKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuCi0JICovCi0JcHJpdmF0ZSBVcGRhdGVTaXRlKFNpdGVNb2RlbCBzaXRlLCBVUkwgbG9jYXRpb24sIFN0cmluZyBjaGVja3N1bSkgewotCQlzdXBlcigpOwotCQl0aGlzLnNpdGUgPSBzaXRlOwotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JCXRoaXMuY2hlY2tzdW0gPSBjaGVja3N1bTsKLQl9Ci0KLQkvKgotCSAqIEl0ZXJhdGUgb3ZlciB0aGUgYXJjaGl2ZSBlbnRyaWVzIGluIHRoaXMgc2l0ZSBhbmQgcmV0dXJuIHRoZSBtYXRjaGluZyBVUkwgc3RyaW5nIGZvcgotCSAqIHRoZSBnaXZlbiBpZGVudGlmaWVyLCBpZiB0aGVyZSBpcyBvbmUuCi0JICovCi0JcHJpdmF0ZSBVUkwgZ2V0QXJjaGl2ZVVSTChVUkwgYmFzZSwgU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJVVJMRW50cnlbXSBhcmNoaXZlcyA9IHNpdGUuZ2V0QXJjaGl2ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGFyY2hpdmVzICE9IG51bGwgJiYgaSA8IGFyY2hpdmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlVUkxFbnRyeSBlbnRyeSA9IGFyY2hpdmVzW2ldOwotCQkJaWYgKGlkZW50aWZpZXIuZXF1YWxzKGVudHJ5LmdldEFubm90YXRpb24oKSkpCi0JCQkJcmV0dXJuIGludGVybmFsR2V0VVJMKGJhc2UsIGVudHJ5LmdldFVSTCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgY2hlY2tzdW0gZm9yIHRoaXMgc2l0ZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoZWNrc3VtKCkgewotCQlyZXR1cm4gY2hlY2tzdW07Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gYSBVUkwgd2hpY2ggcmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgdGhlIGdpdmVuIGZlYXR1cmUuCi0JICovCi0JcHVibGljIFVSTCBnZXRGZWF0dXJlVVJMKFNpdGVGZWF0dXJlIHNpdGVGZWF0dXJlLCBTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCVVSTCBiYXNlID0gc2l0ZS5nZXRMb2NhdGlvblVSTCgpOwotCQlpZiAoYmFzZSA9PSBudWxsKQotCQkJYmFzZSA9IGxvY2F0aW9uOwotCQlpZiAoc2l0ZUZlYXR1cmUgPT0gbnVsbCkgewotCQkJU2l0ZUZlYXR1cmVbXSBlbnRyaWVzID0gc2l0ZS5nZXRGZWF0dXJlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGlkLmVxdWFscyhlbnRyaWVzW2ldLmdldEZlYXR1cmVJZGVudGlmaWVyKCkpICYmIHZlcnNpb24uZXF1YWxzKGVudHJpZXNbaV0uZ2V0RmVhdHVyZVZlcnNpb24oKSkpIHsKLQkJCQkJc2l0ZUZlYXR1cmUgPSBlbnRyaWVzW2ldOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHNpdGVGZWF0dXJlICE9IG51bGwpIHsKLQkJCVVSTCB1cmwgPSBzaXRlRmVhdHVyZS5nZXRVUkwoKTsKLQkJCWlmICh1cmwgIT0gbnVsbCkKLQkJCQlyZXR1cm4gdXJsOwotCQkJdXJsID0gZ2V0QXJjaGl2ZVVSTChiYXNlLCBpZCk7Ci0JCQlpZiAodXJsICE9IG51bGwpCi0JCQkJcmV0dXJuIHVybDsKLQkJfQotCQkvLyBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCBVUkwKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRGaWxlVVJMKGJhc2UsIEZFQVRVUkVfRElSICsgaWQgKyBWRVJTSU9OX1NFUEFSQVRPUiArIHZlcnNpb24gKyBKQVJfRVhURU5TSU9OKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZG4ndCBoYXBwZW4KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhpcyBzaXRlLgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiBhIFVSTCB3aGljaCByZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldFBsdWdpblVSTChGZWF0dXJlRW50cnkgcGx1Z2luKSB7Ci0JCVVSTCBiYXNlID0gc2l0ZS5nZXRMb2NhdGlvblVSTCgpOwotCQlpZiAoYmFzZSA9PSBudWxsKQotCQkJYmFzZSA9IGxvY2F0aW9uOwotCQlTdHJpbmcgcGF0aCA9IFBMVUdJTl9ESVIgKyBwbHVnaW4uZ2V0SWQoKSArIFZFUlNJT05fU0VQQVJBVE9SICsgcGx1Z2luLmdldFZlcnNpb24oKSArIEpBUl9FWFRFTlNJT047Ci0JCVVSTCB1cmwgPSBnZXRBcmNoaXZlVVJMKGJhc2UsIHBhdGgpOwotCQlpZiAodXJsICE9IG51bGwpCi0JCQlyZXR1cm4gdXJsOwotCQl0cnkgewotCQkJcmV0dXJuIGdldEZpbGVVUkwoYmFzZSwgcGF0aCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGRuJ3QgaGFwcGVuCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIHNpdGUgbW9kZWwuCi0JICovCi0JcHVibGljIFNpdGVNb2RlbCBnZXRTaXRlKCkgewotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIFRoZSB0cmFpbGluZyBwYXJhbWV0ZXIgY2FuIGJlIGVpdGhlciBudWxsLCByZWxhdGl2ZSBvciBhYnNvbHV0ZS4gSWYgaXQgaXMgbnVsbCwKLQkgKiB0aGVuIHJldHVybiBudWxsLiBJZiBpdCBpcyBhYnNvbHV0ZSwgdGhlbiBjcmVhdGUgYSBuZXcgdXJsIGFuZCByZXR1cm4gaXQuIElmIGl0IGlzCi0JICogcmVsYXRpdmUsIHRoZW4gbWFrZSBpdCByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gYmFzZSB1cmwuCi0JICovCi0JcHJpdmF0ZSBVUkwgaW50ZXJuYWxHZXRVUkwoVVJMIGJhc2UsIFN0cmluZyB0cmFpbGluZykgewotCQlpZiAodHJhaWxpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkwodHJhaWxpbmcpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gbmV3IFVSTChiYXNlLCB0cmFpbGluZyk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTIpIHsKLQkJCQkvLyBzaG91bGRuJ3QgaGFwcGVuCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBMb2FkIGFuZCByZXR1cm4gdGhlIGZlYXR1cmVzIHJlZmVyZW5jZXMgaW4gdGhpcyB1cGRhdGUgc2l0ZS4KLQkgKi8KLQlwdWJsaWMgRmVhdHVyZVtdIGxvYWRGZWF0dXJlcygpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlGZWF0dXJlW10gcmVzdWx0ID0gbG9hZEZlYXR1cmVzRnJvbURpZ2VzdCgpOwotCQlyZXR1cm4gcmVzdWx0ID09IG51bGwgPyBsb2FkRmVhdHVyZXNGcm9tU2l0ZSgpIDogcmVzdWx0OwotCX0KLQotCS8qCi0JICogVHJ5IGFuZCBsb2FkIHRoZSBmZWF0dXJlIGluZm9ybWF0aW9uIGZyb20gdGhlIHVwZGF0ZSBzaXRlJ3MKLQkgKiBkaWdlc3QgZmlsZSwgaWYgaXQgZXhpc3RzLgotCSAqLwotCXByaXZhdGUgRmVhdHVyZVtdIGxvYWRGZWF0dXJlc0Zyb21EaWdlc3QoKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJaWYgKCFmZWF0dXJlQ2FjaGUuaXNFbXB0eSgpKQotCQkJcmV0dXJuIChGZWF0dXJlW10pIGZlYXR1cmVDYWNoZS52YWx1ZXMoKS50b0FycmF5KG5ldyBGZWF0dXJlW2ZlYXR1cmVDYWNoZS5zaXplKCldKTsKLQkJdHJ5IHsKLQkJCVVSTCBkaWdlc3RVUkwgPSBnZXRGaWxlVVJMKGxvY2F0aW9uLCAiZGlnZXN0LnppcCIpOyAvLyROT04tTkxTLTEkCi0JCQlGaWxlIGRpZ2VzdEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJkaWdlc3QiLCAiLnppcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXRyeSB7Ci0JCQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oZGlnZXN0VVJMLm9wZW5TdHJlYW0oKSwgdHJ1ZSwgbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRpZ2VzdEZpbGUpKSwgdHJ1ZSk7Ci0JCQkJRmVhdHVyZVtdIHJlc3VsdCA9IG5ldyBEaWdlc3RQYXJzZXIoKS5wYXJzZShkaWdlc3RGaWxlKTsKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBrZXkgPSByZXN1bHRbaV0uZ2V0SWQoKSArIFZFUlNJT05fU0VQQVJBVE9SICsgcmVzdWx0W2ldLmdldFZlcnNpb24oKTsKLQkJCQkJZmVhdHVyZUNhY2hlLnB1dChrZXksIHJlc3VsdFtpXSk7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJCS8vc2VlIGJ1ZyAyMjE2MDAgLSBVUkwub3BlblN0cmVhbSBjYW4gdGhyb3cgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JCQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLkludmFsaWRSZXBvc2l0b3J5TG9jYXRpb24sIGRpZ2VzdFVSTC50b0V4dGVybmFsRm9ybSgpKTsKLQkJCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9JTlZBTElEX0xPQ0FUSU9OLCBtc2csIGUpKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZGlnZXN0RmlsZS5kZWxldGUoKTsKLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLkVycm9yUmVhZGluZ0RpZ2VzdCwgbG9jYXRpb24pLCBlKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLkVycm9yUmVhZGluZ0RpZ2VzdCwgbG9jYXRpb24pLCBlKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBMb2FkIGFuZCByZXR1cm4gdGhlIGZlYXR1cmVzIHRoYXQgYXJlIHJlZmVyZW5jZWQgYnkgdGhpcyB1cGRhdGUgc2l0ZS4gTm90ZSB0aGlzCi0JICogcmVxdWlyZXMgZG93bmxvYWRpbmcgYW5kIHBhcnNpbmcgdGhlIGZlYXR1cmUgbWFuaWZlc3QgbG9jYWxseS4KLQkgKi8KLQlwcml2YXRlIEZlYXR1cmVbXSBsb2FkRmVhdHVyZXNGcm9tU2l0ZSgpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlTaXRlRmVhdHVyZVtdIHNpdGVGZWF0dXJlcyA9IHNpdGUuZ2V0RmVhdHVyZXMoKTsKLQkJRmVhdHVyZVBhcnNlciBmZWF0dXJlUGFyc2VyID0gbmV3IEZlYXR1cmVQYXJzZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlRmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCVNpdGVGZWF0dXJlIHNpdGVGZWF0dXJlID0gc2l0ZUZlYXR1cmVzW2ldOwotCQkJU3RyaW5nIGtleSA9IHNpdGVGZWF0dXJlLmdldEZlYXR1cmVJZGVudGlmaWVyKCkgKyBWRVJTSU9OX1NFUEFSQVRPUiArIHNpdGVGZWF0dXJlLmdldEZlYXR1cmVWZXJzaW9uKCk7Ci0JCQlpZiAoZmVhdHVyZUNhY2hlLmNvbnRhaW5zS2V5KGtleSkpCi0JCQkJY29udGludWU7Ci0JCQlVUkwgZmVhdHVyZVVSTCA9IGdldEZlYXR1cmVVUkwoc2l0ZUZlYXR1cmUsIHNpdGVGZWF0dXJlLmdldEZlYXR1cmVJZGVudGlmaWVyKCksIHNpdGVGZWF0dXJlLmdldEZlYXR1cmVWZXJzaW9uKCkpOwotCQkJdHJ5IHsKLQkJCQlGZWF0dXJlIGZlYXR1cmUgPSBwYXJzZUZlYXR1cmUoZmVhdHVyZVBhcnNlciwgZmVhdHVyZVVSTCk7Ci0JCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdGZWF0dXJlLCBmZWF0dXJlVVJMKSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZlYXR1cmVDYWNoZS5wdXQoa2V5LCBmZWF0dXJlKTsKLQkJCQkJbG9hZEluY2x1ZGVkRmVhdHVyZXMoZmVhdHVyZSwgZmVhdHVyZVBhcnNlcik7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLkVycm9yUmVhZGluZ0ZlYXR1cmUsIGZlYXR1cmVVUkwpLCBlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChGZWF0dXJlW10pIGZlYXR1cmVDYWNoZS52YWx1ZXMoKS50b0FycmF5KG5ldyBGZWF0dXJlW2ZlYXR1cmVDYWNoZS5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIExvYWQgdGhlIGZlYXR1cmVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IHRoZSBnaXZlbiBmZWF0dXJlLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkSW5jbHVkZWRGZWF0dXJlcyhGZWF0dXJlIGZlYXR1cmUsIEZlYXR1cmVQYXJzZXIgZmVhdHVyZVBhcnNlcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUZlYXR1cmVFbnRyeVtdIGZlYXR1cmVFbnRyaWVzID0gZmVhdHVyZS5nZXRFbnRyaWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZUVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUZlYXR1cmVFbnRyeSBlbnRyeSA9IGZlYXR1cmVFbnRyaWVzW2ldOwotCQkJaWYgKGVudHJ5LmlzUmVxdWlyZXMoKSB8fCBlbnRyeS5pc1BsdWdpbigpKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGtleSA9IGVudHJ5LmdldElkKCkgKyBWRVJTSU9OX1NFUEFSQVRPUiArIGVudHJ5LmdldFZlcnNpb24oKTsKLQkJCWlmIChmZWF0dXJlQ2FjaGUuY29udGFpbnNLZXkoa2V5KSkKLQkJCQljb250aW51ZTsKLQkJCVVSTCBmZWF0dXJlVVJMID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZmVhdHVyZVVSTCA9IGdldEZpbGVVUkwobG9jYXRpb24sIEZFQVRVUkVfRElSICsgZW50cnkuZ2V0SWQoKSArIFZFUlNJT05fU0VQQVJBVE9SICsgZW50cnkuZ2V0VmVyc2lvbigpICsgSkFSX0VYVEVOU0lPTik7Ci0JCQkJRmVhdHVyZSBpbmNsdWRlZEZlYXR1cmUgPSBwYXJzZUZlYXR1cmUoZmVhdHVyZVBhcnNlciwgZmVhdHVyZVVSTCk7Ci0JCQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkgewotCQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdGZWF0dXJlLCBmZWF0dXJlVVJMKSkpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZlYXR1cmVDYWNoZS5wdXQoa2V5LCBpbmNsdWRlZEZlYXR1cmUpOwotCQkJCQlsb2FkSW5jbHVkZWRGZWF0dXJlcyhpbmNsdWRlZEZlYXR1cmUsIGZlYXR1cmVQYXJzZXIpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuRXJyb3JSZWFkaW5nRmVhdHVyZSwgZW50cnkuZ2V0SWQoKSksIGUpKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdGZWF0dXJlLCBmZWF0dXJlVVJMKSwgZSkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcHVibGlzaGVyL2ZlYXR1cmVzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZGVmOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvZmVhdHVyZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgSW5zdGFsbCBVcGRhdGUgQ29yZSBQcm9wZXJ0aWVzIEZpbGUKLSMKLQotRGVmYXVsdEZlYXR1cmVQYXJzZXJfSWRPclZlcnNpb25JbnZhbGlkPSBFcnJvciBwYXJzaW5nIGZlYXR1cmUgc3RyZWFtLiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb3IgdGhlIHZlcnNpb24gaXMgbnVsbCBvciBlbXB0eSBmb3IgdGhlIFN0YXRlOiBcInsyfVwiOiB1bmlxdWUgaWRlbnRpZmllcj1cInswfVwiIHZlcnNpb249XCJ7MX1cIi4KLURlZmF1bHRTaXRlUGFyc2VyX05vU2l0ZVRhZz0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5hYmxlIHRvIGZpbmQgcm9vdCBlbGVtZW50IFwic2l0ZVwiIGluIHRoZSBzdHJlYW0uCi1EZWZhdWx0U2l0ZVBhcnNlcl9Xcm9uZ1BhcnNpbmdTdGFjaz0gSW50ZXJuYWwgRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5leHBlY3RlZCBQYXJzaW5nIFN0YWNrOiBcInswfVwiCi1EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRWxlbWVudD0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gVW5rbm93biBlbGVtZW50IFwiezB9XCIgaW4gcGFyc2luZyBzdGF0ZSBcInsxfVwiLiBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIFhNTCBmaWxlLgotRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93blN0YXJ0U3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFVua25vd24gc3RhcnQgc3RhdGUgXCJ7MH1cIi4KLURlZmF1bHRTaXRlUGFyc2VyX01pc3Npbmc9IEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFRoZSBcInswfVwiIHRhZyBvZiB0aGUgZWxlbWVudCBcInsxfVwiIGlzIG51bGwgb3IgZW1wdHkuIFZhbHVlIGlzIHJlcXVpcmVkLgotRGVmYXVsdFNpdGVQYXJzZXJfUGFyc2luZ1N0YWNrQmFja1RvSW5pdGlhbFN0YXRlPSBJbnRlcm5hbCBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBQYXJzaW5nIHN0YWNrIGJhY2sgdG8gSW5pdGlhbCBTdGF0ZS4KLURlZmF1bHRTaXRlUGFyc2VyX0VsZW1lbnRBbHJlYWR5U2V0PSBFcnJvciBwYXJzaW5nIHNpdGUgc3RyZWFtLiBFbGVtZW50OiBcInswfVwiIGFscmVhZHkgc2V0IGZvciB0aGUgU2l0ZS4KLURlZmF1bHRTaXRlUGFyc2VyX0NhdGVnb3J5QWxyZWFkeVNldD0gRXJyb3IgcGFyc2luZyBzaXRlIHN0cmVhbS4gRWxlbWVudDogXCJ7MH1cIjogXCJ7MX1cIiBhbHJlYWR5IHNldCBmb3IgdGhlIFNpdGUuCi1EZWZhdWx0U2l0ZVBhcnNlcl9Vbmtub3duRW5kU3RhdGU9IEludGVybmFsIEVycm9yIHBhcnNpbmcgc2l0ZSBzdHJlYW0uIFVua25vd24gZW5kIHN0YXRlIFwiezB9XCIuCi1EZWZhdWx0U2l0ZVBhcnNlcl9FcnJvclBhcnNpbmc9IEVycm9yIFBhcnNpbmcgc2l0ZSBzdHJlYW0uIEVycm9yOiBcInswfVwiCi1EZWZhdWx0U2l0ZVBhcnNlcl9FcnJvcmxpbmVDb2x1bW5NZXNzYWdlPSBFcnJvciBQYXJzaW5nIHNpdGUgc3RyZWFtLiBFbGVtZW50IFwiezB9XCIgbGluZTogXCJ7MX1cIiBjb2x1bW46XCJ7Mn1cIi4gRXJyb3I6IFwiezN9XCIuCi1EZWZhdWx0U2l0ZVBhcnNlcl9FcnJvclBhcnNpbmdTaXRlPSBFcnJvciBQYXJzaW5nIHNpdGUgc3RyZWFtLgotRGVmYXVsdFNpdGVQYXJzZXJfVW5rbm93blN0YXRlPSBVbmtub3duIFN0YXRlIFwiezB9XCIuCi1EZWZhdWx0U2l0ZVBhcnNlcl9JbnZhbGlkWE1MU3RyZWFtPSBUaGUgWE1MIHN0cmVhbSBpcyBub3QgYSB2YWxpZCBkZWZhdWx0IFwic2l0ZS54bWxcIiBmaWxlLiBUaGUgcm9vdCB0YWcgaXMgbm90IHNpdGUuCi1EZWZhdWx0U2l0ZVBhcnNlcl9taXJyb3JzID0gRXJyb3IgcHJvY2Vzc2luZyB1cGRhdGUgc2l0ZSBtaXJyb3IuCi0KLUVycm9yUmVhZGluZ0RpZ2VzdD1FcnJvciByZWFkaW5nIHNpdGUgZGlnZXN0IHswfS4KLUVycm9yUmVhZGluZ0ZlYXR1cmU9RXJyb3IgcmVhZGluZyBmZWF0dXJlIHswfS4KLUVycm9yUmVhZGluZ1NpdGU9RXJyb3IgcmVhZGluZyB1cGRhdGUgc2l0ZSB7MH0uCi1JbnZhbGlkUmVwb3NpdG9yeUxvY2F0aW9uPUludmFsaWQgcmVwb3NpdG9yeSBsb2NhdGlvbiB7MH0uCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9wdWJsaXNoZXIvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhZmZjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3B1Ymxpc2hlci9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWV4Y2VwdGlvbl9lcnJvckNvbnZlcnRpbmcgPSBBbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBnZW5lcmF0aW5nIG1hbmlmZXN0IGZvciB7MH0uCi1leGNlcHRpb25fb3V0cHV0U3RyZWFtID0gVW5hYmxlIHRvIG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgezB9LgotZXhjZXB0aW9uX2Vycm9yUGFyc2luZ1VwZGF0ZVNpdGUgPSBFcnJvciBwYXJzaW5nIHVwZGF0ZSBzaXRlOiB7MH0uCi1leGNlcHRpb25fc3RhdGVBZGRpdGlvbiA9IEFuIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSBhZGRpbmcgdGhlIGJ1bmRsZSB7MH0uCi1leGNlcHRpb25fc291cmNlRGlyZWN0b3J5SW52YWxpZCA9IFNvdXJjZSBkaXJlY3RvcnkgaXMgaW52YWxpZDogezB9LgotZXhjZXB0aW9uX2FydGlmYWN0UmVwb0xvY2F0aW9uVVJMID0gQXJ0aWZhY3QgcmVwb3NpdG9yeSBsb2NhdGlvbiBpcyBub3QgYSB2YWxpZCBVUkw6IHswfS4KLWV4Y2VwdGlvbl9hcnRpZmFjdFJlcG9Ob3RXcml0YWJsZSA9IEFydGlmYWN0IHJlcG9zaXRvcnkgaXMgbm90IHdyaXRhYmxlOiB7MH0uCi1leGNlcHRpb25fbWV0YWRhdGFSZXBvTG9jYXRpb25VUkwgPSBNZXRhZGF0YSByZXBvc2l0b3J5IGxvY2F0aW9uIGlzIG5vdCBhIHZhbGlkIFVSTDogezB9LgotZXhjZXB0aW9uX21ldGFkYXRhUmVwb05vdFdyaXRhYmxlID0gTWV0YWRhdGEgcmVwb3NpdG9yeSBub3Qgd3JpdGFibGU6IHswfS4KLWV4Y2VwdGlvbl9iYXNlTG9jYXRpb25Ob3RTcGVjaWZpZWQgPSBFY2xpcHNlIGJhc2UgbG9jYXRpb24gbm90IHNwZWNpZmllZC4KLQotbWVzc2FnZV9nZW5lcmF0aW5nTWV0YWRhdGEgPSBHZW5lcmF0aW5nIG1ldGFkYXRhIGZvciB7MH0uCi1tZXNzYWdlX2dlbmVyYXRpb25Db21wbGV0ZWQgPSBHZW5lcmF0aW9uIGNvbXBsZXRlZCB3aXRoIHN1Y2Nlc3MgW3swfSBzZWNvbmRzXS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3B1Ymxpc2hlci9wcm9kdWN0L0JyYW5kaW5nSXJvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi9wdWJsaXNoZXIvcHJvZHVjdC9CcmFuZGluZ0lyb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkODc3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3B1Ymxpc2hlci9wcm9kdWN0L0JyYW5kaW5nSXJvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJQ29kZSA5IC0gQWRkaXRpb25hbCBmdW5jdGlvbiBhbmQgZml4ZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyLnByb2R1Y3Q7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UucGRlLmludGVybmFsLnN3dC50b29scy5JY29uRXhlOwotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBCcmFuZGluZ0lyb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfTkFNRSA9ICIlRVhFQ1VUQUJMRV9OQU1FJSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAiJUJVTkRMRV9OQU1FJSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUNPTl9OQU1FID0gIiVJQ09OX05BTUUlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNQVJLRVJfS0VZID0gIjxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfS0VZID0gIjxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJQ09OX0tFWSA9ICI8a2V5PkNGQnVuZGxlSWNvbkZpbGU8L2tleT4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19TVEFSVCA9ICI8c3RyaW5nPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0VORCA9ICI8L3N0cmluZz4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhET0NfSUNPTiA9ICItWGRvY2s6aWNvbj0uLi9SZXNvdXJjZXMvRWNsaXBzZS5pY25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmdbXSBpY29ucyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcm9vdDsKLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIG9zID0gIndpbjMyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgYm9vbGVhbiBicmFuZEljb25zID0gdHJ1ZTsKLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCW5hbWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJY29ucyhTdHJpbmdbXSB2YWx1ZSkgewotCQlpY29ucyA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEljb25zKFN0cmluZyB2YWx1ZSkgewotCQlpY29ucyA9IHZhbHVlLnNwbGl0KCIsXFxzKiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpY29uc1swXS5zdGFydHNXaXRoKCIkeyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpY29ucy5sZW5ndGggPiAxKSB7Ci0JCQkJU3RyaW5nW10gdGVtcCA9IG5ldyBTdHJpbmdbaWNvbnMubGVuZ3RoIC0gMV07Ci0JCQkJU3lzdGVtLmFycmF5Y29weShpY29ucywgMSwgdGVtcCwgMCwgdGVtcC5sZW5ndGgpOwotCQkJCWljb25zID0gdGVtcDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWNvbnMgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdChTdHJpbmcgdmFsdWUpIHsKLQkJcm9vdCA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGJyYW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIGlmIHRoZSBuYW1lIHByb3BlcnR5IGlzIG5vdCBzZXQgaXQgd2lsbCBiZSAke2xhdW5jaGVyLm5hbWV9IHNvIGp1c3QgYmFpbC4KLQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiJHsiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCi0JCWlmIChpY29ucyA9PSBudWxsIHx8IGljb25zWzBdLnN0YXJ0c1dpdGgoIiR7IikpIC8vJE5PTi1OTFMtMSQKLQkJCWJyYW5kSWNvbnMgPSBmYWxzZTsKLQotCQkvLyBpZiB0aGUgcm9vdCBkb2VzIG5vdCBleGlzdHMgKGhhcHBlbnMgaW4gc29tZSBwYWNrYWdpbmcgY2FzZXMpIG9yIAotCQkvLyB0aGVyZSBpcyBhbHJlYWR5IGEgZmlsZSB3aXRoIHRhcmdldCBuYW1lIGFuZCB3ZSBkb24ndCBuZWVkIHRvIHVwZGF0ZSBpdHMgaWNvbnMsIGRvbid0IGRvIGFueXRoaW5nCi0JCVN0cmluZyB0ZXN0TmFtZSA9IG9zLmVxdWFscygid2luMzIiKSA/IG5hbWUgKyAiLmV4ZSIgOiBuYW1lOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKCFuZXcgRmlsZShyb290KS5leGlzdHMoKSB8fCAoIWJyYW5kSWNvbnMgJiYgbmV3IEZpbGUocm9vdCwgdGVzdE5hbWUpLmV4aXN0cygpKSkKLQkJCXJldHVybjsKLQotCQlpZiAoIndpbjMyIi5lcXVhbHMob3MpKSAvLyROT04tTkxTLTEkCi0JCQlicmFuZFdpbmRvd3MoKTsKLQkJaWYgKCJsaW51eCIuZXF1YWxzKG9zKSkgLy8kTk9OLU5MUy0xJAotCQkJYnJhbmRMaW51eCgpOwotCQlpZiAoInNvbGFyaXMiLmVxdWFscyhvcykpIC8vJE5PTi1OTFMtMSQKLQkJCWJyYW5kU29sYXJpcygpOwotCQlpZiAoIm1hY29zeCIuZXF1YWxzKG9zKSkgLy8kTk9OLU5MUy0xJAotCQkJYnJhbmRNYWMoKTsKLQkJaWYgKCJhaXgiLmVxdWFscyhvcykpIC8vJE5PTi1OTFMtMSQKLQkJCWJyYW5kQUlYKCk7Ci0JCWlmICgiaHB1eCIuZXF1YWxzKG9zKSkgLy8kTk9OLU5MUy0xJAotCQkJYnJhbmRIUFVYKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJyYW5kQUlYKCkgewotCQlyZW5hbWVMYXVuY2hlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBicmFuZEhQVVgoKSB7Ci0JCXJlbmFtZUxhdW5jaGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJyYW5kTGludXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmVuYW1lTGF1bmNoZXIoKTsKLQkJaWYgKGJyYW5kSWNvbnMpCi0JCQljb3B5KG5ldyBGaWxlKGljb25zWzBdKSwgbmV3IEZpbGUocm9vdCwgImljb24ueHBtIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGJyYW5kU29sYXJpcygpIHRocm93cyBFeGNlcHRpb24gewotCQlyZW5hbWVMYXVuY2hlcigpOwotCQlpZiAoYnJhbmRJY29ucyA9PSBmYWxzZSkKLQkJCXJldHVybjsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGljb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgaWNvbiA9IGljb25zW2ldOwotCQkJaWYgKGljb24uZW5kc1dpdGgoIi5sLnBtIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb3B5KG5ldyBGaWxlKGljb24pLCBuZXcgRmlsZShyb290LCBuYW1lICsgIi5sLnBtIikpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaWNvbi5lbmRzV2l0aCgiLm0ucG0iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvcHkobmV3IEZpbGUoaWNvbiksIG5ldyBGaWxlKHJvb3QsIG5hbWUgKyAiLm0ucG0iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpY29uLmVuZHNXaXRoKCIucy5wbSIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29weShuZXcgRmlsZShpY29uKSwgbmV3IEZpbGUocm9vdCwgbmFtZSArICIucy5wbSIpKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGljb24uZW5kc1dpdGgoIi50LnBtIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb3B5KG5ldyBGaWxlKGljb24pLCBuZXcgRmlsZShyb290LCBuYW1lICsgIi50LnBtIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnJhbmRNYWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy9Jbml0aWFsbHkgdGhlIGZpbGVzIGFyZSBpbjogPHJvb3Q+L0VjbGlwc2UuYXBwLyAKLQkJLy9hbmQgdGhleSBtdXN0IGFwcGVhciBpbiA8cm9vdD4vTXlBcHBOYW1lLmFwcC8KLQkJLy9CZWNhdXNlIGphdmEgZG9lcyBub3Qgc3VwcG9ydCB0aGUgcmVuYW1lIG9mIGEgZm9sZGVyLCBmaWxlcyBhcmUgY29waWVkLgotCi0JCS8vSW5pdGlhbGl6ZSB0aGUgdGFyZ2V0IGZvbGRlcnMKLQkJU3RyaW5nIHRhcmdldCA9IHJvb3QgKyAnLycgKyBuYW1lICsgIi5hcHAvQ29udGVudHMiOyAvLyROT04tTkxTLTEkCi0JCW5ldyBGaWxlKHRhcmdldCkubWtkaXJzKCk7Ci0JCW5ldyBGaWxlKHRhcmdldCArICIvTWFjT1MiKS5ta2RpcnMoKTsgLy8kTk9OLU5MUy0xJAotCQluZXcgRmlsZSh0YXJnZXQgKyAiL1Jlc291cmNlcyIpLm1rZGlycygpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGluaXRpYWxSb290ID0gcm9vdCArICIvTGF1bmNoZXIuYXBwL0NvbnRlbnRzIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIW5ldyBGaWxlKGluaXRpYWxSb290KS5leGlzdHMoKSkKLQkJCWluaXRpYWxSb290ID0gcm9vdCArICIvRWNsaXBzZS5hcHAvQ29udGVudHMiOyAvLyROT04tTkxTLTEkCi0JCWNvcHlNYWNMYXVuY2hlcihpbml0aWFsUm9vdCwgdGFyZ2V0KTsKLQkJU3RyaW5nIGljb25OYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZSBzcGxhc2hBcHAgPSBuZXcgRmlsZShpbml0aWFsUm9vdCwgIlJlc291cmNlcy9TcGxhc2guYXBwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGJyYW5kSWNvbnMpIHsKLQkJCUZpbGUgaWNvbiA9IG5ldyBGaWxlKGljb25zWzBdKTsKLQkJCWljb25OYW1lID0gaWNvbi5nZXROYW1lKCk7Ci0JCQljb3B5KGljb24sIG5ldyBGaWxlKHRhcmdldCArICIvUmVzb3VyY2VzLyIgKyBpY29uLmdldE5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCQluZXcgRmlsZShpbml0aWFsUm9vdCArICIvUmVzb3VyY2VzL0VjbGlwc2UuaWNucyIpLmRlbGV0ZSgpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoIXNwbGFzaEFwcC5leGlzdHMoKSkKLQkJCQluZXcgRmlsZShpbml0aWFsUm9vdCArICIvUmVzb3VyY2VzLyIpLmRlbGV0ZSgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY29weU1hY0luaShpbml0aWFsUm9vdCwgdGFyZ2V0LCBpY29uTmFtZSk7Ci0JCW1vZGlmeUluZm9QTGlzdEZpbGUoaW5pdGlhbFJvb3QsIHRhcmdldCwgaWNvbk5hbWUpOwotCQlpZiAoc3BsYXNoQXBwLmV4aXN0cygpKSB7Ci0JCQlicmFuZE1hY1NwbGFzaChpbml0aWFsUm9vdCwgdGFyZ2V0LCBpY29uTmFtZSk7Ci0JCX0KLQotCQlGaWxlIHJvb3RGb2xkZXIgPSBuZXcgRmlsZShpbml0aWFsUm9vdCk7Ci0JCXJvb3RGb2xkZXIuZGVsZXRlKCk7Ci0JCWlmIChyb290Rm9sZGVyLmV4aXN0cygpKSB7Ci0JCQkvL2lmIHRoZSByb290Rm9sZGVyIHN0aWxsIGV4aXN0cywgaXRzIGJlY2F1c2UgdGhlcmUgd2VyZSBvdGhlciBmaWxlcyB0aGF0IG5lZWQgdG8gYmUgbW92ZWQgb3ZlcgotCQkJbW92ZUNvbnRlbnRzKHJvb3RGb2xkZXIsIG5ldyBGaWxlKHRhcmdldCkpOwotCQl9Ci0JCXJvb3RGb2xkZXIuZ2V0UGFyZW50RmlsZSgpLmRlbGV0ZSgpOwotCX0KLQotCS8qKgotCSAqIEJyYW5kIHRoZSBzcGxhc2guYXBwIEluZm8ucGxpc3QgYW5kICBsaW5rIG9yIGNvcHkgdGhlIG1hYyBsYXVuY2hlci4KLQkgKiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIG1hYyBsYXVuY2hlciBoYXMgYmVlbiBicmFuZGVkIGFscmVhZHkuCi0JICogQHBhcmFtIGluaXRpYWxSb290Ci0JICogQHBhcmFtIHRhcmdldAotCSAqIEBwYXJhbSBpY29uTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBicmFuZE1hY1NwbGFzaChTdHJpbmcgaW5pdGlhbFJvb3QsIFN0cmluZyB0YXJnZXQsIFN0cmluZyBpY29uTmFtZSkgewotCQlTdHJpbmcgc3BsYXNoQ29udGVudHMgPSAiL1Jlc291cmNlcy9TcGxhc2guYXBwL0NvbnRlbnRzIjsgLy8kTk9OLU5MUy0xJAotCQltb2RpZnlJbmZvUExpc3RGaWxlKGluaXRpYWxSb290ICsgc3BsYXNoQ29udGVudHMsIHRhcmdldCArIHNwbGFzaENvbnRlbnRzLCBpY29uTmFtZSk7Ci0KLQkJLy9saW5rIHRoZSBNYWNPUyBsYXVuY2hlciBmb3IgdGhlIHNwbGFzaCBhcHAKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlTdHJpbmcgb3NOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9zTmFtZSAhPSBudWxsICYmICFvc05hbWUuc3RhcnRzV2l0aCgiV2luZG93cyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nW10gY29tbWFuZCA9IG5ldyBTdHJpbmdbXSB7ImxuIiwgIi1zZiIsICIuLi8uLi8uLi9NYWNPUy8iICsgbmFtZSwgIk1hY09TLyIgKyBuYW1lfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtNCQKLQkJCQlGaWxlIGxpbmtEaXIgPSBuZXcgRmlsZSh0YXJnZXQsIHNwbGFzaENvbnRlbnRzKTsKLQkJCQlQcm9jZXNzIHByb2MgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKGNvbW1hbmQsIG51bGwsIGxpbmtEaXIpOwotCQkJCXJlc3VsdCA9IHByb2Mud2FpdEZvcigpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc3VsdCAhPSAwKSB7Ci0JCQkvL2xuIGZhaWxlZCwgb3Igd2UgYXJlIG9uIHdpbmRvd3MsIGp1c3QgY29weSB0aGUgZXhlY3V0YWJsZSBpbnN0ZWFkCi0JCQlGaWxlIG1hY09TRGlyID0gbmV3IEZpbGUodGFyZ2V0LCAiTWFjT1MiKTsgLy8kTk9OLU5MUy0xJAotCQkJRmlsZSBzcGxhc2hNYWNPU0RpciA9IG5ldyBGaWxlKHRhcmdldCwgc3BsYXNoQ29udGVudHMgKyAiL01hY09TIik7IC8vJE5PTi1OTFMtMSQKLQkJCXNwbGFzaE1hY09TRGlyLm1rZGlycygpOwotCQkJdHJ5IHsKLQkJCQlGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShzcGxhc2hNYWNPU0RpciwgbmFtZSk7Ci0JCQkJY29weShuZXcgRmlsZShtYWNPU0RpciwgbmFtZSksIHRhcmdldEZpbGUpOwotCQkJCXRyeSB7Ci0JCQkJCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMobmV3IFN0cmluZ1tdIHsiY2htb2QiLCAiNzU1IiwgdGFyZ2V0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBjb3B5IG1hY29zeCBzcGxhc2ggbGF1bmNoZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG1vdmVDb250ZW50cyhGaWxlIHNvdXJjZSwgRmlsZSB0YXJnZXQpIHsKLQkJaWYgKCFzb3VyY2UuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCWlmIChzb3VyY2UuZ2V0Q2Fub25pY2FsRmlsZSgpLmVxdWFscyh0YXJnZXQuZ2V0Q2Fub25pY2FsRmlsZSgpKSkKLQkJCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGNvcHkgbWFjb3N4IHJlc291cmNlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdGFyZ2V0LmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJaWYgKHNvdXJjZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQl0YXJnZXQubWtkaXJzKCk7Ci0JCQlGaWxlW10gY29udGVudHMgPSBzb3VyY2UubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRmlsZSBkZXN0ID0gbmV3IEZpbGUodGFyZ2V0LCBjb250ZW50c1tpXS5nZXROYW1lKCkpOwotCQkJCWlmIChjb250ZW50c1tpXS5pc0ZpbGUoKSkKLQkJCQkJY29udGVudHNbaV0ucmVuYW1lVG8oZGVzdCk7Ci0JCQkJZWxzZQotCQkJCQltb3ZlQ29udGVudHMoY29udGVudHNbaV0sIGRlc3QpOwotCQkJfQotCQkJc291cmNlLmRlbGV0ZSgpOwotCQl9IGVsc2UgewotCQkJc291cmNlLnJlbmFtZVRvKHRhcmdldCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYnJhbmRXaW5kb3dzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUZpbGUgdGVtcGxhdGVMYXVuY2hlciA9IG5ldyBGaWxlKHJvb3QsICJsYXVuY2hlci5leGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIXRlbXBsYXRlTGF1bmNoZXIuZXhpc3RzKCkpCi0JCQl0ZW1wbGF0ZUxhdW5jaGVyID0gbmV3IEZpbGUocm9vdCwgImVjbGlwc2UuZXhlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGJyYW5kSWNvbnMpIHsKLQkJCVN0cmluZ1tdIGFyZ3MgPSBuZXcgU3RyaW5nW2ljb25zLmxlbmd0aCArIDFdOwotCQkJYXJnc1swXSA9IHRlbXBsYXRlTGF1bmNoZXIuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGljb25zLCAwLCBhcmdzLCAxLCBpY29ucy5sZW5ndGgpOwotCQkJSWNvbkV4ZS5tYWluKGFyZ3MpOwotCQl9Ci0JCXRlbXBsYXRlTGF1bmNoZXIucmVuYW1lVG8obmV3IEZpbGUocm9vdCwgbmFtZSArICIuZXhlIikpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbmFtZUxhdW5jaGVyKCkgewotCQlpZiAoIW5ldyBGaWxlKHJvb3QsICJsYXVuY2hlciIpLnJlbmFtZVRvKG5ldyBGaWxlKHJvb3QsIG5hbWUpKSkgLy8kTk9OLU5MUy0xJAotCQkJbmV3IEZpbGUocm9vdCwgImVjbGlwc2UiKS5yZW5hbWVUbyhuZXcgRmlsZShyb290LCBuYW1lKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY29weU1hY0xhdW5jaGVyKFN0cmluZyBpbml0aWFsUm9vdCwgU3RyaW5nIHRhcmdldCkgewotCQlTdHJpbmcgdGFyZ2V0TGF1bmNoZXIgPSB0YXJnZXQgKyAiL01hY09TLyI7IC8vJE5PTi1OTFMtMSQKLQkJRmlsZSBsYXVuY2hlciA9IG5ldyBGaWxlKGluaXRpYWxSb290ICsgIi9NYWNPUy9sYXVuY2hlciIpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgZWNsaXBzZUxhdW5jaGVyID0gbmV3IEZpbGUoaW5pdGlhbFJvb3QgKyAiL01hY09TL2VjbGlwc2UiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIWxhdW5jaGVyLmV4aXN0cygpKSB7Ci0JCQlsYXVuY2hlciA9IGVjbGlwc2VMYXVuY2hlcjsKLQkJfSBlbHNlIGlmIChlY2xpcHNlTGF1bmNoZXIuZXhpc3RzKCkpIHsKLQkJCS8vd2UgbWF5IGFjdHVhbGx5IGhhdmUgYm90aCBpZiBleHBvcnRpbmcgZnJvbSB0aGUgbWFjCi0JCQllY2xpcHNlTGF1bmNoZXIuZGVsZXRlKCk7Ci0JCX0KLQkJRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0TGF1bmNoZXIsIG5hbWUpOwotCQl0cnkgewotCQkJaWYgKHRhcmdldEZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpLmVxdWFscyhsYXVuY2hlci5nZXRDYW5vbmljYWxGaWxlKCkpKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy9Gb3JjZSB0aGUgZXhlY3V0YWJsZSBiaXQgb24gdGhlIGV4ZSBiZWNhdXNlIGl0IGhhcyBiZWVuIGxvc3Qgd2hlbiBjb3B5aW5nIHRoZSBmaWxlCi0JCQkJCVJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMobmV3IFN0cmluZ1tdIHsiY2htb2QiLCAiNzU1IiwgdGFyZ2V0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKX0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vaWdub3JlCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWNvcHkobGF1bmNoZXIsIHRhcmdldEZpbGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIG5vdCBjb3B5IG1hY29zeCBsYXVuY2hlciIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJdHJ5IHsKLQkJCS8vRm9yY2UgdGhlIGV4ZWN1dGFibGUgYml0IG9uIHRoZSBleGUgYmVjYXVzZSBpdCBoYXMgYmVlbiBsb3N0IHdoZW4gY29weWluZyB0aGUgZmlsZQotCQkJUnVudGltZS5nZXRSdW50aW1lKCkuZXhlYyhuZXcgU3RyaW5nW10geyJjaG1vZCIsICI3NTUiLCB0YXJnZXRGaWxlLmdldEFic29sdXRlUGF0aCgpfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL2lnbm9yZQotCQl9Ci0JCWxhdW5jaGVyLmRlbGV0ZSgpOwotCQlsYXVuY2hlci5nZXRQYXJlbnRGaWxlKCkuZGVsZXRlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvcHlNYWNJbmkoU3RyaW5nIGluaXRpYWxSb290LCBTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgaWNvbk5hbWUpIHsKLQkJRmlsZSBicmFuZGVkSW5pID0gbmV3IEZpbGUoaW5pdGlhbFJvb3QsICIvTWFjT1MvIiArIG5hbWUgKyAiLmluaSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlGaWxlIGluaSA9IG5ldyBGaWxlKGluaXRpYWxSb290LCAiL01hY09TL2VjbGlwc2UuaW5pIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKCFpbmkuZXhpc3RzKCkgJiYgIWJyYW5kZWRJbmkuZXhpc3RzKCkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGJyYW5kZWRJbmkuZXhpc3RzKCkgJiYgaW5pLmV4aXN0cygpKSB7Ci0JCQkvL3Rha2UgdGhlIG9uZSB0aGF0IGlzIGFscmVhZHkgYnJhbmRlZAotCQkJaW5pLmRlbGV0ZSgpOwotCQkJaW5pID0gYnJhbmRlZEluaTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXI7Ci0JCXRyeSB7Ci0JCQlidWZmZXIgPSByZWFkRmlsZShpbmkpOwotCQkJaW5pLmRlbGV0ZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkltcG9zc2libGUgdG8gYnJhbmQgaW5pIGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGljb25OYW1lLmxlbmd0aCgpID4gMCkgewotCQkJaW50IHhkb2MgPSBzY2FuKGJ1ZmZlciwgMCwgWERPQ19JQ09OKTsKLQkJCWlmICh4ZG9jICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGljbnMgPSBYRE9DX0lDT04ucmVwbGFjZUZpcnN0KCJFY2xpcHNlLmljbnMiLCBpY29uTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIucmVwbGFjZSh4ZG9jLCB4ZG9jICsgWERPQ19JQ09OLmxlbmd0aCgpLCBpY25zKTsKLQkJCX0KLQkJfQotCi0JCXRyeSB7Ci0JCQlGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXQsICIvTWFjT1MvIiArIG5hbWUgKyAiLmluaSIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJdHJhbnNmZXJTdHJlYW1zKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIudG9TdHJpbmcoKS5nZXRCeXRlcygpKSwgbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSkpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbXBvc3NpYmxlIHRvIGJyYW5kIGluaSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbXBvc3NpYmxlIHRvIGJyYW5kIGluaSBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBtb2RpZnlJbmZvUExpc3RGaWxlKFN0cmluZyBpbml0aWFsUm9vdCwgU3RyaW5nIHRhcmdldFJvb3QsIFN0cmluZyBpY29uTmFtZSkgewotCQlGaWxlIGluZm9QTGlzdCA9IG5ldyBGaWxlKGluaXRpYWxSb290LCAiSW5mby5wbGlzdCIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ0J1ZmZlciBidWZmZXI7Ci0JCXRyeSB7Ci0JCQlidWZmZXIgPSByZWFkRmlsZShpbmZvUExpc3QpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIkltcG9zc2libGUgdG8gYnJhbmQgaW5mby5wbGlzdCBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCQlpbnQgZXhlUG9zID0gc2NhbihidWZmZXIsIDAsIE1BUktFUl9OQU1FKTsKLQkJaWYgKGV4ZVBvcyAhPSAtMSkKLQkJCWJ1ZmZlci5yZXBsYWNlKGV4ZVBvcywgZXhlUG9zICsgTUFSS0VSX05BTUUubGVuZ3RoKCksIG5hbWUpOwotCQllbHNlIHsKLQkJCWV4ZVBvcyA9IHNjYW4oYnVmZmVyLCAwLCBNQVJLRVJfS0VZKTsKLQkJCWlmIChleGVQb3MgIT0gLTEpIHsKLQkJCQlpbnQgc3RhcnQgPSBzY2FuKGJ1ZmZlciwgZXhlUG9zICsgTUFSS0VSX0tFWS5sZW5ndGgoKSwgU1RSSU5HX1NUQVJUKTsKLQkJCQlpbnQgZW5kID0gc2NhbihidWZmZXIsIHN0YXJ0ICsgU1RSSU5HX1NUQVJULmxlbmd0aCgpLCBTVFJJTkdfRU5EKTsKLQkJCQlpZiAoc3RhcnQgPiAtMSAmJiBlbmQgPiBzdGFydCkgewotCQkJCQlidWZmZXIucmVwbGFjZShzdGFydCArIFNUUklOR19TVEFSVC5sZW5ndGgoKSwgZW5kLCBuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpbnQgYnVuZGxlUG9zID0gc2NhbihidWZmZXIsIDAsIEJVTkRMRV9OQU1FKTsKLQkJaWYgKGJ1bmRsZVBvcyAhPSAtMSkKLQkJCWJ1ZmZlci5yZXBsYWNlKGJ1bmRsZVBvcywgYnVuZGxlUG9zICsgQlVORExFX05BTUUubGVuZ3RoKCksIG5hbWUpOwotCQllbHNlIHsKLQkJCWV4ZVBvcyA9IHNjYW4oYnVmZmVyLCAwLCBCVU5ETEVfS0VZKTsKLQkJCWlmIChleGVQb3MgIT0gLTEpIHsKLQkJCQlpbnQgc3RhcnQgPSBzY2FuKGJ1ZmZlciwgZXhlUG9zICsgQlVORExFX0tFWS5sZW5ndGgoKSwgU1RSSU5HX1NUQVJUKTsKLQkJCQlpbnQgZW5kID0gc2NhbihidWZmZXIsIHN0YXJ0ICsgU1RSSU5HX1NUQVJULmxlbmd0aCgpLCBTVFJJTkdfRU5EKTsKLQkJCQlpZiAoc3RhcnQgPiAtMSAmJiBlbmQgPiBzdGFydCkgewotCQkJCQlidWZmZXIucmVwbGFjZShzdGFydCArIFNUUklOR19TVEFSVC5sZW5ndGgoKSwgZW5kLCBuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpbnQgaWNvblBvcyA9IHNjYW4oYnVmZmVyLCAwLCBJQ09OX05BTUUpOwotCQlpZiAoaWNvblBvcyAhPSAtMSkKLQkJCWJ1ZmZlci5yZXBsYWNlKGljb25Qb3MsIGljb25Qb3MgKyBJQ09OX05BTUUubGVuZ3RoKCksIGljb25OYW1lKTsKLQkJZWxzZSB7Ci0JCQlleGVQb3MgPSBzY2FuKGJ1ZmZlciwgMCwgSUNPTl9LRVkpOwotCQkJaWYgKGV4ZVBvcyAhPSAtMSkgewotCQkJCWludCBzdGFydCA9IHNjYW4oYnVmZmVyLCBleGVQb3MgKyBJQ09OX0tFWS5sZW5ndGgoKSwgU1RSSU5HX1NUQVJUKTsKLQkJCQlpbnQgZW5kID0gc2NhbihidWZmZXIsIHN0YXJ0ICsgU1RSSU5HX1NUQVJULmxlbmd0aCgpLCBTVFJJTkdfRU5EKTsKLQkJCQlpZiAoc3RhcnQgPiAtMSAmJiBlbmQgPiBzdGFydCkgewotCQkJCQlidWZmZXIucmVwbGFjZShzdGFydCArIFNUUklOR19TVEFSVC5sZW5ndGgoKSwgZW5kLCBpY29uTmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJRmlsZSB0YXJnZXQgPSBudWxsOwotCQl0cnkgewotCQkJdGFyZ2V0ID0gbmV3IEZpbGUodGFyZ2V0Um9vdCwgIkluZm8ucGxpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGFyZ2V0LmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCXRyYW5zZmVyU3RyZWFtcyhuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSksIG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldCkpOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJJbXBvc3NpYmxlIHRvIGJyYW5kIGluZm8ucGxpc3QgZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSW1wb3NzaWJsZSB0byBicmFuZCBpbmZvLnBsaXN0IGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQlpZiAoIWluZm9QTGlzdC5nZXRDYW5vbmljYWxGaWxlKCkuZXF1YWxzKHRhcmdldC5nZXRDYW5vbmljYWxGaWxlKCkpKQotCQkJCWluZm9QTGlzdC5kZWxldGUoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy9pZ25vcmUKLQkJfQotCX0KLQotCS8qKgotCSAqIFRyYW5zZmVycyBhbGwgYXZhaWxhYmxlIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbSB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4gCi0JICogUmVnYXJkbGVzcyBvZiBmYWlsdXJlLCB0aGlzIG1ldGhvZCBjbG9zZXMgYm90aCBzdHJlYW1zLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24gCi0JICovCi0JcHVibGljIHZvaWQgY29weShGaWxlIHNvdXJjZSwgRmlsZSBkZXN0aW5hdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaW4gPSBudWxsOwotCQlPdXRwdXRTdHJlYW0gb3V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2UpKTsKLQkJCW91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0aW5hdGlvbikpOwotCQkJZmluYWwgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOwotCQkJd2hpbGUgKHRydWUpIHsKLQkJCQlpbnQgYnl0ZXNSZWFkID0gLTE7Ci0JCQkJYnl0ZXNSZWFkID0gaW4ucmVhZChidWZmZXIpOwotCQkJCWlmIChieXRlc1JlYWQgPT0gLTEpCi0JCQkJCWJyZWFrOwotCQkJCW91dC53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbiAhPSBudWxsKQotCQkJCQlpbi5jbG9zZSgpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAob3V0ICE9IG51bGwpCi0JCQkJCW91dC5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgc2NhbihTdHJpbmdCdWZmZXIgYnVmLCBpbnQgc3RhcnQsIFN0cmluZyB0YXJnZXROYW1lKSB7Ci0JCXJldHVybiBzY2FuKGJ1Ziwgc3RhcnQsIG5ldyBTdHJpbmdbXSB7dGFyZ2V0TmFtZX0pOwotCX0KLQotCXByaXZhdGUgaW50IHNjYW4oU3RyaW5nQnVmZmVyIGJ1ZiwgaW50IHN0YXJ0LCBTdHJpbmdbXSB0YXJnZXRzKSB7Ci0JCWZvciAoaW50IGkgPSBzdGFydDsgaSA8IGJ1Zi5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHRhcmdldHMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoaSA8IGJ1Zi5sZW5ndGgoKSAtIHRhcmdldHNbal0ubGVuZ3RoKCkpIHsKLQkJCQkJU3RyaW5nIG1hdGNoID0gYnVmLnN1YnN0cmluZyhpLCBpICsgdGFyZ2V0c1tqXS5sZW5ndGgoKSk7Ci0JCQkJCWlmICh0YXJnZXRzW2pdLmVxdWFsc0lnbm9yZUNhc2UobWF0Y2gpKQotCQkJCQkJcmV0dXJuIGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciByZWFkRmlsZShGaWxlIHRhcmdldE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtUmVhZGVyIHJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHRhcmdldE5hbWUpKSk7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNoYXJbXSBidWYgPSBuZXcgY2hhcls0MDk2XTsKLQkJaW50IGNvdW50OwotCQl0cnkgewotCQkJY291bnQgPSByZWFkZXIucmVhZChidWYsIDAsIGJ1Zi5sZW5ndGgpOwotCQkJd2hpbGUgKGNvdW50ICE9IC0xKSB7Ci0JCQkJcmVzdWx0LmFwcGVuZChidWYsIDAsIGNvdW50KTsKLQkJCQljb3VudCA9IHJlYWRlci5yZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCXJlYWRlci5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZSBleGNlcHRpb25zIGhlcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCB0cmFuc2ZlclN0cmVhbXMoSW5wdXRTdHJlYW0gc291cmNlLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXNvdXJjZSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvdXJjZSk7Ci0JCWRlc3RpbmF0aW9uID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uKTsKLQkJdHJ5IHsKLQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJaW50IGJ5dGVzUmVhZCA9IC0xOwotCQkJCWlmICgoYnl0ZXNSZWFkID0gc291cmNlLnJlYWQoYnVmZmVyKSkgPT0gLTEpCi0JCQkJCWJyZWFrOwotCQkJCWRlc3RpbmF0aW9uLndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJc291cmNlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQl0cnkgewotCQkJCWRlc3RpbmF0aW9uLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPUyhTdHJpbmcgdmFsdWUpIHsKLQkJb3MgPSB2YWx1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyYy9vcmcvZWNsaXBzZS9wZGUvaW50ZXJuYWwvc3d0L3Rvb2xzL0ljb25FeGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL3BkZS9pbnRlcm5hbC9zd3QvdG9vbHMvSWNvbkV4ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTZlN2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjL29yZy9lY2xpcHNlL3BkZS9pbnRlcm5hbC9zd3QvdG9vbHMvSWNvbkV4ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLnBkZS5pbnRlcm5hbC5zd3QudG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogQ3VzdG9taXplIHRoZSBpY29uIG9mIGEgV2luZG93cyBleGUKLSAqIAotICogV0FSTklORyEgVGhpcyBjbGFzcyBpcyBub3QgcGFydCBvZiBTV1QgQVBJLiBJdCBpcyBOT1QgQVBJLiBJdCBpcyBhbiBpbnRlcm5hbAotICogdG9vbCB0aGF0IG1heSBiZSBjaGFuZ2VkIG9yIHJlbW92ZWQgYXQgYW55dGltZS4KLSAqIAotICogQmFzZWQgb24gTVNETiAiQW4gSW4tRGVwdGggTG9vayBpbnRvIHRoZSBXaW4zMiBQb3J0YWJsZSBFeGVjdXRhYmxlIEZpbGUgRm9ybWF0IgotICovCi1wdWJsaWMgY2xhc3MgSWNvbkV4ZSB7Ci0JCi0JIC8qKgotCSAqIFJlcGxhY2UgdGhlIERlc2t0b3AgaWNvbnMgcHJvdmlkZWQgaW4gdGhlIFdpbmRvd3MgZXhlY3V0YWJsZSBwcm9ncmFtCi0JICogd2l0aCBtYXRjaGluZyBpY29ucyBwcm92aWRlZCBieSB0aGUgdXNlci4KLQkgKgotIAkgKiBUYWtlcyAyIGFyZ3VtZW50cwotCSAqIGFyZ3VtZW50IDA6IHRoZSBXaW5kb3dzIGV4ZWN1dGFibGUgZS5nIGM6L2VjbGlwc2UvZWNsaXBzZS5leGUKLQkgKiBhcmd1bWVudCAxOiBUaGUgLmljbyBmaWxlIHRvIHdyaXRlIHRvIHRoZSBnaXZlbiBleGVjdXRhYmxlIGUuZy4gYzovbXlBcHAuaWNvCi0JICoKLQkgKiBOb3RlIDEuIFdyaXRlIGFjY2VzcyB0byB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGlzIHJlcXVpcmVkLiBBcyBhIHJlc3VsdCwgdGhhdAotCSAqIHByb2dyYW0gbXVzdCBub3QgYmUgY3VycmVudGx5IHJ1bm5pbmcgb3IgZWRpdGVkIGVsc2V3aGVyZS4KLQkgKiAKLQkgKiBOb3RlIDIuICBUaGUgRWNsaXBzZSAzLjEgbGF1bmNoZXIgcmVxdWlyZXMgYSAuaWNvIGZpbGUgd2l0aCB0aGUgZm9sbG93aW5nIDYgaW1hZ2VzCi0JICogMS4gMzJ4MzIsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDIuIDE2eDE2LCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiAzLiAxNngxNiwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogNC4gMzJ4MzIsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIDUuIDQ4eDQ4LCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiA2LiA0OHg0OCwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogQSB1c2VyIGljb24gbWF0Y2hpbmcgZXhhY3RseSB0aGUgd2lkdGgvaGVpZ2h0L2RlcHRoIG9mIGFuIGV4ZWN1dGFibGUgaWNvbiB3aWxsIGJlIHdyaXR0ZW4KLQkgKiB0byB0aGUgZXhlY3V0YWJsZSBhbmQgd2lsbCByZXBsYWNlIHRoYXQgZXhlY3V0YWJsZSBpY29uLiBJZiBhbiBleGVjdXRhYmxlIGljb24KLQkgKiBkb2VzIG5vdCBtYXRjaCBhIHVzZXIgaWNvbiwgaXQgaXMgc2lsZW50bHkgbGVmdCBhcyBpcy4KLQkgKiAKLQkgKiBOb3RlIDMuIFRoaXMgZnVuY3Rpb24gbW9kaWZpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbSBhbmQgbWF5IGNhdXNlCi0JICogaXRzIGNvcnJ1cHRpb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChhcmdzLmxlbmd0aCA8IDIpIHsKLQkJCVN5c3RlbS5lcnIucHJpbnRsbigiVXNhZ2U6IEljb25FeGUgPHdpbmRvd3MgZXhlY3V0YWJsZT4gPGljbyBmaWxlPiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJSW1hZ2VMb2FkZXIgbG9hZGVyID0gbmV3IEltYWdlTG9hZGVyKCk7Ci0KLQkJTGlzdCBpbWFnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgYXJncy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQkvL0FuIElDTyBzaG91bGQgY29udGFpbiA3IGltYWdlcywgYSBCTVAgd2lsbCBjb250YWluIDEKLQkJCQlJbWFnZURhdGFbXSBjdXJyZW50ID0gbG9hZGVyLmxvYWQoYXJnc1tpXSk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjdXJyZW50Lmxlbmd0aDsgaisrKSB7Ci0JCQkJCWltYWdlcy5hZGQoY3VycmVudFtqXSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9pZ25vcmUgc28gdGhhdCB3ZSBwcm9jZXNzIHRoZSBvdGhlciBpbWFnZXMKLQkJCX0KLQkJfQotCQlJbWFnZURhdGFbXSBkYXRhID0gbmV3IEltYWdlRGF0YVtpbWFnZXMuc2l6ZSgpXTsKLQkJZGF0YSA9IChJbWFnZURhdGFbXSkgaW1hZ2VzLnRvQXJyYXkoZGF0YSk7Ci0JCQotCQlpbnQgbk1pc3NpbmcgPSB1bmxvYWRJY29ucyhhcmdzWzBdLCBkYXRhKTsKLQkJaWYgKG5NaXNzaW5nICE9IDApCi0JCQlTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yIC0gIiArIG5NaXNzaW5nICsgIiBpY29uKHMpIG5vdCByZXBsYWNlZCBpbiAiICsgYXJnc1swXSArICIgdXNpbmcgIiArIGFyZ3NbMV0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQkKLQkvKiBJbXBsZW1lbnRhdGlvbiAqLwotCi0JLyoqIAotCSAqIFJldHJpZXZlIHRoZSBEZXNrdG9wIGljb25zIHByb3ZpZGVkIGluIHRoZSBXaW5kb3dzIGV4ZWN1dGFibGUgcHJvZ3JhbS4KLQkgKiBUaGVzZSBpY29ucyBhcmUgdHlwaWNhbGx5IHNob3duIGluIHZhcmlvdXMgcGxhY2VzIG9mIHRoZSBXaW5kb3dzIGRlc2t0b3AuCi0JICogCi0JICogTm90ZS4gIFRoZSBFY2xpcHNlIDMuMSBsYXVuY2hlciByZXR1cm5zIHRoZSBmb2xsb3dpbmcgNiBpbWFnZXMKLQkgKiAxLiAzMngzMiwgNCBiaXQgKFdpbmRvd3MgMTYgY29sb3JzIHBhbGV0dGUpCi0JICogMi4gMTZ4MTYsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDMuIDE2eDE2LCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiA0LiAzMngzMiwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogNS4gNDh4NDgsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDYuIDQ4eDQ4LCA4IGJpdCAoMjU2IGNvbG9ycykKLQkgKiAKLQkgKiBAcGFyYW0gcHJvZ3JhbSB0aGUgV2luZG93cyBleGVjdXRhYmxlIGUuZyBjOi9lY2xpcHNlL2VjbGlwc2UuZXhlCi0JICovCQotCXN0YXRpYyBJbWFnZURhdGFbXSBsb2FkSWNvbnMoU3RyaW5nIHByb2dyYW0pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShwcm9ncmFtLCAiciIpOyAvLyROT04tTkxTLTEkCi0JCUljb25FeGUgaWNvbkV4ZSA9IG5ldyBJY29uRXhlKCk7Ci0JCUljb25SZXNJbmZvW10gaWNvbkluZm8gPSBpY29uRXhlLmdldEljb25zKHJhZik7Ci0JCUltYWdlRGF0YVtdIGRhdGEgPSBuZXcgSW1hZ2VEYXRhW2ljb25JbmZvLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgZGF0YVtpXSA9IGljb25JbmZvW2ldLmRhdGE7Ci0JCXJhZi5jbG9zZSgpOwotCQlyZXR1cm4gZGF0YTsKLQl9Ci0JCi0JLyoqIAotCSAqIFJlcGxhY2UgdGhlIERlc2t0b3AgaWNvbnMgcHJvdmlkZWQgaW4gdGhlIFdpbmRvd3MgZXhlY3V0YWJsZSBwcm9ncmFtCi0JICogd2l0aCBpY29ucyBwcm92aWRlZCBieSB0aGUgdXNlci4KLQkgKiAKLQkgKiBOb3RlIDEuIFdyaXRlIGFjY2VzcyB0byB0aGUgZXhlY3V0YWJsZSBwcm9ncmFtIGlzIHJlcXVpcmVkLiBBcyBhIHJlc3VsdCwgdGhhdAotCSAqIHByb2dyYW0gbXVzdCBub3QgYmUgY3VycmVudGx5IHJ1bm5pbmcgb3IgZWRpdGVkIGVsc2V3aGVyZS4KLQkgKiAKLQkgKiBOb3RlIDIuIFVzZSBsb2FkSWNvbnMgdG8gZGV0ZXJtaW5lIHdoaWNoIHNldCBvZiBpY29ucyAod2lkdGgsIGhlaWdodCwgZGVwdGgpCi0JICogaXMgcmVxdWlyZWQgdG8gcmVwbGFjZSB0aGUgaWNvbnMgaW4gdGhlIGV4ZWN1dGFibGUgcHJvZ3JhbS4gQSB1c2VyIGljb24KLQkgKiBtYXRjaGluZyBleGFjdGx5IHRoZSB3aWR0aC9oZWlnaHQvZGVwdGggb2YgYW4gZXhlY3V0YWJsZSBpY29uIHdpbGwgYmUgd3JpdHRlbgotCSAqIHRvIHRoZSBleGVjdXRhYmxlIGFuZCB3aWxsIHJlcGxhY2UgdGhhdCBleGVjdXRhYmxlIGljb24uIElmIGFuIGV4ZWN1dGFibGUgaWNvbgotCSAqIGRvZXMgbm90IG1hdGNoIGEgdXNlciBpY29uLCBpdCBpcyBsZWZ0IGFzIGlzLiBWZXJpZnkgdGhlIHJldHVybiB2YWx1ZSBtYXRjaGVzCi0JICogdGhlIG51bWJlciBvZiBpY29ucyB0byB3cml0ZS4gRmluYWxseSwgdXNlIGxvYWRJY29ucyBhZnRlciB0aGlzIG9wZXJhdGlvbgotCSAqIHRvIHZlcmlmeSB0aGUgaWNvbnMgaGF2ZSBjaGFuZ2VkIGFzIGV4cGVjdGVkLgotCSAqIAotCSAqIE5vdGUgMy4gVGhlIEVjbGlwc2UgMy4xIGxhdW5jaGVyIHJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgNiBpbWFnZXMgKGluIGFueSBvcmRlcikuCi0JICogMS4gMzJ4MzIsIDQgYml0IChXaW5kb3dzIDE2IGNvbG9ycyBwYWxldHRlKQotCSAqIDIuIDE2eDE2LCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiAzLiAxNngxNiwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogNC4gMzJ4MzIsIDggYml0ICgyNTYgY29sb3JzKQotCSAqIDUuIDQ4eDQ4LCA0IGJpdCAoV2luZG93cyAxNiBjb2xvcnMgcGFsZXR0ZSkKLQkgKiA2LiA0OHg0OCwgOCBiaXQgKDI1NiBjb2xvcnMpCi0JICogCi0JICogTm90ZSA0LiBUaGlzIGZ1bmN0aW9uIG1vZGlmaWVzIHRoZSBjb250ZW50IG9mIHRoZSBleGVjdXRhYmxlIHByb2dyYW0gYW5kIG1heSBjYXVzZQotCSAqIGl0cyBjb3JydXB0aW9uLiAKLQkgKiAKLQkgKiBAcGFyYW0gcHJvZ3JhbSB0aGUgV2luZG93cyBleGVjdXRhYmxlIGUuZyBjOi9lY2xpcHNlL2VjbGlwc2UuZXhlCi0JICogQHBhcmFtIGljb25zIHRvIHdyaXRlIHRvIHRoZSBnaXZlbiBleGVjdXRhYmxlCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGljb25zIGZyb20gdGhlIG9yaWdpbmFsIHByb2dyYW0gdGhhdCB3ZXJlIG5vdCBzdWNjZXNzZnVsbHkgcmVwbGFjZWQgKDAgaWYgc3VjY2VzcykKLQkgKi8JCi0Jc3RhdGljIGludCB1bmxvYWRJY29ucyhTdHJpbmcgcHJvZ3JhbSwgSW1hZ2VEYXRhW10gaWNvbnMpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJUmFuZG9tQWNjZXNzRmlsZSByYWYgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShwcm9ncmFtLCAicnciKTsgLy8kTk9OLU5MUy0xJAotCQlJY29uRXhlIGljb25FeGUgPSBuZXcgSWNvbkV4ZSgpOwotCQlJY29uUmVzSW5mb1tdIGljb25JbmZvID0gaWNvbkV4ZS5nZXRJY29ucyhyYWYpOwotCQlpbnQgY250ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpY29uSW5mby5sZW5ndGg7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBpY29ucy5sZW5ndGg7IGorKykgewotCQkJCWlmIChpY29uc1tqXSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoaWNvbkluZm9baV0uZGF0YS53aWR0aCA9PSBpY29uc1tqXS53aWR0aCAmJiBpY29uSW5mb1tpXS5kYXRhLmhlaWdodCA9PSBpY29uc1tqXS5oZWlnaHQgJiYgaWNvbkluZm9baV0uZGF0YS5kZXB0aCA9PSBpY29uc1tqXS5kZXB0aCkgewotCQkJCQlyYWYuc2VlayhpY29uSW5mb1tpXS5vZmZzZXQpOwotCQkJCQl1bmxvYWRJY29uKHJhZiwgaWNvbnNbal0pOwotCQkJCQljbnQrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJhZi5jbG9zZSgpOwotCQlyZXR1cm4gaWNvbkluZm8ubGVuZ3RoIC0gY250OwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJTSU9OID0gIjIwMDUwMTI0IjsgLy8kTk9OLU5MUy0xJAotCQotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBjbGFzcyBJY29uUmVzSW5mbyB7Ci0JCUltYWdlRGF0YSBkYXRhOwotCQlpbnQgb2Zmc2V0OwotCQlpbnQgc2l6ZTsKLQl9Ci0JCi0JSWNvblJlc0luZm9bXSBpY29uSW5mbyA9IG51bGw7Ci0JaW50IGljb25DbnQ7Ci0JCi0JSWNvblJlc0luZm9bXSBnZXRJY29ucyhSYW5kb21BY2Nlc3NGaWxlIHJhZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWNvbkluZm8gPSBuZXcgSWNvblJlc0luZm9bNF07Ci0JCWljb25DbnQgPSAwOwotCQlJTUFHRV9ET1NfSEVBREVSIGltYWdlRG9zSGVhZGVyID0gbmV3IElNQUdFX0RPU19IRUFERVIoKTsKLQkJcmVhZChyYWYsIGltYWdlRG9zSGVhZGVyKTsKLQkJaWYgKGltYWdlRG9zSGVhZGVyLmVfbWFnaWMgIT0gSU1BR0VfRE9TX1NJR05BVFVSRSkgcmV0dXJuIG51bGw7Ci0JCWludCBpbWFnZU50SGVhZGVyc09mZnNldCA9IGltYWdlRG9zSGVhZGVyLmVfbGZhbmV3OwotCQlyYWYuc2VlayhpbWFnZU50SGVhZGVyc09mZnNldCk7Ci0JCUlNQUdFX05UX0hFQURFUlMgaW1hZ2VOdEhlYWRlcnMgPSBuZXcgSU1BR0VfTlRfSEVBREVSUygpOwotCQlyZWFkKHJhZiwgaW1hZ2VOdEhlYWRlcnMpOwotCQlpZiAoaW1hZ2VOdEhlYWRlcnMuU2lnbmF0dXJlICE9IElNQUdFX05UX1NJR05BVFVSRSkgcmV0dXJuIG51bGw7Ci0JCQotCQkvLyBEdW1wUmVzb3VyY2VzCi0JCWludCByZXNvdXJjZXNSVkEgPSBpbWFnZU50SGVhZGVycy5PcHRpb25hbEhlYWRlci5EYXRhRGlyZWN0b3J5W0lNQUdFX0RJUkVDVE9SWV9FTlRSWV9SRVNPVVJDRV0uVmlydHVhbEFkZHJlc3M7Ci0JCWlmIChyZXNvdXJjZXNSVkEgPT0gMCkgcmV0dXJuIG51bGw7Ci0JCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCIqIFJlc291cmNlcyAoUlZBPSAiK3Jlc291cmNlc1JWQSsiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJSU1BR0VfU0VDVElPTl9IRUFERVIgaW1hZ2VTZWN0aW9uSGVhZGVyID0gbmV3IElNQUdFX1NFQ1RJT05fSEVBREVSKCk7Ci0JCWludCBmaXJzdFNlY3Rpb25PZmZzZXQgPSBpbWFnZU50SGVhZGVyc09mZnNldCArIElNQUdFX05UX0hFQURFUlMuRklFTERfT0ZGU0VUX09wdGlvbmFsSGVhZGVyICsgaW1hZ2VOdEhlYWRlcnMuRmlsZUhlYWRlci5TaXplT2ZPcHRpb25hbEhlYWRlcjsKLQkJcmFmLnNlZWsoZmlyc3RTZWN0aW9uT2Zmc2V0KTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGltYWdlTnRIZWFkZXJzLkZpbGVIZWFkZXIuTnVtYmVyT2ZTZWN0aW9uczsgaSsrKSB7Ci0JCQlyZWFkKHJhZiwgaW1hZ2VTZWN0aW9uSGVhZGVyKTsKLQkJCWlmIChyZXNvdXJjZXNSVkEgPj0gaW1hZ2VTZWN0aW9uSGVhZGVyLlZpcnR1YWxBZGRyZXNzICYmIHJlc291cmNlc1JWQSA8IGltYWdlU2VjdGlvbkhlYWRlci5WaXJ0dWFsQWRkcmVzcyArIGltYWdlU2VjdGlvbkhlYWRlci5NaXNjX1ZpcnR1YWxTaXplKSB7Ci0JCQkJLy8gY291bGQgY2hlY2sgdGhlIGltYWdlU2VjdGlvbkhlYWRlciBuYW1lIGlzIC5yc3JjCi0JCQkJZm91bmQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghZm91bmQpIHJldHVybiBudWxsOwotCQlpbnQgZGVsdGEgPSBpbWFnZVNlY3Rpb25IZWFkZXIuVmlydHVhbEFkZHJlc3MgLSBpbWFnZVNlY3Rpb25IZWFkZXIuUG9pbnRlclRvUmF3RGF0YTsKLQkJaW50IGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQgPSByZXNvdXJjZXNSVkEgLSBkZWx0YTsKLQkJZHVtcFJlc291cmNlRGlyZWN0b3J5KHJhZiwgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeU9mZnNldCwgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeU9mZnNldCwgZGVsdGEsIDAsIDAsIGZhbHNlKTsKLQkJaWYgKGljb25DbnQgPCBpY29uSW5mby5sZW5ndGgpIHsKLQkJCUljb25SZXNJbmZvW10gbmV3QXJyYXkgPSBuZXcgSWNvblJlc0luZm9baWNvbkNudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGljb25JbmZvLCAwLCBuZXdBcnJheSwgMCwgaWNvbkNudCk7Ci0JCQlpY29uSW5mbyA9IG5ld0FycmF5OwotCQl9Ci0JCXJldHVybiBpY29uSW5mbzsKLQl9Ci0KLXZvaWQgZHVtcFJlc291cmNlRGlyZWN0b3J5KFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBpbnQgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeU9mZnNldCwgaW50IHJlc291cmNlQmFzZSwgaW50IGRlbHRhLCBpbnQgdHlwZSwgaW50IGxldmVsLCBib29sZWFuIHJ0X2ljb25fcm9vdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiKiogTEVWRUwgIitsZXZlbCk7IC8vJE5PTi1OTFMtMSQKLQotCUlNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSBpbWFnZVJlc291cmNlRGlyZWN0b3J5ID0gbmV3IElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSgpOwotCXJhZi5zZWVrKGltYWdlUmVzb3VyY2VEaXJlY3RvcnlPZmZzZXQpOwotCXJlYWQocmFmLCBpbWFnZVJlc291cmNlRGlyZWN0b3J5KTsKLQotCWlmIChERUJVRykgewotCQlTdHJpbmcgc1R5cGUgPSAiIit0eXBlOyAvLyROT04tTkxTLTEkCi0JCS8vIGxldmVsIDEgcmVzb3VyY2VzIGFyZSByZXNvdXJjZSB0eXBlcwotCQlpZiAobGV2ZWwgPT0gMSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJfX19fX19fX19fX19fX19fX19fX19fX19fX18iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHR5cGUgPT0gUlRfSUNPTikgc1R5cGUgPSAiUlRfSUNPTiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICh0eXBlID09IFJUX0dST1VQX0lDT04pIHNUeXBlID0gIlJUX0dST1VQX0lDT04iOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBEaXJlY3RvcnkgWyIrc1R5cGUrIl0iKyIgKE5hbWVkICIraW1hZ2VSZXNvdXJjZURpcmVjdG9yeS5OdW1iZXJPZk5hbWVkRW50cmllcysiLCBJRCAiK2ltYWdlUmVzb3VyY2VEaXJlY3RvcnkuTnVtYmVyT2ZJZEVudHJpZXMrIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JfQotCi0JSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZW10gaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXMgPSBuZXcgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZW2ltYWdlUmVzb3VyY2VEaXJlY3RvcnkuTnVtYmVyT2ZJZEVudHJpZXNdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXNbaV0gPSBuZXcgSU1BR0VfUkVTT1VSQ0VfRElSRUNUT1JZX0VOVFJZKCk7Ci0JCXJlYWQocmFmLCBpbWFnZVJlc291cmNlRGlyZWN0b3J5RW50cmllc1tpXSk7Ci0JfQotCWZvciAoaW50IGkgPSAwOyBpIDwgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJaWYgKGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldLkRhdGFJc0RpcmVjdG9yeSkgewotCQkJZHVtcFJlc291cmNlRGlyZWN0b3J5KHJhZiwgaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXNbaV0uT2Zmc2V0VG9EaXJlY3RvcnkgKyByZXNvdXJjZUJhc2UsIHJlc291cmNlQmFzZSwgZGVsdGEsIGltYWdlUmVzb3VyY2VEaXJlY3RvcnlFbnRyaWVzW2ldLklkLCBsZXZlbCArIDEsIHJ0X2ljb25fcm9vdCA/IHRydWUgOiB0eXBlID09IFJUX0lDT04pOwotCQl9IGVsc2UgewotCQkJLy8gUmVzb3VyY2UgZm91bmQKLQkJCS8vLyBwUmVzRGlyRW50cnktPk5hbWUKLQkJCUlNQUdFX1JFU09VUkNFX0RJUkVDVE9SWV9FTlRSWSBpcmRlID0gaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXNbaV07Ci0JCQlJTUFHRV9SRVNPVVJDRV9EQVRBX0VOVFJZIGRhdGEgPSBuZXcgSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSgpOwotCQkJcmFmLnNlZWsoaW1hZ2VSZXNvdXJjZURpcmVjdG9yeUVudHJpZXNbaV0uT2Zmc2V0VG9EYXRhICsgcmVzb3VyY2VCYXNlKTsKLQkJCXJlYWQocmFmLCBkYXRhKTsKLQkJCWlmIChERUJVRykgU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBJZCAiK2lyZGUuSWQrIiBEYXRhIE9mZnNldCBSVkEgIitkYXRhLk9mZnNldFRvRGF0YSsiLCBTaXplICIrZGF0YS5TaXplKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCWlmIChydF9pY29uX3Jvb3QpIHsKLQkJCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiaWNvbmNudCAiK2ljb25DbnQrIiB8IitpY29uSW5mby5sZW5ndGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlpY29uSW5mb1tpY29uQ250XSA9IG5ldyBJY29uUmVzSW5mbygpOwotCQkJCWljb25JbmZvW2ljb25DbnRdLmRhdGEgPSBwYXJzZUljb24ocmFmLCBkYXRhLk9mZnNldFRvRGF0YSAtIGRlbHRhLCBkYXRhLlNpemUpOwotCQkJCWljb25JbmZvW2ljb25DbnRdLm9mZnNldCA9IGRhdGEuT2Zmc2V0VG9EYXRhIC0gZGVsdGE7Ci0JCQkJaWNvbkluZm9baWNvbkNudF0uc2l6ZSA9IGRhdGEuU2l6ZTsJCi0JCQkJaWNvbkNudCsrOwotCQkJCWlmIChpY29uQ250ID09IGljb25JbmZvLmxlbmd0aCkgewotCQkJCQlJY29uUmVzSW5mb1tdIG5ld0FycmF5ID0gbmV3IEljb25SZXNJbmZvW2ljb25JbmZvLmxlbmd0aCArIDRdOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGljb25JbmZvLCAwLCBuZXdBcnJheSwgMCwgaWNvbkluZm8ubGVuZ3RoKTsKLQkJCQkJaWNvbkluZm8gPSBuZXdBcnJheTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLSAJfQotfQotCi1zdGF0aWMgSW1hZ2VEYXRhIHBhcnNlSWNvbihSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IG9mZnNldCwgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmFmLnNlZWsob2Zmc2V0KTsKLQlCSVRNQVBJTkZPIGJpdG1hcEluZm8gPSBuZXcgQklUTUFQSU5GTygpOwotCXJlYWQocmFmLCBiaXRtYXBJbmZvKTsKLQliaXRtYXBJbmZvLmJtaUhlYWRlci5iaUhlaWdodCAvPSAyOwotCWludCB3aWR0aCA9IGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpV2lkdGg7Ci0JaW50IGhlaWdodCA9IGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpSGVpZ2h0OwotCWludCBkZXB0aCA9IGJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQml0Q291bnQ7Ci0KLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbG9hZFBhbGV0dGUoYml0bWFwSW5mby5ibWlIZWFkZXIsIHJhZik7Ci0JYnl0ZVtdIHNoYXBlRGF0YSA9IGxvYWREYXRhKGJpdG1hcEluZm8uYm1pSGVhZGVyLCByYWYpOwotCWJpdG1hcEluZm8uYm1pSGVhZGVyLmJpQml0Q291bnQgPSAxOwotCWJ5dGVbXSBtYXNrRGF0YSA9IGxvYWREYXRhKGJpdG1hcEluZm8uYm1pSGVhZGVyLCByYWYpOwotCW1hc2tEYXRhID0gY29udmVydFBhZChtYXNrRGF0YSwgd2lkdGgsIGhlaWdodCwgMSwgNCwgMik7Ci0JYml0SW52ZXJ0RGF0YShtYXNrRGF0YSwgMCwgbWFza0RhdGEubGVuZ3RoKTsKLQlyZXR1cm4gSW1hZ2VEYXRhLmludGVybmFsX25ldygKLQkJd2lkdGgsCi0JCWhlaWdodCwKLQkJZGVwdGgsCi0JCXBhbGV0dGUsCi0JCTQsCi0JCXNoYXBlRGF0YSwKLQkJMiwKLQkJbWFza0RhdGEsCi0JCW51bGwsCi0JCS0xLAotCQktMSwKLQkJU1dULklNQUdFX0lDTywKLQkJMCwKLQkJMCwKLQkJMCwKLQkJMCk7Ci19Ci0KLXN0YXRpYyBieXRlW10gYml0SW52ZXJ0RGF0YShieXRlW10gZGF0YSwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotCS8vIERlc3RydWN0aXZlbHkgYml0IGludmVydCBkYXRhIGluIHRoZSBnaXZlbiBieXRlIGFycmF5LgotCWZvciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDwgZW5kSW5kZXg7IGkrKykgewotCQlkYXRhW2ldID0gKGJ5dGUpKDI1NSAtIGRhdGFbaSAtIHN0YXJ0SW5kZXhdKTsKLQl9Ci0JcmV0dXJuIGRhdGE7Ci19Ci0KLXN0YXRpYyBmaW5hbCBieXRlW10gY29udmVydFBhZChieXRlW10gZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIGludCBwYWQsIGludCBuZXdQYWQpIHsKLQlpZiAocGFkID09IG5ld1BhZCkgcmV0dXJuIGRhdGE7Ci0JaW50IHN0cmlkZSA9ICh3aWR0aCAqIGRlcHRoICsgNykgLyA4OwotCWludCBicGwgPSAoc3RyaWRlICsgKHBhZCAtIDEpKSAvIHBhZCAqIHBhZDsKLQlpbnQgbmV3QnBsID0gKHN0cmlkZSArIChuZXdQYWQgLSAxKSkgLyBuZXdQYWQgKiBuZXdQYWQ7Ci0JYnl0ZVtdIG5ld0RhdGEgPSBuZXcgYnl0ZVtoZWlnaHQgKiBuZXdCcGxdOwotCWludCBzcmNJbmRleCA9IDAsIGRlc3RJbmRleCA9IDA7Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIHNyY0luZGV4LCBuZXdEYXRhLCBkZXN0SW5kZXgsIG5ld0JwbCk7Ci0JCXNyY0luZGV4ICs9IGJwbDsKLQkJZGVzdEluZGV4ICs9IG5ld0JwbDsKLQl9Ci0JcmV0dXJuIG5ld0RhdGE7Ci19Ci1zdGF0aWMgUGFsZXR0ZURhdGEgbG9hZFBhbGV0dGUoQklUTUFQSU5GT0hFQURFUiBiaWgsIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBkZXB0aCA9IGJpaC5iaUJpdENvdW50OwotCWlmIChkZXB0aCA8PSA4KSB7Ci0JCWludCBudW1Db2xvcnMgPSBiaWguYmlDbHJVc2VkOwotCQlpZiAobnVtQ29sb3JzID09IDApIHsKLQkJCW51bUNvbG9ycyA9IDEgPDwgZGVwdGg7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAobnVtQ29sb3JzID4gMjU2KQotCQkJCW51bUNvbG9ycyA9IDI1NjsKLQkJfQotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbbnVtQ29sb3JzICogNF07Ci0JCXJhZi5yZWFkKGJ1Zik7Ci0JCXJldHVybiBwYWxldHRlRnJvbUJ5dGVzKGJ1ZiwgbnVtQ29sb3JzKTsKLQl9Ci0JaWYgKGRlcHRoID09IDE2KSByZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4N0MwMCwgMHgzRTAsIDB4MUYpOwotCWlmIChkZXB0aCA9PSAyNCkgcmV0dXJuIG5ldyBQYWxldHRlRGF0YSgweEZGLCAweEZGMDAsIDB4RkYwMDAwKTsKLQlyZXR1cm4gbmV3IFBhbGV0dGVEYXRhKDB4RkYwMCwgMHhGRjAwMDAsIDB4RkYwMDAwMDApOwotfQotc3RhdGljIFBhbGV0dGVEYXRhIHBhbGV0dGVGcm9tQnl0ZXMoYnl0ZVtdIGJ5dGVzLCBpbnQgbnVtQ29sb3JzKSB7Ci0JaW50IGJ5dGVzT2Zmc2V0ID0gMDsKLQlSR0JbXSBjb2xvcnMgPSBuZXcgUkdCW251bUNvbG9yc107Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2xvcnM7IGkrKykgewotCQljb2xvcnNbaV0gPSBuZXcgUkdCKGJ5dGVzW2J5dGVzT2Zmc2V0ICsgMl0gJiAweEZGLAotCQkJYnl0ZXNbYnl0ZXNPZmZzZXQgKyAxXSAmIDB4RkYsCi0JCQlieXRlc1tieXRlc09mZnNldF0gJiAweEZGKTsKLQkJYnl0ZXNPZmZzZXQgKz0gNDsKLQl9Ci0JcmV0dXJuIG5ldyBQYWxldHRlRGF0YShjb2xvcnMpOwotfQotc3RhdGljIGJ5dGVbXSBsb2FkRGF0YShCSVRNQVBJTkZPSEVBREVSIGJpaCwgUmFuZG9tQWNjZXNzRmlsZSByYWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW50IHN0cmlkZSA9IChiaWguYmlXaWR0aCAqIGJpaC5iaUJpdENvdW50ICsgNykgLyA4OwotCXN0cmlkZSA9IChzdHJpZGUgKyAzKSAvIDQgKiA0OyAvLyBSb3VuZCB1cCB0byA0IGJ5dGUgbXVsdGlwbGUKLQlieXRlW10gZGF0YSA9IGxvYWREYXRhKGJpaCwgcmFmLCBzdHJpZGUpOwotCWZsaXBTY2FuTGluZXMoZGF0YSwgc3RyaWRlLCBiaWguYmlIZWlnaHQpOwotCXJldHVybiBkYXRhOwotfQotc3RhdGljIHZvaWQgZmxpcFNjYW5MaW5lcyhieXRlW10gZGF0YSwgaW50IHN0cmlkZSwgaW50IGhlaWdodCkgewotCWludCBpMSA9IDA7Ci0JaW50IGkyID0gKGhlaWdodCAtIDEpICogc3RyaWRlOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgaSsrKSB7Ci0JCWZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzdHJpZGU7IGluZGV4KyspIHsKLQkJCWJ5dGUgYiA9IGRhdGFbaW5kZXggKyBpMV07Ci0JCQlkYXRhW2luZGV4ICsgaTFdID0gZGF0YVtpbmRleCArIGkyXTsKLQkJCWRhdGFbaW5kZXggKyBpMl0gPSBiOwotCQl9Ci0JCWkxICs9IHN0cmlkZTsKLQkJaTIgLT0gc3RyaWRlOwotCX0KLX0KLXN0YXRpYyBieXRlW10gbG9hZERhdGEoQklUTUFQSU5GT0hFQURFUiBiaWgsIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBpbnQgc3RyaWRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBkYXRhU2l6ZSA9IGJpaC5iaUhlaWdodCAqIHN0cmlkZTsKLQlieXRlW10gZGF0YSA9IG5ldyBieXRlW2RhdGFTaXplXTsKLQlpbnQgY21wID0gYmloLmJpQ29tcHJlc3Npb247Ci0JaWYgKGNtcCA9PSAwKSB7IC8vIEJNUF9OT19DT01QUkVTU0lPTgotCQlyYWYucmVhZChkYXRhKTsKLQl9IGVsc2UgewotCQlpZiAoREVCVUcpIFN5c3RlbS5vdXQucHJpbnRsbigiSUNPIGNhbm5vdCBiZSBjb21wcmVzc2VkPyIpOyAvLyROT04tTkxTLTEkCi0JfQotCXJldHVybiBkYXRhOwotfQotCi1zdGF0aWMgdm9pZCB1bmxvYWRJY29uKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJbWFnZURhdGEgaWNvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpbnQgc2l6ZUltYWdlID0gKCgoaWNvbi53aWR0aCAqIGljb24uZGVwdGggKyAzMSkgLyAzMiAqIDQpICsKLQkJKChpY29uLndpZHRoICsgMzEpIC8gMzIgKiA0KSkgKiBpY29uLmhlaWdodDsKLQl3cml0ZTQocmFmLCBCTVBIZWFkZXJGaXhlZFNpemUpOwotCXdyaXRlNChyYWYsIGljb24ud2lkdGgpOwotCXdyaXRlNChyYWYsIGljb24uaGVpZ2h0ICogMik7Ci0Jd3JpdGVVMihyYWYsIDEpOwotCXdyaXRlVTIocmFmLCBpY29uLmRlcHRoKTsKLQl3cml0ZTQocmFmLCAwKTsKLQl3cml0ZTQocmFmLCBzaXplSW1hZ2UpOwotCXdyaXRlNChyYWYsIDApOwotCXdyaXRlNChyYWYsIDApOwotCXdyaXRlNChyYWYsIGljb24ucGFsZXR0ZS5jb2xvcnMgIT0gbnVsbCA/IGljb24ucGFsZXR0ZS5jb2xvcnMubGVuZ3RoIDogMCk7Ci0Jd3JpdGU0KHJhZiwgMCk7Ci0JCi0JYnl0ZVtdIHJnYnMgPSBwYWxldHRlVG9CeXRlcyhpY29uLnBhbGV0dGUpOwotCXJhZi53cml0ZShyZ2JzKTsKLQl1bmxvYWRTaGFwZURhdGEocmFmLCBpY29uKTsKLQl1bmxvYWRNYXNrRGF0YShyYWYsIGljb24pOwotfQotc3RhdGljIGJ5dGVbXSBwYWxldHRlVG9CeXRlcyhQYWxldHRlRGF0YSBwYWwpIHsKLQlpbnQgbiA9IHBhbC5jb2xvcnMgPT0gbnVsbCA/IDAgOiAocGFsLmNvbG9ycy5sZW5ndGggPCAyNTYgPyBwYWwuY29sb3JzLmxlbmd0aCA6IDI1Nik7Ci0JYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbiAqIDRdOwotCWludCBvZmZzZXQgPSAwOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCVJHQiBjb2wgPSBwYWwuY29sb3JzW2ldOwotCQlieXRlc1tvZmZzZXRdID0gKGJ5dGUpY29sLmJsdWU7Ci0JCWJ5dGVzW29mZnNldCArIDFdID0gKGJ5dGUpY29sLmdyZWVuOwotCQlieXRlc1tvZmZzZXQgKyAyXSA9IChieXRlKWNvbC5yZWQ7Ci0JCW9mZnNldCArPSA0OwotCX0KLQlyZXR1cm4gYnl0ZXM7Ci19Ci1zdGF0aWMgdm9pZCB1bmxvYWRNYXNrRGF0YShSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSW1hZ2VEYXRhIGljb24pIHsKLQlJbWFnZURhdGEgbWFzayA9IGljb24uZ2V0VHJhbnNwYXJlbmN5TWFzaygpOwotCWludCBicGwgPSAoaWNvbi53aWR0aCArIDcpIC8gODsKLQlpbnQgcGFkID0gbWFzay5zY2FubGluZVBhZDsKLQlpbnQgc3JjQnBsID0gKGJwbCArIHBhZCAtIDEpIC8gcGFkICogcGFkOwotCWludCBkZXN0QnBsID0gKGJwbCArIDMpIC8gNCAqIDQ7Ci0JYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlW2Rlc3RCcGxdOwotCWludCBvZmZzZXQgPSAoaWNvbi5oZWlnaHQgLSAxKSAqIHNyY0JwbDsKLQlieXRlW10gZGF0YSA9IG1hc2suZGF0YTsKLQl0cnkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGljb24uaGVpZ2h0OyBpKyspIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgb2Zmc2V0LCBidWYsIDAsIGJwbCk7Ci0JCQliaXRJbnZlcnREYXRhKGJ1ZiwgMCwgYnBsKTsKLQkJCXJhZi53cml0ZShidWYsIDAsIGRlc3RCcGwpOwotCQkJb2Zmc2V0IC09IHNyY0JwbDsKLQkJfQotCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTywgZSk7Ci0JfQotfQotc3RhdGljIHZvaWQgdW5sb2FkU2hhcGVEYXRhKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJbWFnZURhdGEgaWNvbikgewotCWludCBicGwgPSAoaWNvbi53aWR0aCAqIGljb24uZGVwdGggKyA3KSAvIDg7Ci0JaW50IHBhZCA9IGljb24uc2NhbmxpbmVQYWQ7Ci0JaW50IHNyY0JwbCA9IChicGwgKyBwYWQgLSAxKSAvIHBhZCAqIHBhZDsKLQlpbnQgZGVzdEJwbCA9IChicGwgKyAzKSAvIDQgKiA0OwotCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtkZXN0QnBsXTsKLQlpbnQgb2Zmc2V0ID0gKGljb24uaGVpZ2h0IC0gMSkgKiBzcmNCcGw7Ci0JYnl0ZVtdIGRhdGEgPSBpY29uLmRhdGE7Ci0JdHJ5IHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpY29uLmhlaWdodDsgaSsrKSB7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIG9mZnNldCwgYnVmLCAwLCBicGwpOwotCQkJcmFmLndyaXRlKGJ1ZiwgMCwgZGVzdEJwbCk7Ci0JCQlvZmZzZXQgLT0gc3JjQnBsOwotCQl9Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci19Ci1zdGF0aWMgYm9vbGVhbiByZWFkSWNvbkdyb3VwKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyYWYuc2VlayhvZmZzZXQpOwotCU5FV0hFQURFUiBuZXdIZWFkZXIgPSBuZXcgTkVXSEVBREVSKCk7Ci0JcmVhZChyYWYsIG5ld0hlYWRlcik7Ci0JaWYgKG5ld0hlYWRlci5SZXNUeXBlICE9IFJFU19JQ09OKSByZXR1cm4gZmFsc2U7Ci0JUkVTRElSW10gcmVzRGlyID0gbmV3IFJFU0RJUltuZXdIZWFkZXIuUmVzQ291bnRdOwotCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3SGVhZGVyLlJlc0NvdW50OyBpKyspIHsKLQkJcmVzRGlyW2ldID0gbmV3IFJFU0RJUigpOwotCQlyZWFkKHJhZiwgcmVzRGlyW2ldKTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlGaWxlKFN0cmluZyBzcmMsIFN0cmluZyBkc3QpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQlGaWxlIHNyY0ZpbGUgPSBuZXcgRmlsZShzcmMpOwotCUZpbGUgZHN0RmlsZSA9IG5ldyBGaWxlKGRzdCk7Ci0JSW5wdXRTdHJlYW0gaW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHNyY0ZpbGUpKTsKLQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRzdEZpbGUpKTsKLQlpbnQgYzsKLQl3aGlsZSAoKGMgPSBpbi5yZWFkKCkpICE9IC0xKSBvdXQud3JpdGUoYyk7IAotCWluLmNsb3NlKCk7Ci0Jb3V0LmNsb3NlKCk7Ci19Ci0KLS8qIElPIHV0aWxpdGllcyB0byBwYXJzZSBXaW5kb3dzIGV4ZWN1dGFibGUgKi8KLXN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfRE9TX1NJR05BVFVSRSA9IDB4NWE0ZDsKLXN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfTlRfU0lHTkFUVVJFID0gMHgwMDAwNDU1MDsKLXN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfRElSRUNUT1JZX0VOVFJZX1JFU09VUkNFID0gMjsKLXN0YXRpYyBmaW5hbCBpbnQgUkVTX0lDT04gPSAxOwotc3RhdGljIGZpbmFsIGludCBSVF9JQ09OID0gMzsKLXN0YXRpYyBmaW5hbCBpbnQgUlRfR1JPVVBfSUNPTiA9IDE0Owotc3RhdGljIGZpbmFsIGludCBCTVBIZWFkZXJGaXhlZFNpemUgPSA0MDsKLQkKLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfRE9TX0hFQURFUiB7Ci0JaW50IGVfbWFnaWM7IC8vIFdPUkQKLQlpbnQgZV9jYmxwOyAvLyBXT1JECi0JaW50IGVfY3A7IC8vIFdPUkQKLQlpbnQgZV9jcmxjOyAvLyBXT1JECi0JaW50IGVfY3BhcmhkcjsgLy8gV09SRAotCWludCBlX21pbmFsbG9jOyAvLyBXT1JECi0JaW50IGVfbWF4YWxsb2M7IC8vIFdPUkQKLQlpbnQgZV9zczsgLy8gV09SRAotCWludCBlX3NwOyAvLyBXT1JECi0JaW50IGVfY3N1bTsgLy8gV09SRAotCWludCBlX2lwOyAvLyBXT1JECi0JaW50IGVfY3M7IC8vIFdPUkQKLQlpbnQgZV9sZmFybGM7IC8vIFdPUkQKLQlpbnQgZV9vdm5vOyAvLyBXT1JECi0JaW50W10gZV9yZXMgPSBuZXcgaW50WzRdOyAvLyBXT1JEWzRdCi0JaW50IGVfb2VtaWQ7IC8vIFdPUkQKLQlpbnQgZV9vZW1pbmZvOyAvLyBXT1JECi0JaW50W10gZV9yZXMyID0gbmV3IGludFsxMF07IC8vIFdPUkRbMTBdCi0JaW50IGVfbGZhbmV3OyAvLyBMT05HCi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfRklMRV9IRUFERVIgewotCWludCBNYWNoaW5lOyAvLyBXT1JECi0JaW50IE51bWJlck9mU2VjdGlvbnM7IC8vIFdPUkQKLQlpbnQgVGltZURhdGVTdGFtcDsgLy8gRFdPUkQKLQlpbnQgUG9pbnRlclRvU3ltYm9sVGFibGU7IC8vIERXT1JECi0JaW50IE51bWJlck9mU3ltYm9sczsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mT3B0aW9uYWxIZWFkZXI7IC8vIFdPUkQKLQlpbnQgQ2hhcmFjdGVyaXN0aWNzOyAvLyBXT1JECi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfREFUQV9ESVJFQ1RPUlkgewotCWludCBWaXJ0dWFsQWRkcmVzczsgLy8gRFdPUkQKLQlpbnQgU2l6ZTsgLy8gRFdPUkQKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9PUFRJT05BTF9IRUFERVIgewotCWludCBNYWdpYzsgLy8gV09SRAotCWludCBNYWpvckxpbmtlclZlcnNpb247IC8vIEJZVEUKLQlpbnQgTWlub3JMaW5rZXJWZXJzaW9uOyAvLyBCWVRFCi0JaW50IFNpemVPZkNvZGU7IC8vIERXT1JECi0JaW50IFNpemVPZkluaXRpYWxpemVkRGF0YTsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mVW5pbml0aWFsaXplZERhdGE7IC8vIERXT1JECi0JaW50IEFkZHJlc3NPZkVudHJ5UG9pbnQ7IC8vIERXT1JECi0JaW50IEJhc2VPZkNvZGU7IC8vIERXT1JECi0JaW50IEJhc2VPZkRhdGE7IC8vIERXT1JECi0JaW50IEltYWdlQmFzZTsgLy8gRFdPUkQKLQlpbnQgU2VjdGlvbkFsaWdubWVudDsgLy8gRFdPUkQKLQlpbnQgRmlsZUFsaWdubWVudDsgLy8gRFdPUkQKLQlpbnQgTWFqb3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOyAvLyBXT1JECi0JaW50IE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsgLy8gV09SRAotCWludCBNYWpvckltYWdlVmVyc2lvbjsgLy8gV09SRAotCWludCBNaW5vckltYWdlVmVyc2lvbjsgLy8gV09SRAotCWludCBNYWpvclN1YnN5c3RlbVZlcnNpb247IC8vIFdPUkQKLQlpbnQgTWlub3JTdWJzeXN0ZW1WZXJzaW9uOyAvLyBXT1JECi0JaW50IFdpbjMyVmVyc2lvblZhbHVlOyAvLyBEV09SRAotCWludCBTaXplT2ZJbWFnZTsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mSGVhZGVyczsgLy8gRFdPUkQKLQlpbnQgQ2hlY2tTdW07IC8vIERXT1JECi0JaW50IFN1YnN5c3RlbTsgLy8gV09SRAotCWludCBEbGxDaGFyYWN0ZXJpc3RpY3M7IC8vIFdPUkQKLQlpbnQgU2l6ZU9mU3RhY2tSZXNlcnZlOyAvLyBEV09SRAotCWludCBTaXplT2ZTdGFja0NvbW1pdDsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mSGVhcFJlc2VydmU7IC8vIERXT1JECi0JaW50IFNpemVPZkhlYXBDb21taXQ7IC8vIERXT1JECi0JaW50IExvYWRlckZsYWdzOyAvLyBEV09SRAotCWludCBOdW1iZXJPZlJ2YUFuZFNpemVzOyAvLyBEV09SRAotCUlNQUdFX0RBVEFfRElSRUNUT1JZW10gRGF0YURpcmVjdG9yeSA9IG5ldyBJTUFHRV9EQVRBX0RJUkVDVE9SWVsxNl07Ci19Ci1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX05UX0hFQURFUlMgewotCWludCBTaWduYXR1cmU7IC8vIERXT1JECi0JSU1BR0VfRklMRV9IRUFERVIgRmlsZUhlYWRlciA9IG5ldyBJTUFHRV9GSUxFX0hFQURFUigpOwotCUlNQUdFX09QVElPTkFMX0hFQURFUiBPcHRpb25hbEhlYWRlciA9IG5ldyBJTUFHRV9PUFRJT05BTF9IRUFERVIoKTsKLQlmaW5hbCBzdGF0aWMgaW50IEZJRUxEX09GRlNFVF9PcHRpb25hbEhlYWRlciA9IDI0OyAgCi19Ci0JCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX1NFQ1RJT05fSEVBREVSIHsKLQlpbnRbXSBOYW1lID0gbmV3IGludFs4XTsgLy8gQllURVs4XQotCWludCBNaXNjX1ZpcnR1YWxTaXplOyAvLyBEV09SRCAodW5pb24gTWlzYyB7IERXT1JEIFBoeXNpY2FsQWRkcmVzczsgRFdPUkQgVmlydHVhbFNpemUgfQotCWludCBWaXJ0dWFsQWRkcmVzczsgLy8gRFdPUkQKLQlpbnQgU2l6ZU9mUmF3RGF0YTsgLy8gRFdPUkQKLQlpbnQgUG9pbnRlclRvUmF3RGF0YTsgLy8gRFdPUkQKLQlpbnQgUG9pbnRlclRvUmVsb2NhdGlvbnM7IC8vIERXT1JECi0JaW50IFBvaW50ZXJUb0xpbmVudW1iZXJzOyAvLyBEV09SRAotCWludCBOdW1iZXJPZlJlbG9jYXRpb25zOyAvLyBXT1JECi0JaW50IE51bWJlck9mTGluZW51bWJlcnM7IC8vIFdPUkQKLQlpbnQgQ2hhcmFjdGVyaXN0aWNzOyAvLyBEV09SRAotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSB7Ci0JaW50IENoYXJhY3RlcmlzdGljczsgLy8gRFdPUkQKLQlpbnQgVGltZURhdGVTdGFtcDsgLy8gRFdPUkQKLQlpbnQgTWFqb3JWZXJzaW9uOyAvLyBXT1JECi0JaW50IE1pbm9yVmVyc2lvbjsgLy8gV09SRAotCWludCBOdW1iZXJPZk5hbWVkRW50cmllczsgLy8gV09SRCAtIHVzZWQKLQlpbnQgTnVtYmVyT2ZJZEVudHJpZXM7IC8vIFdPUkQgLSB1c2VkCi0JZmluYWwgc3RhdGljIGludCBTSVpFT0YgPSAxNjsKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkgewotCS8vIHVuaW9uCi0JaW50IE5hbWVPZmZzZXQ7IC8vIERXT1JEIDMxIGJpdHMKLQlib29sZWFuIE5hbWVJc1N0cmluZzsgLy8gRFdPUkQgMSBiaXQKLQlpbnQgTmFtZTsgLy8gRFdPUkQKLQlpbnQgSWQ7IC8vIFdPUkQKLQkvLyB1bmlvbgotCWludCBPZmZzZXRUb0RhdGE7IC8vIERXT1JECi0JaW50IE9mZnNldFRvRGlyZWN0b3J5OyAvLyBEV09SRCAzMSBiaXRzCi0JYm9vbGVhbiBEYXRhSXNEaXJlY3Rvcnk7IC8vIERXT1JEIDEgYml0Ci19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSB7Ci0JaW50IE9mZnNldFRvRGF0YTsgLy8gRFdPUkQKLQlpbnQgU2l6ZTsgLy8gRFdPUkQKLQlpbnQgQ29kZVBhZ2U7IC8vIERXT1JECi0JaW50IFJlc2VydmVkOyAvLyBEV09SRAotfQotCi1wdWJsaWMgc3RhdGljIGNsYXNzIE5FV0hFQURFUiB7Ci0JaW50IFJlc2VydmVkOyAvLyBXT1JECi0JaW50IFJlc1R5cGU7IC8vIFdPUkQKLQlpbnQgUmVzQ291bnQ7IC8vIFdPUkQKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBJQ09OUkVTRElSIHsKLQlpbnQgV2lkdGg7IC8vIEJZVEUKLQlpbnQgSGVpZ2h0OyAvLyBCWVRFCi0JaW50IENvbG9yQ291bnQ7IC8vIEJZVEUKLQlpbnQgcmVzZXJ2ZWQ7IC8vIEJZVEUKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBDVVJTT1JESVIgewotCWludCBXaWR0aDsgLy8gV09SRAotCWludCBIZWlnaHQ7IC8vIFdPUkQKLX0KLQotcHVibGljIHN0YXRpYyBjbGFzcyBSRVNESVIgewotCS8vIHVuaW9uCi0JSUNPTlJFU0RJUiBJY29uID0gbmV3IElDT05SRVNESVIoKTsKLQlDVVJTT1JESVIgQ3Vyc29yID0gbmV3IENVUlNPUkRJUigpOwotCWludCBQbGFuZXM7IC8vIFdPUkQKLQlpbnQgQml0Q291bnQ7IC8vIFdPUkQKLQlpbnQgQnl0ZXNJblJlczsgLy8gRFdPUkQKLQlpbnQgSWNvbkN1cnNvcklkOyAvLyBXT1JECi19Ci0KLXB1YmxpYyBzdGF0aWMgY2xhc3MgQklUTUFQSU5GT0hFQURFUiB7Ci0JaW50IGJpU2l6ZTsgLy8gRFdPUkQKLQlpbnQgYmlXaWR0aDsgLy8gTE9ORwotCWludCBiaUhlaWdodDsgLy8gTE9ORwotCWludCBiaVBsYW5lczsgLy8gV09SRAotCWludCBiaUJpdENvdW50OyAvLyBXT1JECi0JaW50IGJpQ29tcHJlc3Npb247IC8vIERXT1JECi0JaW50IGJpU2l6ZUltYWdlOyAvLyBEV09SRAotCWludCBiaVhQZWxzUGVyTWV0ZXI7IC8vIExPTkcKLQlpbnQgYmlZUGVsc1Blck1ldGVyOyAvLyBMT05HCi0JaW50IGJpQ2xyVXNlZDsgLy8gRFdPUkQKLQlpbnQgYmlDbHJJbXBvcnRhbnQ7IC8vIERXT1JECi19Ci0KLXN0YXRpYyBjbGFzcyBSR0JRVUFEIHsKLQlpbnQgcmdCbHVlOyAvLyBCWVRFCi0JaW50IHJnYkdyZWVuOyAvLyBCWVRFCi0JaW50IHJnYlJlZDsgLy8gQllURQotCWludCByZ2JSZXNlcnZlZDsgLy8gQllURQotfQotc3RhdGljIGNsYXNzIEJJVE1BUElORk8gewotCUJJVE1BUElORk9IRUFERVIgYm1pSGVhZGVyID0gbmV3IEJJVE1BUElORk9IRUFERVIoKTsKLQlSR0JRVUFEW10gYm1pQ29sb3JzID0gbnVsbDsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIEJJVE1BUElORk9IRUFERVIgYmloKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJpaC5iaVNpemUgPSByZWFkNChyYWYpOwotCWJpaC5iaVdpZHRoID0gcmVhZDQocmFmKTsKLQliaWguYmlIZWlnaHQgPSByZWFkNChyYWYpOwotCWJpaC5iaVBsYW5lcyA9IHJlYWRVMihyYWYpOwotCWJpaC5iaUJpdENvdW50ID0gcmVhZFUyKHJhZik7Ci0JYmloLmJpQ29tcHJlc3Npb24gPSByZWFkNChyYWYpOwotCWJpaC5iaVNpemVJbWFnZSA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpWFBlbHNQZXJNZXRlciA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpWVBlbHNQZXJNZXRlciA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpQ2xyVXNlZCA9IHJlYWQ0KHJhZik7Ci0JYmloLmJpQ2xySW1wb3J0YW50ID0gcmVhZDQocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIEJJVE1BUElORk8gYmkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JcmVhZChyYWYsIGJpLmJtaUhlYWRlcik7Ci19Ci0vKiBMaXR0bGUgRW5kaWFuIGhlbHBlcnMgKi8KLXN0YXRpYyBpbnQgcmVhZFUyKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWludCBiMCA9IHJhZi5yZWFkQnl0ZSgpICYgMHhGRjsKLQlpbnQgYjEgPSByYWYucmVhZEJ5dGUoKSAmIDB4RkY7Ci0JcmV0dXJuIChiMSA8PCA4IHwgYjApOwotfQotc3RhdGljIGludCByZWFkNChSYW5kb21BY2Nlc3NGaWxlIHJhZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpbnQgYjAgPSByYWYucmVhZEJ5dGUoKSAmIDB4RkY7Ci0JaW50IGIxID0gcmFmLnJlYWRCeXRlKCkgJiAweEZGOwotCWludCBiMiA9IHJhZi5yZWFkQnl0ZSgpICYgMHhGRjsKLQlpbnQgYjMgPSByYWYucmVhZEJ5dGUoKSAmIDB4RkY7Ci0JcmV0dXJuIGIzIDw8IDI0IHwgYjIgPDwgMTYgfCBiMSA8PCA4IHwgYjA7Ci19Ci1zdGF0aWMgdm9pZCB3cml0ZTQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyYWYud3JpdGUodmFsdWUgJiAweEZGKTsKLQlyYWYud3JpdGUoKHZhbHVlID4+IDgpICYgMHhGRik7Ci0JcmFmLndyaXRlKCh2YWx1ZSA+PiAxNikgJiAweEZGKTsKLQlyYWYud3JpdGUoKHZhbHVlID4+IDI0KSAmIDB4RkYpOwotfQotc3RhdGljIHZvaWQgd3JpdGVVMihSYW5kb21BY2Nlc3NGaWxlIHJhZiwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXJhZi53cml0ZSh2YWx1ZSAmIDB4RkYpOwotCXJhZi53cml0ZSgodmFsdWUgPj4gOCkgJiAweEZGKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX0RPU19IRUFERVIgaWRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlkaC5lX21hZ2ljID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfY2JscCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NwID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfY3JsYyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NwYXJoZHIgPSByZWFkVTIocmFmKTsKLQlpZGguZV9taW5hbGxvYyA9IHJlYWRVMihyYWYpOwotCWlkaC5lX21heGFsbG9jID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfc3MgPSByZWFkVTIocmFmKTsKLQlpZGguZV9zcCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NzdW0gPSByZWFkVTIocmFmKTsKLQlpZGguZV9pcCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX2NzID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfbGZhcmxjID0gcmVhZFUyKHJhZik7Ci0JaWRoLmVfb3ZubyA9IHJlYWRVMihyYWYpOwotCWZvciAoaW50IGkgPSAwOyBpIDwgaWRoLmVfcmVzLmxlbmd0aDsgaSsrKSBpZGguZV9yZXNbaV0gPSByZWFkVTIocmFmKTsKLQlpZGguZV9vZW1pZCA9IHJlYWRVMihyYWYpOwotCWlkaC5lX29lbWluZm8gPSByZWFkVTIocmFmKTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGlkaC5lX3JlczIubGVuZ3RoOyBpKyspIGlkaC5lX3JlczJbaV0gPSByZWFkVTIocmFmKTsKLQlpZGguZV9sZmFuZXcgPSByZWFkNChyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfRklMRV9IRUFERVIgaWZoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlmaC5NYWNoaW5lID0gcmVhZFUyKHJhZik7Ci0JaWZoLk51bWJlck9mU2VjdGlvbnMgPSByZWFkVTIocmFmKTsKLQlpZmguVGltZURhdGVTdGFtcCA9IHJlYWQ0KHJhZik7Ci0JaWZoLlBvaW50ZXJUb1N5bWJvbFRhYmxlID0gcmVhZDQocmFmKTsKLQlpZmguTnVtYmVyT2ZTeW1ib2xzID0gcmVhZDQocmFmKTsKLQlpZmguU2l6ZU9mT3B0aW9uYWxIZWFkZXIgPSByZWFkVTIocmFmKTsKLQlpZmguQ2hhcmFjdGVyaXN0aWNzICA9IHJlYWRVMihyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfREFUQV9ESVJFQ1RPUlkgaWRkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlkZC5WaXJ0dWFsQWRkcmVzcyA9IHJlYWQ0KHJhZik7Ci0JaWRkLlNpemUgPSByZWFkNChyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfT1BUSU9OQUxfSEVBREVSIGlvaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpb2guTWFnaWMgPSByZWFkVTIocmFmKTsKLQlpb2guTWFqb3JMaW5rZXJWZXJzaW9uID0gcmFmLnJlYWQoKTsKLQlpb2guTWlub3JMaW5rZXJWZXJzaW9uID0gcmFmLnJlYWQoKTsKLQlpb2guU2l6ZU9mQ29kZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZkluaXRpYWxpemVkRGF0YSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZlVuaW5pdGlhbGl6ZWREYXRhID0gcmVhZDQocmFmKTsKLQlpb2guQWRkcmVzc09mRW50cnlQb2ludCA9IHJlYWQ0KHJhZik7Ci0JaW9oLkJhc2VPZkNvZGUgPSByZWFkNChyYWYpOwotCWlvaC5CYXNlT2ZEYXRhID0gcmVhZDQocmFmKTsKLQlpb2guSW1hZ2VCYXNlID0gcmVhZDQocmFmKTsKLQlpb2guU2VjdGlvbkFsaWdubWVudCA9IHJlYWQ0KHJhZik7Ci0JaW9oLkZpbGVBbGlnbm1lbnQgPSByZWFkNChyYWYpOwotCWlvaC5NYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpb2guTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1ham9ySW1hZ2VWZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1pbm9ySW1hZ2VWZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaW9oLk1ham9yU3Vic3lzdGVtVmVyc2lvbiA9IHJlYWRVMihyYWYpOwotCWlvaC5NaW5vclN1YnN5c3RlbVZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpb2guV2luMzJWZXJzaW9uVmFsdWUgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZJbWFnZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZkhlYWRlcnMgPSByZWFkNChyYWYpOwotCWlvaC5DaGVja1N1bSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlN1YnN5c3RlbSA9IHJlYWRVMihyYWYpOwotCWlvaC5EbGxDaGFyYWN0ZXJpc3RpY3MgPSByZWFkVTIocmFmKTsKLQlpb2guU2l6ZU9mU3RhY2tSZXNlcnZlID0gcmVhZDQocmFmKTsKLQlpb2guU2l6ZU9mU3RhY2tDb21taXQgPSByZWFkNChyYWYpOwotCWlvaC5TaXplT2ZIZWFwUmVzZXJ2ZSA9IHJlYWQ0KHJhZik7Ci0JaW9oLlNpemVPZkhlYXBDb21taXQgPSByZWFkNChyYWYpOwotCWlvaC5Mb2FkZXJGbGFncyA9IHJlYWQ0KHJhZik7Ci0JaW9oLk51bWJlck9mUnZhQW5kU2l6ZXMgPSByZWFkNChyYWYpOwotCWZvciAoaW50IGkgPSAwIDsgaSA8IGlvaC5EYXRhRGlyZWN0b3J5Lmxlbmd0aDsgaSsrKSB7Ci0JCWlvaC5EYXRhRGlyZWN0b3J5W2ldID0gbmV3IElNQUdFX0RBVEFfRElSRUNUT1JZKCk7Ci0JCXJlYWQocmFmLCBpb2guRGF0YURpcmVjdG9yeVtpXSk7Ci0JfQotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfTlRfSEVBREVSUyBpbmgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaW5oLlNpZ25hdHVyZSA9IHJlYWQ0KHJhZik7Ci0JcmVhZChyYWYsIGluaC5GaWxlSGVhZGVyKTsKLQlyZWFkKHJhZiwgaW5oLk9wdGlvbmFsSGVhZGVyKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX1NFQ1RJT05fSEVBREVSIGlzaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlmb3IgKGludCBpID0gMCA7IGkgPCBpc2guTmFtZS5sZW5ndGg7IGkrKykgaXNoLk5hbWVbaV0gPSByYWYucmVhZCgpOwotCWlzaC5NaXNjX1ZpcnR1YWxTaXplID0gcmVhZDQocmFmKTsKLQlpc2guVmlydHVhbEFkZHJlc3MgPSByZWFkNChyYWYpOwotCWlzaC5TaXplT2ZSYXdEYXRhID0gcmVhZDQocmFmKTsKLQlpc2guUG9pbnRlclRvUmF3RGF0YSA9IHJlYWQ0KHJhZik7Ci0JaXNoLlBvaW50ZXJUb1JlbG9jYXRpb25zID0gcmVhZDQocmFmKTsKLQlpc2guUG9pbnRlclRvTGluZW51bWJlcnMgPSByZWFkNChyYWYpOwotCWlzaC5OdW1iZXJPZlJlbG9jYXRpb25zID0gcmVhZFUyKHJhZik7Ci0JaXNoLk51bWJlck9mTGluZW51bWJlcnMgPSByZWFkVTIocmFmKTsKLQlpc2guQ2hhcmFjdGVyaXN0aWNzID0gcmVhZDQocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIElNQUdFX1JFU09VUkNFX0RJUkVDVE9SWSBpcmQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaXJkLkNoYXJhY3RlcmlzdGljcyA9IHJlYWQ0KHJhZik7Ci0JaXJkLlRpbWVEYXRlU3RhbXAgPSByZWFkNChyYWYpOwotCWlyZC5NYWpvclZlcnNpb24gPSByZWFkVTIocmFmKTsKLQlpcmQuTWlub3JWZXJzaW9uID0gcmVhZFUyKHJhZik7Ci0JaXJkLk51bWJlck9mTmFtZWRFbnRyaWVzID0gcmVhZFUyKHJhZik7Ci0JaXJkLk51bWJlck9mSWRFbnRyaWVzID0gcmVhZFUyKHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJTUFHRV9SRVNPVVJDRV9ESVJFQ1RPUllfRU5UUlkgaXJkZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlpcmRlLk5hbWUgPSByZWFkNChyYWYpOwotCWlyZGUuT2Zmc2V0VG9EYXRhID0gcmVhZDQocmFmKTsKLQkvLyBjb25zdHJ1Y3Qgb3RoZXIgdW5pb24gbWVtYmVycwotCWlyZGUuTmFtZU9mZnNldCA9IGlyZGUuTmFtZSAmIH4gKDEgPDwgMzEpOwotCWlyZGUuTmFtZUlzU3RyaW5nID0gKGlyZGUuTmFtZSAmICgxIDw8IDMxKSkgIT0gMDsKLQlpcmRlLklkID0gaXJkZS5OYW1lICYgMHhGRkZGOwotCWlyZGUuT2Zmc2V0VG9EaXJlY3RvcnkgPSBpcmRlLk9mZnNldFRvRGF0YSAmIH4gKDEgPDwgMzEpOwotCWlyZGUuRGF0YUlzRGlyZWN0b3J5ID0gKGlyZGUuT2Zmc2V0VG9EYXRhICYgKDEgPDwgMzEpKSAhPSAwOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgSU1BR0VfUkVTT1VSQ0VfREFUQV9FTlRSWSBpcmRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWlyZGUuT2Zmc2V0VG9EYXRhID0gcmVhZDQocmFmKTsKLQlpcmRlLlNpemUgPSByZWFkNChyYWYpOwotCWlyZGUuQ29kZVBhZ2UgPSByZWFkNChyYWYpOwotCWlyZGUuUmVzZXJ2ZWQgPSByZWFkNChyYWYpOwotfQotc3RhdGljIHZvaWQgcmVhZChSYW5kb21BY2Nlc3NGaWxlIHJhZiwgTkVXSEVBREVSIG5oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCW5oLlJlc2VydmVkID0gcmVhZFUyKHJhZik7Ci0JbmguUmVzVHlwZSA9IHJlYWRVMihyYWYpOwotCW5oLlJlc0NvdW50ID0gcmVhZFUyKHJhZik7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBJQ09OUkVTRElSIGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JaS5XaWR0aCA9IHJhZi5yZWFkKCk7Ci0JaS5IZWlnaHQgPSByYWYucmVhZCgpOwotCWkuQ29sb3JDb3VudCA9IHJhZi5yZWFkKCk7Ci0JaS5yZXNlcnZlZCA9IHJhZi5yZWFkKCk7Ci19Ci1zdGF0aWMgdm9pZCByZWFkKFJhbmRvbUFjY2Vzc0ZpbGUgcmFmLCBDVVJTT1JESVIgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQljLldpZHRoID0gcmVhZFUyKHJhZik7Ci0JYy5IZWlnaHQgPSByZWFkVTIocmFmKTsKLX0KLXN0YXRpYyB2b2lkIHJlYWQoUmFuZG9tQWNjZXNzRmlsZSByYWYsIFJFU0RJUiBycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlsb25nIHN0YXJ0ID0gcmFmLmdldEZpbGVQb2ludGVyKCk7Ci0JcmVhZChyYWYsIHJzLkljb24pOwotCXJhZi5zZWVrKHN0YXJ0KTsKLQlyZWFkKHJhZiwgcnMuQ3Vyc29yKTsKLQlycy5QbGFuZXMgPSByZWFkVTIocmFmKTsKLQlycy5CaXRDb3VudCA9IHJlYWRVMihyYWYpOwotCXJzLkJ5dGVzSW5SZXMgPSByZWFkNChyYWYpOwotCXJzLkljb25DdXJzb3JJZCA9IHJlYWRVMihyYWYpOwotfQotCi0vKiBJbWFnZURhdGEgYW5kIEltYWdlIERlY29kZXIgaW5saW5pbmcgdG8gYXZvaWQgZGVwZW5kZW5jeSBvbiBTV1QgCi0gKiBUaGUgZm9sbG93aW5nIHNlY3Rpb24gY2FuIGJlIGVudGlyZWx5IHJlbW92ZWQgaWYgU1dUIGNhbiBiZSB1c2VkLgotICovCi0KLXN0YXRpYyBjbGFzcyBSR0IgewotCQotCS8qKgotCSAqIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBSR0IKLQkgKi8KLQlwdWJsaWMgaW50IHJlZDsKLQkKLQkvKioKLQkgKiB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBSR0IKLQkgKi8KLQlwdWJsaWMgaW50IGdyZWVuOwotCQotCS8qKgotCSAqIHRoZSBibHVlIGNvbXBvbmVudCBvZiB0aGUgUkdCCi0JICovCi0JcHVibGljIGludCBibHVlOwotCQotCXN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMjU4NDE1MDIzNDYxMjQ5MDc0TDsKLQkKLS8qKgotICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpdGggdGhlIGdpdmVuCi0gKiByZWQsIGdyZWVuIGFuZCBibHVlIHZhbHVlcy4KLSAqCi0gKiBAcGFyYW0gcmVkIHRoZSByZWQgY29tcG9uZW50IG9mIHRoZSBuZXcgaW5zdGFuY2UKLSAqIEBwYXJhbSBncmVlbiB0aGUgZ3JlZW4gY29tcG9uZW50IG9mIHRoZSBuZXcgaW5zdGFuY2UKLSAqIEBwYXJhbSBibHVlIHRoZSBibHVlIGNvbXBvbmVudCBvZiB0aGUgbmV3IGluc3RhbmNlCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB0aGUgcmVkLCBncmVlbiBvciBibHVlIGFyZ3VtZW50IGlzIG5vdCBiZXR3ZWVuIDAgYW5kIDI1NTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgUkdCKGludCByZWQsIGludCBncmVlbiwgaW50IGJsdWUpIHsKLQlpZiAoKHJlZCA+IDI1NSkgfHwgKHJlZCA8IDApIHx8Ci0JCShncmVlbiA+IDI1NSkgfHwgKGdyZWVuIDwgMCkgfHwKLQkJKGJsdWUgPiAyNTUpIHx8IChibHVlIDwgMCkpCi0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCXRoaXMucmVkID0gcmVkOwotCXRoaXMuZ3JlZW4gPSBncmVlbjsKLQl0aGlzLmJsdWUgPSBibHVlOwotfQotCi0vKioKLSAqIENvbXBhcmVzIHRoZSBhcmd1bWVudCB0byB0aGUgcmVjZWl2ZXIsIGFuZCByZXR1cm5zIHRydWUKLSAqIGlmIHRoZXkgcmVwcmVzZW50IHRoZSA8ZW0+c2FtZTwvZW0+IG9iamVjdCB1c2luZyBhIGNsYXNzCi0gKiBzcGVjaWZpYyBjb21wYXJpc29uLgotICoKLSAqIEBwYXJhbSBvYmplY3QgdGhlIG9iamVjdCB0byBjb21wYXJlIHdpdGggdGhpcyBvYmplY3QKLSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGlzIG9iamVjdCBhbmQgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZQotICoKLSAqIEBzZWUgI2hhc2hDb2RlKCkKLSAqLwotcHVibGljIGJvb2xlYW4gZXF1YWxzIChPYmplY3Qgb2JqZWN0KSB7Ci0JaWYgKG9iamVjdCA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKLQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBSR0IpKSByZXR1cm4gZmFsc2U7Ci0JUkdCIHJnYiA9IChSR0Ipb2JqZWN0OwotCXJldHVybiAocmdiLnJlZCA9PSB0aGlzLnJlZCkgJiYgKHJnYi5ncmVlbiA9PSB0aGlzLmdyZWVuKSAmJiAocmdiLmJsdWUgPT0gdGhpcy5ibHVlKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGFuIGludGVnZXIgaGFzaCBjb2RlIGZvciB0aGUgcmVjZWl2ZXIuIEFueSB0d28gCi0gKiBvYmplY3RzIHdoaWNoIHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiB3aGVuIHBhc3NlZCB0byAKLSAqIDxjb2RlPmVxdWFsczwvY29kZT4gbXVzdCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZm9yIHRoaXMKLSAqIG1ldGhvZC4KLSAqCi0gKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIGhhc2gKLSAqCi0gKiBAc2VlICNlcXVhbHMoT2JqZWN0KQotICovCi1wdWJsaWMgaW50IGhhc2hDb2RlICgpIHsKLQlyZXR1cm4gKGJsdWUgPDwgMTYpIHwgKGdyZWVuIDw8IDgpIHwgcmVkOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyBhIGNvbmNpc2UsIGh1bWFuLXJlYWRhYmxlCi0gKiBkZXNjcmlwdGlvbiBvZiB0aGUgcmVjZWl2ZXIuCi0gKgotICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgPGNvZGU+UkdCPC9jb2RlPgotICovCi1wdWJsaWMgU3RyaW5nIHRvU3RyaW5nICgpIHsKLQlyZXR1cm4gIlJHQiB7IiArIHJlZCArICIsICIgKyBncmVlbiArICIsICIgKyBibHVlICsgIn0iOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgCi0KLS8vJE5PTi1OTFMtNCQKLX0KLQotfQotc3RhdGljIGNsYXNzIFBhbGV0dGVEYXRhIHsKLQkKLQkvKioKLQkgKiB0cnVlIGlmIHRoZSByZWNlaXZlciBpcyBhIGRpcmVjdCBwYWxldHRlLCAKLQkgKiBhbmQgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEaXJlY3Q7Ci0JCi0JLyoqCi0JICogdGhlIFJHQiB2YWx1ZXMgZm9yIGFuIGluZGV4ZWQgcGFsZXR0ZSwgd2hlcmUgdGhlCi0JICogaW5kaWNlcyBvZiB0aGUgYXJyYXkgY29ycmVzcG9uZCB0byBwaXhlbCB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgUkdCW10gY29sb3JzOwotCQotCS8qKgotCSAqIHRoZSByZWQgbWFzayBmb3IgYSBkaXJlY3QgcGFsZXR0ZQotCSAqLwotCXB1YmxpYyBpbnQgcmVkTWFzazsKLQkKLQkvKioKLQkgKiB0aGUgZ3JlZW4gbWFzayBmb3IgYSBkaXJlY3QgcGFsZXR0ZQotCSAqLwotCXB1YmxpYyBpbnQgZ3JlZW5NYXNrOwotCQotCS8qKgotCSAqIHRoZSBibHVlIG1hc2sgZm9yIGEgZGlyZWN0IHBhbGV0dGUKLQkgKi8KLQlwdWJsaWMgaW50IGJsdWVNYXNrOwotCQotCS8qKgotCSAqIHRoZSByZWQgc2hpZnQgZm9yIGEgZGlyZWN0IHBhbGV0dGUKLQkgKi8KLQlwdWJsaWMgaW50IHJlZFNoaWZ0OwotCQotCS8qKgotCSAqIHRoZSBncmVlbiBzaGlmdCBmb3IgYSBkaXJlY3QgcGFsZXR0ZQotCSAqLwotCXB1YmxpYyBpbnQgZ3JlZW5TaGlmdDsKLQkKLQkvKioKLQkgKiB0aGUgYmx1ZSBzaGlmdCBmb3IgYSBkaXJlY3QgcGFsZXR0ZQotCSAqLwotCXB1YmxpYyBpbnQgYmx1ZVNoaWZ0OwotCi0vKioKLSAqIENvbnN0cnVjdHMgYSBuZXcgaW5kZXhlZCBwYWxldHRlIGdpdmVuIGFuIGFycmF5IG9mIFJHQiB2YWx1ZXMuCi0gKgotICogQHBhcmFtIGNvbG9ycyB0aGUgYXJyYXkgb2YgPGNvZGU+UkdCPC9jb2RlPnMgZm9yIHRoZSBwYWxldHRlCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgUGFsZXR0ZURhdGEoUkdCW10gY29sb3JzKSB7Ci0JaWYgKGNvbG9ycyA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCXRoaXMuY29sb3JzID0gY29sb3JzOwotCXRoaXMuaXNEaXJlY3QgPSBmYWxzZTsKLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3IGRpcmVjdCBwYWxldHRlIGdpdmVuIHRoZSByZWQsIGdyZWVuIGFuZCBibHVlIG1hc2tzLgotICoKLSAqIEBwYXJhbSByZWRNYXNrIHRoZSByZWQgbWFzawotICogQHBhcmFtIGdyZWVuTWFzayB0aGUgZ3JlZW4gbWFzawotICogQHBhcmFtIGJsdWVNYXNrIHRoZSBibHVlIG1hc2sKLSAqLwotcHVibGljIFBhbGV0dGVEYXRhKGludCByZWRNYXNrLCBpbnQgZ3JlZW5NYXNrLCBpbnQgYmx1ZU1hc2spIHsKLQl0aGlzLnJlZE1hc2sgPSByZWRNYXNrOwotCXRoaXMuZ3JlZW5NYXNrID0gZ3JlZW5NYXNrOwotCXRoaXMuYmx1ZU1hc2sgPSBibHVlTWFzazsKLQl0aGlzLmlzRGlyZWN0ID0gdHJ1ZTsKLQl0aGlzLnJlZFNoaWZ0ID0gc2hpZnRGb3JNYXNrKHJlZE1hc2spOwotCXRoaXMuZ3JlZW5TaGlmdCA9IHNoaWZ0Rm9yTWFzayhncmVlbk1hc2spOwotCXRoaXMuYmx1ZVNoaWZ0ID0gc2hpZnRGb3JNYXNrKGJsdWVNYXNrKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBwaXhlbCB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiA8Y29kZT5SQkc8L2NvZGU+LgotICoKLSAqIEBwYXJhbSByZ2IgdGhlIFJHQiB0byBnZXQgdGhlIHBpeGVsIHZhbHVlIGZvcgotICogQHJldHVybiB0aGUgcGl4ZWwgdmFsdWUgZm9yIHRoZSBnaXZlbiBSR0IKLSAqIAotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSBSR0IgaXMgbm90IGZvdW5kIGluIHRoZSBwYWxldHRlPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBpbnQgZ2V0UGl4ZWwoUkdCIHJnYikgewotCWlmIChyZ2IgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpZiAoaXNEaXJlY3QpIHsKLQkJaW50IHBpeGVsID0gMDsKLQkJcGl4ZWwgfD0gKHJlZFNoaWZ0IDwgMCA/IHJnYi5yZWQgPDwgLXJlZFNoaWZ0IDogcmdiLnJlZCA+Pj4gcmVkU2hpZnQpICYgcmVkTWFzazsKLQkJcGl4ZWwgfD0gKGdyZWVuU2hpZnQgPCAwID8gcmdiLmdyZWVuIDw8IC1ncmVlblNoaWZ0IDogcmdiLmdyZWVuID4+PiBncmVlblNoaWZ0KSAmIGdyZWVuTWFzazsKLQkJcGl4ZWwgfD0gKGJsdWVTaGlmdCA8IDAgPyByZ2IuYmx1ZSA8PCAtYmx1ZVNoaWZ0IDogcmdiLmJsdWUgPj4+IGJsdWVTaGlmdCkgJiBibHVlTWFzazsKLQkJcmV0dXJuIHBpeGVsOwotCX0gCi0KLQlmb3IgKGludCBpID0gMDsgaSA8IGNvbG9ycy5sZW5ndGg7IGkrKykgewotCQlpZiAoY29sb3JzW2ldLmVxdWFscyhyZ2IpKSByZXR1cm4gaTsKLQl9Ci0JLyogVGhlIFJHQiBkaWQgbm90IGV4aXN0IGluIHRoZSBwYWxldHRlICovCi0JU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGFuIDxjb2RlPlJHQjwvY29kZT4gY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcGl4ZWwgdmFsdWUuCi0gKgotICogQHBhcmFtIHBpeGVsIHRoZSBwaXhlbCB0byBnZXQgdGhlIFJHQiB2YWx1ZSBmb3IKLSAqIEByZXR1cm4gdGhlIFJHQiB2YWx1ZSBmb3IgdGhlIGdpdmVuIHBpeGVsCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgYXJndW1lbnQgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHRoZSBwaXhlbCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgcGFsZXR0ZTwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgUkdCIGdldFJHQihpbnQgcGl4ZWwpIHsKLQlpZiAoaXNEaXJlY3QpIHsKLQkJaW50IHIgPSBwaXhlbCAmIHJlZE1hc2s7Ci0JCXIgPSAocmVkU2hpZnQgPCAwKSA/IHIgPj4+IC1yZWRTaGlmdCA6IHIgPDwgcmVkU2hpZnQ7Ci0JCWludCBnID0gcGl4ZWwgJiBncmVlbk1hc2s7Ci0JCWcgPSAoZ3JlZW5TaGlmdCA8IDApID8gZyA+Pj4gLWdyZWVuU2hpZnQgOiBnIDw8IGdyZWVuU2hpZnQ7Ci0JCWludCBiID0gcGl4ZWwgJiBibHVlTWFzazsKLQkJYiA9IChibHVlU2hpZnQgPCAwKSA/IGIgPj4+IC1ibHVlU2hpZnQgOiBiIDw8IGJsdWVTaGlmdDsKLQkJcmV0dXJuIG5ldyBSR0IociwgZywgYik7Ci0JfQotCWlmIChwaXhlbCA8IDAgfHwgcGl4ZWwgPj0gY29sb3JzLmxlbmd0aCkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCX0KLQlyZXR1cm4gY29sb3JzW3BpeGVsXTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGFsbCB0aGUgUkdCIHZhbHVlcyBpbiB0aGUgcmVjZWl2ZXIgaWYgaXQgaXMgYW4KLSAqIGluZGV4ZWQgcGFsZXR0ZSwgb3IgbnVsbCBpZiBpdCBpcyBhIGRpcmVjdCBwYWxldHRlLgotICoKLSAqIEByZXR1cm4gdGhlIDxjb2RlPlJHQjwvY29kZT5zIGZvciB0aGUgcmVjZWl2ZXIgb3IgbnVsbAotICovCi1wdWJsaWMgUkdCW10gZ2V0UkdCcygpIHsKLQlyZXR1cm4gY29sb3JzOwotfQotCi0vKioKLSAqIENvbXB1dGVzIHRoZSBzaGlmdCB2YWx1ZSBmb3IgYSBnaXZlbiBtYXNrLgotICoKLSAqIEBwYXJhbSBtYXNrIHRoZSBtYXNrIHRvIGNvbXB1dGUgdGhlIHNoaWZ0IGZvcgotICogQHJldHVybiB0aGUgc2hpZnQgYW1vdW50Ci0gKgotICogQHNlZSBQYWxldHRlRGF0YQotICovCi1pbnQgc2hpZnRGb3JNYXNrKGludCBtYXNrKSB7Ci0JZm9yIChpbnQgaSA9IDMxOyBpID49IDA7IGktLSkgeyAKLQkJaWYgKCgobWFzayA+PiBpKSAmIDB4MSkgIT0gMCkgcmV0dXJuIDcgLSBpOwotCX0KLQlyZXR1cm4gMzI7Ci19Ci0KLX0KLXN0YXRpYyBjbGFzcyBJbWFnZUxvYWRlciB7Ci0JCi0JLyoqCi0JICogdGhlIGFycmF5IG9mIEltYWdlRGF0YSBvYmplY3RzIGluIHRoaXMgSW1hZ2VMb2FkZXIuCi0JICogVGhpcyBhcnJheSBpcyByZWFkIGluIHdoZW4gdGhlIGxvYWQgbWV0aG9kIGlzIGNhbGxlZCwKLQkgKiBhbmQgaXQgaXMgd3JpdHRlbiBvdXQgd2hlbiB0aGUgc2F2ZSBtZXRob2QgaXMgY2FsbGVkCi0JICovCi0JcHVibGljIEltYWdlRGF0YVtdIGRhdGE7Ci0JCi0JLyoqCi0JICogdGhlIHdpZHRoIG9mIHRoZSBsb2dpY2FsIHNjcmVlbiBvbiB3aGljaCB0aGUgaW1hZ2VzCi0JICogcmVzaWRlLCBpbiBwaXhlbHMgKHRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIEdJRjg5YQotCSAqIExvZ2ljYWwgU2NyZWVuIFdpZHRoIHZhbHVlKQotCSAqLwotCXB1YmxpYyBpbnQgbG9naWNhbFNjcmVlbldpZHRoOwotCi0JLyoqCi0JICogdGhlIGhlaWdodCBvZiB0aGUgbG9naWNhbCBzY3JlZW4gb24gd2hpY2ggdGhlIGltYWdlcwotCSAqIHJlc2lkZSwgaW4gcGl4ZWxzICh0aGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBHSUY4OWEKLQkgKiBMb2dpY2FsIFNjcmVlbiBIZWlnaHQgdmFsdWUpCi0JICovCi0JcHVibGljIGludCBsb2dpY2FsU2NyZWVuSGVpZ2h0OwotCi0JLyoqCi0JICogdGhlIGJhY2tncm91bmQgcGl4ZWwgZm9yIHRoZSBsb2dpY2FsIHNjcmVlbiAodGhpcyAKLQkgKiBjb3JyZXNwb25kcyB0byB0aGUgR0lGODlhIEJhY2tncm91bmQgQ29sb3IgSW5kZXggdmFsdWUpLgotCSAqIFRoZSBkZWZhdWx0IGlzIC0xIHdoaWNoIG1lYW5zICd1bnNwZWNpZmllZCBiYWNrZ3JvdW5kJwotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgYmFja2dyb3VuZFBpeGVsOwotCi0JLyoqCi0JICogdGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIGRpc3BsYXkgb2YgYSBzZXF1ZW5jZQotCSAqIG9mIGFuaW1hdGVkIGltYWdlcyAodGhpcyBjb3JyZXNwb25kcyB0byB0aGUgY29tbW9ubHktdXNlZAotCSAqIEdJRiBhcHBsaWNhdGlvbiBleHRlbnNpb24gZm9yICJORVRTQ0FQRSAyLjAgMDEiKQotCSAqLwotCXB1YmxpYyBpbnQgcmVwZWF0Q291bnQ7Ci0JCQotCS8qCi0JICogdGhlIHNldCBvZiBJbWFnZUxvYWRlciBldmVudCBsaXN0ZW5lcnMsIGNyZWF0ZWQgb24gZGVtYW5kCi0JICovCi0JVmVjdG9yIGltYWdlTG9hZGVyTGlzdGVuZXJzOwotCi0vKioKLSAqIENvbnN0cnVjdCBhIG5ldyBlbXB0eSBJbWFnZUxvYWRlci4KLSAqLwotcHVibGljIEltYWdlTG9hZGVyKCkgewotCXJlc2V0KCk7Ci19Ci0KLS8qKgotICogUmVzZXRzIHRoZSBmaWVsZHMgb2YgdGhlIEltYWdlTG9hZGVyLCBleGNlcHQgZm9yIHRoZQotICogPGNvZGU+aW1hZ2VMb2FkZXJMaXN0ZW5lcnM8L2NvZGU+IGZpZWxkLgotICovCi12b2lkIHJlc2V0KCkgewotCWRhdGEgPSBudWxsOwotCWxvZ2ljYWxTY3JlZW5XaWR0aCA9IDA7Ci0JbG9naWNhbFNjcmVlbkhlaWdodCA9IDA7Ci0JYmFja2dyb3VuZFBpeGVsID0gLTE7Ci0JcmVwZWF0Q291bnQgPSAxOwotfQotCi0vKioKLSAqIExvYWRzIGFuIGFycmF5IG9mIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gb2JqZWN0cyBmcm9tIHRoZQotICogc3BlY2lmaWVkIGlucHV0IHN0cmVhbS4gVGhyb3dzIGFuIGVycm9yIGlmIGVpdGhlciBhbiBlcnJvcgotICogb2NjdXJzIHdoaWxlIGxvYWRpbmcgdGhlIGltYWdlcywgb3IgaWYgdGhlIGltYWdlcyBhcmUgbm90Ci0gKiBvZiBhIHN1cHBvcnRlZCB0eXBlLiBSZXR1cm5zIHRoZSBsb2FkZWQgaW1hZ2UgZGF0YSBhcnJheS4KLSAqCi0gKiBAcGFyYW0gc3RyZWFtIHRoZSBpbnB1dCBzdHJlYW0gdG8gbG9hZCB0aGUgaW1hZ2VzIGZyb20KLSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPiBvYmplY3RzIGxvYWRlZCBmcm9tIHRoZSBzcGVjaWZpZWQgaW5wdXQgc3RyZWFtCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgc3RyZWFtIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0lNQUdFIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgaW52YWxpZCBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTyAtIGlmIGFuIGlucHV0L291dHB1dCBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQgLSBpZiB0aGUgaW1hZ2UgZmlsZSBjb250YWlucyBhbiB1bnJlY29nbml6ZWQgZm9ybWF0PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBJbWFnZURhdGFbXSBsb2FkKElucHV0U3RyZWFtIHN0cmVhbSkgewotCWlmIChzdHJlYW0gPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlyZXNldCgpOwotCWRhdGEgPSBGaWxlRm9ybWF0LmxvYWQoc3RyZWFtLCB0aGlzKTsKLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBMb2FkcyBhbiBhcnJheSBvZiA8Y29kZT5JbWFnZURhdGE8L2NvZGU+IG9iamVjdHMgZnJvbSB0aGUKLSAqIGZpbGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRocm93cyBhbiBlcnJvciBpZiBlaXRoZXIKLSAqIGFuIGVycm9yIG9jY3VycyB3aGlsZSBsb2FkaW5nIHRoZSBpbWFnZXMsIG9yIGlmIHRoZSBpbWFnZXMgYXJlCi0gKiBub3Qgb2YgYSBzdXBwb3J0ZWQgdHlwZS4gUmV0dXJucyB0aGUgbG9hZGVkIGltYWdlIGRhdGEgYXJyYXkuCi0gKgotICogQHBhcmFtIGZpbGVuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGxvYWQgdGhlIGltYWdlcyBmcm9tCi0gKiBAcmV0dXJuIGFuIGFycmF5IG9mIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gb2JqZWN0cyBsb2FkZWQgZnJvbSB0aGUgc3BlY2lmaWVkIGZpbGUKLSAqCi0gKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfTlVMTF9BUkdVTUVOVCAtIGlmIHRoZSBmaWxlIG5hbWUgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICogQGV4Y2VwdGlvbiBTV1RFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfSU1BR0UgLSBpZiB0aGUgaW1hZ2UgZmlsZSBjb250YWlucyBpbnZhbGlkIGRhdGE8L2xpPgotICogICAgPGxpPkVSUk9SX0lPIC0gaWYgYW4gSU8gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZGF0YTwvbGk+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfRk9STUFUIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgYW4gdW5yZWNvZ25pemVkIGZvcm1hdDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgSW1hZ2VEYXRhW10gbG9hZChTdHJpbmcgZmlsZW5hbWUpIHsKLQlpZiAoZmlsZW5hbWUgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCXRyeSB7Ci0JCXN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpKTsKLQkJcmV0dXJuIGxvYWQoc3RyZWFtKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0gZmluYWxseSB7Ci0JCXRyeSB7Ci0JCQlpZiAoc3RyZWFtICE9IG51bGwpIHN0cmVhbS5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBJZ25vcmUgZXJyb3IKLQkJfQotCX0KLQlyZXR1cm4gbnVsbDsKLX0KLX0KLXN0YXRpYyBjbGFzcyBJbWFnZURhdGEgewotCQotCS8qKgotCSAqIFRoZSB3aWR0aCBvZiB0aGUgaW1hZ2UsIGluIHBpeGVscy4KLQkgKi8KLQlwdWJsaWMgaW50IHdpZHRoOwotCi0JLyoqCi0JICogVGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UsIGluIHBpeGVscy4KLQkgKi8KLQlwdWJsaWMgaW50IGhlaWdodDsKLQotCS8qKgotCSAqIFRoZSBjb2xvciBkZXB0aCBvZiB0aGUgaW1hZ2UsIGluIGJpdHMgcGVyIHBpeGVsLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBhIGRlcHRoIG9mIDggb3IgbGVzcyBkb2VzIG5vdCBuZWNlc3NhcmlseQotCSAqIG1lYW4gdGhhdCB0aGUgaW1hZ2UgaXMgcGFsZXR0ZSBpbmRleGVkLCBvcgotCSAqIGNvbnZlcnNlbHkgdGhhdCBhIGRlcHRoIGdyZWF0ZXIgdGhhbiA4IG1lYW5zIHRoYXQKLQkgKiB0aGUgaW1hZ2UgaXMgZGlyZWN0IGNvbG9yLiAgQ2hlY2sgdGhlIGFzc29jaWF0ZWQKLQkgKiBQYWxldHRlRGF0YSdzIGlzRGlyZWN0IGZpZWxkIGZvciBzdWNoIGRldGVybWluYXRpb25zLgotCSAqLwotCXB1YmxpYyBpbnQgZGVwdGg7Ci0KLQkvKioKLQkgKiBUaGUgc2NhbmxpbmUgcGFkZGluZy4KLQkgKiA8cD4KLQkgKiBJZiBvbmUgc2NhbmxpbmUgb2YgdGhlIGltYWdlIGlzIG5vdCBhIG11bHRpcGxlIG9mCi0JICogdGhpcyBudW1iZXIsIGl0IHdpbGwgYmUgcGFkZGVkIHdpdGggemVyb3MgdW50aWwgaXQgaXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgc2NhbmxpbmVQYWQ7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIHBlciBzY2FubGluZS4KLQkgKiA8cD4KLQkgKiBUaGlzIGlzIGEgbXVsdGlwbGUgb2YgdGhlIHNjYW5saW5lIHBhZGRpbmcuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgYnl0ZXNQZXJMaW5lOwotCi0JLyoqCi0JICogVGhlIHBpeGVsIGRhdGEgb2YgdGhlIGltYWdlLgotCSAqIDxwPgotCSAqIE5vdGUgdGhhdCBmb3IgMTYgYml0IGRlcHRoIGltYWdlcyB0aGUgcGl4ZWwgZGF0YSBpcyBzdG9yZWQKLQkgKiBpbiBsZWFzdCBzaWduaWZpY2FudCBieXRlIG9yZGVyOyBob3dldmVyLCBmb3IgMjRiaXQgYW5kCi0JICogMzJiaXQgZGVwdGggaW1hZ2VzIHRoZSBwaXhlbCBkYXRhIGlzIHN0b3JlZCBpbiBtb3N0Ci0JICogc2lnbmlmaWNhbnQgYnl0ZSBvcmRlci4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGJ5dGVbXSBkYXRhOwotCi0JLyoqCi0JICogVGhlIGNvbG9yIHRhYmxlIGZvciB0aGUgaW1hZ2UuCi0JICovCi0JcHVibGljIFBhbGV0dGVEYXRhIHBhbGV0dGU7Ci0KLQkvKioKLQkgKiBUaGUgdHJhbnNwYXJlbnQgcGl4ZWwuCi0JICogPHA+Ci0JICogUGl4ZWxzIHdpdGggdGhpcyB2YWx1ZSBhcmUgdHJhbnNwYXJlbnQuCi0JICogPC9wPjxwPgotCSAqIFRoZSBkZWZhdWx0IGlzIC0xIHdoaWNoIG1lYW5zICdubyB0cmFuc3BhcmVudCBwaXhlbCcuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgdHJhbnNwYXJlbnRQaXhlbDsKLQotCS8qKgotCSAqIEFuIGljb24tc3BlY2lmaWMgZmllbGQgY29udGFpbmluZyB0aGUgZGF0YSBmcm9tIHRoZSBpY29uIG1hc2suCi0JICogPHA+Ci0JICogVGhpcyBpcyBhIDEgYml0IGJpdG1hcCBzdG9yZWQgd2l0aCB0aGUgbW9zdCBzaWduaWZpY2FudAotCSAqIGJpdCBmaXJzdC4gIFRoZSBudW1iZXIgb2YgYnl0ZXMgcGVyIHNjYW5saW5lIGlzCi0JICogJygod2lkdGggKyA3KSAvIDggKyAobWFza1BhZCAtIDEpKSAvIG1hc2tQYWQgKiBtYXNrUGFkJy4KLQkgKiA8L3A+PHA+Ci0JICogVGhlIGRlZmF1bHQgaXMgbnVsbCB3aGljaCBtZWFucyAnbm8gdHJhbnNwYXJlbmN5IG1hc2snLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIG1hc2tEYXRhOwotCi0JLyoqCi0JICogQW4gaWNvbi1zcGVjaWZpYyBmaWVsZCBjb250YWluaW5nIHRoZSBzY2FubGluZSBwYWQgb2YgdGhlIG1hc2suCi0JICogPHA+Ci0JICogSWYgb25lIHNjYW5saW5lIG9mIHRoZSB0cmFuc3BhcmVuY3kgbWFzayBpcyBub3QgYQotCSAqIG11bHRpcGxlIG9mIHRoaXMgbnVtYmVyLCBpdCB3aWxsIGJlIHBhZGRlZCB3aXRoIHplcm9zIHVudGlsCi0JICogaXQgaXMuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBpbnQgbWFza1BhZDsKLQkKLQkvKioKLQkgKiBUaGUgYWxwaGEgZGF0YSBvZiB0aGUgaW1hZ2UuCi0JICogPHA+Ci0JICogRXZlcnkgcGl4ZWwgY2FuIGhhdmUgYW4gPGVtPmFscGhhIGJsZW5kaW5nPC9lbT4gdmFsdWUgdGhhdAotCSAqIHZhcmllcyBmcm9tIDAsIG1lYW5pbmcgZnVsbHkgdHJhbnNwYXJlbnQsIHRvIDI1NSBtZWFuaW5nCi0JICogZnVsbHkgb3BhcXVlLiAgVGhlIG51bWJlciBvZiBieXRlcyBwZXIgc2NhbmxpbmUgaXMKLQkgKiAnd2lkdGgnLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIGFscGhhRGF0YTsKLQkKLQkvKioKLQkgKiBUaGUgZ2xvYmFsIGFscGhhIHZhbHVlIHRvIGJlIHVzZWQgZm9yIGV2ZXJ5IHBpeGVsLgotCSAqIDxwPgotCSAqIElmIHRoaXMgdmFsdWUgaXMgc2V0LCB0aGUgPGNvZGU+YWxwaGFEYXRhPC9jb2RlPiBmaWVsZAotCSAqIGlzIGlnbm9yZWQgYW5kIHdoZW4gdGhlIGltYWdlIGlzIHJlbmRlcmVkIGVhY2ggcGl4ZWwKLQkgKiB3aWxsIGJlIGJsZW5kZWQgd2l0aCB0aGUgYmFja2dyb3VuZCBhbiBhbW91bnQKLQkgKiBwcm9wb3J0aW9uYWwgdG8gdGhpcyB2YWx1ZS4KLQkgKiA8L3A+PHA+Ci0JICogVGhlIGRlZmF1bHQgaXMgLTEgd2hpY2ggbWVhbnMgJ25vIGdsb2JhbCBhbHBoYSB2YWx1ZScKLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGludCBhbHBoYTsKLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIGZpbGUgZnJvbSB3aGljaCB0aGUgaW1hZ2Ugd2FzIHJlYWQuCi0JICogCi0JICogSXQgaXMgZXhwcmVzc2VkIGFzIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKLQkgKiA8ZGw+Ci0JICogPGR0Pjxjb2RlPklNQUdFX0JNUDwvY29kZT48L2R0PgotCSAqIDxkZD5XaW5kb3dzIEJNUCBmaWxlIGZvcm1hdCwgbm8gY29tcHJlc3Npb248L2RkPgotCSAqIDxkdD48Y29kZT5JTUFHRV9CTVBfUkxFPC9jb2RlPjwvZHQ+Ci0JICogPGRkPldpbmRvd3MgQk1QIGZpbGUgZm9ybWF0LCBSTEUgY29tcHJlc3Npb24gaWYgYXBwcm9wcmlhdGU8L2RkPgotCSAqIDxkdD48Y29kZT5JTUFHRV9HSUY8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+R0lGIGZpbGUgZm9ybWF0PC9kZD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfSUNPPC9jb2RlPjwvZHQ+Ci0JICogPGRkPldpbmRvd3MgSUNPIGZpbGUgZm9ybWF0PC9kZD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfSlBFRzwvY29kZT48L2R0PgotCSAqIDxkZD5KUEVHIGZpbGUgZm9ybWF0PC9kZD4KLQkgKiA8ZHQ+PGNvZGU+SU1BR0VfUE5HPC9jb2RlPjwvZHQ+Ci0JICogPGRkPlBORyBmaWxlIGZvcm1hdDwvZGQ+Ci0JICogPC9kbD4KLQkgKi8KLQlwdWJsaWMgaW50IHR5cGU7Ci0KLQkvKioKLQkgKiBUaGUgeCBjb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIGltYWdlCi0JICogd2l0aGluIHRoZSBsb2dpY2FsIHNjcmVlbiAodGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0bwotCSAqIHRoZSBHSUY4OWEgSW1hZ2UgTGVmdCBQb3NpdGlvbiB2YWx1ZSkuCi0JICovCi0JcHVibGljIGludCB4OwotCi0JLyoqCi0JICogVGhlIHkgY29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSBpbWFnZQotCSAqIHdpdGhpbiB0aGUgbG9naWNhbCBzY3JlZW4gKHRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8KLQkgKiB0aGUgR0lGODlhIEltYWdlIFRvcCBQb3NpdGlvbiB2YWx1ZSkuCi0JICovCi0JcHVibGljIGludCB5OwotCi0JLyoqCi0JICogQSBkZXNjcmlwdGlvbiBvZiBob3cgdG8gZGlzcG9zZSBvZiB0aGUgY3VycmVudCBpbWFnZQotCSAqIGJlZm9yZSBkaXNwbGF5aW5nIHRoZSBuZXh0LgotCSAqIAotCSAqIEl0IGlzIGV4cHJlc3NlZCBhcyBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6Ci0JICogPGRsPgotCSAqIDxkdD48Y29kZT5ETV9VTlNQRUNJRklFRDwvY29kZT48L2R0PgotCSAqIDxkZD5kaXNwb3NhbCBtZXRob2Qgbm90IHNwZWNpZmllZDwvZGQ+Ci0JICogPGR0Pjxjb2RlPkRNX0ZJTExfTk9ORTwvY29kZT48L2R0PgotCSAqIDxkZD5kbyBub3RoaW5nIC0gbGVhdmUgdGhlIGltYWdlIGluIHBsYWNlPC9kZD4KLQkgKiA8ZHQ+PGNvZGU+RE1fRklMTF9CQUNLR1JPVU5EPC9jb2RlPjwvZHQ+Ci0JICogPGRkPmZpbGwgd2l0aCB0aGUgYmFja2dyb3VuZCBjb2xvcjwvZGQ+Ci0JICogPGR0Pjxjb2RlPkRNX0ZJTExfUFJFVklPVVM8L2NvZGU+PC9kdD4KLQkgKiA8ZGQ+cmVzdG9yZSB0aGUgcHJldmlvdXMgcGljdHVyZTwvZGQ+Ci0JICogPC9kbD4KLQkgKiAodGhpcyBmaWVsZCBjb3JyZXNwb25kcyB0byB0aGUgR0lGODlhIERpc3Bvc2FsIE1ldGhvZCB2YWx1ZSkKLQkgKi8KLQlwdWJsaWMgaW50IGRpc3Bvc2FsTWV0aG9kOwotCi0JLyoqCi0JICogVGhlIHRpbWUgdG8gZGVsYXkgYmVmb3JlIGRpc3BsYXlpbmcgdGhlIG5leHQgaW1hZ2UKLQkgKiBpbiBhbiBhbmltYXRpb24gKHRoaXMgZmllbGQgY29ycmVzcG9uZHMgdG8gdGhlIEdJRjg5YQotCSAqIERlbGF5IFRpbWUgdmFsdWUpLgotCSAqLwotCXB1YmxpYyBpbnQgZGVsYXlUaW1lOwotCi0JLyoqCi0JICogQXJiaXRyYXJ5IGNoYW5uZWwgd2lkdGggZGF0YSB0byA4LWJpdCBjb252ZXJzaW9uIHRhYmxlLgotCSAqLwotCXN0YXRpYyBmaW5hbCBieXRlW11bXSBBTllfVE9fRUlHSFQgPSBuZXcgYnl0ZVs5XVtdOwotCXN0YXRpYyB7Ci0JCWZvciAoaW50IGIgPSAwOyBiIDwgOTsgKytiKSB7Ci0JCQlieXRlW10gZGF0YSA9IEFOWV9UT19FSUdIVFtiXSA9IG5ldyBieXRlWzEgPDwgYl07Ci0JCQlpZiAoYiA9PSAwKSBjb250aW51ZTsKLQkJCWludCBpbmMgPSAwOwotCQkJZm9yIChpbnQgYml0ID0gMHgxMDAwMDsgKGJpdCA+Pj0gYikgIT0gMDspIGluYyB8PSBiaXQ7Ci0JCQlmb3IgKGludCB2ID0gMCwgcCA9IDA7IHYgPCAweDEwMDAwOyB2Kz0gaW5jKSBkYXRhW3ArK10gPSAoYnl0ZSkodiA+PiA4KTsKLQkJfQotCX0KLQlzdGF0aWMgZmluYWwgYnl0ZVtdIE9ORV9UT19PTkVfTUFQUElORyA9IEFOWV9UT19FSUdIVFs4XTsKLQotCS8qKgotCSAqIFNjYWxlZCA4eDggQmF5ZXIgZGl0aGVyIG1hdHJpeC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50W11bXSBESVRIRVJfTUFUUklYID0gewotCQl7IDB4ZmMwMDAwLCAweDdjMDAwMCwgMHhkYzAwMDAsIDB4NWMwMDAwLCAweGY0MDAwMCwgMHg3NDAwMDAsIDB4ZDQwMDAwLCAweDU0MDAwMCB9LAotCQl7IDB4M2MwMDAwLCAweGJjMDAwMCwgMHgxYzAwMDAsIDB4OWMwMDAwLCAweDM0MDAwMCwgMHhiNDAwMDAsIDB4MTQwMDAwLCAweDk0MDAwMCB9LAotCQl7IDB4Y2MwMDAwLCAweDRjMDAwMCwgMHhlYzAwMDAsIDB4NmMwMDAwLCAweGM0MDAwMCwgMHg0NDAwMDAsIDB4ZTQwMDAwLCAweDY0MDAwMCB9LAotCQl7IDB4MGMwMDAwLCAweDhjMDAwMCwgMHgyYzAwMDAsIDB4YWMwMDAwLCAweDA0MDAwMCwgMHg4NDAwMDAsIDB4MjQwMDAwLCAweGE0MDAwMCB9LAotCQl7IDB4ZjAwMDAwLCAweDcwMDAwMCwgMHhkMDAwMDAsIDB4NTAwMDAwLCAweGY4MDAwMCwgMHg3ODAwMDAsIDB4ZDgwMDAwLCAweDU4MDAwMCB9LAotCQl7IDB4MzAwMDAwLCAweGIwMDAwMCwgMHgxMDAwMDAsIDB4OTAwMDAwLCAweDM4MDAwMCwgMHhiODAwMDAsIDB4MTgwMDAwLCAweDk4MDAwMCB9LAotCQl7IDB4YzAwMDAwLCAweDQwMDAwMCwgMHhlMDAwMDAsIDB4NjAwMDAwLCAweGM4MDAwMCwgMHg0ODAwMDAsIDB4ZTgwMDAwLCAweDY4MDAwMCB9LAotCQl7IDB4MDAwMDAwLCAweDgwMDAwMCwgMHgyMDAwMDAsIDB4YTAwMDAwLCAweDA4MDAwMCwgMHg4ODAwMDAsIDB4MjgwMDAwLCAweGE4MDAwMCB9Ci0JfTsKLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBJbWFnZURhdGEgd2l0aCB0aGUgZ2l2ZW4gd2lkdGgsIGhlaWdodCwKLSAqIGRlcHRoIGFuZCBwYWxldHRlLiBUaGUgZGF0YSB3aWxsIGJlIGluaXRpYWxpemVkIHRvIGFuIChhbGwgemVybykKLSAqIGFycmF5IG9mIHRoZSBhcHByb3ByaWF0ZSBzaXplLgotICoKLSAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gaGVpZ2h0IHRoZSBoZWlnaHQgb2YgdGhlIGltYWdlCi0gKiBAcGFyYW0gZGVwdGggdGhlIGRlcHRoIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIHBhbGV0dGUgdGhlIHBhbGV0dGUgb2YgdGhlIGltYWdlIChtdXN0IG5vdCBiZSBudWxsKQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHdpZHRoIG9yIGhlaWdodCBpcyBuZWdhdGl2ZSwgb3IgaWYgdGhlIGRlcHRoIGlzIG5vdAotICogICAgICAgIAlvbmUgb2YgMSwgMiwgNCwgOCwgMTYsIDI0IG9yIDMyPC9saT4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBhbGV0dGUgaXMgbnVsbDwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgSW1hZ2VEYXRhKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBQYWxldHRlRGF0YSBwYWxldHRlKSB7Ci0JdGhpcyh3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgcGFsZXR0ZSwKLQkJNCwgbnVsbCwgMCwgbnVsbCwKLQkJbnVsbCwgLTEsIC0xLCBTV1QuSU1BR0VfVU5ERUZJTkVELAotCQkwLCAwLCAwLCAwKTsKLX0KLQotLyoqCi0gKiBDb25zdHJ1Y3RzIGEgbmV3LCBlbXB0eSBJbWFnZURhdGEgd2l0aCB0aGUgZ2l2ZW4gd2lkdGgsIGhlaWdodCwKLSAqIGRlcHRoLCBwYWxldHRlLCBzY2FubGluZVBhZCBhbmQgZGF0YS4KLSAqCi0gKiBAcGFyYW0gd2lkdGggdGhlIHdpZHRoIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZQotICogQHBhcmFtIGRlcHRoIHRoZSBkZXB0aCBvZiB0aGUgaW1hZ2UKLSAqIEBwYXJhbSBwYWxldHRlIHRoZSBwYWxldHRlIG9mIHRoZSBpbWFnZQotICogQHBhcmFtIHNjYW5saW5lUGFkIHRoZSBwYWRkaW5nIG9mIGVhY2ggbGluZSwgaW4gYnl0ZXMKLSAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIG9mIHRoZSBpbWFnZQotICoKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgdGhlIHdpZHRoIG9yIGhlaWdodCBpcyBuZWdhdGl2ZSwgb3IgaWYgdGhlIGRlcHRoIGlzIG5vdAotICogICAgICAgIAlvbmUgb2YgMSwgMiwgNCwgOCwgMTYsIDI0IG9yIDMyPC9saT4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgdGhlIHBhbGV0dGUgb3IgZGF0YSBpcyBudWxsPC9saT4KLSAqICAgIDxsaT5FUlJPUl9DQU5OT1RfQkVfWkVSTyAtIGlmIHRoZSBzY2FubGluZVBhZCBpcyB6ZXJvPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBJbWFnZURhdGEoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIFBhbGV0dGVEYXRhIHBhbGV0dGUsIGludCBzY2FubGluZVBhZCwgYnl0ZVtdIGRhdGEpIHsKLQl0aGlzKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBwYWxldHRlLAotCQlzY2FubGluZVBhZCwgY2hlY2tEYXRhKGRhdGEpLCAwLCBudWxsLAotCQludWxsLCAtMSwgLTEsIFNXVC5JTUFHRV9VTkRFRklORUQsCi0JCTAsIDAsIDAsIDApOwotfQotCi0vKioKLSAqIENvbnN0cnVjdHMgYW4gPGNvZGU+SW1hZ2VEYXRhPC9jb2RlPiBsb2FkZWQgZnJvbSBhIGZpbGUgd2l0aCB0aGUKLSAqIHNwZWNpZmllZCBuYW1lLiBUaHJvd3MgYW4gZXJyb3IgaWYgYW4gZXJyb3Igb2NjdXJzIGxvYWRpbmcgdGhlCi0gKiBpbWFnZSwgb3IgaWYgdGhlIGltYWdlIGhhcyBhbiB1bnN1cHBvcnRlZCB0eXBlLgotICogPHA+Ci0gKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHByb3ZpZGVkIGZvciBjb252ZW5pZW5jZSB3aGVuIGxvYWRpbmcgYSBzaW5nbGUKLSAqIGltYWdlIG9ubHkuIElmIHRoZSBmaWxlIGNvbnRhaW5zIG11bHRpcGxlIGltYWdlcywgb25seSB0aGUgZmlyc3QKLSAqIG9uZSB3aWxsIGJlIGxvYWRlZC4gVG8gbG9hZCBtdWx0aXBsZSBpbWFnZXMsIHVzZSAKLSAqIDxjb2RlPkltYWdlTG9hZGVyLmxvYWQoKTwvY29kZT4uCi0gKiA8L3A+Ci0gKgotICogQHBhcmFtIGZpbGVuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGxvYWQgdGhlIGltYWdlIGZyb20gKG11c3Qgbm90IGJlIG51bGwpCi0gKgotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiB0aGUgZmlsZSBuYW1lIGlzIG51bGw8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0lNQUdFIC0gaWYgdGhlIGltYWdlIGZpbGUgY29udGFpbnMgaW52YWxpZCBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTyBpZiBhbiBJTyBlcnJvciBvY2N1cnMgd2hpbGUgcmVhZGluZyBkYXRhPC9saT4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQgLSBpZiB0aGUgaW1hZ2UgZmlsZSBjb250YWlucyBhbiB1bnJlY29nbml6ZWQgZm9ybWF0PC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyBJbWFnZURhdGEoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JSW1hZ2VEYXRhW10gZGF0YSA9IG5ldyBJbWFnZUxvYWRlcigpLmxvYWQoZmlsZW5hbWUpOwotCWlmIChkYXRhLmxlbmd0aCA8IDEpIFNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JSW1hZ2VEYXRhIGkgPSBkYXRhWzBdOwotCXNldEFsbEZpZWxkcygKLQkJaS53aWR0aCwKLQkJaS5oZWlnaHQsCi0JCWkuZGVwdGgsCi0JCWkuc2NhbmxpbmVQYWQsCi0JCWkuYnl0ZXNQZXJMaW5lLAotCQlpLmRhdGEsCi0JCWkucGFsZXR0ZSwKLQkJaS50cmFuc3BhcmVudFBpeGVsLAotCQlpLm1hc2tEYXRhLAotCQlpLm1hc2tQYWQsCi0JCWkuYWxwaGFEYXRhLAotCQlpLmFscGhhLAotCQlpLnR5cGUsCi0JCWkueCwKLQkJaS55LAotCQlpLmRpc3Bvc2FsTWV0aG9kLAotCQlpLmRlbGF5VGltZSk7Ci19Ci0KLS8qKgotICogUHJldmVudHMgdW5pbml0aWFsaXplZCBpbnN0YW5jZXMgZnJvbSBiZWluZyBjcmVhdGVkIG91dHNpZGUgdGhlIHBhY2thZ2UuCi0gKi8KLUltYWdlRGF0YSgpIHsKLQkvL2VtcHR5IGNvbnN0cnVjdG9yCi19Ci0KLS8qKgotICogQ29uc3RydWN0cyBhbiBpbWFnZSBkYXRhIGJ5IGdpdmluZyB2YWx1ZXMgZm9yIGFsbCBub24tY29tcHV0YWJsZSBmaWVsZHMuCi0gKiA8cD4KLSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2UsIGFuZCBpcyBub3QgZGVzY3JpYmVkIGZ1cnRoZXIuCi0gKiA8L3A+Ci0gKi8KLUltYWdlRGF0YSgKLQlpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgUGFsZXR0ZURhdGEgcGFsZXR0ZSwKLQlpbnQgc2NhbmxpbmVQYWQsIGJ5dGVbXSBkYXRhLCBpbnQgbWFza1BhZCwgYnl0ZVtdIG1hc2tEYXRhLAotCWJ5dGVbXSBhbHBoYURhdGEsIGludCBhbHBoYSwgaW50IHRyYW5zcGFyZW50UGl4ZWwsIGludCB0eXBlLAotCWludCB4LCBpbnQgeSwgaW50IGRpc3Bvc2FsTWV0aG9kLCBpbnQgZGVsYXlUaW1lKQotewotCi0JaWYgKHBhbGV0dGUgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpZiAoIShkZXB0aCA9PSAxIHx8IGRlcHRoID09IDIgfHwgZGVwdGggPT0gNCB8fCBkZXB0aCA9PSA4Ci0JCXx8IGRlcHRoID09IDE2IHx8IGRlcHRoID09IDI0IHx8IGRlcHRoID09IDMyKSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCX0KLQlpZiAod2lkdGggPD0gMCB8fCBoZWlnaHQgPD0gMCkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfQVJHVU1FTlQpOwotCX0KLQlpZiAoc2NhbmxpbmVQYWQgPT0gMCkgU1dULmVycm9yIChTV1QuRVJST1JfQ0FOTk9UX0JFX1pFUk8pOwotCi0JaW50IGJ5dGVzUGVyTGluZSA9ICgoKHdpZHRoICogZGVwdGggKyA3KSAvIDgpICsgKHNjYW5saW5lUGFkIC0gMSkpCi0JCS8gc2NhbmxpbmVQYWQgKiBzY2FubGluZVBhZDsKLQlzZXRBbGxGaWVsZHMoCi0JCXdpZHRoLAotCQloZWlnaHQsCi0JCWRlcHRoLAotCQlzY2FubGluZVBhZCwKLQkJYnl0ZXNQZXJMaW5lLAotCQlkYXRhICE9IG51bGwgPyBkYXRhIDogbmV3IGJ5dGVbYnl0ZXNQZXJMaW5lICogaGVpZ2h0XSwKLQkJcGFsZXR0ZSwKLQkJdHJhbnNwYXJlbnRQaXhlbCwKLQkJbWFza0RhdGEsCi0JCW1hc2tQYWQsCi0JCWFscGhhRGF0YSwKLQkJYWxwaGEsCi0JCXR5cGUsCi0JCXgsCi0JCXksCi0JCWRpc3Bvc2FsTWV0aG9kLAotCQlkZWxheVRpbWUpOwotfQotCi0vKioKLSAqIEluaXRpYWxpemVzIGFsbCBmaWVsZHMgaW4gdGhlIHJlY2VpdmVyLiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZAotICogYnkgYWxsIHB1YmxpYyBjb25zdHJ1Y3RvcnMgdG8gZW5zdXJlIHRoYXQgYWxsIGZpZWxkcyBhcmUgaW5pdGlhbGl6ZWQKLSAqIGZvciBhIG5ldyBJbWFnZURhdGEgb2JqZWN0LiBJZiBhIG5ldyBmaWVsZCBpcyBhZGRlZCB0byB0aGUgY2xhc3MsCi0gKiB0aGVuIGl0IG11c3QgYmUgYWRkZWQgdG8gdGhpcyBtZXRob2QuCi0gKiA8cD4KLSAqIFRoaXMgbWV0aG9kIGlzIGZvciBpbnRlcm5hbCB1c2UsIGFuZCBpcyBub3QgZGVzY3JpYmVkIGZ1cnRoZXIuCi0gKiA8L3A+Ci0gKi8KLXZvaWQgc2V0QWxsRmllbGRzKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgc2NhbmxpbmVQYWQsCi0JaW50IGJ5dGVzUGVyTGluZSwgYnl0ZVtdIGRhdGEsIFBhbGV0dGVEYXRhIHBhbGV0dGUsIGludCB0cmFuc3BhcmVudFBpeGVsLAotCWJ5dGVbXSBtYXNrRGF0YSwgaW50IG1hc2tQYWQsIGJ5dGVbXSBhbHBoYURhdGEsIGludCBhbHBoYSwKLQlpbnQgdHlwZSwgaW50IHgsIGludCB5LCBpbnQgZGlzcG9zYWxNZXRob2QsIGludCBkZWxheVRpbWUpIHsKLQotCXRoaXMud2lkdGggPSB3aWR0aDsKLQl0aGlzLmhlaWdodCA9IGhlaWdodDsKLQl0aGlzLmRlcHRoID0gZGVwdGg7Ci0JdGhpcy5zY2FubGluZVBhZCA9IHNjYW5saW5lUGFkOwotCXRoaXMuYnl0ZXNQZXJMaW5lID0gYnl0ZXNQZXJMaW5lOwotCXRoaXMuZGF0YSA9IGRhdGE7Ci0JdGhpcy5wYWxldHRlID0gcGFsZXR0ZTsKLQl0aGlzLnRyYW5zcGFyZW50UGl4ZWwgPSB0cmFuc3BhcmVudFBpeGVsOwotCXRoaXMubWFza0RhdGEgPSBtYXNrRGF0YTsKLQl0aGlzLm1hc2tQYWQgPSBtYXNrUGFkOwotCXRoaXMuYWxwaGFEYXRhID0gYWxwaGFEYXRhOwotCXRoaXMuYWxwaGEgPSBhbHBoYTsKLQl0aGlzLnR5cGUgPSB0eXBlOwotCXRoaXMueCA9IHg7Ci0JdGhpcy55ID0geTsKLQl0aGlzLmRpc3Bvc2FsTWV0aG9kID0gZGlzcG9zYWxNZXRob2Q7Ci0JdGhpcy5kZWxheVRpbWUgPSBkZWxheVRpbWU7Ci19Ci0KLS8qKgkgCi0gKiBJbnZva2VzIGludGVybmFsIFNXVCBmdW5jdGlvbmFsaXR5IHRvIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZgotICogdGhpcyBjbGFzcy4KLSAqIDxwPgotICogPGI+SU1QT1JUQU5UOjwvYj4gVGhpcyBtZXRob2QgaXMgPGVtPm5vdDwvZW0+IHBhcnQgb2YgdGhlIHB1YmxpYwotICogQVBJIGZvciA8Y29kZT5JbWFnZURhdGE8L2NvZGU+LiBJdCBpcyBtYXJrZWQgcHVibGljIG9ubHkgc28gdGhhdCBpdAotICogY2FuIGJlIHNoYXJlZCB3aXRoaW4gdGhlIHBhY2thZ2VzIHByb3ZpZGVkIGJ5IFNXVC4gSXQgaXMgc3ViamVjdAotICogdG8gY2hhbmdlIHdpdGhvdXQgbm90aWNlLCBhbmQgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmcm9tCi0gKiBhcHBsaWNhdGlvbiBjb2RlLgotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIG1ldGhvZCBpcyBmb3IgaW50ZXJuYWwgdXNlLCBhbmQgaXMgbm90IGRlc2NyaWJlZCBmdXJ0aGVyLgotICogPC9wPgotICovCi1wdWJsaWMgc3RhdGljIEltYWdlRGF0YSBpbnRlcm5hbF9uZXcoCi0JaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIFBhbGV0dGVEYXRhIHBhbGV0dGUsCi0JaW50IHNjYW5saW5lUGFkLCBieXRlW10gZGF0YSwgaW50IG1hc2tQYWQsIGJ5dGVbXSBtYXNrRGF0YSwKLQlieXRlW10gYWxwaGFEYXRhLCBpbnQgYWxwaGEsIGludCB0cmFuc3BhcmVudFBpeGVsLCBpbnQgdHlwZSwKLQlpbnQgeCwgaW50IHksIGludCBkaXNwb3NhbE1ldGhvZCwgaW50IGRlbGF5VGltZSkKLXsKLQlyZXR1cm4gbmV3IEltYWdlRGF0YSgKLQkJd2lkdGgsIGhlaWdodCwgZGVwdGgsIHBhbGV0dGUsIHNjYW5saW5lUGFkLCBkYXRhLCBtYXNrUGFkLCBtYXNrRGF0YSwKLQkJYWxwaGFEYXRhLCBhbHBoYSwgdHJhbnNwYXJlbnRQaXhlbCwgdHlwZSwgeCwgeSwgZGlzcG9zYWxNZXRob2QsIGRlbGF5VGltZSk7Ci19Ci0KLUltYWdlRGF0YSBjb2xvck1hc2tJbWFnZShpbnQgcGl4ZWwpIHsKLQlJbWFnZURhdGEgbWFzayA9IG5ldyBJbWFnZURhdGEod2lkdGgsIGhlaWdodCwgMSwgYndQYWxldHRlKCksCi0JCTIsIG51bGwsIDAsIG51bGwsIG51bGwsIC0xLCAtMSwgU1dULklNQUdFX1VOREVGSU5FRCwKLQkJMCwgMCwgMCwgMCk7Ci0JaW50W10gcm93ID0gbmV3IGludFt3aWR0aF07Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotCQlnZXRQaXhlbHMoMCwgeSwgd2lkdGgsIHJvdywgMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgewotCQkJaWYgKHBpeGVsICE9IC0xICYmIHJvd1tpXSA9PSBwaXhlbCkgewotCQkJCXJvd1tpXSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXJvd1tpXSA9IDE7Ci0JCQl9Ci0JCX0KLQkJbWFzay5zZXRQaXhlbHMoMCwgeSwgd2lkdGgsIHJvdywgMCk7Ci0JfQotCXJldHVybiBtYXNrOwotfQotCi1zdGF0aWMgYnl0ZVtdIGNoZWNrRGF0YShieXRlIFtdIGRhdGEpIHsKLQlpZiAoZGF0YSA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCXJldHVybiBkYXRhOwotfQotCi0vKioKLSAqIFJldHVybnMgPGNvZGU+Z2V0V2lkdGg8L2NvZGU+IHBpeGVsIHZhbHVlcyBzdGFydGluZyBhdCBvZmZzZXQKLSAqIDxjb2RlPng8L2NvZGU+IGluIHNjYW5saW5lIDxjb2RlPnk8L2NvZGU+IGluIHRoZSByZWNlaXZlcidzCi0gKiBkYXRhIHN0YXJ0aW5nIGF0IDxjb2RlPnN0YXJ0SW5kZXg8L2NvZGU+LgotICoKLSAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwaXhlbCB0byBnZXQKLSAqIEBwYXJhbSB5IHRoZSB5IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwaXhlbCB0byBnZXQKLSAqIEBwYXJhbSBnZXRXaWR0aCB0aGUgd2lkdGggb2YgdGhlIGRhdGEgdG8gZ2V0Ci0gKiBAcGFyYW0gcGl4ZWxzIHRoZSBidWZmZXIgaW4gd2hpY2ggdG8gcHV0IHRoZSBwaXhlbHMKLSAqIEBwYXJhbSBzdGFydEluZGV4IHRoZSBvZmZzZXQgaW50byB0aGUgYnl0ZSBhcnJheSB0byBiZWdpbiBzdG9yaW5nIHBpeGVscwotICoKLSAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBnZXRXaWR0aCBpcyB0b28gbGFyZ2UKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgcGl4ZWxzIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB4IG9yIHkgaXMgb3V0IG9mIGJvdW5kczwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIGdldFdpZHRoIGlzIG5lZ2F0aXZlPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfREVQVEggLSBpZiB0aGUgZGVwdGggaXMgbm90IG9uZSBvZiAxLCAyLCA0IG9yIDgKLSAqICAgICAgICAoRm9yIGhpZ2hlciBkZXB0aHMsIHVzZSB0aGUgaW50W10gdmVyc2lvbiBvZiB0aGlzIG1ldGhvZC4pPC9saT4KLSAqIDwvdWw+Ci0gKi8KLXB1YmxpYyB2b2lkIGdldFBpeGVscyhpbnQgeCwgaW50IHksIGludCBnZXRXaWR0aCwgYnl0ZVtdIHBpeGVscywgaW50IHN0YXJ0SW5kZXgpIHsKLQlpZiAocGl4ZWxzID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaWYgKGdldFdpZHRoIDwgMCB8fCB4ID49IHdpZHRoIHx8IHkgPj0gaGVpZ2h0IHx8IHggPCAwIHx8IHkgPCAwKSBTV1QuZXJyb3IKLQotKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQlpZiAoZ2V0V2lkdGggPT0gMCkgcmV0dXJuOwotCWludCBpbmRleDsKLQlpbnQgdGhlQnl0ZTsKLQlpbnQgbWFzayA9IDA7Ci0JaW50IG4gPSBnZXRXaWR0aDsKLQlpbnQgaSA9IHN0YXJ0SW5kZXg7Ci0JaW50IHNyY1ggPSB4LCBzcmNZID0geTsKLQlpZiAoZGVwdGggPT0gMSkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDMpOwotCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCW1hc2sgPSAxIDw8ICg3IC0gKHNyY1ggJiAweDcpKTsKLQkJCWlmICgodGhlQnl0ZSAmIG1hc2spID09IDApIHsKLQkJCQlwaXhlbHNbaV0gPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlwaXhlbHNbaV0gPSAxOwotCQkJfQotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCWlmIChuID4gMCkgdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG1hc2sgPT0gMSkgewotCQkJCQlpbmRleCsrOwotCQkJCQlpZiAobiA+IDApIHRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDIpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAyKTsKLQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJaW50IG9mZnNldDsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQlvZmZzZXQgPSAzIC0gKHNyY1ggJSA0KTsKLQkJCW1hc2sgPSAzIDw8IChvZmZzZXQgKiAyKTsKLQkJCXBpeGVsc1tpXSA9IChieXRlKSgodGhlQnl0ZSAmIG1hc2spID4+IChvZmZzZXQgKiAyKSk7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJaWYgKG4gPiAwKSB0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob2Zmc2V0ID09IDApIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gNCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDEpOwotCQlpZiAoKHggJiAweDEpID09IDEpIHsKLQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlwaXhlbHNbaV0gPSAoYnl0ZSkodGhlQnl0ZSAmIDB4MEYpOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCsrOwotCQkJfQotCQl9Ci0JCXdoaWxlIChuID4gMSkgewotCQkJdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCXBpeGVsc1tpXSA9IChieXRlKSh0aGVCeXRlID4+IDQpOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlwaXhlbHNbaV0gPSAoYnl0ZSkodGhlQnl0ZSAmIDB4MEYpOwotCQkJCWkrKzsKLQkJCQluLS07Ci0JCQkJc3JjWCsrOwotCQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJCXNyY1krKzsKLQkJCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCQlzcmNYID0gMDsKLQkJCQl9IGVsc2UgewotCQkJCQlpbmRleCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobiA+IDApIHsKLQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQlwaXhlbHNbaV0gPSAoYnl0ZSkodGhlQnl0ZSA+PiA0KTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSA4KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgeDsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBnZXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbHNbaV0gPSBkYXRhW2luZGV4XTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCVNXVC5lcnJvcihTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgpOwotfQotCi0vKioKLSAqIFJldHVybnMgPGNvZGU+Z2V0V2lkdGg8L2NvZGU+IHBpeGVsIHZhbHVlcyBzdGFydGluZyBhdCBvZmZzZXQKLSAqIDxjb2RlPng8L2NvZGU+IGluIHNjYW5saW5lIDxjb2RlPnk8L2NvZGU+IGluIHRoZSByZWNlaXZlcidzCi0gKiBkYXRhIHN0YXJ0aW5nIGF0IDxjb2RlPnN0YXJ0SW5kZXg8L2NvZGU+LgotICoKLSAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwaXhlbCB0byBnZXQKLSAqIEBwYXJhbSB5IHRoZSB5IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBwaXhlbCB0byBnZXQKLSAqIEBwYXJhbSBnZXRXaWR0aCB0aGUgd2lkdGggb2YgdGhlIGRhdGEgdG8gZ2V0Ci0gKiBAcGFyYW0gcGl4ZWxzIHRoZSBidWZmZXIgaW4gd2hpY2ggdG8gcHV0IHRoZSBwaXhlbHMKLSAqIEBwYXJhbSBzdGFydEluZGV4IHRoZSBvZmZzZXQgaW50byB0aGUgYnVmZmVyIHRvIGJlZ2luIHN0b3JpbmcgcGl4ZWxzCi0gKgotICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGdldFdpZHRoIGlzIHRvbyBsYXJnZQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiBwaXhlbHMgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHggb3IgeSBpcyBvdXQgb2YgYm91bmRzPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgZ2V0V2lkdGggaXMgbmVnYXRpdmU8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCAtIGlmIHRoZSBkZXB0aCBpcyBub3Qgb25lIG9mIDEsIDIsIDQsIDgsIDE2LCAyNCBvciAzMjwvbGk+Ci0gKiA8L3VsPgotICovCi1wdWJsaWMgdm9pZCBnZXRQaXhlbHMoaW50IHgsIGludCB5LCBpbnQgZ2V0V2lkdGgsIGludFtdIHBpeGVscywgaW50IHN0YXJ0SW5kZXgpIHsKLQlpZiAocGl4ZWxzID09IG51bGwpIFNXVC5lcnJvcihTV1QuRVJST1JfTlVMTF9BUkdVTUVOVCk7Ci0JaWYgKGdldFdpZHRoIDwgMCB8fCB4ID49IHdpZHRoIHx8IHkgPj0gaGVpZ2h0IHx8IHggPCAwIHx8IHkgPCAwKSBTV1QuZXJyb3IKLQotKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQlpZiAoZ2V0V2lkdGggPT0gMCkgcmV0dXJuOwotCWludCBpbmRleDsKLQlpbnQgdGhlQnl0ZTsKLQlpbnQgbWFzazsKLQlpbnQgbiA9IGdldFdpZHRoOwotCWludCBpID0gc3RhcnRJbmRleDsKLQlpbnQgc3JjWCA9IHgsIHNyY1kgPSB5OwotCWlmIChkZXB0aCA9PSAxKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMyk7Ci0JCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJbWFzayA9IDEgPDwgKDcgLSAoc3JjWCAmIDB4NykpOwotCQkJaWYgKCh0aGVCeXRlICYgbWFzaykgPT0gMCkgewotCQkJCXBpeGVsc1tpXSA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCXBpeGVsc1tpXSA9IDE7Ci0JCQl9Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJaWYgKG4gPiAwKSB0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAobWFzayA9PSAxKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCWlmIChuID4gMCkgdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0JCQotCWlmIChkZXB0aCA9PSAyKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMik7Ci0JCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCWludCBvZmZzZXQ7Ci0JCXdoaWxlIChuID4gMCkgewotCQkJb2Zmc2V0ID0gMyAtIChzcmNYICUgNCk7Ci0JCQltYXNrID0gMyA8PCAob2Zmc2V0ICogMik7Ci0JCQlwaXhlbHNbaV0gPSAoYnl0ZSkoKHRoZUJ5dGUgJiBtYXNrKSA+PiAob2Zmc2V0ICogMikpOwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCWlmIChuID4gMCkgdGhlQnl0ZSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJCXRoZUJ5dGUgPSBkYXRhW2luZGV4XSAmIDB4RkY7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDQpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyAoeCA+PiAxKTsKLQkJaWYgKCh4ICYgMHgxKSA9PSAxKSB7Ci0JCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJcGl4ZWxzW2ldID0gdGhlQnl0ZSAmIDB4MEY7Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKG4gPiAxKSB7Ci0JCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJcGl4ZWxzW2ldID0gdGhlQnl0ZSA+PiA0OwotCQkJaSsrOwotCQkJbi0tOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlwaXhlbHNbaV0gPSB0aGVCeXRlICYgMHgwRjsKLQkJCQlpKys7Ci0JCQkJbi0tOwotCQkJCXNyY1grKzsKLQkJCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCQlzcmNZKys7Ci0JCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQkJc3JjWCA9IDA7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKG4gPiAwKSB7Ci0JCQl0aGVCeXRlID0gZGF0YVtpbmRleF0gJiAweEZGOwotCQkJcGl4ZWxzW2ldID0gdGhlQnl0ZSA+PiA0OwotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDgpIHsKLQkJaW5kZXggPSAoeSAqIGJ5dGVzUGVyTGluZSkgKyB4OwotCQlmb3IgKGludCBqID0gMDsgaiA8IGdldFdpZHRoOyBqKyspIHsKLQkJCXBpeGVsc1tpXSA9IGRhdGFbaW5kZXhdICYgMHhGRjsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXgrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAxNikgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ICogMik7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZ2V0V2lkdGg7IGorKykgewotCQkJcGl4ZWxzW2ldID0gKChkYXRhW2luZGV4KzFdICYgMHhGRikgPDwgOCkgKyAoZGF0YVtpbmRleF0gJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gMjsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCWlmIChkZXB0aCA9PSAyNCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ICogMyk7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZ2V0V2lkdGg7IGorKykgewotCQkJcGl4ZWxzW2ldID0gKChkYXRhW2luZGV4XSAmIDB4RkYpIDw8IDE2KSB8ICgoZGF0YVtpbmRleCsxXSAmIDB4RkYpIDw8IDgpCi0JCQkJfCAoZGF0YVtpbmRleCsyXSAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSAzOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDMyKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggKiA0KTsKLQkJaSA9IHN0YXJ0SW5kZXg7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgZ2V0V2lkdGg7IGorKykgewotCQkJcGl4ZWxzW2ldID0gKChkYXRhW2luZGV4XSAmIDB4RkYpIDw8IDI0KSB8ICgoZGF0YVtpbmRleCsxXSAmIDB4RkYpIDw8IDE2KQotCQkJCXwgKChkYXRhW2luZGV4KzJdICYgMHhGRikgPDwgOCkgfCAoZGF0YVtpbmRleCszXSAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSA0OwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JU1dULmVycm9yKFNXVC5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCk7Ci19Ci0KLS8qKgotICogUmV0dXJucyBhbiBhcnJheSBvZiA8Y29kZT5SR0I8L2NvZGU+cyB3aGljaCBjb21wcmlzZSB0aGUKLSAqIGluZGV4ZWQgY29sb3IgdGFibGUgb2YgdGhlIHJlY2VpdmVyLCBvciBudWxsIGlmIHRoZSByZWNlaXZlcgotICogaGFzIGEgZGlyZWN0IGNvbG9yIG1vZGVsLgotICoKLSAqIEByZXR1cm4gdGhlIFJHQiB2YWx1ZXMgZm9yIHRoZSBpbWFnZSBvciBudWxsIGlmIGRpcmVjdCBjb2xvcgotICoKLSAqIEBzZWUgUGFsZXR0ZURhdGEjZ2V0UkdCcygpCi0gKi8KLXB1YmxpYyBSR0JbXSBnZXRSR0JzKCkgewotCXJldHVybiBwYWxldHRlLmdldFJHQnMoKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIGFuIDxjb2RlPkltYWdlRGF0YTwvY29kZT4gd2hpY2ggc3BlY2lmaWVzIHRoZQotICogdHJhbnNwYXJlbmN5IG1hc2sgaW5mb3JtYXRpb24gZm9yIHRoZSByZWNlaXZlciwgb3IgbnVsbCBpZiB0aGUKLSAqIHJlY2VpdmVyIGhhcyBubyB0cmFuc3BhcmVuY3kgYW5kIGlzIG5vdCBhbiBpY29uLgotICoKLSAqIEByZXR1cm4gdGhlIHRyYW5zcGFyZW5jeSBtYXNrIG9yIG51bGwgaWYgbm9uZSBleGlzdHMKLSAqLwotcHVibGljIEltYWdlRGF0YSBnZXRUcmFuc3BhcmVuY3lNYXNrKCkgewotCWlmIChnZXRUcmFuc3BhcmVuY3lUeXBlKCkgPT0gU1dULlRSQU5TUEFSRU5DWV9NQVNLKSB7Ci0JCXJldHVybiBuZXcgSW1hZ2VEYXRhKHdpZHRoLCBoZWlnaHQsIDEsIGJ3UGFsZXR0ZSgpLCBtYXNrUGFkLCBtYXNrRGF0YSk7Ci0JfQotCXJldHVybiBjb2xvck1hc2tJbWFnZSh0cmFuc3BhcmVudFBpeGVsKTsKLX0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBpbWFnZSB0cmFuc3BhcmVuY3kgdHlwZS4KLSAqCi0gKiBAcmV0dXJuIHRoZSByZWNlaXZlcidzIHRyYW5zcGFyZW5jeSB0eXBlCi0gKi8KLXB1YmxpYyBpbnQgZ2V0VHJhbnNwYXJlbmN5VHlwZSgpIHsKLQlpZiAobWFza0RhdGEgIT0gbnVsbCkgcmV0dXJuIFNXVC5UUkFOU1BBUkVOQ1lfTUFTSzsKLQlpZiAodHJhbnNwYXJlbnRQaXhlbCAhPSAtMSkgcmV0dXJuIFNXVC5UUkFOU1BBUkVOQ1lfUElYRUw7Ci0JaWYgKGFscGhhRGF0YSAhPSBudWxsKSByZXR1cm4gU1dULlRSQU5TUEFSRU5DWV9BTFBIQTsKLQlyZXR1cm4gU1dULlRSQU5TUEFSRU5DWV9OT05FOwotfQotCi0vKioKLSAqIFJldHVybnMgdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIHJlY2VpdmVyLgotICogCi0gKiBAcmV0dXJuIE1TQl9GSVJTVCBvciBMU0JfRklSU1QKLSAqLwotaW50IGdldEJ5dGVPcmRlcigpIHsKLQlyZXR1cm4gZGVwdGggIT0gMTYgPyBNU0JfRklSU1QgOiBMU0JfRklSU1Q7Ci19Ci0KLS8qKgotICogU2V0cyB0aGUgcGl4ZWwgdmFsdWVzIHN0YXJ0aW5nIGF0IG9mZnNldCA8Y29kZT54PC9jb2RlPiBpbgotICogc2NhbmxpbmUgPGNvZGU+eTwvY29kZT4gaW4gdGhlIHJlY2VpdmVyJ3MgZGF0YSB0byB0aGUKLSAqIHZhbHVlcyBmcm9tIHRoZSBhcnJheSA8Y29kZT5waXhlbHM8L2NvZGU+IHN0YXJ0aW5nIGF0Ci0gKiA8Y29kZT5zdGFydEluZGV4PC9jb2RlPi4KLSAqCi0gKiBAcGFyYW0geCB0aGUgeCBwb3NpdGlvbiBvZiB0aGUgcGl4ZWwgdG8gc2V0Ci0gKiBAcGFyYW0geSB0aGUgeSBwb3NpdGlvbiBvZiB0aGUgcGl4ZWwgdG8gc2V0Ci0gKiBAcGFyYW0gcHV0V2lkdGggdGhlIHdpZHRoIG9mIHRoZSBwaXhlbHMgdG8gc2V0Ci0gKiBAcGFyYW0gcGl4ZWxzIHRoZSBwaXhlbHMgdG8gc2V0Ci0gKiBAcGFyYW0gc3RhcnRJbmRleCB0aGUgaW5kZXggYXQgd2hpY2ggdG8gYmVnaW4gc2V0dGluZwotICoKLSAqIEBleGNlcHRpb24gSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBwdXRXaWR0aCBpcyB0b28gbGFyZ2UKLSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9OVUxMX0FSR1VNRU5UIC0gaWYgcGl4ZWxzIGlzIG51bGw8L2xpPgotICogICAgPGxpPkVSUk9SX0lOVkFMSURfQVJHVU1FTlQgLSBpZiB4IG9yIHkgaXMgb3V0IG9mIGJvdW5kczwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHB1dFdpZHRoIGlzIG5lZ2F0aXZlPC9saT4KLSAqIDwvdWw+Ci0gKiBAZXhjZXB0aW9uIFNXVEV4Y2VwdGlvbiA8dWw+Ci0gKiAgICA8bGk+RVJST1JfVU5TVVBQT1JURURfREVQVEggaWYgdGhlIGRlcHRoIGlzIG5vdCBvbmUgb2YgMSwgMiwgNCwgOAotICogICAgICAgIChGb3IgaGlnaGVyIGRlcHRocywgdXNlIHRoZSBpbnRbXSB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kLik8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHB1dFdpZHRoLCBieXRlW10gcGl4ZWxzLCBpbnQgc3RhcnRJbmRleCkgewotCWlmIChwaXhlbHMgPT0gbnVsbCkgU1dULmVycm9yKFNXVC5FUlJPUl9OVUxMX0FSR1VNRU5UKTsKLQlpZiAocHV0V2lkdGggPCAwIHx8IHggPj0gd2lkdGggfHwgeSA+PSBoZWlnaHQgfHwgeCA8IDAgfHwgeSA8IDApIFNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9BUkdVTUVOVCk7Ci0JaWYgKHB1dFdpZHRoID09IDApIHJldHVybjsKLQlpbnQgaW5kZXg7Ci0JaW50IHRoZUJ5dGU7Ci0JaW50IG1hc2s7Ci0JaW50IG4gPSBwdXRXaWR0aDsKLQlpbnQgaSA9IHN0YXJ0SW5kZXg7Ci0JaW50IHNyY1ggPSB4LCBzcmNZID0geTsKLQlpZiAoZGVwdGggPT0gMSkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDMpOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCW1hc2sgPSAxIDw8ICg3IC0gKHNyY1ggJiAweDcpKTsKLQkJCWlmICgocGl4ZWxzW2ldICYgMHgxKSA9PSAxKSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHhGRikgfCBtYXNrKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHhGRikgJiAobWFzayBeIC0xKSk7Ci0JCQl9Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChtYXNrID09IDEpIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMikgewotCQlieXRlIFtdIG1hc2tzID0geyAoYnl0ZSkweEZDLCAoYnl0ZSkweEYzLCAoYnl0ZSkweENGLCAoYnl0ZSkweDNGIH07Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMik7Ci0JCWludCBvZmZzZXQgPSAzIC0gKHggJSA0KTsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQl0aGVCeXRlID0gcGl4ZWxzW2ldICYgMHgzOwotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgbWFza3Nbb2Zmc2V0XSkgfCAodGhlQnl0ZSA8PCAob2Zmc2V0ICogMikpKTsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlvZmZzZXQgPSAwOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob2Zmc2V0ID09IDApIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJb2Zmc2V0ID0gMzsKLQkJCQl9IGVsc2UgewotCQkJCQlvZmZzZXQtLTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gNCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDEpOwotCQlib29sZWFuIGhpZ2ggPSAoeCAmIDB4MSkgPT0gMDsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQl0aGVCeXRlID0gcGl4ZWxzW2ldICYgMHgwRjsKLQkJCWlmIChoaWdoKSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHgwRikgfCAodGhlQnl0ZSA8PCA0KSk7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4RjApIHwgdGhlQnl0ZSk7Ci0JCQl9Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJaGlnaCA9IHRydWU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghaGlnaCkgaW5kZXgrKzsKLQkJCQloaWdoID0gIWhpZ2g7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gOCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArIHg7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcHV0V2lkdGg7IGorKykgewotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkocGl4ZWxzW2ldICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlTV1QuZXJyb3IoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0RFUFRIKTsKLX0KLQotLyoqCi0gKiBTZXRzIHRoZSBwaXhlbCB2YWx1ZXMgc3RhcnRpbmcgYXQgb2Zmc2V0IDxjb2RlPng8L2NvZGU+IGluCi0gKiBzY2FubGluZSA8Y29kZT55PC9jb2RlPiBpbiB0aGUgcmVjZWl2ZXIncyBkYXRhIHRvIHRoZQotICogdmFsdWVzIGZyb20gdGhlIGFycmF5IDxjb2RlPnBpeGVsczwvY29kZT4gc3RhcnRpbmcgYXQKLSAqIDxjb2RlPnN0YXJ0SW5kZXg8L2NvZGU+LgotICoKLSAqIEBwYXJhbSB4IHRoZSB4IHBvc2l0aW9uIG9mIHRoZSBwaXhlbCB0byBzZXQKLSAqIEBwYXJhbSB5IHRoZSB5IHBvc2l0aW9uIG9mIHRoZSBwaXhlbCB0byBzZXQKLSAqIEBwYXJhbSBwdXRXaWR0aCB0aGUgd2lkdGggb2YgdGhlIHBpeGVscyB0byBzZXQKLSAqIEBwYXJhbSBwaXhlbHMgdGhlIHBpeGVscyB0byBzZXQKLSAqIEBwYXJhbSBzdGFydEluZGV4IHRoZSBpbmRleCBhdCB3aGljaCB0byBiZWdpbiBzZXR0aW5nCi0gKgotICogQGV4Y2VwdGlvbiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHB1dFdpZHRoIGlzIHRvbyBsYXJnZQotICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gPHVsPgotICogICAgPGxpPkVSUk9SX05VTExfQVJHVU1FTlQgLSBpZiBwaXhlbHMgaXMgbnVsbDwvbGk+Ci0gKiAgICA8bGk+RVJST1JfSU5WQUxJRF9BUkdVTUVOVCAtIGlmIHggb3IgeSBpcyBvdXQgb2YgYm91bmRzPC9saT4KLSAqICAgIDxsaT5FUlJPUl9JTlZBTElEX0FSR1VNRU5UIC0gaWYgcHV0V2lkdGggaXMgbmVnYXRpdmU8L2xpPgotICogPC91bD4KLSAqIEBleGNlcHRpb24gU1dURXhjZXB0aW9uIDx1bD4KLSAqICAgIDxsaT5FUlJPUl9VTlNVUFBPUlRFRF9ERVBUSCBpZiB0aGUgZGVwdGggaXMgbm90IG9uZSBvZiAxLCAyLCA0LCA4LCAxNiwgMjQgb3IgMzI8L2xpPgotICogPC91bD4KLSAqLwotcHVibGljIHZvaWQgc2V0UGl4ZWxzKGludCB4LCBpbnQgeSwgaW50IHB1dFdpZHRoLCBpbnRbXSBwaXhlbHMsIGludCBzdGFydEluZGV4KSB7Ci0JaWYgKHBpeGVscyA9PSBudWxsKSBTV1QuZXJyb3IoU1dULkVSUk9SX05VTExfQVJHVU1FTlQpOwotCWlmIChwdXRXaWR0aCA8IDAgfHwgeCA+PSB3aWR0aCB8fCB5ID49IGhlaWdodCB8fCB4IDwgMCB8fCB5IDwgMCkgU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0FSR1VNRU5UKTsKLQlpZiAocHV0V2lkdGggPT0gMCkgcmV0dXJuOwotCWludCBpbmRleDsKLQlpbnQgdGhlQnl0ZTsKLQlpbnQgbWFzazsKLQlpbnQgbiA9IHB1dFdpZHRoOwotCWludCBpID0gc3RhcnRJbmRleDsKLQlpbnQgcGl4ZWw7Ci0JaW50IHNyY1ggPSB4LCBzcmNZID0geTsKLQlpZiAoZGVwdGggPT0gMSkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDMpOwotCQl3aGlsZSAobiA+IDApIHsKLQkJCW1hc2sgPSAxIDw8ICg3IC0gKHNyY1ggJiAweDcpKTsKLQkJCWlmICgocGl4ZWxzW2ldICYgMHgxKSA9PSAxKSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHhGRikgfCBtYXNrKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHhGRikgJiAobWFzayBeIC0xKSk7Ci0JCQl9Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChtYXNrID09IDEpIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gMikgewotCQlieXRlIFtdIG1hc2tzID0geyAoYnl0ZSkweEZDLCAoYnl0ZSkweEYzLCAoYnl0ZSkweENGLCAoYnl0ZSkweDNGIH07Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggPj4gMik7Ci0JCWludCBvZmZzZXQgPSAzIC0gKHggJSA0KTsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQl0aGVCeXRlID0gcGl4ZWxzW2ldICYgMHgzOwotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgbWFza3Nbb2Zmc2V0XSkgfCAodGhlQnl0ZSA8PCAob2Zmc2V0ICogMikpKTsKLQkJCWkrKzsKLQkJCW4tLTsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlvZmZzZXQgPSAzOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAob2Zmc2V0ID09IDApIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQkJb2Zmc2V0ID0gMzsKLQkJCQl9IGVsc2UgewotCQkJCQlvZmZzZXQtLTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gNCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ID4+IDEpOwotCQlib29sZWFuIGhpZ2ggPSAoeCAmIDB4MSkgPT0gMDsKLQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQl0aGVCeXRlID0gcGl4ZWxzW2ldICYgMHgwRjsKLQkJCWlmIChoaWdoKSB7Ci0JCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkoKGRhdGFbaW5kZXhdICYgMHgwRikgfCAodGhlQnl0ZSA8PCA0KSk7Ci0JCQl9IGVsc2UgewotCQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChkYXRhW2luZGV4XSAmIDB4RjApIHwgdGhlQnl0ZSk7Ci0JCQl9Ci0JCQlpKys7Ci0JCQluLS07Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJaGlnaCA9IHRydWU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWlmICghaGlnaCkgaW5kZXgrKzsKLQkJCQloaWdoID0gIWhpZ2g7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQlpZiAoZGVwdGggPT0gOCkgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArIHg7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcHV0V2lkdGg7IGorKykgewotCQkJZGF0YVtpbmRleF0gPSAoYnl0ZSkocGl4ZWxzW2ldICYgMHhGRik7Ci0JCQlpKys7Ci0JCQlzcmNYKys7Ci0JCQlpZiAoc3JjWCA+PSB3aWR0aCkgewotCQkJCXNyY1krKzsKLQkJCQlpbmRleCA9IHNyY1kgKiBieXRlc1BlckxpbmU7Ci0JCQkJc3JjWCA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCWluZGV4Kys7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCi0JfQotCWlmIChkZXB0aCA9PSAxNikgewotCQlpbmRleCA9ICh5ICogYnl0ZXNQZXJMaW5lKSArICh4ICogMik7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgcHV0V2lkdGg7IGorKykgewotCQkJcGl4ZWwgPSBwaXhlbHNbaV07Ci0JCQlkYXRhW2luZGV4XSA9IChieXRlKShwaXhlbCAmIDB4RkYpOwotCQkJZGF0YVtpbmRleCArIDFdID0gKGJ5dGUpKChwaXhlbCA+PiA4KSAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSAyOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDI0KSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggKiAzKTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwdXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbCA9IHBpeGVsc1tpXTsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChwaXhlbCA+PiAxNikgJiAweEZGKTsKLQkJCWRhdGFbaW5kZXggKyAxXSA9IChieXRlKSgocGl4ZWwgPj4gOCkgJiAweEZGKTsKLQkJCWRhdGFbaW5kZXggKyAyXSA9IChieXRlKShwaXhlbCAmIDB4RkYpOwotCQkJaSsrOwotCQkJc3JjWCsrOwotCQkJaWYgKHNyY1ggPj0gd2lkdGgpIHsKLQkJCQlzcmNZKys7Ci0JCQkJaW5kZXggPSBzcmNZICogYnl0ZXNQZXJMaW5lOwotCQkJCXNyY1ggPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlpbmRleCArPSAzOwotCQkJfQotCQl9Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGRlcHRoID09IDMyKSB7Ci0JCWluZGV4ID0gKHkgKiBieXRlc1BlckxpbmUpICsgKHggKiA0KTsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBwdXRXaWR0aDsgaisrKSB7Ci0JCQlwaXhlbCA9IHBpeGVsc1tpXTsKLQkJCWRhdGFbaW5kZXhdID0gKGJ5dGUpKChwaXhlbCA+PiAyNCkgJiAweEZGKTsKLQkJCWRhdGFbaW5kZXggKyAxXSA9IChieXRlKSgocGl4ZWwgPj4gMTYpICYgMHhGRik7Ci0JCQlkYXRhW2luZGV4ICsgMl0gPSAoYnl0ZSkoKHBpeGVsID4+IDgpICYgMHhGRik7Ci0JCQlkYXRhW2luZGV4ICsgM10gPSAoYnl0ZSkocGl4ZWwgJiAweEZGKTsKLQkJCWkrKzsKLQkJCXNyY1grKzsKLQkJCWlmIChzcmNYID49IHdpZHRoKSB7Ci0JCQkJc3JjWSsrOwotCQkJCWluZGV4ID0gc3JjWSAqIGJ5dGVzUGVyTGluZTsKLQkJCQlzcmNYID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaW5kZXggKz0gNDsKLQkJCX0KLQkJfQotCQlyZXR1cm47Ci0JfQotCVNXVC5lcnJvcihTV1QuRVJST1JfVU5TVVBQT1JURURfREVQVEgpOwotfQotCi0vKioKLSAqIFJldHVybnMgYSBwYWxldHRlIHdpdGggMiBjb2xvcnM6IGJsYWNrICYgd2hpdGUuCi0gKi8KLXN0YXRpYyBQYWxldHRlRGF0YSBid1BhbGV0dGUoKSB7Ci0JcmV0dXJuIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW10ge25ldyBSR0IoMCwgMCwgMCksIG5ldyBSR0IoMjU1LCAyNTUsIDI1NSl9KTsKLX0KLQotLyoqCi0gKiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IGZvcgotICogdGhlIGdpdmVuIG1hc2suCi0gKi8KLXN0YXRpYyBpbnQgZ2V0TVNCT2Zmc2V0KGludCBtYXNrKSB7Ci0JZm9yIChpbnQgaSA9IDMxOyBpID49IDA7IGktLSkgewotCQlpZiAoKChtYXNrID4+IGkpICYgMHgxKSAhPSAwKSByZXR1cm4gaSArIDE7Ci0JfQotCXJldHVybiAwOwotfQotCi0vKioKLSAqIEZpbmRzIHRoZSBjbG9zZXN0IG1hdGNoLgotICovCi1zdGF0aWMgaW50IGNsb3Nlc3RNYXRjaChpbnQgZGVwdGgsIGJ5dGUgcmVkLCBieXRlIGdyZWVuLCBieXRlIGJsdWUsIGludCByZWRNYXNrLCBpbnQgZ3JlZW5NYXNrLCBpbnQgYmx1ZU1hc2ssIGJ5dGVbXSByZWRzLCBieXRlW10gZ3JlZW5zLCBieXRlW10gYmx1ZXMpIHsKLQlpZiAoZGVwdGggPiA4KSB7Ci0JCWludCByc2hpZnQgPSAzMiAtIGdldE1TQk9mZnNldChyZWRNYXNrKTsKLQkJaW50IGdzaGlmdCA9IDMyIC0gZ2V0TVNCT2Zmc2V0KGdyZWVuTWFzayk7Ci0JCWludCBic2hpZnQgPSAzMiAtIGdldE1TQk9mZnNldChibHVlTWFzayk7Ci0JCXJldHVybiAoKChyZWQgPDwgMjQpID4+PiByc2hpZnQpICYgcmVkTWFzaykgfAotCQkJKCgoZ3JlZW4gPDwgMjQpID4+PiBnc2hpZnQpICYgZ3JlZW5NYXNrKSB8Ci0JCQkoKChibHVlIDw8IDI0KSA+Pj4gYnNoaWZ0KSAmIGJsdWVNYXNrKTsKLQl9Ci0JaW50IHIsIGcsIGI7Ci0JaW50IG1pbkRpc3RhbmNlID0gMHg3ZmZmZmZmZjsKLQlpbnQgbmVhcmVzdFBpeGVsID0gMDsKLQlpbnQgbiA9IHJlZHMubGVuZ3RoOwotCWZvciAoaW50IGogPSAwOyBqIDwgbjsgaisrKSB7Ci0JCXIgPSAocmVkc1tqXSAmIDB4RkYpIC0gKHJlZCAmIDB4RkYpOwotCQlnID0gKGdyZWVuc1tqXSAmIDB4RkYpIC0gKGdyZWVuICYgMHhGRik7Ci0JCWIgPSAoYmx1ZXNbal0gJiAweEZGKSAtIChibHVlICYgMHhGRik7Ci0JCWludCBkaXN0YW5jZSA9IHIqciArIGcqZyArIGIqYjsKLQkJaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHsKLQkJCW5lYXJlc3RQaXhlbCA9IGo7Ci0JCQlpZiAoZGlzdGFuY2UgPT0gMCkgYnJlYWs7Ci0JCQltaW5EaXN0YW5jZSA9IGRpc3RhbmNlOwotCQl9Ci0JfQotCXJldHVybiBuZWFyZXN0UGl4ZWw7Ci19Ci0KLXN0YXRpYyBmaW5hbCBJbWFnZURhdGEgY29udmVydE1hc2soSW1hZ2VEYXRhIG1hc2spIHsKLQlpZiAobWFzay5kZXB0aCA9PSAxKSByZXR1cm4gbWFzazsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXSB7bmV3IFJHQigwLCAwLCAwKSwgbmV3IFJHQigyNTUsMjU1LDI1NSl9KTsKLQlJbWFnZURhdGEgbmV3TWFzayA9IG5ldyBJbWFnZURhdGEobWFzay53aWR0aCwgbWFzay5oZWlnaHQsIDEsIHBhbGV0dGUpOwotCS8qIEZpbmQgaW5kZXggb2YgYmxhY2sgaW4gbWFzayBwYWxldHRlICovCi0JaW50IGJsYWNrSW5kZXggPSAwOwotCVJHQltdIHJnYnMgPSBtYXNrLmdldFJHQnMoKTsKLQlpZiAocmdicyAhPSBudWxsKSB7Ci0JCXdoaWxlIChibGFja0luZGV4IDwgcmdicy5sZW5ndGgpIHsKLQkJCWlmIChyZ2JzW2JsYWNrSW5kZXhdLmVxdWFscyhwYWxldHRlLmNvbG9yc1swXSkpIGJyZWFrOwotCQkJYmxhY2tJbmRleCsrOwotCQl9Ci0JfQotCWludFtdIHBpeGVscyA9IG5ldyBpbnRbbWFzay53aWR0aF07Ci0JZm9yIChpbnQgeSA9IDA7IHkgPCBtYXNrLmhlaWdodDsgeSsrKSB7Ci0JCW1hc2suZ2V0UGl4ZWxzKDAsIHksIG1hc2sud2lkdGgsIHBpeGVscywgMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGl4ZWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocGl4ZWxzW2ldID09IGJsYWNrSW5kZXgpIHsKLQkJCQlwaXhlbHNbaV0gPSAwOwotCQkJfSBlbHNlIHsKLQkJCQlwaXhlbHNbaV0gPSAxOwotCQkJfQotCQl9Ci0JCW5ld01hc2suc2V0UGl4ZWxzKDAsIHksIG1hc2sud2lkdGgsIHBpeGVscywgMCk7Ci0JfQotCXJldHVybiBuZXdNYXNrOwotfQotCi1zdGF0aWMgZmluYWwgYnl0ZVtdIGNvbnZlcnRQYWQoYnl0ZVtdIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgcGFkLCBpbnQgbmV3UGFkKSB7Ci0JaWYgKHBhZCA9PSBuZXdQYWQpIHJldHVybiBkYXRhOwotCWludCBzdHJpZGUgPSAod2lkdGggKiBkZXB0aCArIDcpIC8gODsKLQlpbnQgYnBsID0gKHN0cmlkZSArIChwYWQgLSAxKSkgLyBwYWQgKiBwYWQ7CQotCWludCBuZXdCcGwgPSAoc3RyaWRlICsgKG5ld1BhZCAtIDEpKSAvIG5ld1BhZCAqIG5ld1BhZDsKLQlieXRlW10gbmV3RGF0YSA9IG5ldyBieXRlW2hlaWdodCAqIG5ld0JwbF07Ci0JaW50IHNyY0luZGV4ID0gMCwgZGVzdEluZGV4ID0gMDsKLQlmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKSB7Ci0JCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgc3JjSW5kZXgsIG5ld0RhdGEsIGRlc3RJbmRleCwgc3RyaWRlKTsKLQkJc3JjSW5kZXggKz0gYnBsOwotCQlkZXN0SW5kZXggKz0gbmV3QnBsOwotCX0KLQlyZXR1cm4gbmV3RGF0YTsKLX0KLQotLyoqCi0gKiBCbGl0IG9wZXJhdGlvbiBiaXRzIHRvIGJlIE9SJ2VkIHRvZ2V0aGVyIHRvIHNwZWNpZnkgdGhlIGRlc2lyZWQgb3BlcmF0aW9uLgotICovCi1zdGF0aWMgZmluYWwgaW50Ci0JQkxJVF9TUkMgPSAxLCAgICAgLy8gY29weSBzb3VyY2UgZGlyZWN0bHksIGVsc2UgYXBwbGllcyBsb2dpYyBvcGVyYXRpb25zCi0JQkxJVF9BTFBIQSA9IDIsICAgLy8gZW5hYmxlIGFscGhhIGJsZW5kaW5nCi0JQkxJVF9ESVRIRVIgPSA0OyAgLy8gZW5hYmxlIGRpdGhlcmluZyBpbiBsb3cgY29sb3IgbW9kZXMKLQotLyoqCi0gKiBBbHBoYSBtb2RlLCB2YWx1ZXMgMCAtIDI1NSBzcGVjaWZ5IGdsb2JhbCBhbHBoYSBsZXZlbAotICovCi1zdGF0aWMgZmluYWwgaW50Ci0JQUxQSEFfT1BBUVVFID0gMjU1LCAgICAgICAgICAgLy8gRnVsbHkgb3BhcXVlIChpZ25vcmVzIGFueSBhbHBoYSBkYXRhKQotCUFMUEhBX1RSQU5TUEFSRU5UID0gMCwgICAgICAgIC8vIEZ1bGx5IHRyYW5zcGFyZW50IChpZ25vcmVzIGFueSBhbHBoYSBkYXRhKQotCUFMUEhBX0NIQU5ORUxfU0VQQVJBVEUgPSAtMSwgIC8vIFVzZSBhbHBoYSBjaGFubmVsIGZyb20gc2VwYXJhdGUgYWxwaGFEYXRhCi0JQUxQSEFfQ0hBTk5FTF9TT1VSQ0UgPSAtMiwgICAgLy8gVXNlIGFscGhhIGNoYW5uZWwgZW1iZWRkZWQgaW4gc291cmNlRGF0YQotCUFMUEhBX01BU0tfVU5QQUNLRUQgPSAtMywgICAgIC8vIFVzZSB0cmFuc3BhcmVuY3kgbWFzayBmb3JtZWQgYnkgYnl0ZXMgaW4gYWxwaGFEYXRhIChub24temVybyBpcyBvcGFxdWUpCi0JQUxQSEFfTUFTS19QQUNLRUQgPSAtNCwgICAgICAgLy8gVXNlIHRyYW5zcGFyZW5jeSBtYXNrIGZvcm1lZCBieSBwYWNrZWQgYml0cyBpbiBhbHBoYURhdGEKLQlBTFBIQV9NQVNLX0lOREVYID0gLTUsICAgICAgICAvLyBDb25zaWRlciBzb3VyY2UgcGFsZXR0ZSBpbmRpY2VzIHRyYW5zcGFyZW50IGlmIGluIGFscGhhRGF0YSBhcnJheQotCUFMUEhBX01BU0tfUkdCID0gLTY7ICAgICAgICAgIC8vIENvbnNpZGVyIHNvdXJjZSBSR0JzIHRyYW5zcGFyZW50IGlmIGluIFJHQjg4OCBmb3JtYXQgYWxwaGFEYXRhIGFycmF5Ci0KLS8qKgotICogQnl0ZSBhbmQgYml0IG9yZGVyIGNvbnN0YW50cy4KLSAqLwotc3RhdGljIGZpbmFsIGludCBMU0JfRklSU1QgPSAwOwotc3RhdGljIGZpbmFsIGludCBNU0JfRklSU1QgPSAxOwotCi0vKioKLSAqIERhdGEgdHlwZXMgKGludGVybmFsKQotICovCi0vKgotcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50Ci0JLy8gZGlyZWN0IC8gdHJ1ZSBjb2xvciBmb3JtYXRzIHdpdGggYXJiaXRyYXJ5IG1hc2tzICYgc2hpZnRzCi0JVFlQRV9HRU5FUklDXzggPSAwLAotCVRZUEVfR0VORVJJQ18xNl9NU0IgPSAxLAotCVRZUEVfR0VORVJJQ18xNl9MU0IgPSAyLAotCVRZUEVfR0VORVJJQ18yNCA9IDMsCi0JVFlQRV9HRU5FUklDXzMyX01TQiA9IDQsCi0JVFlQRV9HRU5FUklDXzMyX0xTQiA9IDUsCi0JLy8gcGFsZXR0ZSBpbmRleGVkIGNvbG9yIGZvcm1hdHMKLQlUWVBFX0lOREVYXzggPSA2LAotCVRZUEVfSU5ERVhfNCA9IDcsCi0JVFlQRV9JTkRFWF8yID0gOCwKLQlUWVBFX0lOREVYXzFfTVNCID0gOSwKLQlUWVBFX0lOREVYXzFfTFNCID0gMTA7Ci0qLwotLyoqCi0gKiBDb21wdXRlcyB0aGUgcmVxdWlyZWQgY2hhbm5lbCBzaGlmdCBmcm9tIGEgbWFzay4KLSAqLwotc3RhdGljIGludCBnZXRDaGFubmVsU2hpZnQoaW50IG1hc2spIHsKLQlpZiAobWFzayA9PSAwKSByZXR1cm4gMDsKLQlpbnQgaTsKLQlmb3IgKGkgPSAwOyAoKG1hc2sgJiAxKSA9PSAwKSAmJiAoaSA8IDMyKTsgKytpKSB7Ci0JCW1hc2sgPj4+PSAxOwotCX0KLQlyZXR1cm4gaTsKLX0KLQotLyoqCi0gKiBDb21wdXRlcyB0aGUgcmVxdWlyZWQgY2hhbm5lbCB3aWR0aCAoZGVwdGgpIGZyb20gYSBtYXNrLgotICovCi1zdGF0aWMgaW50IGdldENoYW5uZWxXaWR0aChpbnQgbWFzaywgaW50IHNoaWZ0KSB7Ci0JaWYgKG1hc2sgPT0gMCkgcmV0dXJuIDA7Ci0JaW50IGk7Ci0JbWFzayA+Pj49IHNoaWZ0OwotCWZvciAoaSA9IHNoaWZ0OyAoKG1hc2sgJiAxKSAhPSAwKSAmJiAoaSA8IDMyKTsgKytpKSB7Ci0JCW1hc2sgPj4+PSAxOwotCX0KLQlyZXR1cm4gaSAtIHNoaWZ0OwotfQotCi0vKioKLSAqIEV4dHJhY3RzIGEgZmllbGQgZnJvbSBwYWNrZWQgUkdCIGRhdGEgZ2l2ZW4gYSBtYXNrIGZvciB0aGF0IGZpZWxkLgotICovCi1zdGF0aWMgYnl0ZSBnZXRDaGFubmVsRmllbGQoaW50IGRhdGEsIGludCBtYXNrKSB7Ci0JZmluYWwgaW50IHNoaWZ0ID0gZ2V0Q2hhbm5lbFNoaWZ0KG1hc2spOwotCXJldHVybiBBTllfVE9fRUlHSFRbZ2V0Q2hhbm5lbFdpZHRoKG1hc2ssIHNoaWZ0KV1bKGRhdGEgJiBtYXNrKSA+Pj4gc2hpZnRdOwotfQotCi0vKiAKLSAqIEZpbGwgaW4gZGl0aGVyZWQgZ3JhZGF0ZWQgdmFsdWVzIGZvciBhIGNvbG9yIGNoYW5uZWwKLSAqLwotc3RhdGljIGZpbmFsIHZvaWQgYnVpbGREaXRoZXJlZEdyYWRpZW50Q2hhbm5lbChpbnQgZnJvbSwgaW50IHRvLCBpbnQgc3RlcHMsCi0JaW50IGJhbmRXaWR0aCwgaW50IGJhbmRIZWlnaHQsIGJvb2xlYW4gdmVydGljYWwsCi0JYnl0ZVtdIGJpdG1hcERhdGEsIGludCBkcCwgaW50IGJ5dGVzUGVyTGluZSwgaW50IGJpdHMpIHsKLQlmaW5hbCBpbnQgbWFzayA9IDB4ZmYwMCA+Pj4gYml0czsKLQlpbnQgdmFsID0gZnJvbSA8PCAxNjsKLQlmaW5hbCBpbnQgaW5jID0gKCh0byA8PCAxNikgLSB2YWwpIC8gc3RlcHMgKyAxOwotCWlmICh2ZXJ0aWNhbCkgewotCQlmb3IgKGludCBkeSA9IDA7IGR5IDwgYmFuZEhlaWdodDsgKytkeSwgZHAgKz0gYnl0ZXNQZXJMaW5lKSB7Ci0JCQlmb3IgKGludCBkeCA9IDAsIGRwdHIgPSBkcDsgZHggPCBiYW5kV2lkdGg7ICsrZHgsIGRwdHIgKz0gNCkgewotCQkJCWZpbmFsIGludCB0aHJlc2ggPSBESVRIRVJfTUFUUklYW2R5ICYgN11bZHhdID4+PiBiaXRzOwotCQkJCWludCB0ZW1wID0gdmFsICsgdGhyZXNoOwotCQkJCWlmICh0ZW1wID4gMHhmZmZmZmYpIGJpdG1hcERhdGFbZHB0cl0gPSAtMTsKLQkJCQllbHNlIGJpdG1hcERhdGFbZHB0cl0gPSAoYnl0ZSkoKHRlbXAgPj4+IDE2KSAmIG1hc2spOwotCQkJfQotCQkJdmFsICs9IGluYzsKLQkJfQotCX0gZWxzZSB7Ci0JCWZvciAoaW50IGR4ID0gMDsgZHggPCBiYW5kV2lkdGg7ICsrZHgsIGRwICs9IDQpIHsKLQkJCWZvciAoaW50IGR5ID0gMCwgZHB0ciA9IGRwOyBkeSA8IGJhbmRIZWlnaHQ7ICsrZHksIGRwdHIgKz0gYnl0ZXNQZXJMaW5lKSB7Ci0JCQkJZmluYWwgaW50IHRocmVzaCA9IERJVEhFUl9NQVRSSVhbZHldW2R4ICYgN10gPj4+IGJpdHM7Ci0JCQkJaW50IHRlbXAgPSB2YWwgKyB0aHJlc2g7Ci0JCQkJaWYgKHRlbXAgPiAweGZmZmZmZikgYml0bWFwRGF0YVtkcHRyXSA9IC0xOwotCQkJCWVsc2UgYml0bWFwRGF0YVtkcHRyXSA9IChieXRlKSgodGVtcCA+Pj4gMTYpICYgbWFzayk7Ci0JCQl9Ci0JCQl2YWwgKz0gaW5jOwotCQl9Ci0JfQotfQotfQotCi1zdGF0aWMgY2xhc3MgTEVEYXRhSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0JaW50IHBvc2l0aW9uOwotCUlucHV0U3RyZWFtIGluOwotCi0JLyoqCi0JICogVGhlIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgYnl0ZXMgdG8gcmVhZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYnl0ZVtdIGJ1ZjsKLQkKLQkvKioKLQkgKiBUaGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIGJ5dGUgYXJyYXkgPGNvZGU+YnVmPC9jb2RlPi4gQSB2YWx1ZQotCSAqIGVxdWFsIHRvIGJ1Zi5sZW5ndGggaW5kaWNhdGVzIG5vIGJ5dGVzIGF2YWlsYWJsZS4gIEEgdmFsdWUgb2YKLQkgKiAwIGluZGljYXRlcyB0aGUgYnVmZmVyIGlzIGZ1bGwuCi0JICovCi0JcHJvdGVjdGVkIGludCBwb3M7Ci0JCi0KLQlwdWJsaWMgTEVEYXRhSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXQpIHsKLQkJdGhpcyhpbnB1dCwgNTEyKTsKLQl9Ci0JCi0JcHVibGljIExFRGF0YUlucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0LCBpbnQgYnVmZmVyU2l6ZSkgewotCQl0aGlzLmluID0gaW5wdXQ7Ci0JCWlmIChidWZmZXJTaXplID4gMCkgewotCQkJYnVmID0gbmV3IGJ5dGVbYnVmZmVyU2l6ZV07Ci0JCQlwb3MgPSBidWZmZXJTaXplOwotCQl9IAotCQllbHNlIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlidWYgPSBudWxsOwotCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJaW4uY2xvc2UoKTsKLQkJCWluID0gbnVsbDsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBBbnN3ZXIgaG93IG1hbnkgYnl0ZXMgd2VyZSByZWFkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBwb3NpdGlvbjsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VycyBob3cgbWFueSBieXRlcyBhcmUgYXZhaWxhYmxlIGZvciByZWFkaW5nIHdpdGhvdXQgYmxvY2tpbmcKLQkgKi8KLQlwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChidWYgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCk7Ci0JCXJldHVybiAoYnVmLmxlbmd0aCAtIHBvcykgKyBpbi5hdmFpbGFibGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogQW5zd2VyIHRoZSBuZXh0IGJ5dGUgb2YgdGhlIGlucHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYnVmID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigpOwotCQlwb3NpdGlvbisrOwotCQlpZiAocG9zIDwgYnVmLmxlbmd0aCkgcmV0dXJuIChidWZbcG9zKytdICYgMHhGRik7Ci0JCXJldHVybiBpbi5yZWFkKCk7Ci0JfQotCQotCS8qKgotCSAqIERvbid0IGltaXRhdGUgdGhlIEpESyBiZWhhdmlvdXIgb2YgcmVhZGluZyBhIHJhbmRvbSBudW1iZXIKLQkgKiBvZiBieXRlcyB3aGVuIHlvdSBjYW4gYWN0dWFsbHkgcmVhZCB0aGVtIGFsbC4KLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQ7Ci0JCWludCBsZWZ0ID0gbGVuOwotCQlyZXN1bHQgPSByZWFkRGF0YShiLCBvZmYsIGxlbik7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlpZiAocmVzdWx0ID09IC0xKSByZXR1cm4gLTE7Ci0JCQlwb3NpdGlvbiArPSByZXN1bHQ7Ci0JCQlpZiAocmVzdWx0ID09IGxlZnQpIHJldHVybiBsZW47Ci0JCQlsZWZ0IC09IHJlc3VsdDsKLQkJCW9mZiArPSByZXN1bHQ7Ci0JCQlyZXN1bHQgPSByZWFkRGF0YShiLCBvZmYsIGxlZnQpOwotCQl9Ci0JfQotCQotCS8qKgotIAkgKiBSZWFkcyBhdCBtb3N0IDxjb2RlPmxlbmd0aDwvY29kZT4gYnl0ZXMgZnJvbSB0aGlzIExFRGF0YUlucHV0U3RyZWFtIGFuZCAKLSAJICogc3RvcmVzIHRoZW0gaW4gYnl0ZSBhcnJheSA8Y29kZT5idWZmZXI8L2NvZGU+IHN0YXJ0aW5nIGF0IDxjb2RlPm9mZnNldDwvY29kZT4uCi0gCSAqIDxwPgotIAkgKiBBbnN3ZXIgdGhlIG51bWJlciBvZiBieXRlcyBhY3R1YWxseSByZWFkIG9yIC0xIGlmIG5vIGJ5dGVzIHdlcmUgcmVhZCBhbmQgCi0gCSAqIGVuZCBvZiBzdHJlYW0gd2FzIGVuY291bnRlcmVkLiAgVGhpcyBpbXBsZW1lbnRhdGlvbiByZWFkcyBieXRlcyBmcm9tIAotIAkgKiB0aGUgcHVzaGJhY2sgYnVmZmVyIGZpcnN0LCB0aGVuIHRoZSB0YXJnZXQgc3RyZWFtIGlmIG1vcmUgYnl0ZXMgYXJlIHJlcXVpcmVkCi0gCSAqIHRvIHNhdGlzZnkgPGNvZGU+Y291bnQ8L2NvZGU+LgotCSAqIDwvcD4KLQkgKiBAcGFyYW0gYnVmZmVyIHRoZSBieXRlIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgotCSAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbiA8Y29kZT5idWZmZXI8L2NvZGU+IHRvIHN0b3JlIHRoZSByZWFkIGJ5dGVzLgotCSAqIEBwYXJhbSBsZW5ndGggdGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIDxjb2RlPmJ1ZmZlcjwvY29kZT4uCi0JICoKLQkgKiBAcmV0dXJuIGludCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHJlYWQgb3IgLTEgaWYgZW5kIG9mIHN0cmVhbS4KLQkgKgotCSAqIEBleGNlcHRpb24gamF2YS5pby5JT0V4Y2VwdGlvbiBpZiBhbiBJT0V4Y2VwdGlvbiBvY2N1cnMuCi0JICovCi0JcHJpdmF0ZSBpbnQgcmVhZERhdGEoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGJ1ZiA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLQkJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmZmVyLmxlbmd0aCB8fAotICAJCSAJbGVuZ3RoIDwgMCB8fCAobGVuZ3RoID4gYnVmZmVyLmxlbmd0aCAtIG9mZnNldCkpIHsKLQkgCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCSAJfQotCQkJCQotCQlpbnQgY2FjaGVDb3BpZWQgPSAwOwotCQlpbnQgbmV3T2Zmc2V0ID0gb2Zmc2V0OwotCQotCQkvLyBBcmUgdGhlcmUgcHVzaGJhY2sgYnl0ZXMgYXZhaWxhYmxlPwotCQlpbnQgYXZhaWxhYmxlID0gYnVmLmxlbmd0aCAtIHBvczsKLQkJaWYgKGF2YWlsYWJsZSA+IDApIHsKLQkJCWNhY2hlQ29waWVkID0gKGF2YWlsYWJsZSA+PSBsZW5ndGgpID8gbGVuZ3RoIDogYXZhaWxhYmxlOwotCQkJU3lzdGVtLmFycmF5Y29weShidWYsIHBvcywgYnVmZmVyLCBuZXdPZmZzZXQsIGNhY2hlQ29waWVkKTsKLQkJCW5ld09mZnNldCArPSBjYWNoZUNvcGllZDsKLQkJCXBvcyArPSBjYWNoZUNvcGllZDsKLQkJfQotCQotCQkvLyBIYXZlIHdlIGNvcGllZCBlbm91Z2g/Ci0JCWlmIChjYWNoZUNvcGllZCA9PSBsZW5ndGgpIHJldHVybiBsZW5ndGg7Ci0KLQkJaW50IGluQ29waWVkID0gaW4ucmVhZChidWZmZXIsIG5ld09mZnNldCwgbGVuZ3RoIC0gY2FjaGVDb3BpZWQpOwotCi0JCWlmIChpbkNvcGllZCA+IDApIHJldHVybiBpbkNvcGllZCArIGNhY2hlQ29waWVkOwotCQlpZiAoY2FjaGVDb3BpZWQgPT0gMCkgcmV0dXJuIGluQ29waWVkOwotCQlyZXR1cm4gY2FjaGVDb3BpZWQ7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhbiBpbnRlZ2VyIGNvbXByaXNlZCBvZiB0aGUgbmV4dAotCSAqIGZvdXIgYnl0ZXMgb2YgdGhlIGlucHV0IHN0cmVhbS4KLQkgKi8KLQlwdWJsaWMgaW50IHJlYWRJbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbNF07Ci0JCXJlYWQoYnVmKTsKLQkJcmV0dXJuICgoKCgoKGJ1ZlszXSAmIDB4RkYpIDw8IDgpIHwgCi0JCQkoYnVmWzJdICYgMHhGRikpIDw8IDgpIHwgCi0JCQkoYnVmWzFdICYgMHhGRikpIDw8IDgpIHwgCi0JCQkoYnVmWzBdICYgMHhGRik7Ci0JfQotCQotCS8qKgotCSAqIEFuc3dlciBhIHNob3J0IGNvbXByaXNlZCBvZiB0aGUgbmV4dAotCSAqIHR3byBieXRlcyBvZiB0aGUgaW5wdXQgc3RyZWFtLgotCSAqLwotCXB1YmxpYyBzaG9ydCByZWFkU2hvcnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbMl07Ci0JCXJlYWQoYnVmKTsKLQkJcmV0dXJuIChzaG9ydCkoKChidWZbMV0gJiAweEZGKSA8PCA4KSB8IChidWZbMF0gJiAweEZGKSk7Ci0JfQotCQotCS8qKgotCSAqIFB1c2ggYmFjayB0aGUgZW50aXJlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIGJ1ZmZlciA8Y29kZT5iPC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGUgYnl0ZXMgYXJlIHB1c2hlZCBzbyB0aGF0IHRoZXkgd291bGQgYmUgcmVhZCBiYWNrIGJbMF0sIGJbMV0sIGV0Yy4gCi0JICogSWYgdGhlIHB1c2ggYmFjayBidWZmZXIgY2Fubm90IGhhbmRsZSB0aGUgYnl0ZXMgY29waWVkIGZyb20gPGNvZGU+YjwvY29kZT4sIAotCSAqIGFuIElPRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGFuZCBubyBieXRlIHdpbGwgYmUgcHVzaGVkIGJhY2suCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBiIHRoZSBieXRlIGFycmF5IGNvbnRhaW5pbmcgYnl0ZXMgdG8gcHVzaCBiYWNrIGludG8gdGhlIHN0cmVhbQotCSAqCi0JICogQGV4Y2VwdGlvbiAJamF2YS5pby5JT0V4Y2VwdGlvbiBpZiB0aGUgcHVzaGJhY2sgYnVmZmVyIGlzIHRvbyBzbWFsbAotCSAqLwotCXB1YmxpYyB2b2lkIHVucmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGxlbmd0aCA9IGIubGVuZ3RoOwotCQlpZiAobGVuZ3RoID4gcG9zKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKTsKLQkJcG9zaXRpb24gLT0gbGVuZ3RoOwotCQlwb3MgLT0gbGVuZ3RoOwotCQlTeXN0ZW0uYXJyYXljb3B5KGIsIDAsIGJ1ZiwgcG9zLCBsZW5ndGgpOwotCX0KLX0KLXB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRmlsZUZvcm1hdCB7CQotCUxFRGF0YUlucHV0U3RyZWFtIGlucHV0U3RyZWFtOwotCUltYWdlTG9hZGVyIGxvYWRlcjsKLQlpbnQgY29tcHJlc3Npb247Ci0KLWJ5dGVbXSBiaXRJbnZlcnREYXRhKGJ5dGVbXSBkYXRhLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7Ci0JLy8gRGVzdHJ1Y3RpdmVseSBiaXQgaW52ZXJ0IGRhdGEgaW4gdGhlIGdpdmVuIGJ5dGUgYXJyYXkuCi0JZm9yIChpbnQgaSA9IHN0YXJ0SW5kZXg7IGkgPCBlbmRJbmRleDsgaSsrKSB7Ci0JCWRhdGFbaV0gPSAoYnl0ZSkoMjU1IC0gZGF0YVtpIC0gc3RhcnRJbmRleF0pOwotCX0KLQlyZXR1cm4gZGF0YTsKLX0KLQotLyoqCi0gKiBSZXR1cm4gd2hldGhlciBvciBub3QgdGhlIHNwZWNpZmllZCBpbnB1dCBzdHJlYW0KLSAqIHJlcHJlc2VudHMgYSBzdXBwb3J0ZWQgZmlsZSBmb3JtYXQuCi0gKi8KLWFic3RyYWN0IGJvb2xlYW4gaXNGaWxlRm9ybWF0KExFRGF0YUlucHV0U3RyZWFtIHN0cmVhbSk7Ci0KLWFic3RyYWN0IEltYWdlRGF0YVtdIGxvYWRGcm9tQnl0ZVN0cmVhbSgpOwotCi1wdWJsaWMgSW1hZ2VEYXRhW10gbG9hZEZyb21TdHJlYW0oTEVEYXRhSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0JdHJ5IHsKLQkJaW5wdXRTdHJlYW0gPSBzdHJlYW07Ci0JCXJldHVybiBsb2FkRnJvbUJ5dGVTdHJlYW0oKTsKLQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQotCi1wdWJsaWMgc3RhdGljIEltYWdlRGF0YVtdIGxvYWQoSW5wdXRTdHJlYW0gaXMsIEltYWdlTG9hZGVyIGxvYWRlcikgewotCUxFRGF0YUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBMRURhdGFJbnB1dFN0cmVhbShpcyk7Ci0JYm9vbGVhbiBpc1N1cHBvcnRlZCA9IGZhbHNlOwkKLQlGaWxlRm9ybWF0IGZpbGVGb3JtYXQgPSBuZXcgV2luSUNPRmlsZUZvcm1hdCgpOwotCWlmIChmaWxlRm9ybWF0LmlzRmlsZUZvcm1hdChzdHJlYW0pKSBpc1N1cHBvcnRlZCA9IHRydWU7Ci0JZWxzZSB7Ci0JCWZpbGVGb3JtYXQgPSBuZXcgV2luQk1QRmlsZUZvcm1hdCgpOwotCQlpZiAoZmlsZUZvcm1hdC5pc0ZpbGVGb3JtYXQoc3RyZWFtKSkgaXNTdXBwb3J0ZWQgPSB0cnVlOwotCX0KLQlpZiAoIWlzU3VwcG9ydGVkKSBTV1QuZXJyb3IoU1dULkVSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVCk7Ci0JZmlsZUZvcm1hdC5sb2FkZXIgPSBsb2FkZXI7Ci0JcmV0dXJuIGZpbGVGb3JtYXQubG9hZEZyb21TdHJlYW0oc3RyZWFtKTsKLX0KLX0KLXN0YXRpYyBjbGFzcyBXaW5CTVBGaWxlRm9ybWF0IGV4dGVuZHMgRmlsZUZvcm1hdCB7Ci0Jc3RhdGljIGZpbmFsIGludCBCTVBGaWxlSGVhZGVyU2l6ZSA9IDE0OwotCXN0YXRpYyBmaW5hbCBpbnQgQk1QSGVhZGVyRml4ZWRTaXplID0gNDA7Ci0JaW50IGltcG9ydGFudENvbG9yczsKLQotdm9pZCBkZWNvbXByZXNzRGF0YShieXRlW10gc3JjLCBieXRlW10gZGVzdCwgaW50IHN0cmlkZSwgaW50IGNtcCkgewotCWlmIChjbXAgPT0gMSkgeyAvLyBCTVBfUkxFOF9DT01QUkVTU0lPTgotCQlpZiAoZGVjb21wcmVzc1JMRThEYXRhKHNyYywgc3JjLmxlbmd0aCwgc3RyaWRlLCBkZXN0LCBkZXN0Lmxlbmd0aCkgPD0gMCkKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JCXJldHVybjsKLQl9Ci0JaWYgKGNtcCA9PSAyKSB7IC8vIEJNUF9STEU0X0NPTVBSRVNTSU9OCi0JCWlmIChkZWNvbXByZXNzUkxFNERhdGEoc3JjLCBzcmMubGVuZ3RoLCBzdHJpZGUsIGRlc3QsIGRlc3QubGVuZ3RoKSA8PSAwKQotCQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQkJcmV0dXJuOwotCX0KLQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotfQotaW50IGRlY29tcHJlc3NSTEU0RGF0YShieXRlW10gc3JjLCBpbnQgbnVtQnl0ZXMsIGludCBzdHJpZGUsIGJ5dGVbXSBkZXN0LCBpbnQgZGVzdFNpemUpIHsKLQlpbnQgc3AgPSAwOwotCWludCBzZSA9IG51bUJ5dGVzOwotCWludCBkcCA9IDA7Ci0JaW50IGRlID0gZGVzdFNpemU7Ci0JaW50IHggPSAwLCB5ID0gMDsKLQl3aGlsZSAoc3AgPCBzZSkgewotCQlpbnQgbGVuID0gc3JjW3NwXSAmIDB4RkY7Ci0JCXNwKys7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJbGVuID0gc3JjW3NwXSAmIDB4RkY7Ci0JCQlzcCsrOwotCQkJc3dpdGNoIChsZW4pIHsKLQkJCQljYXNlIDA6IC8qIGVuZCBvZiBsaW5lICovCi0JCQkJCXkrKzsKLQkJCQkJeCA9IDA7Ci0JCQkJCWRwID0geSAqIHN0cmlkZTsKLQkJCQkJaWYgKGRwID49IGRlKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6IC8qIGVuZCBvZiBiaXRtYXAgKi8KLQkJCQkJcmV0dXJuIDE7Ci0JCQkJY2FzZSAyOiAvKiBkZWx0YSAqLwotCQkJCQl4ICs9IHNyY1tzcF0gJiAweEZGOwotCQkJCQlzcCsrOwotCQkJCQl5ICs9IHNyY1tzcF0gJiAweEZGOwotCQkJCQlzcCsrOwotCQkJCQlkcCA9IHkgKiBzdHJpZGUgKyB4IC8gMjsKLQkJCQkJaWYgKGRwID49IGRlKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OiAvKiBhYnNvbHV0ZSBtb2RlIHJ1biAqLwotCQkJCQlpZiAoKGxlbiAmIDEpICE9IDApIC8qIG9kZCBydW4gbGVuZ3RocyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAqLwotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQl4ICs9IGxlbjsKLQkJCQkJbGVuID0gbGVuIC8gMjsKLQkJCQkJaWYgKGxlbiA+IChzZSAtIHNwKSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJaWYgKGxlbiA+IChkZSAtIGRwKSkKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCQkJZGVzdFtkcF0gPSBzcmNbc3BdOwotCQkJCQkJZHArKzsKLQkJCQkJCXNwKys7Ci0JCQkJCX0KLQkJCQkJaWYgKChzcCAmIDEpICE9IDApCi0JCQkJCQlzcCsrOyAvKiB3b3JkIGFsaWduIHNwPyAqLwotCQkJCQlicmVhazsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgobGVuICYgMSkgIT0gMCkKLQkJCQlyZXR1cm4gLTE7Ci0JCQl4ICs9IGxlbjsKLQkJCWxlbiA9IGxlbiAvIDI7Ci0JCQlieXRlIHRoZUJ5dGUgPSBzcmNbc3BdOwotCQkJc3ArKzsKLQkJCWlmIChsZW4gPiAoZGUgLSBkcCkpCi0JCQkJcmV0dXJuIC0xOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJCWRlc3RbZHBdID0gdGhlQnl0ZTsKLQkJCQlkcCsrOwotCQkJfQotCQl9Ci0JfQotCXJldHVybiAxOwotfQotaW50IGRlY29tcHJlc3NSTEU4RGF0YShieXRlW10gc3JjLCBpbnQgbnVtQnl0ZXMsIGludCBzdHJpZGUsIGJ5dGVbXSBkZXN0LCBpbnQgZGVzdFNpemUpIHsKLQlpbnQgc3AgPSAwOwotCWludCBzZSA9IG51bUJ5dGVzOwotCWludCBkcCA9IDA7Ci0JaW50IGRlID0gZGVzdFNpemU7Ci0JaW50IHggPSAwLCB5ID0gMDsKLQl3aGlsZSAoc3AgPCBzZSkgewotCQlpbnQgbGVuID0gc3JjW3NwXSAmIDB4RkY7Ci0JCXNwKys7Ci0JCWlmIChsZW4gPT0gMCkgewotCQkJbGVuID0gc3JjW3NwXSAmIDB4RkY7Ci0JCQlzcCsrOwotCQkJc3dpdGNoIChsZW4pIHsKLQkJCQljYXNlIDA6IC8qIGVuZCBvZiBsaW5lICovCi0JCQkJCXkrKzsKLQkJCQkJeCA9IDA7Ci0JCQkJCWRwID0geSAqIHN0cmlkZTsKLQkJCQkJaWYgKGRwID49IGRlKQotCQkJCQkJcmV0dXJuIC0xOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDE6IC8qIGVuZCBvZiBiaXRtYXAgKi8KLQkJCQkJcmV0dXJuIDE7Ci0JCQkJY2FzZSAyOiAvKiBkZWx0YSAqLwotCQkJCQl4ICs9IHNyY1tzcF0gJiAweEZGOwotCQkJCQlzcCsrOwotCQkJCQl5ICs9IHNyY1tzcF0gJiAweEZGOwotCQkJCQlzcCsrOwotCQkJCQlkcCA9IHkgKiBzdHJpZGUgKyB4OwotCQkJCQlpZiAoZHAgPj0gZGUpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQ6IC8qIGFic29sdXRlIG1vZGUgcnVuICovCi0JCQkJCWlmIChsZW4gPiAoc2UgLSBzcCkpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWlmIChsZW4gPiAoZGUgLSBkcCkpCi0JCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQkJCWRlc3RbZHBdID0gc3JjW3NwXTsKLQkJCQkJCWRwKys7Ci0JCQkJCQlzcCsrOwotCQkJCQl9Ci0JCQkJCWlmICgoc3AgJiAxKSAhPSAwKQotCQkJCQkJc3ArKzsgLyogd29yZCBhbGlnbiBzcD8gKi8KLQkJCQkJeCArPSBsZW47Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9IGVsc2UgewotCQkJYnl0ZSB0aGVCeXRlID0gc3JjW3NwXTsKLQkJCXNwKys7Ci0JCQlpZiAobGVuID4gKGRlIC0gZHApKQotCQkJCXJldHVybiAtMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQlkZXN0W2RwXSA9IHRoZUJ5dGU7Ci0JCQkJZHArKzsKLQkJCX0KLQkJCXggKz0gbGVuOwotCQl9Ci0JfQotCXJldHVybiAxOwotfQotYm9vbGVhbiBpc0ZpbGVGb3JtYXQoTEVEYXRhSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0JdHJ5IHsKLQkJYnl0ZVtdIGhlYWRlciA9IG5ldyBieXRlWzE4XTsKLQkJc3RyZWFtLnJlYWQoaGVhZGVyKTsKLQkJc3RyZWFtLnVucmVhZChoZWFkZXIpOwotCQlpbnQgaW5mb0hlYWRlclNpemUgPSAoaGVhZGVyWzE0XSAmIDB4RkYpIHwgKChoZWFkZXJbMTVdICYgMHhGRikgPDwgOCkgfCAoKGhlYWRlclsxNl0gJiAweEZGKSA8PCAxNikgfCAoKGhlYWRlclsxN10gJiAweEZGKSA8PCAyNCk7Ci0JCXJldHVybiBoZWFkZXJbMF0gPT0gMHg0MiAmJiBoZWFkZXJbMV0gPT0gMHg0RCAmJiBpbmZvSGVhZGVyU2l6ZSA+PSBCTVBIZWFkZXJGaXhlZFNpemU7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLWJ5dGVbXSBsb2FkRGF0YShieXRlW10gaW5mb0hlYWRlcikgewotCWludCB3aWR0aCA9IChpbmZvSGVhZGVyWzRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbNV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlcls2XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlcls3XSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgaGVpZ2h0ID0gKGluZm9IZWFkZXJbOF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls5XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzEwXSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsxMV0gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGJpdENvdW50ID0gKGluZm9IZWFkZXJbMTRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTVdICYgMHhGRikgPDwgOCk7Ci0JaW50IHN0cmlkZSA9ICh3aWR0aCAqIGJpdENvdW50ICsgNykgLyA4OwotCXN0cmlkZSA9IChzdHJpZGUgKyAzKSAvIDQgKiA0OyAvLyBSb3VuZCB1cCB0byA0IGJ5dGUgbXVsdGlwbGUKLQlieXRlW10gZGF0YSA9IGxvYWREYXRhKGluZm9IZWFkZXIsIHN0cmlkZSk7Ci0JZmxpcFNjYW5MaW5lcyhkYXRhLCBzdHJpZGUsIGhlaWdodCk7Ci0JcmV0dXJuIGRhdGE7Ci19Ci1ieXRlW10gbG9hZERhdGEoYnl0ZVtdIGluZm9IZWFkZXIsIGludCBzdHJpZGUpIHsKLQlpbnQgaGVpZ2h0ID0gKGluZm9IZWFkZXJbOF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls5XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzEwXSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsxMV0gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGRhdGFTaXplID0gaGVpZ2h0ICogc3RyaWRlOwotCWJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbZGF0YVNpemVdOwotCWludCBjbXAgPSAoaW5mb0hlYWRlclsxNl0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxN10gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxOF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTldICYgMHhGRikgPDwgMjQpOwotCWlmIChjbXAgPT0gMCkgeyAvLyBCTVBfTk9fQ09NUFJFU1NJT04KLQkJdHJ5IHsKLQkJCWlmIChpbnB1dFN0cmVhbS5yZWFkKGRhdGEpICE9IGRhdGFTaXplKQotCQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaW50IGNvbXByZXNzZWRTaXplID0gKGluZm9IZWFkZXJbMjBdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMjFdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMjJdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzIzXSAmIDB4RkYpIDw8IDI0KTsKLQkJYnl0ZVtdIGNvbXByZXNzZWQgPSBuZXcgYnl0ZVtjb21wcmVzc2VkU2l6ZV07Ci0JCXRyeSB7Ci0JCQlpZiAoaW5wdXRTdHJlYW0ucmVhZChjb21wcmVzc2VkKSAhPSBjb21wcmVzc2VkU2l6ZSkKLQkJCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQkJfQotCQlkZWNvbXByZXNzRGF0YShjb21wcmVzc2VkLCBkYXRhLCBzdHJpZGUsIGNtcCk7Ci0JfQotCXJldHVybiBkYXRhOwotfQotaW50W10gbG9hZEZpbGVIZWFkZXIoKSB7Ci0JaW50W10gaGVhZGVyID0gbmV3IGludFs1XTsKLQl0cnkgewotCQloZWFkZXJbMF0gPSBpbnB1dFN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJaGVhZGVyWzFdID0gaW5wdXRTdHJlYW0ucmVhZEludCgpOwotCQloZWFkZXJbMl0gPSBpbnB1dFN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJaGVhZGVyWzNdID0gaW5wdXRTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCWhlYWRlcls0XSA9IGlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0KLQlpZiAoaGVhZGVyWzBdICE9IDB4NEQ0MikKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlyZXR1cm4gaGVhZGVyOwotfQotSW1hZ2VEYXRhW10gbG9hZEZyb21CeXRlU3RyZWFtKCkgewotCWludFtdIGZpbGVIZWFkZXIgPSBsb2FkRmlsZUhlYWRlcigpOwotCWJ5dGVbXSBpbmZvSGVhZGVyID0gbmV3IGJ5dGVbQk1QSGVhZGVyRml4ZWRTaXplXTsKLQl0cnkgewotCQlpbnB1dFN0cmVhbS5yZWFkKGluZm9IZWFkZXIpOwotCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0KLQlpbnQgd2lkdGggPSAoaW5mb0hlYWRlcls0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzVdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbNl0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbN10gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGhlaWdodCA9IChpbmZvSGVhZGVyWzhdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsxMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMTFdICYgMHhGRikgPDwgMjQpOwotCWludCBiaXRDb3VudCA9IChpbmZvSGVhZGVyWzE0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE1XSAmIDB4RkYpIDw8IDgpOwotCVBhbGV0dGVEYXRhIHBhbGV0dGUgPSBsb2FkUGFsZXR0ZShpbmZvSGVhZGVyKTsKLQlpZiAoaW5wdXRTdHJlYW0uZ2V0UG9zaXRpb24oKSA8IGZpbGVIZWFkZXJbNF0pIHsKLQkJLy8gU2VlayB0byB0aGUgc3BlY2lmaWVkIG9mZnNldAotCQl0cnkgewotCQkJaW5wdXRTdHJlYW0uc2tpcChmaWxlSGVhZGVyWzRdIC0gaW5wdXRTdHJlYW0uZ2V0UG9zaXRpb24oKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCQl9Ci0JfQotCWJ5dGVbXSBkYXRhID0gbG9hZERhdGEoaW5mb0hlYWRlcik7Ci0JdGhpcy5jb21wcmVzc2lvbiA9IChpbmZvSGVhZGVyWzE2XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzE3XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzE4XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclsxOV0gJiAweEZGKSA8PCAyNCk7Ci0JdGhpcy5pbXBvcnRhbnRDb2xvcnMgPSAoaW5mb0hlYWRlclszNl0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclszN10gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclszOF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMzldICYgMHhGRikgPDwgMjQpOwotLy8JaW50IHhQZWxzUGVyTWV0ZXIgPSAoaW5mb0hlYWRlclsyNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsyNV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclsyNl0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMjddICYgMHhGRikgPDwgMjQpOwotLy8JaW50IHlQZWxzUGVyTWV0ZXIgPSAoaW5mb0hlYWRlclsyOF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsyOV0gJiAweEZGKSA8PCA4KSB8ICgoaW5mb0hlYWRlclszMF0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbMzFdICYgMHhGRikgPDwgMjQpOwotCWludCB0eXBlID0gKHRoaXMuY29tcHJlc3Npb24gPT0gMSAvKkJNUF9STEU4X0NPTVBSRVNTSU9OKi8pIHx8ICh0aGlzLmNvbXByZXNzaW9uID09IDIgLypCTVBfUkxFNF9DT01QUkVTU0lPTiovKSA/IFNXVC5JTUFHRV9CTVBfUkxFIDogU1dULklNQUdFX0JNUDsKLQlyZXR1cm4gbmV3IEltYWdlRGF0YVtdIHsKLQkJSW1hZ2VEYXRhLmludGVybmFsX25ldygKLQkJCXdpZHRoLAotCQkJaGVpZ2h0LAotCQkJYml0Q291bnQsCi0JCQlwYWxldHRlLAotCQkJNCwKLQkJCWRhdGEsCi0JCQkwLAotCQkJbnVsbCwKLQkJCW51bGwsCi0JCQktMSwKLQkJCS0xLAotCQkJdHlwZSwKLQkJCTAsCi0JCQkwLAotCQkJMCwKLQkJCTApCi0JfTsKLX0KLVBhbGV0dGVEYXRhIGxvYWRQYWxldHRlKGJ5dGVbXSBpbmZvSGVhZGVyKSB7Ci0JaW50IGRlcHRoID0gKGluZm9IZWFkZXJbMTRdICYgMHhGRikgfCAoKGluZm9IZWFkZXJbMTVdICYgMHhGRikgPDwgOCk7Ci0JaWYgKGRlcHRoIDw9IDgpIHsKLQkJaW50IG51bUNvbG9ycyA9IChpbmZvSGVhZGVyWzMyXSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzMzXSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzM0XSAmIDB4RkYpIDw8IDE2KSB8ICgoaW5mb0hlYWRlclszNV0gJiAweEZGKSA8PCAyNCk7Ci0JCWlmIChudW1Db2xvcnMgPT0gMCkgewotCQkJbnVtQ29sb3JzID0gMSA8PCBkZXB0aDsKLQkJfSBlbHNlIHsKLQkJCWlmIChudW1Db2xvcnMgPiAyNTYpCi0JCQkJbnVtQ29sb3JzID0gMjU2OwotCQl9Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtudW1Db2xvcnMgKiA0XTsKLQkJdHJ5IHsKLQkJCWlmIChpbnB1dFN0cmVhbS5yZWFkKGJ1ZikgIT0gYnVmLmxlbmd0aCkKLQkJCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQkJfQotCQlyZXR1cm4gcGFsZXR0ZUZyb21CeXRlcyhidWYsIG51bUNvbG9ycyk7Ci0JfQotCWlmIChkZXB0aCA9PSAxNikgcmV0dXJuIG5ldyBQYWxldHRlRGF0YSgweDdDMDAsIDB4M0UwLCAweDFGKTsKLQlpZiAoZGVwdGggPT0gMjQpIHJldHVybiBuZXcgUGFsZXR0ZURhdGEoMHhGRiwgMHhGRjAwLCAweEZGMDAwMCk7Ci0JcmV0dXJuIG5ldyBQYWxldHRlRGF0YSgweEZGMDAsIDB4RkYwMDAwLCAweEZGMDAwMDAwKTsKLX0KLVBhbGV0dGVEYXRhIHBhbGV0dGVGcm9tQnl0ZXMoYnl0ZVtdIGJ5dGVzLCBpbnQgbnVtQ29sb3JzKSB7Ci0JaW50IGJ5dGVzT2Zmc2V0ID0gMDsKLQlSR0JbXSBjb2xvcnMgPSBuZXcgUkdCW251bUNvbG9yc107Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db2xvcnM7IGkrKykgewotCQljb2xvcnNbaV0gPSBuZXcgUkdCKGJ5dGVzW2J5dGVzT2Zmc2V0ICsgMl0gJiAweEZGLAotCQkJYnl0ZXNbYnl0ZXNPZmZzZXQgKyAxXSAmIDB4RkYsCi0JCQlieXRlc1tieXRlc09mZnNldF0gJiAweEZGKTsKLQkJYnl0ZXNPZmZzZXQgKz0gNDsKLQl9Ci0JcmV0dXJuIG5ldyBQYWxldHRlRGF0YShjb2xvcnMpOwotfQotLyoqCi0gKiBBbnN3ZXIgYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgdGhlIEJNUCByZXByZXNlbnRhdGlvbiBvZgotICogdGhlIGdpdmVuIGRldmljZSBpbmRlcGVuZGVudCBwYWxldHRlLgotICovCi1zdGF0aWMgYnl0ZVtdIHBhbGV0dGVUb0J5dGVzKFBhbGV0dGVEYXRhIHBhbCkgewotCWludCBuID0gcGFsLmNvbG9ycyA9PSBudWxsID8gMCA6IChwYWwuY29sb3JzLmxlbmd0aCA8IDI1NiA/IHBhbC5jb2xvcnMubGVuZ3RoIDogMjU2KTsKLQlieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtuICogNF07Ci0JaW50IG9mZnNldCA9IDA7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJUkdCIGNvbCA9IHBhbC5jb2xvcnNbaV07Ci0JCWJ5dGVzW29mZnNldF0gPSAoYnl0ZSljb2wuYmx1ZTsKLQkJYnl0ZXNbb2Zmc2V0ICsgMV0gPSAoYnl0ZSljb2wuZ3JlZW47Ci0JCWJ5dGVzW29mZnNldCArIDJdID0gKGJ5dGUpY29sLnJlZDsKLQkJb2Zmc2V0ICs9IDQ7Ci0JfQotCXJldHVybiBieXRlczsKLX0KLQotdm9pZCBmbGlwU2NhbkxpbmVzKGJ5dGVbXSBkYXRhLCBpbnQgc3RyaWRlLCBpbnQgaGVpZ2h0KSB7Ci0JaW50IGkxID0gMDsKLQlpbnQgaTIgPSAoaGVpZ2h0IC0gMSkgKiBzdHJpZGU7Ci0JZm9yIChpbnQgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyBpKyspIHsKLQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IHN0cmlkZTsgaW5kZXgrKykgewotCQkJYnl0ZSBiID0gZGF0YVtpbmRleCArIGkxXTsKLQkJCWRhdGFbaW5kZXggKyBpMV0gPSBkYXRhW2luZGV4ICsgaTJdOwotCQkJZGF0YVtpbmRleCArIGkyXSA9IGI7Ci0JCX0KLQkJaTEgKz0gc3RyaWRlOwotCQlpMiAtPSBzdHJpZGU7Ci0JfQotfQotCi19Ci0KLXN0YXRpYyBjbGFzcyBXaW5JQ09GaWxlRm9ybWF0IGV4dGVuZHMgRmlsZUZvcm1hdCB7Ci0JCi1zdGF0aWMgZmluYWwgYnl0ZVtdIGNvbnZlcnRQYWQoYnl0ZVtdIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IGRlcHRoLCBpbnQgcGFkLCBpbnQgbmV3UGFkKSB7Ci0JaWYgKHBhZCA9PSBuZXdQYWQpIHJldHVybiBkYXRhOwotCWludCBzdHJpZGUgPSAod2lkdGggKiBkZXB0aCArIDcpIC8gODsKLQlpbnQgYnBsID0gKHN0cmlkZSArIChwYWQgLSAxKSkgLyBwYWQgKiBwYWQ7Ci0JaW50IG5ld0JwbCA9IChzdHJpZGUgKyAobmV3UGFkIC0gMSkpIC8gbmV3UGFkICogbmV3UGFkOwotCWJ5dGVbXSBuZXdEYXRhID0gbmV3IGJ5dGVbaGVpZ2h0ICogbmV3QnBsXTsKLQlpbnQgc3JjSW5kZXggPSAwLCBkZXN0SW5kZXggPSAwOwotCWZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLQkJU3lzdGVtLmFycmF5Y29weShkYXRhLCBzcmNJbmRleCwgbmV3RGF0YSwgZGVzdEluZGV4LCBuZXdCcGwpOwotCQlzcmNJbmRleCArPSBicGw7Ci0JCWRlc3RJbmRleCArPSBuZXdCcGw7Ci0JfQotCXJldHVybiBuZXdEYXRhOwotfQotLyoqCi0gKiBBbnN3ZXIgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGZpbGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuCi0gKiBpY29uCi0gKi8KLWludCBpY29uU2l6ZShJbWFnZURhdGEgaSkgewotCWludCBzaGFwZURhdGFTdHJpZGUgPSAoaS53aWR0aCAqIGkuZGVwdGggKyAzMSkgLyAzMiAqIDQ7Ci0JaW50IG1hc2tEYXRhU3RyaWRlID0gKGkud2lkdGggKyAzMSkgLyAzMiAqIDQ7Ci0JaW50IGRhdGFTaXplID0gKHNoYXBlRGF0YVN0cmlkZSArIG1hc2tEYXRhU3RyaWRlKSAqIGkuaGVpZ2h0OwotCWludCBwYWxldHRlU2l6ZSA9IGkucGFsZXR0ZS5jb2xvcnMgIT0gbnVsbCA/IGkucGFsZXR0ZS5jb2xvcnMubGVuZ3RoICogNCA6IDA7Ci0JcmV0dXJuIFdpbkJNUEZpbGVGb3JtYXQuQk1QSGVhZGVyRml4ZWRTaXplICsgcGFsZXR0ZVNpemUgKyBkYXRhU2l6ZTsKLX0KLWJvb2xlYW4gaXNGaWxlRm9ybWF0KExFRGF0YUlucHV0U3RyZWFtIHN0cmVhbSkgewotCXRyeSB7Ci0JCWJ5dGVbXSBoZWFkZXIgPSBuZXcgYnl0ZVs0XTsKLQkJc3RyZWFtLnJlYWQoaGVhZGVyKTsKLQkJc3RyZWFtLnVucmVhZChoZWFkZXIpOwotCQlyZXR1cm4gaGVhZGVyWzBdID09IDAgJiYgaGVhZGVyWzFdID09IDAgJiYgaGVhZGVyWzJdID09IDEgJiYgaGVhZGVyWzNdID09IDA7Ci0JfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KLWJvb2xlYW4gaXNWYWxpZEljb24oSW1hZ2VEYXRhIGkpIHsKLQlzd2l0Y2ggKGkuZGVwdGgpIHsKLQkJY2FzZSAxOgotCQljYXNlIDQ6Ci0JCWNhc2UgODoKLQkJCWlmIChpLnBhbGV0dGUuaXNEaXJlY3QpIHJldHVybiBmYWxzZTsKLQkJCWludCBzaXplID0gaS5wYWxldHRlLmNvbG9ycy5sZW5ndGg7Ci0JCQlyZXR1cm4gc2l6ZSA9PSAyIHx8IHNpemUgPT0gMTYgfHwgc2l6ZSA9PSAzMiB8fCBzaXplID09IDI1NjsKLQkJY2FzZSAyNDoKLQkJY2FzZSAzMjoKLQkJCXJldHVybiBpLnBhbGV0dGUuaXNEaXJlY3Q7Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLWludCBsb2FkRmlsZUhlYWRlcihMRURhdGFJbnB1dFN0cmVhbSBieXRlU3RyZWFtKSB7Ci0JaW50W10gZmlsZUhlYWRlciA9IG5ldyBpbnRbM107Ci0JdHJ5IHsKLQkJZmlsZUhlYWRlclswXSA9IGJ5dGVTdHJlYW0ucmVhZFNob3J0KCk7Ci0JCWZpbGVIZWFkZXJbMV0gPSBieXRlU3RyZWFtLnJlYWRTaG9ydCgpOwotCQlmaWxlSGVhZGVyWzJdID0gYnl0ZVN0cmVhbS5yZWFkU2hvcnQoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0KLQlpZiAoKGZpbGVIZWFkZXJbMF0gIT0gMCkgfHwgKGZpbGVIZWFkZXJbMV0gIT0gMSkpCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JaW50IG51bUljb25zID0gZmlsZUhlYWRlclsyXTsKLQlpZiAobnVtSWNvbnMgPD0gMCkKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlyZXR1cm4gbnVtSWNvbnM7Ci19Ci1pbnQgbG9hZEZpbGVIZWFkZXIoTEVEYXRhSW5wdXRTdHJlYW0gYnl0ZVN0cmVhbSwgYm9vbGVhbiBoYXNIZWFkZXIpIHsKLQlpbnRbXSBmaWxlSGVhZGVyID0gbmV3IGludFszXTsKLQl0cnkgewotCQlpZiAoaGFzSGVhZGVyKSB7Ci0JCQlmaWxlSGVhZGVyWzBdID0gYnl0ZVN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJCWZpbGVIZWFkZXJbMV0gPSBieXRlU3RyZWFtLnJlYWRTaG9ydCgpOwotCQl9IGVsc2UgewotCQkJZmlsZUhlYWRlclswXSA9IDA7Ci0JCQlmaWxlSGVhZGVyWzFdID0gMTsKLQkJfQotCQlmaWxlSGVhZGVyWzJdID0gYnl0ZVN0cmVhbS5yZWFkU2hvcnQoKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0KLQlpZiAoKGZpbGVIZWFkZXJbMF0gIT0gMCkgfHwgKGZpbGVIZWFkZXJbMV0gIT0gMSkpCi0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU5WQUxJRF9JTUFHRSk7Ci0JaW50IG51bUljb25zID0gZmlsZUhlYWRlclsyXTsKLQlpZiAobnVtSWNvbnMgPD0gMCkKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlyZXR1cm4gbnVtSWNvbnM7Ci19Ci1JbWFnZURhdGFbXSBsb2FkRnJvbUJ5dGVTdHJlYW0oKSB7Ci0JaW50IG51bUljb25zID0gbG9hZEZpbGVIZWFkZXIoaW5wdXRTdHJlYW0pOwotCWludFtdW10gaGVhZGVycyA9IGxvYWRJY29uSGVhZGVycyhudW1JY29ucyk7Ci0JSW1hZ2VEYXRhW10gaWNvbnMgPSBuZXcgSW1hZ2VEYXRhW2hlYWRlcnMubGVuZ3RoXTsKLQlmb3IgKGludCBpID0gMDsgaSA8IGljb25zLmxlbmd0aDsgaSsrKSB7Ci0JCWljb25zW2ldID0gbG9hZEljb24oaGVhZGVyc1tpXSk7Ci0JfQotCXJldHVybiBpY29uczsKLX0KLS8qKgotICogTG9hZCBvbmUgaWNvbiBmcm9tIHRoZSBieXRlIHN0cmVhbS4KLSAqLwotSW1hZ2VEYXRhIGxvYWRJY29uKGludFtdIGljb25IZWFkZXIpIHsKLQlieXRlW10gaW5mb0hlYWRlciA9IGxvYWRJbmZvSGVhZGVyKGljb25IZWFkZXIpOwotCVdpbkJNUEZpbGVGb3JtYXQgYm1wRm9ybWF0ID0gbmV3IFdpbkJNUEZpbGVGb3JtYXQoKTsKLQlibXBGb3JtYXQuaW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQlQYWxldHRlRGF0YSBwYWxldHRlID0gYm1wRm9ybWF0LmxvYWRQYWxldHRlKGluZm9IZWFkZXIpOwotCWJ5dGVbXSBzaGFwZURhdGEgPSBibXBGb3JtYXQubG9hZERhdGEoaW5mb0hlYWRlcik7Ci0JaW50IHdpZHRoID0gKGluZm9IZWFkZXJbNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlcls1XSAmIDB4RkYpIDw8IDgpIHwgKChpbmZvSGVhZGVyWzZdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzddICYgMHhGRikgPDwgMjQpOwotCWludCBoZWlnaHQgPSAoaW5mb0hlYWRlcls4XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzldICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMTBdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzExXSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgZGVwdGggPSAoaW5mb0hlYWRlclsxNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxNV0gJiAweEZGKSA8PCA4KTsKLQlpbmZvSGVhZGVyWzE0XSA9IDE7Ci0JaW5mb0hlYWRlclsxNV0gPSAwOwotCWJ5dGVbXSBtYXNrRGF0YSA9IGJtcEZvcm1hdC5sb2FkRGF0YShpbmZvSGVhZGVyKTsKLQltYXNrRGF0YSA9IGNvbnZlcnRQYWQobWFza0RhdGEsIHdpZHRoLCBoZWlnaHQsIDEsIDQsIDIpOwotCWJpdEludmVydERhdGEobWFza0RhdGEsIDAsIG1hc2tEYXRhLmxlbmd0aCk7Ci0JcmV0dXJuIEltYWdlRGF0YS5pbnRlcm5hbF9uZXcoCi0JCXdpZHRoLAotCQloZWlnaHQsCi0JCWRlcHRoLAotCQlwYWxldHRlLAotCQk0LAotCQlzaGFwZURhdGEsCi0JCTIsCi0JCW1hc2tEYXRhLAotCQludWxsLAotCQktMSwKLQkJLTEsCi0JCVNXVC5JTUFHRV9JQ08sCi0JCTAsCi0JCTAsCi0JCTAsCi0JCTApOwotfQotaW50W11bXSBsb2FkSWNvbkhlYWRlcnMoaW50IG51bUljb25zKSB7Ci0JaW50W11bXSBoZWFkZXJzID0gbmV3IGludFtudW1JY29uc11bN107Ci0JdHJ5IHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1JY29uczsgaSsrKSB7Ci0JCQloZWFkZXJzW2ldWzBdID0gaW5wdXRTdHJlYW0ucmVhZCgpOwotCQkJaGVhZGVyc1tpXVsxXSA9IGlucHV0U3RyZWFtLnJlYWQoKTsKLQkJCWhlYWRlcnNbaV1bMl0gPSBpbnB1dFN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJCWhlYWRlcnNbaV1bM10gPSBpbnB1dFN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJCWhlYWRlcnNbaV1bNF0gPSBpbnB1dFN0cmVhbS5yZWFkU2hvcnQoKTsKLQkJCWhlYWRlcnNbaV1bNV0gPSBpbnB1dFN0cmVhbS5yZWFkSW50KCk7Ci0JCQloZWFkZXJzW2ldWzZdID0gaW5wdXRTdHJlYW0ucmVhZEludCgpOwotCQl9Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lPLCBlKTsKLQl9Ci0JcmV0dXJuIGhlYWRlcnM7Ci19Ci1ieXRlW10gbG9hZEluZm9IZWFkZXIoaW50W10gaWNvbkhlYWRlcikgewotCWludCB3aWR0aCA9IGljb25IZWFkZXJbMF07Ci0JaW50IGhlaWdodCA9IGljb25IZWFkZXJbMV07Ci0JaW50IG51bUNvbG9ycyA9IGljb25IZWFkZXJbMl07IC8vIHRoZSBudW1iZXIgb2YgY29sb3JzIGlzIGluIHRoZSBsb3cgYnl0ZSwgYnV0IHRoZSBoaWdoIGJ5dGUgbXVzdCBiZSAwCi0JaWYgKG51bUNvbG9ycyA9PSAwKSBudW1Db2xvcnMgPSAyNTY7IC8vIHRoaXMgaXMgc3BlY2lmaWVkOiAnMDAnIHJlcHJlc2VudHMgJzI1NicgKDB4MTAwKSBjb2xvcnMKLQlpZiAoKG51bUNvbG9ycyAhPSAyKSAmJiAobnVtQ29sb3JzICE9IDgpICYmIChudW1Db2xvcnMgIT0gMTYpICYmCi0JCShudW1Db2xvcnMgIT0gMzIpICYmIChudW1Db2xvcnMgIT0gMjU2KSkKLQkJU1dULmVycm9yKFNXVC5FUlJPUl9JTlZBTElEX0lNQUdFKTsKLQlpZiAoaW5wdXRTdHJlYW0uZ2V0UG9zaXRpb24oKSA8IGljb25IZWFkZXJbNl0pIHsKLQkJLy8gU2VlayB0byB0aGUgc3BlY2lmaWVkIG9mZnNldAotCQl0cnkgewotCQkJaW5wdXRTdHJlYW0uc2tpcChpY29uSGVhZGVyWzZdIC0gaW5wdXRTdHJlYW0uZ2V0UG9zaXRpb24oKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0JYnl0ZVtdIGluZm9IZWFkZXIgPSBuZXcgYnl0ZVtXaW5CTVBGaWxlRm9ybWF0LkJNUEhlYWRlckZpeGVkU2l6ZV07Ci0JdHJ5IHsKLQkJaW5wdXRTdHJlYW0ucmVhZChpbmZvSGVhZGVyKTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCVNXVC5lcnJvcihTV1QuRVJST1JfSU8sIGUpOwotCX0KLQlpZiAoKChpbmZvSGVhZGVyWzEyXSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzEzXSAmIDB4RkYpIDw8IDgpKSAhPSAxKQotCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCWludCBpbmZvV2lkdGggPSAoaW5mb0hlYWRlcls0XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzVdICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbNl0gJiAweEZGKSA8PCAxNikgfCAoKGluZm9IZWFkZXJbN10gJiAweEZGKSA8PCAyNCk7Ci0JaW50IGluZm9IZWlnaHQgPSAoaW5mb0hlYWRlcls4XSAmIDB4RkYpIHwgKChpbmZvSGVhZGVyWzldICYgMHhGRikgPDwgOCkgfCAoKGluZm9IZWFkZXJbMTBdICYgMHhGRikgPDwgMTYpIHwgKChpbmZvSGVhZGVyWzExXSAmIDB4RkYpIDw8IDI0KTsKLQlpbnQgYml0Q291bnQgPSAoaW5mb0hlYWRlclsxNF0gJiAweEZGKSB8ICgoaW5mb0hlYWRlclsxNV0gJiAweEZGKSA8PCA4KTsKLQlpZiAoaGVpZ2h0ID09IGluZm9IZWlnaHQgJiYgYml0Q291bnQgPT0gMSkgaGVpZ2h0IC89IDI7Ci0JaWYgKCEoKHdpZHRoID09IGluZm9XaWR0aCkgJiYgKGhlaWdodCAqIDIgPT0gaW5mb0hlaWdodCkgJiYKLQkJKGJpdENvdW50ID09IDEgfHwgYml0Q291bnQgPT0gNCB8fCBiaXRDb3VudCA9PSA4IHx8IGJpdENvdW50ID09IDI0IHx8IGJpdENvdW50ID09IDMyKSkpCi0JCQlTV1QuZXJyb3IoU1dULkVSUk9SX0lOVkFMSURfSU1BR0UpOwotCWluZm9IZWFkZXJbOF0gPSAoYnl0ZSkoaGVpZ2h0ICYgMHhGRik7Ci0JaW5mb0hlYWRlcls5XSA9IChieXRlKSgoaGVpZ2h0ID4+IDgpICYgMHhGRik7Ci0JaW5mb0hlYWRlclsxMF0gPSAoYnl0ZSkoKGhlaWdodCA+PiAxNikgJiAweEZGKTsKLQlpbmZvSGVhZGVyWzExXSA9IChieXRlKSgoaGVpZ2h0ID4+IDI0KSAmIDB4RkYpOwotCXJldHVybiBpbmZvSGVhZGVyOwotfQotfQotc3RhdGljIGNsYXNzIFNXVCB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfSUNPID0gMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTyA9IDM5OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lOVkFMSURfSU1BR0UgPSA0MDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9OVUxMX0FSR1VNRU5UID0gNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX0FSR1VNRU5UID0gNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9DQU5OT1RfQkVfWkVSTyA9IDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfVU5ERUZJTkVEID0gLTE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5TVVBQT1JURURfREVQVEggPSAzODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU1BBUkVOQ1lfTUFTSyA9IDEgPDwgMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9VTlNVUFBPUlRFRF9GT1JNQVQgPSA0MjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUUkFOU1BBUkVOQ1lfQUxQSEEgPSAxIDw8IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNQQVJFTkNZX05PTkUgPSAweDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFJBTlNQQVJFTkNZX1BJWEVMID0gMSA8PCAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElNQUdFX0JNUCA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU1BR0VfQk1QX1JMRSA9IDE7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGVycm9yKGludCBjb2RlKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciAiK2NvZGUpOyAvLyROT04tTkxTLTEkCi0JfQotCXB1YmxpYyBzdGF0aWMgdm9pZCBlcnJvcihpbnQgY29kZSwgVGhyb3dhYmxlIHQpIHsKLQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odCk7Ci0JfQotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmNfYW50L29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2FudC9HZW5lcmF0b3JUYXNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvYW50L0dlbmVyYXRvclRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE5M2JlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvYW50L0dlbmVyYXRvclRhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuYW50OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5CdWlsZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRvb2xzLmFudC5UYXNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucHVibGlzaGVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wdWJsaXNoZXIuYWN0aW9ucy5FY2xpcHNlSW5zdGFsbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnB1Ymxpc2hlci5hY3Rpb25zLkxvY2FsVXBkYXRlU2l0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotCi0vKioKLSAqIEFuIEFudCB0YXNrIHRvIGNhbGwgdGhlIHAyIE1ldGFkYXRhIEdlbmVyYXRvciBhcHBsaWNhdGlvbi4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdG9yVGFzayBleHRlbmRzIFRhc2sgewotCi0JcHJvdGVjdGVkIFB1Ymxpc2hlckluZm8gcHJvdmlkZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIFN0cmluZyBzb3VyY2U7Ci0JcHJvdGVjdGVkIFN0cmluZyBtZXRhZGF0YUxvY2F0aW9uOwotCXByb3RlY3RlZCBTdHJpbmcgbWV0YWRhdGFSZXBvTmFtZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGFydGlmYWN0TG9jYXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyBhcnRpZmFjdFJlcG9OYW1lOwotCXByb3RlY3RlZCBib29sZWFuIGNvbXByZXNzID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaW5wbGFjZSA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGFwcGVuZCA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIHJldXNlUGFja2VkRmlsZXMgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gY29uZmlndXJhdGlvbnM7Ci0JcHJvdGVjdGVkIFN0cmluZyBtb2RlOwotCXByaXZhdGUgRmlsZVtdIGJ1bmRsZXM7Ci0JcHJpdmF0ZSBGaWxlW10gZmVhdHVyZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvZHVjdEZpbGU7Ci0JcHJpdmF0ZSBTdHJpbmcgZmxhdm9yOwotCXByaXZhdGUgU3RyaW5nIG9wZXJhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBvcGVyYXRpb25WYWx1ZTsKLQlwcml2YXRlIGJvb2xlYW4gYWRkRGVmYXVsdElVczsKLQlwcml2YXRlIFN0cmluZyByb290OwotCXByaXZhdGUgU3RyaW5nIHJvb3RWZXJzaW9uOwotCXByaXZhdGUgU3RyaW5nIHZlcnNpb25BZHZpY2U7Ci0KLQlwcml2YXRlIFN0cmluZyByb290TmFtZTsKLQlwcml2YXRlIFN0cmluZ1tdIHRvcExldmVsOwotCXByaXZhdGUgYm9vbGVhbiBzdGFydDsKLQlwcml2YXRlIFN0cmluZ1tdIG5vblJvb3RGaWxlczsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5hcGFjaGUudG9vbHMuYW50LlRhc2sjZXhlY3V0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBCdWlsZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpbml0aWFsaXplKGdldEluZm8oKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQnVpbGRFeGNlcHRpb24oIlVuYWJsZSB0byBjb25maWd1cmUgcmVwb3NpdG9yaWVzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljcmVhdGVWZXJzaW9uQWR2aWNlKCk7Ci0JCUlQdWJsaXNoaW5nQWN0aW9uW10gYWN0aW9ucyA9IGNyZWF0ZUFjdGlvbnMoKTsKLQkJSVN0YXR1cyByZXN1bHQgPSBuZXcgUHVibGlzaGVyKGdldEluZm8oKSkucHVibGlzaChhY3Rpb25zKTsKLQotCQkvLyBUT0RPIGhhY2sgYXNzaWdubWVudHMgdG8ga2VlcCB0aGUgY29tcGlsZXIgZnJvbSB3aGluaW5nIGFib3V0IHRoZSB1bnJlZmVyZW5jZWQgcHJpdmF0ZXMuCi0JCU9iamVjdCBvID0gYnVuZGxlczsKLQkJbyA9IGZlYXR1cmVzOwotCQlvID0gcHJvZHVjdEZpbGU7Ci0JCWJvb2xlYW4gYiA9IGFkZERlZmF1bHRJVXM7Ci0KLQkJLy8JCXRyeSB7Ci0JCS8vCQkJaWYgKCJpbmNyZW1lbnRhbCIuZXF1YWxzKG1vZGUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkvLwkJCQkJcmVzdWx0ID0gbmV3IFB1Ymxpc2hlclJlc3VsdCgpOwotCQkvLwkJCQlnZW5lcmF0b3Iuc2V0SW5jcmVtZW50YWxSZXN1bHQocmVzdWx0KTsKLQkJLy8JCQkJZ2VuZXJhdG9yLnNldEdlbmVyYXRvclJvb3RJVShmYWxzZSk7Ci0JCS8vCQkJfSBlbHNlIGlmICgiZmluYWwiLmVxdWFscyhtb2RlKSAmJiByZXN1bHQgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCS8vCQkJCWdlbmVyYXRvci5zZXRJbmNyZW1lbnRhbFJlc3VsdChyZXN1bHQpOwotCQkvLwkJCQlnZW5lcmF0b3Iuc2V0R2VuZXJhdG9yUm9vdElVKHRydWUpOwotCQkvLwkJCX0KLQkJLy8KLQkJLy8JCQlnZW5lcmF0b3IucnVuKHByb3ZpZGVyKTsKLQkJLy8KLQkJLy8JCQlpZiAoISJpbmNyZW1lbnRhbCIuZXF1YWxzKG1vZGUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCQkJcHJvdmlkZXIgPSBudWxsOwotCQkvLwkJCQlnZW5lcmF0b3IgPSBudWxsOwotCQkvLwkJCQlyZXN1bHQgPSBudWxsOwotCQkvLwkJCX0KLQkJLy8JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCS8vCQkJdGhyb3cgbmV3IEJ1aWxkRXhjZXB0aW9uKFRhc2tNZXNzYWdlcy5leGNlcHRpb25fZXJyb3JPY2N1cnJlZENhbGxpbmdHZW5lcmF0b3IsIGUpOwotCQkvLwkJfQotCX0KLQotCXByaXZhdGUgSVB1Ymxpc2hpbmdBY3Rpb25bXSBjcmVhdGVBY3Rpb25zKCkgewotCQlpZiAob3BlcmF0aW9uID09IG51bGwpCi0JCQkvLyBUT0RPIHdoYXQgdG8gZG8gaW4gdGhpcyBjYXNlPwotCQkJcmV0dXJuIG5ldyBJUHVibGlzaGluZ0FjdGlvbltdIHt9OwotCQlpZiAob3BlcmF0aW9uLmVxdWFscygiLXVwZGF0ZSIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IElQdWJsaXNoaW5nQWN0aW9uW10ge25ldyBMb2NhbFVwZGF0ZVNpdGVBY3Rpb24ob3BlcmF0aW9uVmFsdWUpfTsKLQkJaWYgKG9wZXJhdGlvbi5lcXVhbHMoIi1zb3VyY2UiKSkgLy8kTk9OLU5MUy0xJAotCQkJLy8gVE9ETyB3aGF0IHRvIGRvIGluIHRoaXMgY2FzZT8KLQkJCXJldHVybiBuZXcgSVB1Ymxpc2hpbmdBY3Rpb25bXSB7bmV3IEVjbGlwc2VJbnN0YWxsQWN0aW9uKG9wZXJhdGlvblZhbHVlLCByb290LCByb290VmVyc2lvbiwgcm9vdE5hbWUsIGZsYXZvciwgdG9wTGV2ZWwsIG5vblJvb3RGaWxlcywgc3RhcnQpfTsKLQkJaWYgKG9wZXJhdGlvbi5lcXVhbHMoIi11cGRhdGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJLy8gVE9ETyB3aGF0IHRvIGRvIGluIHRoaXMgY2FzZT8KLQkJCXJldHVybiBuZXcgSVB1Ymxpc2hpbmdBY3Rpb25bXSB7fTsKLQkJaWYgKG9wZXJhdGlvbi5lcXVhbHMoIi11cGRhdGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJLy8gVE9ETyB3aGF0IHRvIGRvIGluIHRoaXMgY2FzZT8KLQkJCXJldHVybiBuZXcgSVB1Ymxpc2hpbmdBY3Rpb25bXSB7fTsKLQkJLy8gVE9ETyB3aGF0IHRvIGRvIGluIHRoaXMgY2FzZT8KLQkJcmV0dXJuIG5ldyBJUHVibGlzaGluZ0FjdGlvbltdIHt9OwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVWZXJzaW9uQWR2aWNlKCkgewotCQlpZiAodmVyc2lvbkFkdmljZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkvLyBUT0RPIHJlYWQgdGhlIHZlcnNpb24gYWR2aWNlIGFuZCBhZGQgdGhlIElWZXJzaW9uQWR2aWNlCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShQdWJsaXNoZXJJbmZvIGluZm8pIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlpZiAoaW5wbGFjZSkgewotCQkJRmlsZSBsb2NhdGlvbiA9IG5ldyBGaWxlKHNvdXJjZSk7Ci0JCQl0cnkgewotCQkJCWlmIChtZXRhZGF0YUxvY2F0aW9uID09IG51bGwpCi0JCQkJCW1ldGFkYXRhTG9jYXRpb24gPSBsb2NhdGlvbi50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQkJaWYgKGFydGlmYWN0TG9jYXRpb24gPT0gbnVsbCkKLQkJCQkJYXJ0aWZhY3RMb2NhdGlvbiA9IGxvY2F0aW9uLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gb3VnaHQgbm90IGhhcHBlbi4uLgotCQkJfQotCQkJaW5mby5zZXRBcnRpZmFjdE9wdGlvbnMoaW5mby5nZXRBcnRpZmFjdE9wdGlvbnMoKSB8IElQdWJsaXNoZXJJbmZvLkFfSU5ERVggfCBJUHVibGlzaGVySW5mby5BX1BVQkxJU0gpOwotCQl9IGVsc2UKLQkJCWluZm8uc2V0QXJ0aWZhY3RPcHRpb25zKGluZm8uZ2V0QXJ0aWZhY3RPcHRpb25zKCkgfCBJUHVibGlzaGVySW5mby5BX0lOREVYIHwgSVB1Ymxpc2hlckluZm8uQV9QVUJMSVNIIHwgSVB1Ymxpc2hlckluZm8uQV9PVkVSV1JJVEUpOwotCQlpbml0aWFsaXplUmVwb3NpdG9yaWVzKGluZm8pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVSZXBvc2l0b3JpZXMoUHVibGlzaGVySW5mbyBpbmZvKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJaW5mby5zZXRBcnRpZmFjdFJlcG9zaXRvcnkoUHVibGlzaGVyLmNyZWF0ZUFydGlmYWN0UmVwb3NpdG9yeShhcnRpZmFjdExvY2F0aW9uLCBhcnRpZmFjdFJlcG9OYW1lLCBhcHBlbmQsIGNvbXByZXNzLCByZXVzZVBhY2tlZEZpbGVzKSk7Ci0JCWluZm8uc2V0TWV0YWRhdGFSZXBvc2l0b3J5KFB1Ymxpc2hlci5jcmVhdGVNZXRhZGF0YVJlcG9zaXRvcnkobWV0YWRhdGFMb2NhdGlvbiwgbWV0YWRhdGFSZXBvTmFtZSwgYXBwZW5kLCBjb21wcmVzcykpOwotCX0KLQotCXByaXZhdGUgUHVibGlzaGVySW5mbyBnZXRJbmZvKCkgewotCQlpZiAocHJvdmlkZXIgPT0gbnVsbCkKLQkJCXByb3ZpZGVyID0gbmV3IFB1Ymxpc2hlckluZm8oKTsKLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFwcGVuZChTdHJpbmcgdmFsdWUpIHsKLQkJYXBwZW5kID0gQm9vbGVhbi52YWx1ZU9mKHZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFJlcG9zaXRvcnkoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCWFydGlmYWN0TG9jYXRpb24gPSBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFJlcG9zaXRvcnlOYW1lKFN0cmluZyB2YWx1ZSkgewotCQlhcnRpZmFjdFJlcG9OYW1lID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QmFzZShTdHJpbmcgdmFsdWUpIHsKLQkJc291cmNlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QnVuZGxlcyhTdHJpbmcgdmFsdWUpIHsKLQkJYnVuZGxlcyA9IG5ldyBGaWxlW10ge25ldyBGaWxlKHZhbHVlKX07Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tcHJlc3MoU3RyaW5nIHZhbHVlKSB7Ci0JCWNvbXByZXNzID0gQm9vbGVhbi52YWx1ZU9mKHZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb25maWcoU3RyaW5nIHZhbHVlKSB7Ci0JCW9wZXJhdGlvbiA9ICItY29uZmlnIjsgLy8kTk9OLU5MUy0xJAotCQlvcGVyYXRpb25WYWx1ZSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElucGxhY2UoU3RyaW5nIHZhbHVlKSB7Ci0JCW9wZXJhdGlvbiA9ICItaW5wbGFjZSI7IC8vJE5PTi1OTFMtMSQKLQkJb3BlcmF0aW9uVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCW9wZXJhdGlvbiA9ICItc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCQlvcGVyYXRpb25WYWx1ZSA9IGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVwZGF0ZVNpdGUoU3RyaW5nIHZhbHVlKSB7Ci0JCW9wZXJhdGlvbiA9ICItdXBkYXRlIjsgLy8kTk9OLU5MUy0xJAotCQlvcGVyYXRpb25WYWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhlKFN0cmluZyB2YWx1ZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZlYXR1cmVzKFN0cmluZyB2YWx1ZSkgewotCQlmZWF0dXJlcyA9IG5ldyBGaWxlW10ge25ldyBGaWxlKHZhbHVlKX07Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Rmxhdm9yKFN0cmluZyB2YWx1ZSkgewotCQlmbGF2b3IgPSB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhdW5jaGVyQ29uZmlnKFN0cmluZyB2YWx1ZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGFkYXRhUmVwb3NpdG9yeShTdHJpbmcgbG9jYXRpb24pIHsKLQkJbWV0YWRhdGFMb2NhdGlvbiA9IGxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1ldGFkYXRhUmVwb3NpdG9yeU5hbWUoU3RyaW5nIHZhbHVlKSB7Ci0JCW1ldGFkYXRhUmVwb05hbWUgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROb0RlZmF1bHRJVXMoU3RyaW5nIHZhbHVlKSB7Ci0JCWFkZERlZmF1bHRJVXMgPSAhQm9vbGVhbi52YWx1ZU9mKHZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFAyT1MoU3RyaW5nIHZhbHVlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvZHVjdEZpbGUoU3RyaW5nIGZpbGUpIHsKLQkJcHJvZHVjdEZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBcnRpZmFjdFJlcG9zaXRvcnkoU3RyaW5nIHZhbHVlKSB7Ci0JCWdldEluZm8oKS5zZXRBcnRpZmFjdE9wdGlvbnMoZ2V0SW5mbygpLmdldEFydGlmYWN0T3B0aW9ucygpIHwgSVB1Ymxpc2hlckluZm8uQV9JTkRFWCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHVibGlzaEFydGlmYWN0cyhTdHJpbmcgdmFsdWUpIHsKLQkJZ2V0SW5mbygpLnNldEFydGlmYWN0T3B0aW9ucyhnZXRJbmZvKCkuZ2V0QXJ0aWZhY3RPcHRpb25zKCkgfCBJUHVibGlzaGVySW5mby5BX1BVQkxJU0gpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvb3QoU3RyaW5nIHZhbHVlKSB7Ci0JCXJvb3QgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSb290VmVyc2lvbihTdHJpbmcgdmFsdWUpIHsKLQkJcm9vdFZlcnNpb24gPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2RlKFN0cmluZyB2YWx1ZSkgewotCQltb2RlID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbkFkdmljZShTdHJpbmcgdmFsdWUpIHsKLQkJdmVyc2lvbkFkdmljZSA9IHZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjX2FudC9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9hbnQvVGFza01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucHVibGlzaGVyL3NyY19hbnQvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9tZXRhZGF0YS9nZW5lcmF0b3IvYW50L1Rhc2tNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2U3MTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjX2FudC9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9hbnQvVGFza01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLmFudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBUYXNrTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5hbnQubWVzc2FnZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGV4Y2VwdGlvbl9lcnJvck9jY3VycmVkQ2FsbGluZ0dlbmVyYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25fZXJyb3JBcnRpZmFjdFJlcG87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXhjZXB0aW9uX2Vycm9yTWV0YWRhdGFSZXBvOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFRhc2tNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmNfYW50L29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2FudC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnB1Ymxpc2hlci9zcmNfYW50L29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvbWV0YWRhdGEvZ2VuZXJhdG9yL2FudC9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzJlYjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wdWJsaXNoZXIvc3JjX2FudC9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL21ldGFkYXRhL2dlbmVyYXRvci9hbnQvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWV4Y2VwdGlvbl9lcnJvck9jY3VycmVkQ2FsbGluZ0dlbmVyYXRvciA9IEFuIGVycm9yIG9jY3VycmVkIHdoZW4gY2FsbGluZyBnZW5lcmF0b3IuCi1leGNlcHRpb25fZXJyb3JBcnRpZmFjdFJlcG8gPSBFcnJvciBzZXR0aW5nIGFydGlmYWN0IHJlcG9zaXRvcnkgezB9LgotZXhjZXB0aW9uX2Vycm9yTWV0YWRhdGFSZXBvID0gRXJyb3Igc2V0dGluZyBtZXRhZGF0YSByZXBvc2l0b3J5IHswfS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwNDNjYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYmluCi1idWlsZC54bWwKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MWJkNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGluczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMDEwOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLSNTYXQgT2N0IDI3IDE0OjE5OjI0IFBEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmJjYzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1ODowNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9Cb290c3RyYXAucHJvZHVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL0Jvb3RzdHJhcC5wcm9kdWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzk0MjZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL0Jvb3RzdHJhcC5wcm9kdWN0CisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/cGRlIHZlcnNpb249IjMuNCI/PgotCi08cHJvZHVjdCBuYW1lPSJwMiBib290c3RyYXAiIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucy5wcm9kdWN0IiBhcHBsaWNhdGlvbj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmFwcGxpY2F0aW9uIiB1c2VGZWF0dXJlcz0iZmFsc2UiPgotCi0gICA8Y29uZmlnSW5pIHVzZT0iZGVmYXVsdCI+Ci0gICAgICA8bGludXg+L29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL2NvbmZpZy5pbmk8L2xpbnV4PgotICAgICAgPG1hY29zeD4vb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMvY29uZmlnLmluaTwvbWFjb3N4PgotICAgICAgPHNvbGFyaXM+L29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL2NvbmZpZy5pbmk8L3NvbGFyaXM+Ci0gICAgICA8d2luMzI+L29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zL2NvbmZpZy5pbmk8L3dpbjMyPgotICAgPC9jb25maWdJbmk+Ci0KLSAgIDxsYXVuY2hlckFyZ3M+Ci0gICAgICA8dm1BcmdzPi1Eb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLm5vQ29uZmlnPXRydWU8L3ZtQXJncz4KLSAgICAgIDx2bUFyZ3NNYWM+LVhzdGFydE9uRmlyc3RUaHJlYWQgLURvcmcuZWNsaXBzZS5zd3QuaW50ZXJuYWwuY2FyYm9uLnNtYWxsRm9udHM8L3ZtQXJnc01hYz4KLSAgIDwvbGF1bmNoZXJBcmdzPgotCi0gICA8d2luZG93SW1hZ2VzLz4KLQotCi0gICA8bGF1bmNoZXI+Ci0gICAgICA8c29sYXJpcy8+Ci0gICAgICA8d2luIHVzZUljbz0iZmFsc2UiPgotICAgICAgICAgPGJtcC8+Ci0gICAgICA8L3dpbj4KLSAgIDwvbGF1bmNoZXI+Ci0KLSAgIDx2bT4KLSAgIDwvdm0+Ci0KLSAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLm5ldCIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5uZXQud2luMzIueDg2IiBmcmFnbWVudD0idHJ1ZSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkucmVnaXN0cnkiIGZyYWdtZW50PSJ0cnVlIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lY2YiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlciIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5hcHAiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3giLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ii8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucyIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkud2luMzIueDg2IiBmcmFnbWVudD0idHJ1ZSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5vc2dpIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuc2F0NGouY29yZSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLnNhdDRqLnBiIi8+Ci0gICA8L3BsdWdpbnM+Ci0KLTwvcHJvZHVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OGI4M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zLkFjdGl2YXRvcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LAotIENEQy0xLjEvRm91bmRhdGlvbi0xLjEKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5leHRlbnNpb25sb2NhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5jb25maWd1cmF0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW47dmVyc2lvbj0iMS4yLjAiLAotIG9yZy5vc2dpLnV0aWwudHJhY2tlcjt2ZXJzaW9uPSIxLjMuMyIsCi0gb3JnLnhtbC5zYXgKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZTtidW5kbGUtdmVyc2lvbj0iMC4xLjAiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZWNvbmNpbGVyLmRyb3BpbnM7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvUmVjb25jaWxlciBBcHAgLSBNZXRhZGF0YSBHZW5lcmF0b3IubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvUmVjb25jaWxlciBBcHAgLSBNZXRhZGF0YSBHZW5lcmF0b3IubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmRlZDEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL1JlY29uY2lsZXIgQXBwIC0gTWV0YWRhdGEgR2VuZXJhdG9yLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlL1JlY29uY2lsZXIgQXBwIC0gTWV0YWRhdGEgR2VuZXJhdG9yIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfYXV0b19zdGFydCIgdmFsdWU9ImZhbHNlIi8+Ci08aW50QXR0cmlidXRlIGtleT0iZGVmYXVsdF9zdGFydF9sZXZlbCIgdmFsdWU9IjQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iaW5jbHVkZU9wdGlvbmFsIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLWNvbnNvbGUgJiMxMzsmIzEwOy1jb25zb2xlbG9nJiMxMzsmIzEwOy1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvci5FY2xpcHNlR2VuZXJhdG9yJiMxMzsmIzEwOy1tZXRhZGF0YVJlcG9zaXRvcnkgZmlsZTpEOi90bXAvcmVjb25jaWxlci9yZXBvLyYjMTM7JiMxMDstYXJ0aWZhY3RSZXBvc2l0b3J5IGZpbGU6RDovdG1wL3JlY29uY2lsZXIvcmVwbyYjMTM7JiMxMDstc291cmNlIEQ6L3RtcC9yZWNvbmNpbGVyL2VjbGlwc2UmIzEzOyYjMTA7LXJvb3QgcmVjb25jaWxlciYjMTM7JiMxMDstcm9vdFZlcnNpb24gMS4wLjAmIzEzOyYjMTA7LWZsYXZvciB0b29saW5nJiMxMzsmIzEwOy1wdWJsaXNoQXJ0aWZhY3RzJiMxMzsmIzEwOy1hcHBlbmQiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icGRlLnZlcnNpb24iIHZhbHVlPSIzLjMiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ic2hvd19zZWxlY3RlZF9vbmx5IiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0YXJnZXRfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkqMS4wLjAudjIwMDgwNDIxLTIwMDZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgqMy4yLjEwMC52MjAwNzA1MDJAZGVmYXVsdDpkZWZhdWx0LGNvbS5pYm0uaWN1KjMuOC4xLnYyMDA4MDQwMkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24qMy40LjAudjIwMDgwNDIxLTIwMDZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSozLjQuMC52MjAwODA0MjEtMTgwNUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcyozLjIuMjAwLnYyMDA4MDQyMS0yMDA2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yKjMuMi4yMDAudjIwMDgwNDE3QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcyozLjIuMTAwLnYyMDA4MDMyNC0xNjAwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpKjMuNC4wLnYyMDA4MDQyMS0yMDA2QDosb3JnLmVjbGlwc2UuY29yZS5uZXQqMS4xLjAuSTIwMDgwNDIyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5KjMuNC4wLnYyMDA4MDQyMS0yMDA2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmpvYnMqMy40LjAudjIwMDgwMzEwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzKjMuMS4yMDAudjIwMDcxMjAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5LndpbjMyLng4NioxLjAuMC52MjAwODA0MjEtMjAwNkBkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLmVxdWlub3guYXBwKjEuMS4wLnYyMDA4MDQyMS0yMDA2QGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeSozLjIuMjAwLnYyMDA3MDcxN0BkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIqMS4wLjEwMC52MjAwODA0MjEtMjAwNkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSozLjMuMC52MjAwODA0MTRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUubmV0LndpbjMyLng4NioxLjAuMC5IRUFEQGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuYW50LmNvcmUqMy4yLjAudjIwMDgwMzE5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4NioxLjAuMTAwLnYyMDA4MDQyMS0yMDA2QGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcioxLjAuMTAwLnYyMDA4MDQxNEBkZWZhdWx0OmRlZmF1bHQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VOYW1lZEpSRSIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ3b3Jrc3BhY2VfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4qMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlcioyLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YqMi4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyKjIuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2Zlci5zc2wqMS4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5KjIuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLnNzbCoxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpmYWxzZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvUmVjb25jaWxlciBhcHAgaW5zdGFsbGF0aW9uLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL1JlY29uY2lsZXIgYXBwIGluc3RhbGxhdGlvbi5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyY2I0NTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvUmVjb25jaWxlciBhcHAgaW5zdGFsbGF0aW9uLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlL1JlY29uY2lsZXIgYXBwIGluc3RhbGxhdGlvbiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0X2F1dG9fc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPGludEF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfc3RhcnRfbGV2ZWwiIHZhbHVlPSI0Ii8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImluY2x1ZGVPcHRpb25hbCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1jb25zb2xlICYjMTM7JiMxMDstY29uc29sZWxvZyYjMTM7JiMxMDstbm9FeGl0JiMxMzsmIzEwOy1hcHBsaWNhdGlvbiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcC5hcHBsaWNhdGlvbiYjMTM7JiMxMDstbWV0YWRhdGFSZXBvc2l0b3J5IGZpbGU6ZDovdG1wL3JlY29uY2lsZXIvcmVwbyAmIzEzOyYjMTA7LWFydGlmYWN0UmVwb3NpdG9yeSBmaWxlOmQ6L3RtcC9yZWNvbmNpbGVyL3JlcG8gJiMxMzsmIzEwOy1pbnN0YWxsSVUgcmVjb25jaWxlciAmIzEzOyYjMTA7LWRlc3RpbmF0aW9uIGQ6L3RtcC9ib290c3RyYXBUZXN0LyAmIzEzOyYjMTA7LWJ1bmRsZXBvb2wgZDovdG1wL3Bvb2wvJiMxMzsmIzEwOy1wcm9maWxlIGJvb3RQcm9maWxlICYjMTM7JiMxMDstcDIub3Mgd2luMzIgJiMxMzsmIzEwOy1wMi53cyB3aW4zMiAmIzEzOyYjMTA7LXAyLmFyY2ggeDg2JiMxMzsmIzEwOy1wcm9maWxlUHJvcGVydGllcyBvcmcuZWNsaXBzZS51cGRhdGUuaW5zdGFsbC5mZWF0dXJlcz10cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1fQVJHVU1FTlRTIiB2YWx1ZT0iLURlY2xpcHNlLnAyLmRhdGEuYXJlYT1kOi90bXAvYm9vdHN0cmFwVGVzdC9wMiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InBkZS52ZXJzaW9uIiB2YWx1ZT0iMy4zIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InNob3dfc2VsZWN0ZWRfb25seSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idGFyZ2V0X2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUqMy40LjAudjIwMDgwNDIxLTE4MDVANDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uKjMuNC4wLnYyMDA4MDQyMS0yMDA2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCoxLjEuMC52MjAwODA0MjEtMjAwNkAyOnRydWUsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkucmVnaXN0cnkqMy4yLjIwMC52MjAwNzA3MTdAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5LndpbjMyLng4NioxLjAuMC52MjAwODA0MjEtMjAwNkBkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLnN3dC53aW4zMi53aW4zMi54ODYqMy40LjAudjM0NDBAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzKjMuMi4yMDAudjIwMDgwNDIxLTIwMDZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMqMy40LjAudjIwMDgwNDA4LTA4MDBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLnN3dCozLjQuMC52MzQ0MEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aCozLjIuMTAwLnYyMDA3MDUwMkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSozLjMuMC52MjAwODA0MTRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2kqMy40LjAudjIwMDgwNDIxLTIwMDZAOixvcmcuZWNsaXBzZS5jb3JlLmpvYnMqMy40LjAudjIwMDgwMzEwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5qZmFjZSozLjQuMC5JMjAwODA0MjItMDgwMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS52YXJpYWJsZXMqMy4yLjEwMC52MjAwODAzMjQtMTYwMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyozLjEuMjAwLnYyMDA3MTIwM0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuYW50LmNvcmUqMy4yLjAudjIwMDgwMzE5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5KjEuMC4wLnYyMDA4MDQyMS0yMDA2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5KjMuNC4wLnYyMDA4MDQyMS0yMDA2QGRlZmF1bHQ6ZGVmYXVsdCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZ0FyZWEiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZU5hbWVkSlJFIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9IndvcmtzcGFjZV9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSoxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lKjEuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvcioxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5zYXQ0ai5wYioyLjAuMC52MjAwODA0MjFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSoxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwKjEuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlKjEuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5KjIuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmKjIuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlcioyLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIqMi4wLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvcioxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSoxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCoxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSoxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXIuc3NsKjEuMC4wLnF1YWxpZmllckBkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yKjEuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLnNhdDRqLmNvcmUqMi4wLjAudjIwMDgwNDIxQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluKjEuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLnNzbCoxLjAuMC5xdWFsaWZpZXJAZGVmYXVsdDpmYWxzZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU4YWVkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbAotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvY29uZmlnLmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL2NvbmZpZy5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMzA3MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvY29uZmlnLmluaQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSMgRWNsaXBzZSBydW50aW1lIGNvbmZpZ3VyYXRpb24gZmlsZQotIyBUaGlzIGZpbGUgY29udGFpbnMgYSBudW1iZXIgb2Yga2V5L3ZhbHVlIHBhaXJzIHRoYXQgYXJlIG1lcmdlZCBpbnRvIHRoZSAKLSMgU3lzdGVtIHByb3BlcnRpZXMgb24gc3lzdGVtIHN0YXJ0dXAuICBUaGUgdmFsdWVzIGNvbnRyb2wgdGhlIHdheSB0aGUgCi0jIHJ1bnRpbWUgaXMgc3RydWN0dXJlZCBhbmQgcnVucy4KLQotIyBOb3RlOiAgT25seSBwbGF0Zm9ybTovYmFzZS8gYW5kIGZpbGU6IFVSTHMgYXJlIHN1cHBvcnRlZC4gIEluIGdlbmVyYWwgdGhlIAotIyBVUkxzIGdpdmVuIG1heSBpbmNsdWRlIGEgdmVyc2lvbiBudW1iZXIgKGUuZy4sIC4uLi9sb2NhdGlvbl8xLjIuMykuICAKLSMgSWYgYSB2ZXJzaW9uIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBzeXN0ZW0gYmluZHMKLSMgdG8gdGhlIGxvY2F0aW9uIHdoaWNoIG1hdGNoZXMgZXhhY3RseSBvciB0byB0aGUgdmVyc2lvbmVkIGxvY2F0aW9uIHdpdGggdGhlCi0jIGxhdGVzdCB2ZXJzaW9uIG51bWJlci4gIElmIGEgdmVyc2lvbiBudW1iZXIgaXMgZ2l2ZW4gdGhlbiBvbmx5IGV4YWN0IG1hdGNoZXMKLSMgYXJlIGNvbnNpZGVyZWQuCi0KLSMgVGhlIFVSTCBmb3IgdGhlIHJ1bnRpbWUgZW50cnkgcG9pbnQuICBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotIyBwbGF0Zm9ybTovYmFzZS9wbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2kgCi0jb3NnaS5mcmFtZXdvcmsgPSBwbGF0Zm9ybTovYmFzZS9wbHVnaW5zL29yZy5lY2xpcHNlLm9zZ2kKLQotIyBUaGUgY2xhc3NwYXRoIGZvciB0aGUgZnJhbWV3b3JrIGZvdW5kIGF0IHRoZSBvc2dpLmZyYW1ld29yayBsb2NhdGlvbi4gIFRoaXMgCi0jIGNvbW1hLXNlcGFyYXRlZCBsaXN0IGNvbnRhaW5zIGVpdGhlciBVUkxzIG9yIHNpbXBsZSBlbGVtZW50IG5hbWVzLiAgU2ltcGxlCi0jIG5hbWVzIGFyZSBhc3N1bWVkIHRvIGJlIHJlbGF0aXZlIHRvIHRoZSBmcmFtZXdvcmsncyBpbnN0YWxsIGRpcmVjdG9yeS4gIAotIyBUeXBpY2FsbHkgdGhpcyB2YWx1ZSBuZWVkIG5vdCBiZSBzZXQgYXMgaXQgaXMgaW5pdGlhbGl6ZWQgYnkgdGhlIGZyYW1ld29yayBpdHNlbGYuCi0jIFZlcnNpb24gbWF0Y2ggc2VhcmNoaW5nIGlzIG5vdCBkb25lIGZvciBVUkxzIGxpc3RlZCBoZXJlLgotI29zZ2kuZnJhbWV3b3JrQ2xhc3NQYXRoID0KLQotIyBUaGUgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbG9jYXRpb25zIHRvIHNlYXJjaCBmb3IgdGhlIHNwbGFzaCBzY3JlZW4gZmlsZSAoc3BsYXNoLmJtcCkuCi0jIEZvciBlYWNoIGxpc3QgZWxlbWVudCBhIHN1YmRpcmVjdG9yeSBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlIHBhdHRlcm4gbmwvPGxvY2FsZT4gaXMgc2VhcmNoZWQuCi0jIFRoZSBzeXN0ZW0gYmluZHMgdG8gdGhlIGZpcnN0IG1hdGNoaW5nIGZpbGUuICBUaGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLgotb3NnaS5zcGxhc2hQYXRoID0gcGxhdGZvcm06L2Jhc2UvcGx1Z2lucy9vcmcuZWNsaXBzZS5wbGF0Zm9ybQotCi0jIFRoZSBsb2NhdGlvbiBvZiB0aGUgc3BsYXNoIHNjcmVlbiBmaWxlLiAgSWYgdGhpcyB2YWx1ZSBpcyBzZXQgYXQgc3lzdGVtIHN0YXJ0dXAgaXQgaXMgdXNlZCAKLSMgaW4gZmF2b3VyIG9mIHRoZSBvc2dpLnNwbGFzaFBhdGggc2VhcmNoaW5nIG91dGxpbmVkIGFib3ZlLiAgSWYgdGhlIHZhbHVlIGlzIG5vdCBzZXQgCi0jIHRoZSBzZWFyY2hpbmcgaXMgZG9uZSBhbmQgdGhpcyBrZXkgaXMgYm91bmQgdG8gdGhlIHJlc3VsdCBvZiB0aGUgc2VhcmNoLgotI29zZ2kuc3BsYXNoTG9jYXRpb24gPQotCi0jIFRoZSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBidW5kbGVzIHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGluc3RhbGxlZCBhbmQgb3B0aW9uYWxseSBzdGFydGVkCi0jIG9uY2UgdGhlIHN5c3RlbSBpcyB1cCBhbmQgcnVubmluZy4gIEVhY2ggZW50cnkgaWYgb2YgdGhlIGZvcm0KLSMgICAgIDxVUkwgfCBzaW1wbGUgYnVuZGxlIGxvY2F0aW9uPltAIFs8c3RhcnRsZXZlbD5dIFsiOnN0YXJ0Il1dCi0jIElmIHRoZSBzdGFydGxldmVsIGlzIG9taXR0ZWQgdGhlbiB0aGUgZnJhbWV3b3JrIHdpbGwgdXNlIHRoZSBkZWZhdWx0IHN0YXJ0IGxldmVsIGZvciB0aGUgYnVuZGxlLgotIyBJZiB0aGUgInN0YXJ0IiB0YWcgaXMgYWRkZWQgdGhlbiB0aGUgYnVuZGxlIHdpbGwgYmUgbWFya2VkIGFzIHN0YXJ0ZWQgYWZ0ZXIgYmVpbmcgaW5zdGFsbGVkLgotIyBTaW1wbGUgYnVuZGxlIGxvY2F0aW9ucyBhcmUgaW50ZXJlcHJldGVkIGFzIHJlbGF0aXZlIHRvIHRoZSBmcmFtZXdvcmsncyBwYXJlbnQgZGlyZWN0b3J5LgotIyBUaGUgc3RhcnRsZXZlbCBpbmRpY2F0ZXMgdGhlIE9TR2kgc3RhcnQgbGV2ZWwgYXQgd2hpY2ggdGhlIGJ1bmRsZSBzaG91bGQgcnVuLgotIyBJZiB0aGlzIHZhbHVlIGlzIG5vdCBzZXQsIHRoZSBzeXN0ZW0gY29tcHV0ZXMgYW4gYXBwcm9wcmlhdGUgZGVmYXVsdC4KLW9zZ2kuYnVuZGxlcz1vcmcuZWNsaXBzZS5lcXVpbm94Lm9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uQDI6c3RhcnQsIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwQDM6c3RhcnQsIG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zQDQ6c3RhcnQKLQotIyBUaGUgcHJvZHVjdCB0byBydW4uICBBIGdpdmVuIEVjbGlwc2UgY29uZmlndXJhdGlvbiBtYXkgY29udGFpbiBtYW55IHByb2R1Y3RzLgotIyBUaGUgcHJvZHVjdCBpZGVudGlmaWVkIHdpbGwgc3VwcGx5IHRoZSBicmFuZGluZyAod2luZG93IGljb25zLCB0aXRsZSBiYXIgdGV4dCkgZXRjIAotIyBhcyB3ZWxsIGFzIGRlZmluZSB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiB0byBydW4uICAKLWVjbGlwc2UuYXBwbGljYXRpb249b3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmFwcGxpY2F0aW9uCi0KLW9yZy5lY2xpcHNlLnVwZGF0ZS5yZWNvbmNpbGU9ZmFsc2UKLQotIyBFbmQgb2YgZmlsZSBtYXJrZXIgLSBtdXN0IGJlIGhlcmUKLWVvZj1lb2YKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2RhZTAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBEcm9waW4gUmVjb25jaWxlciBQbHVnLWluCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNWNlMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4yIj8+Ci08cGx1Z2luPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMucHJvZHVjdCIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJvZHVjdHMiPgotICAgICAgPHByb2R1Y3QKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuYXBwbGljYXRpb24iCi0gICAgICAgICAgICBuYW1lPSJwMiByZWNvbmNpbGlhdGlvbiBwcm9kdWN0Ij4KLSAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgbmFtZT0iYXBwTmFtZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSJwMiByZWNvbmNpbGlhdGlvbiBwcm9kdWN0Ij4KLSAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICA8L3Byb2R1Y3Q+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuYXBwbGljYXRpb24iCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFwcGxpY2F0aW9ucyI+Ci0gICAgICA8YXBwbGljYXRpb24KLSAgICAgICAgICAgIGNhcmRpbmFsaXR5PSJzaW5nbGV0b24tZ2xvYmFsIgotICAgICAgICAgICAgdGhyZWFkPSJtYWluIgotICAgICAgICAgICAgdmlzaWJsZT0idHJ1ZSI+Ci0gICAgICAgICA8cnVuCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMuQXBwbGljYXRpb24iPgotICAgICAgICAgPC9ydW4+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0icHJvZHVjdCIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJvZHVjdHMiPgotICAgICAgPHByb2R1Y3QKLSAgICAgICAgICAgIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuYXBwbGljYXRpb24iCi0gICAgICAgICAgICBuYW1lPSJwMiByZWNvbmNpbGlhdGlvbiBhcHBsaWNhdGlvbiI+Ci0gICAgICAgICA8cHJvcGVydHkKLSAgICAgICAgICAgICAgIG5hbWU9ImFwcE5hbWUiCi0gICAgICAgICAgICAgICB2YWx1ZT0icDIgcmVjb25jaWxpYXRpb24gYXBwbGljYXRpb24iPgotICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgIDwvcHJvZHVjdD4KLSAgIDwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvQWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMmM3ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBpZGVhcyAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuRGlyZWN0b3J5V2F0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLlBhY2thZ2VBZG1pbjsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUElOU19ESVJFQ1RPUlkgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMuZGlyZWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QSU5TID0gImRyb3BpbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktTID0gImxpbmtzIjsgLy8kTk9OLU5MUy0xJAotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX0VYVEVOU0lPTiA9ICJwcm9maWxlLmV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBQYWNrYWdlQWRtaW4gcGFja2FnZUFkbWluOwotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsKLQlwcml2YXRlIFNlcnZpY2VSZWZlcmVuY2UgcGFja2FnZUFkbWluUmVmOwotCXByaXZhdGUgTGlzdCB3YXRjaGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGRyb3BpblJlcG9zaXRvcmllczsKLQlwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uIGNvbmZpZ3VyYXRpb25SZXBvc2l0b3JpZXM7Ci0JcHJpdmF0ZSBzdGF0aWMgSU1ldGFkYXRhUmVwb3NpdG9yeVtdIGxpbmtzUmVwb3NpdG9yaWVzOwotCXByaXZhdGUgc3RhdGljIElNZXRhZGF0YVJlcG9zaXRvcnkgZWNsaXBzZVByb2R1Y3RSZXBvc2l0b3J5OwotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBsb2FkIGEgbWV0YWRhdGEgcmVwb3NpdG9yeSBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMLiBJZiBub25lCi0JICogZXhpc3RzIHRoZW4gY3JlYXRlIG9uZSBpZiByZXF1ZXN0ZWQuIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNZXRhZGF0YVJlcG9zaXRvcnkgZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBNYXAgcHJvcGVydGllcywgYm9vbGVhbiBjcmVhdGUpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShjb250ZXh0LCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBub3QgcmVnaXN0ZXJlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmV0dXJuIG1hbmFnZXIubG9hZFJlcG9zaXRvcnkobG9jYXRpb24sIG51bGwpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJaWYgKGNyZWF0ZSkgewotCQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IG1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShsb2NhdGlvbiwgbmFtZSwgdHlwZSwgcHJvcGVydGllcyk7Ci0JCQkJbWFuYWdlci5hZGRSZXBvc2l0b3J5KGxvY2F0aW9uKTsKLQkJCQlyZXR1cm4gcmVwb3NpdG9yeTsKLQkJCX0KLQkJCS8vIGlmIHdlIGRpZG4ndCB3YW50IHRvIGNyZWF0ZSBpbiB0aGUgZmFpbHVyZSBjYXNlIHRoZW4gcmV0dXJuIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlCi0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCB0byBsb2FkIGFuIGFydGlmYWN0IHJlcG9zaXRvcnkgZnJvbSB0aGUgZ2l2ZW4gVVJMLiBJZiBub25lCi0JICogZXhpc3RzIHRoZW4gd2Ugd2lsbCBjcmVhdGUgb25lIGF0IHRoZSBnaXZlbiBsb2NhdGlvbiwgaWYgc3BlY2lmaWVkIHRvIGRvIHNvLgotCSAqIFRoaXMgbWV0aG9kIG5ldmVyIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKiBAdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElBcnRpZmFjdFJlcG9zaXRvcnkgZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KFVSTCBsb2NhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBNYXAgcHJvcGVydGllcywgYm9vbGVhbiBjcmVhdGUpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShjb250ZXh0LCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBub3QgcmVnaXN0ZXJlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmV0dXJuIG1hbmFnZXIubG9hZFJlcG9zaXRvcnkobG9jYXRpb24sIG51bGwpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJaWYgKGNyZWF0ZSkgewotCQkJCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IG1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShsb2NhdGlvbiwgbmFtZSwgdHlwZSwgcHJvcGVydGllcyk7Ci0JCQkJbWFuYWdlci5hZGRSZXBvc2l0b3J5KGxvY2F0aW9uKTsKLQkJCQlyZXR1cm4gcmVwb3NpdG9yeTsKLQkJCX0KLQkJCS8vIGlmIHdlIGRpZG4ndCB3YW50IHRvIGNyZWF0ZSBpbiB0aGUgZmFpbHVyZSBjYXNlIHRoZW4gcmV0dXJuIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlCi0JCQl0aHJvdyBlOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwYWNrYWdlQWRtaW5SZWYgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoUGFja2FnZUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXNldFBhY2thZ2VBZG1pbigoUGFja2FnZUFkbWluKSBjb250ZXh0LmdldFNlcnZpY2UocGFja2FnZUFkbWluUmVmKSk7Ci0JCWJ1bmRsZUNvbnRleHQgPSBjb250ZXh0OwotCi0JCWlmICghc3RhcnRFYXJseSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCWlmICghc3RhcnRFYXJseSgib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQlpZiAoIXN0YXJ0RWFybHkoIm9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBnZXRDdXJyZW50UHJvZmlsZShjb250ZXh0KTsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBUT0RPIGktYnVpbGQgdG8gaS1idWlsZCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjb2RlIHRvIHJlbW92ZSB0aGUKLQkJLy8gb2xkIC5wb29sZWQgcmVwb3NpdG9yaWVzLiBSZW1vdmUgdGhpcyBjYWxsIHNvb24uCi0JCXJlbW92ZU9sZFJlcG9zKCk7Ci0JCS8vIGNyZWF0ZSB0aGUgd2F0Y2hlciBmb3IgdGhlICJkcm9wLWlucyIgZm9sZGVyCi0JCXdhdGNoRHJvcGlucyhwcm9maWxlKTsKLQkJLy8ga2VlcCBhbiBleWUgb24gdGhlIHBsYXRmb3JtLnhtbAotCQl3YXRjaENvbmZpZ3VyYXRpb24oKTsKLQotCQlzeW5jaHJvbml6ZShudWxsKTsKLQotCQkvLyB3ZSBzaG91bGQgcHJvYmFibHkgYmUgaG9sZGluZyBvbiB0byB0aGVzZSByZXBvcyBieSBVUkwKLQkJLy8gc2VlIEJ1ZyAyMjM0MjIKLQkJLy8gZm9yIG5vdyBleHBsaWNpdGx5IG51bGxpbmcgb3V0IHRoZXNlIHJlcG9zIHRvIGFsbG93IEdDIHRvIG9jY3VyCi0JCWRyb3BpblJlcG9zaXRvcmllcyA9IG51bGw7Ci0JCWNvbmZpZ3VyYXRpb25SZXBvc2l0b3JpZXMgPSBudWxsOwotCQlsaW5rc1JlcG9zaXRvcmllcyA9IG51bGw7Ci0JCWVjbGlwc2VQcm9kdWN0UmVwb3NpdG9yeSA9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBUT0RPIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNvZGUgdG8gcmVtb3ZlIHRoZQotCSAqIG9sZCAucG9vbGVkIHJlcG9zaXRvcmllcyBmcm9tIHRoZSBzYXZlZCBsaXN0LiBSZW1vdmUKLQkgKiB0aGlzIG1ldGhvZCBzb29uLgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVPbGRSZXBvcygpIHsKLQkJVVJMIG9zZ2lJbnN0YWxsQXJlYSA9IGdldE9TR2lJbnN0YWxsQXJlYSgpOwotCQlpZiAob3NnaUluc3RhbGxBcmVhID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVVSTCBsb2NhdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlsb2NhdGlvbiA9IG5ldyBVUkwoZ2V0T1NHaUluc3RhbGxBcmVhKCksICIucG9vbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBJRCwgIkVycm9yIG9jY3VycmVkIHdoaWxlIHJlbW92aW5nIG9sZCByZXBvc2l0b3JpZXMuIiwgZSkpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQkJQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBhcnRpZmFjdE1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShjb250ZXh0LCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAoYXJ0aWZhY3RNYW5hZ2VyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG5vdCByZWdpc3RlcmVkLiIpOyAvLyROT04tTkxTLTEkCi0JCWFydGlmYWN0TWFuYWdlci5yZW1vdmVSZXBvc2l0b3J5KGxvY2F0aW9uKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWV0YWRhdGFNYW5hZ2VyID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoY29udGV4dCwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKG1ldGFkYXRhTWFuYWdlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBub3QgcmVnaXN0ZXJlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQltZXRhZGF0YU1hbmFnZXIucmVtb3ZlUmVwb3NpdG9yeShsb2NhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHN0YXJ0RWFybHkoU3RyaW5nIGJ1bmRsZU5hbWUpIHRocm93cyBCdW5kbGVFeGNlcHRpb24gewotCQlCdW5kbGUgYnVuZGxlID0gZ2V0QnVuZGxlKGJ1bmRsZU5hbWUpOwotCQlpZiAoYnVuZGxlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWJ1bmRsZS5zdGFydChCdW5kbGUuU1RBUlRfVFJBTlNJRU5UKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBTeW5jaHJvbml6ZSB0aGUgcHJvZmlsZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHN5bmNocm9uaXplKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJUHJvZmlsZSBwcm9maWxlID0gZ2V0Q3VycmVudFByb2ZpbGUoYnVuZGxlQ29udGV4dCk7Ci0JCWlmIChwcm9maWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIGNyZWF0ZSB0aGUgcHJvZmlsZSBzeW5jaHJvbml6ZXIgb24gYWxsIGF2YWlsYWJsZSByZXBvc2l0b3JpZXMKLQkJU2V0IHJlcG9zaXRvcmllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCWlmIChkcm9waW5SZXBvc2l0b3JpZXMgIT0gbnVsbCkKLQkJCXJlcG9zaXRvcmllcy5hZGRBbGwoZHJvcGluUmVwb3NpdG9yaWVzKTsKLQotCQlpZiAoY29uZmlndXJhdGlvblJlcG9zaXRvcmllcyAhPSBudWxsKQotCQkJcmVwb3NpdG9yaWVzLmFkZEFsbChjb25maWd1cmF0aW9uUmVwb3NpdG9yaWVzKTsKLQotCQlpZiAobGlua3NSZXBvc2l0b3JpZXMgIT0gbnVsbCkKLQkJCXJlcG9zaXRvcmllcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChsaW5rc1JlcG9zaXRvcmllcykpOwotCi0JCWlmIChlY2xpcHNlUHJvZHVjdFJlcG9zaXRvcnkgIT0gbnVsbCkKLQkJCXJlcG9zaXRvcmllcy5hZGQoZWNsaXBzZVByb2R1Y3RSZXBvc2l0b3J5KTsKLQotCQlQcm9maWxlU3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IG5ldyBQcm9maWxlU3luY2hyb25pemVyKHByb2ZpbGUsIHJlcG9zaXRvcmllcyk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gc3luY2hyb25pemVyLnN5bmNocm9uaXplKG1vbml0b3IpOwotCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQlMb2dIZWxwZXIubG9nKHJlc3VsdCk7Ci0KLQl9Ci0KLQkvKgotCSAqIFdhdGNoIHRoZSBwbGF0Zm9ybS54bWwgZmlsZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgd2F0Y2hDb25maWd1cmF0aW9uKCkgewotCQlGaWxlIGNvbmZpZ0ZpbGUgPSBnZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKTsKLQkJaWYgKGNvbmZpZ0ZpbGUgPT0gbnVsbCkgewotCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIElELCAiVW5hYmxlIHRvIGRldGVybWluZSBjb25maWd1cmF0aW9uIGxvY2F0aW9uLiIpKTsKLQkJCXJldHVybjsKLQkJfQotCQljb25maWdGaWxlID0gbmV3IEZpbGUoY29uZmlnRmlsZSwgIm9yZy5lY2xpcHNlLnVwZGF0ZS9wbGF0Zm9ybS54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQlEaXJlY3RvcnlXYXRjaGVyIHdhdGNoZXIgPSBuZXcgRGlyZWN0b3J5V2F0Y2hlcihjb25maWdGaWxlLmdldFBhcmVudEZpbGUoKSk7Ci0JCVBsYXRmb3JtWG1sTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgUGxhdGZvcm1YbWxMaXN0ZW5lcihjb25maWdGaWxlKTsKLQkJd2F0Y2hlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXdhdGNoZXIucG9sbCgpOwotCQljb25maWd1cmF0aW9uUmVwb3NpdG9yaWVzID0gbGlzdGVuZXIuZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoKTsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSBhIG5ldyBkaXJlY3Rvcnkgd2F0Y2hlciB3aXRoIGEgcmVwb3NpdG9yeSBsaXN0ZW5lciBvbiB0aGUgZHJvcC1pbnMgZm9sZGVyLiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgd2F0Y2hEcm9waW5zKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJTGlzdCBkaXJlY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJRmlsZSBkcm9waW5zRGlyZWN0b3J5ID0gZ2V0RHJvcGluc0RpcmVjdG9yeSgpOwotCQlpZiAoZHJvcGluc0RpcmVjdG9yeSAhPSBudWxsKQotCQkJZGlyZWN0b3JpZXMuYWRkKGRyb3BpbnNEaXJlY3RvcnkpOwotCQlGaWxlIGxpbmtzRGlyZWN0b3J5ID0gZ2V0TGlua3NEaXJlY3RvcnkoKTsKLQkJaWYgKGxpbmtzRGlyZWN0b3J5ICE9IG51bGwpCi0JCQlkaXJlY3Rvcmllcy5hZGQobGlua3NEaXJlY3RvcnkpOwotCQlpZiAoZGlyZWN0b3JpZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCi0JCURyb3BpbnNSZXBvc2l0b3J5TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRHJvcGluc1JlcG9zaXRvcnlMaXN0ZW5lcihBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBkcm9waW5zRGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpKTsKLQkJRGlyZWN0b3J5V2F0Y2hlciB3YXRjaGVyID0gbmV3IERpcmVjdG9yeVdhdGNoZXIoKEZpbGVbXSkgZGlyZWN0b3JpZXMudG9BcnJheShuZXcgRmlsZVtkaXJlY3Rvcmllcy5zaXplKCldKSk7Ci0JCXdhdGNoZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQl3YXRjaGVyLnBvbGwoKTsKLQotCQlkcm9waW5SZXBvc2l0b3JpZXMgPSBsaXN0ZW5lci5nZXRNZXRhZGF0YVJlcG9zaXRvcmllcygpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHdhdGNoZXJzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRGlyZWN0b3J5V2F0Y2hlciB3YXRjaGVyID0gKERpcmVjdG9yeVdhdGNoZXIpIGl0ZXIubmV4dCgpOwotCQkJd2F0Y2hlci5zdG9wKCk7Ci0JCX0KLQkJYnVuZGxlQ29udGV4dCA9IG51bGw7Ci0JCXNldFBhY2thZ2VBZG1pbihudWxsKTsKLQkJY29udGV4dC51bmdldFNlcnZpY2UocGFja2FnZUFkbWluUmVmKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgYnVuZGxlIGNvbnRleHQgZm9yIHRoaXMgYnVuZGxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gYnVuZGxlQ29udGV4dDsKLQl9Ci0KLQkvKgotCSAqIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBjb25maWd1cmF0aW9uIGxvY2F0aW9uLiBSZXR1cm4gbnVsbCBpZgotCSAqIGl0IGlzIHVuYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRDb25maWd1cmF0aW9uTG9jYXRpb24oKSB7Ci0JCUxvY2F0aW9uIGNvbmZpZ3VyYXRpb25Mb2NhdGlvbiA9IChMb2NhdGlvbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKGdldENvbnRleHQoKSwgTG9jYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBMb2NhdGlvbi5DT05GSUdVUkFUSU9OX0ZJTFRFUik7Ci0JCWlmIChjb25maWd1cmF0aW9uTG9jYXRpb24gPT0gbnVsbCB8fCAhY29uZmlndXJhdGlvbkxvY2F0aW9uLmlzU2V0KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVVJMIHVybCA9IGNvbmZpZ3VyYXRpb25Mb2NhdGlvbi5nZXRVUkwoKTsKLQkJaWYgKHVybCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBVUkxVdGlsLnRvRmlsZSh1cmwpOwotCX0KLQotCS8qCi0JICogRG8gYSBsb29rLXVwIGFuZCByZXR1cm4gdGhlIE9TR2kgaW5zdGFsbCBhcmVhIGlmIGl0IGlzIHNldC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRPU0dpSW5zdGFsbEFyZWEoKSB7Ci0JCUxvY2F0aW9uIGxvY2F0aW9uID0gKExvY2F0aW9uKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgTG9jYXRpb24uY2xhc3MuZ2V0TmFtZSgpLCBMb2NhdGlvbi5JTlNUQUxMX0ZJTFRFUik7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghbG9jYXRpb24uaXNTZXQoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbG9jYXRpb24uZ2V0VVJMKCk7Ci0JfQotCi0JLyoKLQkgKiBIZWxwZXIgbWV0aG9kIHRvIHJldHVybiB0aGUgZWNsaXBzZS5ob21lIGxvY2F0aW9uLiBSZXR1cm4KLQkgKiBudWxsIGlmIGl0IGlzIHVuYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRFY2xpcHNlSG9tZSgpIHsKLQkJTG9jYXRpb24gZWNsaXBzZUhvbWUgPSAoTG9jYXRpb24pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShnZXRDb250ZXh0KCksIExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSwgTG9jYXRpb24uRUNMSVBTRV9IT01FX0ZJTFRFUik7Ci0JCWlmIChlY2xpcHNlSG9tZSA9PSBudWxsIHx8ICFlY2xpcHNlSG9tZS5pc1NldCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCVVSTCB1cmwgPSBlY2xpcHNlSG9tZS5nZXRVUkwoKTsKLQkJaWYgKHVybCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBVUkxVdGlsLnRvRmlsZSh1cmwpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGlua3MgZGlyZWN0b3J5LCBvciBudWxsIGlmIGl0IGlzIG5vdCBhdmFpbGFibGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRMaW5rc0RpcmVjdG9yeSgpIHsKLQkJRmlsZSByb290ID0gZ2V0RWNsaXBzZUhvbWUoKTsKLQkJcmV0dXJuIHJvb3QgPT0gbnVsbCA/IG51bGwgOiBuZXcgRmlsZShyb290LCBMSU5LUyk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIHRoZSBkcm9waW5zIGRpcmVjdG9yeSwgb3IgbnVsbCBpZiBpdCBpcyBub3QgYXZhaWxhYmxlLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEZpbGUgZ2V0RHJvcGluc0RpcmVjdG9yeSgpIHsKLQkJU3RyaW5nIHdhdGNoZWREaXJlY3RvcnlQcm9wZXJ0eSA9IGJ1bmRsZUNvbnRleHQuZ2V0UHJvcGVydHkoRFJPUElOU19ESVJFQ1RPUlkpOwotCQlpZiAod2F0Y2hlZERpcmVjdG9yeVByb3BlcnR5ICE9IG51bGwpCi0JCQlyZXR1cm4gbmV3IEZpbGUod2F0Y2hlZERpcmVjdG9yeVByb3BlcnR5KTsKLQkJRmlsZSByb290ID0gZ2V0RWNsaXBzZUhvbWUoKTsKLQkJcmV0dXJuIHJvb3QgPT0gbnVsbCA/IG51bGwgOiBuZXcgRmlsZShyb290LCBEUk9QSU5TKTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgY3VycmVudCBwcm9maWxlIG9yIG51bGwgaWYgaXQgY2Fubm90IGJlIHJldHJpZXZlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElQcm9maWxlIGdldEN1cnJlbnRQcm9maWxlKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJUHJvZmlsZVJlZ2lzdHJ5IHByb2ZpbGVSZWdpc3RyeSA9IChJUHJvZmlsZVJlZ2lzdHJ5KSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJdHJ5IHsKLQkJCXJldHVybiBwcm9maWxlUmVnaXN0cnkuZ2V0UHJvZmlsZShJUHJvZmlsZVJlZ2lzdHJ5LlNFTEYpOwotCQl9IGZpbmFsbHkgewotCQkJY29udGV4dC51bmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNldFBhY2thZ2VBZG1pbihQYWNrYWdlQWRtaW4gc2VydmljZSkgewotCQlwYWNrYWdlQWRtaW4gPSBzZXJ2aWNlOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBidW5kbGUgd2l0aCB0aGUgZ2l2ZW4gc3ltYm9saWMgbmFtZSwgb3IgbnVsbCBpZiBpdCBjYW5ub3QgYmUgZm91bmQuCi0JICovCi0Jc3RhdGljIHN5bmNocm9uaXplZCBCdW5kbGUgZ2V0QnVuZGxlKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJaWYgKHBhY2thZ2VBZG1pbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUJ1bmRsZVtdIGJ1bmRsZXMgPSBwYWNrYWdlQWRtaW4uZ2V0QnVuZGxlcyhzeW1ib2xpY05hbWUsIG51bGwpOwotCQlpZiAoYnVuZGxlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vUmV0dXJuIHRoZSBmaXJzdCBidW5kbGUgdGhhdCBpcyBub3QgaW5zdGFsbGVkIG9yIHVuaW5zdGFsbGVkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKChidW5kbGVzW2ldLmdldFN0YXRlKCkgJiAoQnVuZGxlLklOU1RBTExFRCB8IEJ1bmRsZS5VTklOU1RBTExFRCkpID09IDApIHsKLQkJCQlyZXR1cm4gYnVuZGxlc1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9BcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL0FwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYWI2MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL0FwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbiB7Ci0KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0JCS8vTm90aGluZyB0byBkbwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL0Ryb3BpbnNSZXBvc2l0b3J5TGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9Ecm9waW5zUmVwb3NpdG9yeUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNmY1MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL0Ryb3BpbnNSZXBvc2l0b3J5TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlY29uY2lsZXIuZHJvcGluczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZXh0ZW5zaW9ubG9jYXRpb24uRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5leHRlbnNpb25sb2NhdGlvbi5FeHRlbnNpb25Mb2NhdGlvbk1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuUmVwb3NpdG9yeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIERyb3BpbnNSZXBvc2l0b3J5TGlzdGVuZXIgZXh0ZW5kcyBSZXBvc2l0b3J5TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpBUiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5LID0gIi5saW5rIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaSVAgPSAiLnppcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElOS1NfUEFUSCA9ICJwYXRoIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBEUk9QSU5fQVJUSUZBQ1RfUkVQT1NJVE9SSUVTID0gImRyb3Bpbi5hcnRpZmFjdFJlcG9zaXRvcmllcyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJPUElOX01FVEFEQVRBX1JFUE9TSVRPUklFUyA9ICJkcm9waW4ubWV0YWRhdGFSZXBvc2l0b3JpZXMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJUEUgPSAifCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIExpc3QgbWV0YWRhdGFSZXBvc2l0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IGFydGlmYWN0UmVwb3NpdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIERyb3BpbnNSZXBvc2l0b3J5TGlzdGVuZXIoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgcmVwb3NpdG9yeU5hbWUpIHsKLQkJc3VwZXIoY29udGV4dCwgcmVwb3NpdG9yeU5hbWUsIG51bGwsIHRydWUpOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzSW50ZXJlc3RlZChGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCVN0cmluZyBuYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCXJldHVybiBuYW1lLmVuZHNXaXRoKEpBUikgfHwgbmFtZS5lbmRzV2l0aChaSVApIHx8IG5hbWUuZW5kc1dpdGgoTElOSyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkZWQoRmlsZSBmaWxlKSB7Ci0JCWlmIChzdXBlci5hZGRlZChmaWxlKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCVVSTCByZXBvc2l0b3J5VVJMID0gY3JlYXRlUmVwb3NpdG9yeVVSTChmaWxlKTsKLQkJaWYgKHJlcG9zaXRvcnlVUkwgIT0gbnVsbCkgewotCQkJZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KHJlcG9zaXRvcnlVUkwpOwotCQkJZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KHJlcG9zaXRvcnlVUkwpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNoYW5nZWQoRmlsZSBmaWxlKSB7Ci0JCWlmIChzdXBlci5jaGFuZ2VkKGZpbGUpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJVVJMIHJlcG9zaXRvcnlVUkwgPSBjcmVhdGVSZXBvc2l0b3J5VVJMKGZpbGUpOwotCQlpZiAocmVwb3NpdG9yeVVSTCAhPSBudWxsKSB7Ci0JCQlnZXRNZXRhZGF0YVJlcG9zaXRvcnkocmVwb3NpdG9yeVVSTCk7Ci0JCQlnZXRBcnRpZmFjdFJlcG9zaXRvcnkocmVwb3NpdG9yeVVSTCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGlua1BhdGgoRmlsZSBmaWxlKSB7Ci0JCVByb3BlcnRpZXMgbGlua3MgPSBuZXcgUHJvcGVydGllcygpOwotCQl0cnkgewotCQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKTsKLQkJCXRyeSB7Ci0JCQkJbGlua3MubG9hZChpbnB1dCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZQotCQl9Ci0JCVN0cmluZyBwYXRoID0gbGlua3MuZ2V0UHJvcGVydHkoTElOS1NfUEFUSCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCS8vIGxvZwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBwYXJzZSBvdXQgbGluayBpbmZvcm1hdGlvbgotCQlpZiAocGF0aC5zdGFydHNXaXRoKCJyICIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygyKS50cmltKCk7Ci0JCX0gZWxzZSBpZiAocGF0aC5zdGFydHNXaXRoKCJydyAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMykudHJpbSgpOwotCQl9IGVsc2UgewotCQkJcGF0aCA9IHBhdGgudHJpbSgpOwotCQl9Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCXByaXZhdGUgVVJMIGNyZWF0ZVJlcG9zaXRvcnlVUkwoRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoTElOSykpIHsKLQkJCQlGaWxlIGxpbmtGaWxlID0gZmlsZTsKLQkJCQlTdHJpbmcgcGF0aCA9IGdldExpbmtQYXRoKGxpbmtGaWxlKTsKLQkJCQlpZiAocGF0aCA9PSBudWxsKSB7Ci0JCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJVbmFibGUgdG8gZGV0ZXJtaW5lIGxpbmsgbG9jYXRpb24gZnJvbSBmaWxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCQlmaWxlID0gbmV3IEZpbGUocGF0aCk7Ci0JCQkJaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkgewotCQkJCQkvLyBsaW5rIHN1cHBvcnQgaXMgcmVsYXRpdmUgdG8gdGhlIGluc3RhbGwgcm9vdAotCQkJCQlGaWxlIHJvb3QgPSBBY3RpdmF0b3IuZ2V0RWNsaXBzZUhvbWUoKTsKLQkJCQkJaWYgKHJvb3QgIT0gbnVsbCkKLQkJCQkJCWZpbGUgPSBuZXcgRmlsZShyb290LCBwYXRoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUZpbGUgY2Fub25pY2FsRmlsZSA9IGZpbGUuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCQkJVVJMIHJlcG9zaXRvcnlVUkwgPSBjYW5vbmljYWxGaWxlLnRvVVJMKCk7Ci0JCQlpZiAoY2Fub25pY2FsRmlsZS5nZXROYW1lKCkuZW5kc1dpdGgoWklQKSB8fCBjYW5vbmljYWxGaWxlLmdldE5hbWUoKS5lbmRzV2l0aChKQVIpKSB7Ci0JCQkJcmVwb3NpdG9yeVVSTCA9IG5ldyBVUkwoImphcjoiICsgcmVwb3NpdG9yeVVSTC50b1N0cmluZygpICsgIiEvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmV0dXJuIHJlcG9zaXRvcnlVUkw7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJFcnJvciBvY2N1cnJlZCB3aGlsZSBidWlsZGluZyByZXBvc2l0b3J5IGxvY2F0aW9uLiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGdldE1ldGFkYXRhUmVwb3NpdG9yeShVUkwgcmVwb1VSTCkgewotCQl0cnkgewotCQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJcHJvcGVydGllcy5wdXQoSVJlcG9zaXRvcnkuUFJPUF9TWVNURU0sIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJCW1ldGFkYXRhUmVwb3NpdG9yaWVzLmFkZChBY3RpdmF0b3IuZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KHJlcG9VUkwsICJkcm9waW5zIG1ldGFkYXRhIHJlcG86ICIgKyByZXBvVVJMLnRvRXh0ZXJuYWxGb3JtKCksIEV4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5LlRZUEUsIHByb3BlcnRpZXMsIHRydWUpKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZXgpIHsKLQkJCUxvZ0hlbHBlci5sb2coZXgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KFVSTCByZXBvVVJMKSB7Ci0JCXRyeSB7Ci0JCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlwcm9wZXJ0aWVzLnB1dChJUmVwb3NpdG9yeS5QUk9QX1NZU1RFTSwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQkJYXJ0aWZhY3RSZXBvc2l0b3JpZXMuYWRkKEFjdGl2YXRvci5nZXRBcnRpZmFjdFJlcG9zaXRvcnkocmVwb1VSTCwgImRyb3BpbnMgYXJ0aWZhY3QgcmVwbzogIiArIHJlcG9VUkwudG9FeHRlcm5hbEZvcm0oKSwgRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnkuVFlQRSwgcHJvcGVydGllcywgdHJ1ZSkpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBleCkgewotCQkJTG9nSGVscGVyLmxvZyhleCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wUG9sbCgpIHsKLQkJc3luY2hyb25pemVEcm9waW5NZXRhZGF0YVJlcG9zaXRvcmllcygpOwotCQlzeW5jaHJvbml6ZURyb3BpbkFydGlmYWN0UmVwb3NpdG9yaWVzKCk7Ci0JCXN1cGVyLnN0b3BQb2xsKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNocm9uaXplRHJvcGluTWV0YWRhdGFSZXBvc2l0b3JpZXMoKSB7Ci0JCUxpc3QgY3VycmVudFJlcG9zaXRvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IG1ldGFkYXRhUmVwb3NpdG9yaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IChJTWV0YWRhdGFSZXBvc2l0b3J5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgdXJsU3RyaW5nID0gcmVwb3NpdG9yeS5nZXRMb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQljdXJyZW50UmVwb3NpdG9yaWVzLmFkZCh1cmxTdHJpbmcpOwotCQl9Ci0JCUxpc3QgcHJldmlvdXNSZXBvc2l0b3JpZXMgPSBnZXRMaXN0UmVwb3NpdG9yeVByb3BlcnR5KGdldE1ldGFkYXRhUmVwb3NpdG9yeSgpLCBEUk9QSU5fTUVUQURBVEFfUkVQT1NJVE9SSUVTKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByZXZpb3VzUmVwb3NpdG9yaWVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyByZXBvc2l0b3J5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCFjdXJyZW50UmVwb3NpdG9yaWVzLmNvbnRhaW5zKHJlcG9zaXRvcnkpKQotCQkJCXJlbW92ZU1ldGFkYXRhUmVwb3NpdG9yeShyZXBvc2l0b3J5KTsKLQkJfQotCQlzZXRMaXN0UmVwb3NpdG9yeVByb3BlcnR5KGdldE1ldGFkYXRhUmVwb3NpdG9yeSgpLCBEUk9QSU5fTUVUQURBVEFfUkVQT1NJVE9SSUVTLCBjdXJyZW50UmVwb3NpdG9yaWVzKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTWV0YWRhdGFSZXBvc2l0b3J5KFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IG51bGw7Ci0JCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkKLQkJCW1hbmFnZXIgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5tZXRhZGF0YV9yZXBvX21hbmFnZXJfbm90X3JlZ2lzdGVyZWQpOwotCi0JCXRyeSB7Ci0JCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkobmV3IFVSTCh1cmxTdHJpbmcpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsICJFcnJvciBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyBVUkwgZnJvbTogIiArIHVybFN0cmluZywgZSkpOyAvLyROT04tTkxTLTEkCi0JCX0gZmluYWxseSB7Ci0JCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN5bmNocm9uaXplRHJvcGluQXJ0aWZhY3RSZXBvc2l0b3JpZXMoKSB7Ci0JCUxpc3QgY3VycmVudFJlcG9zaXRvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGFydGlmYWN0UmVwb3NpdG9yaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5KSBpdC5uZXh0KCk7Ci0JCQlTdHJpbmcgdXJsU3RyaW5nID0gcmVwb3NpdG9yeS5nZXRMb2NhdGlvbigpLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCQljdXJyZW50UmVwb3NpdG9yaWVzLmFkZCh1cmxTdHJpbmcpOwotCQl9Ci0JCUxpc3QgcHJldmlvdXNSZXBvc2l0b3JpZXMgPSBnZXRMaXN0UmVwb3NpdG9yeVByb3BlcnR5KGdldEFydGlmYWN0UmVwb3NpdG9yeSgpLCBEUk9QSU5fQVJUSUZBQ1RfUkVQT1NJVE9SSUVTKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHByZXZpb3VzUmVwb3NpdG9yaWVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyByZXBvc2l0b3J5ID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCFjdXJyZW50UmVwb3NpdG9yaWVzLmNvbnRhaW5zKHJlcG9zaXRvcnkpKQotCQkJCXJlbW92ZUFydGlmYWN0UmVwb3NpdG9yeShyZXBvc2l0b3J5KTsKLQkJfQotCQlzZXRMaXN0UmVwb3NpdG9yeVByb3BlcnR5KGdldEFydGlmYWN0UmVwb3NpdG9yeSgpLCBEUk9QSU5fQVJUSUZBQ1RfUkVQT1NJVE9SSUVTLCBjdXJyZW50UmVwb3NpdG9yaWVzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBcnRpZmFjdFJlcG9zaXRvcnkoU3RyaW5nIHVybFN0cmluZykgewotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gbnVsbDsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKQotCQkJbWFuYWdlciA9IChJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcikgY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmFydGlmYWN0X3JlcG9fbWFuYWdlcl9ub3RfcmVnaXN0ZXJlZCk7Ci0KLQkJdHJ5IHsKLQkJCW1hbmFnZXIucmVtb3ZlUmVwb3NpdG9yeShuZXcgVVJMKHVybFN0cmluZykpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgIkVycm9yIG9jY3VycmVkIHdoaWxlIGNyZWF0aW5nIFVSTCBmcm9tOiAiICsgdXJsU3RyaW5nLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0TGlzdFJlcG9zaXRvcnlQcm9wZXJ0eShJUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcga2V5KSB7Ci0JCUxpc3QgbGlzdFByb3BlcnR5ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmcgZHJvcGluUmVwb3NpdG9yaWVzID0gKFN0cmluZykgcmVwb3NpdG9yeS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KGtleSk7Ci0JCWlmIChkcm9waW5SZXBvc2l0b3JpZXMgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoZHJvcGluUmVwb3NpdG9yaWVzLCBQSVBFKTsKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJbGlzdFByb3BlcnR5LmFkZCh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0UHJvcGVydHk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldExpc3RSZXBvc2l0b3J5UHJvcGVydHkoSVJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIGtleSwgTGlzdCBsaXN0UHJvcGVydHkpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGxpc3RQcm9wZXJ0eS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcmVwb3NpdG9yeVN0cmluZyA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCWJ1ZmZlci5hcHBlbmQocmVwb3NpdG9yeVN0cmluZyk7Ci0JCQlpZiAoaXQuaGFzTmV4dCgpKQotCQkJCWJ1ZmZlci5hcHBlbmQoUElQRSk7Ci0JCX0KLQkJU3RyaW5nIHZhbHVlID0gKGJ1ZmZlci5sZW5ndGgoKSA9PSAwKSA/IG51bGwgOiBidWZmZXIudG9TdHJpbmcoKTsKLQkJcmVwb3NpdG9yeS5zZXRQcm9wZXJ0eShrZXksIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRNZXRhZGF0YVJlcG9zaXRvcmllcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KG1ldGFkYXRhUmVwb3NpdG9yaWVzKTsKLQkJcmVzdWx0LmFkZChnZXRNZXRhZGF0YVJlcG9zaXRvcnkoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjA3NzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZWNvbmNpbGVyLmRyb3BpbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfcmVwb19tYW5hZ2VyX25vdF9yZWdpc3RlcmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yTG9hZGluZ1JlcG9zaXRvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JQcm9jZXNzaW5nQ29uZmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0YWRhdGFfcmVwb19tYW5hZ2VyX25vdF9yZWdpc3RlcmVkOwotCXN0YXRpYyB7Ci0JCS8vIGluaXRpYWxpemUgcmVzb3VyY2UgYnVuZGxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBwcmV2ZW50IGluc3RhbnRpYXRpb24KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvUGxhdGZvcm1YbWxMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL1BsYXRmb3JtWG1sTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhZDRlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvUGxhdGZvcm1YbWxMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZXh0ZW5zaW9ubG9jYXRpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLkRpcmVjdG9yeUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB3YXRjaGVzIGEgcGxhdGZvcm0ueG1sIGZpbGUuIE5vdGUgdGhhdCB3ZSBkb24ndCByZWFsbHkgbmVlZCB0byB1c2UgdGhlIERpcmVjdG9yeUNoYW5nZUxpc3RlbmVyCi0gKiBmcmFtZXdvcmsgc2luY2Ugd2UgYXJlIGRvaW5nIGEgc2luZ2xlIHBvbGwgb24gc3RhcnR1cCwgYnV0IHdlIHdpbGwgbGVhdmUgdGhlIGNvZGUgaGVyZSBpbiBjYXNlIHdlCi0gKiB3YW50IHRvIHdhdGNoIGZvciBjaGFuZ2VzIGR1cmluZyBhIHNlc3Npb24uIE5vdGUgdGhhdCB0aGUgY29kZSB0byBhY3R1YWxseSBzeW5jaHJvbml6ZSB0aGUgcmVwb3NpdG9yaWVzCi0gKiBpcyBvbiB0aGUgQWN0aXZhdG9yIHNvIHdlIHdpbGwgbmVlZCB0byBjYWxsIG91dCB0byB0aGF0IGlmIHRoaXMgYmVoYXZpb3VyIGlzIGNoYW5nZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFBsYXRmb3JtWG1sTGlzdGVuZXIgZXh0ZW5kcyBEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fWE1MID0gInBsYXRmb3JtLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotCXByaXZhdGUgRmlsZSByb290OwotCXByaXZhdGUgbG9uZyBsYXN0TW9kaWZpZWQgPSAtMWw7Ci0JcHJpdmF0ZSBTZXQgY29uZmlnUmVwb3NpdG9yaWVzOwotCi0JcHJpdmF0ZSBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nW10gbGlzdCkgewotCQlpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKGxpc3RbaV0pOwotCQkJaWYgKGxpc3QubGVuZ3RoIDwgaSArIDEpCi0JCQkJYnVmZmVyLmFwcGVuZCgnLCcpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIENvbnN0cnVjdCBhIG5ldyBsaXN0ZW5lciBiYXNlZCBvbiB0aGUgZ2l2ZW4gcGxhdGZvcm0ueG1sIGZpbGUuCi0JICovCi0JcHVibGljIFBsYXRmb3JtWG1sTGlzdGVuZXIoRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmICghUExBVEZPUk1fWE1MLmVxdWFscyhmaWxlLmdldE5hbWUoKSkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCXRoaXMucm9vdCA9IGZpbGU7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLklEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciNhZGRlZChqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gYWRkZWQoRmlsZSBmaWxlKSB7Ci0JCWNoYW5nZWQgPSBjaGFuZ2VkIHx8IFBMQVRGT1JNX1hNTC5lcXVhbHMoZmlsZS5nZXROYW1lKCkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLklEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciNjaGFuZ2VkKGphdmEuaW8uRmlsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjaGFuZ2VkKEZpbGUgZmlsZSkgewotCQljaGFuZ2VkID0gY2hhbmdlZCB8fCBQTEFURk9STV9YTUwuZXF1YWxzKGZpbGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5JRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIjZ2V0U2VlbkZpbGUoamF2YS5pby5GaWxlKQotCSAqLwotCXB1YmxpYyBMb25nIGdldFNlZW5GaWxlKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gbmV3IExvbmcoMCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLkRpcmVjdG9yeUNoYW5nZUxpc3RlbmVyI2lzSW50ZXJlc3RlZChqYXZhLmlvLkZpbGUpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbnRlcmVzdGVkKEZpbGUgZmlsZSkgewotCQlyZXR1cm4gZmlsZS5nZXROYW1lKCkuZXF1YWxzKFBMQVRGT1JNX1hNTCkgJiYgbGFzdE1vZGlmaWVkICE9IGZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLklEaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lciNyZW1vdmVkKGphdmEuaW8uRmlsZSkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVkKEZpbGUgZmlsZSkgewotCQljaGFuZ2VkID0gY2hhbmdlZCB8fCBQTEFURk9STV9YTUwuZXF1YWxzKGZpbGUuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5JRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXIjc3RhcnRQb2xsKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydFBvbGwoKSB7Ci0JCWNoYW5nZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuSURpcmVjdG9yeUNoYW5nZUxpc3RlbmVyI3N0b3BQb2xsKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wUG9sbCgpIHsKLQkJaWYgKGNoYW5nZWQpIHsKLQkJCWxhc3RNb2RpZmllZCA9IHJvb3QubGFzdE1vZGlmaWVkKCk7Ci0JCQl0cnkgewotCQkJCUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb25QYXJzZXIucGFyc2Uocm9vdCwgQWN0aXZhdG9yLmdldE9TR2lJbnN0YWxsQXJlYSgpKTsKLQkJCQlzeW5jaHJvbml6ZUNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE1lc3NhZ2VzLmVycm9yUHJvY2Vzc2luZ0NvbmZnLCBlKSk7Ci0JCQl9Ci0JCX0KLQkJY2hhbmdlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0aW9uIGdldE1ldGFkYXRhUmVwb3NpdG9yaWVzKCkgewotCQlyZXR1cm4gY29uZmlnUmVwb3NpdG9yaWVzOwotCX0KLQotCS8qCi0JICogTG9vayB0aHJvdWdoIHRoZSBnaXZlbiBsaXN0IG9mIHJlcG9zaXRvcmllcyBhbmQgc2VlIGlmIHRoZXJlIGlzIG9uZQotCSAqIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHVybCBzdHJpbmcuIFJldHVybiBudWxsIGlmIG9uZSBjb3VsZCBub3QKLQkgKiBiZSBmb3VuZC4KLQkgKi8KLQlwcml2YXRlIElNZXRhZGF0YVJlcG9zaXRvcnkgZ2V0TWF0Y2hpbmdSZXBvKENvbGxlY3Rpb24gcmVwb3NpdG9yeUxpc3QsIFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJaWYgKHJlcG9zaXRvcnlMaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVBhdGggdXJsUGF0aCA9IG5ldyBQYXRoKHVybFN0cmluZykubWFrZUFic29sdXRlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHJlcG9zaXRvcnlMaXN0Lml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gKElNZXRhZGF0YVJlcG9zaXRvcnkpIGl0ZXIubmV4dCgpOwotCQkJUGF0aCByZXBvUGF0aCA9IG5ldyBQYXRoKHJlcG8uZ2V0TG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCWlmIChyZXBvUGF0aC5tYWtlQWJzb2x1dGUoKS5lcXVhbHModXJsUGF0aCkpCi0JCQkJcmV0dXJuIHJlcG87Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBFbnN1cmUgdGhhdCB3ZSBoYXZlIGEgcmVwb3NpdG9yeSBmb3IgZWFjaCBzaXRlIGluIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN5bmNocm9uaXplQ29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlMaXN0IHNpdGVzID0gY29uZmlnLmdldFNpdGVzKCk7Ci0JCVNldCBuZXdSZXBvcyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHNpdGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU2l0ZSBzaXRlID0gKFNpdGUpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIHNpdGVVUkwgPSBzaXRlLmdldFVybCgpOwotCQkJaWYgKHNpdGVVUkwuc3RhcnRzV2l0aCgiZmlsZToiKSAmJiBzaXRlVVJMLmVuZHNXaXRoKCIvZWNsaXBzZS8iKSkgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQlzaXRlVVJMID0gc2l0ZVVSTC5zdWJzdHJpbmcoMCwgc2l0ZVVSTC5sZW5ndGgoKSAtIDgpOwotCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSBtYXRjaCA9IGdldE1hdGNoaW5nUmVwbyhjb25maWdSZXBvc2l0b3JpZXMsIHNpdGVVUkwpOwotCQkJaWYgKG1hdGNoID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlVUkwgbG9jYXRpb24gPSBuZXcgVVJMKHNpdGVVUkwpOwotCQkJCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkJCXByb3BlcnRpZXMucHV0KFNpdGVMaXN0ZW5lci5TSVRFX1BPTElDWSwgc2l0ZS5nZXRQb2xpY3koKSk7Ci0JCQkJCXByb3BlcnRpZXMucHV0KFNpdGVMaXN0ZW5lci5TSVRFX0xJU1QsIHRvU3RyaW5nKHNpdGUuZ2V0TGlzdCgpKSk7Ci0JCQkJCXByb3BlcnRpZXMucHV0KElSZXBvc2l0b3J5LlBST1BfU1lTVEVNLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCQkJCW5ld1JlcG9zLmFkZChBY3RpdmF0b3IuZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KGxvY2F0aW9uLCAiZXh0ZW5zaW9uIGxvY2F0aW9uIG1ldGFkYXRhIHJlcG9zaXRvcnk6ICIgKyBsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLCBFeHRlbnNpb25Mb2NhdGlvbk1ldGFkYXRhUmVwb3NpdG9yeS5UWVBFLCBwcm9wZXJ0aWVzLCB0cnVlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJQWN0aXZhdG9yLmdldEFydGlmYWN0UmVwb3NpdG9yeShsb2NhdGlvbiwgImV4dGVuc2lvbiBsb2NhdGlvbiBhcnRpZmFjdCByZXBvc2l0b3J5OiAgIiArIGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCksIEV4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5LlRZUEUsIHByb3BlcnRpZXMsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JMb2FkaW5nUmVwb3NpdG9yeSwgc2l0ZVVSTCksIGUpKTsKLQkJCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5lcnJvckxvYWRpbmdSZXBvc2l0b3J5LCBzaXRlVVJMKSwgZSkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbmV3UmVwb3MuYWRkKG1hdGNoKTsKLQkJCX0KLQkJfQotCQljb25maWdSZXBvc2l0b3JpZXMgPSBuZXdSZXBvczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvUHJvZmlsZVN5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVjb25jaWxlci9kcm9waW5zL1Byb2ZpbGVTeW5jaHJvbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyM2I2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvUHJvZmlsZVN5bmNocm9uaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKLSAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sCi0gKiBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGFuZCBpZGVhcyAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVjb25jaWxlci5kcm9waW5zOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5jb25maWd1cmF0b3IuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JRmlsZUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLS8qKgotICogU3luY2hyb25pemVzIGEgcHJvZmlsZSB3aXRoIGEgc2V0IG9mIHJlcG9zaXRvcmllcy4KLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVTeW5jaHJvbml6ZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUSU1FU1RBTVBTX0ZJTEVfUFJFRklYID0gInRpbWVzdGFtcHMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVfVElNRVNUQU1QID0gIlBST0ZJTEUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1RJTUVTVEFNUCA9ICItMSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9GUk9NX0RST1BJTlMgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgY2xhc3MgTGlzdENvbGxlY3RvciBleHRlbmRzIENvbGxlY3RvciB7Ci0JCXB1YmxpYyBMaXN0IGdldExpc3QoKSB7Ci0JCQlyZXR1cm4gc3VwZXIuZ2V0TGlzdCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX0VYVEVOU0lPTlMgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jYWNoZS5leHRlbnNpb25zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSVBFID0gInwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgSVByb2ZpbGUgcHJvZmlsZTsKLQotCWZpbmFsIE1hcCByZXBvc2l0b3J5TWFwOwotCXByaXZhdGUgUHJvcGVydGllcyB0aW1lc3RhbXBzOwotCi0JLyoKLQkgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzLgotCSAqLwotCXB1YmxpYyBQcm9maWxlU3luY2hyb25pemVyKElQcm9maWxlIHByb2ZpbGUsIENvbGxlY3Rpb24gcmVwb3NpdG9yaWVzKSB7Ci0JCXRoaXMucHJvZmlsZSA9IHByb2ZpbGU7Ci0JCXRoaXMucmVwb3NpdG9yeU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZXBvc2l0b3JpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gKElNZXRhZGF0YVJlcG9zaXRvcnkpIGl0Lm5leHQoKTsKLQkJCXJlcG9zaXRvcnlNYXAucHV0KHJlcG9zaXRvcnkuZ2V0TG9jYXRpb24oKS50b0V4dGVybmFsRm9ybSgpLCByZXBvc2l0b3J5KTsKLQkJfQotCX0KLQotCS8qCi0JICogU3luY2hyb25pemUgdGhlIHByb2ZpbGUgd2l0aCB0aGUgbGlzdCBvZiBtZXRhZGF0YSByZXBvc2l0b3JpZXMuCi0JICovCi0JcHVibGljIElTdGF0dXMgc3luY2hyb25pemUoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJlYWRUaW1lc3RhbXBzKCk7Ci0JCWlmIChpc1VwVG9EYXRlKCkpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQlJU3RhdHVzIHN0YXR1cyA9IHN5bmNocm9uaXplQ2FjaGVFeHRlbnNpb25zKCk7Ci0JCWlmICghc3RhdHVzLmlzT0soKSkKLQkJCXJldHVybiBzdGF0dXM7Ci0KLQkJUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gY3JlYXRlUHJvZmlsZUNoYW5nZVJlcXVlc3QoY29udGV4dCk7Ci0KLQkJaWYgKHJlcXVlc3QgPT0gbnVsbCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCi0JCVN1Yk1vbml0b3Igc3ViID0gU3ViTW9uaXRvci5jb252ZXJ0KG1vbml0b3IsIDEwMCk7Ci0JCXRyeSB7Ci0JCQkvL2NyZWF0ZSB0aGUgcHJvdmlzaW9uaW5nIHBsYW4KLQkJCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IGNyZWF0ZVByb3Zpc2lvbmluZ1BsYW4ocmVxdWVzdCwgY29udGV4dCwgc3ViLm5ld0NoaWxkKDUwKSk7Ci0KLQkJCXN0YXR1cyA9IHBsYW4uZ2V0U3RhdHVzKCk7Ci0JCQlpZiAoc3RhdHVzLmdldFNldmVyaXR5KCkgPT0gSVN0YXR1cy5FUlJPUiB8fCBwbGFuLmdldE9wZXJhbmRzKCkubGVuZ3RoID09IDApCi0JCQkJcmV0dXJuIHN0YXR1czsKLQotCQkJLy9pbnZva2UgdGhlIGVuZ2luZSB0byBwZXJmb3JtIGluc3RhbGxzL3VuaW5zdGFsbHMKLQkJCUlTdGF0dXMgZW5naW5lUmVzdWx0ID0gZXhlY3V0ZVBsYW4ocGxhbiwgY29udGV4dCwgc3ViLm5ld0NoaWxkKDUwKSk7Ci0KLQkJCWlmICghZW5naW5lUmVzdWx0LmlzT0soKSkKLQkJCQlyZXR1cm4gZW5naW5lUmVzdWx0OwotCQkJd3JpdGVUaW1lc3RhbXBzKCk7Ci0KLQkJCWFwcGx5Q29uZmlndXJhdGlvbigpOwotCi0JCQlyZXR1cm4gc3RhdHVzOwotCQl9IGZpbmFsbHkgewotCQkJc3ViLmRvbmUoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZVRpbWVzdGFtcHMoKSB7Ci0JCXRpbWVzdGFtcHMuY2xlYXIoKTsKLQkJdGltZXN0YW1wcy5wdXQoUFJPRklMRV9USU1FU1RBTVAsIExvbmcudG9TdHJpbmcocHJvZmlsZS5nZXRUaW1lc3RhbXAoKSkpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVwb3NpdG9yeU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCU1hcCBwcm9wcyA9IHJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcygpOwotCQkJU3RyaW5nIHRpbWVzdGFtcCA9IG51bGw7Ci0JCQlpZiAocHJvcHMgIT0gbnVsbCkKLQkJCQl0aW1lc3RhbXAgPSAoU3RyaW5nKSBwcm9wcy5nZXQoSVJlcG9zaXRvcnkuUFJPUF9USU1FU1RBTVApOwotCi0JCQlpZiAodGltZXN0YW1wID09IG51bGwpCi0JCQkJdGltZXN0YW1wID0gTk9fVElNRVNUQU1QOwotCi0JCQl0aW1lc3RhbXBzLnB1dChlbnRyeS5nZXRLZXkoKSwgdGltZXN0YW1wKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlGaWxlIGZpbGUgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldERhdGFGaWxlKFRJTUVTVEFNUFNfRklMRV9QUkVGSVggKyBwcm9maWxlLmdldFByb2ZpbGVJZCgpLmhhc2hDb2RlKCkpOwotCQkJT3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpKTsKLQkJCXRyeSB7Ci0JCQkJdGltZXN0YW1wcy5zYXZlKG9zLCAiVGltZXN0YW1wcyBmb3IgIiArIHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGZpbmFsbHkgewotCQkJCWlmIChvcyAhPSBudWxsKQotCQkJCQlvcy5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1VwVG9EYXRlKCkgewotCQkvL0JhY2t3YXJkIGNvbXBhdGliaWxpdHkgdG8gYmUgcmVtb3ZlZCBwb3N0IE03Ci0JCWlmIChwcm9maWxlLnF1ZXJ5KG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kcm9waW5zIiksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuc2l6ZSgpID4gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJLy9FbmQgb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB0byBiZSByZW1vdmVkIHBvc3QgTTcKLQkJU3RyaW5nIGxhc3RLbm93blByb2ZpbGVUaW1lU3RhbXAgPSAoU3RyaW5nKSB0aW1lc3RhbXBzLnJlbW92ZShQUk9GSUxFX1RJTUVTVEFNUCk7Ci0JCWlmIChsYXN0S25vd25Qcm9maWxlVGltZVN0YW1wID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghbGFzdEtub3duUHJvZmlsZVRpbWVTdGFtcC5lcXVhbHMoTG9uZy50b1N0cmluZyhwcm9maWxlLmdldFRpbWVzdGFtcCgpKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy9XaGVuIHdlIGdldCBoZXJlIHRoZSB0aW1lc3RhbXBzIG1hcCBvbmx5IGNvbnRhaW5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gcmVwb3MKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJlcG9zaXRvcnlNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlFbnRyeSBlbnRyeSA9IChFbnRyeSkgaXQubmV4dCgpOwotCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gKElNZXRhZGF0YVJlcG9zaXRvcnkpIGVudHJ5LmdldFZhbHVlKCk7Ci0KLQkJCU1hcCBwcm9wcyA9IHJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcygpOwotCQkJU3RyaW5nIGN1cnJlbnRUaW1lc3RhbXAgPSBudWxsOwotCQkJaWYgKHByb3BzICE9IG51bGwpCi0JCQkJY3VycmVudFRpbWVzdGFtcCA9IChTdHJpbmcpIHByb3BzLmdldChJUmVwb3NpdG9yeS5QUk9QX1RJTUVTVEFNUCk7Ci0KLQkJCWlmIChjdXJyZW50VGltZXN0YW1wID09IG51bGwpCi0JCQkJY3VycmVudFRpbWVzdGFtcCA9IE5PX1RJTUVTVEFNUDsKLQotCQkJU3RyaW5nIGxhc3RLbm93blRpbWVzdGFtcCA9IChTdHJpbmcpIHRpbWVzdGFtcHMucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKLQkJCS8vQSByZXBvIGhhcyBiZWVuIGFkZGVkIAotCQkJaWYgKGxhc3RLbm93blRpbWVzdGFtcCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWlmICghbGFzdEtub3duVGltZXN0YW1wLmVxdWFscyhjdXJyZW50VGltZXN0YW1wKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkvL0EgcmVwbyBoYXMgYmVlbiByZW1vdmVkCi0JCWlmICh0aW1lc3RhbXBzLnNpemUoKSAhPSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkVGltZXN0YW1wcygpIHsKLQkJRmlsZSBmaWxlID0gQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXREYXRhRmlsZShUSU1FU1RBTVBTX0ZJTEVfUFJFRklYICsgcHJvZmlsZS5nZXRQcm9maWxlSWQoKS5oYXNoQ29kZSgpKTsKLQkJdGltZXN0YW1wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBpcyA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpOwotCQkJdHJ5IHsKLQkJCQl0aW1lc3RhbXBzLmxvYWQoaXMpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQl9Ci0KLQlwcml2YXRlIFByb3Zpc2lvbmluZ0NvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJQXJyYXlMaXN0IHJlcG9VUkxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVwb3NpdG9yeU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQl0cnkgewotCQkJCXJlcG9VUkxzLmFkZChuZXcgVVJMKChTdHJpbmcpIGl0ZXJhdG9yLm5leHQoKSkpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkvL2lnbm9yZQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nQ29udGV4dCgoVVJMW10pIHJlcG9VUkxzLnRvQXJyYXkobmV3IFVSTFtyZXBvVVJMcy5zaXplKCldKSk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIHN5bmNocm9uaXplQ2FjaGVFeHRlbnNpb25zKCkgewotCQlMaXN0IGN1cnJlbnRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVwb3NpdG9yeU1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgcmVwb3NpdG9yeUlkID0gKFN0cmluZykgaXQubmV4dCgpOwotCQkJdHJ5IHsKLQkJCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBBY3RpdmF0b3IuZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5KG5ldyBVUkwocmVwb3NpdG9yeUlkKSwgbnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UpOwotCi0JCQkJaWYgKHJlcG9zaXRvcnkgaW5zdGFuY2VvZiBJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSkgewotCQkJCQljdXJyZW50RXh0ZW5zaW9ucy5hZGQocmVwb3NpdG9yeUlkKTsKLQkJCQkJYnVmZmVyLmFwcGVuZChyZXBvc2l0b3J5SWQpOwotCQkJCQlpZiAoaXQuaGFzTmV4dCgpKQotCQkJCQkJYnVmZmVyLmFwcGVuZChQSVBFKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB1bmV4cGVjdGVkCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgY3VycmVudEV4dGVuc2lvbnNQcm9wZXJ0eSA9IChidWZmZXIubGVuZ3RoKCkgPT0gMCkgPyBudWxsIDogYnVmZmVyLnRvU3RyaW5nKCk7Ci0KLQkJTGlzdCBwcmV2aW91c0V4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCVN0cmluZyBwcmV2aW91c0V4dGVuc2lvbnNQcm9wZXJ0eSA9IHByb2ZpbGUuZ2V0UHJvcGVydHkoQ0FDSEVfRVhURU5TSU9OUyk7Ci0JCWlmIChwcmV2aW91c0V4dGVuc2lvbnNQcm9wZXJ0eSAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihwcmV2aW91c0V4dGVuc2lvbnNQcm9wZXJ0eSwgUElQRSk7Ci0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCXByZXZpb3VzRXh0ZW5zaW9ucy5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcmV2aW91c0V4dGVuc2lvbnMuc2l6ZSgpID09IGN1cnJlbnRFeHRlbnNpb25zLnNpemUoKSAmJiBwcmV2aW91c0V4dGVuc2lvbnMuY29udGFpbnNBbGwoY3VycmVudEV4dGVuc2lvbnMpKQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0KLQkJT3BlcmFuZCBvcGVyYW5kID0gbmV3IFByb3BlcnR5T3BlcmFuZChDQUNIRV9FWFRFTlNJT05TLCBwcmV2aW91c0V4dGVuc2lvbnNQcm9wZXJ0eSwgY3VycmVudEV4dGVuc2lvbnNQcm9wZXJ0eSk7Ci0KLQkJcmV0dXJuIGV4ZWN1dGVPcGVyYW5kcyhuZXcgUHJvdmlzaW9uaW5nQ29udGV4dChuZXcgVVJMWzBdKSwgbmV3IE9wZXJhbmRbXSB7b3BlcmFuZH0sIG51bGwpOwotCX0KLQotCXB1YmxpYyBQcm9maWxlQ2hhbmdlUmVxdWVzdCBjcmVhdGVQcm9maWxlQ2hhbmdlUmVxdWVzdChQcm92aXNpb25pbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJTGlzdCB0b0FkZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCB0b1JlbW92ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvL0JhY2t3YXJkIGNvbXBhdGliaWxpdHkKLQkJQ29sbGVjdG9yIGNvbGxlY3QgPSBwcm9maWxlLnF1ZXJ5KG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kcm9waW5zIiksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJdG9SZW1vdmUuYWRkQWxsKGNvbGxlY3QudG9Db2xsZWN0aW9uKCkpOwotCQkvL0VuZCBvZiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0KLQkJLy8gZ2V0IGFsbCBJVXMgZnJvbSBhbGwgb3VyIHJlcG9zICh0b0FkZCkKLQkJQ29sbGVjdG9yIGFsbElVcyA9IGdldEFsbElVc0Zyb21SZXBvcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhbGxJVXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlmaW5hbCBJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXIubmV4dCgpOwotCQkJLy8gaWYgdGhlIElVIGlzIGFscmVhZHkgaW5zdGFsbGVkIGluIHRoZSBwcm9maWxlIHRoZW4gc2tpcCBpdAotCQkJUXVlcnkgcXVlcnkgPSBuZXcgUXVlcnkoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaXNNYXRjaChPYmplY3QgY2FuZGlkYXRlKSB7Ci0JCQkJCXJldHVybiBpdS5lcXVhbHMoY2FuZGlkYXRlKTsKLQkJCQl9Ci0JCQl9OwotCQkJQ29sbGVjdG9yIGNvbGxlY3RvciA9IHByb2ZpbGUucXVlcnkocXVlcnksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCk7Ci0JCQlpZiAoY29sbGVjdG9yLnNpemUoKSA9PSAwKSB7Ci0JCQkJaWYgKEJvb2xlYW4udmFsdWVPZihpdS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9HUk9VUCkpLmJvb2xlYW5WYWx1ZSgpKQotCQkJCQlyZXF1ZXN0LnNldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0eShpdSwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BST0ZJTEVfUk9PVF9JVSwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQkJCS8vIG1hcmsgYWxsIElVcyB3aXRoIHNwZWNpYWwgcHJvcGVydHkKLQkJCQlyZXF1ZXN0LnNldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0eShpdSwgUFJPUF9GUk9NX0RST1BJTlMsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJCQlyZXF1ZXN0LnNldEluc3RhbGxhYmxlVW5pdEluY2x1c2lvblJ1bGVzKGl1LCBQbGFubmVySGVscGVyLmNyZWF0ZU9wdGlvbmFsSW5jbHVzaW9uUnVsZShpdSkpOwotCQkJCXRvQWRkLmFkZChpdSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBnZXQgYWxsIElVcyBmcm9tIHByb2ZpbGUgd2l0aCBtYXJrZWQgcHJvcGVydHkgKGV4aXN0aW5nKQotCQlDb2xsZWN0b3IgcHJvZmlsZUlVcyA9IHByb2ZpbGUucXVlcnkobmV3IElVUHJvZmlsZVByb3BlcnR5UXVlcnkocHJvZmlsZSwgUFJPUF9GUk9NX0RST1BJTlMsIEJvb2xlYW4udG9TdHJpbmcodHJ1ZSkpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCQlDb2xsZWN0aW9uIGFsbCA9IGFsbElVcy50b0NvbGxlY3Rpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcHJvZmlsZUlVcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlci5uZXh0KCk7Ci0JCQkvLyByZW1vdmUgdGhlIElVcyB0aGF0IGFyZSBpbiB0aGUgaW50ZXJzZWN0aW9uIGJldHdlZW4gdGhlIDIgc2V0cwotCQkJaWYgKGFsbC5jb250YWlucyhpdSkpCi0JCQkJdG9BZGQucmVtb3ZlKGl1KTsKLQkJCWVsc2UKLQkJCQl0b1JlbW92ZS5hZGQoaXUpOwotCQl9Ci0KLQkJaWYgKHRvQWRkLmlzRW1wdHkoKSAmJiB0b1JlbW92ZS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljb250ZXh0LnNldEV4dHJhSVVzKHRvQWRkKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKChJSW5zdGFsbGFibGVVbml0W10pIHRvQWRkLnRvQXJyYXkobmV3IElJbnN0YWxsYWJsZVVuaXRbdG9BZGQuc2l6ZSgpXSkpOwotCQlyZXF1ZXN0LnJlbW92ZUluc3RhbGxhYmxlVW5pdHMoKElJbnN0YWxsYWJsZVVuaXRbXSkgdG9SZW1vdmUudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFt0b1JlbW92ZS5zaXplKCldKSk7Ci0JCXJldHVybiByZXF1ZXN0OwotCX0KLQotCXByaXZhdGUgQ29sbGVjdG9yIGdldEFsbElVc0Zyb21SZXBvcygpIHsKLQkJQ29sbGVjdG9yIGFsbFJlcG9zID0gbmV3IENvbGxlY3RvcigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcmVwb3NpdG9yeU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdC5uZXh0KCk7Ci0JCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeSkgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCXJlcG9zaXRvcnkucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBhbGxSZXBvcywgbnVsbCkuaXRlcmF0b3IoKTsKLQkJfQotCQlyZXR1cm4gYWxsUmVwb3M7Ci0JfQotCi0JcHJpdmF0ZSBQcm92aXNpb25pbmdQbGFuIGNyZWF0ZVByb3Zpc2lvbmluZ1BsYW4oUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCwgUHJvdmlzaW9uaW5nQ29udGV4dCBwcm92aXNpb25pbmdDb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gQWN0aXZhdG9yLmdldENvbnRleHQoKTsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSVBsYW5uZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJSVBsYW5uZXIgcGxhbm5lciA9IChJUGxhbm5lcikgY29udGV4dC5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxdWVzdCwgcHJvdmlzaW9uaW5nQ29udGV4dCwgbW9uaXRvcik7Ci0JCX0gZmluYWxseSB7Ci0JCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGV4ZWN1dGVQbGFuKFByb3Zpc2lvbmluZ1BsYW4gcGxhbiwgUHJvdmlzaW9uaW5nQ29udGV4dCBwcm92aXNpb25pbmdDb250ZXh0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJT3BlcmFuZFtdIG9wZXJhbmRzID0gcGxhbi5nZXRPcGVyYW5kcygpOwotCQlyZXR1cm4gZXhlY3V0ZU9wZXJhbmRzKHByb3Zpc2lvbmluZ0NvbnRleHQsIG9wZXJhbmRzLCBtb25pdG9yKTsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgZXhlY3V0ZU9wZXJhbmRzKFByb3Zpc2lvbmluZ0NvbnRleHQgcHJvdmlzaW9uaW5nQ29udGV4dCwgT3BlcmFuZFtdIG9wZXJhbmRzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJQnVuZGxlQ29udGV4dCBjb250ZXh0ID0gQWN0aXZhdG9yLmdldENvbnRleHQoKTsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSUVuZ2luZS5jbGFzcy5nZXROYW1lKCkpOwotCQlJRW5naW5lIGVuZ2luZSA9IChJRW5naW5lKSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJdHJ5IHsKLQkJCVBoYXNlU2V0IHBoYXNlU2V0ID0gbmV3IERlZmF1bHRQaGFzZVNldCgpOwotCQkJSVN0YXR1cyBlbmdpbmVSZXN1bHQgPSBlbmdpbmUucGVyZm9ybShwcm9maWxlLCBwaGFzZVNldCwgb3BlcmFuZHMsIHByb3Zpc2lvbmluZ0NvbnRleHQsIG1vbml0b3IpOwotCQkJcmV0dXJuIGVuZ2luZVJlc3VsdDsKLQkJfSBmaW5hbGx5IHsKLQkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFdyaXRlIG91dCB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBseUNvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmICgidHJ1ZSIuZXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLm5vQ29uZmlnIikpKSAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuOwotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBBY3RpdmF0b3IuZ2V0Q29udGV4dCgpOwotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShDb25maWd1cmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJQ29uZmlndXJhdG9yIGNvbmZpZ3VyYXRvciA9IChDb25maWd1cmF0b3IpIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl0cnkgewotCQkJY29uZmlndXJhdG9yLmFwcGx5Q29uZmlndXJhdGlvbigpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiVW5leHBlY3RlZCBmYWlsdXJlIGFwcGx5aW5nIGNvbmZpZ3VyYXRpb24iLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfSBmaW5hbGx5IHsKLQkJCWNvbnRleHQudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9yZWNvbmNpbGVyL2Ryb3BpbnMvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODA2NmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlY29uY2lsZXIvZHJvcGlucy9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYXJ0aWZhY3RfcmVwb19tYW5hZ2VyX25vdF9yZWdpc3RlcmVkPUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbm90IHJlZ2lzdGVyZWQuCi1lcnJvckxvYWRpbmdSZXBvc2l0b3J5PUVycm9yIG9jY3VycmVkIHdoaWxlIGxvYWRpbmcgcmVwb3NpdG9yeSBhdCB7MH0uCi1lcnJvclByb2Nlc3NpbmdDb25mZz1FeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyBjb25maWd1cmF0aW9uLgotbWV0YWRhdGFfcmVwb19tYW5hZ2VyX25vdF9yZWdpc3RlcmVkPU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbm90IHJlZ2lzdGVyZWQuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVwb3NpdG9yeS9DYWNoZU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZXBvc2l0b3J5L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3JlcG9zaXRvcnkvQ2FjaGVNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNjc4MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlcG9zaXRvcnkvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvcmVwb3NpdG9yeS9DYWNoZU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLlN5bmNocm9ub3VzUHJvdmlzaW9uaW5nTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLkFnZW50TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUV2ZW50OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotCi0vKioKLSAqIEEgY2xhc3MgdG8gbWFuYWdlIG1ldGFkYXRhIGNhY2hlIGZpbGVzLiBDcmVhdGluZyB0aGUgY2FjaGUgZmlsZXMgd2lsbCBwbGFjZQotICogdGhlIGZpbGUgaW4gdGhlIEFnZW50RGF0YSBsb2NhdGlvbiBpbiBhIGNhY2hlIGRpcmVjdG9yeS4KLSAqIAotICogVXNpbmcgdGhlIGJ1cyBsaXN0ZW5lcnMgd2lsbCBhbGxvdyB0aGUgbWFuYWdlciB0byBsaXN0ZW4gZm9yIHJlcG9zaXRvcnkKLSAqIGV2ZW50cy4gV2hlbiBhIHJlcG9zaXRvcnkgaXMgcmVtb3ZlZCwgaXQgd2lsbCByZW1vdmUgdGhlIGNhY2hlIGZpbGUgaWYgb25lCi0gKiB3YXMgY3JlYXRlZCBmb3IgdGhlIHJlcG9zaXRvcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBDYWNoZU1hbmFnZXIgewotCXByaXZhdGUgc3RhdGljIFN5bmNocm9ub3VzUHJvdmlzaW9uaW5nTGlzdGVuZXIgYnVzTGlzdGVuZXI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRklMRU5BTUUgPSAiY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0VYVEVOU0lPTiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRVhURU5TSU9OID0gIi54bWwiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBSZXR1cm5zIGEgaGFzaCBvZiB0aGUgVVJMLgotCSAqLwotCXByaXZhdGUgaW50IGNvbXB1dGVIYXNoKFVSTCByZXBvc2l0b3J5TG9jYXRpb24pIHsKLQkJLy9kb24ndCB1c2UgVVJMI2hhc2hDb2RlIGJlY2F1c2UgaXQgcGVyZm9ybXMgRE5TIGxvb2t1cHMKLQkJcmV0dXJuIHJlcG9zaXRvcnlMb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLmhhc2hDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxvY2FsIGNhY2hlIGZpbGUgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIHJlbW90ZSBsb2NhdGlvbiwKLQkgKiBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBhIGxvY2FsIGNhY2hlIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotCSAqIAotCSAqIEBwYXJhbSByZXBvc2l0b3J5TG9jYXRpb24KLQkgKiBAcGFyYW0gbW9uaXRvciAtIGEgcHJvZ3Jlc3MgbW9uaXRvcgotCSAqIEByZXR1cm4gQSB7QGxpbmsgRmlsZX0gb2JqZWN0IHBvaW50aW5nIHRvIHRoZSBjYWNoZSBmaWxlIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogaWYgdGhlIGxvY2F0aW9uIGlzIG5vdCBhIHJlcG9zaXRvcnkuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uCi0JICovCi0JcHVibGljIEZpbGUgY3JlYXRlQ2FjaGUoVVJMIHJlcG9zaXRvcnlMb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUZpbGUgY2FjaGVGaWxlID0gZ2V0Q2FjaGUocmVwb3NpdG9yeUxvY2F0aW9uKTsKLQkJVVJMIGphckxvY2F0aW9uID0gVVJMTWV0YWRhdGFSZXBvc2l0b3J5LmdldEFjdHVhbExvY2F0aW9uKHJlcG9zaXRvcnlMb2NhdGlvbiwgSkFSX0VYVEVOU0lPTik7Ci0JCVVSTCB4bWxMb2NhdGlvbiA9IFVSTE1ldGFkYXRhUmVwb3NpdG9yeS5nZXRBY3R1YWxMb2NhdGlvbihyZXBvc2l0b3J5TG9jYXRpb24sIFhNTF9FWFRFTlNJT04pOwotCQlBZ2VudExvY2F0aW9uIGFnZW50TG9jYXRpb24gPSAoQWdlbnRMb2NhdGlvbikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIEFnZW50TG9jYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJVVJMIGRhdGFBcmVhID0gYWdlbnRMb2NhdGlvbi5nZXREYXRhQXJlYShBY3RpdmF0b3IuSUQgKyAiL2NhY2hlLyIpOyAvLyROT04tTkxTLTEkCi0JCUZpbGUgZGF0YUFyZWFGaWxlID0gVVJMVXRpbC50b0ZpbGUoZGF0YUFyZWEpOwotCQlpbnQgaGFzaENvZGUgPSBjb21wdXRlSGFzaChyZXBvc2l0b3J5TG9jYXRpb24pOwotCQlpZiAoY2FjaGVGaWxlID09IG51bGwgfHwgaXNDYWNoZVN0YWxlKHJlcG9zaXRvcnlMb2NhdGlvbiwgY2FjaGVGaWxlKSkgewotCQkJbG9uZyBsYXN0TW9kaWZpZWRSZW1vdGUgPSBnZXRUcmFuc3BvcnQoKS5nZXRMYXN0TW9kaWZpZWQoamFyTG9jYXRpb24pOwotCQkJVVJMIHJlbW90ZUZpbGU7Ci0JCQlpZiAobGFzdE1vZGlmaWVkUmVtb3RlICE9IDApIHsKLQkJCQljYWNoZUZpbGUgPSBuZXcgRmlsZShkYXRhQXJlYUZpbGUsIENPTlRFTlRfRklMRU5BTUUgKyBoYXNoQ29kZSArIEpBUl9FWFRFTlNJT04pOwotCQkJCXJlbW90ZUZpbGUgPSBqYXJMb2NhdGlvbjsKLQkJCX0gZWxzZSB7Ci0JCQkJbGFzdE1vZGlmaWVkUmVtb3RlID0gZ2V0VHJhbnNwb3J0KCkuZ2V0TGFzdE1vZGlmaWVkKHhtbExvY2F0aW9uKTsKLQkJCQlpZiAobGFzdE1vZGlmaWVkUmVtb3RlID09IDApCi0JCQkJCS8vIG5vIGphciBvciB4bWwgZmlsZSBmb3VuZAotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQljYWNoZUZpbGUgPSBuZXcgRmlsZShkYXRhQXJlYUZpbGUsIENPTlRFTlRfRklMRU5BTUUgKyBoYXNoQ29kZSArIFhNTF9FWFRFTlNJT04pOwotCQkJCXJlbW90ZUZpbGUgPSB4bWxMb2NhdGlvbjsKLQkJCX0KLQkJCWNhY2hlRmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0JCQlPdXRwdXRTdHJlYW0gbWV0YWRhdGEgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oY2FjaGVGaWxlKSk7Ci0JCQl0cnkgewotCQkJCUlTdGF0dXMgcmVzdWx0ID0gZ2V0VHJhbnNwb3J0KCkuZG93bmxvYWQocmVtb3RlRmlsZS50b0V4dGVybmFsRm9ybSgpLCBtZXRhZGF0YSwgbW9uaXRvcik7Ci0JCQkJaWYgKCFyZXN1bHQuaXNPSygpKSB7Ci0JCQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24ocmVzdWx0KTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCW1ldGFkYXRhLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhY2hlRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBEZWxldGVzIHRoZSBsb2NhbCBjYWNoZSBmaWxlIGZvciB0aGUgZ2l2ZW4gcmVwb3NpdG9yeQotCSAqIEBwYXJhbSByZXBvc2l0b3J5TG9jYXRpb24KLQkgKi8KLQl2b2lkIGRlbGV0ZUNhY2hlKFVSTCByZXBvc2l0b3J5TG9jYXRpb24pIHsKLQkJRmlsZSBjYWNoZUZpbGUgPSBnZXRDYWNoZShyZXBvc2l0b3J5TG9jYXRpb24pOwotCQlpZiAoY2FjaGVGaWxlICE9IG51bGwpCi0JCQlzYWZlRGVsZXRlKGNhY2hlRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB0aGUgbG9jYWwgZmlsZXBhdGggb2YgdGhlIHJlcG9zaXRvcnkncyBjYWNoZSBmaWxlLgotCSAqIEBwYXJhbSByZXBvc2l0b3J5TG9jYXRpb24KLQkgKiBAcmV0dXJuIEEge0BsaW5rIEZpbGV9IHBvaW50aW5nIHRvIHRoZSBjYWNoZSBmaWxlIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogdGhlIGNhY2hlIGZpbGUgZG9lcyBub3QgZXhpc3QuCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldENhY2hlKFVSTCByZXBvc2l0b3J5TG9jYXRpb24pIHsKLQkJQWdlbnRMb2NhdGlvbiBhZ2VudExvY2F0aW9uID0gKEFnZW50TG9jYXRpb24pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBBZ2VudExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0JCVVSTCBkYXRhQXJlYSA9IGFnZW50TG9jYXRpb24uZ2V0RGF0YUFyZWEoQWN0aXZhdG9yLklEICsgIi9jYWNoZS8iKTsgLy8kTk9OLU5MUy0xJAotCQlGaWxlIGRhdGFBcmVhRmlsZSA9IFVSTFV0aWwudG9GaWxlKGRhdGFBcmVhKTsKLQkJaW50IGhhc2hDb2RlID0gY29tcHV0ZUhhc2gocmVwb3NpdG9yeUxvY2F0aW9uKTsKLQkJRmlsZSBjYWNoZUZpbGUgPSBuZXcgRmlsZShkYXRhQXJlYUZpbGUsIENPTlRFTlRfRklMRU5BTUUgKyBoYXNoQ29kZSArIEpBUl9FWFRFTlNJT04pOwotCQlpZiAoIWNhY2hlRmlsZS5leGlzdHMoKSkgewotCQkJY2FjaGVGaWxlID0gbmV3IEZpbGUoZGF0YUFyZWFGaWxlLCBDT05URU5UX0ZJTEVOQU1FICsgaGFzaENvZGUgKyBYTUxfRVhURU5TSU9OKTsKLQkJCWlmICghY2FjaGVGaWxlLmV4aXN0cygpKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiBjYWNoZUZpbGU7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0U2VydmljZShCdW5kbGVDb250ZXh0IGN0eCwgU3RyaW5nIG5hbWUpIHsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjdHguZ2V0U2VydmljZVJlZmVyZW5jZShuYW1lKTsKLQkJaWYgKHJlZmVyZW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU9iamVjdCByZXN1bHQgPSBjdHguZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQljdHgudW5nZXRTZXJ2aWNlKHJlZmVyZW5jZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBFQ0ZNZXRhZGF0YVRyYW5zcG9ydCBnZXRUcmFuc3BvcnQoKSB7Ci0JCXJldHVybiBFQ0ZNZXRhZGF0YVRyYW5zcG9ydC5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgcmVwb3NpdG9yeSdzIGxvY2FsIGNhY2hlIGZpbGUgaXMgb3V0IG9mIGRhdGUuCi0JICogQHBhcmFtIHJlcG9zaXRvcnlMb2NhdGlvbiBUaGUgcmVtb3RlIGxvY2F0aW9uIG9mIHRoZSBmaWxlCi0JICogQHBhcmFtIGNhY2hlRmlsZSBUaGUgY3VycmVudCBsb2NhbCBjYWNoZSBvZiB0aGUgcmVtb3RlIGxvY2F0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2FjaGUgZmlsZSBpcyBvdXQgb2YgZGF0ZSwgPGNvZGU+ZmFsc2U8L2NvZGU+Ci0JICogaWYgdGhlIGNhY2hlIGZpbGUgaXMgaW4gc3luYyB3aXRoIHRoZSByZXBvc2l0b3J5LiBUaGUgY2FjaGUgZmlsZSBpcwotCSAqIGNvbnNpZGVyZWQgc3RhbGUgaWYgdGhlcmUgaXMgbm8gbG9jYWwgY2FjaGUgZmlsZS4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDYWNoZVN0YWxlKFVSTCByZXBvc2l0b3J5TG9jYXRpb24sIEZpbGUgY2FjaGVGaWxlKSB7Ci0JCWxvbmcgbGFzdE1vZGlmaWVkID0gY2FjaGVGaWxlLmxhc3RNb2RpZmllZCgpOwotCQlTdHJpbmcgbmFtZSA9IGNhY2hlRmlsZS5nZXROYW1lKCk7Ci0JCVVSTCBtZXRhZGF0YUxvY2F0aW9uID0gbnVsbDsKLQkJaWYgKG5hbWUuZW5kc1dpdGgoWE1MX0VYVEVOU0lPTikpIHsKLQkJCW1ldGFkYXRhTG9jYXRpb24gPSBVUkxNZXRhZGF0YVJlcG9zaXRvcnkuZ2V0QWN0dWFsTG9jYXRpb24ocmVwb3NpdG9yeUxvY2F0aW9uLCBYTUxfRVhURU5TSU9OKTsKLQkJfSBlbHNlIGlmIChuYW1lLmVuZHNXaXRoKEpBUl9FWFRFTlNJT04pKSB7Ci0JCQltZXRhZGF0YUxvY2F0aW9uID0gVVJMTWV0YWRhdGFSZXBvc2l0b3J5LmdldEFjdHVhbExvY2F0aW9uKHJlcG9zaXRvcnlMb2NhdGlvbiwgSkFSX0VYVEVOU0lPTik7Ci0JCX0KLQkJbG9uZyBsYXN0TW9kaWZpZWRSZW1vdGUgPSAwOwotCQl0cnkgewotCQkJbGFzdE1vZGlmaWVkUmVtb3RlID0gZ2V0VHJhbnNwb3J0KCkuZ2V0TGFzdE1vZGlmaWVkKG1ldGFkYXRhTG9jYXRpb24pOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy8gY2FjaGUgaXMgc3RhbGUKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBsYXN0TW9kaWZpZWRSZW1vdGUgPiBsYXN0TW9kaWZpZWQgPyB0cnVlIDogZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHtAbGluayBTeW5jaHJvbm91c1Byb3Zpc2lvbmluZ0xpc3RlbmVyfSB0byB0aGUgZXZlbnQgYnVzIGZvcgotCSAqIGRlbGV0aW5nIGNhY2hlIGZpbGVzIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgcmVwb3NpdG9yeSBpcyBkZWxldGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVwb0V2ZW50TGlzdGVuZXIoKSB7Ci0JCUlQcm92aXNpb25pbmdFdmVudEJ1cyBldmVudEJ1cyA9IChJUHJvdmlzaW9uaW5nRXZlbnRCdXMpIGdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb3Zpc2lvbmluZ0V2ZW50QnVzLlNFUlZJQ0VfTkFNRSk7Ci0JCWlmIChldmVudEJ1cyA9PSBudWxsKSB7Ci0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiUHJvdmlzaW9uaW5nRXZlbnRCdXMgY291bGQgbm90IGJlIG9idGFpbmVkLiBNZXRhZGF0YSBjYWNoZXMgbWF5IG5vdCBiZSBjbGVhbmVkIHVwIHByb3Blcmx5LiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChidXNMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlidXNMaXN0ZW5lciA9IG5ldyBTeW5jaHJvbm91c1Byb3Zpc2lvbmluZ0xpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG5vdGlmeShFdmVudE9iamVjdCBvKSB7Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgUmVwb3NpdG9yeUV2ZW50KSB7Ci0JCQkJCQlSZXBvc2l0b3J5RXZlbnQgZXZlbnQgPSAoUmVwb3NpdG9yeUV2ZW50KSBvOwotCQkJCQkJaWYgKFJlcG9zaXRvcnlFdmVudC5SRU1PVkVEID09IGV2ZW50LmdldEtpbmQoKSAmJiBJUmVwb3NpdG9yeS5UWVBFX01FVEFEQVRBID09IGV2ZW50LmdldFJlcG9zaXRvcnlUeXBlKCkpIHsKLQkJCQkJCQlkZWxldGVDYWNoZShldmVudC5nZXRSZXBvc2l0b3J5TG9jYXRpb24oKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJZXZlbnRCdXMuYWRkTGlzdGVuZXIoYnVzTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNhZmVEZWxldGUoRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQlpZiAoIWZpbGUuZGVsZXRlKCkpIHsKLQkJCQlmaWxlLmRlbGV0ZU9uRXhpdCgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSB7QGxpbmsgU3luY2hyb25vdXNQcm92aXNpb25pbmdMaXN0ZW5lcn0gdGhhdCBjbGVhbnMgdXAgdGhlCi0JICogY2FjaGUgZmlsZSBmcm9tIHRoZSBldmVudCBidXMuCi0JICovCi0JcHVibGljIHZvaWQgdW5yZWdpc3RlclJlcG9FdmVudExpc3RlbmVyKCkgewotCQlJUHJvdmlzaW9uaW5nRXZlbnRCdXMgZXZlbnRCdXMgPSAoSVByb3Zpc2lvbmluZ0V2ZW50QnVzKSBnZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm92aXNpb25pbmdFdmVudEJ1cy5TRVJWSUNFX05BTUUpOwotCQlpZiAoZXZlbnRCdXMgIT0gbnVsbCAmJiBidXNMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlldmVudEJ1cy5yZW1vdmVMaXN0ZW5lcihidXNMaXN0ZW5lcik7Ci0JCQlidXNMaXN0ZW5lciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYmI3YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTg2NzcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGQ5YjRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzMwICswLDAgQEAKLSNGcmkgRmViIDIyIDExOjEwOjEwIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW5zdGFuY2Uvb3JnLmVjbGlwc2UuY29yZS5uZXQvb3JnLmVjbGlwc2UuY29yZS5uZXQuaGFzTWlncmF0ZWQ9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiY2MzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1ODowNyBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTNkMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM5NmFmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogU2FyIFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuMS4wCi1JbXBvcnQtUGFja2FnZTogb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNCwKLSBDREMtMS4xL0ZvdW5kYXRpb24tMS4xCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5zYXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycyIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDQwYWI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9zYXIvRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Nhci9EaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhNjMzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Nhci9EaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgSUJNIENvcnBvcmF0aW9uIC0gYnVnIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnNhcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogVGhlIERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSBkaXNjbG9zZXMgaXRzIGd1dHMgKGludGVybmFsIGJ5dGUgYnVmZmVyIGFuZAotICogYnl0ZSBidWZmZXIgbGVuZ3RoKSB0byBhdm9pZCB1bm5lY2Vzc2FyeSBhbGxvY2F0aW9uIG9mIGJ5dGUgYXJyYXlzIHVzdWFsbHkKLSAqIGludm9sdmVkIHdpdGggdG9CeXRlQXJyYXkoKS4KLSAqLwotcHVibGljIGNsYXNzIERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHRlbmRzIEJ5dGVBcnJheU91dHB1dFN0cmVhbSB7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGRpcmVjdCBieXRlIGFycmF5IG91dHB1dCBzdHJlYW0uIFRoZSBidWZmZXIgY2FwYWNpdHkgaXMKLQkgKiBpbml0aWFsbHkgYXMgZGVmaW5lZCBieSBzdXBlciBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgYnl0ZSBhcnJheSBvdXRwdXQgc3RyZWFtLCB3aXRoIGEgYnVmZmVyIGNhcGFjaXR5IG9mIHRoZQotCSAqIHNwZWNpZmllZCBzaXplLCBpbiBieXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gc2l6ZQotCSAqICAgICAgICAgICAgdGhlIGluaXRpYWwgc2l6ZS4KLQkgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIGlmIHNpemUgaXMgbmVnYXRpdmUuCi0JICovCi0JcHVibGljIERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbShpbnQgc2l6ZSkgewotCQlzdXBlcihzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFjdHVhbCBpbnRlcm5hbCBieXRlIGJ1ZmZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGludGVybmFsIGJ5dGUgYnVmZmVyCi0JICovCi0JcHVibGljIGZpbmFsIGJ5dGVbXSBnZXRCdWZmZXIoKSB7Ci0JCXJldHVybiBzdXBlci5idWY7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY3R1YWwgbGVuZ3RoIG9mIHRoZSBpbnRlcm5hbCBieXRlIGJ1ZmZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGFjdHVhbCBsZW5ndGggb2YgdGhlIGJ1ZmZlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0QnVmZmVyTGVuZ3RoKCkgewotCQlyZXR1cm4gc3VwZXIuY291bnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGFuIGlucHV0IHN0cmVhbSBjb250YWluaW5nIGFsbCB0aGUgKHNoYXJlZCkgYnl0ZXMgdGhpcyBvdXRwdXQKLQkgKiBzdHJlYW0gaGFzIGFscmVhZHkgY29uc3VtZWQuCi0JICogCi0JICogQHJldHVybiBCeXRlQXJyYXlJbnB1dFN0cmVhbQotCSAqLwotCXB1YmxpYyBCeXRlQXJyYXlJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHsKLQkJcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdXBlci5idWYsIDAsIHN1cGVyLmNvdW50KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Nhci9TYXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGNiYjRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICBJQk0gQ29ycG9yYXRpb24gLSBidWcgZml4ZXMgYW5kIGVuaGFuY2VtZW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyOwotCi0vKioKLSAqIFNhciBjb25zdGFudHMKLSAqLwotcHVibGljIGludGVyZmFjZSBTYXJDb25zdGFudHMgewotCi0JLyoqIDxjb2RlPlNBUkZJTEVfTUFSS0VSPC9jb2RlPiAqLwotCVN0cmluZyBTQVJGSUxFX01BUktFUiA9ICJTYXJGaWxlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqIDxjb2RlPlNBUkZJTEVfVkVSU0lPTjwvY29kZT4gKi8KLQlpbnQgU0FSRklMRV9WRVJTSU9OID0gMjsKLQotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPkRFRkFVTFRfRU5DT0RJTkc8L2NvZGU+Ci0JICovCi0JU3RyaW5nIERFRkFVTFRfRU5DT0RJTkcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBEZWJ1ZwotCSAqLwotCWJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhckVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Nhci9TYXJFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTJmMjczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhckVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICBJQk0gQ29ycG9yYXRpb24gLSBidWcgZml4ZXMgYW5kIGVuaGFuY2VtZW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotCi0vKioKLSAqIEEgU2FyRW50cnkgaXMgdGhlIGhlYWRlciBpbmZvcm1hdGlvbiBmb3IgYW4gZW50cnkgd2l0aGluIGEKLSAqIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyIHN0cmVhbS48YnI+Ci0gKiA8Yj5Ob3RlOiA8L2I+VGhlIHNldFRpbWUoKSBhbmQgZ2V0VGltZSgpIG1ldGhvZHMgb2YgWmlwRW50cnkgKG91ciBzdXBlcgotICogY2xhc3MpIHBlcmZvcm0gdGltZSB6b25lIGRlcGVuZGVudCAoISkgY29udmVyc2lvbnMuIEZvciBvdXIgc2VyaWFsaXphdGlvbiBhbmQKLSAqIGRlc2VyaWFsaXphdGlvbiB0aGUgc3RvcmVkIHRpbWUgaGFzIHRvIGJlIHRpbWUgem9uZSBuZXV0cmFsLiBUaGVyZWZvcmUgaXQgaXMKLSAqIG5lY2Vzc2FyeSB0byBpbnZlcnQgdGhvc2UgY2FsY3VsYXRpb25zLiBUaGlzIGlzIGFsc28gdGhlIHJlYXNvbiBmb3IKLSAqIGR1cGxpY2F0aW5nIHRoZSBqYXZhVG9Eb3NUaW1lKCkgYW5kIGRvc1RvSmF2YVRpbWUoKSBtZXRob2RzLgotICovCi1wdWJsaWMgY2xhc3MgU2FyRW50cnkgZXh0ZW5kcyBaaXBFbnRyeSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFb2Y7Ci0JcHJpdmF0ZSBib29sZWFuIGlzWmlwOwotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgdGhlIGVvZiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhciBlbnRyeS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU9GX0VOVFJZX05BTUUgPSAiPGVvZi1vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhcj4iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gU2FyQ29uc3RhbnRzLkRFQlVHOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBlb2Ygb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIgZW50cnkKLQkgKi8KLQlwdWJsaWMgU2FyRW50cnkoKSB7Ci0JCXN1cGVyKEVPRl9FTlRSWV9OQU1FKTsKLQkJc2V0TWV0aG9kKFppcEVudHJ5LkRFRkxBVEVEKTsKLQkJdGhpcy5pc0VvZiA9IHRydWU7Ci0JCXRoaXMuaXNaaXAgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gemlwRW50cnkKLQkgKi8KLQlwdWJsaWMgU2FyRW50cnkoWmlwRW50cnkgemlwRW50cnkpIHsKLQkJc3VwZXIoemlwRW50cnkpOwotCQl0aGlzLmlzWmlwID0gZmFsc2U7Ci0JCXRoaXMuaXNFb2YgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gemlwRW50cnkKLQkgKiBAcGFyYW0gaXNaaXAKLQkgKi8KLQlwdWJsaWMgU2FyRW50cnkoWmlwRW50cnkgemlwRW50cnksIGJvb2xlYW4gaXNaaXApIHsKLQkJc3VwZXIoemlwRW50cnkpOwotCQl0aGlzLmlzWmlwID0gaXNaaXA7Ci0JCXRoaXMuaXNFb2YgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2FySW5wdXRTdHJlYW0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFNhckVudHJ5KFNhcklucHV0U3RyZWFtIHNhcklucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyByZWFkIG5hbWUhCi0JCXN1cGVyKHNhcklucHV0U3RyZWFtLnJlYWRTdHJpbmcoKSk7Ci0KLQkJU3RyaW5nIGNvbW1lbnQgPSBzYXJJbnB1dFN0cmVhbS5yZWFkU3RyaW5nKCk7Ci0JCWxvbmcgY29tcHJlc3NlZFNpemUgPSBzYXJJbnB1dFN0cmVhbS5yZWFkTG9uZygpOwotCQlsb25nIGNyYyA9IHNhcklucHV0U3RyZWFtLnJlYWRMb25nKCk7Ci0JCWJ5dGVbXSBleHRyYSA9IHNhcklucHV0U3RyZWFtLnJlYWRCeXRlcygpOwotCQlpbnQgbWV0aG9kID0gc2FySW5wdXRTdHJlYW0ucmVhZEludCgpOwotCQlsb25nIHNpemUgPSBzYXJJbnB1dFN0cmVhbS5yZWFkTG9uZygpOwotCQlsb25nIGRvc1RpbWUgPSBzYXJJbnB1dFN0cmVhbS5yZWFkTG9uZygpOwotCQlib29sZWFuIGlzRW9mID0gc2FySW5wdXRTdHJlYW0ucmVhZEJvb2xlYW4oKTsKLQkJYm9vbGVhbiBpc1ppcCA9IHNhcklucHV0U3RyZWFtLnJlYWRCb29sZWFuKCk7Ci0KLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0TmFtZSgpICsgIiwiICsgY29tbWVudCArICIsIiArIGNvbXByZXNzZWRTaXplICsgIiwiICsgY3JjICsgIiwiICsgZXh0cmEgKyAiLCIgKyBtZXRob2QgKyAiLCIgKyBzaXplICsgIiwiICsgZG9zVGltZSArICIsIiArIGlzRW9mICsgIiwiICsgaXNaaXApOwotCQl9Ci0KLQkJaWYgKG1ldGhvZCA9PSBaaXBFbnRyeS5TVE9SRUQpIHsKLQkJCXNldENvbXByZXNzZWRTaXplKGNvbXByZXNzZWRTaXplKTsKLQkJCXNldENyYyhjcmMpOwotCQkJc2V0U2l6ZShzaXplKTsKLQkJfQotCi0JCXNldENvbW1lbnQoY29tbWVudCk7Ci0JCXNldEV4dHJhKGV4dHJhKTsKLQkJc2V0TWV0aG9kKG1ldGhvZCk7Ci0JCXNldFRpbWUoZG9zVG9KYXZhVGltZShkb3NUaW1lKSk7Ci0JCXNldEVvZihpc0VvZik7Ci0JCXNldFppcChpc1ppcCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNhck91dHB1dFN0cmVhbQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZVRvKFNhck91dHB1dFN0cmVhbSBzYXJPdXRwdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb21tZW50ID0gdGhpcy5nZXRDb21tZW50KCk7Ci0JCWxvbmcgY29tcHJlc3NlZFNpemUgPSB0aGlzLmdldENvbXByZXNzZWRTaXplKCk7Ci0JCWxvbmcgY3JjID0gdGhpcy5nZXRDcmMoKTsKLQkJYnl0ZVtdIGV4dHJhID0gdGhpcy5nZXRFeHRyYSgpOwotCQlpbnQgbWV0aG9kID0gdGhpcy5nZXRNZXRob2QoKTsKLQkJU3RyaW5nIG5hbWUgPSB0aGlzLmdldE5hbWUoKTsKLQkJbG9uZyBzaXplID0gdGhpcy5nZXRTaXplKCk7Ci0JCWxvbmcgZG9zVGltZSA9IGphdmFUb0Rvc1RpbWUodGhpcy5nZXRUaW1lKCkpOwotCQlib29sZWFuIGlzWmlwID0gdGhpcy5pc1ppcCgpOwotCQlib29sZWFuIGlzRW9mID0gdGhpcy5pc0VvZigpOwotCi0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG5hbWUgKyAiLCIgKyBjb21tZW50ICsgIiwiICsgY29tcHJlc3NlZFNpemUgKyAiLCIgKyBjcmMgKyAiLCIgKyBleHRyYSArICIsIiArIG1ldGhvZCArICIsIiArIHNpemUgKyAiLCIgKyBkb3NUaW1lICsgIiwiICsgaXNFb2YgKyAiLCIgKyBpc1ppcCk7Ci0JCX0KLQotCQlzYXJPdXRwdXRTdHJlYW0ud3JpdGVTdHJpbmcobmFtZSk7Ci0JCXNhck91dHB1dFN0cmVhbS53cml0ZVN0cmluZyhjb21tZW50KTsKLQkJc2FyT3V0cHV0U3RyZWFtLndyaXRlTG9uZyhjb21wcmVzc2VkU2l6ZSk7Ci0JCXNhck91dHB1dFN0cmVhbS53cml0ZUxvbmcoY3JjKTsKLQkJc2FyT3V0cHV0U3RyZWFtLndyaXRlQnl0ZXMoZXh0cmEpOwotCQlzYXJPdXRwdXRTdHJlYW0ud3JpdGVJbnQobWV0aG9kKTsKLQkJc2FyT3V0cHV0U3RyZWFtLndyaXRlTG9uZyhzaXplKTsKLQkJc2FyT3V0cHV0U3RyZWFtLndyaXRlTG9uZyhkb3NUaW1lKTsKLQkJc2FyT3V0cHV0U3RyZWFtLndyaXRlQm9vbChpc0VvZik7Ci0JCXNhck91dHB1dFN0cmVhbS53cml0ZUJvb2woaXNaaXApOwotCX0KLQotCS8qKgotCSAqIElzIHRoaXMgdGhlIGVvZiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhciBlbnRyeT8KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBhbnN3ZXIKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VvZigpIHsKLQkJcmV0dXJuIGlzRW9mOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFb2YoYm9vbGVhbiBpc0VvZikgewotCQl0aGlzLmlzRW9mID0gaXNFb2Y7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNaaXAoKSB7Ci0JCXJldHVybiBpc1ppcDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXNaaXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0WmlwKGJvb2xlYW4gaXNaaXApIHsKLQkJdGhpcy5pc1ppcCA9IGlzWmlwOwotCX0KLQotCS8qCi0JICogQ29udmVydHMgRE9TIHRpbWUgdG8gSmF2YSB0aW1lIChudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHNpbmNlIGVwb2NoKS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgZG9zVG9KYXZhVGltZShsb25nIGR0aW1lKSB7Ci0JCURhdGUgZCA9IG5ldyBEYXRlKChpbnQpICgoKGR0aW1lID4+IDI1KSAmIDB4N2YpICsgODApLCAoaW50KSAoKChkdGltZSA+PiAyMSkgJiAweDBmKSAtIDEpLCAoaW50KSAoKGR0aW1lID4+IDE2KSAmIDB4MWYpLCAoaW50KSAoKGR0aW1lID4+IDExKSAmIDB4MWYpLCAoaW50KSAoKGR0aW1lID4+IDUpICYgMHgzZiksIChpbnQpICgoZHRpbWUgPDwgMSkgJiAweDNlKSk7Ci0JCXJldHVybiBkLmdldFRpbWUoKTsKLQl9Ci0KLQkvKgotCSAqIENvbnZlcnRzIEphdmEgdGltZSB0byBET1MgdGltZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgamF2YVRvRG9zVGltZShsb25nIHRpbWUpIHsKLQkJRGF0ZSBkID0gbmV3IERhdGUodGltZSk7Ci0JCWludCB5ZWFyID0gZC5nZXRZZWFyKCkgKyAxOTAwOwotCQlpZiAoeWVhciA8IDE5ODApIHsKLQkJCXJldHVybiAoMSA8PCAyMSkgfCAoMSA8PCAxNik7Ci0JCX0KLQkJcmV0dXJuICh5ZWFyIC0gMTk4MCkgPDwgMjUgfCAoZC5nZXRNb250aCgpICsgMSkgPDwgMjEgfCBkLmdldERhdGUoKSA8PCAxNiB8IGQuZ2V0SG91cnMoKSA8PCAxMSB8IGQuZ2V0TWludXRlcygpIDw8IDUgfCBkLmdldFNlY29uZHMoKSA+PiAxOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9zYXIvU2FySW5wdXRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhcklucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMmFiZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9zYXIvU2FySW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogIElCTSBDb3Jwb3JhdGlvbiAtIGJ1ZyBmaXhlcyBhbmQgZW5oYW5jZW1lbnRzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5zYXI7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLS8qKgotICogVGhlIFNhcklucHV0U3RyZWFtIHJlYWRzIGEgc3RyZWFtaW5nIGFyY2hpdmUgYXMgYW4gSW5wdXRTdHJlYW0uIE1ldGhvZHMgYXJlCi0gKiBwcm92aWRlZCB0byBwb3NpdGlvbiBhdCBlYWNoIHN1Y2Nlc3NpdmUgZW50cnkgaW4gdGhlIGFyY2hpdmUsIGFuZCB0aGUgcmVhZAotICogZWFjaCBlbnRyeSBhcyBhIG5vcm1hbCBpbnB1dCBzdHJlYW0gdXNpbmcgcmVhZCgpLgotICovCi1wdWJsaWMgY2xhc3MgU2FySW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0KLQlwcml2YXRlIGZpbmFsIERhdGFJbnB1dFN0cmVhbSBkYXRhSW5wdXRTdHJlYW07Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgdmVyc2lvbjsKLQlwcml2YXRlIElucHV0U3RyZWFtIGNvbnRlbnRTdHJlYW07Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgU2FySW5wdXRTdHJlYW0uCi0JICogCi0JICogQHBhcmFtIGlucHV0U3RyZWFtCi0JICogICAgICAgICAgICB0aGUgaW5wdXQgc3RyZWFtIHRvIHVzZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU2FySW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJdGhpcy5kYXRhSW5wdXRTdHJlYW0gPSBuZXcgRGF0YUlucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKLQotCQkvLyBTYXJGaWxlIG1hcmtlcgotCQlTdHJpbmcgbWFya2VyID0gcmVhZFN0cmluZygpOwotCQlpZiAoIW1hcmtlci5lcXVhbHMoU2FyQ29uc3RhbnRzLlNBUkZJTEVfTUFSS0VSKSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJEb2VzIG5vdCBjb250YWluIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyIG1hcmtlci4iKTsKLQkJfQotCi0JCS8vIFNhckZpbGUgdmVyc2lvbgotCQl2ZXJzaW9uID0gZGF0YUlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQkJaWYgKHZlcnNpb24gIT0gU2FyQ29uc3RhbnRzLlNBUkZJTEVfVkVSU0lPTikgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB2ZXJzaW9uLiIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2xvc2VzIHRoaXMgc3RyZWFtLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBvbiBlcnJvcgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZGF0YUlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogU2luY2Ugd2UgZG8gbm90IHN1cHBvcnQgbWFya2luZyBqdXN0IHlldCwgd2UgcmV0dXJuIGZhbHNlLgotCSAqIAotCSAqIEByZXR1cm4gRmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0IG1hcmtpbmcganVzdCB5ZXQsIHdlIGRvIG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIG1hcmtMaW1pdAotCSAqICAgICAgICAgICAgVGhlIGxpbWl0IHRvIG1hcmsuCi0JICovCi0JcHVibGljIHZvaWQgbWFyayhpbnQgbWFya0xpbWl0KSB7Ci0JCS8vIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBTaW5jZSB3ZSBkbyBub3Qgc3VwcG9ydCBtYXJraW5nIGp1c3QgeWV0LCB3ZSBkbyBub3RoaW5nLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkvLyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBuZXh0IGVudHJ5IGluIHRoaXMgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIgYXJjaGl2ZS4gVGhpcyB3aWxsIHNraXAKLQkgKiBvdmVyIGFueSByZW1haW5pbmcgZGF0YSBpbiB0aGUgY3VycmVudCBlbnRyeSwgaWYgdGhlcmUgaXMgb25lLCBhbmQgcGxhY2UKLQkgKiB0aGUgaW5wdXQgc3RyZWFtIGF0IHRoZSBoZWFkZXIgb2YgdGhlIG5leHQgZW50cnksIGFuZCByZWFkIHRoZSBoZWFkZXIgYW5kCi0JICogaW5zdGFudGlhdGUgYSBuZXcgU2FyRW50cnkgZnJvbSB0aGUgaGVhZGVyIGJ5dGVzIGFuZCByZXR1cm4gdGhhdCBlbnRyeS4KLQkgKiBJZiB0aGVyZSBhcmUgbm8gbW9yZSBlbnRyaWVzIGluIHRoZSBhcmNoaXZlLCBudWxsIHdpbGwgYmUgcmV0dXJuZWQgdG8KLQkgKiBpbmRpY2F0ZSB0aGF0IHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUgaGFzIGJlZW4gcmVhY2hlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBuZXh0IFNhckVudHJ5IGluIHRoZSBhcmNoaXZlLCBvciBudWxsLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBvbiBlcnJvcgotCSAqLwotCXB1YmxpYyBTYXJFbnRyeSBnZXROZXh0RW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTYXJFbnRyeSBzYXJFbnRyeSA9IG5ldyBTYXJFbnRyeSh0aGlzKTsKLQkJaWYgKHNhckVudHJ5LmlzRW9mKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlieXRlW10gY29udGVudCA9IHJlYWRCeXRlcygpOwotCQljb250ZW50U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQpOwotCQlyZXR1cm4gc2FyRW50cnk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSB0aGUgZW50cnkuCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlRW50cnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljb250ZW50U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlW10gYnl0ZXMgPSByZWFkQnl0ZXMoKTsKLQkJaWYgKGJ5dGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gbmV3IFN0cmluZyhieXRlcywgU2FyQ29uc3RhbnRzLkRFRkFVTFRfRU5DT0RJTkcpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYnl0ZVtdCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCWJ5dGVbXSByZWFkQnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgbGVuZ3RoID0gZGF0YUlucHV0U3RyZWFtLnJlYWRJbnQoKTsKLQkJaWYgKGxlbmd0aCA9PSAtMSkKLQkJCXJldHVybiBudWxsOwotCi0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2xlbmd0aF07Ci0JCWRhdGFJbnB1dFN0cmVhbS5yZWFkRnVsbHkoYnl0ZXMsIDAsIGxlbmd0aCk7Ci0JCXJldHVybiBieXRlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlpbnQgcmVhZEludCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBkYXRhSW5wdXRTdHJlYW0ucmVhZEludCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlib29sZWFuIHJlYWRCb29sZWFuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRhdGFJbnB1dFN0cmVhbS5yZWFkQm9vbGVhbigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gbG9uZwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlsb25nIHJlYWRMb25nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGRhdGFJbnB1dFN0cmVhbS5yZWFkTG9uZygpOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIGEgYnl0ZSBmcm9tIHRoZSBjdXJyZW50IHRhciBhcmNoaXZlIGVudHJ5LgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHNpbXBseSBjYWxscyByZWFkKCBieXRlW10sIGludCwgaW50ICkuCi0JICogCi0JICogQHJldHVybiBUaGUgYnl0ZSByZWFkLCBvciAtMSBhdCBFT0YuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIG9uIGVycm9yCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGNvbnRlbnRTdHJlYW0ucmVhZCgpOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIGJ5dGVzIGZyb20gdGhlIGN1cnJlbnQgdGFyIGFyY2hpdmUgZW50cnkuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgYXdhcmUgb2YgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGN1cnJlbnQgZW50cnkgaW4gdGhlCi0JICogYXJjaGl2ZSBhbmQgd2lsbCBkZWFsIHdpdGggdGhlbSBhcyBpZiB0aGV5IHdlcmUgdGhpcyBzdHJlYW0ncyBzdGFydCBhbmQKLQkgKiBFT0YuCi0JICogCi0JICogQHBhcmFtIGJ1ZmZlcgotCSAqICAgICAgICAgICAgVGhlIGJ1ZmZlciBpbnRvIHdoaWNoIHRvIHBsYWNlIGJ5dGVzIHJlYWQuCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgVGhlIG9mZnNldCBhdCB3aGljaCB0byBwbGFjZSBieXRlcyByZWFkLgotCSAqIEBwYXJhbSBudW1Ub1JlYWQKLQkgKiAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KLQkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgYXQgRU9GLgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBvbiBlcnJvcgotCSAqLwotCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbnVtVG9SZWFkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gY29udGVudFN0cmVhbS5yZWFkKGJ1ZmZlciwgb2Zmc2V0LCBudW1Ub1JlYWQpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1Nhck91dHB1dFN0cmVhbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9zYXIvU2FyT3V0cHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTE2ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi9zYXIvU2FyT3V0cHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICBJQk0gQ29ycG9yYXRpb24gLSBidWcgZml4ZXMgYW5kIGVuaGFuY2VtZW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyOwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vKioKLSAqIFRoZSBTYXJPdXRwdXRTdHJlYW0gd3JpdGVzIGEgc3RyZWFtIGFyY2hpdmUgYXMgYW4gT3V0cHV0U3RyZWFtLiBNZXRob2RzIGFyZQotICogcHJvdmlkZWQgdG8gcHV0IGVudHJpZXMsIGFuZCB0aGVuIHdyaXRlIHRoZWlyIGNvbnRlbnRzIGJ5IHdyaXRpbmcgdG8gdGhpcwotICogc3RyZWFtIHVzaW5nIHdyaXRlKCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXJPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewotCi0JcHJpdmF0ZSBib29sZWFuIGZpbmlzaGVkOwotCXByaXZhdGUgZmluYWwgRGF0YU91dHB1dFN0cmVhbSBkYXRhT3V0cHV0U3RyZWFtOwotCXByaXZhdGUgZmluYWwgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIGVudHJ5Q29udGVudDsKLQotCS8qKgotCSAqIEBwYXJhbSBvdXRwdXRTdHJlYW0KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIFNhck91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlkYXRhT3V0cHV0U3RyZWFtID0gbmV3IERhdGFPdXRwdXRTdHJlYW0ob3V0cHV0U3RyZWFtKTsKLQkJZW50cnlDb250ZW50ID0gbmV3IERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxNiAqIDEwMjQpOwotCQl3cml0ZVN0cmluZyhTYXJDb25zdGFudHMuU0FSRklMRV9NQVJLRVIpOwotCQlkYXRhT3V0cHV0U3RyZWFtLndyaXRlSW50KFNhckNvbnN0YW50cy5TQVJGSUxFX1ZFUlNJT04pOwotCQlmaW5pc2hlZCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEVuZHMgdGhlIFNBUiBhcmNoaXZlIGFuZCBjbG9zZXMgdGhlIHVuZGVybHlpbmcgT3V0cHV0U3RyZWFtLgotCSAqIAotCSAqIEBzZWUgamF2YS5pby5PdXRwdXRTdHJlYW0jY2xvc2UoKQotCSAqLwotCS8vIEBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluaXNoKCk7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRmluaXNoIHRoaXMgU0FSIGFyY2hpdmUgYnV0IGRvZXMgbm90IGNsb3NlIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0uCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGZpbmlzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaW5pc2hlZCkKLQkJCXJldHVybjsKLQotCQl3cml0ZUVPRlJlY29yZCgpOwotCQlmaW5pc2hlZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogUHV0IGFuIGVudHJ5IG9uIHRoZSBvdXRwdXQgc3RyZWFtLiBUaGlzIHdyaXRlcyB0aGUgZW50cnkncyBoZWFkZXIgcmVjb3JkCi0JICogYW5kIHBvc2l0aW9ucyB0aGUgb3V0cHV0IHN0cmVhbSBmb3Igd3JpdGluZyB0aGUgY29udGVudHMgb2YgdGhlIGVudHJ5LgotCSAqIE9uY2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCB0aGUgc3RyZWFtIGlzIHJlYWR5IGZvciBjYWxscyB0byB3cml0ZSgpIHRvCi0JICogd3JpdGUgdGhlIGVudHJ5J3MgY29udGVudHMuIE9uY2UgdGhlIGNvbnRlbnRzIGFyZSB3cml0dGVuLCBjbG9zZUVudHJ5KCkKLQkgKiA8Qj5NVVNUIDwvQj4gYmUgY2FsbGVkIHRvIGVuc3VyZSB0aGF0IGFsbCBidWZmZXJlZCBkYXRhIGlzIGNvbXBsZXRlbHkKLQkgKiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBlbnRyeQotCSAqICAgICAgICAgICAgdGhlIFNhckVudHJ5IHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGFyY2hpdmUuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHB1dE5leHRFbnRyeShTYXJFbnRyeSBlbnRyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW50cnkud3JpdGVUbyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSBhbiBlbnRyeS4gVGhpcyBtZXRob2QgTVVTVCBiZSBjYWxsZWQgZm9yIGFsbCBmaWxlIGVudHJpZXMgdGhhdAotCSAqIGNvbnRhaW4gZGF0YS4gVGhlIHJlYXNvbiBpcyB0aGF0IHdlIG11c3QgYnVmZmVyIGRhdGEgd3JpdHRlbiB0byB0aGUKLQkgKiBzdHJlYW0gaW4gb3JkZXIgdG8gc2F0aXNmeSB0aGUgYnVmZmVyJ3MgcmVjb3JkIGJhc2VkIHdyaXRlcy4gVGh1cywgdGhlcmUKLQkgKiBtYXkgYmUgZGF0YSBmcmFnbWVudHMgc3RpbGwgYmVpbmcgYXNzZW1ibGVkIHRoYXQgbXVzdCBiZSB3cml0dGVuIHRvIHRoZQotCSAqIG91dHB1dCBzdHJlYW0gYmVmb3JlIHRoaXMgZW50cnkgaXMgY2xvc2VkIGFuZCB0aGUgbmV4dCBlbnRyeSB3cml0dGVuLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZUVudHJ5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJd3JpdGVCeXRlcyhlbnRyeUNvbnRlbnQuZ2V0QnVmZmVyKCksIGVudHJ5Q29udGVudC5nZXRCdWZmZXJMZW5ndGgoKSk7Ci0JCWVudHJ5Q29udGVudC5yZXNldCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBieXRlcyA9IG51bGw7Ci0JCWlmIChzICE9IG51bGwpCi0JCQlieXRlcyA9IHMuZ2V0Qnl0ZXMoU2FyQ29uc3RhbnRzLkRFRkFVTFRfRU5DT0RJTkcpOwotCi0JCXdyaXRlQnl0ZXMoYnl0ZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBieXRlcwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQl2b2lkIHdyaXRlQnl0ZXMoYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl3cml0ZUJ5dGVzKGJ5dGVzLCBieXRlcyAhPSBudWxsID8gYnl0ZXMubGVuZ3RoIDogLTEpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBieXRlcwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQl2b2lkIHdyaXRlQnl0ZXMoYnl0ZVtdIGJ5dGVzLCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoYnl0ZXMgIT0gbnVsbCkgewotCQkJZGF0YU91dHB1dFN0cmVhbS53cml0ZUludChsZW5ndGgpOwotCQkJZGF0YU91dHB1dFN0cmVhbS53cml0ZShieXRlcywgMCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCWRhdGFPdXRwdXRTdHJlYW0ud3JpdGVJbnQoLTEpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHYKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0Jdm9pZCB3cml0ZUludChpbnQgdikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZGF0YU91dHB1dFN0cmVhbS53cml0ZUludCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYm9vbAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB3cml0ZUJvb2woYm9vbGVhbiBib29sKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlkYXRhT3V0cHV0U3RyZWFtLndyaXRlQm9vbGVhbihib29sKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQl2b2lkIHdyaXRlTG9uZyhsb25nIHYpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWRhdGFPdXRwdXRTdHJlYW0ud3JpdGVMb25nKHYpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyBhIGJ5dGUgdG8gdGhlIGN1cnJlbnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIgYXJjaGl2ZSBlbnRyeS4KLQkgKiAKLQkgKiBAcGFyYW0gYgotCSAqICAgICAgICAgICAgdGhlIGJ5dGUgd3JpdHRlbi4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSN3cml0ZShpbnQpCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlWzFdOwotCQlieXRlc1swXSA9IChieXRlKSBiOwotCQllbnRyeUNvbnRlbnQud3JpdGUoYnl0ZXMpOwotCX0KLQotCS8qKgotCSAqIFdyaXRlcyBieXRlcyB0byB0aGUgY3VycmVudCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhciBhcmNoaXZlIGVudHJ5LgotCSAqIAotCSAqIEBwYXJhbSBieXRlcwotCSAqICAgICAgICAgICAgVGhlIGJ1ZmZlciB0byB3cml0ZSB0byB0aGUgYXJjaGl2ZS4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSN3cml0ZShieXRlW10pCi0JICovCi0JcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnRyeUNvbnRlbnQud3JpdGUoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIGJ5dGVzIHRvIHRoZSBjdXJyZW50IG9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyIGFyY2hpdmUgZW50cnkuCi0JICogCi0JICogQHBhcmFtIGJ5dGVzCi0JICogICAgICAgICAgICBUaGUgYnVmZmVyIHRvIHdyaXRlIHRvIHRoZSBhcmNoaXZlLgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIFRoZSBvZmZzZXQgaW4gdGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHRvIGdldCBieXRlcy4KLQkgKiBAcGFyYW0gbnVtVG9Xcml0ZQotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZS4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogCi0JICogQHNlZSBqYXZhLmlvLk91dHB1dFN0cmVhbSN3cml0ZShieXRlW10sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCwgaW50IG51bVRvV3JpdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVudHJ5Q29udGVudC53cml0ZShieXRlcywgb2Zmc2V0LCBudW1Ub1dyaXRlKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZSBhbiBFT0YgKGVuZCBvZiBhcmNoaXZlKSBlbnRyeSB0byB0aGUgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIgYXJjaGl2ZS4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlRU9GUmVjb3JkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU2FyRW50cnkgZW9mRW50cnkgPSBuZXcgU2FyRW50cnkoKTsKLQkJZW9mRW50cnkud3JpdGVUbyh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhclV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvc2FyL1NhclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliNTRlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Nhci9TYXJVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICBJQk0gQ29ycG9yYXRpb24gLSBidWcgZml4ZXMgYW5kIGVuaGFuY2VtZW50cwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgZm9yIGNvbnZlcnRpbmcgWmlwcy9KYXJzIHRvIFNhcnMgYW5kIHZpY2UgdmVyc2EuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXJVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDggKiAxMDI0OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBTYXJDb25zdGFudHMuREVCVUc7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFNhclV0aWwoKSB7Ci0JCS8vIHV0aWxpdHkgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBOb3JtYWxpemUgdGhlIGdpdmVuIHppcC9qYXIuCi0JICogCi0JICogQHBhcmFtIHppcFNvdXJjZQotCSAqIEBwYXJhbSB6aXBUYXJnZXQKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG5vcm1hbGl6ZShGaWxlIHppcFNvdXJjZSwgRmlsZSB6aXBUYXJnZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgdGVtcFNhciA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlbXAiLCAiLnNhciIpOwotCQl0cnkgewotCQkJemlwVG9TYXIoemlwU291cmNlLCB0ZW1wU2FyKTsKLQkJCXNhclRvWmlwKHRlbXBTYXIsIHppcFRhcmdldCk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0ZW1wU2FyLmRlbGV0ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm9ybWFsaXplIHRoZSBnaXZlbiB6aXAvamFyLgotCSAqIAotCSAqIEBwYXJhbSB6aXBTb3VyY2UKLQkgKiBAcGFyYW0gemlwVGFyZ2V0Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBub3JtYWxpemUoSW5wdXRTdHJlYW0gemlwU291cmNlLCBPdXRwdXRTdHJlYW0gemlwVGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0gdGVtcFNhciA9IG5ldyBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJemlwVG9TYXIoemlwU291cmNlLCB0ZW1wU2FyKTsKLQkJc2FyVG9aaXAodGVtcFNhci5nZXRJbnB1dFN0cmVhbSgpLCB6aXBUYXJnZXQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB6aXBGaWxlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6aXBUb1NhcihGaWxlIHppcEZpbGUsIEZpbGUgc2FyRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gemlwSW5wdXRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHppcEZpbGUpKTsKLQkJT3V0cHV0U3RyZWFtIHNhck91dHB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShzYXJGaWxlKSk7Ci0JCVNhclV0aWwuemlwVG9TYXIoemlwSW5wdXRTdHJlYW0sIHNhck91dHB1dFN0cmVhbSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHppcHBlZElucHV0U3RyZWFtCi0JICogQHBhcmFtIHNhcmVkT3V0cHV0U3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6aXBUb1NhcihJbnB1dFN0cmVhbSB6aXBwZWRJbnB1dFN0cmVhbSwgT3V0cHV0U3RyZWFtIHNhcmVkT3V0cHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl6aXBUb1Nhcih6aXBwZWRJbnB1dFN0cmVhbSwgdHJ1ZSwgc2FyZWRPdXRwdXRTdHJlYW0sIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB6aXBwZWRJbnB1dFN0cmVhbQotCSAqIEBwYXJhbSBjbG9zZUluCi0JICogQHBhcmFtIHNhcmVkT3V0cHV0U3RyZWFtCi0JICogQHBhcmFtIGNsb3NlT3V0Ci0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB6aXBUb1NhcihJbnB1dFN0cmVhbSB6aXBwZWRJbnB1dFN0cmVhbSwgYm9vbGVhbiBjbG9zZUluLCBPdXRwdXRTdHJlYW0gc2FyZWRPdXRwdXRTdHJlYW0sIGJvb2xlYW4gY2xvc2VPdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXppcFRvU2FyTm9DbG9zZSh6aXBwZWRJbnB1dFN0cmVhbSwgc2FyZWRPdXRwdXRTdHJlYW0pOwotCi0JCWlmIChjbG9zZUluKQotCQkJemlwcGVkSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJaWYgKGNsb3NlT3V0KQotCQkJc2FyZWRPdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2FyRmlsZQotCSAqIEBwYXJhbSB6aXBGaWxlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXJUb1ppcChGaWxlIHNhckZpbGUsIEZpbGUgemlwRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gc2FyZWRJbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oc2FyRmlsZSkpOwotCQlPdXRwdXRTdHJlYW0gemlwcGVkT3V0cHV0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHppcEZpbGUpKTsKLQotCQlzYXJUb1ppcChzYXJlZElucHV0U3RyZWFtLCB6aXBwZWRPdXRwdXRTdHJlYW0pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzYXJlZElucHV0U3RyZWFtCi0JICogQHBhcmFtIHppcHBlZE91dHB1dFN0cmVhbQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2FyVG9aaXAoSW5wdXRTdHJlYW0gc2FyZWRJbnB1dFN0cmVhbSwgT3V0cHV0U3RyZWFtIHppcHBlZE91dHB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc2FyVG9aaXAoc2FyZWRJbnB1dFN0cmVhbSwgdHJ1ZSwgemlwcGVkT3V0cHV0U3RyZWFtLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2FyZWRJbnB1dFN0cmVhbQotCSAqIEBwYXJhbSBjbG9zZUluCi0JICogQHBhcmFtIHppcHBlZE91dHB1dFN0cmVhbQotCSAqIEBwYXJhbSBjbG9zZU91dAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2FyVG9aaXAoSW5wdXRTdHJlYW0gc2FyZWRJbnB1dFN0cmVhbSwgYm9vbGVhbiBjbG9zZUluLCBPdXRwdXRTdHJlYW0gemlwcGVkT3V0cHV0U3RyZWFtLCBib29sZWFuIGNsb3NlT3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzYXJUb1ppcE5vQ2xvc2Uoc2FyZWRJbnB1dFN0cmVhbSwgemlwcGVkT3V0cHV0U3RyZWFtKTsKLQotCQlpZiAoY2xvc2VJbikKLQkJCXNhcmVkSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJaWYgKGNsb3NlT3V0KQotCQkJemlwcGVkT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHppcHBlZElucHV0U3RyZWFtCi0JICogQHBhcmFtIHNhcmVkT3V0cHV0U3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgemlwVG9TYXJOb0Nsb3NlKElucHV0U3RyZWFtIHppcHBlZElucHV0U3RyZWFtLCBPdXRwdXRTdHJlYW0gc2FyZWRPdXRwdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJWmlwSW5wdXRTdHJlYW0gemlwSW5wdXRTdHJlYW0gPSBuZXcgWmlwSW5wdXRTdHJlYW0oemlwcGVkSW5wdXRTdHJlYW0pOwotCQlTYXJPdXRwdXRTdHJlYW0gc2FyT3V0cHV0U3RyZWFtID0gbmV3IFNhck91dHB1dFN0cmVhbShzYXJlZE91dHB1dFN0cmVhbSk7Ci0KLQkJWmlwRW50cnkgemlwRW50cnk7Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0JCXdoaWxlICgoemlwRW50cnkgPSB6aXBJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBpc1ppcCA9IGlzWmlwKHppcEVudHJ5KTsKLQkJCVNhckVudHJ5IHNhckVudHJ5ID0gbmV3IFNhckVudHJ5KHppcEVudHJ5LCBpc1ppcCk7Ci0JCQlzYXJPdXRwdXRTdHJlYW0ucHV0TmV4dEVudHJ5KHNhckVudHJ5KTsKLQkJCWlmIChpc1ppcCkgewotCQkJCXppcFRvU2FyTm9DbG9zZSh6aXBJbnB1dFN0cmVhbSwgc2FyT3V0cHV0U3RyZWFtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHJlYWQ7Ci0JCQkJd2hpbGUgKChyZWFkID0gemlwSW5wdXRTdHJlYW0ucmVhZChidWYpKSAhPSAtMSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29udGVudDogIiArIG5ldyBTdHJpbmcoYnVmLCAwLCByZWFkKSk7Ci0JCQkJCX0KLQkJCQkJc2FyT3V0cHV0U3RyZWFtLndyaXRlKGJ1ZiwgMCwgcmVhZCk7Ci0JCQkJfQotCQkJfQotCQkJemlwSW5wdXRTdHJlYW0uY2xvc2VFbnRyeSgpOwotCQkJc2FyT3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsKLQkJfQotCQlzYXJPdXRwdXRTdHJlYW0uZmluaXNoKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNhcmVkSW5wdXRTdHJlYW0KLQkgKiBAcGFyYW0gemlwcGVkT3V0cHV0U3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgc2FyVG9aaXBOb0Nsb3NlKElucHV0U3RyZWFtIHNhcmVkSW5wdXRTdHJlYW0sIE91dHB1dFN0cmVhbSB6aXBwZWRPdXRwdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJU2FySW5wdXRTdHJlYW0gc2FySW5wdXRTdHJlYW0gPSBuZXcgU2FySW5wdXRTdHJlYW0oc2FyZWRJbnB1dFN0cmVhbSk7Ci0JCVppcE91dHB1dFN0cmVhbSB6aXBPdXRwdXRTdHJlYW0gPSBuZXcgWmlwT3V0cHV0U3RyZWFtKHppcHBlZE91dHB1dFN0cmVhbSk7Ci0KLQkJU2FyRW50cnkgc2FyRW50cnk7Ci0JCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtCVUZGRVJfU0laRV07Ci0JCXdoaWxlICgoc2FyRW50cnkgPSBzYXJJbnB1dFN0cmVhbS5nZXROZXh0RW50cnkoKSkgIT0gbnVsbCkgewotCQkJWmlwRW50cnkgemlwRW50cnkgPSBuZXcgWmlwRW50cnkoc2FyRW50cnkpOwotCQkJemlwT3V0cHV0U3RyZWFtLnB1dE5leHRFbnRyeSh6aXBFbnRyeSk7Ci0JCQlpZiAoc2FyRW50cnkuaXNaaXAoKSkgewotCQkJCXNhclRvWmlwTm9DbG9zZShzYXJJbnB1dFN0cmVhbSwgemlwT3V0cHV0U3RyZWFtKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHJlYWQ7Ci0JCQkJd2hpbGUgKChyZWFkID0gc2FySW5wdXRTdHJlYW0ucmVhZChidWYpKSAhPSAtMSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ29udGVudDogIiArIG5ldyBTdHJpbmcoYnVmLCAwLCByZWFkKSk7Ci0JCQkJCX0KLQkJCQkJemlwT3V0cHV0U3RyZWFtLndyaXRlKGJ1ZiwgMCwgcmVhZCk7Ci0JCQkJfQotCQkJfQotCQkJc2FySW5wdXRTdHJlYW0uY2xvc2VFbnRyeSgpOwotCQkJemlwT3V0cHV0U3RyZWFtLmNsb3NlRW50cnkoKTsKLQkJfQotCi0JCXppcE91dHB1dFN0cmVhbS5maW5pc2goKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzWmlwKFppcEVudHJ5IHppcEVudHJ5KSB7Ci0JCVN0cmluZyBuYW1lID0gemlwRW50cnkuZ2V0TmFtZSgpLnRvTG93ZXJDYXNlKCk7Ci0JCXJldHVybiBuYW1lLmVuZHNXaXRoKCIuemlwIikgfHwgbmFtZS5lbmRzV2l0aCgiLmphciIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmJiN2EyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjOWEzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVyczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMTQ1ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0jVHVlIEFwciAwOCAxMToxMzoyNyBFRFQgMjAwOAotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTYxMDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogcDIgT3B0aW1pemVycyBUZXN0IFBsdWctaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycztzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uO2J1bmRsZS12ZXJzaW9uPSIzLjQuMCIsCi0gb3JnLmp1bml0O2J1bmRsZS12ZXJzaW9uPSIzLjguMiIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0Lm9wdGltaXplcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5wcm9jZXNzb3JzLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuc2FyCi1JbXBvcnQtUGFja2FnZTogaWUud29tYmF0LmpiZGlmZiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0Lm9wdGltaXplcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmphcmRlbHRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5qYmRpZmYsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLnBhY2syMDAsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLmphcmRlbHRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5qYmRpZmYsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLnBhY2syMDAsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLnZlcmlmaWVyLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuc2FyLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjQuMCIKLUJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMuVGVzdEFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MzJjNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgdGVzdERhdGEvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk2NDYzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0JPGV4dGVuc2lvbgotCQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nU3RlcHMiCi0JCQlpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLkJ5dGVTaGlmdGVyIj4KLQkJPHN0ZXAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLkJ5dGVTaGlmdGVyIi8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0JCQlwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmdTdGVwcyIKLQkJCWlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuQWRkZXIiPgotCQk8c3RlcCBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuQWRkZXIiLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJCXBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZ1N0ZXBzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5NdWx0aXBsaWVyIj4KLQkJPHN0ZXAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLk11bHRpcGxpZXIiLz4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3Qvb3B0aW1pemVycy9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3Qvb3B0aW1pemVycy9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTRiZTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L29wdGltaXplcnMvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAJSUJNIENvcnBvcmF0aW9uIC0gb25nb2luZyBkZXZlbG9wbWVudAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3Qub3B0aW1pemVyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFBlcmZvcm1zIGFsbCBhdXRvbWF0ZWQgZGlyZWN0b3IgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSkJEaWZmU3RlcFRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSkJEaWZmWmlwU3RlcFRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGFjazIwME9wdGltaXplclRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSmFyRGVsdGFPcHRpbWl6ZXJUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJ1ZzIwOTIzM1Rlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3Qvb3B0aW1pemVycy9CdWcyMDkyMzNUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9vcHRpbWl6ZXJzL0J1ZzIwOTIzM1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdhYmM1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9vcHRpbWl6ZXJzL0J1ZzIwOTIzM1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5vcHRpbWl6ZXJzOwotCi1pbXBvcnQgaWUud29tYmF0LmpiZGlmZi5KQkRpZmY7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMuVGVzdERhdGE7Ci0KLS8qKgotICogLi4uIDxjb2RlPkJ1ZzIwOTIzM1Rlc3Q8L2NvZGU+IC4uLgotICovCi1wdWJsaWMgY2xhc3MgQnVnMjA5MjMzVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8vCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZVRlc3REYXRhRGlmZigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8JCUZpbGUgcHJlZGVjZXNzb3IgPSBUZXN0RGF0YS5nZXRUZW1wRmlsZSgic2FyIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5zYXIiKTsKLQkvLwkJRmlsZSBjdXJyZW50ID0gVGVzdERhdGEuZ2V0VGVtcEZpbGUoInNhciIsICJvcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAuc2FyIik7Ci0JLy8JCUZpbGUgZGlmZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIm9yZy5lY2xpcHNlLmpkdF8zLjIuMC0zLjMuMH4iLCAiLmpiZGlmZiIpOwotCS8vCQlKQkRpZmYuYnNkaWZmKHByZWRlY2Vzc29yLCBjdXJyZW50LCBkaWZmKTsKLQkvLwl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZkpkdDMyU2FyVG9KZHQzM1NhcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJSW5wdXRTdHJlYW0gY3VycmVudCA9IFRlc3REYXRhLmdldCgic2FyIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5zYXIiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGN1cnJlbnRCUyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oY3VycmVudCwgdHJ1ZSwgY3VycmVudEJTLCB0cnVlKTsKLQkJYnl0ZVtdIGN1cnJlbnRCeXRlcyA9IGN1cnJlbnRCUy50b0J5dGVBcnJheSgpOwotCi0JCUlucHV0U3RyZWFtIHByZWRlY2Vzc29yID0gVGVzdERhdGEuZ2V0KCJzYXIiLCAib3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLnNhciIpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcHJlZGVjZXNzb3JCUyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0ocHJlZGVjZXNzb3IsIHRydWUsIHByZWRlY2Vzc29yQlMsIHRydWUpOwotCQlieXRlW10gcHJlZGVjZXNzb3JCeXRlcyA9IHByZWRlY2Vzc29yQlMudG9CeXRlQXJyYXkoKTsKLQotCQlieXRlW10gYWN0dWFsQnl0ZXMgPSBKQkRpZmYuYnNkaWZmKHByZWRlY2Vzc29yQnl0ZXMsIHByZWRlY2Vzc29yQnl0ZXMubGVuZ3RoLCBjdXJyZW50Qnl0ZXMsIGN1cnJlbnRCeXRlcy5sZW5ndGgpOwotCi0JCUlucHV0U3RyZWFtIGV4cGVjdGVkID0gVGVzdERhdGEuZ2V0KCJvcHRpbWl6ZXJzIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjIuMC0zLjMuMC5qYmRpZmYiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGV4cGVjdGVkQlMgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGV4cGVjdGVkLCB0cnVlLCBleHBlY3RlZEJTLCB0cnVlKTsKLQkJYnl0ZVtdIGV4cGVjdGVkQnl0ZXMgPSBleHBlY3RlZEJTLnRvQnl0ZUFycmF5KCk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCJEaWZmZXJlbnQgbGVuZ3Rocy4iLCBleHBlY3RlZEJ5dGVzLmxlbmd0aCwgYWN0dWFsQnl0ZXMubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZSgiRGlmZmVyZW50IGJ5dGVzLiIsIEFycmF5cy5lcXVhbHMoZXhwZWN0ZWRCeXRlcywgYWN0dWFsQnl0ZXMpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9vcHRpbWl6ZXJzL0pCRGlmZlN0ZXBUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9vcHRpbWl6ZXJzL0pCRGlmZlN0ZXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NTAxZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3Qvb3B0aW1pemVycy9KQkRpZmZTdGVwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0Lm9wdGltaXplcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmpiZGlmZi5KQkRpZmZTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucHJvY2Vzc29ycy5BcnRpZmFjdFJlcG9zaXRvcnlNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy5UZXN0RGF0YTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBUZXN0IHRoZSA8Y29kZT5KQkRpZmZTdGVwVGVzdDwvY29kZT4gcHJvY2Vzc2luZyBzdGVwLgotICovCi1wdWJsaWMgY2xhc3MgSkJEaWZmU3RlcFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvLwlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVUZXN0RGF0YUV4ZTMyVG8zMygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8JCUZpbGUgZXhlMzIgPSBUZXN0RGF0YS5nZXRUZW1wRmlsZSgib3B0aW1pemVycyIsICJlY2xpcHNlLTMuMi5leGUiKTsKLQkvLwkJRmlsZSBleGUzMyA9IFRlc3REYXRhLmdldFRlbXBGaWxlKCJvcHRpbWl6ZXJzIiwgImVjbGlwc2UtMy4zLmV4ZSIpOwotCS8vCQlGaWxlIGRpZmYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJlY2xpcHNlLTMuMi0zLjN+IiwgIi5qYmRpZmYiKTsKLQkvLwkJSkJEaWZmLmJzZGlmZihleGUzMiwgZXhlMzMsIGRpZmYpOwotCS8vCX0KLQotCS8qKgotCSAqIFRlc3QgZGlmZmluZyB0aGUgbGF1bmNoZXIuCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REaWZmRWNsaXBzZUV4ZTMydG8zMygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvTW9jayA9IEFydGlmYWN0UmVwb3NpdG9yeU1vY2suZ2V0TW9jaygidGVzdERhdGEvb3B0aW1pemVycy9lY2xpcHNlLTMuMi5leGUiKTsKLQkJTW9ja2FibGVKQkRpZmZTdGVwIGRpZmZlciA9IG5ldyBNb2NrYWJsZUpCRGlmZlN0ZXAocmVwb01vY2spOwotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3Igc3RlcERlc2NyaXB0b3IgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKCJpZCIsICJucyxjbCxpZDEsMS4wIiwgdHJ1ZSk7Ci0JCUlBcnRpZmFjdEtleSBrZXkgPSBuZXcgQXJ0aWZhY3RLZXkoImNsIiwgImlkMSIsIG5ldyBWZXJzaW9uKCIxLjEiKSk7Ci0JCUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvcihrZXkpOwotCQlkaWZmZXIuaW5pdGlhbGl6ZShzdGVwRGVzY3JpcHRvciwgZGVzY3JpcHRvcik7Ci0KLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlkaWZmZXIubGluayhkZXN0aW5hdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBUZXN0RGF0YS5nZXQoIm9wdGltaXplcnMiLCAiZWNsaXBzZS0zLjMuZXhlIik7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBkaWZmZXIsIHRydWUpOwotCi0JCWlucHV0U3RyZWFtID0gVGVzdERhdGEuZ2V0KCJvcHRpbWl6ZXJzIiwgImVjbGlwc2UtMy4yLTMuMy5qYmRpZmYiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGV4cGVjdGVkID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dFN0cmVhbSwgdHJ1ZSwgZXhwZWN0ZWQsIHRydWUpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQudG9CeXRlQXJyYXkoKSwgZGVzdGluYXRpb24udG9CeXRlQXJyYXkoKSkpOwotCX0KLQotCS8qKgotCSAqIE5lZWQgdG8gaW5qZWN0IGEgcmVwb3NpdG9yeSEKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrYWJsZUpCRGlmZlN0ZXAgZXh0ZW5kcyBKQkRpZmZTdGVwIHsKLQkJcHVibGljIE1vY2thYmxlSkJEaWZmU3RlcChJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKLQkJCXN1cGVyKHJlcG9zaXRvcnkpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9vcHRpbWl6ZXJzL0pCRGlmZlppcFN0ZXBUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9vcHRpbWl6ZXJzL0pCRGlmZlppcFN0ZXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmYjcyNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3Qvb3B0aW1pemVycy9KQkRpZmZaaXBTdGVwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0Lm9wdGltaXplcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzLmpiZGlmZi5KQkRpZmZaaXBTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucHJvY2Vzc29ycy5BcnRpZmFjdFJlcG9zaXRvcnlNb2NrOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy5UZXN0RGF0YTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBUZXN0IHRoZSA8Y29kZT5KQkRpZmZaaXBUZXN0PC9jb2RlPiBwcm9jZXNzaW5nIHN0ZXAuCi0gKi8KLXB1YmxpYyBjbGFzcyBKQkRpZmZaaXBTdGVwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8qKgotCSAqIFRlc3QgZGlmZmluZyB0aGUgPGI+bm9ybWFsaXplZDwvYj4gamFycy4gVGhpcyBpcyBpbmRpY2F0ZWQgYnkgdGhlIGV4dGVuc2lvbiAiLm5qYXIiLgotCSAqIAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0RGlmZkpkdDMydG8zMygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb01vY2sgPSBBcnRpZmFjdFJlcG9zaXRvcnlNb2NrLmdldE1vY2soInRlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLm5qYXIiKTsKLQkJTW9ja2FibGVKQkRpZmZaaXBTdGVwIGRpZmZlciA9IG5ldyBNb2NrYWJsZUpCRGlmZlppcFN0ZXAocmVwb01vY2spOwotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3Igc3RlcERlc2NyaXB0b3IgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKCJpZCIsICJucyxjbCxpZDEsMS4wIiwgdHJ1ZSk7Ci0JCUlBcnRpZmFjdEtleSBrZXkgPSBuZXcgQXJ0aWZhY3RLZXkoImNsIiwgImlkMSIsIG5ldyBWZXJzaW9uKCIxLjEiKSk7Ci0JCUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvcihrZXkpOwotCQlkaWZmZXIuaW5pdGlhbGl6ZShzdGVwRGVzY3JpcHRvciwgZGVzY3JpcHRvcik7Ci0KLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlkaWZmZXIubGluayhkZXN0aW5hdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBUZXN0RGF0YS5nZXQoIm9wdGltaXplcnMiLCAib3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNy0xMzAwLm5qYXIiKTsKLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oaW5wdXRTdHJlYW0sIHRydWUsIGRpZmZlciwgdHJ1ZSk7Ci0KLQkJaW5wdXRTdHJlYW0gPSBUZXN0RGF0YS5nZXQoIm9wdGltaXplcnMiLCAib3JnLmVjbGlwc2UuamR0XzMuMi4wLTMuMy4wLmpiZGlmZiIpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXhwZWN0ZWQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBleHBlY3RlZCwgdHJ1ZSk7Ci0KLQkJYXNzZXJ0VHJ1ZSgiRGlmZmVyZW50IGRpZmYgYnl0ZXMuIiwgQXJyYXlzLmVxdWFscyhleHBlY3RlZC50b0J5dGVBcnJheSgpLCBkZXN0aW5hdGlvbi50b0J5dGVBcnJheSgpKSk7Ci0JfQotCi0JLyoqCi0JICogTmVlZCB0byBpbmplY3QgYSByZXBvc2l0b3J5IQotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1vY2thYmxlSkJEaWZmWmlwU3RlcCBleHRlbmRzIEpCRGlmZlppcFN0ZXAgewotCQlwdWJsaWMgTW9ja2FibGVKQkRpZmZaaXBTdGVwKElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQkJc3VwZXIocmVwb3NpdG9yeSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9vcHRpbWl6ZXJzL0phckRlbHRhT3B0aW1pemVyVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3Qvb3B0aW1pemVycy9KYXJEZWx0YU9wdGltaXplclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ2NTk1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9vcHRpbWl6ZXJzL0phckRlbHRhT3B0aW1pemVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIAlJQk0gQ29ycG9yYXRpb24gLSBvbmdvaW5nIGRldmVsb3BtZW50Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5vcHRpbWl6ZXJzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5qYXJkZWx0YS5KYXJEZWx0YU9wdGltaXplclN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5wcm9jZXNzb3JzLkFydGlmYWN0UmVwb3NpdG9yeU1vY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzLlRlc3REYXRhOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFRlc3QgdGhlIDxjb2RlPkphckRlbHRhPC9jb2RlPiBwcm9jZXNzaW5nIHN0ZXAuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXJEZWx0YU9wdGltaXplclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvLwlwdWJsaWMgdm9pZCB0ZXN0UHJlcGFyZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb01vY2sgPSBBcnRpZmFjdFJlcG9zaXRvcnlNb2NrLmdldE1vY2soInRlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMS5qYXIiKTsKLQkvLwkJUHJvY2Vzc2luZ1N0ZXAgc3RlcCA9IG5ldyBNb2NrYWJsZUphckRlbHRhT3B0aW1pemVyU3RlcChyZXBvTW9jayk7Ci0JLy8JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBzdGVwRGVzY3JpcHRvciA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoImlkIiwgIm5zLGNsLGlkMSwxLjAuMC4xIiwgdHJ1ZSk7Ci0JLy8JCUlBcnRpZmFjdEtleSBrZXkgPSBuZXcgQXJ0aWZhY3RLZXkoIm5zIiwgImNsIiwgImlkMSIsIG5ldyBWZXJzaW9uKCIxLjAuMC4yIikpOwotCS8vCQlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBBcnRpZmFjdERlc2NyaXB0b3Ioa2V5KTsKLQkvLwkJc3RlcC5pbml0aWFsaXplKHN0ZXBEZXNjcmlwdG9yLCBkZXNjcmlwdG9yKTsKLQkvLwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCS8vCQlzdGVwLmxpbmsoZGVzdGluYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCS8vCi0JLy8JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoInRlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMi5qYXIiKS5vcGVuU3RyZWFtKCk7Ci0JLy8JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBzdGVwLCB0cnVlKTsKLQkvLwkJZGVzdGluYXRpb24uY2xvc2UoKTsKLQkvLwotCS8vCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkZXN0aW5hdGlvbi50b0J5dGVBcnJheSgpKTsKLQkvLwkJRmlsZU91dHB1dFN0cmVhbSBmaWxlID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oImQ6L2phcmRlbHRhLmphciIpOwotCS8vCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dFN0cmVhbSwgdHJ1ZSwgZmlsZSwgdHJ1ZSk7Ci0JLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdE9wdGltaXphdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb01vY2sgPSBBcnRpZmFjdFJlcG9zaXRvcnlNb2NrLmdldE1vY2soInRlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMS5qYXIiKTsKLQkJUHJvY2Vzc2luZ1N0ZXAgc3RlcCA9IG5ldyBNb2NrYWJsZUphckRlbHRhT3B0aW1pemVyU3RlcChyZXBvTW9jayk7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBzdGVwRGVzY3JpcHRvciA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoImlkIiwgIm5zLGNsLGlkMSwxLjAuMC4xIiwgdHJ1ZSk7Ci0JCUlBcnRpZmFjdEtleSBrZXkgPSBuZXcgQXJ0aWZhY3RLZXkoImNsIiwgImlkMSIsIG5ldyBWZXJzaW9uKCIxLjAuMC4yIikpOwotCQlBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBBcnRpZmFjdERlc2NyaXB0b3Ioa2V5KTsKLQkJc3RlcC5pbml0aWFsaXplKHN0ZXBEZXNjcmlwdG9yLCBkZXNjcmlwdG9yKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlzdGVwLmxpbmsoZGVzdGluYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gVGVzdERhdGEuZ2V0KCJvcHRpbWl6ZXJzIiwgInRlc3RkYXRhXzEuMC4wLjIuamFyIik7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBzdGVwLCB0cnVlKTsKLQkJZGVzdGluYXRpb24uY2xvc2UoKTsKLQotCQlpbnB1dFN0cmVhbSA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJ0ZXN0ZGF0YV8xLjAuMC4xLTIuamFyIik7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHBlY3RlZCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oaW5wdXRTdHJlYW0sIHRydWUsIGV4cGVjdGVkLCB0cnVlKTsKLQotCQlaaXBJbnB1dFN0cmVhbSBleHBlY3RlZEphciA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZXhwZWN0ZWQudG9CeXRlQXJyYXkoKSkpOwotCQlaaXBJbnB1dFN0cmVhbSB0ZXN0SmFyID0gbmV3IFppcElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkZXN0aW5hdGlvbi50b0J5dGVBcnJheSgpKSk7Ci0JCVRlc3REYXRhLmFzc2VydEVxdWFscyhleHBlY3RlZEphciwgdGVzdEphcik7Ci0JCWV4cGVjdGVkSmFyLmNsb3NlKCk7Ci0JCXRlc3RKYXIuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBOZWVkIHRvIGluamVjdCBhIHJlcG9zaXRvcnkhCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja2FibGVKYXJEZWx0YU9wdGltaXplclN0ZXAgZXh0ZW5kcyBKYXJEZWx0YU9wdGltaXplclN0ZXAgewotCQlwdWJsaWMgTW9ja2FibGVKYXJEZWx0YU9wdGltaXplclN0ZXAoSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCQlzdXBlcihyZXBvc2l0b3J5KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L29wdGltaXplcnMvUGFjazIwME9wdGltaXplclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L29wdGltaXplcnMvUGFjazIwME9wdGltaXplclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwMWUxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9vcHRpbWl6ZXJzL1BhY2syMDBPcHRpbWl6ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5vcHRpbWl6ZXJzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3Qub3B0aW1pemVycy5wYWNrMjAwLlBhY2syMDBPcHRpbWl6ZXJTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMuVGVzdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgUGFjazIwME9wdGltaXplclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgUGFjazIwME9wdGltaXplclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIFBhY2syMDBPcHRpbWl6ZXJUZXN0KCkgewotCQlzdXBlcigiIik7Ci0JfQotCi0JLy8JcHVibGljIHZvaWQgdGVzdFByZXBhcmUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCS8vCQkvLyBTZXR1cCB0aGUgc3RlcAotCS8vCQlQcm9jZXNzaW5nU3RlcCBzdGVwID0gbmV3IFBhY2syMDBPcHRpbWl6ZXJTdGVwKCk7Ci0JLy8JCUZpbGVPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24gPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgiYzovcGFja2VkLnBhY2suZ3oiKTsKLQkvLwkJc3RlcC5saW5rKGRlc3RpbmF0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkvLwotCS8vCQkvLyBkcml2ZSB0aGUgc291cmNlIGRhdGEgdGhyb3VnaCB0aGUgc3RlcAotCS8vCQlCdW5kbGUgYnVuZGxlID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCk7Ci0JLy8JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gYnVuZGxlLmdldEVudHJ5KCJ0ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1LmphciIpLm9wZW5TdHJlYW0oKTsKLQkvLwkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oaW5wdXRTdHJlYW0sIHRydWUsIHN0ZXAsIHRydWUpOwotCS8vCi0JLy8JCWRlc3RpbmF0aW9uLmNsb3NlKCk7Ci0JLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhY2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTZXR1cCB0aGUgc3RlcAotCQlQcm9jZXNzaW5nU3RlcCBzdGVwID0gbmV3IFBhY2syMDBPcHRpbWl6ZXJTdGVwKCk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc3RlcC5saW5rKGRlc3RpbmF0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQkvLyBkcml2ZSB0aGUgc291cmNlIGRhdGEgdGhyb3VnaCB0aGUgc3RlcAotCQlCdW5kbGUgYnVuZGxlID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gYnVuZGxlLmdldEVudHJ5KCJ0ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1LmphciIpLm9wZW5TdHJlYW0oKTsKLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oaW5wdXRTdHJlYW0sIHRydWUsIHN0ZXAsIHRydWUpOwotCi0JCWFzc2VydFRydWUoIkZhaWx1cmU6ICIgKyBzdGVwLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSwgc3RlcC5nZXRTdGF0dXMoKS5pc09LKCkpOwotCi0JCS8vIEdldCB0aGUgdGVzdCBkYXRhLiBUaGUgU3VuIDEuNi4wXzAxIEpSRSBwcm9kdWNlcyBhIGRpZmZlcmVudCBwYWNrZWQgZmlsZQotCQkvLyB0aGVuIHRoZSBJQk0gVjUgSlJFLCBzbyBib3RoIHZlcnNpb25zIG9mIHRoZSB0ZXN0IGRhdGEgYXJlIG1haW50YWluZWQuCi0JCS8vIFRPRE86IGludmVzdGlnYXRlIHRoaXM/IElzIHRoZSBkaWZmZXJlbmNlIHNwdXJpb3VzPyBBcmUgdGhlcmUgZGlmZmVyZW5jZXMKLQkJLy8JCSBpbiB0aGUgcGFjazIwMCByZXN1bHRzIGZvciBvdGhlciBKUkVzPyBEbyB3ZSBuZWVkIGEgbW9yZSBnZW5lcmFsCi0JCS8vCQkgc29sdXRpb24gdG8gdGhlIHByb2JsZW0/Ci0JCVN0cmluZyBqYXZhVmVyc2lvbiA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS52ZXJzaW9uIik7Ci0JCWJvb2xlYW4gaXMxXzYgPSBqYXZhVmVyc2lvbi5jb21wYXJlVG8oIjEuNiIpID4gMDsKLQotCQlpbnB1dFN0cmVhbSA9IGJ1bmRsZS5nZXRFbnRyeShpczFfNiA/ICJ0ZXN0RGF0YS9vcHRpbWl6ZXJzLzFfNi9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIucGFjay5neiIgOiAidGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIucGFjay5neiIpLm9wZW5TdHJlYW0oKTsKLQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXhwZWN0ZWQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBleHBlY3RlZCwgdHJ1ZSk7Ci0KLQkJLy8gQ29tcGFyZQotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQudG9CeXRlQXJyYXkoKSwgZGVzdGluYXRpb24udG9CeXRlQXJyYXkoKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3Byb2Nlc3NvcnMvQWxsVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3Byb2Nlc3NvcnMvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI2ZDVmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucHJvY2Vzc29yczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFBlcmZvcm1zIGFsbCBhdXRvbWF0ZWQgZGlyZWN0b3IgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSkJQYXRjaFN0ZXBUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEpCUGF0Y2haaXBTdGVwVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShKYXJEZWx0YVByb2Nlc3NvclRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGFjazIwMFByb2Nlc3NvclRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL0FydGlmYWN0UmVwb3NpdG9yeU1vY2suamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3Byb2Nlc3NvcnMvQXJ0aWZhY3RSZXBvc2l0b3J5TW9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjkzOWFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3Byb2Nlc3NvcnMvQXJ0aWZhY3RSZXBvc2l0b3J5TW9jay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnByb2Nlc3NvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzLlRlc3RBY3RpdmF0b3I7Ci0KLS8qKgotICogTW9jayB0aGUgZ2V0QXJ0aWZhY3QoKSBuZWVkZWQgdG8gbG9jYXRlIHRoZSBwcmVkZWNlc3Nvci4KLSAqLwotcHVibGljIGNsYXNzIEFydGlmYWN0UmVwb3NpdG9yeU1vY2sgaW1wbGVtZW50cyBJbnZvY2F0aW9uSGFuZGxlciB7Ci0KLQlwcml2YXRlIFN0cmluZyBhcnRpZmFjdFJlc291cmNlOwotCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGdldE1vY2soU3RyaW5nIGFydGlmYWN0UmVzb3VyY2UpIHsKLQkJcmV0dXJuIChJQXJ0aWZhY3RSZXBvc2l0b3J5KSBQcm94eS5uZXdQcm94eUluc3RhbmNlKElBcnRpZmFjdFJlcG9zaXRvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwgbmV3IENsYXNzW10ge0lBcnRpZmFjdFJlcG9zaXRvcnkuY2xhc3N9LCBuZXcgQXJ0aWZhY3RSZXBvc2l0b3J5TW9jayhhcnRpZmFjdFJlc291cmNlKSk7Ci0JfQotCi0JcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnlNb2NrKFN0cmluZyBhcnRpZmFjdFJlc291cmNlKSB7Ci0JCXRoaXMuYXJ0aWZhY3RSZXNvdXJjZSA9IGFydGlmYWN0UmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IHByb3h5LCBNZXRob2QgbWV0aG9kLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJaWYgKCFtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZ2V0QXJ0aWZhY3QiKSkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHVzYWdlISIpOwotCi0JCXJldHVybiBnZXRBcnRpZmFjdCgoSUFydGlmYWN0RGVzY3JpcHRvcikgYXJnc1swXSwgKE91dHB1dFN0cmVhbSkgYXJnc1sxXSwgKElQcm9ncmVzc01vbml0b3IpIGFyZ3NbMl0pOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyBnZXRBcnRpZmFjdChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtOwotCQl0cnkgewotCQkJaW5wdXRTdHJlYW0gPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeShhcnRpZmFjdFJlc291cmNlKS5vcGVuU3RyZWFtKCk7Ci0JCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dFN0cmVhbSwgdHJ1ZSwgZGVzdGluYXRpb24sIHRydWUpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFRlc3RBY3RpdmF0b3IuUEksICI6LSgiLCBlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL0pCUGF0Y2hTdGVwVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9KQlBhdGNoU3RlcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdlZWU1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL0pCUGF0Y2hTdGVwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnByb2Nlc3NvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLmpiZGlmZi5KQlBhdGNoU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5BcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMuVGVzdERhdGE7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogVGVzdCB0aGUgPGNvZGU+SkJQYXRjaFN0ZXA8L2NvZGU+Ci0gKgotICovCi1wdWJsaWMgY2xhc3MgSkJQYXRjaFN0ZXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHZvaWQgdGVzdFBhdGNoRWNsaXBzZUV4ZTMydG8zMygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb01vY2sgPSBBcnRpZmFjdFJlcG9zaXRvcnlNb2NrLmdldE1vY2soInRlc3REYXRhL29wdGltaXplcnMvZWNsaXBzZS0zLjIuZXhlIik7Ci0JCVByb2Nlc3NpbmdTdGVwIHBhdGNoZXIgPSBuZXcgTW9ja2FibGVKQlBhdGNoU3RlcChyZXBvTW9jayk7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigiaWQiLCAibnMsY2wsaWQxLDEuMCIsIHRydWUpOwotCQlJQXJ0aWZhY3RLZXkga2V5ID0gbmV3IEFydGlmYWN0S2V5KCJjbCIsICJpZDEiLCBuZXcgVmVyc2lvbigiMS4xIikpOwotCQlBcnRpZmFjdERlc2NyaXB0b3IgY29udGV4dCA9IG5ldyBBcnRpZmFjdERlc2NyaXB0b3Ioa2V5KTsKLQkJcGF0Y2hlci5pbml0aWFsaXplKGRlc2NyaXB0b3IsIGNvbnRleHQpOwotCi0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJcGF0Y2hlci5saW5rKGRlc3RpbmF0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJlY2xpcHNlLTMuMi0zLjMuamJkaWZmIik7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBwYXRjaGVyLCB0cnVlKTsKLQotCQlpbnB1dFN0cmVhbSA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJlY2xpcHNlLTMuMy5leGUiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGV4cGVjdGVkID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dFN0cmVhbSwgdHJ1ZSwgZXhwZWN0ZWQsIHRydWUpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZXhwZWN0ZWQudG9CeXRlQXJyYXkoKSwgZGVzdGluYXRpb24udG9CeXRlQXJyYXkoKSkpOwotCX0KLQotCS8qKgotCSAqIE5lZWQgdG8gaW5qZWN0IGEgcmVwb3NpdG9yeSEKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrYWJsZUpCUGF0Y2hTdGVwIGV4dGVuZHMgSkJQYXRjaFN0ZXAgewotCQlwdWJsaWMgTW9ja2FibGVKQlBhdGNoU3RlcChJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHsKLQkJCXN1cGVyLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL0pCUGF0Y2haaXBTdGVwVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9KQlBhdGNoWmlwU3RlcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI3M2U5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL0pCUGF0Y2haaXBTdGVwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnByb2Nlc3NvcnM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLmpiZGlmZi5KQlBhdGNoWmlwU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5BcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMuVGVzdERhdGE7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogVGVzdCB0aGUgPGNvZGU+SkJQYXRjaFppcFN0ZXA8L2NvZGU+IHByb2Nlc3Npbmcgc3RlcC4KLSAqLwotcHVibGljIGNsYXNzIEpCUGF0Y2haaXBTdGVwVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCS8vCS8qKgotCS8vCSAqIFRoaXMgaXMgYSBkaXNhYmxlZCAidW5pdCB0ZXN0IiB0aGF0IHdhcyB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkYXRhIG5lZWRlZCBmb3IgcmVhbCB0ZXN0LgotCS8vCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkvLwkgKi8KLQkvLwlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGVUZXN0RGF0YSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8KLQkvLwkJRmlsZSBzYXIzMiA9IFRlc3REYXRhLmdldFRlbXBGaWxlKCJzYXIiLCAib3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLnNhciIpOwotCS8vCQlGaWxlIHNhcjMzID0gVGVzdERhdGEuZ2V0VGVtcEZpbGUoInNhciIsICJvcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAuc2FyIik7Ci0JLy8KLQkvLwkJRmlsZSBkaWZmID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgib3JnLmVjbGlwc2UuamR0XzMuMi4wLTMuMy4wIiwgIi5qYmRpZmYiKTsKLQkvLwkJSkJEaWZmLmJzZGlmZihzYXIzMiwgc2FyMzMsIGRpZmYpOwotCS8vCX0KLQotCS8qKgotCSAqIFRlc3QgcGF0Y2hpbmcgdGhlIDxiPm5vcm1hbGl6ZWQ8L2I+IGphcnMuIFRoaXMgaXMgaW5kaWNhdGVkIGJ5IHRoZSBleHRlbnNpb24gIi5uamFyIi4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFBhdGNoT3JnRWNsaXBzZUpkdDMydG8zMygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvTW9jayA9IEFydGlmYWN0UmVwb3NpdG9yeU1vY2suZ2V0TW9jaygidGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5qZHRfMy4yLjAudjIwMDYwNjA1LTE0MDAubmphciIpOwotCQlQcm9jZXNzaW5nU3RlcCBwYXRjaGVyID0gbmV3IE1vY2thYmxlSkJQYXRjaFppcFN0ZXAocmVwb01vY2spOwotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoImlkIiwgIm5zLGNsLGlkMSwxLjAiLCB0cnVlKTsKLQkJSUFydGlmYWN0S2V5IGtleSA9IG5ldyBBcnRpZmFjdEtleSgiY2wiLCAiaWQxIiwgbmV3IFZlcnNpb24oIjEuMSIpKTsKLQkJQXJ0aWZhY3REZXNjcmlwdG9yIGNvbnRleHQgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSk7Ci0JCXBhdGNoZXIuaW5pdGlhbGl6ZShkZXNjcmlwdG9yLCBjb250ZXh0KTsKLQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCXBhdGNoZXIubGluayhkZXN0aW5hdGlvbiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0KLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBUZXN0RGF0YS5nZXQoIm9wdGltaXplcnMiLCAib3JnLmVjbGlwc2UuamR0XzMuMi4wLTMuMy4wLmpiZGlmZiIpOwotCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dFN0cmVhbSwgdHJ1ZSwgcGF0Y2hlciwgdHJ1ZSk7Ci0KLQkJaW5wdXRTdHJlYW0gPSBUZXN0RGF0YS5nZXQoIm9wdGltaXplcnMiLCAib3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNy0xMzAwLm5qYXIiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGV4cGVjdGVkID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dFN0cmVhbSwgdHJ1ZSwgZXhwZWN0ZWQsIHRydWUpOwotCi0JCWFzc2VydFRydWUoIkRpZmZlcmVudCByZXN1bHRpbmcgbmphci4iLCBBcnJheXMuZXF1YWxzKGV4cGVjdGVkLnRvQnl0ZUFycmF5KCksIGRlc3RpbmF0aW9uLnRvQnl0ZUFycmF5KCkpKTsKLQl9Ci0KLQkvKioKLQkgKiBOZWVkIHRvIGluamVjdCBhIHJlcG9zaXRvcnkhCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja2FibGVKQlBhdGNoWmlwU3RlcCBleHRlbmRzIEpCUGF0Y2haaXBTdGVwIHsKLQkJcHVibGljIE1vY2thYmxlSkJQYXRjaFppcFN0ZXAoSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5KSB7Ci0JCQlzdXBlci5yZXBvc2l0b3J5ID0gcmVwb3NpdG9yeTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9KYXJEZWx0YVByb2Nlc3NvclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3Byb2Nlc3NvcnMvSmFyRGVsdGFQcm9jZXNzb3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyMGQ3MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9KYXJEZWx0YVByb2Nlc3NvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCQljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5wcm9jZXNzb3JzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwSW5wdXRTdHJlYW07Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5qYXJkZWx0YS5KYXJEZWx0YVByb2Nlc3NvclN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzLlRlc3REYXRhOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgSmFyRGVsdGFQcm9jZXNzb3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIEphckRlbHRhUHJvY2Vzc29yVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSmFyRGVsdGFQcm9jZXNzb3JUZXN0KCkgewotCQlzdXBlcigiIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb2Nlc3NpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9Nb2NrID0gQXJ0aWZhY3RSZXBvc2l0b3J5TW9jay5nZXRNb2NrKCJ0ZXN0RGF0YS9vcHRpbWl6ZXJzL3Rlc3RkYXRhXzEuMC4wLjEuamFyIik7Ci0JCVByb2Nlc3NpbmdTdGVwIHN0ZXAgPSBuZXcgTW9ja2FibGVKYXJEZWx0YVByb2Nlc3NvclN0ZXAocmVwb01vY2spOwotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3Igc3RlcERlc2NyaXB0b3IgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKCJpZCIsICJucyxjbCxpZDEsMS4wLjAuMSIsIHRydWUpOwotCQlJQXJ0aWZhY3RLZXkga2V5ID0gbmV3IEFydGlmYWN0S2V5KCJjbCIsICJpZDEiLCBuZXcgVmVyc2lvbigiMS4wLjAuMiIpKTsKLQkJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSk7Ci0JCXN0ZXAuaW5pdGlhbGl6ZShzdGVwRGVzY3JpcHRvciwgZGVzY3JpcHRvcik7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJc3RlcC5saW5rKGRlc3RpbmF0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJ0ZXN0ZGF0YV8xLjAuMC4xLTIuamFyIik7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBzdGVwLCB0cnVlKTsKLQkJZGVzdGluYXRpb24uY2xvc2UoKTsKLQotCQlpbnB1dFN0cmVhbSA9IFRlc3REYXRhLmdldCgib3B0aW1pemVycyIsICJ0ZXN0ZGF0YV8xLjAuMC4yLmphciIpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXhwZWN0ZWQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBleHBlY3RlZCwgdHJ1ZSk7Ci0KLQkJWmlwSW5wdXRTdHJlYW0gZXhwZWN0ZWRKYXIgPSBuZXcgWmlwSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGV4cGVjdGVkLnRvQnl0ZUFycmF5KCkpKTsKLQkJWmlwSW5wdXRTdHJlYW0gdGVzdEphciA9IG5ldyBaaXBJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGVzdGluYXRpb24udG9CeXRlQXJyYXkoKSkpOwotCQlUZXN0RGF0YS5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRKYXIsIHRlc3RKYXIpOwotCQlleHBlY3RlZEphci5jbG9zZSgpOwotCQl0ZXN0SmFyLmNsb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogTmVlZCB0byBpbmplY3QgYSByZXBvc2l0b3J5IQotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE1vY2thYmxlSmFyRGVsdGFQcm9jZXNzb3JTdGVwIGV4dGVuZHMgSmFyRGVsdGFQcm9jZXNzb3JTdGVwIHsKLQkJcHVibGljIE1vY2thYmxlSmFyRGVsdGFQcm9jZXNzb3JTdGVwKElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMucmVwb3NpdG9yeSA9IHJlcG9zaXRvcnk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL1BhY2syMDBQcm9jZXNzb3JUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9wcm9jZXNzb3JzL1BhY2syMDBQcm9jZXNzb3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNzQ0MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcHJvY2Vzc29ycy9QYWNrMjAwUHJvY2Vzc29yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucHJvY2Vzc29yczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnByb2Nlc3NvcnMucGFjazIwMC5QYWNrMjAwUHJvY2Vzc29yU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzLlRlc3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIFBhY2syMDBQcm9jZXNzb3JUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIFBhY2syMDBQcm9jZXNzb3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBQYWNrMjAwUHJvY2Vzc29yVGVzdCgpIHsKLQkJc3VwZXIoIiIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVbnBhY2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTZXR1cCB0aGUgcHJvY2Vzc29yCi0JCVByb2Nlc3NpbmdTdGVwIHN0ZXAgPSBuZXcgUGFjazIwMFByb2Nlc3NvclN0ZXAoKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlzdGVwLmxpbmsoZGVzdGluYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCS8vIGRyaXZlIHRoZSBzb3VyY2UgZGF0YSB0aHJvdWdoIHRoZSBzdGVwCi0JCUJ1bmRsZSBidW5kbGUgPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBidW5kbGUuZ2V0RW50cnkoInRlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBfMS4wLjEwMC52MjAwNzEwMTUuamFyLnBhY2suZ3oiKS5vcGVuU3RyZWFtKCk7Ci0JCUZpbGVVdGlscy5jb3B5U3RyZWFtKGlucHV0U3RyZWFtLCB0cnVlLCBzdGVwLCB0cnVlKTsKLQotCQkvLyBHZXQgdGhlIHRlc3QgZGF0YQotCQlpbnB1dFN0cmVhbSA9IGJ1bmRsZS5nZXRFbnRyeSgidGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIiKS5vcGVuU3RyZWFtKCk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBleHBlY3RlZCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0oaW5wdXRTdHJlYW0sIHRydWUsIGV4cGVjdGVkLCB0cnVlKTsKLQotCQkvLyBDb21wYXJlCi0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhleHBlY3RlZC50b0J5dGVBcnJheSgpLCBkZXN0aW5hdGlvbi50b0J5dGVBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVucGFja0ZhaWxzQmVjYXVzZU9mWmVyb0xlbmd0aFBhY2tlZEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTZXR1cCB0aGUgcHJvY2Vzc29yCi0JCVByb2Nlc3NpbmdTdGVwIHN0ZXAgPSBuZXcgUGFjazIwMFByb2Nlc3NvclN0ZXAoKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlzdGVwLmxpbmsoZGVzdGluYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCS8vIGRyaXZlIHRoZSBzb3VyY2UgZGF0YSAoemVybyBsZW5ndGgpIHRocm91Z2ggdGhlIHN0ZXAKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pOwotCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dFN0cmVhbSwgdHJ1ZSwgc3RlcCwgdHJ1ZSk7Ci0KLQkJLy8gVGhpcyBtdXN0IGZhaWwsIGkuZS4gdGhlIHN0YXR1cyBpcyBub3Qgb2shCi0JCWFzc2VydEZhbHNlKHN0ZXAuZ2V0U3RhdHVzKCkuaXNPSygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9BZGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL0FkZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYjc4NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL0FkZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSogIElCTSAtIGNvbnRpbnVpbmcgZGV2ZWxvcG1lbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yOwotCi1wdWJsaWMgY2xhc3MgQWRkZXIgZXh0ZW5kcyBQcm9jZXNzaW5nU3RlcCB7Ci0KLQlwcm90ZWN0ZWQgaW50IG9wZXJhbmQ7Ci0KLQlwdWJsaWMgQWRkZXIoKSB7Ci0JCS8vIG5lZWRlZAotCX0KLQotCXB1YmxpYyBBZGRlcihpbnQgb3BlcmFuZCkgewotCQlzdXBlcigpOwotCQl0aGlzLm9wZXJhbmQgPSBvcGVyYW5kOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIElBcnRpZmFjdERlc2NyaXB0b3IgY29udGV4dCkgewotCQlzdXBlci5pbml0aWFsaXplKGRlc2NyaXB0b3IsIGNvbnRleHQpOwotCQl0cnkgewotCQkJb3BlcmFuZCA9IEludGVnZXIudmFsdWVPZihkZXNjcmlwdG9yLmdldERhdGEoKSkuaW50VmFsdWUoKTsKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCWludCBjb2RlID0gZGVzY3JpcHRvci5pc1JlcXVpcmVkKCkgPyBJU3RhdHVzLkVSUk9SIDogSVN0YXR1cy5JTkZPOwotCQkJc2V0U3RhdHVzKG5ldyBTdGF0dXMoY29kZSwgQWN0aXZhdG9yLklELCAiQWRkZXIgb3BlcmFuZCBzcGVjaWZpY2F0aW9uIGludmFsaWQiLCBlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZ2V0RGVzdGluYXRpb24oKS53cml0ZShiICsgb3BlcmFuZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlzdXBlci5jbG9zZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYjk0MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3Npbmc7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBQZXJmb3JtcyBhbGwgYXV0b21hdGVkIGRpcmVjdG9yIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb2Nlc3NpbmdTdGVwSGFuZGxlclRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUHJvY2Vzc2luZ1N0ZXBUZXN0LmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL0J5dGVTaGlmdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvQnl0ZVNoaWZ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY2ZTA0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvQnl0ZVNoaWZ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSoKLSogQ29udHJpYnV0b3JzOgotKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKiAgSUJNIC0gY29udGludWluZyBkZXZlbG9wbWVudAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3Npbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3I7Ci0KLXB1YmxpYyBjbGFzcyBCeXRlU2hpZnRlciBleHRlbmRzIFByb2Nlc3NpbmdTdGVwIHsKLQotCXByb3RlY3RlZCBpbnQgb3BlcmFuZDsKLQotCXB1YmxpYyBCeXRlU2hpZnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZVNoaWZ0ZXIoaW50IHNoaWZ0TGVmdCkgewotCQlzdXBlcigpOwotCQl0aGlzLm9wZXJhbmQgPSBzaGlmdExlZnQ7Ci0JCWJhc2ljSW5pdGlhbGl6ZShudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmFzaWNJbml0aWFsaXplKFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCS8vIGlmIHRoZSBzdGF0dXMgaXMgYWxyZWFkeSBzZXQgdG8gc29tZXRoaW5nIHRoYXQgbm90IG9rLCB3ZSd2ZSBhbHJlYWR5IGZvdW5kIGEgcHJvYmxlbS4KLQkJaWYgKCFnZXRTdGF0dXMoKS5pc09LKCkpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGNvZGU7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgZGVzY3JpcHRvciwgZGVjaWRlIGlmIHRoZSAiYmFkIGNhc2UiIGlzIGFuIGVycm9yIG9yIGluZm8uICBJZiBubyAKLQkJLy8gZGVzY3JpcHRvciB0aGVuIGRlZmF1bHQgdG8gZXJyb3IuCi0JCWlmIChkZXNjcmlwdG9yICE9IG51bGwpCi0JCQljb2RlID0gZGVzY3JpcHRvci5pc1JlcXVpcmVkKCkgPyBJU3RhdHVzLkVSUk9SIDogSVN0YXR1cy5JTkZPOwotCQllbHNlCi0JCQljb2RlID0gSVN0YXR1cy5FUlJPUjsKLQotCQkvLyBmaW5hbGx5LCBjaGVjayB0aGUgYWN0dWFsIHNldHVwIGFuZCBzZXQgdGhlIHN0YXR1cy4KLQkJaWYgKG9wZXJhbmQgPD0gMCkKLQkJCXNldFN0YXR1cyhuZXcgU3RhdHVzKGNvZGUsIEFjdGl2YXRvci5JRCwgIkJ5dGVTaGlmdGVyIG9wZXJhbmQgaW52YWxpZDogIiArIG9wZXJhbmQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBJQXJ0aWZhY3REZXNjcmlwdG9yIGNvbnRleHQpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShkZXNjcmlwdG9yLCBjb250ZXh0KTsKLQkJdHJ5IHsKLQkJCW9wZXJhbmQgPSBJbnRlZ2VyLnZhbHVlT2YoZGVzY3JpcHRvci5nZXREYXRhKCkpLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlpbnQgY29kZSA9IGRlc2NyaXB0b3IuaXNSZXF1aXJlZCgpID8gSVN0YXR1cy5FUlJPUiA6IElTdGF0dXMuSU5GTzsKLQkJCXNldFN0YXR1cyhuZXcgU3RhdHVzKGNvZGUsIEFjdGl2YXRvci5JRCwgIkJ5dGVTaGlmdGVyIG9wZXJhbmQgc3BlY2lmaWNhdGlvbiBpbnZhbGlkIiwgZSkpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWJhc2ljSW5pdGlhbGl6ZShkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZ2V0RGVzdGluYXRpb24oKS53cml0ZShiID09IC0xID8gYiA6IGIgPDwgb3BlcmFuZCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0U3RhdHVzKCkgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvQ291bnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL0NvdW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA4YjA1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvQ291bnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICoJSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3Npbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcERlc2NyaXB0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDb3VudGVyIGV4dGVuZHMgUHJvY2Vzc2luZ1N0ZXAgewotCi0JcHJvdGVjdGVkIGxvbmcgc2l6ZSA9IC0xOwotCWxvbmcgdG90YWwgPSAwOwotCi0JcHVibGljIENvdW50ZXIoKSB7Ci0JCS8vIG5lZWRlZAotCX0KLQotCXB1YmxpYyBDb3VudGVyKGxvbmcgc2l6ZSkgewotCQlzdXBlcigpOwotCQl0aGlzLnNpemUgPSBzaXplOwotCQliYXNpY0luaXRpYWxpemUobnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJhc2ljSW5pdGlhbGl6ZShQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQkvLyBpZiB0aGUgc3RhdHVzIGlzIGFscmVhZHkgc2V0IHRvIHNvbWV0aGluZyB0aGF0IG5vdCBvaywgd2UndmUgYWxyZWFkeSBmb3VuZCBhIHByb2JsZW0uCi0JCWlmICghZ2V0U3RhdHVzKCkuaXNPSygpKQotCQkJcmV0dXJuOwotCi0JCWludCBjb2RlOwotCQkvLyBpZiB0aGVyZSBpcyBhIGRlc2NyaXB0b3IsIGRlY2lkZSBpZiB0aGUgImJhZCBjYXNlIiBpcyBhbiBlcnJvciBvciBpbmZvLiAgSWYgbm8gCi0JCS8vIGRlc2NyaXB0b3IgdGhlbiBkZWZhdWx0IHRvIGVycm9yLgotCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKQotCQkJY29kZSA9IGRlc2NyaXB0b3IuaXNSZXF1aXJlZCgpID8gSVN0YXR1cy5FUlJPUiA6IElTdGF0dXMuSU5GTzsKLQkJZWxzZQotCQkJY29kZSA9IElTdGF0dXMuRVJST1I7Ci0KLQkJLy8gZmluYWxseSwgY2hlY2sgdGhlIGFjdHVhbCBzZXR1cCBhbmQgc2V0IHRoZSBzdGF0dXMuCi0JCWlmIChzaXplICE9IC0xKQotCQkJc2V0U3RhdHVzKG5ldyBTdGF0dXMoY29kZSwgQWN0aXZhdG9yLklELCAiQ291bnRlciBzaXplIG5vdCBzZXQiKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgZGVzY3JpcHRvciwgSUFydGlmYWN0RGVzY3JpcHRvciBjb250ZXh0KSB7Ci0JCXN1cGVyLmluaXRpYWxpemUoZGVzY3JpcHRvciwgY29udGV4dCk7Ci0JCVN0cmluZyBkYXRhID0gZGVzY3JpcHRvci5nZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlpZiAoZGF0YS5lcXVhbHMoImRvd25sb2FkIikpCi0JCQkJc2l6ZSA9IExvbmcucGFyc2VMb25nKGNvbnRleHQuZ2V0UHJvcGVydHkoSUFydGlmYWN0RGVzY3JpcHRvci5ET1dOTE9BRF9TSVpFKSk7Ci0JCQllbHNlIGlmIChkYXRhLmVxdWFscygiYXJ0aWZhY3QiKSkKLQkJCQlzaXplID0gTG9uZy5wYXJzZUxvbmcoY29udGV4dC5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkFSVElGQUNUX1NJWkUpKTsKLQkJCWVsc2UKLQkJCQlzaXplID0gTG9uZy5wYXJzZUxvbmcoZGF0YSk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlpbnQgY29kZSA9IGRlc2NyaXB0b3IuaXNSZXF1aXJlZCgpID8gSVN0YXR1cy5FUlJPUiA6IElTdGF0dXMuSU5GTzsKLQkJCXNldFN0YXR1cyhuZXcgU3RhdHVzKGNvZGUsIEFjdGl2YXRvci5JRCwgIkNvdW50ZXIgc2l6ZSBzcGVjaWZpY2F0aW9uIGludmFsaWQiLCBlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYmFzaWNJbml0aWFsaXplKGRlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0b3RhbCsrOwotCQlnZXREZXN0aW5hdGlvbigpLndyaXRlKGIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3VwZXIuY2xvc2UoKTsKLQkJaWYgKHRvdGFsICE9IHNpemUpCi0JCQlzZXRTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsICJwbHVnaW4gaWQiLCAiU2l6ZSBtaXNtYXRjaC4gIFdhcyAiICsgdG90YWwgKyAiIHNob3VsZCBoYXZlIGJlZW4gIiArIHNpemUpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvTXVsdGlwbGllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL011bHRpcGxpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRhZTFjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvTXVsdGlwbGllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0qIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotKgotKiBDb250cmlidXRvcnM6Ci0qIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0qICBJQk0gLSBjb250aW51aW5nIGRldmVsb3BtZW50Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLlByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcjsKLQotcHVibGljIGNsYXNzIE11bHRpcGxpZXIgZXh0ZW5kcyBQcm9jZXNzaW5nU3RlcCB7Ci0KLQlwcm90ZWN0ZWQgaW50IG9wZXJhbmQ7Ci0KLQlwdWJsaWMgTXVsdGlwbGllcigpIHsKLQkJLy8gbmVlZGVkCi0JfQotCi0JcHVibGljIE11bHRpcGxpZXIoaW50IG9wZXJhbmQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vcGVyYW5kID0gb3BlcmFuZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBJQXJ0aWZhY3REZXNjcmlwdG9yIGNvbnRleHQpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZShkZXNjcmlwdG9yLCBjb250ZXh0KTsKLQkJdHJ5IHsKLQkJCW9wZXJhbmQgPSBJbnRlZ2VyLnZhbHVlT2YoZGVzY3JpcHRvci5nZXREYXRhKCkpLmludFZhbHVlKCk7Ci0JCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQlpbnQgY29kZSA9IGRlc2NyaXB0b3IuaXNSZXF1aXJlZCgpID8gSVN0YXR1cy5FUlJPUiA6IElTdGF0dXMuSU5GTzsKLQkJCXNldFN0YXR1cyhuZXcgU3RhdHVzKGNvZGUsIEFjdGl2YXRvci5JRCwgIk11bHRpcGxpZXIgb3BlcmFuZCBzcGVjaWZpY2F0aW9uIGludmFsaWQiLCBlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZ2V0RGVzdGluYXRpb24oKS53cml0ZShiID09IC0xID8gYiA6IGIgKiBvcGVyYW5kKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXN1cGVyLmNsb3NlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL1Byb2Nlc3NpbmdTdGVwSGFuZGxlclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvcHJvY2Vzc2luZy9Qcm9jZXNzaW5nU3RlcEhhbmRsZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjkzYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL1Byb2Nlc3NpbmdTdGVwSGFuZGxlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0qIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0qIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0qIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0qCi0qIENvbnRyaWJ1dG9yczoKLSogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSogIElCTSAtIGNvbnRpbnVpbmcgZGV2ZWxvcG1lbnQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy5wYWNrMjAwLlBhY2syMDBQcm9jZXNzb3JTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucHJvY2Vzc29ycy52ZXJpZmllci5NRDVWZXJpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMuVGVzdEFjdGl2YXRvcjsKLQotcHVibGljIGNsYXNzIFByb2Nlc3NpbmdTdGVwSGFuZGxlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA4ICogMTAyNDsKLQotCVByb2Nlc3NpbmdTdGVwSGFuZGxlciBoYW5kbGVyID0gbmV3IFByb2Nlc3NpbmdTdGVwSGFuZGxlcigpOwotCUlQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU5vUFNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yWzBdOwotCQlPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMCk7Ci0JCU91dHB1dFN0cmVhbSB0ZXN0U3RyZWFtID0gaGFuZGxlci5jcmVhdGVBbmRMaW5rKGRlc2NyaXB0b3JzLCBudWxsLCByZXN1bHQsIG1vbml0b3IpOwotCQl0ZXN0U3RyZWFtLndyaXRlKCJUZXN0Ii5nZXRCeXRlcygpKTsKLQkJdGVzdFN0cmVhbS5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCByZXN1bHQudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVPbmVCeXRlU2hpZnRlclBTKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcyA9IG5ldyBQcm9jZXNzaW5nU3RlcFtdIHtuZXcgQnl0ZVNoaWZ0ZXIoMSl9OwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMCk7Ci0JCU91dHB1dFN0cmVhbSB0ZXN0U3RyZWFtID0gaGFuZGxlci5saW5rKHN0ZXBzLCByZXN1bHQsIG1vbml0b3IpOwotCQl0ZXN0U3RyZWFtLndyaXRlKG5ldyBieXRlW10gezF9KTsKLQkJdGVzdFN0cmVhbS5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXSB7Mn0sIHJlc3VsdC50b0J5dGVBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVUd29CeXRlU2hpZnRlclBTcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb2Nlc3NpbmdTdGVwW10gc3RlcHMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBbXSB7bmV3IEJ5dGVTaGlmdGVyKDEpLCBuZXcgQnl0ZVNoaWZ0ZXIoMil9OwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMCk7Ci0JCU91dHB1dFN0cmVhbSB0ZXN0U3RyZWFtID0gaGFuZGxlci5saW5rKHN0ZXBzLCByZXN1bHQsIG1vbml0b3IpOwotCQl0ZXN0U3RyZWFtLndyaXRlKG5ldyBieXRlW10gezF9KTsKLQkJdGVzdFN0cmVhbS5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXSB7OH0sIHJlc3VsdC50b0J5dGVBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVPbmVNRDVWZXJpZmllclBTT2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm9jZXNzaW5nU3RlcFtdIHN0ZXBzID0gbmV3IFByb2Nlc3NpbmdTdGVwW10ge25ldyBNRDVWZXJpZmllcigiMGNiYzY2MTFmNTU0MGJkMDgwOWEzODhkYzk1YTYxNWIiKX07Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwKTsKLQkJT3V0cHV0U3RyZWFtIHRlc3RTdHJlYW0gPSBoYW5kbGVyLmxpbmsoc3RlcHMsIHJlc3VsdCwgbW9uaXRvcik7Ci0JCXRlc3RTdHJlYW0ud3JpdGUoIlRlc3QiLmdldEJ5dGVzKCkpOwotCQl0ZXN0U3RyZWFtLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiVGVzdCIsIHJlc3VsdC50b1N0cmluZygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU9uZU1ENVZlcmlmaWVyUFNGYWlscygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVByb2Nlc3NpbmdTdGVwW10gc3RlcHMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBbXSB7bmV3IE1ENVZlcmlmaWVyKCI5Y2JjNjYxMWY1NTQwYmQwODA5YTM4OGRjOTVhNjE1YiIpfTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTApOwotCQlPdXRwdXRTdHJlYW0gdGVzdFN0cmVhbSA9IGhhbmRsZXIubGluayhzdGVwcywgcmVzdWx0LCBtb25pdG9yKTsKLQkJdGVzdFN0cmVhbS53cml0ZSgiVGVzdCIuZ2V0Qnl0ZXMoKSk7Ci0JCXRyeSB7Ci0JCQl0ZXN0U3RyZWFtLmNsb3NlKCk7Ci0JCQlhc3NlcnRFcXVhbHMoIlRlc3QiLCByZXN1bHQudG9TdHJpbmcoKSk7Ci0JCQlhc3NlcnRUcnVlKChQcm9jZXNzaW5nU3RlcEhhbmRsZXIuY2hlY2tTdGF0dXModGVzdFN0cmVhbSkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZU9uZUJ5dGVTaGlmdGVyQW5kT25lTUQ1VmVyaWZpZXJQU09rKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gT3JkZXIgb2YgUFNzIGlzIGltcG9ydGFudCEhCi0JCVByb2Nlc3NpbmdTdGVwW10gc3RlcHMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBbXSB7bmV3IEJ5dGVTaGlmdGVyKDEpLCBuZXcgTUQ1VmVyaWZpZXIoImNlZWVlNTA3ZThkYjgzMjk0NjAwMjE4YjRlMTk4ODk3Iil9OwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMCk7Ci0JCU91dHB1dFN0cmVhbSB0ZXN0U3RyZWFtID0gaGFuZGxlci5saW5rKHN0ZXBzLCByZXN1bHQsIG1vbml0b3IpOwotCQl0ZXN0U3RyZWFtLndyaXRlKG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9KTsKLQkJdGVzdFN0cmVhbS5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXSB7MiwgNCwgNiwgOCwgMTB9LCByZXN1bHQudG9CeXRlQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlT25lQnl0ZVNoaWZ0ZXJBbmRPbmVNRDVWZXJpZmllclBTRmFpbFdyb25nT3JkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBPcmRlciBvZiBQU3MgaXMgaW1wb3J0YW50IC0gaGVyZSBpdCB3cm9uZyEhCi0JCVByb2Nlc3NpbmdTdGVwW10gc3RlcHMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBbXSB7bmV3IE1ENVZlcmlmaWVyKCJhZjQ3NmJiYWYxNTJhNGMzOWNhNGU1YzQ5OGE4OGFhMCIpLCBuZXcgQnl0ZVNoaWZ0ZXIoMSl9OwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMCk7Ci0JCU91dHB1dFN0cmVhbSB0ZXN0U3RyZWFtID0gaGFuZGxlci5saW5rKHN0ZXBzLCByZXN1bHQsIG1vbml0b3IpOwotCQl0ZXN0U3RyZWFtLndyaXRlKG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9KTsKLQkJdHJ5IHsKLQkJCXRlc3RTdHJlYW0uY2xvc2UoKTsKLQkJCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdIHsyLCA0LCA2LCA4LCAxMH0sIHJlc3VsdC50b0J5dGVBcnJheSgpKSk7Ci0JCQlhc3NlcnRUcnVlKChQcm9jZXNzaW5nU3RlcEhhbmRsZXIuY2hlY2tTdGF0dXModGVzdFN0cmVhbSkuZ2V0U2V2ZXJpdHkoKSA9PSBJU3RhdHVzLkVSUk9SKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydFRydWUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzdXJlT3JkZXJpbmdPZlBTczEoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm9jZXNzaW5nU3RlcFtdIHN0ZXBzID0gbmV3IFByb2Nlc3NpbmdTdGVwW10ge25ldyBBZGRlcigxKSwgbmV3IE11bHRpcGxpZXIoMil9OwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMCk7Ci0JCU91dHB1dFN0cmVhbSB0ZXN0U3RyZWFtID0gaGFuZGxlci5saW5rKHN0ZXBzLCByZXN1bHQsIG1vbml0b3IpOwotCQl0ZXN0U3RyZWFtLndyaXRlKG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9KTsKLQkJdGVzdFN0cmVhbS5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXSB7NCwgNiwgOCwgMTAsIDEyfSwgcmVzdWx0LnRvQnl0ZUFycmF5KCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXNzdXJlT3JkZXJpbmdPZlBTczIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm9jZXNzaW5nU3RlcFtdIHN0ZXBzID0gbmV3IFByb2Nlc3NpbmdTdGVwW10ge25ldyBNdWx0aXBsaWVyKDIpLCBuZXcgQWRkZXIoMSl9OwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzdWx0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxMCk7Ci0JCU91dHB1dFN0cmVhbSB0ZXN0U3RyZWFtID0gaGFuZGxlci5saW5rKHN0ZXBzLCByZXN1bHQsIG1vbml0b3IpOwotCQl0ZXN0U3RyZWFtLndyaXRlKG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9KTsKLQkJdGVzdFN0cmVhbS5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGJ5dGVbXSB7MywgNSwgNywgOSwgMTF9LCByZXN1bHQudG9CeXRlQXJyYXkoKSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlT25lUGFjazIwMFVucGFja2VyUFMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB7bmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLlBhY2syMDBVbnBhY2tlciIsIG51bGwsIHRydWUpfTsKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcyA9IGhhbmRsZXIuY3JlYXRlKGRlc2NyaXB0b3JzLCBudWxsKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMDAwKTsKLQkJT3V0cHV0U3RyZWFtIHRlc3RTdHJlYW0gPSBoYW5kbGVyLmxpbmsoc3RlcHMsIHJlc3VsdCwgbW9uaXRvcik7Ci0JCUlTdGF0dXMgc3RhdHVzID0gUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyLmNoZWNrU3RhdHVzKHRlc3RTdHJlYW0pOwotCQlhc3NlcnRUcnVlKCJTdGVwIGlzIG5vdCByZWFkeS4iLCBzdGF0dXMuaXNPSygpKTsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgidGVzdERhdGEvamFycHJvY2Vzc29yLmphci5wYWNrLmd6Iikub3BlblN0cmVhbSgpOwotCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dFN0cmVhbSwgdHJ1ZSwgdGVzdFN0cmVhbSwgdHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygzNTA2MiwgcmVzdWx0LnNpemUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZUJ5dGVTaGlmdGVyUFMoKSB7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIHtuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuQnl0ZVNoaWZ0ZXIiLCAiMSIsIHRydWUpfTsKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcyA9IGhhbmRsZXIuY3JlYXRlKGRlc2NyaXB0b3JzLCBudWxsKTsKLQkJYXNzZXJ0Tm90TnVsbChzdGVwcyk7Ci0JCWFzc2VydEVxdWFscygxLCBzdGVwcy5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoQnl0ZVNoaWZ0ZXIuY2xhc3MsIHN0ZXBzWzBdLmdldENsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVNRDVWZXJpZmllclBTKCkgewotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3JbXSB7bmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLk1ENVZlcmlmaWVyIiwgIjEiLCB0cnVlKX07Ci0JCVByb2Nlc3NpbmdTdGVwW10gc3RlcHMgPSBoYW5kbGVyLmNyZWF0ZShkZXNjcmlwdG9ycywgbnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoc3RlcHMpOwotCQlhc3NlcnRFcXVhbHMoMSwgc3RlcHMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKE1ENVZlcmlmaWVyLmNsYXNzLCBzdGVwc1swXS5nZXRDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQWRkZXJQUygpIHsKLQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10ge25ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5BZGRlciIsICIxIiwgdHJ1ZSl9OwotCQlQcm9jZXNzaW5nU3RlcFtdIHN0ZXBzID0gaGFuZGxlci5jcmVhdGUoZGVzY3JpcHRvcnMsIG51bGwpOwotCQlhc3NlcnROb3ROdWxsKHN0ZXBzKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHN0ZXBzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscyhBZGRlci5jbGFzcywgc3RlcHNbMF0uZ2V0Q2xhc3MoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZU11bHRpcGxpZXJQUygpIHsKLQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10ge25ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5NdWx0aXBsaWVyIiwgIjIiLCB0cnVlKX07Ci0JCVByb2Nlc3NpbmdTdGVwW10gc3RlcHMgPSBoYW5kbGVyLmNyZWF0ZShkZXNjcmlwdG9ycywgbnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoc3RlcHMpOwotCQlhc3NlcnRFcXVhbHMoMSwgc3RlcHMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKE11bHRpcGxpZXIuY2xhc3MsIHN0ZXBzWzBdLmdldENsYXNzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVQYWNrMjAwVW5wYWNrZXJQUygpIHsKLQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10ge25ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5QYWNrMjAwVW5wYWNrZXIiLCBudWxsLCB0cnVlKX07Ci0JCVByb2Nlc3NpbmdTdGVwW10gc3RlcHMgPSBoYW5kbGVyLmNyZWF0ZShkZXNjcmlwdG9ycywgbnVsbCk7Ci0JCWFzc2VydE5vdE51bGwoc3RlcHMpOwotCQlhc3NlcnRFcXVhbHMoMSwgc3RlcHMubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKFBhY2syMDBQcm9jZXNzb3JTdGVwLmNsYXNzLCBzdGVwc1swXS5nZXRDbGFzcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUFNzQW5kQXNzdXJlT3JkZXJpbmdPZlBTczEoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgYWRkZXIgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuQWRkZXIiLCAiMSIsIHRydWUpOwotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgbXVsdGlwbGllciA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5NdWx0aXBsaWVyIiwgIjIiLCB0cnVlKTsKLQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10ge2FkZGVyLCBtdWx0aXBsaWVyfTsKLQkJUHJvY2Vzc2luZ1N0ZXBbXSBzdGVwcyA9IGhhbmRsZXIuY3JlYXRlKGRlc2NyaXB0b3JzLCBudWxsKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTApOwotCQlPdXRwdXRTdHJlYW0gdGVzdFN0cmVhbSA9IGhhbmRsZXIubGluayhzdGVwcywgcmVzdWx0LCBtb25pdG9yKTsKLQkJdGVzdFN0cmVhbS53cml0ZShuZXcgYnl0ZVtdIHsxLCAyLCAzLCA0LCA1fSk7Ci0JCXRlc3RTdHJlYW0uY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlW10gezQsIDYsIDgsIDEwLCAxMn0sIHJlc3VsdC50b0J5dGVBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENyZWF0ZVBTc0FuZEFzc3VyZU9yZGVyaW5nT2ZQU3MyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIGFkZGVyID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcigib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm9jZXNzaW5nLkFkZGVyIiwgIjEiLCB0cnVlKTsKLQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yIG11bHRpcGxpZXIgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuTXVsdGlwbGllciIsICIyIiwgdHJ1ZSk7Ci0JCVByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gbmV3IFByb2Nlc3NpbmdTdGVwRGVzY3JpcHRvcltdIHttdWx0aXBsaWVyLCBhZGRlcn07Ci0JCVByb2Nlc3NpbmdTdGVwW10gc3RlcHMgPSBoYW5kbGVyLmNyZWF0ZShkZXNjcmlwdG9ycywgbnVsbCk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSByZXN1bHQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwKTsKLQkJT3V0cHV0U3RyZWFtIHRlc3RTdHJlYW0gPSBoYW5kbGVyLmxpbmsoc3RlcHMsIHJlc3VsdCwgbW9uaXRvcik7Ci0JCXRlc3RTdHJlYW0ud3JpdGUobmV3IGJ5dGVbXSB7MSwgMiwgMywgNCwgNX0pOwotCQl0ZXN0U3RyZWFtLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdIHszLCA1LCA3LCA5LCAxMX0sIHJlc3VsdC50b0J5dGVBcnJheSgpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdExpbmtQU3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgYWRkZXIgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb2Nlc3NpbmcuQWRkZXIiLCAiMSIsIHRydWUpOwotCQlQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IgbXVsdGlwbGllciA9IG5ldyBQcm9jZXNzaW5nU3RlcERlc2NyaXB0b3IoIm9yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvY2Vzc2luZy5NdWx0aXBsaWVyIiwgIjIiLCB0cnVlKTsKLQkJUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10gZGVzY3JpcHRvcnMgPSBuZXcgUHJvY2Vzc2luZ1N0ZXBEZXNjcmlwdG9yW10ge2FkZGVyLCBtdWx0aXBsaWVyfTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlc3VsdCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTApOwotCQlPdXRwdXRTdHJlYW0gdGVzdFN0cmVhbSA9IGhhbmRsZXIuY3JlYXRlQW5kTGluayhkZXNjcmlwdG9ycywgbnVsbCwgcmVzdWx0LCBtb25pdG9yKTsKLQkJdGVzdFN0cmVhbS53cml0ZShuZXcgYnl0ZVtdIHsxLCAyLCAzLCA0LCA1fSk7Ci0JCXRlc3RTdHJlYW0uY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlW10gezQsIDYsIDgsIDEwLCAxMn0sIHJlc3VsdC50b0J5dGVBcnJheSgpKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvUHJvY2Vzc2luZ1N0ZXBUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L3Byb2Nlc3NpbmcvUHJvY2Vzc2luZ1N0ZXBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3N2UwNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9wcm9jZXNzaW5nL1Byb2Nlc3NpbmdTdGVwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3Npbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcEhhbmRsZXI7Ci0KLXB1YmxpYyBjbGFzcyBQcm9jZXNzaW5nU3RlcFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcml2YXRlIFByb2Nlc3NpbmdTdGVwIHBzOwotCXByaXZhdGUgYm9vbGVhbiBmbHVzaGVkOwotCXByaXZhdGUgYm9vbGVhbiBjbG9zZWQ7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlwcyA9IG5ldyBQcm9jZXNzaW5nU3RlcCgpIHt9OwotCQlmbHVzaGVkID0gZmFsc2U7Ci0JCWNsb3NlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0U3RhdHVzKCkgewotCQlhc3NlcnROb3ROdWxsKHBzLmdldFN0YXR1cygpKTsKLQkJYXNzZXJ0VHJ1ZShwcy5nZXRTdGF0dXMoKS5pc09LKCkpOwotCQlhc3NlcnRUcnVlKHBzLmdldFN0YXR1cyhmYWxzZSkuaXNPSygpKTsKLQkJYXNzZXJ0VHJ1ZShwcy5nZXRTdGF0dXModHJ1ZSkuaXNPSygpKTsKLQkJYXNzZXJ0VHJ1ZShQcm9jZXNzaW5nU3RlcEhhbmRsZXIuY2hlY2tTdGF0dXMocHMpLmlzT0soKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldERlZXBTdGF0dXMoKSB7Ci0JCVByb2Nlc3NpbmdTdGVwIHBzMiA9IG5ldyBQcm9jZXNzaW5nU3RlcCgpIHt9OwotCQlwcy5saW5rKHBzMiwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWFzc2VydFRydWUocHMuZ2V0U3RhdHVzKHRydWUpLmlzT0soKSk7Ci0KLQkJcHMyLnNldFN0YXR1cyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsICJwbHVnaW4gaWQiLCAibWVzc2FnZSIpKTsKLQkJYXNzZXJ0RmFsc2UocHMuZ2V0U3RhdHVzKHRydWUpLmlzT0soKSk7Ci0JCWFzc2VydFRydWUocHMuZ2V0U3RhdHVzKHRydWUpLmlzTXVsdGlTdGF0dXMoKSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLkVSUk9SLCBwcy5nZXRTdGF0dXModHJ1ZSkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCU11bHRpU3RhdHVzIG11bHRpID0gKE11bHRpU3RhdHVzKSBwcy5nZXRTdGF0dXModHJ1ZSk7Ci0JCWFzc2VydEVxdWFscygyLCBtdWx0aS5nZXRDaGlsZHJlbigpLmxlbmd0aCk7Ci0KLQkJUHJvY2Vzc2luZ1N0ZXAgcHMzID0gbmV3IFByb2Nlc3NpbmdTdGVwKCkge307Ci0JCXBzMi5saW5rKHBzMywgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWFzc2VydEZhbHNlKHBzLmdldFN0YXR1cyh0cnVlKS5pc09LKCkpOwotCQlhc3NlcnRUcnVlKHBzLmdldFN0YXR1cyh0cnVlKS5pc011bHRpU3RhdHVzKCkpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcHMuZ2V0U3RhdHVzKHRydWUpLmdldFNldmVyaXR5KCkpOwotCQltdWx0aSA9IChNdWx0aVN0YXR1cykgcHMuZ2V0U3RhdHVzKHRydWUpOwotCQlhc3NlcnRFcXVhbHMoMywgbXVsdGkuZ2V0Q2hpbGRyZW4oKS5sZW5ndGgpOwotCi0JCXBzMy5zZXRTdGF0dXMoU3RhdHVzLkNBTkNFTF9TVEFUVVMpOwotCQlhc3NlcnRGYWxzZShwcy5nZXRTdGF0dXModHJ1ZSkuaXNPSygpKTsKLQkJYXNzZXJ0VHJ1ZShwcy5nZXRTdGF0dXModHJ1ZSkuaXNNdWx0aVN0YXR1cygpKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuQ0FOQ0VMLCBwcy5nZXRTdGF0dXModHJ1ZSkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gbmV3IE91dHB1dFN0cmVhbSgpIHsKLQotCQkJcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZsdXNoKCkgewotCQkJCWZsdXNoZWQgPSB0cnVlOwotCQkJfQotCQl9OwotCQlwcy5saW5rKGRlc3RpbmF0aW9uLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJcHMuZmx1c2goKTsKLQkJYXNzZXJ0VHJ1ZShmbHVzaGVkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VTaW1wbGVPdXRwdXRTdHJlYW1Bc0Rlc3RpbmF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gbmV3IE91dHB1dFN0cmVhbSgpIHsKLQotCQkJcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQkJCWNsb3NlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0JCXBzLmxpbmsoZGVzdGluYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlwcy5jbG9zZSgpOwotCQlhc3NlcnRGYWxzZShjbG9zZWQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDbG9zZVByb2Nlc3NpbmdTdGVwQXNEZXN0aW5hdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiA9IG5ldyBQcm9jZXNzaW5nU3RlcCgpIHsKLQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQkJCWNsb3NlZCA9IHRydWU7Ci0JCQl9Ci0JCX07Ci0JCXBzLmxpbmsoZGVzdGluYXRpb24sIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlwcy5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKGNsb3NlZCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9vcHRpbWl6ZXJzL0F1dG9tYXRlZFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9vcHRpbWl6ZXJzL0F1dG9tYXRlZFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2YjUyYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvb3B0aW1pemVycy9BdXRvbWF0ZWRUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQXV0b21hdGVkVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0Lm9wdGltaXplcnMuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5wcm9jZXNzb3JzLkFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLkFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuc2FyLkFsbFRlc3RzLnN1aXRlKCkpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9vcHRpbWl6ZXJzL1Rlc3RBY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL29wdGltaXplcnMvVGVzdEFjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDY4NzYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL29wdGltaXplcnMvVGVzdEFjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0QWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQ7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1bmRsZUNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1bmRsZUNvbnRleHQgPSBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gYnVuZGxlQ29udGV4dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL29wdGltaXplcnMvVGVzdERhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL29wdGltaXplcnMvVGVzdERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY0ZmExZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9vcHRpbWl6ZXJzL1Rlc3REYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICBSZWQgSGF0LCBJbmMuIChBbmRyZXcgT3ZlcmhvbHQpIC0gYWRkIGdldEZpbGUgbWV0aG9kCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci0KLS8qKgotICogPGNvZGU+VGVzdERhdGE8L2NvZGU+IGhlbHBzIHdpdGggaGFuZGxpbmcgb2YgdGVzdCBkYXRhLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdERhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfREFUQV9ST09UX0ZPTERFUiA9ICJ0ZXN0RGF0YSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9TRVBFUkFUT1IgPSAifiI7Ci0KLQkvKioKLQkgKiBHZXQgYW4gaW5wdXQgc3RyZWFtIGZyb20gdGhlIHJlc291cmNlIHRlc3REYXRhTmFtZSB3aXRoaW4gdGhlIGZvbGRlciAKLQkgKiB0ZXN0RGF0YUZvbGRlciBvZiB0aGUgdGVzdERhdGEgZm9sZGVyIG9mIHRoaXMgcHJvamVjdC4KLQkgKiBAcGFyYW0gdGVzdERhdGFGb2xkZXIKLQkgKiBAcGFyYW0gdGVzdERhdGFOYW1lCi0JICogQHJldHVybiBpbnB1dCBzdHJlYW0gZm9yIHRoZSB0ZXN0IGRhdGEKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXQoU3RyaW5nIHRlc3REYXRhRm9sZGVyLCBTdHJpbmcgdGVzdERhdGFOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoVEVTVF9EQVRBX1JPT1RfRk9MREVSICsgIi8iICsgdGVzdERhdGFGb2xkZXIgKyAiLyIgKyB0ZXN0RGF0YU5hbWUpLm9wZW5TdHJlYW0oKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgRmlsZSBmcm9tIHRoZSByZXNvdXJjZSB0ZXN0RGF0YU5hbWUgd2l0aGluIHRoZSBmb2xkZXIgCi0JICogdGVzdERhdGFGb2xkZXIgb2YgdGhlIHRlc3REYXRhIGZvbGRlciBvZiB0aGlzIHByb2plY3QuCi0JICogQHBhcmFtIHRlc3REYXRhRm9sZGVyCi0JICogQHJldHVybiB0ZXN0IGRhdGEgRmlsZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0RmlsZShTdHJpbmcgdGVzdERhdGFGb2xkZXIsIFN0cmluZyB0ZXN0RGF0YU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgRmlsZShGaWxlTG9jYXRvci50b0ZpbGVVUkwoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoVEVTVF9EQVRBX1JPT1RfRk9MREVSICsgIi8iICsgdGVzdERhdGFGb2xkZXIgKyAiLyIgKyB0ZXN0RGF0YU5hbWUpKS5nZXRQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGZvciB0aGUgdGVzdCBkYXRhLiBUaGUgdGVtcG9yYXJ5IGZpbGUgd2lsbCBiZSBkZWxldGVkIAotCSAqIHdoZW4gdGhlIGp2bSBleGlzdHMuIElmIHRlc3REYXRhTmFtZSBjb250YWlucyBhbiBleHRlbnNpb24gdGhpcyBleHRlbnNpb24gd2lsbAotCSAqIGJlIHVzZWQgYXMgc3VmZml4IGZvciB0aGUgdGVtcG9yYXJ5IGZpbGUuCi0JICogQHBhcmFtIHRlc3REYXRhRm9sZGVyCi0JICogQHBhcmFtIHRlc3REYXRhTmFtZQotCSAqIEByZXR1cm4gdGVtcG9yYXJ5IGZpbGUgd2l0aCB0ZXN0IGRhdGEKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldFRlbXBGaWxlKFN0cmluZyB0ZXN0RGF0YUZvbGRlciwgU3RyaW5nIHRlc3REYXRhTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSB0ZW1wID0gY3JlYXRlVGVtcEZpbGUodGVzdERhdGFOYW1lKTsKLQkJT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXApOwotCQlGaWxlVXRpbHMuY29weVN0cmVhbShnZXQodGVzdERhdGFGb2xkZXIsIHRlc3REYXRhTmFtZSksIHRydWUsIG91dCwgdHJ1ZSk7Ci0JCXJldHVybiB0ZW1wOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlLiBUaGlzIGZpbGUgd2lsbCBiZSBkZWxldGVkIGlmIHRoZSBqdm0gZXhpdHMuIAotCSAqIElmIHRlc3REYXRhTmFtZSBjb250YWlucyBhbiBleHRlbnNpb24gdGhpcyBleHRlbnNpb24gd2lsbCBiZSB1c2VkIGFzIAotCSAqIHN1ZmZpeCBmb3IgdGhlIHRlbXBvcmFyeSBmaWxlLgotCSAqIEBwYXJhbSB0ZXN0RGF0YU5hbWUKLQkgKiBAcmV0dXJuIHRlbXBvcmFyeSBmaWxlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRmlsZShTdHJpbmcgdGVzdERhdGFOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgaSA9IHRlc3REYXRhTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlGaWxlIHRlbXAgPSAoaSA9PSAtMSkgPyBGaWxlLmNyZWF0ZVRlbXBGaWxlKHRlc3REYXRhTmFtZSArIFBSRUZJWF9TRVBFUkFUT1IsICIudG1wIikgOiBGaWxlLmNyZWF0ZVRlbXBGaWxlKHRlc3REYXRhTmFtZS5zdWJzdHJpbmcoMCwgaSkgKyBQUkVGSVhfU0VQRVJBVE9SLCB0ZXN0RGF0YU5hbWUuc3Vic3RyaW5nKGkpKTsKLQkJdGVtcC5kZWxldGVPbkV4aXQoKTsKLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0IGVxdWFsaXR5IG9mIGZpbGVzLgotCSAqIEBwYXJhbSBleHBlY3RlZAotCSAqIEBwYXJhbSBhY3R1YWwKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscyhGaWxlIGV4cGVjdGVkLCBGaWxlIGFjdHVhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiRmlsZXMgaGF2ZSBkaWZmZXJlbnQgbGVuZ3Rocy4iLCBleHBlY3RlZC5sZW5ndGgoKSwgYWN0dWFsLmxlbmd0aCgpKTsKLQkJVGVzdERhdGEuYXNzZXJ0RXF1YWxzKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZXhwZWN0ZWQpKSwgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShhY3R1YWwpKSk7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0IGVxdWFsaXR5IG9mIGlucHV0IHN0cmVhbXMuCi0JICogQHBhcmFtIGV4cGVjdGVkCi0JICogQHBhcmFtIGFjdHVhbAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKElucHV0U3RyZWFtIGV4cGVjdGVkLCBJbnB1dFN0cmVhbSBhY3R1YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpbnQgcmVhZEV4cGVjdGVkID0gMDsKLQkJCWludCByZWFkQWN0dWFsID0gMDsKLQkJCWludCBjb3VudCA9IDA7Ci0JCQl3aGlsZSAocmVhZEFjdHVhbCAhPSAtMSAmJiByZWFkRXhwZWN0ZWQgIT0gLTEpIHsKLQkJCQlyZWFkQWN0dWFsID0gYWN0dWFsLnJlYWQoKTsKLQkJCQlyZWFkRXhwZWN0ZWQgPSBleHBlY3RlZC5yZWFkKCk7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygiRGlmZmVyZW50IGJ5dGVzIGF0ICIgKyBjb3VudCwgcmVhZEV4cGVjdGVkLCByZWFkQWN0dWFsKTsKLQkJCQljb3VudCsrOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGV4cGVjdGVkICE9IG51bGwpCi0JCQkJZXhwZWN0ZWQuY2xvc2UoKTsKLQkJCWlmIChhY3R1YWwgIT0gbnVsbCkKLQkJCQlhY3R1YWwuY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydCBlcXVhbGl0eSBvZiB6aXAgaW5wdXQgc3RyZWFtcy4KLQkgKiBAcGFyYW0gaW5wdXQxCi0JICogQHBhcmFtIGlucHV0MgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKFppcElucHV0U3RyZWFtIGlucHV0MSwgWmlwSW5wdXRTdHJlYW0gaW5wdXQyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlNYXAgamFyMSA9IGdldEVudHJpZXMoaW5wdXQxKTsKLQkJTWFwIGphcjIgPSBnZXRFbnRyaWVzKGlucHV0Mik7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGphcjEua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJT2JqZWN0W10gZmlsZTEgPSAoT2JqZWN0W10pIGphcjEuZ2V0KG5hbWUpOwotCQkJT2JqZWN0W10gZmlsZTIgPSAoT2JqZWN0W10pIGphcjIucmVtb3ZlKG5hbWUpOwotCQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZmlsZTIpOwotCi0JCQlaaXBFbnRyeSBlbnRyeTEgPSAoWmlwRW50cnkpIGZpbGUxWzBdOwotCQkJWmlwRW50cnkgZW50cnkyID0gKFppcEVudHJ5KSBmaWxlMlswXTsKLQkJCS8vIGNvbXBhcmUgdGhlIGVudHJpZXMKLQkJCUFzc2VydC5hc3NlcnRUcnVlKGVudHJ5MS5nZXROYW1lKCkuZXF1YWxzKGVudHJ5Mi5nZXROYW1lKCkpKTsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKGVudHJ5MS5nZXRTaXplKCkgPT0gZW50cnkyLmdldFNpemUoKSk7Ci0JCQkvLwlUT0RPIGZvciBub3cgc2tpcCBvdmVyIHRoZSB0aW1lc3RhbXAgYXMgdGhleSBzZWVtIHRvIGJlIGRpZmZlcmVudAotCQkJLy8gYXNzZXJ0VHJ1ZShlbnRyeTEuZ2V0VGltZSgpID09IGVudHJ5Mi5nZXRUaW1lKCkpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoZW50cnkxLmlzRGlyZWN0b3J5KCkgPT0gZW50cnkyLmlzRGlyZWN0b3J5KCkpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoZW50cnkxLmdldENyYygpID09IGVudHJ5Mi5nZXRDcmMoKSk7Ci0JCQlBc3NlcnQuYXNzZXJ0VHJ1ZShlbnRyeTEuZ2V0TWV0aG9kKCkgPT0gZW50cnkyLmdldE1ldGhvZCgpKTsKLQotCQkJLy8gY2hlY2sgdGhlIGNvbnRlbnQgb2YgdGhlIGVudHJpZXMKLQkJCUFzc2VydC5hc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoKGJ5dGVbXSkgZmlsZTFbMV0sIChieXRlW10pIGZpbGUyWzFdKSk7Ci0JCX0KLQotCQkvLyBlbnN1cmUgdGhhdCB3ZSBoYXZlIGNvbnN1bWVkIGFsbCBvZiB0aGUgZW50cmllcyBpbiB0aGUgc2Vjb25kIEpBUgotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShqYXIyLnNpemUoKSA9PSAwKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgZ2V0RW50cmllcyhaaXBJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IGlucHV0LmdldE5leHRFbnRyeSgpOwotCQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGNvbnRlbnQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dCwgZmFsc2UsIGNvbnRlbnQsIHRydWUpOwotCQkJaW5wdXQuY2xvc2VFbnRyeSgpOwotCQkJcmVzdWx0LnB1dChlbnRyeS5nZXROYW1lKCksIG5ldyBPYmplY3RbXSB7ZW50cnksIGNvbnRlbnQudG9CeXRlQXJyYXkoKX0pOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvc2FyL0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9zYXIvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhMGI0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9zYXIvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5zYXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBQZXJmb3JtcyBhbGwgc2FyIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2FyVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTYXJFbnRyeVRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9zYXIvRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvc2FyL0RpcmVjdEJ5dGVBcnJheU91dHB1dFN0cmVhbVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk4YWU3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9zYXIvRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnNhcjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnNhci5EaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0KLS8qKgotICogVGVzdCB0aGUgPGNvZGU+RGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtPC9jb2RlPgotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKVVNUMTFCWVRFUyA9ICJqdXN0MTFieXRlcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVMRVZFTiA9IEpVU1QxMUJZVEVTLmdldEJ5dGVzKCkubGVuZ3RoOwotCi0JLyoqCi0JICogVGVzdCB0aGUgY29uc3RyYWludHMgb2YgdGhlIERCQU9TCi0JICogCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3REQkFPU0NvbnN0cmFpbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGlyZWN0Qnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBEaXJlY3RCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAyNCk7Ci0JCW91dC53cml0ZShKVVNUMTFCWVRFUy5nZXRCeXRlcygpKTsKLQkJYXNzZXJ0RXF1YWxzKEVMRVZFTiwgb3V0LmdldEJ1ZmZlckxlbmd0aCgpKTsKLQkJYXNzZXJ0RXF1YWxzKEVMRVZFTiwgb3V0LnRvQnl0ZUFycmF5KCkubGVuZ3RoKTsKLQkJYXNzZXJ0Tm90U2FtZShvdXQudG9CeXRlQXJyYXkoKSwgb3V0LmdldEJ1ZmZlcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEwMjQsIG91dC5nZXRCdWZmZXIoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoSlVTVDExQllURVMsIG5ldyBTdHJpbmcob3V0LmdldEJ1ZmZlcigpLCAwLCBvdXQuZ2V0QnVmZmVyTGVuZ3RoKCkpKTsKLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBvdXQuZ2V0SW5wdXRTdHJlYW0oKTsKLQkJYXNzZXJ0RXF1YWxzKEVMRVZFTiwgaW4uYXZhaWxhYmxlKCkpOwotCQlieXRlW10gZWxldmVuQnl0ZXMgPSBuZXcgYnl0ZVtFTEVWRU5dOwotCQlpbi5yZWFkKGVsZXZlbkJ5dGVzKTsKLQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKEpVU1QxMUJZVEVTLmdldEJ5dGVzKCksIGVsZXZlbkJ5dGVzKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgaW4ucmVhZCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9zYXIvU2FyRW50cnlUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9zYXIvU2FyRW50cnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MjI0MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvc2FyL1NhckVudHJ5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnNhcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnNhci5TYXJFbnRyeTsKLQotcHVibGljIGNsYXNzIFNhckVudHJ5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyB2b2lkIHRlc3RKYXZhVG9Eb3NUaW1lQW5kQmFjaygpIHsKLQkJZmluYWwgbG9uZyBtaW51dGUgPSAxMDAwbCAqIDYwbDsKLQkJbG9uZyBub3cgPSAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLyBtaW51dGUpICogbWludXRlOwotCQlsb25nIGRvcyA9IFNhckVudHJ5LmphdmFUb0Rvc1RpbWUobm93KTsKLQkJYXNzZXJ0RXF1YWxzKG5vdywgU2FyRW50cnkuZG9zVG9KYXZhVGltZShkb3MpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3Nhci9TYXJUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9zYXIvU2FyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODExODg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3Nhci9TYXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnNhcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnNhci5TYXJVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy5UZXN0RGF0YTsKLQotLyoqCi0gKiBUZXN0IHRoZSBzYXIgc3R1ZmYuCi0gKi8KLXB1YmxpYyBjbGFzcyBTYXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JLy8JcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlVGVzdERhdGFOSmFyQW5kU2FyRnJvbUphcjMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLwkJSW5wdXRTdHJlYW0gamFyMzIgPSBUZXN0RGF0YS5nZXQoInNhciIsICJvcmcuZWNsaXBzZS5qZHRfMy4yLjAudjIwMDYwNjA1LTE0MDAuamFyIik7Ci0JLy8JCWdlbmVyYXRlTkphckFuZFNhcigib3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwIiwgamFyMzIpOwotCS8vCX0KLQkvLwotCS8vCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZVRlc3REYXRhTkphckFuZFNhckZyb21KYXIzMygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8JCUlucHV0U3RyZWFtIGphcjMyID0gVGVzdERhdGEuZ2V0KCJzYXIiLCAib3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNy0xMzAwLmphciIpOwotCS8vCQlnZW5lcmF0ZU5KYXJBbmRTYXIoIm9yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMCIsIGphcjMyKTsKLQkvLwl9Ci0JLy8KLQkvLwlwcml2YXRlIHZvaWQgZ2VuZXJhdGVOSmFyQW5kU2FyKFN0cmluZyBuYW1lLCBJbnB1dFN0cmVhbSBqYXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8JCUZpbGUgbmphciA9IEZpbGUuY3JlYXRlVGVtcEZpbGUobmFtZSwgIi5uamFyIik7Ci0JLy8JCU91dHB1dFN0cmVhbSBuamFyT3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG5qYXIpKTsKLQkvLwotCS8vCQlTYXJVdGlsLm5vcm1hbGl6ZShqYXIsIG5qYXJPdXQpOwotCS8vCi0JLy8JCUZpbGUgc2FyID0gRmlsZS5jcmVhdGVUZW1wRmlsZShuYW1lLCAiLnNhciIpOwotCS8vCQlTYXJVdGlsLnppcFRvU2FyKG5qYXIsIHNhcik7Ci0JLy8JfQotCi0JcHVibGljIHZvaWQgdGVzdEphclRvU2FyRm9ySmR0MzIwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gamR0MzIwSmFyID0gVGVzdERhdGEuZ2V0KCJvcHRpbWl6ZXJzIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5uamFyIik7Ci0JCUlucHV0U3RyZWFtIGpkdDMyMFNhciA9IFRlc3REYXRhLmdldCgic2FyIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5zYXIiKTsKLQkJZG9KYXJUb1NhcihqZHQzMjBKYXIsIGpkdDMyMFNhcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhclRvSmFyRm9ySmR0MzIwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gamR0MzIwU2FyID0gVGVzdERhdGEuZ2V0KCJzYXIiLCAib3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLnNhciIpOwotCQlJbnB1dFN0cmVhbSBqZHQzMjBKYXIgPSBUZXN0RGF0YS5nZXQoIm9wdGltaXplcnMiLCAib3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLm5qYXIiKTsKLQkJZG9TYXJUb0phcihqZHQzMjBTYXIsIGpkdDMyMEphcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphclRvU2FyRm9ySmR0MzMwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gamR0MzMwSmFyID0gVGVzdERhdGEuZ2V0KCJvcHRpbWl6ZXJzIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5uamFyIik7Ci0JCUlucHV0U3RyZWFtIGpkdDMzMFNhciA9IFRlc3REYXRhLmdldCgic2FyIiwgIm9yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5zYXIiKTsKLQkJZG9KYXJUb1NhcihqZHQzMzBKYXIsIGpkdDMzMFNhcik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNhclRvSmFyRm9ySmR0MzMwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gamR0MzMwU2FyID0gVGVzdERhdGEuZ2V0KCJzYXIiLCAib3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNy0xMzAwLnNhciIpOwotCQlJbnB1dFN0cmVhbSBqZHQzMzBKYXIgPSBUZXN0RGF0YS5nZXQoIm9wdGltaXplcnMiLCAib3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNy0xMzAwLm5qYXIiKTsKLQkJZG9TYXJUb0phcihqZHQzMzBTYXIsIGpkdDMzMEphcik7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBkb0phclRvU2FyKElucHV0U3RyZWFtIGphciwgSW5wdXRTdHJlYW0gZXhwZWN0ZWRTYXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUZpbGUgc2FyID0gVGVzdERhdGEuY3JlYXRlVGVtcEZpbGUoImRvSmFyVG9TYXIuc2FyIik7Ci0JCU91dHB1dFN0cmVhbSBzYXJPdXQgPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oc2FyKSk7Ci0KLQkJU2FyVXRpbC56aXBUb1NhcihqYXIsIHNhck91dCk7Ci0KLQkJSW5wdXRTdHJlYW0gc2FySW4gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHNhcikpOwotCQlUZXN0RGF0YS5hc3NlcnRFcXVhbHMoc2FySW4sIGV4cGVjdGVkU2FyKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRvU2FyVG9KYXIoSW5wdXRTdHJlYW0gc2FyLCBJbnB1dFN0cmVhbSBleHBlY3RlZEphcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBqYXIgPSBUZXN0RGF0YS5jcmVhdGVUZW1wRmlsZSgiZG9TYXJUb0phci5qYXIiKTsKLQkJT3V0cHV0U3RyZWFtIGphck91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShqYXIpKTsKLQotCQlTYXJVdGlsLnNhclRvWmlwKHNhciwgamFyT3V0KTsKLQotCQlJbnB1dFN0cmVhbSBqYXJJbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oamFyKSk7Ci0JCVRlc3REYXRhLmFzc2VydEVxdWFscyhqYXJJbiwgZXhwZWN0ZWRKYXIpOwotCX0KLQotCS8qKgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0WmlwVG9TYXJBbmRCYWNrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSBvcmlnaW5hbFppcEZpbGUgPSBUZXN0RGF0YS5nZXRUZW1wRmlsZSgic2FyIiwgInRlc3QuemlwIik7Ci0JCUZpbGUgc2FyRmlsZSA9IFRlc3REYXRhLmNyZWF0ZVRlbXBGaWxlKCJ0ZXN0LnNhciIpOwotCQlGaWxlIHJlY3JlYXRlZFppcEZpbGUgPSBUZXN0RGF0YS5jcmVhdGVUZW1wRmlsZSgidGVzdC56aXAiKTsKLQotCQlsb25nIGJlZm9yZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlTYXJVdGlsLnppcFRvU2FyKG9yaWdpbmFsWmlwRmlsZSwgc2FyRmlsZSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiemlwVG9TYXIgdG9vazogIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIGJlZm9yZSkpOwotCi0JCWJlZm9yZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlTYXJVdGlsLnNhclRvWmlwKHNhckZpbGUsIHJlY3JlYXRlZFppcEZpbGUpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oInNhclRvWmlwIHRvb2s6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBiZWZvcmUpKTsKLQotCQlUZXN0RGF0YS5hc3NlcnRFcXVhbHMob3JpZ2luYWxaaXBGaWxlLCByZWNyZWF0ZWRaaXBGaWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZU9uRmlsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlIGFsaWVuWmlwID0gVGVzdERhdGEuZ2V0VGVtcEZpbGUoInNhciIsICJhbGllbi56aXAiKTsKLQotCQlGaWxlIG5vcm1hbGl6ZWRBbGllblppcCA9IFRlc3REYXRhLmNyZWF0ZVRlbXBGaWxlKCJub3JtYWxpemVkYWxpZW4uemlwIik7Ci0JCVNhclV0aWwubm9ybWFsaXplKGFsaWVuWmlwLCBub3JtYWxpemVkQWxpZW5aaXApOwotCi0JCWFzc2VydFRydWUoYWxpZW5aaXAubGVuZ3RoKCkgIT0gbm9ybWFsaXplZEFsaWVuWmlwLmxlbmd0aCgpKTsKLQotCQlGaWxlIHJlbm9ybWFsaXplZEFsaWVuWmlwID0gVGVzdERhdGEuY3JlYXRlVGVtcEZpbGUoInJlbm9ybWFsaXplZGFsaWVuLnppcCIpOwotCQlTYXJVdGlsLm5vcm1hbGl6ZShub3JtYWxpemVkQWxpZW5aaXAsIHJlbm9ybWFsaXplZEFsaWVuWmlwKTsKLQotCQlUZXN0RGF0YS5hc3NlcnRFcXVhbHMobm9ybWFsaXplZEFsaWVuWmlwLCByZW5vcm1hbGl6ZWRBbGllblppcCk7Ci0JfQotCi0JLyoqCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVPblN0cmVhbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gYWxpZW5aaXAgPSBUZXN0RGF0YS5nZXQoInNhciIsICJhbGllbi56aXAiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG5vcm1hbGl6ZWRBbGllblppcCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJlbm9ybWFsaXplZEFsaWVuWmlwID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQl0cnkgewotCQkJU2FyVXRpbC5ub3JtYWxpemUoYWxpZW5aaXAsIG5vcm1hbGl6ZWRBbGllblppcCk7Ci0KLQkJCVNhclV0aWwubm9ybWFsaXplKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShub3JtYWxpemVkQWxpZW5aaXAudG9CeXRlQXJyYXkoKSksIHJlbm9ybWFsaXplZEFsaWVuWmlwKTsKLQotCQkJYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5vcm1hbGl6ZWRBbGllblppcC50b0J5dGVBcnJheSgpLCByZW5vcm1hbGl6ZWRBbGllblppcC50b0J5dGVBcnJheSgpKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoYWxpZW5aaXAgIT0gbnVsbCkKLQkJCQlhbGllblppcC5jbG9zZSgpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL2phcnByb2Nlc3Nvci5qYXIucGFjay5neiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL2phcnByb2Nlc3Nvci5qYXIucGFjay5negpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJkZjQ4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9qYXJwcm9jZXNzb3IuamFyLnBhY2suZ3oKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9vcHRpbWl6ZXJzLzFfNi9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIucGFjay5neiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvMV82L29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1Lmphci5wYWNrLmd6CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjUyYWQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvMV82L29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1Lmphci5wYWNrLmd6CisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvb3B0aW1pemVycy9lY2xpcHNlLTMuMi0zLjMuamJkaWZmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvb3B0aW1pemVycy9lY2xpcHNlLTMuMi0zLjMuamJkaWZmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWFjNzQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvZWNsaXBzZS0zLjItMy4zLmpiZGlmZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvZWNsaXBzZS0zLjIuZXhlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvb3B0aW1pemVycy9lY2xpcHNlLTMuMi5leGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjZkMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvb3B0aW1pemVycy9lY2xpcHNlLTMuMi5leGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9vcHRpbWl6ZXJzL2VjbGlwc2UtMy4zLmV4ZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvZWNsaXBzZS0zLjMuZXhlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWNkOGYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvZWNsaXBzZS0zLjMuZXhlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4MDllZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBfMS4wLjEwMC52MjAwNzEwMTUuamFyLnBhY2suZ3ogYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmVxdWlub3guYXBwXzEuMC4xMDAudjIwMDcxMDE1Lmphci5wYWNrLmd6CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTg2ZDNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBfMS4wLjEwMC52MjAwNzEwMTUuamFyLnBhY2suZ3oKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmpkdF8zLjIuMC0zLjMuMC5qYmRpZmYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmpkdF8zLjIuMC0zLjMuMC5qYmRpZmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MjBkNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5qZHRfMy4yLjAtMy4zLjAuamJkaWZmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5qZHRfMy4yLjAudjIwMDYwNjA1LTE0MDAubmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLm5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZWU0N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5qZHRfMy4yLjAudjIwMDYwNjA1LTE0MDAubmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNy0xMzAwLm5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5uamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGVlYzJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNy0xMzAwLm5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9vcHRpbWl6ZXJzL3Rlc3RkYXRhXzEuMC4wLjEtMi5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9vcHRpbWl6ZXJzL3Rlc3RkYXRhXzEuMC4wLjEtMi5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYTU0NmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvb3B0aW1pemVycy90ZXN0ZGF0YV8xLjAuMC4xLTIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvb3B0aW1pemVycy90ZXN0ZGF0YV8xLjAuMC4xLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZTdmOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvb3B0aW1pemVycy90ZXN0ZGF0YV8xLjAuMC4xLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMi5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9vcHRpbWl6ZXJzL3Rlc3RkYXRhXzEuMC4wLjIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTE1YjBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9zYXIvYWxpZW4uemlwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvc2FyL2FsaWVuLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg3MjIxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9zYXIvYWxpZW4uemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvc2FyL29yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9zYXIvb3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY3NGFlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9zYXIvb3JnLmVjbGlwc2UuamR0XzMuMi4wLnYyMDA2MDYwNS0xNDAwLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL3Nhci9vcmcuZWNsaXBzZS5qZHRfMy4yLjAudjIwMDYwNjA1LTE0MDAuc2FyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvc2FyL29yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5zYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYmZlMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvc2FyL29yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5zYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9zYXIvb3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNy0xMzAwLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL3Nhci9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGVlYzJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL3Nhci9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMvdGVzdERhdGEvc2FyL29yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDctMTMwMC5zYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9zYXIvb3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNy0xMzAwLnNhcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQyYmI3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9zYXIvb3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNy0xMzAwLnNhcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL3Nhci90ZXN0LnppcCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzL3Rlc3REYXRhL3Nhci90ZXN0LnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRlOGI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycy90ZXN0RGF0YS9zYXIvdGVzdC56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3Y2U1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGIyY2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotI0ZyaSBBcHIgMjUgMTI6MTU6NTggRURUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmF0YWxPcHRpb25hbEVycm9yPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJlZHVuZGFudE51bGxDaGVjaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50U3VwZXJpbnRlcmZhY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25FeGVtcHRFeGNlcHRpb25BbmRUaHJvd2FibGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbkluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJJbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MmM5ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jVHVlIE5vdiAxMyAxMjowMjoxMSBFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzMzMTkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNUaHUgQXVnIDIzIDE0OjU5OjAwIENFU1QgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz10cnVlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM4N2NiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHM7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuc2ltcGxlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5leHRlbnNpb25sb2NhdGlvbiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuaW8sCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5wZXJzaXN0ZW5jZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlc29sdXRpb24sCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlc2l0ZS5hcnRpZmFjdCwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZXNpdGUubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5wcm9jZXNzaW5nLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24sCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3RvciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUucGhhc2VzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudDt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UudXJsY29udmVyc2lvbjt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiLAotIG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluO3ZlcnNpb249IjEuMi4wIiwKLSBvcmcub3NnaS51dGlsLnRyYWNrZXI7dmVyc2lvbj0iMS4zLjMiLAotIG9yZy54bWwuc2F4Ci1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3IKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLAotIG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uLAotIG9yZy5qdW5pdAotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUVjbGlwc2UtUmVnaXN0ZXJCdWRkeTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3J5d2F0Y2hlciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRvd25sb2FkLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZW1iZWRkZWRlcXVpbm94LAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZW5naW5lLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZnVsbCwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmdlbmVyYXRvciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnNpbXBsZWNvbmZpZ3VyYXRvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL1Rlc3QgRGlyZWN0b3IgQ0RULmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9UZXN0IERpcmVjdG9yIENEVC5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjQ5ZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL1Rlc3QgRGlyZWN0b3IgQ0RULmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuSnVuaXRMYXVuY2hDb25maWciPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhcHBlbmQuYXJncyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJhcHBsaWNhdGlvbiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS5qdW5pdC5ydW50aW1lLmNvcmV0ZXN0YXBwbGljYXRpb24iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXNrY2xlYXIiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhcndzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhcndzbG9nIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlL3BkZS1qdW5pdCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0IiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ibG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly4uL2p1bml0LXdvcmtzcGFjZSIvPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3Byb3YvdGVzdC9EaXJlY3RvclRlc3QuamF2YSIvPgotPC9saXN0QXR0cmlidXRlPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9UWVBFUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIxIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuYXBwZW5kRW52aXJvbm1lbnRWYXJpYWJsZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LkNPTlRBSU5FUiIgdmFsdWU9IiIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuS0VFUFJVTk5JTkdfQVRUUiIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LlRFU1ROQU1FIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LlRFU1RfS0lORCIgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5sb2FkZXIuanVuaXQ0Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5NQUlOX1RZUEUiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yLkRpcmVjdG9yVGVzdCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItb3MgJHt0YXJnZXQub3N9IC13cyAke3RhcmdldC53c30gLWFyY2ggJHt0YXJnZXQuYXJjaH0gLW5sICR7dGFyZ2V0Lm5sfSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuVk1fQVJHVU1FTlRTIiB2YWx1ZT0iLURlY2xpcHNlLnAyLmRhdGEuYXJlYT1jOi90ZW1wL2VxdWlub3gucDIvYWdlbnQvJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5tZXRhZGF0YVJlcG9zaXRvcnk9ZmlsZTpjOi90ZW1wL2VxdWlub3gucDIvc2VydmVycy9DRFRtZXRhZGF0YVJlcG9zaXRvcnkvICYjMTM7JiMxMDstRGVjbGlwc2UucDIuYXJ0aWZhY3RSZXBvc2l0b3J5PWZpbGU6YzovdGVtcC9lcXVpbm94LnAyL3NlcnZlcnMvYXJ0aWZhY3RSZXBvc2l0b3J5LyYjMTM7JiMxMDstRGVjbGlwc2UucDIuaW5zdGFsbEZvbGRlcj1jOi90ZW1wL2VxdWlub3gucDIvZWNsaXBzZUluc3RhbGwvICYjMTM7JiMxMDstRGVjbGlwc2UucDIuY29uZmlndXJhdGlvbkZsYXZvcj10b29saW5nJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5hdXRvSW5zdGFsbD1jZHQiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InByb2R1Y3QiIHZhbHVlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5pZGUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlUHJvZHVjdCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idm1pbnN0YWxsIiB2YWx1ZT0iamRrIi8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvVGVzdCBEaXJlY3RvciBTREsubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL1Rlc3QgRGlyZWN0b3IgU0RLLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBlNjVkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvVGVzdCBEaXJlY3RvciBTREsubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuSnVuaXRMYXVuY2hDb25maWciPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhcHBlbmQuYXJncyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJhcHBsaWNhdGlvbiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS5qdW5pdC5ydW50aW1lLmNvcmV0ZXN0YXBwbGljYXRpb24iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXNrY2xlYXIiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3cyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJ3c2xvZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9wZGUtanVuaXQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdCIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iZGVzZWxlY3RlZF93b3Jrc3BhY2VfcGx1Z2lucyIgdmFsdWU9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iaW5jbHVkZU9wdGlvbmFsIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImxvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8uLi9qdW5pdC13b3Jrc3BhY2UiLz4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfUEFUSFMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wcm92L3Rlc3RzL2RpcmVjdG9yL0RpcmVjdG9yVGVzdC5qYXZhIi8+Ci08L2xpc3RBdHRyaWJ1dGU+Ci08bGlzdEF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuTUFQUEVEX1JFU09VUkNFX1RZUEVTIj4KLTxsaXN0RW50cnkgdmFsdWU9IjEiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5hcHBlbmRFbnZpcm9ubWVudFZhcmlhYmxlcyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuQ09OVEFJTkVSIiB2YWx1ZT0iIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5LRUVQUlVOTklOR19BVFRSIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVE5BTUUiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQuanVuaXQuVEVTVF9LSU5EIiB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LmxvYWRlci5qdW5pdDQiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLk1BSU5fVFlQRSIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3IuRGlyZWN0b3JUZXN0Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5QUk9HUkFNX0FSR1VNRU5UUyIgdmFsdWU9Ii1vcyAke3RhcmdldC5vc30gLXdzICR7dGFyZ2V0LndzfSAtYXJjaCAke3RhcmdldC5hcmNofSAtbmwgJHt0YXJnZXQubmx9IC1jb25zb2xlIC1ub0V4aXQgLWNvbnNvbGVMb2ciLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlZNX0FSR1VNRU5UUyIgdmFsdWU9Ii1EZWNsaXBzZS5wMi5kYXRhLmFyZWE9ZDovdG1wL2VxdWlub3gucDIvYWdlbnQvICYjMTM7JiMxMDstRGVjbGlwc2UucDIubWV0YWRhdGFSZXBvc2l0b3J5PWZpbGU6ZDovdG1wL2VxdWlub3gucDIvc2VydmVycy9tZXRhZGF0YVJlcG9zaXRvcnkvICYjMTM7JiMxMDstRGVjbGlwc2UucDIuYXJ0aWZhY3RSZXBvc2l0b3J5PWZpbGU6ZDovdG1wL2VxdWlub3gucDIvc2VydmVycy9hcnRpZmFjdFJlcG9zaXRvcnkvJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5pbnN0YWxsRm9sZGVyPWQ6L3RtcC9lcXVpbm94LnAyL2VjbGlwc2VJbnN0YWxsLyAmIzEzOyYjMTA7LURlY2xpcHNlLnAyLmNvbmZpZ3VyYXRpb25GbGF2b3I9dG9vbGluZyYjMTM7JiMxMDstRGVjbGlwc2UucDIuYXV0b0luc3RhbGw9c2RrIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icGRlLnZlcnNpb24iIHZhbHVlPSIzLjMiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwcm9kdWN0IiB2YWx1ZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0uaWRlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ic2VsZWN0ZWRfdGFyZ2V0X3BsdWdpbnMiIHZhbHVlPSJjb20uaWJtLmljdSxjb20uaWJtLmljdS5zb3VyY2UsY29tLmpjcmFmdC5qc2NoLGphdmF4LnNlcnZsZXQsamF2YXguc2VydmxldC5qc3AsamF2YXguc2VydmxldC5qc3Auc291cmNlLGphdmF4LnNlcnZsZXQuc291cmNlLG9yZy5hcGFjaGUuYW50LG9yZy5hcGFjaGUuYW50LnNvdXJjZSxvcmcuYXBhY2hlLmNvbW1vbnMuZWwsb3JnLmFwYWNoZS5jb21tb25zLmVsLnNvdXJjZSxvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyxvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2Usb3JnLmFwYWNoZS5qYXNwZXIsb3JnLmFwYWNoZS5qYXNwZXIuc291cmNlLG9yZy5hcGFjaGUubHVjZW5lLG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnNvdXJjZSxvcmcuYXBhY2hlLmx1Y2VuZS5zb3VyY2Usb3JnLmVjbGlwc2UuYW50LmNvcmUsb3JnLmVjbGlwc2UuYW50LnVpLG9yZy5lY2xpcHNlLmNvbXBhcmUsb3JnLmVjbGlwc2UuY29yZS5ib290LG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMsb3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSxvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLG9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcuYmVhbnMsb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyxvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLG9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbSxvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0ud2luMzIueDg2LG9yZy5lY2xpcHNlLmNvcmUuam9icyxvcmcuZWNsaXBzZS5jb3JlLm5ldCxvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcyxvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5jb21wYXRpYmlsaXR5LG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLndpbjMyLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eSxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5hdXRoLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LnJlZ2lzdHJ5LG9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzLG9yZy5lY2xpcHNlLmN2cyxvcmcuZWNsaXBzZS5jdnMuc291cmNlLG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUsb3JnLmVjbGlwc2UuZGVidWcudWksb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAsb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24sb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLmpldHR5LG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5yZWdpc3RyeSxvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuc2VydmxldCxvcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIsb3JnLmVjbGlwc2UuZXF1aW5veC5qc3AuamFzcGVyLnJlZ2lzdHJ5LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIsb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYsb3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcyxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5LG9yZy5lY2xpcHNlLmhlbHAsb3JnLmVjbGlwc2UuaGVscC5hcHBzZXJ2ZXIsb3JnLmVjbGlwc2UuaGVscC5iYXNlLG9yZy5lY2xpcHNlLmhlbHAudWksb3JnLmVjbGlwc2UuaGVscC53ZWJhcHAsb3JnLmVjbGlwc2UuamR0LG9yZy5lY2xpcHNlLmpkdC5hcHQuY29yZSxvcmcuZWNsaXBzZS5qZHQuYXB0LnBsdWdnYWJsZS5jb3JlLG9yZy5lY2xpcHNlLmpkdC5hcHQudWksb3JnLmVjbGlwc2UuamR0LmNvbXBpbGVyLmFwdCxvcmcuZWNsaXBzZS5qZHQuY29tcGlsZXIudG9vbCxvcmcuZWNsaXBzZS5qZHQuY29yZSxvcmcuZWNsaXBzZS5qZHQuY29yZS5tYW5pcHVsYXRpb24sb3JnLmVjbGlwc2UuamR0LmRlYnVnLG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy51aSxvcmcuZWNsaXBzZS5qZHQuZG9jLmlzdixvcmcuZWNsaXBzZS5qZHQuZG9jLnVzZXIsb3JnLmVjbGlwc2UuamR0Lmp1bml0LG9yZy5lY2xpcHNlLmpkdC5qdW5pdC5ydW50aW1lLG9yZy5lY2xpcHNlLmpkdC5qdW5pdDQucnVudGltZSxvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLG9yZy5lY2xpcHNlLmpkdC5zb3VyY2Usb3JnLmVjbGlwc2UuamR0LnVpLG9yZy5lY2xpcHNlLmpmYWNlLG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nLG9yZy5lY2xpcHNlLmpmYWNlLnRleHQsb3JnLmVjbGlwc2UuanNjaC5jb3JlLG9yZy5lY2xpcHNlLmpzY2gudWksb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3Jpbmcsb3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nLG9yZy5lY2xpcHNlLm9zZ2ksb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyxvcmcuZWNsaXBzZS5vc2dpLnV0aWwsb3JnLmVjbGlwc2UucGRlLG9yZy5lY2xpcHNlLnBkZS5idWlsZCxvcmcuZWNsaXBzZS5wZGUuY29yZSxvcmcuZWNsaXBzZS5wZGUuZG9jLnVzZXIsb3JnLmVjbGlwc2UucGRlLmp1bml0LnJ1bnRpbWUsb3JnLmVjbGlwc2UucGRlLnJ1bnRpbWUsb3JnLmVjbGlwc2UucGRlLnNvdXJjZSxvcmcuZWNsaXBzZS5wZGUudWksb3JnLmVjbGlwc2UucGRlLnVpLnRlbXBsYXRlcyxvcmcuZWNsaXBzZS5wbGF0Zm9ybSxvcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MuaXN2LG9yZy5lY2xpcHNlLnBsYXRmb3JtLmRvYy51c2VyLG9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZSxvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2Uud2luMzIud2luMzIueDg2LG9yZy5lY2xpcHNlLnJjcCxvcmcuZWNsaXBzZS5yY3Auc291cmNlLG9yZy5lY2xpcHNlLnJjcC5zb3VyY2Uud2luMzIud2luMzIueDg2LG9yZy5lY2xpcHNlLnNkayxvcmcuZWNsaXBzZS5zZWFyY2gsb3JnLmVjbGlwc2Uuc3d0LG9yZy5lY2xpcHNlLnN3dC53aW4zMi53aW4zMi54ODYsb3JnLmVjbGlwc2UudGVhbS5jb3JlLG9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUsb3JnLmVjbGlwc2UudGVhbS5jdnMuc3NoLG9yZy5lY2xpcHNlLnRlYW0uY3ZzLnNzaDIsb3JnLmVjbGlwc2UudGVhbS5jdnMudWksb3JnLmVjbGlwc2UudGVhbS51aSxvcmcuZWNsaXBzZS50ZXh0LG9yZy5lY2xpcHNlLnRvbWNhdCxvcmcuZWNsaXBzZS51aSxvcmcuZWNsaXBzZS51aS5icm93c2VyLG9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzLG9yZy5lY2xpcHNlLnVpLmNvbnNvbGUsb3JnLmVjbGlwc2UudWkuZWRpdG9ycyxvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLG9yZy5lY2xpcHNlLnVpLmZvcm1zLG9yZy5lY2xpcHNlLnVpLmlkZSxvcmcuZWNsaXBzZS51aS5pZGUuYXBwbGljYXRpb24sb3JnLmVjbGlwc2UudWkuaW50cm8sb3JnLmVjbGlwc2UudWkuaW50cm8udW5pdmVyc2FsLG9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvcixvcmcuZWNsaXBzZS51aS5uYXZpZ2F0b3IucmVzb3VyY2VzLG9yZy5lY2xpcHNlLnVpLm5ldCxvcmcuZWNsaXBzZS51aS5wcmVzZW50YXRpb25zLnIyMSxvcmcuZWNsaXBzZS51aS52aWV3cyxvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZCxvcmcuZWNsaXBzZS51aS53aW4zMixvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gsb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLmNvbXBhdGliaWxpdHksb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3Isb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvcixvcmcuZWNsaXBzZS51cGRhdGUuY29yZSxvcmcuZWNsaXBzZS51cGRhdGUuY29yZS53aW4zMixvcmcuZWNsaXBzZS51cGRhdGUuc2NoZWR1bGVyLG9yZy5lY2xpcHNlLnVwZGF0ZS51aSxvcmcuanVuaXQsb3JnLmp1bml0LnNvdXJjZSxvcmcuanVuaXQ0LG9yZy5tb3J0YmF5LmpldHR5LG9yZy5tb3J0YmF5LmpldHR5LnNvdXJjZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InNlbGVjdGVkX3dvcmtzcGFjZV9wbHVnaW5zIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZWNmLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3Qsb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIsb3JnLmFwYWNoZS54ZXJjZXMsb3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4sb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Isb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLG9yZy5tb3ppbGxhLnJoaW5vLG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSxjb20udGhvdWdodHdvcmtzLnhzdHJlYW0sb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUsb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZG93bmxvYWQsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNlbGZob3N0aW5nLG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZVByb2R1Y3QiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InZtaW5zdGFsbCIgdmFsdWU9ImlibTEuNXNyMSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL1Rlc3QgRGlyZWN0b3IgVW5pbnN0YWxsIENEVC5sYXVuY2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvVGVzdCBEaXJlY3RvciBVbmluc3RhbGwgQ0RULmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM5ZjQ1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvVGVzdCBEaXJlY3RvciBVbmluc3RhbGwgQ0RULmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuSnVuaXRMYXVuY2hDb25maWciPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhcHBlbmQuYXJncyIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJhcHBsaWNhdGlvbiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS5qdW5pdC5ydW50aW1lLmNvcmV0ZXN0YXBwbGljYXRpb24iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXNrY2xlYXIiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhcndzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhcndzbG9nIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjb25maWdMb2NhdGlvbiIgdmFsdWU9IiR7d29ya3NwYWNlX2xvY30vLm1ldGFkYXRhLy5wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5jb3JlL3BkZS1qdW5pdCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0IiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ibG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly4uL2p1bml0LXdvcmtzcGFjZSIvPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0L3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3Byb3YvdGVzdHMvZGlyZWN0b3IvRGlyZWN0b3JUZXN0LmphdmEiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iMSIvPgotPC9saXN0QXR0cmlidXRlPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5DT05UQUlORVIiIHZhbHVlPSIiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0Lmp1bml0LktFRVBSVU5OSU5HX0FUVFIiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUTkFNRSIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdC5URVNUX0tJTkQiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQubG9hZGVyLmp1bml0NCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuTUFJTl9UWVBFIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3Rvci5EaXJlY3RvclRlc3QiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0dSQU1fQVJHVU1FTlRTIiB2YWx1ZT0iLW9zICR7dGFyZ2V0Lm9zfSAtd3MgJHt0YXJnZXQud3N9IC1hcmNoICR7dGFyZ2V0LmFyY2h9IC1ubCAke3RhcmdldC5ubH0iLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlBST0pFQ1RfQVRUUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdCIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlZNX0FSR1VNRU5UUyIgdmFsdWU9Ii1EZWNsaXBzZS5wMi5kYXRhLmFyZWE9YzovdGVtcC9lcXVpbm94LnAyL2FnZW50LyYjMTM7JiMxMDstRGVjbGlwc2UucDIubWV0YWRhdGFSZXBvc2l0b3J5PWZpbGU6YzovdGVtcC9lcXVpbm94LnAyL3NlcnZlcnMvQ0RUbWV0YWRhdGFSZXBvc2l0b3J5LyAmIzEzOyYjMTA7LURlY2xpcHNlLnAyLmFydGlmYWN0UmVwb3NpdG9yeT1maWxlOmM6L3RlbXAvZXF1aW5veC5wMi9zZXJ2ZXJzL2FydGlmYWN0UmVwb3NpdG9yeS8mIzEzOyYjMTA7LURlY2xpcHNlLnAyLmluc3RhbGxGb2xkZXI9YzovdGVtcC9lcXVpbm94LnAyL2VjbGlwc2VJbnN0YWxsLyAmIzEzOyYjMTA7LURlY2xpcHNlLnAyLmNvbmZpZ3VyYXRpb25GbGF2b3I9dG9vbGluZyYjMTM7JiMxMDstRGVjbGlwc2UucDIuYXV0b0luc3RhbGw9Y2R0JiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5kb1VuaW5zdGFsbD10cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icGRlLnZlcnNpb24iIHZhbHVlPSIzLjMiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwcm9kdWN0IiB2YWx1ZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0uaWRlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InRyYWNpbmciIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VEZWZhdWx0Q29uZmlnQXJlYSIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZVByb2R1Y3QiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InZtaW5zdGFsbCIgdmFsdWU9ImpkayIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL1Rlc3QgRGlyZWN0b3IgVW5pbnN0YWxsIFNESy5sYXVuY2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvVGVzdCBEaXJlY3RvciBVbmluc3RhbGwgU0RLLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBhNjk4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvVGVzdCBEaXJlY3RvciBVbmluc3RhbGwgU0RLLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNvbmZpZ0xvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmUvVGVzdCBEaXJlY3RvciBVbmluc3RhbGwgU0RLIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfYXV0b19zdGFydCIgdmFsdWU9ImZhbHNlIi8+Ci08aW50QXR0cmlidXRlIGtleT0iZGVmYXVsdF9zdGFydF9sZXZlbCIgdmFsdWU9IjQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iaW5jbHVkZU9wdGlvbmFsIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItY29uc29sZSAtY29uc29sZWxvZyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlZNX0FSR1VNRU5UUyIgdmFsdWU9Ii1YbXM0MG0mIzEzOyYjMTA7LVhteDc2OG0mIzEzOyYjMTA7LURlY2xpcHNlLnAyLmRhdGEuYXJlYT1jOi90ZW1wL2VxdWlub3gucDIvYWdlbnQvJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5tZXRhZGF0YVJlcG9zaXRvcnk9ZmlsZTpjOi90ZW1wL2VxdWlub3gucDIvc2VydmVycy9tZXRhZGF0YVJlcG9zaXRvcnkvICYjMTM7JiMxMDstRGVjbGlwc2UucDIuYXJ0aWZhY3RSZXBvc2l0b3J5PWZpbGU6YzovdGVtcC9lcXVpbm94LnAyL3NlcnZlcnMvYXJ0aWZhY3RSZXBvc2l0b3J5LyYjMTM7JiMxMDstRGVjbGlwc2UucDIuaW5zdGFsbEZvbGRlcj1jOi90ZW1wL2VxdWlub3gucDIvZWNsaXBzZUluc3RhbGwvICYjMTM7JiMxMDstRGVjbGlwc2UucDIuY29uZmlndXJhdGlvbkZsYXZvcj10b29saW5nJiMxMzsmIzEwOy1EZWNsaXBzZS5wMi5hdXRvSW5zdGFsbD1zZGsmIzEzOyYjMTA7LURlY2xpcHNlLnAyLmRvVW5pbnN0YWxsPXRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0YXJnZXRfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUuam9ic0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpQDosb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmp1bml0QGRlZmF1bHQ6ZGVmYXVsdCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ0cmFjaW5nIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlRGVmYXVsdENvbmZpZ0FyZWEiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZU5hbWVkSlJFIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InZtaW5zdGFsbCIgdmFsdWU9IkpSRTEuNC4yIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJjb20udGhvdWdodHdvcmtzLnhzdHJlYW1AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3hAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRvd25sb2FkQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yQDE6dHJ1ZSIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTYxY2VhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0ZXN0RGF0YS8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVzdC54bWwKLWN1c3RvbUNhbGxCYWNrPWZvby54bWwKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkNzEyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggUHJvdmlzaW9uaW5nIFRlc3RzIChJbmN1YmF0aW9uKQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwMzQyYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgaWQ9InBoYXNlVGVzdCIKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUudG91Y2hwb2ludHMiPgotICAgIDx0b3VjaHBvaW50Ci0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZW5naW5lLlRvdWNocG9pbnRUZXN0JFBoYXNlVGVzdFRvdWNocG9pbnQiCi0gICAgICAgICAgdHlwZT0icGhhc2VUZXN0IgotICAgICAgICAgIHZlcnNpb249IjEuMC4wIj4KLSAgICA8L3RvdWNocG9pbnQ+Ci0gPC9leHRlbnNpb24+Ci0gPGV4dGVuc2lvbgotICAgICAgIGlkPSJvcGVyYW5kVGVzdCIKLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUudG91Y2hwb2ludHMiPgotICAgIDx0b3VjaHBvaW50Ci0gICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZW5naW5lLlRvdWNocG9pbnRUZXN0JE9wZXJhbmRUZXN0VG91Y2hwb2ludCIKLSAgICAgICAgICB0eXBlPSJvcGVyYW5kVGVzdCIKLSAgICAgICAgICB2ZXJzaW9uPSIxLjAuMCI+Ci0gICAgPC90b3VjaHBvaW50PgotIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9yYXdEYXRhL1Rlc3QgRGF0YSBHZW5lcmF0b3IubGF1bmNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Jhd0RhdGEvVGVzdCBEYXRhIEdlbmVyYXRvci5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOWE2YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Jhd0RhdGEvVGVzdCBEYXRhIEdlbmVyYXRvci5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9UZXN0IERhdGEgR2VuZXJhdG9yIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfYXV0b19zdGFydCIgdmFsdWU9ImZhbHNlIi8+Ci08aW50QXR0cmlidXRlIGtleT0iZGVmYXVsdF9zdGFydF9sZXZlbCIgdmFsdWU9IjQiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJleGVjRW52aXJvbm1lbnQiIHZhbHVlPSJKMlNFLTEuNSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuRWNsaXBzZUdlbmVyYXRvciYjMTM7JiMxMDstbWV0YWRhdGFSZXBvc2l0b3J5IGZpbGU6JHt3b3Jrc3BhY2VfbG9jOm9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZW5naW5lcmVwb30mIzEzOyYjMTA7LWFydGlmYWN0UmVwb3NpdG9yeSBmaWxlOiR7d29ya3NwYWNlX2xvYzpvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2VuZ2luZXJlcG99ICYjMTM7JiMxMDstYmFzZSAke3dvcmtzcGFjZV9sb2M6b3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9yYXdEYXRhfSYjMTM7JiMxMDstYnVuZGxlcyAke3dvcmtzcGFjZV9sb2M6b3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9yYXdEYXRhfSYjMTM7JiMxMDstZmVhdHVyZXMgJHt3b3Jrc3BhY2VfbG9jOm9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvcmF3RGF0YX0mIzEzOyYjMTA7LXB1Ymxpc2hBcnRpZmFjdHMgJiMxMzsmIzEwOy1wYXImIzEzOyYjMTA7LW5vRGVmYXVsdElVcyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5qb2JzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LnJlZ2lzdHJ5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmFwcEBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb25AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpQDosb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvckBkZWZhdWx0OmRlZmF1bHQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VOYW1lZEpSRSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0idm1pbnN0YWxsIiB2YWx1ZT0iaWJtMS41c3IxIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lY2ZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94QGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kb3dubG9hZEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnlAZGVmYXVsdDpkZWZhdWx0Ii8+Ci08L2xhdW5jaENvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvcmF3RGF0YS9lbmdpbmVyZXBvLmphcmRlc2MgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvcmF3RGF0YS9lbmdpbmVyZXBvLmphcmRlc2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MGE5MzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Jhd0RhdGEvZW5naW5lcmVwby5qYXJkZXNjCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iV0lORE9XUy0xMjUyIj8+Ci08amFyZGVzYz4KLSAgICA8amFyIHBhdGg9IkQ6L3dvcmtzcGFjZXMvcHJvdi5zZWxmaG9zdC9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2VuZ2luZXJlcG8uamFyIi8+Ci0gICAgPG9wdGlvbnMgYnVpbGRJZk5lZWRlZD0idHJ1ZSIgY29tcHJlc3M9InRydWUiIGRlc2NyaXB0aW9uTG9jYXRpb249Ii9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Jhd0RhdGEvZW5naW5lcmVwby5qYXJkZXNjIiBleHBvcnRFcnJvcnM9InRydWUiIGV4cG9ydFdhcm5pbmdzPSJ0cnVlIiBpbmNsdWRlRGlyZWN0b3J5RW50cmllcz0iZmFsc2UiIG92ZXJ3cml0ZT0iZmFsc2UiIHNhdmVEZXNjcmlwdGlvbj0idHJ1ZSIgc3RvcmVSZWZhY3RvcmluZ3M9ImZhbHNlIiB1c2VTb3VyY2VGb2xkZXJzPSJmYWxzZSIvPgotICAgIDxzdG9yZWRSZWZhY3RvcmluZ3MgZGVwcmVjYXRpb25JbmZvPSJ0cnVlIiBzdHJ1Y3R1cmFsT25seT0iZmFsc2UiLz4KLSAgICA8c2VsZWN0ZWRQcm9qZWN0cy8+Ci0gICAgPG1hbmlmZXN0IGdlbmVyYXRlTWFuaWZlc3Q9InRydWUiIG1hbmlmZXN0TG9jYXRpb249IiIgbWFuaWZlc3RWZXJzaW9uPSIxLjAiIHJldXNlTWFuaWZlc3Q9ImZhbHNlIiBzYXZlTWFuaWZlc3Q9ImZhbHNlIiB1c2VzTWFuaWZlc3Q9InRydWUiPgotICAgICAgICA8c2VhbGluZyBzZWFsSmFyPSJmYWxzZSI+Ci0gICAgICAgICAgICA8cGFja2FnZXNUb1NlYWwvPgotICAgICAgICAgICAgPHBhY2thZ2VzVG9VblNlYWwvPgotICAgICAgICA8L3NlYWxpbmc+Ci0gICAgPC9tYW5pZmVzdD4KLSAgICA8c2VsZWN0ZWRFbGVtZW50cyBleHBvcnRDbGFzc0ZpbGVzPSJ0cnVlIiBleHBvcnRKYXZhRmlsZXM9ImZhbHNlIiBleHBvcnRPdXRwdXRGb2xkZXI9ImZhbHNlIj4KLSAgICAgICAgPGZvbGRlciBwYXRoPSIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9lbmdpbmVyZXBvIi8+Ci0gICAgPC9zZWxlY3RlZEVsZW1lbnRzPgotPC9qYXJkZXNjPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Jhd0RhdGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wcm92LmVuZ2luZV8wLjEuMC4yMDA3MDkyNDE2MzEuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Jhd0RhdGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wcm92LmVuZ2luZV8wLjEuMC4yMDA3MDkyNDE2MzEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTNmZjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9yYXdEYXRhL29yZy5lY2xpcHNlLmVxdWlub3gucHJvdi5lbmdpbmVfMC4xLjAuMjAwNzA5MjQxNjMxLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgwZTA2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHM7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5NZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBwcm92aXNpb25pbmcgdGVzdHMgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIHVzZWQgYnkgbXVsdGlwbGUgdGVzdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFZlcnNpb25SYW5nZSBBTllfVkVSU0lPTiA9IG5ldyBWZXJzaW9uUmFuZ2UoVmVyc2lvbi5lbXB0eVZlcnNpb24sIHRydWUsIG5ldyBWZXJzaW9uKEludGVnZXIuTUFYX1ZBTFVFLCBJbnRlZ2VyLk1BWF9WQUxVRSwgSW50ZWdlci5NQVhfVkFMVUUpLCB0cnVlKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm92aWRlZENhcGFiaWxpdHlbXSBCVU5ETEVfQ0FQQUJJTElUWSA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eSgiZWNsaXBzZS50b3VjaHBvaW50IiwgImJ1bmRsZSIsIG5ldyBWZXJzaW9uKDEsIDAsIDApKX07Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXF1aXJlZENhcGFiaWxpdHlbXSBCVU5ETEVfUkVRVUlSRU1FTlQgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoImVjbGlwc2UudG91Y2hwb2ludCIsICJidW5kbGUiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIHRydWUpfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVmVyc2lvbiBERUZBVUxUX1ZFUlNJT04gPSBuZXcgVmVyc2lvbigxLCAwLCAwKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFRvdWNocG9pbnRUeXBlIFRPVUNIUE9JTlRfT1NHSSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50VHlwZSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpIiwgbmV3IFZlcnNpb24oMSwgMCwgMCkpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBNYXAgTk9fUFJPUEVSVElFUyA9IENvbGxlY3Rpb25zLkVNUFRZX01BUDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFByb3ZpZGVkQ2FwYWJpbGl0eVtdIE5PX1BST1ZJREVTID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVswXTsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIE5PX1JFUVVJUkVTID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVswXTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgVG91Y2hwb2ludERhdGEgTk9fVFBfREFUQSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YShuZXcgSGFzaE1hcCgpKTsKLQotCS8qKgotCSAqIFRyYWNrcyB0aGUgbWV0YWRhdGEgcmVwb3NpdG9yaWVzIGNyZWF0ZWQgYnkgdGhpcyB0ZXN0IGluc3RhbmNlLiBUaGUgcmVwb3NpdG9yaWVzCi0JICogd2lsbCBiZSByZW1vdmVkIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGVuZCBvZiB0aGUgdGVzdC4KLQkgKi8KLQlwcml2YXRlIExpc3QgbWV0YWRhdGFSZXBvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkvKioKLQkgKiBUcmFja3MgdGhlIHByb2ZpbGVzIGNyZWF0ZWQgYnkgdGhpcyB0ZXN0IGluc3RhbmNlLiBUaGUgcHJvZmlsZXMKLQkgKiB3aWxsIGJlIHJlbW92ZWQgYXV0b21hdGljYWxseSBhdCB0aGUgZW5kIG9mIHRoZSB0ZXN0LgotCSAqLwotCXByaXZhdGUgTGlzdCBwcm9maWxlc1RvUmVtb3ZlID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVtcHR5UHJvZmlsZShJUHJvZmlsZSBwcm9maWxlKSB7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSBwcm9maWxlIHNob3VsZCBub3QgYmUgbnVsbCIsIHByb2ZpbGUpOwotCQlpZiAoZ2V0SW5zdGFsbGFibGVVbml0cyhwcm9maWxlKS5oYXNOZXh0KCkpCi0JCQlmYWlsKCJUaGUgcHJvZmlsZSBzaG91bGQgYmUgZW1wdHkscHJvZmlsZUlkPSIgKyBwcm9maWxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgYXNzZXJ0Tm90SVVzKElJbnN0YWxsYWJsZVVuaXRbXSBpdXMsIEl0ZXJhdG9yIGluc3RhbGxhYmxlVW5pdHMpIHsKLQkJU2V0IG5vdGV4cGVjdGVkID0gbmV3IEhhc2hTZXQoKTsKLQkJbm90ZXhwZWN0ZWQuYWRkQWxsKEFycmF5cy5hc0xpc3QoaXVzKSk7Ci0KLQkJd2hpbGUgKGluc3RhbGxhYmxlVW5pdHMuaGFzTmV4dCgpKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IG5leHQgPSAoSUluc3RhbGxhYmxlVW5pdCkgaW5zdGFsbGFibGVVbml0cy5uZXh0KCk7Ci0JCQlpZiAobm90ZXhwZWN0ZWQuY29udGFpbnMobmV4dCkpIHsKLQkJCQlmYWlsKCJub3QgZXhwZWN0ZWQgWyIgKyBuZXh0ICsgIl0iKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhc3NlcnROb3RPSyhJU3RhdHVzIHJlc3VsdCkgewotCQlhc3NlcnRUcnVlKCJUaGUgc3RhdHVzIHNob3VsZCBub3QgaGF2ZSBiZWVuIE9LIiwgIXJlc3VsdC5pc09LKCkpOwotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhc3NlcnRPSyhTdHJpbmcgbWVzc2FnZSwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHN0YXR1cy5pc09LKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gcHJpbnQgb3V0IHRoZSBjaGlsZHJlbiBpZiB3ZSBoYXZlIGFueQotCQlJU3RhdHVzIGNoaWxkcmVuW10gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJSVN0YXR1cyBjaGlsZCA9IGNoaWxkcmVuW2ldOwotCQkJaWYgKCFjaGlsZC5pc09LKCkpCi0JCQkJbmV3IENvcmVFeGNlcHRpb24oY2hpbGQpLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0KLQkJZmFpbChtZXNzYWdlICsgJyAnICsgc3RhdHVzLmdldE1lc3NhZ2UoKSwgc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHByb2ZpbGUgY29udGFpbnMgKm9ubHkqIHRoZSBnaXZlbiBJVXMuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGFzc2VydFByb2ZpbGVDb250YWlucyhTdHJpbmcgbWVzc2FnZSwgSVByb2ZpbGUgcHJvZmlsZSwgSUluc3RhbGxhYmxlVW5pdFtdIGV4cGVjdGVkVW5pdHMpIHsKLQkJSGFzaFNldCBleHBlY3RlZCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QoZXhwZWN0ZWRVbml0cykpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0SW5zdGFsbGFibGVVbml0cyhwcm9maWxlKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBhY3R1YWwgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXQubmV4dCgpOwotCQkJaWYgKCFleHBlY3RlZC5yZW1vdmUoYWN0dWFsKSkKLQkJCQlmYWlsKG1lc3NhZ2UgKyAiIHByb2ZpbGUgIiArIHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkgKyAiIGNvbnRhaW5lZCBhbiB1bmV4cGVjdGVkIHVuaXQ6ICIgKyBhY3R1YWwpOwotCQl9Ci0JCWlmICghZXhwZWN0ZWQuaXNFbXB0eSgpKQotCQkJZmFpbChtZXNzYWdlICsgIiBwcm9maWxlICIgKyBwcm9maWxlLmdldFByb2ZpbGVJZCgpICsgIiBkaWQgbm90IGNvbnRhaW4gZXhwZWN0ZWQgdW5pdHM6ICIgKyBleHBlY3RlZCk7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBwcm9maWxlIGNvbnRhaW5zIGFsbCB0aGUgZ2l2ZW4gSVVzLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoU3RyaW5nIG1lc3NhZ2UsIElQcm9maWxlIHByb2ZpbGUyLCBJSW5zdGFsbGFibGVVbml0W10gZXhwZWN0ZWRVbml0cykgewotCQlIYXNoU2V0IGV4cGVjdGVkID0gbmV3IEhhc2hTZXQoQXJyYXlzLmFzTGlzdChleHBlY3RlZFVuaXRzKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBnZXRJbnN0YWxsYWJsZVVuaXRzKHByb2ZpbGUyKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBhY3R1YWwgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXQubmV4dCgpOwotCQkJZXhwZWN0ZWQucmVtb3ZlKGFjdHVhbCk7Ci0JCX0KLQkJaWYgKCFleHBlY3RlZC5pc0VtcHR5KCkpCi0JCQlmYWlsKG1lc3NhZ2UgKyAiIHByb2ZpbGUgIiArIHByb2ZpbGUyLmdldFByb2ZpbGVJZCgpICsgIiBkaWQgbm90IGNvbnRhaW4gZXhwZWN0ZWQgdW5pdHM6ICIgKyBleHBlY3RlZCk7Ci0JfQotCi0JLyoKLQkgKiBDb3B5Ci0JICogLSBpZiB3ZSBoYXZlIGEgZmlsZSwgdGhlbiBjb3B5IHRoZSBmaWxlCi0JICogLSBpZiB3ZSBoYXZlIGEgZGlyZWN0b3J5IHRoZW4gbWVyZ2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgY29weShTdHJpbmcgbWVzc2FnZSwgRmlsZSBzb3VyY2UsIEZpbGUgdGFyZ2V0KSB7Ci0JCWlmICghc291cmNlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCQlpZiAoc291cmNlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCWlmICh0YXJnZXQuZXhpc3RzKCkgJiYgdGFyZ2V0LmlzRmlsZSgpKQotCQkJCXRhcmdldC5kZWxldGUoKTsKLQkJCWlmICghdGFyZ2V0LmV4aXN0cygpKQotCQkJCXRhcmdldC5ta2RpcnMoKTsKLQkJCUZpbGVbXSBjaGlsZHJlbiA9IHNvdXJjZS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJY29weShtZXNzYWdlLCBjaGlsZHJlbltpXSwgbmV3IEZpbGUodGFyZ2V0LCBjaGlsZHJlbltpXS5nZXROYW1lKCkpKTsKLQkJCXJldHVybjsKLQkJfQotCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCU91dHB1dFN0cmVhbSBvdXRwdXQgPSBudWxsOwotCQl0cnkgewotCQkJaW5wdXQgPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKHNvdXJjZSkpOwotCQkJb3V0cHV0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldCkpOwotCi0JCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07Ci0JCQlpbnQgYnl0ZXNSZWFkID0gMDsKLQkJCXdoaWxlICgoYnl0ZXNSZWFkID0gaW5wdXQucmVhZChidWZmZXIpKSAhPSAtMSkKLQkJCQlvdXRwdXQud3JpdGUoYnVmZmVyLCAwLCBieXRlc1JlYWQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKG1lc3NhZ2UsIGUpOwotCQl9IGZpbmFsbHkgewotCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJFeGNlcHRpb24gd2hpbGUgdHJ5aW5nIHRvIGNsb3NlIGlucHV0IHN0cmVhbSBvbjogIiArIHNvdXJjZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG91dHB1dCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkV4Y2VwdGlvbiB3aGlsZSB0cnlpbmcgdG8gY2xvc2Ugb3V0cHV0IHN0cmVhbSBvbjogIiArIHRhcmdldC5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCUNyZWF0ZSBhbiBlY2xpcHNlIEluc3RhbGxhYmxlVW5pdEZyYWdtZW50IHdpdGggdGhlIGdpdmVuIG5hbWUgdGhhdCBpcyBob3N0ZWQKLQkgKiAgYnkgYW55IGJ1bmRsZS4gVGhlIGZyYWdtZW50IGhhcyB0aGUgZGVmYXVsdCB2ZXJzaW9uLCBhbmQgdGhlIGRlZmF1bHQgc2VsZiBhbmQKLQkgKiAgZnJhZ21lbnQgcHJvdmlkZWQgY2FwYWJpbGl0aWVzIGFyZSBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgY3JlYXRlQnVuZGxlRnJhZ21lbnQoU3RyaW5nIG5hbWUpIHsKLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBmcmFnbWVudCA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCWZyYWdtZW50LnNldElkKG5hbWUpOwotCQlmcmFnbWVudC5zZXRWZXJzaW9uKERFRkFVTFRfVkVSU0lPTik7Ci0JCWZyYWdtZW50LnNldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0ZSQUdNRU5ULCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCWZyYWdtZW50LnNldFRvdWNocG9pbnRUeXBlKFRPVUNIUE9JTlRfT1NHSSk7Ci0JCWZyYWdtZW50LmFkZFRvdWNocG9pbnREYXRhKE5PX1RQX0RBVEEpOwotCQlmcmFnbWVudC5zZXRIb3N0KEJVTkRMRV9SRVFVSVJFTUVOVCk7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0RnJhZ21lbnQoZnJhZ21lbnQpOwotCi0JCS8vCQlyZXR1cm4gY3JlYXRlSVVGcmFnbWVudChudWxsLCBuYW1lLCBERUZBVUxUX1ZFUlNJT04sIEJVTkRMRV9SRVFVSVJFTUVOVCwgVE9VQ0hQT0lOVF9PU0dJLCBOT19UUF9EQVRBKTsKLQl9Ci0KLQkvKioKLQkgKiAJQ3JlYXRlIGFuIGVjbGlwc2UgSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgdmVyc2lvbgotCSAqICB0aGF0IGlzIGhvc3RlZCBieSBhbnkgYnVuZGxlLiBUaGUgZGVmYXVsdCBzZWxmIGFuZCBmcmFnbWVudCBwcm92aWRlZCBjYXBhYmlsaXRpZXMKLQkgKiAgYXJlIGFkZGVkIHRvIHRoZSBJVS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCBjcmVhdGVCdW5kbGVGcmFnbWVudChTdHJpbmcgbmFtZSwgVmVyc2lvbiB2ZXJzaW9uLCBUb3VjaHBvaW50RGF0YSB0cERhdGEpIHsKLQkJcmV0dXJuIGNyZWF0ZUlVRnJhZ21lbnQobnVsbCwgbmFtZSwgdmVyc2lvbiwgQlVORExFX1JFUVVJUkVNRU5ULCBUT1VDSFBPSU5UX09TR0ksIHRwRGF0YSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRGlyZWN0b3IgY3JlYXRlRGlyZWN0b3IoKSB7Ci0JCXJldHVybiAoSURpcmVjdG9yKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElEaXJlY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYW4gRWNsaXBzZSBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUVjbGlwc2VJVShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY3JlYXRlRWNsaXBzZUlVKG5hbWUsIERFRkFVTFRfVkVSU0lPTik7Ci0JfQotCi0JLyoqCi0JICogCUNyZWF0ZSBhbiBFY2xpcHNlIEluc3RhbGxhYmxlVW5pdCB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLiBBbGwgb3RoZXIgYXR0cmlidXRlcwotCSAqIGFzc3VtZSBkZWZhdWx0IHZhbHVlcywgYW5kIHRoZSBkZWZhdWx0IHNlbGYgY2FwYWJpbGl0eSBpcyBhbHNvIGFkZGVkIHRvIHRoZSBJVS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlRWNsaXBzZUlVKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIHZlcnNpb24sIG51bGwsIE5PX1JFUVVJUkVTLCBCVU5ETEVfQ0FQQUJJTElUWSwgTk9fUFJPUEVSVElFUywgVE9VQ0hQT0lOVF9PU0dJLCBOT19UUF9EQVRBLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCUNyZWF0ZSBhbiBFY2xpcHNlIEluc3RhbGxhYmxlVW5pdCB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLiBBbGwgb3RoZXIgYXR0cmlidXRlcwotCSAqIGFzc3VtZSBkZWZhdWx0IHZhbHVlcywgYW5kIHRoZSBkZWZhdWx0IHNlbGYgY2FwYWJpbGl0eSBpcyBhbHNvIGFkZGVkIHRvIHRoZSBJVS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlRWNsaXBzZUlVKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24sIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVzLCBUb3VjaHBvaW50RGF0YSB0b3VjaHBvaW50RGF0YSkgewotCQlyZXR1cm4gY3JlYXRlSVUobmFtZSwgdmVyc2lvbiwgbnVsbCwgcmVxdWlyZXMsIEJVTkRMRV9DQVBBQklMSVRZLCBOT19QUk9QRVJUSUVTLCBUT1VDSFBPSU5UX09TR0ksIHRvdWNocG9pbnREYXRhLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRW5naW5lIGNyZWF0ZUVuZ2luZSgpIHsKLQkJcmV0dXJuIChJRW5naW5lKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElFbmdpbmUuU0VSVklDRV9OQU1FKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgY29ycmVjdGx5IGZvcm1hdHRlZCBMREFQIGZpbHRlciB3aXRoIHRoZSBnaXZlbiBrZXkgYW5kIHZhbHVlLgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGNyZWF0ZUZpbHRlcihTdHJpbmcgZmlsdGVyS2V5LCBTdHJpbmcgZmlsdGVyVmFsdWUpIHsKLQkJcmV0dXJuICIoIiArIGZpbHRlcktleSArICc9JyArIGZpbHRlclZhbHVlICsgJyknOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBjcmVhdGVJVShuYW1lLCBERUZBVUxUX1ZFUlNJT04pOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lLCBQcm92aWRlZENhcGFiaWxpdHlbXSBhZGRpdGlvbmFsUHJvdmlkZXMpIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIERFRkFVTFRfVkVSU0lPTiwgbnVsbCwgTk9fUkVRVUlSRVMsIGFkZGl0aW9uYWxQcm92aWRlcywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lLCBSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlcykgewotCQlyZXR1cm4gY3JlYXRlSVUobmFtZSwgREVGQVVMVF9WRVJTSU9OLCBudWxsLCByZXF1aXJlcywgTk9fUFJPVklERVMsIE5PX1BST1BFUlRJRVMsIFRvdWNocG9pbnRUeXBlLk5PTkUsIE5PX1RQX0RBVEEsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiAJQ3JlYXRlIGEgYmFzaWMgSW5zdGFsbGFibGVVbml0IHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuIEFsbCBvdGhlciBhdHRyaWJ1dGVzCi0JICogYXNzdW1lIGRlZmF1bHQgdmFsdWVzLCBhbmQgdGhlIGRlZmF1bHQgc2VsZiBjYXBhYmlsaXR5IGlzIGFsc28gYWRkZWQgdG8gdGhlIElVLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVJVShTdHJpbmcgbmFtZSwgUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZXMsIGJvb2xlYW4gc2luZ2xldG9uKSB7Ci0JCXJldHVybiBjcmVhdGVJVShuYW1lLCBERUZBVUxUX1ZFUlNJT04sIG51bGwsIHJlcXVpcmVzLCBOT19QUk9WSURFUywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgc2luZ2xldG9uKTsKLQl9Ci0KLQkvKioKLQkgKiAJQ3JlYXRlIGEgYmFzaWMgSW5zdGFsbGFibGVVbml0IHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuIEFsbCBvdGhlciBhdHRyaWJ1dGVzCi0JICogYXNzdW1lIGRlZmF1bHQgdmFsdWVzLCBhbmQgdGhlIGRlZmF1bHQgc2VsZiBjYXBhYmlsaXR5IGlzIGFsc28gYWRkZWQgdG8gdGhlIElVLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVJVShTdHJpbmcgbmFtZSwgU3RyaW5nIGZpbHRlciwgUHJvdmlkZWRDYXBhYmlsaXR5W10gYWRkaXRpb25hbFByb3ZpZGVzKSB7Ci0JCXJldHVybiBjcmVhdGVJVShuYW1lLCBERUZBVUxUX1ZFUlNJT04sIGZpbHRlciwgTk9fUkVRVUlSRVMsIGFkZGl0aW9uYWxQcm92aWRlcywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24pIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIHZlcnNpb24sIG51bGwsIE5PX1JFUVVJUkVTLCBOT19QUk9WSURFUywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24sIGJvb2xlYW4gc2luZ2xldG9uKSB7Ci0JCXJldHVybiBjcmVhdGVJVShuYW1lLCB2ZXJzaW9uLCBudWxsLCBOT19SRVFVSVJFUywgTk9fUFJPVklERVMsIE5PX1BST1BFUlRJRVMsIFRvdWNocG9pbnRUeXBlLk5PTkUsIE5PX1RQX0RBVEEsIHNpbmdsZXRvbik7Ci0JfQotCi0JLyoqCi0JICogCUNyZWF0ZSBhIGJhc2ljIEluc3RhbGxhYmxlVW5pdCB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLiBBbGwgb3RoZXIgYXR0cmlidXRlcwotCSAqIGFzc3VtZSBkZWZhdWx0IHZhbHVlcywgYW5kIHRoZSBkZWZhdWx0IHNlbGYgY2FwYWJpbGl0eSBpcyBhbHNvIGFkZGVkIHRvIHRoZSBJVS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlSVUoU3RyaW5nIG5hbWUsIFZlcnNpb24gdmVyc2lvbiwgUHJvdmlkZWRDYXBhYmlsaXR5W10gYWRkaXRpb25hbFByb3ZpZGVzKSB7Ci0JCXJldHVybiBjcmVhdGVJVShuYW1lLCB2ZXJzaW9uLCBudWxsLCBOT19SRVFVSVJFUywgYWRkaXRpb25hbFByb3ZpZGVzLCBOT19QUk9QRVJUSUVTLCBUb3VjaHBvaW50VHlwZS5OT05FLCBOT19UUF9EQVRBLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCUNyZWF0ZSBhIGJhc2ljIEluc3RhbGxhYmxlVW5pdCB3aXRoIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLiBBbGwgb3RoZXIgYXR0cmlidXRlcwotCSAqIGFzc3VtZSBkZWZhdWx0IHZhbHVlcywgYW5kIHRoZSBkZWZhdWx0IHNlbGYgY2FwYWJpbGl0eSBpcyBhbHNvIGFkZGVkIHRvIHRoZSBJVS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlSVUoU3RyaW5nIG5hbWUsIFZlcnNpb24gdmVyc2lvbiwgUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZWQpIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIHZlcnNpb24sIG51bGwsIHJlcXVpcmVkLCBOT19QUk9WSURFUywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24sIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkLCBNYXAgcHJvcGVydGllcywgYm9vbGVhbiBzaW5nbGV0b24pIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIHZlcnNpb24sIG51bGwsIHJlcXVpcmVkLCBOT19QUk9WSURFUywgcHJvcGVydGllcywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgc2luZ2xldG9uKTsKLQl9Ci0KLQkvKioKLQkgKiAJQ3JlYXRlIGEgYmFzaWMgSW5zdGFsbGFibGVVbml0IHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuIEFsbCBvdGhlciBhdHRyaWJ1dGVzCi0JICogYXNzdW1lIGRlZmF1bHQgdmFsdWVzLCBhbmQgdGhlIGRlZmF1bHQgc2VsZiBjYXBhYmlsaXR5IGlzIGFsc28gYWRkZWQgdG8gdGhlIElVLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVJVShTdHJpbmcgbmFtZSwgVmVyc2lvbiB2ZXJzaW9uLCBTdHJpbmcgZmlsdGVyLCBQcm92aWRlZENhcGFiaWxpdHlbXSBhZGRpdGlvbmFsUHJvdmlkZXMpIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIHZlcnNpb24sIGZpbHRlciwgTk9fUkVRVUlSRVMsIGFkZGl0aW9uYWxQcm92aWRlcywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAlDcmVhdGUgYSBiYXNpYyBJbnN0YWxsYWJsZVVuaXQgd2l0aCB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4gQWxsIG90aGVyIGF0dHJpYnV0ZXMKLQkgKiBhc3N1bWUgZGVmYXVsdCB2YWx1ZXMsIGFuZCB0aGUgZGVmYXVsdCBzZWxmIGNhcGFiaWxpdHkgaXMgYWxzbyBhZGRlZCB0byB0aGUgSVUuCi0JICovCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBmaWx0ZXIsIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkLCBQcm92aWRlZENhcGFiaWxpdHlbXSBhZGRpdGlvbmFsUHJvdmlkZXMsIE1hcCBwcm9wZXJ0aWVzLCBUb3VjaHBvaW50VHlwZSB0cFR5cGUsIFRvdWNocG9pbnREYXRhIHRwRGF0YSwgYm9vbGVhbiBzaW5nbGV0b24pIHsKLQkJcmV0dXJuIGNyZWF0ZUlVKG5hbWUsIHZlcnNpb24sIGZpbHRlciwgcmVxdWlyZWQsIGFkZGl0aW9uYWxQcm92aWRlcywgcHJvcGVydGllcywgdHBUeXBlLCB0cERhdGEsIHNpbmdsZXRvbiwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0UGF0Y2ggY3JlYXRlSVVQYXRjaChTdHJpbmcgbmFtZSwgVmVyc2lvbiB2ZXJzaW9uLCBib29sZWFuIHNpbmdsZXRvbiwgUmVxdWlyZW1lbnRDaGFuZ2VbXSBjaGFuZ2VzLCBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHNjb3BlLCBSZXF1aXJlZENhcGFiaWxpdHkgbGlmZUN5Y2xlKSB7Ci0JCXJldHVybiBjcmVhdGVJVVBhdGNoKG5hbWUsIHZlcnNpb24sIG51bGwsIE5PX1JFUVVJUkVTLCBOT19QUk9WSURFUywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgc2luZ2xldG9uLCBudWxsLCBjaGFuZ2VzLCBzY29wZSwgbGlmZUN5Y2xlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXRQYXRjaCBjcmVhdGVJVVBhdGNoKFN0cmluZyBuYW1lLCBWZXJzaW9uIHZlcnNpb24sIFN0cmluZyBmaWx0ZXIsIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVkLCBQcm92aWRlZENhcGFiaWxpdHlbXSBhZGRpdGlvbmFsUHJvdmlkZXMsIE1hcCBwcm9wZXJ0aWVzLCBUb3VjaHBvaW50VHlwZSB0cFR5cGUsIFRvdWNocG9pbnREYXRhIHRwRGF0YSwgYm9vbGVhbiBzaW5nbGV0b24sIElVcGRhdGVEZXNjcmlwdG9yIHVwZGF0ZSwgUmVxdWlyZW1lbnRDaGFuZ2VbXSByZXFDaGFuZ2VzLCBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHNjb3BlLCBSZXF1aXJlZENhcGFiaWxpdHkgbGlmZUN5Y2xlKSB7Ci0JCUluc3RhbGxhYmxlVW5pdFBhdGNoRGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdFBhdGNoRGVzY3JpcHRpb24oKTsKLQkJaXUuc2V0SWQobmFtZSk7Ci0JCWl1LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCWl1LnNldEZpbHRlcihmaWx0ZXIpOwotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBwcm92aWRlcyA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbYWRkaXRpb25hbFByb3ZpZGVzLmxlbmd0aCArIDFdOwotCQlwcm92aWRlc1swXSA9IGdldFNlbGZDYXBhYmlsaXR5KG5hbWUsIHZlcnNpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFkZGl0aW9uYWxQcm92aWRlcy5sZW5ndGg7IGkrKykgewotCQkJcHJvdmlkZXNbaSArIDFdID0gYWRkaXRpb25hbFByb3ZpZGVzW2ldOwotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHByb3BlcnRpZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgbmV4dEtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIG5leHRWYWx1ZSA9IChTdHJpbmcpIHByb3BlcnRpZXMuZ2V0KG5leHRLZXkpOwotCQkJaXUuc2V0UHJvcGVydHkobmV4dEtleSwgbmV4dFZhbHVlKTsKLQkJfQotCQlpdS5zZXRDYXBhYmlsaXRpZXMocHJvdmlkZXMpOwotCQlpdS5zZXRSZXF1aXJlZENhcGFiaWxpdGllcyhyZXF1aXJlZCk7Ci0JCWl1LnNldFRvdWNocG9pbnRUeXBlKHRwVHlwZSk7Ci0JCWlmICh0cERhdGEgIT0gbnVsbCkKLQkJCWl1LmFkZFRvdWNocG9pbnREYXRhKHRwRGF0YSk7Ci0JCWl1LnNldFNpbmdsZXRvbihzaW5nbGV0b24pOwotCQlpdS5zZXRVcGRhdGVEZXNjcmlwdG9yKHVwZGF0ZSk7Ci0JCWl1LnNldFJlcXVpcmVtZW50Q2hhbmdlcyhyZXFDaGFuZ2VzKTsKLQkJaXUuc2V0QXBwbGljYWJpbGl0eVNjb3BlKHNjb3BlKTsKLQkJaXUuc2V0TGlmZUN5Y2xlKGxpZmVDeWNsZSk7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0UGF0Y2goaXUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVJVShTdHJpbmcgbmFtZSwgVmVyc2lvbiB2ZXJzaW9uLCBTdHJpbmcgZmlsdGVyLCBSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZCwgUHJvdmlkZWRDYXBhYmlsaXR5W10gYWRkaXRpb25hbFByb3ZpZGVzLCBNYXAgcHJvcGVydGllcywgVG91Y2hwb2ludFR5cGUgdHBUeXBlLCBUb3VjaHBvaW50RGF0YSB0cERhdGEsIGJvb2xlYW4gc2luZ2xldG9uLCBJVXBkYXRlRGVzY3JpcHRvciB1cGRhdGUpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWl1LnNldElkKG5hbWUpOwotCQlpdS5zZXRWZXJzaW9uKHZlcnNpb24pOwotCQlpdS5zZXRGaWx0ZXIoZmlsdGVyKTsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdmlkZXMgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W2FkZGl0aW9uYWxQcm92aWRlcy5sZW5ndGggKyAxXTsKLQkJcHJvdmlkZXNbMF0gPSBnZXRTZWxmQ2FwYWJpbGl0eShuYW1lLCB2ZXJzaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZGRpdGlvbmFsUHJvdmlkZXMubGVuZ3RoOyBpKyspIHsKLQkJCXByb3ZpZGVzW2kgKyAxXSA9IGFkZGl0aW9uYWxQcm92aWRlc1tpXTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBwcm9wZXJ0aWVzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIG5leHRLZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBuZXh0VmFsdWUgPSAoU3RyaW5nKSBwcm9wZXJ0aWVzLmdldChuZXh0S2V5KTsKLQkJCWl1LnNldFByb3BlcnR5KG5leHRLZXksIG5leHRWYWx1ZSk7Ci0JCX0KLQkJaXUuc2V0Q2FwYWJpbGl0aWVzKHByb3ZpZGVzKTsKLQkJaXUuc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMocmVxdWlyZWQpOwotCQlpdS5zZXRUb3VjaHBvaW50VHlwZSh0cFR5cGUpOwotCQlpZiAodHBEYXRhICE9IG51bGwpCi0JCQlpdS5hZGRUb3VjaHBvaW50RGF0YSh0cERhdGEpOwotCQlpdS5zZXRTaW5nbGV0b24oc2luZ2xldG9uKTsKLQkJaXUuc2V0VXBkYXRlRGVzY3JpcHRvcih1cGRhdGUpOwotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChpdSk7Ci0JfQotCi0JLyoqCi0JICogCUNyZWF0ZSBhIGJhc2ljIEluc3RhbGxhYmxlVW5pdEZyYWdtZW50IHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuIAotCSAqIFRoZSBzZWxmIGFuZCBmcmFnbWVudCBwcm92aWRlZCBjYXBhYmlsaXRpZXMgYXJlIGFkZGVkIHRvIHRoZSBJVS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCBjcmVhdGVJVUZyYWdtZW50KElJbnN0YWxsYWJsZVVuaXQgaG9zdCwgU3RyaW5nIG5hbWUsIFZlcnNpb24gdmVyc2lvbikgewotCQlyZXR1cm4gY3JlYXRlSVVGcmFnbWVudChob3N0LCBuYW1lLCB2ZXJzaW9uLCBOT19SRVFVSVJFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSk7Ci0JfQotCi0JLyoqCi0JICogCUNyZWF0ZSBhIGJhc2ljIEluc3RhbGxhYmxlVW5pdEZyYWdtZW50IHdpdGggdGhlIGdpdmVuIGF0dHJpYnV0ZXMuIAotCSAqIFRoZSBzZWxmIGFuZCBmcmFnbWVudCBwcm92aWRlZCBjYXBhYmlsaXRpZXMgYXJlIGFkZGVkIHRvIHRoZSBJVS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCBjcmVhdGVJVUZyYWdtZW50KElJbnN0YWxsYWJsZVVuaXQgaG9zdCwgU3RyaW5nIG5hbWUsIFZlcnNpb24gdmVyc2lvbiwgUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZWQsIFRvdWNocG9pbnRUeXBlIHRwVHlwZSwgVG91Y2hwb2ludERhdGEgdHBEYXRhKSB7Ci0JCUluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24gZnJhZ21lbnQgPSBuZXcgSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbigpOwotCQlmcmFnbWVudC5zZXRJZChuYW1lKTsKLQkJZnJhZ21lbnQuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJZnJhZ21lbnQuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJZnJhZ21lbnQuc2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMocmVxdWlyZWQpOwotCQlmcmFnbWVudC5zZXRUb3VjaHBvaW50VHlwZSh0cFR5cGUpOwotCQlpZiAodHBEYXRhICE9IG51bGwpCi0JCQlmcmFnbWVudC5hZGRUb3VjaHBvaW50RGF0YSh0cERhdGEpOwotCQlpZiAoaG9zdCAhPSBudWxsKSB7Ci0JCQlWZXJzaW9uUmFuZ2UgaG9zdFJhbmdlID0gbmV3IFZlcnNpb25SYW5nZShob3N0LmdldFZlcnNpb24oKSwgdHJ1ZSwgaG9zdC5nZXRWZXJzaW9uKCksIHRydWUpOwotCQkJZnJhZ21lbnQuc2V0SG9zdChuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGhvc3QuZ2V0SWQoKSwgaG9zdFJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UpfSk7Ci0JCX0KLQkJZnJhZ21lbnQuc2V0Q2FwYWJpbGl0aWVzKG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7Z2V0U2VsZkNhcGFiaWxpdHkobmFtZSwgdmVyc2lvbil9KTsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXRGcmFnbWVudChmcmFnbWVudCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJUGxhbm5lciBjcmVhdGVQbGFubmVyKCkgewotCQlyZXR1cm4gKElQbGFubmVyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQbGFubmVyLmNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbmQgcmV0dXJucyBhIHJlcXVpcmVkIGNhcGFiaWxpdHkgd2l0aCB0aGUgcHJvdmlkZWQgYXR0cmlidXRlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lLCBTdHJpbmcgZmlsdGVyKSB7Ci0JCXJldHVybiBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhuYW1lc3BhY2UsIG5hbWUsIEFOWV9WRVJTSU9OLCBmaWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSByZXF1aXJlZCBjYXBhYmlsaXR5IHdpdGggdGhlIHByb3ZpZGVkIGF0dHJpYnV0ZXMuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBSZXF1aXJlZENhcGFiaWxpdHlbXSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSwgVmVyc2lvblJhbmdlIHJhbmdlLCBTdHJpbmcgZmlsdGVyKSB7Ci0JCXJldHVybiBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkobmFtZXNwYWNlLCBuYW1lLCByYW5nZSwgZmlsdGVyLCBmYWxzZSwgZmFsc2UpfTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlKEZpbGUgZmlsZSkgewotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSkgewotCQkJRmlsZVtdIGNoaWxkcmVuID0gZmlsZS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJZGVsZXRlKGNoaWxkcmVuW2ldKTsKLQkJfQotCQlyZXR1cm4gZmlsZS5kZWxldGUoKTsKLQl9Ci0KLQkvKioKLQkgKiAJQ29tcGFyZSB0d28gMi1kaW1lbnNpb25hbCBhcnJheXMgb2Ygc3RyaW5ncyBmb3IgZXF1YWxpdHkKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gZXF1YWwoU3RyaW5nW11bXSB0dXBsZXMwLCBTdHJpbmdbXVtdIHR1cGxlczEpIHsKLQkJaWYgKHR1cGxlczAubGVuZ3RoICE9IHR1cGxlczEubGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHR1cGxlczAubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZ1tdIHR1cGxlMCA9IHR1cGxlczBbaV07Ci0JCQlTdHJpbmdbXSB0dXBsZTEgPSB0dXBsZXMxW2ldOwotCQkJaWYgKHR1cGxlMC5sZW5ndGggIT0gdHVwbGUxLmxlbmd0aCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHR1cGxlMC5sZW5ndGg7IGorKykgewotCQkJCWlmICghdHVwbGUwW2pdLmVxdWFscyh0dXBsZTFbal0pKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogRmFpbHMgdGhlIHRlc3QgZHVlIHRvIHRoZSBnaXZlbiB0aHJvd2FibGUuCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGZhaWwoU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBlKSB7Ci0JCS8vIElmIHRoZSBleGNlcHRpb24gaXMgYSBDb3JlRXhjZXB0aW9uIHdpdGggYSBtdWx0aXN0YXR1cwotCQkvLyB0aGVuIHByaW50IG91dCB0aGUgbXVsdGlzdGF0dXMgc28gd2UgY2FuIHNlZSBhbGwgdGhlIGluZm8uCi0JCWlmIChlIGluc3RhbmNlb2YgQ29yZUV4Y2VwdGlvbikgewotCQkJSVN0YXR1cyBzdGF0dXMgPSAoKENvcmVFeGNlcHRpb24pIGUpLmdldFN0YXR1cygpOwotCQkJLy9pZiB0aGUgc3RhdHVzIGRvZXMgbm90IGhhdmUgYW4gZXhjZXB0aW9uLCBwcmludCB0aGUgc3RhY2sgZm9yIHRoaXMgb25lCi0JCQlpZiAoc3RhdHVzLmdldEV4Y2VwdGlvbigpID09IG51bGwpCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXdyaXRlKHN0YXR1cywgMCwgU3lzdGVtLmVycik7Ci0JCX0gZWxzZQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJZmFpbChtZXNzYWdlICsgIjogIiArIGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSXRlcmF0b3IgZ2V0SW5zdGFsbGFibGVVbml0cyhJUHJvZmlsZSBwcm9maWxlMikgewotCQlyZXR1cm4gcHJvZmlsZTIucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogCUdldCB0aGUgJ3NlbGYnIGNhcGFiaWxpdHkgZm9yIHRoZSBnaXZlbiBpbnN0YWxsYWJsZSB1bml0LgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgUHJvdmlkZWRDYXBhYmlsaXR5IGdldFNlbGZDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJcmV0dXJuIGdldFNlbGZDYXBhYmlsaXR5KGl1LmdldElkKCksIGl1LmdldFZlcnNpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogCUdldCB0aGUgJ3NlbGYnIGNhcGFiaWxpdHkgZm9yIGFuIGluc3RhbGxhYmxlIHVuaXQgd2l0aCB0aGUgZ2l2ZSBpZCBhbmQgdmVyc2lvbi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBQcm92aWRlZENhcGFiaWxpdHkgZ2V0U2VsZkNhcGFiaWxpdHkoU3RyaW5nIGluc3RhbGxhYmxlVW5pdElkLCBWZXJzaW9uIGluc3RhbGxhYmxlVW5pdFZlcnNpb24pIHsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGluc3RhbGxhYmxlVW5pdElkLCBpbnN0YWxsYWJsZVVuaXRWZXJzaW9uKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGluZGVudChPdXRwdXRTdHJlYW0gb3V0cHV0LCBpbnQgaW5kZW50KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50OyBpKyspCi0JCQl0cnkgewotCQkJCW91dHB1dC53cml0ZSgiXHQiLmdldEJ5dGVzKCkpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGUoSVN0YXR1cyBzdGF0dXMsIGludCBpbmRlbnQsIFByaW50U3RyZWFtIG91dHB1dCkgewotCQlpbmRlbnQob3V0cHV0LCBpbmRlbnQpOwotCQlvdXRwdXQucHJpbnRsbigiU2V2ZXJpdHk6ICIgKyBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSk7Ci0KLQkJaW5kZW50KG91dHB1dCwgaW5kZW50KTsKLQkJb3V0cHV0LnByaW50bG4oIlBsdWdpbiBJRDogIiArIHN0YXR1cy5nZXRQbHVnaW4oKSk7Ci0KLQkJaW5kZW50KG91dHB1dCwgaW5kZW50KTsKLQkJb3V0cHV0LnByaW50bG4oIkNvZGU6ICIgKyBzdGF0dXMuZ2V0Q29kZSgpKTsKLQotCQlpbmRlbnQob3V0cHV0LCBpbmRlbnQpOwotCQlvdXRwdXQucHJpbnRsbigiTWVzc2FnZTogIiArIHN0YXR1cy5nZXRNZXNzYWdlKCkpOwotCi0JCWlmIChzdGF0dXMuZ2V0RXhjZXB0aW9uKCkgIT0gbnVsbCkgewotCQkJaW5kZW50KG91dHB1dCwgaW5kZW50KTsKLQkJCW91dHB1dC5wcmludCgiRXhjZXB0aW9uOiAiKTsKLQkJCXN0YXR1cy5nZXRFeGNlcHRpb24oKS5wcmludFN0YWNrVHJhY2Uob3V0cHV0KTsKLQkJfQotCi0JCWlmIChzdGF0dXMuaXNNdWx0aVN0YXR1cygpKSB7Ci0JCQlJU3RhdHVzW10gY2hpbGRyZW4gPSBzdGF0dXMuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspCi0JCQkJd3JpdGUoY2hpbGRyZW5baV0sIGluZGVudCArIDEsIG91dHB1dCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0KCkgewotCQlzdXBlcigiIik7Ci0JfQotCi0JcHVibGljIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIGJ5dGVbXSBleHBlY3RlZCwgYnl0ZVtdIGFjdHVhbCkgewotCQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV4cGVjdGVkID09IG51bGwpCi0JCQlmYWlsKG1lc3NhZ2UgKyAiIGV4cGVjdGVkIG51bGwgYnV0IHdhczogIiArIGFjdHVhbCk7Ci0JCWlmIChhY3R1YWwgPT0gbnVsbCkKLQkJCWZhaWwobWVzc2FnZSArICIgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiKTsKLQkJaWYgKGV4cGVjdGVkLmxlbmd0aCAhPSBhY3R1YWwubGVuZ3RoKQotCQkJZmFpbChtZXNzYWdlICsgIiBleHBlY3RlZCBhcnJheSBsZW5ndGg6PCIgKyBleHBlY3RlZC5sZW5ndGggKyAiPiBidXQgd2FzOjwiICsgYWN0dWFsLmxlbmd0aCArICI+Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspCi0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSArICIgYXJyYXlzIGRpZmZlciBhdCBwb3NpdGlvbjo8IiArIGkgKyAiPiIsIGV4cGVjdGVkW2ldLCBhY3R1YWxbaV0pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzc2VydEVxdWFscyhTdHJpbmcgbWVzc2FnZSwgT2JqZWN0W10gZXhwZWN0ZWQsIE9iamVjdFtdIGFjdHVhbCkgewotCQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCAmJiBhY3R1YWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV4cGVjdGVkID09IG51bGwpCi0JCQlmYWlsKG1lc3NhZ2UgKyAiIGV4cGVjdGVkIG51bGwgYnV0IHdhczogIiArIGFjdHVhbCk7Ci0JCWlmIChhY3R1YWwgPT0gbnVsbCkKLQkJCWZhaWwobWVzc2FnZSArICIgYXJyYXkgaXMgdW5leHBlY3RlZGx5IG51bGwiKTsKLQkJaWYgKGV4cGVjdGVkLmxlbmd0aCAhPSBhY3R1YWwubGVuZ3RoKQotCQkJZmFpbChtZXNzYWdlICsgIiBleHBlY3RlZCBhcnJheSBsZW5ndGg6PCIgKyBleHBlY3RlZC5sZW5ndGggKyAiPiBidXQgd2FzOjwiICsgYWN0dWFsLmxlbmd0aCArICI+Iik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspCi0JCQlhc3NlcnRFcXVhbHMobWVzc2FnZSArICIgYXJyYXlzIGRpZmZlciBhdCBwb3NpdGlvbjo8IiArIGkgKyAiPiIsIGV4cGVjdGVkW2ldLCBhY3R1YWxbaV0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBwcm9maWxlIHdpdGggdGhlIGdpdmVuIG5hbWUuIEVuc3VyZXMgdGhhdCBubyBzdWNoIHByb2ZpbGUKLQkgKiBhbHJlYWR5IGV4aXN0cy4gIFRoZSByZXR1cm5lZCBwcm9maWxlIHdpbGwgYmUgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5Ci0JICogaW4gdGhlIHRlYXJEb3duIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSVByb2ZpbGUgY3JlYXRlUHJvZmlsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gY3JlYXRlUHJvZmlsZShuYW1lLCBudWxsLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcHJvZmlsZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBFbnN1cmVzIHRoYXQgbm8gc3VjaCBwcm9maWxlCi0JICogYWxyZWFkeSBleGlzdHMuICBUaGUgcmV0dXJuZWQgcHJvZmlsZSB3aWxsIGJlIHJlbW92ZWQgYXV0b21hdGljYWxseQotCSAqIGluIHRoZSB0ZWFyRG93biBtZXRob2QuCi0JICovCi0JcHJvdGVjdGVkIElQcm9maWxlIGNyZWF0ZVByb2ZpbGUoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJlbnRJZCkgewotCQlyZXR1cm4gY3JlYXRlUHJvZmlsZShuYW1lLCBwYXJlbnRJZCwgbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9maWxlIGNyZWF0ZVByb2ZpbGUoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJlbnRJZCwgTWFwIHByb3BlcnRpZXMpIHsKLQkJLy9yZW1vdmUgYW55IGV4aXN0aW5nIHByb2ZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lCi0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVByb2ZpbGVSZWdpc3RyeS5jbGFzcy5nZXROYW1lKCkpOwotCQlwcm9maWxlUmVnaXN0cnkucmVtb3ZlUHJvZmlsZShuYW1lKTsKLQkJLy9jcmVhdGUgYW5kIHJldHVybiBhIG5ldyBwcm9maWxlCi0JCXRyeSB7Ci0JCQlyZXR1cm4gcHJvZmlsZVJlZ2lzdHJ5LmFkZFByb2ZpbGUobmFtZSwgcHJvcGVydGllcywgcGFyZW50SWQpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBnZXRNb25pdG9yKCkgewotCQlyZXR1cm4gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb2ZpbGUgZ2V0UHJvZmlsZShTdHJpbmcgcHJvZmlsZUlkKSB7Ci0JCS8vcmVtb3ZlIGFueSBleGlzdGluZyBwcm9maWxlIHdpdGggdGhlIHNhbWUgbmFtZQotCQlJUHJvZmlsZVJlZ2lzdHJ5IHByb2ZpbGVSZWdpc3RyeSA9IChJUHJvZmlsZVJlZ2lzdHJ5KSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIHByb2ZpbGVSZWdpc3RyeS5nZXRQcm9maWxlKHByb2ZpbGVJZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHJlc29sdmVkIElVIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIElVLCB3aXRoIG5vIGF0dGFjaGVkIGZyYWdtZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVSZXNvbHZlZElVKElJbnN0YWxsYWJsZVVuaXQgdW5pdCkgewotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlc29sdmVkSW5zdGFsbGFibGVVbml0KHVuaXQsIG5ldyBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnRbMF0pOwotCX0KLQotCS8qKgotCSAqIEFkZHMgYSB0ZXN0IG1ldGFkYXRhIHJlcG9zaXRvcnkgdG8gdGhlIHN5c3RlbSB0aGF0IHByb3ZpZGVzIHRoZSBnaXZlbiB1bml0cy4gCi0JICogVGhlIHJlcG9zaXRvcnkgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIHJlbW92ZWQgaW4gdGhlIHRlYXJEb3duIG1ldGhvZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkoSUluc3RhbGxhYmxlVW5pdFtdIHVuaXRzKSB7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwbyA9IG5ldyBUZXN0TWV0YWRhdGFSZXBvc2l0b3J5KHVuaXRzKTsKLQkJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuID0gKE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0Tm90TnVsbChyZXBvTWFuKTsKLQkJcmVwb01hbi5hZGRSZXBvc2l0b3J5KHJlcG8pOwotCQltZXRhZGF0YVJlcG9zLmFkZChyZXBvKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVTdHJpbmcoKSB7Ci0JCXJldHVybiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICItIiArIE1hdGgucmFuZG9tKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldFRlbXBGb2xkZXIoKSB7Ci0JCVN0cmluZyB0ZW1wRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKHRlbXBEaXIsIGdldFVuaXF1ZVN0cmluZygpKTsKLQkJZGVsZXRlKGZvbGRlcik7Ci0JCWZvbGRlci5ta2RpcnMoKTsKLQkJcmV0dXJuIGZvbGRlcjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCS8vcmVtb3ZlIGFsbCBtZXRhZGF0YSByZXBvc2l0b3JpZXMgY3JlYXRlZCBieSB0aGlzIHRlc3QKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbiA9IChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAoIW1ldGFkYXRhUmVwb3MuaXNFbXB0eSgpKSB7Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ID0gbWV0YWRhdGFSZXBvcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gKElNZXRhZGF0YVJlcG9zaXRvcnkpIGl0Lm5leHQoKTsKLQkJCQlyZXBvTWFuLnJlbW92ZVJlcG9zaXRvcnkocmVwby5nZXRMb2NhdGlvbigpKTsKLQkJCX0KLQkJCW1ldGFkYXRhUmVwb3MuY2xlYXIoKTsKLQkJfQotCQlVUkxbXSB1cmxzID0gcmVwb01hbi5nZXRLbm93blJlcG9zaXRvcmllcyhJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfQUxMKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodXJsc1tpXS50b0V4dGVybmFsRm9ybSgpLmluZGV4T2YoImNhY2hlIikgIT0gLTEgfHwgdXJsc1tpXS50b0V4dGVybmFsRm9ybSgpLmluZGV4T2YoInJvbGxiYWNrIikgIT0gLTEpCi0JCQkJcmVwb01hbi5sb2FkUmVwb3NpdG9yeSh1cmxzW2ldLCBudWxsKS5yZW1vdmVBbGwoKTsKLQkJfQotCQkvL3JlbW92ZSBhbGwgcHJvZmlsZXMgY3JlYXRlZCBieSB0aGlzIHRlc3QKLQkJSVByb2ZpbGVSZWdpc3RyeSBwcm9maWxlUmVnaXN0cnkgPSAoSVByb2ZpbGVSZWdpc3RyeSkgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBwcm9maWxlc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlQcm9maWxlIHRvUmVtb3ZlID0gKElQcm9maWxlKSBpdC5uZXh0KCk7Ci0JCQlwcm9maWxlUmVnaXN0cnkucmVtb3ZlUHJvZmlsZSh0b1JlbW92ZS5nZXRQcm9maWxlSWQoKSk7Ci0JCX0KLQkJcHJvZmlsZXNUb1JlbW92ZS5jbGVhcigpOwotCQkvL1NlZSBidWcgMjA5MDY5IC0gY3VycmVudGx5IG5vIHdheSB0byBwZXJzaXN0IGluc3RhbGwgcmVnaXN0cnkgY2hhbmdlcyBvciBjbGVhciB0aGUgbWV0YWRhdGEgY2FjaGUKLQkJLy8JCUlNZXRhZGF0YVJlcG9zaXRvcnkgY2FjaGUgPSBNZXRhZGF0YUNhY2hlLmdldENhY2hlSW5zdGFuY2UoKE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIHJlcG9NYW4pOwotCQkvLwkJY2FjaGUucmVtb3ZlQWxsKCk7Ci0JfQotCi0JLyoKLQkgKiBMb29rIHVwIGFuZCByZXR1cm4gYSBmaWxlIGhhbmRsZSB0byB0aGUgZ2l2ZW4gZW50cnkgaW4gdGhlIGJ1bmRsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgRmlsZSBnZXRUZXN0RGF0YShTdHJpbmcgbWVzc2FnZSwgU3RyaW5nIGVudHJ5KSB7Ci0JCWlmIChlbnRyeSA9PSBudWxsKQotCQkJZmFpbChtZXNzYWdlICsgIiBlbnRyeSBpcyBudWxsLiIpOwotCQlVUkwgYmFzZSA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KGVudHJ5KTsKLQkJaWYgKGJhc2UgPT0gbnVsbCkKLQkJCWZhaWwobWVzc2FnZSArICIgZW50cnkgbm90IGZvdW5kIGluIGJ1bmRsZTogIiArIGVudHJ5KTsKLQkJdHJ5IHsKLQkJCVN0cmluZyBvc1BhdGggPSBuZXcgUGF0aChGaWxlTG9jYXRvci50b0ZpbGVVUkwoYmFzZSkuZ2V0UGF0aCgpKS50b09TU3RyaW5nKCk7Ci0JCQlGaWxlIHJlc3VsdCA9IG5ldyBGaWxlKG9zUGF0aCk7Ci0JCQlpZiAoIXJlc3VsdC5nZXRDYW5vbmljYWxQYXRoKCkuZXF1YWxzKHJlc3VsdC5nZXRQYXRoKCkpKQotCQkJCWZhaWwobWVzc2FnZSArICIgcmVzdWx0IHBhdGg6ICIgKyByZXN1bHQuZ2V0UGF0aCgpICsgIiBkb2VzIG5vdCBtYXRjaCBjYW5vbmljYWwgcGF0aDogIiArIHJlc3VsdC5nZXRDYW5vbmljYWxGaWxlKCkuZ2V0UGF0aCgpKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwobWVzc2FnZSwgZSk7Ci0JCX0KLQkJLy8gYXZvaWQgY29tcGlsZSBlcnJvci4uLiBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBjb2RlCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzc2VydEluc3RhbGxPcGVyYW5kKFByb3Zpc2lvbmluZ1BsYW4gcGxhbiwgSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlPcGVyYW5kW10gb3BzID0gcGxhbi5nZXRPcGVyYW5kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9wc1tpXSBpbnN0YW5jZW9mIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIHsKLQkJCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIGl1T3AgPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgb3BzW2ldOwotCQkJCWlmIChpdS5lcXVhbHMoaXVPcC5zZWNvbmQoKSkpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlmYWlsKCJDYW4ndCBmaW5kICIgKyBpdSArICIgaW4gdGhlIHBsYW4iKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRVbmluc3RhbGxPcGVyYW5kKFByb3Zpc2lvbmluZ1BsYW4gcGxhbiwgSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlPcGVyYW5kW10gb3BzID0gcGxhbi5nZXRPcGVyYW5kcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9wc1tpXSBpbnN0YW5jZW9mIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIHsKLQkJCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIGl1T3AgPSAoSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgb3BzW2ldOwotCQkJCWlmIChpdS5lcXVhbHMoaXVPcC5maXJzdCgpKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWZhaWwoIkNhbid0IGZpbmQgIiArIGl1ICsgIiBpbiB0aGUgcGxhbiIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFzc2VydE5vT3BlcmFuZChQcm92aXNpb25pbmdQbGFuIHBsYW4sIElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJT3BlcmFuZFtdIG9wcyA9IHBsYW4uZ2V0T3BlcmFuZHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcHNbaV0gaW5zdGFuY2VvZiBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKSB7Ci0JCQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZCBpdU9wID0gKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIG9wc1tpXTsKLQkJCQlpZiAoaXVPcC5zZWNvbmQoKSAhPSBudWxsICYmIGl1T3Auc2Vjb25kKCkuZXF1YWxzKGl1KSkKLQkJCQkJZmFpbChpdSArICIgc2hvdWxkIG5vdCBiZSBwcmVzZW50IGluIHRoaXMgcGxhbi4iKTsKLQkJCQlpZiAoaXVPcC5maXJzdCgpICE9IG51bGwgJiYgaXVPcC5maXJzdCgpLmVxdWFscyhpdSkpCi0JCQkJCWZhaWwoaXUgKyAiIHNob3VsZCBub3QgYmUgcHJlc2VudCBpbiB0aGlzIHBsYW4uIik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW4gPSAoTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlVUkxbXSByZXBvcyA9IHJlcG9NYW4uZ2V0S25vd25SZXBvc2l0b3JpZXMoTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfQUxMKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXBvcy5sZW5ndGg7IGkrKykgewotCQkJcmVwb01hbi5yZW1vdmVSZXBvc2l0b3J5KHJlcG9zW2ldKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9BdXRvbWF0ZWRUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL0F1dG9tYXRlZFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NmZkMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL0F1dG9tYXRlZFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIG1hc3RlciB0ZXN0IHN1aXRlIGZvciBhbGwgYXV0b21hdGVkIHByb3Zpc2lvbmluZyB0ZXN0cy4gSXQgcnVucyBldmVyeSB0ZXN0Ci0gKiB0aGF0IGlzIHN1aXRhYmxlIGZvciBydW5uaW5nIGluIGFuIGF1dG9tYXRlZCBmYXNoaW9uIGFzIHBhcnQgb2YgYSBidWlsZC4gU29tZQotICogdGVzdHMgbWF5IGJlIGV4Y2x1ZGVkIGlmIHRoZXkgcmVxdWlyZSBzcGVjaWFsIHNldHVwIChzdWNoIGFzIGdlbmVyYXRpbmcgbWV0YWRhdGEpLgotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEF1dG9tYXRlZFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5LkFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuY29yZS5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yLkFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZG93bmxvYWQuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5lbmdpbmUuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5nZW5lcmF0b3IuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5tZXRhZGF0YS5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm1ldGFkYXRhLnJlcG9zaXRvcnkuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyLkFsbFRlc3RzLnN1aXRlKCkpOwotCQlzdWl0ZS5hZGRUZXN0KG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3J5d2F0Y2hlci5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnNpbXBsZWNvbmZpZ3VyYXRvci5TaW1wbGVDb25maWd1cmF0b3JUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnVwZGF0ZXNpdGUuQWxsVGVzdHMuc3VpdGUoKSk7Ci0JCXN1aXRlLmFkZFRlc3Qob3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5leHRlbnNpb25sb2NhdGlvbi5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkJc3VpdGUuYWRkVGVzdChvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnRvdWNocG9pbnQuZWNsaXBzZS5BbGxUZXN0cy5zdWl0ZSgpKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL01hbnVhbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvTWFudWFsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczZWIzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvTWFudWFsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0czsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFRoaXMgaXMgdGhlIG1hc3RlciB0ZXN0IHN1aXRlIGZvciBhbGwgYXV0b21hdGVkIHByb3Zpc2lvbmluZyB0ZXN0cyB0aGF0IHJlcXVpcmUgc29tZQotICogbWFudWFsIHNldC4gVGhlc2UgdGVzdHMgY2FuJ3QgYmUgcnVuIGF1dG9tYXRpY2FsbHkgYXMgcGFydCBvZiBhIGJ1aWxkLgotICovCi1wdWJsaWMgY2xhc3MgTWFudWFsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEF1dG9tYXRlZFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmZ1bGwuRGlyZWN0b3JUZXN0LmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9UZXN0QWN0aXZhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvVGVzdEFjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQzZWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9UZXN0QWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0czsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLlBhY2thZ2VBZG1pbjsKLQotcHVibGljIGNsYXNzIFRlc3RBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBJX1BST1ZfVEVTVFMgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0IjsKLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIHN0YXRpYyBQYWNrYWdlQWRtaW4gcGFja2FnZUFkbWluID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBTZXJ2aWNlUmVmZXJlbmNlIHBhY2thZ2VBZG1pblJlZiA9IG51bGw7Ci0KLQlwdWJsaWMgc3RhdGljIEJ1bmRsZUNvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJVGVzdEFjdGl2YXRvci5jb250ZXh0ID0gY29udGV4dDsKLQkJcGFja2FnZUFkbWluUmVmID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKFBhY2thZ2VBZG1pbi5jbGFzcy5nZXROYW1lKCkpOwotCQlwYWNrYWdlQWRtaW4gPSAoUGFja2FnZUFkbWluKSBjb250ZXh0LmdldFNlcnZpY2UocGFja2FnZUFkbWluUmVmKTsKLQotCQkvL1RoaXMgaXMgYSBoYWNrIGJlY2F1c2UgdGhlIGp1bml0IHBsdWdpbiBsYXVuY2ggY29uZmlnIGRvIG5vdCBhbGxvdyB0byBzdGFydCBidW5kbGVzCi0JCWdldEJ1bmRsZSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCIpLnN0YXJ0KCk7Ci0JCWdldEJ1bmRsZSgib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Iikuc3RhcnQoKTsKLQkJZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciIpLnN0YXJ0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlUZXN0QWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlIGdldEJ1bmRsZShTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCWlmIChwYWNrYWdlQWRtaW4gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlCdW5kbGVbXSBidW5kbGVzID0gcGFja2FnZUFkbWluLmdldEJ1bmRsZXMoc3ltYm9saWNOYW1lLCBudWxsKTsKLQkJaWYgKGJ1bmRsZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvL1JldHVybiB0aGUgZmlyc3QgYnVuZGxlIHRoYXQgaXMgbm90IGluc3RhbGxlZCBvciB1bmluc3RhbGxlZAotCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgoYnVuZGxlc1tpXS5nZXRTdGF0ZSgpICYgKEJ1bmRsZS5JTlNUQUxMRUQgfCBCdW5kbGUuVU5JTlNUQUxMRUQpKSA9PSAwKSB7Ci0JCQkJcmV0dXJuIGJ1bmRsZXNbaV07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvVGVzdEFydGlmYWN0UmVwb3NpdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL1Rlc3RBcnRpZmFjdFJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhOTEwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvVGVzdEFydGlmYWN0UmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5UcmFuc3BvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnByb2Nlc3NpbmcuUHJvY2Vzc2luZ1N0ZXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LlJlcG9zaXRvcnlDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFic3RyYWN0QXJ0aWZhY3RSZXBvc2l0b3J5OwotCi0vKioKLSAqIEEgc2ltcGxlIGFydGlmYWN0IHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24gdXNlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KLSAqIEFsbCBhcnRpZmFjdHMgYXJlIGtlcHQgaW4gbWVtb3J5LgotICovCi1wdWJsaWMgY2xhc3MgVGVzdEFydGlmYWN0UmVwb3NpdG9yeSBleHRlbmRzIEFic3RyYWN0QXJ0aWZhY3RSZXBvc2l0b3J5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FID0gInRlc3RhcnRpZmFjdHJlcG8iOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIkFUZXN0QXJ0aWZhY3RSZXBvc2l0b3J5IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gInRlc3RhcnRpZmFjdHJlcG8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAiMSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVIgPSAib3JnLmVjbGlwc2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFU0NSSVBUSU9OID0gIkEgVGVzdCBBcnRpZmFjdCBSZXBvc2l0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogTWFwIG9mIElBcnRpZmFjdEtleSAtPiBTdHJpbmcgKGxvY2F0aW9uKQotCSAqLwotCU1hcCBrZXlzVG9Mb2NhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCS8qKgotCSAqIE1hcCBvZiBTdHJpbmcgKGxvY2F0aW9uKSAtPiBieXRlW10gKGNvbnRlbnRzKQotCSAqLwotCU1hcCBsb2NhdGlvbnNUb0NvbnRlbnRzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIAlTZXQgb2YgYXJ0aWZhY3QgZGVzY3JpcHRvcnMKLQkgKi8KLQlTZXQgYXJ0aWZhY3REZXNjcmlwdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlUcmFuc3BvcnQgdGVzdGhhbmRsZXIgPSBuZXcgVHJhbnNwb3J0KCkgewotCQlwdWJsaWMgSVN0YXR1cyBkb3dubG9hZChTdHJpbmcgdG9Eb3dubG9hZCwgT3V0cHV0U3RyZWFtIHRhcmdldCwgSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkJYnl0ZVtdIGNvbnRlbnRzID0gKGJ5dGVbXSkgbG9jYXRpb25zVG9Db250ZW50cy5nZXQodG9Eb3dubG9hZCk7Ci0JCQlpZiAoY29udGVudHMgPT0gbnVsbCkKLQkJCQlBc3NlcnQuZmFpbCgiQXR0ZW1wdCB0byBkb3dubG9hZCBtaXNzaW5nIGFydGlmYWN0IGluIFRlc3RBcnRpZmFjdFJlcG9zaXRvcnk6ICIgKyB0b0Rvd25sb2FkKTsKLQkJCXRyeSB7Ci0JCQkJdGFyZ2V0LndyaXRlKGNvbnRlbnRzKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCUFzc2VydC5mYWlsKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBUZXN0QXJ0aWZhY3RSZXBvc2l0b3J5IiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfTsKLQotCXB1YmxpYyBUZXN0QXJ0aWZhY3RSZXBvc2l0b3J5KCkgewotCQlzdXBlcihOQU1FLCBUWVBFLCBWRVJTSU9OLCBudWxsLCBERVNDUklQVElPTiwgUFJPVklERVIsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEFydGlmYWN0KElBcnRpZmFjdEtleSBrZXksIGJ5dGVbXSBjb250ZW50cykgewotCQlTdHJpbmcgbG9jYXRpb24gPSBrZXkudG9TdHJpbmcoKTsKLQkJa2V5c1RvTG9jYXRpb25zLnB1dChrZXksIGxvY2F0aW9uKTsKLQkJbG9jYXRpb25zVG9Db250ZW50cy5wdXQobG9jYXRpb24sIGNvbnRlbnRzKTsKLQl9Ci0KLQlwdWJsaWMgVVJJIGdldEFydGlmYWN0KElBcnRpZmFjdEtleSBrZXkpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gKFN0cmluZykga2V5c1RvTG9jYXRpb25zLmdldChrZXkpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkkoU0NIRU1FLCBsb2NhdGlvbiwgbnVsbCk7Ci0JCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQlBc3NlcnQuZmFpbCgiSW52YWxpZCBVUkkgaW4gVGVzdEFydGlmYWN0UmVwb3NpdG9yeTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdEtleVtdIGdldEFydGlmYWN0S2V5cygpIHsKLQkJcmV0dXJuIChJQXJ0aWZhY3RLZXlbXSkga2V5c1RvTG9jYXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IElBcnRpZmFjdEtleVtrZXlzVG9Mb2NhdGlvbnMua2V5U2V0KCkuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RhdHVzIGdldEFydGlmYWN0KEFydGlmYWN0UmVxdWVzdCByZXF1ZXN0LCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmVxdWVzdC5zZXRTb3VyY2VSZXBvc2l0b3J5KHRoaXMpOwotCQlyZXF1ZXN0LnBlcmZvcm0obW9uaXRvcik7Ci0JCXJldHVybiByZXF1ZXN0LmdldFJlc3VsdCgpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldEFydGlmYWN0cyhJQXJ0aWZhY3RSZXF1ZXN0W10gcmVxdWVzdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlTdWJNb25pdG9yIHN1Yk1vbml0b3IgPSBTdWJNb25pdG9yLmNvbnZlcnQobW9uaXRvciwgcmVxdWVzdHMubGVuZ3RoKTsKLQkJdHJ5IHsKLQkJCU11bHRpU3RhdHVzIG92ZXJhbGxTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoVGVzdEFjdGl2YXRvci5QSV9QUk9WX1RFU1RTLCBJU3RhdHVzLk9LLCBudWxsLCBudWxsKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWVzdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlvdmVyYWxsU3RhdHVzLmFkZChnZXRBcnRpZmFjdCgoQXJ0aWZhY3RSZXF1ZXN0KSByZXF1ZXN0c1tpXSwgc3ViTW9uaXRvci5uZXdDaGlsZCgxKSkpOwotCQkJfQotCQkJcmV0dXJuIChtb25pdG9yLmlzQ2FuY2VsZWQoKSA/IFN0YXR1cy5DQU5DRUxfU1RBVFVTIDogb3ZlcmFsbFN0YXR1cyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWJNb25pdG9yLmRvbmUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoVVJMIHJlcG9VUkwsIElucHV0U3RyZWFtIGRlc2NyaXB0b3JGaWxlKSB0aHJvd3MgUmVwb3NpdG9yeUNyZWF0aW9uRXhjZXB0aW9uIHsKLQkJbG9jYXRpb24gPSByZXBvVVJMOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4ga2V5c1RvTG9jYXRpb25zLmdldChkZXNjcmlwdG9yLmdldEFydGlmYWN0S2V5KCkpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoSUFydGlmYWN0S2V5IGtleSkgewotCQlyZXR1cm4ga2V5c1RvTG9jYXRpb25zLmdldChrZXkpICE9IG51bGw7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZ2V0QXJ0aWZhY3QoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlQcm9jZXNzaW5nU3RlcEhhbmRsZXIgaGFuZGxlciA9IG5ldyBQcm9jZXNzaW5nU3RlcEhhbmRsZXIoKTsKLQkJZGVzdGluYXRpb24gPSBoYW5kbGVyLmNyZWF0ZUFuZExpbmsoZGVzY3JpcHRvci5nZXRQcm9jZXNzaW5nU3RlcHMoKSwgbnVsbCwgZGVzdGluYXRpb24sIG1vbml0b3IpOwotCQl0ZXN0aGFuZGxlci5kb3dubG9hZCgoU3RyaW5nKSBrZXlzVG9Mb2NhdGlvbnMuZ2V0KGRlc2NyaXB0b3IuZ2V0QXJ0aWZhY3RLZXkoKSksIGRlc3RpbmF0aW9uLCBtb25pdG9yKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdERlc2NyaXB0b3JbXSBnZXRBcnRpZmFjdERlc2NyaXB0b3JzKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJaWYgKCFjb250YWlucyhrZXkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBuZXcgSUFydGlmYWN0RGVzY3JpcHRvcltdIHtuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSl9OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0b3IoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCSgoQXJ0aWZhY3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yKS5zZXRSZXBvc2l0b3J5KHRoaXMpOwotCQlhcnRpZmFjdERlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQkJa2V5c1RvTG9jYXRpb25zLnB1dChkZXNjcmlwdG9yLmdldEFydGlmYWN0S2V5KCksIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURlc2NyaXB0b3IoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCXJlbW92ZURlc2NyaXB0b3IoZGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEZXNjcmlwdG9yKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3REZXNjcmlwdG9ycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3IgbmV4dERlc2NyaXB0b3IgPSAoSUFydGlmYWN0RGVzY3JpcHRvcikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoa2V5LmVxdWFscyhuZXh0RGVzY3JpcHRvci5nZXRBcnRpZmFjdEtleSgpKSkgewotCQkJCWFydGlmYWN0RGVzY3JpcHRvcnMucmVtb3ZlKG5leHREZXNjcmlwdG9yKTsKLQkJCX0KLQkJfQotCQlpZiAoa2V5c1RvTG9jYXRpb25zLmNvbnRhaW5zS2V5KGtleSkpIHsKLQkJCVN0cmluZyB0aGVMb2NhdGlvbiA9IChTdHJpbmcpIGtleXNUb0xvY2F0aW9ucy5nZXQoa2V5KTsKLQkJCWxvY2F0aW9uc1RvQ29udGVudHMucmVtb3ZlKHRoZUxvY2F0aW9uKTsKLQkJCWtleXNUb0xvY2F0aW9ucy5yZW1vdmUoa2V5KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJYXJ0aWZhY3REZXNjcmlwdG9ycy5jbGVhcigpOwotCQlrZXlzVG9Mb2NhdGlvbnMuY2xlYXIoKTsKLQkJbG9jYXRpb25zVG9Db250ZW50cy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpYWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL1Rlc3REYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvVGVzdERhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkMWQ4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvVGVzdERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IGNvbXBlb3BsZSBBRyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAJY29tcGVvcGxlIEFHIChTdGVmYW4gTGllYmlnKSAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogIFJlZCBIYXQsIEluYy4gKEFuZHJldyBPdmVyaG9sdCkgLSBhZGQgZ2V0RmlsZSBtZXRob2QKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBJbnB1dFN0cmVhbTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci0KLS8qKgotICogPGNvZGU+VGVzdERhdGE8L2NvZGU+IGhlbHBzIHdpdGggaGFuZGxpbmcgb2YgdGVzdCBkYXRhLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdERhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfREFUQV9ST09UX0ZPTERFUiA9ICJ0ZXN0RGF0YSI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWF9TRVBFUkFUT1IgPSAifiI7Ci0KLQkvKioKLQkgKiBHZXQgYW4gaW5wdXQgc3RyZWFtIGZyb20gdGhlIHJlc291cmNlIHRlc3REYXRhTmFtZSB3aXRoaW4gdGhlIGZvbGRlciAKLQkgKiB0ZXN0RGF0YUZvbGRlciBvZiB0aGUgdGVzdERhdGEgZm9sZGVyIG9mIHRoaXMgcHJvamVjdC4KLQkgKiBAcGFyYW0gdGVzdERhdGFGb2xkZXIKLQkgKiBAcGFyYW0gdGVzdERhdGFOYW1lCi0JICogQHJldHVybiBpbnB1dCBzdHJlYW0gZm9yIHRoZSB0ZXN0IGRhdGEKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXQoU3RyaW5nIHRlc3REYXRhRm9sZGVyLCBTdHJpbmcgdGVzdERhdGFOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoVEVTVF9EQVRBX1JPT1RfRk9MREVSICsgIi8iICsgdGVzdERhdGFGb2xkZXIgKyAiLyIgKyB0ZXN0RGF0YU5hbWUpLm9wZW5TdHJlYW0oKSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgRmlsZSBmcm9tIHRoZSByZXNvdXJjZSB0ZXN0RGF0YU5hbWUgd2l0aGluIHRoZSBmb2xkZXIgCi0JICogdGVzdERhdGFGb2xkZXIgb2YgdGhlIHRlc3REYXRhIGZvbGRlciBvZiB0aGlzIHByb2plY3QuCi0JICogQHBhcmFtIHRlc3REYXRhRm9sZGVyCi0JICogQHJldHVybiB0ZXN0IGRhdGEgRmlsZQotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEZpbGUgZ2V0RmlsZShTdHJpbmcgdGVzdERhdGFGb2xkZXIsIFN0cmluZyB0ZXN0RGF0YU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBuZXcgRmlsZShGaWxlTG9jYXRvci50b0ZpbGVVUkwoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoVEVTVF9EQVRBX1JPT1RfRk9MREVSICsgIi8iICsgdGVzdERhdGFGb2xkZXIgKyAiLyIgKyB0ZXN0RGF0YU5hbWUpKS5nZXRQYXRoKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlIGZvciB0aGUgdGVzdCBkYXRhLiBUaGUgdGVtcG9yYXJ5IGZpbGUgd2lsbCBiZSBkZWxldGVkIAotCSAqIHdoZW4gdGhlIGp2bSBleGlzdHMuIElmIHRlc3REYXRhTmFtZSBjb250YWlucyBhbiBleHRlbnNpb24gdGhpcyBleHRlbnNpb24gd2lsbAotCSAqIGJlIHVzZWQgYXMgc3VmZml4IGZvciB0aGUgdGVtcG9yYXJ5IGZpbGUuCi0JICogQHBhcmFtIHRlc3REYXRhRm9sZGVyCi0JICogQHBhcmFtIHRlc3REYXRhTmFtZQotCSAqIEByZXR1cm4gdGVtcG9yYXJ5IGZpbGUgd2l0aCB0ZXN0IGRhdGEKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldFRlbXBGaWxlKFN0cmluZyB0ZXN0RGF0YUZvbGRlciwgU3RyaW5nIHRlc3REYXRhTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZSB0ZW1wID0gY3JlYXRlVGVtcEZpbGUodGVzdERhdGFOYW1lKTsKLQkJT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRlbXApOwotCQlGaWxlVXRpbHMuY29weVN0cmVhbShnZXQodGVzdERhdGFGb2xkZXIsIHRlc3REYXRhTmFtZSksIHRydWUsIG91dCwgdHJ1ZSk7Ci0JCXJldHVybiB0ZW1wOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlLiBUaGlzIGZpbGUgd2lsbCBiZSBkZWxldGVkIGlmIHRoZSBqdm0gZXhpdHMuIAotCSAqIElmIHRlc3REYXRhTmFtZSBjb250YWlucyBhbiBleHRlbnNpb24gdGhpcyBleHRlbnNpb24gd2lsbCBiZSB1c2VkIGFzIAotCSAqIHN1ZmZpeCBmb3IgdGhlIHRlbXBvcmFyeSBmaWxlLgotCSAqIEBwYXJhbSB0ZXN0RGF0YU5hbWUKLQkgKiBAcmV0dXJuIHRlbXBvcmFyeSBmaWxlCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRmlsZShTdHJpbmcgdGVzdERhdGFOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgaSA9IHRlc3REYXRhTmFtZS5sYXN0SW5kZXhPZignLicpOwotCQlGaWxlIHRlbXAgPSAoaSA9PSAtMSkgPyBGaWxlLmNyZWF0ZVRlbXBGaWxlKHRlc3REYXRhTmFtZSArIFBSRUZJWF9TRVBFUkFUT1IsICIudG1wIikgOiBGaWxlLmNyZWF0ZVRlbXBGaWxlKHRlc3REYXRhTmFtZS5zdWJzdHJpbmcoMCwgaSkgKyBQUkVGSVhfU0VQRVJBVE9SLCB0ZXN0RGF0YU5hbWUuc3Vic3RyaW5nKGkpKTsKLQkJdGVtcC5kZWxldGVPbkV4aXQoKTsKLQkJcmV0dXJuIHRlbXA7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0IGVxdWFsaXR5IG9mIGZpbGVzLgotCSAqIEBwYXJhbSBleHBlY3RlZAotCSAqIEBwYXJhbSBhY3R1YWwKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFscyhGaWxlIGV4cGVjdGVkLCBGaWxlIGFjdHVhbCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmFzc2VydEVxdWFscygiRmlsZXMgaGF2ZSBkaWZmZXJlbnQgbGVuZ3Rocy4iLCBleHBlY3RlZC5sZW5ndGgoKSwgYWN0dWFsLmxlbmd0aCgpKTsKLQkJVGVzdERhdGEuYXNzZXJ0RXF1YWxzKG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZXhwZWN0ZWQpKSwgbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShhY3R1YWwpKSk7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0IGVxdWFsaXR5IG9mIGlucHV0IHN0cmVhbXMuCi0JICogQHBhcmFtIGV4cGVjdGVkCi0JICogQHBhcmFtIGFjdHVhbAotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKElucHV0U3RyZWFtIGV4cGVjdGVkLCBJbnB1dFN0cmVhbSBhY3R1YWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlpbnQgcmVhZEV4cGVjdGVkID0gMDsKLQkJCWludCByZWFkQWN0dWFsID0gMDsKLQkJCWludCBjb3VudCA9IDA7Ci0JCQl3aGlsZSAocmVhZEFjdHVhbCAhPSAtMSAmJiByZWFkRXhwZWN0ZWQgIT0gLTEpIHsKLQkJCQlyZWFkQWN0dWFsID0gYWN0dWFsLnJlYWQoKTsKLQkJCQlyZWFkRXhwZWN0ZWQgPSBleHBlY3RlZC5yZWFkKCk7Ci0JCQkJQXNzZXJ0LmFzc2VydEVxdWFscygiRGlmZmVyZW50IGJ5dGVzIGF0ICIgKyBjb3VudCwgcmVhZEV4cGVjdGVkLCByZWFkQWN0dWFsKTsKLQkJCQljb3VudCsrOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKGV4cGVjdGVkICE9IG51bGwpCi0JCQkJZXhwZWN0ZWQuY2xvc2UoKTsKLQkJCWlmIChhY3R1YWwgIT0gbnVsbCkKLQkJCQlhY3R1YWwuY2xvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydCBlcXVhbGl0eSBvZiB6aXAgaW5wdXQgc3RyZWFtcy4KLQkgKiBAcGFyYW0gaW5wdXQxCi0JICogQHBhcmFtIGlucHV0MgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzKFppcElucHV0U3RyZWFtIGlucHV0MSwgWmlwSW5wdXRTdHJlYW0gaW5wdXQyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlNYXAgamFyMSA9IGdldEVudHJpZXMoaW5wdXQxKTsKLQkJTWFwIGphcjIgPSBnZXRFbnRyaWVzKGlucHV0Mik7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGphcjEua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJT2JqZWN0W10gZmlsZTEgPSAoT2JqZWN0W10pIGphcjEuZ2V0KG5hbWUpOwotCQkJT2JqZWN0W10gZmlsZTIgPSAoT2JqZWN0W10pIGphcjIucmVtb3ZlKG5hbWUpOwotCQkJQXNzZXJ0LmFzc2VydE5vdE51bGwoZmlsZTIpOwotCi0JCQlaaXBFbnRyeSBlbnRyeTEgPSAoWmlwRW50cnkpIGZpbGUxWzBdOwotCQkJWmlwRW50cnkgZW50cnkyID0gKFppcEVudHJ5KSBmaWxlMlswXTsKLQkJCS8vIGNvbXBhcmUgdGhlIGVudHJpZXMKLQkJCUFzc2VydC5hc3NlcnRUcnVlKGVudHJ5MS5nZXROYW1lKCkuZXF1YWxzKGVudHJ5Mi5nZXROYW1lKCkpKTsKLQkJCUFzc2VydC5hc3NlcnRUcnVlKGVudHJ5MS5nZXRTaXplKCkgPT0gZW50cnkyLmdldFNpemUoKSk7Ci0JCQkvLwlUT0RPIGZvciBub3cgc2tpcCBvdmVyIHRoZSB0aW1lc3RhbXAgYXMgdGhleSBzZWVtIHRvIGJlIGRpZmZlcmVudAotCQkJLy8gYXNzZXJ0VHJ1ZShlbnRyeTEuZ2V0VGltZSgpID09IGVudHJ5Mi5nZXRUaW1lKCkpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoZW50cnkxLmlzRGlyZWN0b3J5KCkgPT0gZW50cnkyLmlzRGlyZWN0b3J5KCkpOwotCQkJQXNzZXJ0LmFzc2VydFRydWUoZW50cnkxLmdldENyYygpID09IGVudHJ5Mi5nZXRDcmMoKSk7Ci0JCQlBc3NlcnQuYXNzZXJ0VHJ1ZShlbnRyeTEuZ2V0TWV0aG9kKCkgPT0gZW50cnkyLmdldE1ldGhvZCgpKTsKLQotCQkJLy8gY2hlY2sgdGhlIGNvbnRlbnQgb2YgdGhlIGVudHJpZXMKLQkJCUFzc2VydC5hc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoKGJ5dGVbXSkgZmlsZTFbMV0sIChieXRlW10pIGZpbGUyWzFdKSk7Ci0JCX0KLQotCQkvLyBlbnN1cmUgdGhhdCB3ZSBoYXZlIGNvbnN1bWVkIGFsbCBvZiB0aGUgZW50cmllcyBpbiB0aGUgc2Vjb25kIEpBUgotCQlBc3NlcnQuYXNzZXJ0VHJ1ZShqYXIyLnNpemUoKSA9PSAwKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgZ2V0RW50cmllcyhaaXBJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTWFwIHJlc3VsdCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlaaXBFbnRyeSBlbnRyeSA9IGlucHV0LmdldE5leHRFbnRyeSgpOwotCQkJaWYgKGVudHJ5ID09IG51bGwpCi0JCQkJcmV0dXJuIHJlc3VsdDsKLQotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGNvbnRlbnQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlGaWxlVXRpbHMuY29weVN0cmVhbShpbnB1dCwgZmFsc2UsIGNvbnRlbnQsIHRydWUpOwotCQkJaW5wdXQuY2xvc2VFbnRyeSgpOwotCQkJcmVzdWx0LnB1dChlbnRyeS5nZXROYW1lKCksIG5ldyBPYmplY3RbXSB7ZW50cnksIGNvbnRlbnQudG9CeXRlQXJyYXkoKX0pOwotCQl9Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL1Rlc3RNZXRhZGF0YVJlcG9zaXRvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9UZXN0TWV0YWRhdGFSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNGY2YzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL1Rlc3RNZXRhZGF0YVJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeS5BYnN0cmFjdE1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBBIHNpbXBsZSBtZXRhZGF0YSByZXBvc2l0b3J5IHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuICBBbGwgbWV0YWRhdGEKLSAqIGlzIGtlcHQgaW4gbWVtb3J5LgotICovCi1wdWJsaWMgY2xhc3MgVGVzdE1ldGFkYXRhUmVwb3NpdG9yeSBleHRlbmRzIEFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERVNDUklQVElPTiA9ICJBIFRlc3QgTWV0YWRhdGEgUmVwb3NpdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJBVGVzdE1ldGFkYXRhUmVwb3NpdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVIgPSAib3JnLmVjbGlwc2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAidGVzdG1ldGFkYXRhcmVwbyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIxIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgTGlzdCB1bml0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByaXZhdGUgc3RhdGljIFVSTCBjcmVhdGVMb2NhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCS8vSnVzdCBuZWVkIGEgdW5pcXVlIFVSTCAtIHdlIGRvbid0IG5lZWQgdG8gcmVhZC93cml0ZSB0aGlzIGxvY2F0aW9uCi0JCQlyZXR1cm4gbmV3IFVSTCgiaHR0cDovL1Rlc3RNZXRhZGF0YVJlcG9zaXRvcnkuY29tLyIgKyBMb25nLnRvU3RyaW5nKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlBc3NlcnQuZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRlc3RNZXRhZGF0YVJlcG9zaXRvcnkoSUluc3RhbGxhYmxlVW5pdFtdIGl1cykgewotCQlzdXBlcihOQU1FLCBUWVBFLCBWRVJTSU9OLCBjcmVhdGVMb2NhdGlvbigpLCBERVNDUklQVElPTiwgUFJPVklERVIsIG51bGwpOwotCQl1bml0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChpdXMpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRJbnN0YWxsYWJsZVVuaXRzKElJbnN0YWxsYWJsZVVuaXRbXSB0b0FkZCkgewotCQl1bml0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdCh0b0FkZCkpOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IGZpbmQoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvblN0cmluZykgewotCQlJdGVyYXRvciByZXN1bHQgPSBxdWVyeShuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkoaWQsIG5ldyBWZXJzaW9uKHZlcnNpb25TdHJpbmcpKSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pdGVyYXRvcigpOwotCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXQpIChyZXN1bHQuaGFzTmV4dCgpID8gcmVzdWx0Lm5leHQoKSA6IG51bGwpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChhZGFwdGVyID09IFRlc3RNZXRhZGF0YVJlcG9zaXRvcnkuY2xhc3MgfHwgYWRhcHRlciA9PSBJTWV0YWRhdGFSZXBvc2l0b3J5LmNsYXNzIHx8IGFkYXB0ZXIgPT0gSVJlcG9zaXRvcnkuY2xhc3MpIHsKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0b3IgcXVlcnkoUXVlcnkgcXVlcnksIENvbGxlY3RvciBjb2xsZWN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gcXVlcnkucGVyZm9ybSh1bml0cy5pdGVyYXRvcigpLCBjb2xsZWN0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJdW5pdHMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZW1vdmVJbnN0YWxsYWJsZVVuaXRzKElJbnN0YWxsYWJsZVVuaXRbXSB0b1JlbW92ZSkgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9SZW1vdmUubGVuZ3RoOyBpKyspIHsKLQkJCW1vZGlmaWVkIHw9IHVuaXRzLnJlbW92ZSh0b1JlbW92ZVtpXSk7Ci0JCX0KLQkJcmV0dXJuIG1vZGlmaWVkOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoUmVwb3NpdG9yeVN0YXRlIHN0YXRlKSB7Ci0JCXRoaXMubmFtZSA9IHN0YXRlLk5hbWU7Ci0JCXRoaXMudHlwZSA9IHN0YXRlLlR5cGU7Ci0JCXRoaXMudmVyc2lvbiA9IHN0YXRlLlZlcnNpb24udG9TdHJpbmcoKTsKLQkJdGhpcy5wcm92aWRlciA9IHN0YXRlLlByb3ZpZGVyOwotCQl0aGlzLmRlc2NyaXB0aW9uID0gc3RhdGUuRGVzY3JpcHRpb247Ci0JCXRoaXMubG9jYXRpb24gPSBzdGF0ZS5Mb2NhdGlvbjsKLQkJdGhpcy5wcm9wZXJ0aWVzID0gc3RhdGUuUHJvcGVydGllczsKLQkJdGhpcy51bml0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChzdGF0ZS5Vbml0cykpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDIwNzY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUGVyZm9ybXMgYWxsIGF1dG9tYXRlZCBhcnRpZmFjdCByZXBvc2l0b3J5IHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFydGlmYWN0T3V0cHV0U3RyZWFtVGVzdC5jbGFzcyk7Ci0JCS8vIERJU0FCTElORyBURVNUIFVOVElMIFdFIFVQREFURSBSRVBPU0lUT1JZIEZJTEVTCi0JCS8vc3VpdGUuYWRkVGVzdFN1aXRlKEphclVSTFJlcG9zaXRvcnlUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZvbGRlcnNSZXBvc2l0b3J5VGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlUZXN0LmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L0FydGlmYWN0T3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvQXJ0aWZhY3RPdXRwdXRTdHJlYW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NDUzNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvQXJ0aWZhY3RPdXRwdXRTdHJlYW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIElCTSAtIG9uZ29pbmcgbWFpbnRlbmFuY2UKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnNpbXBsZS5TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LnNpbXBsZS5TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkuQXJ0aWZhY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5BcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkucHJvY2Vzc2luZy5Qcm9jZXNzaW5nU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEFydGlmYWN0T3V0cHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5IHNhciA9IG51bGw7Ci0JcHJpdmF0ZSBQcm9jZXNzaW5nU3RlcCBkZXN0aW5hdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJQXJ0aWZhY3RLZXkgYWsgPSBudWxsOwotCXByaXZhdGUgSUFydGlmYWN0RGVzY3JpcHRvciBhZCA9IG51bGw7Ci0JcHJpdmF0ZSBBcnRpZmFjdE91dHB1dFN0cmVhbSBhb3MgPSBudWxsOwotCXByaXZhdGUgRmlsZSB0ZW1wID0gbnVsbDsKLQlwcml2YXRlIEZpbGUgdGVtcFdyaXRhYmxlTG9jYXRpb24gPSBudWxsOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQotCQl0ZW1wV3JpdGFibGVMb2NhdGlvbiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoImFydGlmYWN0IiwgIi5yZXBvIik7Ci0JCXRlbXBXcml0YWJsZUxvY2F0aW9uLmRlbGV0ZSgpOwotCQl0ZW1wV3JpdGFibGVMb2NhdGlvbi5ta2RpcnMoKTsKLQkJc2FyID0gbmV3IFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeSgibmFtZSIsIHRlbXBXcml0YWJsZUxvY2F0aW9uLnRvVVJMKCksIG51bGwpOwotCQlkZXN0aW5hdGlvbiA9IG5ldyBEZXN0aW5hdGlvbigpOwotCQlhayA9IG5ldyBBcnRpZmFjdEtleSgiY2xhc3NpZmllciIsICJpZCIsIG5ldyBWZXJzaW9uKCIxLjAiKSk7Ci0JCWFkID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvcihhayk7Ci0JCXRlbXAgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJBcnRpZmFjdE91dHB1dFN0cmVhbVRlc3QiLCAiLnRtcCIpOwotCQl0ZW1wLmRlbGV0ZU9uRXhpdCgpOwotCQlhb3MgPSBzYXIubmV3IEFydGlmYWN0T3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uLCBhZCwgdGVtcCk7Ci0JCWFzc2VydE5vdE51bGwoYW9zKTsKLQkJRGVzdGluYXRpb24uaW9lID0gbnVsbDsKLQkJRGVzdGluYXRpb24uYmFvcyA9IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LmRlbGV0ZSh0ZW1wKTsKLQkJQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LmRlbGV0ZSh0ZW1wV3JpdGFibGVMb2NhdGlvbik7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFN0YXRlZnVsbG5lc3MoKSB7Ci0JCWFzc2VydFRydWUoYW9zIGluc3RhbmNlb2YgSVN0YXRlZnVsKTsKLQkJYXNzZXJ0VHJ1ZShhb3MgaW5zdGFuY2VvZiBBcnRpZmFjdE91dHB1dFN0cmVhbSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNpbmdsZUNsb3NlU3RyZWFtT2tEZXN0aW5hdGlvbk9rKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wLmV4aXN0cygpKTsKLQkJYW9zLndyaXRlKDIyKTsKLQkJYW9zLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUodGVtcC5leGlzdHMoKSk7Ci0JCWFzc2VydEVxdWFscygiMSIsIGFkLmdldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuRE9XTkxPQURfU0laRSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REb3VibGVDbG9zZVN0cmVhbU9rRGVzdGluYXRpb25PaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGVtcC5leGlzdHMoKSk7Ci0JCWFvcy53cml0ZSgyMik7Ci0JCWFvcy5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKHRlbXAuZXhpc3RzKCkpOwotCQlhc3NlcnRFcXVhbHMoIjEiLCBhZC5nZXRQcm9wZXJ0eShJQXJ0aWZhY3REZXNjcmlwdG9yLkRPV05MT0FEX1NJWkUpKTsKLQkJLy8gdGVzdHMgYnVnIDIxMjQ3NgotCQlhb3MuY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wLmV4aXN0cygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQ2xvc2VTdHJlYW1Ob3RPa0Rlc3RpbmF0aW9uT2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlhc3NlcnRUcnVlKHRlbXAuZXhpc3RzKCkpOwotCQlhb3Muc2V0U3RhdHVzKFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQkJYW9zLmNsb3NlKCk7Ci0JCWFzc2VydEZhbHNlKHRlbXAuZXhpc3RzKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW5nbGVDbG9zZVN0cmVhbU9rRGVzdGluYXRpb25Ob3RPaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWFzc2VydFRydWUodGVtcC5leGlzdHMoKSk7Ci0JCWRlc3RpbmF0aW9uLnNldFN0YXR1cyhTdGF0dXMuQ0FOQ0VMX1NUQVRVUyk7Ci0JCWFvcy5jbG9zZSgpOwotCQlhc3NlcnRGYWxzZSh0ZW1wLmV4aXN0cygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQ2xvc2VTdHJlYW1Pa0Rlc3RpbmF0aW9uQ2xvc2VGYWlscygpIHsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wLmV4aXN0cygpKTsKLQkJRGVzdGluYXRpb24uaW9lID0gbmV3IElPRXhjZXB0aW9uKCJFeHBlY3RlZCIpOwotCQl0cnkgewotCQkJYW9zLmNsb3NlKCk7Ci0JCQlhc3NlcnRUcnVlKGZhbHNlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQlhc3NlcnRUcnVlKHRydWUpOwotCQl9IGZpbmFsbHkgewotCQkJYXNzZXJ0RmFsc2UodGVtcC5leGlzdHMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQ2xvc2VTdHJlYW1Ob3RPa0Rlc3RpbmF0aW9uQ2xvc2VGYWlscygpIHsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wLmV4aXN0cygpKTsKLQkJRGVzdGluYXRpb24uaW9lID0gbmV3IElPRXhjZXB0aW9uKCJFeHBlY3RlZCIpOwotCQlhb3Muc2V0U3RhdHVzKFN0YXR1cy5DQU5DRUxfU1RBVFVTKTsKLQkJdHJ5IHsKLQkJCWFvcy5jbG9zZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCWFzc2VydFRydWUoZmFsc2UpOwotCQl9IGZpbmFsbHkgewotCQkJYXNzZXJ0RmFsc2UodGVtcC5leGlzdHMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUb0Rlc3RpbmF0aW9uU3RyZWFtT2tEZXN0aW5hdGlvbk9rKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRGVzdGluYXRpb24uYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wLmV4aXN0cygpKTsKLQkJYW9zLndyaXRlKDIyKTsKLQkJYW9zLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUodGVtcC5leGlzdHMoKSk7Ci0JCWFzc2VydEVxdWFscygiMSIsIGFkLmdldFByb3BlcnR5KElBcnRpZmFjdERlc2NyaXB0b3IuRE9XTkxPQURfU0laRSkpOwotCQlhb3MuY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSh0ZW1wLmV4aXN0cygpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIERlc3RpbmF0aW9uLmJhb3MudG9CeXRlQXJyYXkoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoMjIsIERlc3RpbmF0aW9uLmJhb3MudG9CeXRlQXJyYXkoKVswXSk7Ci0JfQotCi0Jc3RhdGljIGNsYXNzIERlc3RpbmF0aW9uIGV4dGVuZHMgUHJvY2Vzc2luZ1N0ZXAgewotCi0JCXN0YXRpYyBJT0V4Y2VwdGlvbiBpb2UgPSBudWxsOwotCQlzdGF0aWMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBudWxsOwotCi0JCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXN1cGVyLmNsb3NlKCk7Ci0JCQlpZiAoaW9lICE9IG51bGwpIHsKLQkJCQl0aHJvdyBpb2U7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCWlmIChiYW9zICE9IG51bGwpCi0JCQkJYmFvcy53cml0ZShiKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L0ZvbGRlcnNSZXBvc2l0b3J5VGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvRm9sZGVyc1JlcG9zaXRvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMTczYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvRm9sZGVyc1JlcG9zaXRvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5hcnRpZmFjdC5yZXBvc2l0b3J5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUZpbHRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEZvbGRlcnNSZXBvc2l0b3J5VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXByaXZhdGUgU2VydmljZVJlZmVyZW5jZSBtYW5hZ2VyUmVmOwotCXByaXZhdGUgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlcjsKLQotCXB1YmxpYyBGb2xkZXJzUmVwb3NpdG9yeVRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIEZvbGRlcnNSZXBvc2l0b3J5VGVzdCgpIHsKLQkJc3VwZXIoIiIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW1hbmFnZXJSZWYgPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCW1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UobWFuYWdlclJlZik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbWFuYWdlciA9IG51bGw7Ci0JCVRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnVuZ2V0U2VydmljZShtYW5hZ2VyUmVmKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Rm9sZGVyUmVwb3NpdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgdGVtcERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLQkJRmlsZSB0ZXN0UmVwbyA9IG5ldyBGaWxlKHRlbXBEaXIsICJ0ZXN0UmVwbyIpOwotCQlBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QuZGVsZXRlKHRlc3RSZXBvKTsKLQkJdGVzdFJlcG8ubWtkaXIoKTsKLQotCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkodGVzdFJlcG8udG9VUkwoKSk7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbyA9IG1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeSh0ZXN0UmVwby50b1VSTCgpLCAidGVzdFJlcG8iLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZLCBudWxsKTsKLQkJRmlsZSBwbHVnaW5zRm9sZGVyID0gbmV3IEZpbGUodGVzdFJlcG8sICJwbHVnaW5zIik7Ci0JCXBsdWdpbnNGb2xkZXIubWtkaXIoKTsKLQotCQlVUkwgc291cmNlQmFzZSA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEiKTsKLQkJRmlsZSBzb3VyY2VGb2xkZXIgPSBuZXcgRmlsZShGaWxlTG9jYXRvci50b0ZpbGVVUkwoc291cmNlQmFzZSkuZ2V0UGF0aCgpKTsKLQotCQlBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QuY29weSgiMC45OSIsIHNvdXJjZUZvbGRlciwgcGx1Z2luc0ZvbGRlcik7Ci0JCUZpbGVGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbGVGaWx0ZXIoKSB7Ci0KLQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIHBhdGhuYW1lKSB7Ci0JCQkJcmV0dXJuICFwYXRobmFtZS5nZXROYW1lKCkuZXF1YWxzKCJDVlMiKTsKLQkJCX0KLQkJfTsKLQkJRmlsZVtdIGZpbGVMaXN0ID0gcGx1Z2luc0ZvbGRlci5saXN0RmlsZXMoZmlsdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGZpbGVMaXN0Lmxlbmd0aCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZUxpc3QubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgZmlsZSA9IGZpbGVMaXN0W2ldOwotCQkJU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXROYW1lKCk7Ci0JCQlpZiAoZmlsZU5hbWUuZW5kc1dpdGgoIi5qYXIiKSkKLQkJCQlmaWxlTmFtZSA9IGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sZW5ndGgoKSAtIDQpOwotCQkJU3RyaW5nIGlkZW50aWZpZXIgPSBmaWxlTmFtZS5zdWJzdHJpbmcoMCwgZmlsZU5hbWUuaW5kZXhPZignXycpKTsKLQkJCVN0cmluZyB2ZXJzaW9uID0gZmlsZU5hbWUuc3Vic3RyaW5nKGZpbGVOYW1lLmluZGV4T2YoJ18nKSArIDEpOwotCi0JCQlBcnRpZmFjdEtleSBrZXkgPSBuZXcgQXJ0aWZhY3RLZXkoIm9zZ2kuYnVuZGxlIiwgaWRlbnRpZmllciwgbmV3IFZlcnNpb24odmVyc2lvbikpOwotCQkJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgQXJ0aWZhY3REZXNjcmlwdG9yKGtleSk7Ci0JCQlpZiAoZmlsZS5pc0RpcmVjdG9yeSgpKQotCQkJCWRlc2NyaXB0b3Iuc2V0UHJvcGVydHkoImFydGlmYWN0LmZvbGRlciIsICJ0cnVlIik7Ci0KLQkJCXJlcG8uYWRkRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJfQotCQlJQXJ0aWZhY3RLZXlbXSBrZXlzID0gcmVwby5nZXRBcnRpZmFjdEtleXMoKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGtleXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXBvLnJlbW92ZURlc2NyaXB0b3Ioa2V5c1tpXSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDAsIHJlcG8uZ2V0QXJ0aWZhY3RLZXlzKCkubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHBsdWdpbnNGb2xkZXIubGlzdEZpbGVzKGZpbHRlcikubGVuZ3RoKTsKLQotCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkocmVwby5nZXRMb2NhdGlvbigpKTsKLQkJQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LmRlbGV0ZSh0ZXN0UmVwbyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvSmFyVVJMUmVwb3NpdG9yeVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L0phclVSTFJlcG9zaXRvcnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyODlkMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2FydGlmYWN0L3JlcG9zaXRvcnkvSmFyVVJMUmVwb3NpdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEphclVSTFJlcG9zaXRvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBTZXJ2aWNlUmVmZXJlbmNlIG1hbmFnZXJSZWY7Ci0JcHJpdmF0ZSBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyOwotCi0JcHVibGljIEphclVSTFJlcG9zaXRvcnlUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBKYXJVUkxSZXBvc2l0b3J5VGVzdCgpIHsKLQkJc3VwZXIoIiIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW1hbmFnZXJSZWYgPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCW1hbmFnZXIgPSAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UobWFuYWdlclJlZik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJbWFuYWdlciA9IG51bGw7Ci0JCVRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLnVuZ2V0U2VydmljZShtYW5hZ2VyUmVmKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SmFyVVJMUmVwb3NpdG9yeSgpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlVUkwgZW5naW5lSmFyID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi90ZXN0RGF0YS9lbmdpbmVyZXBvLmphciIpOwotCQlVUkwgamFyUmVwb1VSTCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXJSZXBvVVJMID0gbmV3IFVSTCgiamFyOiIgKyBlbmdpbmVKYXIudG9TdHJpbmcoKSArICIhL3Rlc3REYXRhL2VuZ2luZXJlcG8vYXJ0aWZhY3RzLnhtbCIpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbChlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvID0gbWFuYWdlci5sb2FkUmVwb3NpdG9yeShqYXJSZXBvVVJMLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShyZXBvLmNvbnRhaW5zKG5ldyBBcnRpZmFjdEtleSgib3NnaS5idW5kbGUiLCAidGVzdGRhdGEiLCBuZXcgVmVyc2lvbigiMS4wLjAuMSIpKSkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L1NpbXBsZUFydGlmYWN0UmVwb3NpdG9yeVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9hcnRpZmFjdC9yZXBvc2l0b3J5L1NpbXBsZUFydGlmYWN0UmVwb3NpdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmYmEzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvYXJ0aWZhY3QvcmVwb3NpdG9yeS9TaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBjb21wZW9wbGUgQUcgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogCWNvbXBlb3BsZSBBRyAoU3RlZmFuIExpZWJpZykgLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmFydGlmYWN0LnJlcG9zaXRvcnk7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuc2ltcGxlLlNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLkVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHZvaWQgdGVzdEdldEFjdHVhbExvY2F0aW9uMSgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlVUkwgYmFzZSA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3QvYXJ0aWZhY3RSZXBvc2l0b3J5Iik7Ci0JCWFzc2VydEVxdWFscyhuZXcgVVJMKGJhc2UgKyAiL2FydGlmYWN0cy54bWwiKSwgU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5LmdldEFjdHVhbExvY2F0aW9uKGJhc2UsIGZhbHNlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFjdHVhbExvY2F0aW9uMigpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlVUkwgYmFzZSA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3QvYXJ0aWZhY3RSZXBvc2l0b3J5LyIpOwotCQlhc3NlcnRFcXVhbHMobmV3IFVSTChiYXNlICsgImFydGlmYWN0cy54bWwiKSwgU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5LmdldEFjdHVhbExvY2F0aW9uKGJhc2UsIGZhbHNlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdldEFjdHVhbExvY2F0aW9uMygpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlVUkwgYmFzZSA9IG5ldyBVUkwoImh0dHA6Ly9sb2NhbGhvc3QvYXJ0aWZhY3RSZXBvc2l0b3J5L2FydGlmYWN0cy54bWwiKTsKLQkJYXNzZXJ0RXF1YWxzKGJhc2UsIFNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeS5nZXRBY3R1YWxMb2NhdGlvbihiYXNlLCBmYWxzZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY3R1YWxMb2NhdGlvbkNvbXByZXNzZWQxKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVVSTCBiYXNlID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdC9hcnRpZmFjdFJlcG9zaXRvcnkiKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBVUkwoYmFzZSArICIvYXJ0aWZhY3RzLmphciIpLCBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QWN0dWFsTG9jYXRpb24oYmFzZSwgdHJ1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY3R1YWxMb2NhdGlvbkNvbXByZXNzZWQyKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVVSTCBiYXNlID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdC9hcnRpZmFjdFJlcG9zaXRvcnkvIik7Ci0JCWFzc2VydEVxdWFscyhuZXcgVVJMKGJhc2UgKyAiYXJ0aWZhY3RzLmphciIpLCBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnkuZ2V0QWN0dWFsTG9jYXRpb24oYmFzZSwgdHJ1ZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRBY3R1YWxMb2NhdGlvbkNvbXByZXNzZWQzKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVVSTCBiYXNlID0gbmV3IFVSTCgiaHR0cDovL2xvY2FsaG9zdC9hcnRpZmFjdFJlcG9zaXRvcnkvYXJ0aWZhY3RzLmphciIpOwotCQlhc3NlcnRFcXVhbHMoYmFzZSwgU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5LmdldEFjdHVhbExvY2F0aW9uKGJhc2UsIHRydWUpKTsKLQl9Ci0KLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIGdldEFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKSB7Ci0JCXJldHVybiAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcHJlc3NlZFJlcG9zaXRvcnkoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24gewotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBhcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyID0gZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpOwotCQlTdHJpbmcgdGVtcERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLQkJRmlsZSByZXBvTG9jYXRpb24gPSBuZXcgRmlsZSh0ZW1wRGlyLCAiU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5VGVzdCIpOwotCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXByb3BlcnRpZXMucHV0KElSZXBvc2l0b3J5LlBST1BfQ09NUFJFU1NFRCwgInRydWUiKTsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvID0gYXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbi50b1VSTCgpLCAiYXJ0aWZhY3QgbmFtZSIsIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLlRZUEVfU0lNUExFX1JFUE9TSVRPUlksIHByb3BlcnRpZXMpOwotCQlhcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLmFkZFJlcG9zaXRvcnkocmVwby5nZXRMb2NhdGlvbigpKTsKLQkJRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIoKTsKLQkJcHJvdmlkZXIuc2V0QXJ0aWZhY3RSZXBvc2l0b3J5KHJlcG8pOwotCQlwcm92aWRlci5pbml0aWFsaXplKHJlcG9Mb2NhdGlvbik7Ci0JCXByb3ZpZGVyLnNldFJvb3RWZXJzaW9uKCIzLjMiKTsKLQkJcHJvdmlkZXIuc2V0Um9vdElkKCJzZGsiKTsKLQkJcHJvdmlkZXIuc2V0Rmxhdm9yKCJ0b29saW5nIik7Ci0JCW5ldyBHZW5lcmF0b3IocHJvdmlkZXIpLmdlbmVyYXRlKCk7Ci0JCUZpbGUgZmlsZXNbXSA9IHJlcG9Mb2NhdGlvbi5saXN0RmlsZXMoKTsKLQkJYm9vbGVhbiBqYXJGaWxlUHJlc2VudCA9IGZhbHNlOwotCQlib29sZWFuIGFydGlmYWN0RmlsZVByZXNlbnQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCJhcnRpZmFjdHMuamFyIi5lcXVhbHNJZ25vcmVDYXNlKGZpbGVzW2ldLmdldE5hbWUoKSkpIHsKLQkJCQlqYXJGaWxlUHJlc2VudCA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAoImFydGlmYWN0cy54bWwiLmVxdWFsc0lnbm9yZUNhc2UoZmlsZXNbaV0uZ2V0TmFtZSgpKSkgewotCQkJCWFydGlmYWN0RmlsZVByZXNlbnQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQlpZiAoIWphckZpbGVQcmVzZW50KQotCQkJZmFpbCgiUmVwb3NpdG9yeSBzaG91bGQgY3JlYXRlIEpBUiBmb3IgYXJ0aWZhY3QueG1sIik7Ci0JCWlmIChhcnRpZmFjdEZpbGVQcmVzZW50KQotCQkJZmFpbCgiUmVwb3NpdG9yeSBzaG91bGQgbm90IGNyZWF0ZSBhcnRpZmFjdC54bWwiKTsKLQkJZGVsZXRlKHJlcG9Mb2NhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY29tcHJlc3NlZFJlcG9zaXRvcnkoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24gewotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBhcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyID0gZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpOwotCQlTdHJpbmcgdGVtcERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLQkJRmlsZSByZXBvTG9jYXRpb24gPSBuZXcgRmlsZSh0ZW1wRGlyLCAiU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5VGVzdCIpOwotCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXByb3BlcnRpZXMucHV0KElSZXBvc2l0b3J5LlBST1BfQ09NUFJFU1NFRCwgImZhbHNlIik7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbyA9IGFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShyZXBvTG9jYXRpb24udG9VUkwoKSwgImFydGlmYWN0IG5hbWUiLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZLCBwcm9wZXJ0aWVzKTsKLQkJYXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5hZGRSZXBvc2l0b3J5KHJlcG8uZ2V0TG9jYXRpb24oKSk7Ci0JCUVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldEFydGlmYWN0UmVwb3NpdG9yeShyZXBvKTsKLQkJcHJvdmlkZXIuaW5pdGlhbGl6ZShyZXBvTG9jYXRpb24pOwotCQlwcm92aWRlci5zZXRSb290VmVyc2lvbigiMy4zIik7Ci0JCXByb3ZpZGVyLnNldFJvb3RJZCgic2RrIik7Ci0JCXByb3ZpZGVyLnNldEZsYXZvcigidG9vbGluZyIpOwotCQluZXcgR2VuZXJhdG9yKHByb3ZpZGVyKS5nZW5lcmF0ZSgpOwotCQlGaWxlIGZpbGVzW10gPSByZXBvTG9jYXRpb24ubGlzdEZpbGVzKCk7Ci0JCWJvb2xlYW4gamFyRmlsZVByZXNlbnQgPSBmYWxzZTsKLQkJYm9vbGVhbiBhcnRpZmFjdEZpbGVQcmVzZW50ID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgiYXJ0aWZhY3RzLmphciIuZXF1YWxzSWdub3JlQ2FzZShmaWxlc1tpXS5nZXROYW1lKCkpKSB7Ci0JCQkJamFyRmlsZVByZXNlbnQgPSB0cnVlOwotCQkJfQotCQkJaWYgKCJhcnRpZmFjdHMueG1sIi5lcXVhbHNJZ25vcmVDYXNlKGZpbGVzW2ldLmdldE5hbWUoKSkpIHsKLQkJCQlhcnRpZmFjdEZpbGVQcmVzZW50ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoamFyRmlsZVByZXNlbnQpCi0JCQlmYWlsKCJSZXBvc2l0b3J5IHNob3VsZCBub3QgY3JlYXRlIEpBUiBmb3IgYXJ0aWZhY3QueG1sIik7Ci0JCWlmICghYXJ0aWZhY3RGaWxlUHJlc2VudCkKLQkJCWZhaWwoIlJlcG9zaXRvcnkgc2hvdWxkIGNyZWF0ZSBhcnRpZmFjdC54bWwiKTsKLQkJZGVsZXRlKHJlcG9Mb2NhdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGRlbGV0ZShGaWxlIGZpbGUpIHsKLQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBjaGlsZHJlbiA9IGZpbGUubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkJCWRlbGV0ZShjaGlsZHJlbltpXSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGUuZGVsZXRlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2NvcmUvQWxsVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9jb3JlL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjQzZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2NvcmUvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmNvcmU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBQZXJmb3JtcyBhbGwgYXV0b21hdGVkIGNvcmUgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVVJMVXRpbFRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvY29yZS9VUkxVdGlsVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2NvcmUvVVJMVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JlNmFmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvY29yZS9VUkxVdGlsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmNvcmU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5VUkxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotCi0vKioKLSAqIFRlc3RzIGZvciB0aGUge0BsaW5rIFVSTFV0aWx9IGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgVVJMVXRpbFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIHRlc3RQYXRocyA9IG5ldyBTdHJpbmdbXSB7ImFiYyIsICJ3aXRoIHNwYWNlcyIsICJ3aXRoJXBlcmNlbnQifTsKLQotCS8qKgotCSAqIFRlc3RzIGZvciB7QGxpbmsgVVJMVXRpbCN0b0ZpbGUoVVJMKX0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRvRmlsZSgpIHsKLQkJRmlsZSBiYXNlID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXN0UGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCUZpbGUgb3JpZ2luYWwgPSBuZXcgRmlsZShiYXNlLCB0ZXN0UGF0aHNbaV0pOwotCQkJVVJJIHVyaSA9IG9yaWdpbmFsLnRvVVJJKCk7Ci0JCQl0cnkgewotCQkJCVVSTCBlbmNvZGVkID0gdXJpLnRvVVJMKCk7Ci0JCQkJRmlsZSByZXN1bHQgPSBVUkxVdGlsLnRvRmlsZShlbmNvZGVkKTsKLQkJCQlhc3NlcnRFcXVhbHMoIjEuIiArIGksIG9yaWdpbmFsLCByZXN1bHQpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCIxLjk5IiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBmb3Ige0BsaW5rIFVSTFV0aWwjdG9VUkkoVVJMKX0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRvVVJJKCkgewotCQlGaWxlIGJhc2UgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRlc3RQYXRocy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoYmFzZSwgdGVzdFBhdGhzW2ldKTsKLQkJCVVSSSBvcmlnaW5hbCA9IGZpbGUudG9VUkkoKTsKLQkJCXRyeSB7Ci0JCQkJVVJMIGVuY29kZWQgPSBmaWxlLnRvVVJMKCk7Ci0JCQkJVVJJIHJlc3VsdCA9IFVSTFV0aWwudG9VUkkoZW5jb2RlZCk7Ci0JCQkJYXNzZXJ0RXF1YWxzKCIxLiIgKyBpLCBvcmlnaW5hbCwgcmVzdWx0KTsKLQkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgiMS45OSIsIGUpOwotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCIyLjk5IiwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBmb3Ige0BsaW5rIFVSTFV0aWwjdG9VUkkoVVJMKX0uCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFRvRmlsZUZyb21Mb2NhbFVSTCgpIHRocm93cyBFeGNlcHRpb24gewotCQlGaWxlIG9yaWdpbmFsID0gbmV3IEZpbGUoU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpLCAicmVwbyIpOwotCQkvL3RoaXMgVVJMIGlzIHRlY2huaWNhbGx5IG5vdCBjb3JyZWN0IGJlY2F1c2UgaXQgaXMgbm90IGhpZXJhcmNoaWNhbCwgYnV0IGVuc3VyZSBVUkxVdGlsIGlzIGxlbmllbnQuCi0JCVVSTCB1cmwgPSBuZXcgVVJMKCJmaWxlOiIgKyBvcmlnaW5hbC50b1N0cmluZygpKTsKLQkJRmlsZSByZXN1bHQgPSBVUkxVdGlsLnRvRmlsZSh1cmwpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIG9yaWdpbmFsLCByZXN1bHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MjZkMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFBlcmZvcm1zIGFsbCBhdXRvbWF0ZWQgZGlyZWN0b3IgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQXV0b21hdGVkRGlyZWN0b3JUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJ1ZzIwMzYzNy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcGVyYXRpb25HZW5lcmF0aW9uVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShPcmFjbGVUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE9yYWNsZVRlc3QyLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBpY2tlclRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVjb21tZW5kYXRpb25UZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFJlcGxhY2VQbGFuVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSZXNvbHV0aW9uSGVscGVyVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShSb2xsYmFja1Rlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2luZ2xldG9uVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShVbmluc3RhbGxUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFVwZGF0ZVRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvQXV0b21hdGVkRGlyZWN0b3JUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvQXV0b21hdGVkRGlyZWN0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNmQ0ZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL0F1dG9tYXRlZERpcmVjdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklEaXJlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLlByb2ZpbGVDaGFuZ2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLQotLyoqCi0gKiBWYXJpb3VzIGF1dG9tYXRlZCB0ZXN0cyBvZiB0aGUge0BsaW5rIElEaXJlY3Rvcn0gQVBJLgotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGVkRGlyZWN0b3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQkvL3ByaXZhdGUgc3RhdGljIFZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShBdXRvbWF0ZWREaXJlY3RvclRlc3QuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBBdXRvbWF0ZWREaXJlY3RvclRlc3QoKSB7Ci0JCXN1cGVyKCIiKTsKLQl9Ci0KLQlwdWJsaWMgQXV0b21hdGVkRGlyZWN0b3JUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGluc3RhbGxpbmcgYW4gSVUgdGhhdCBoYXMgYSBmaWx0ZXJlZCBkZXBlbmRlbmN5IG9uIGFub3RoZXIgSVUuIFdoZW4KLQkgKiB0aGUgZmlsdGVyIGlzIHNhdGlzZmllZCwgdGhlIGRlcGVuZGVuY3kgaXMgYWN0aXZlIGFuZCB0aGUgcmVxdWlyZWQgSVUgc2hvdWxkCi0JICogYmUgaW5zdGFsbGVkLiBXaGVuIHRoZSBmaWx0ZXIgaXMgbm90IHNhdGlzZmllZCwgdGhlIGRlcGVuZGVuY3kgaXMgaW5hY3RpdmUKLQkgKiBhbmQgdGhlIHNlY29uZCBJVSBzaG91bGQgbm90IGJlIGluc3RhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEZpbHRlcmVkQ2FwYWJpbGl0eSgpIHsKLQkJLy9UaGUgSVUgdGhhdCBpcyByZXF1aXJlZAotCQlJSW5zdGFsbGFibGVVbml0IHJlcXVpcmVkSVUgPSBjcmVhdGVJVSgicmVxdWlyZWQuIiArIGdldE5hbWUoKSk7Ci0KLQkJLy8gVGhlIElVIHRvIGJlIGluc3RhbGxlZAotCQlTdHJpbmcgZmlsdGVyID0gY3JlYXRlRmlsdGVyKCJGaWx0ZXJLZXkiLCAidHJ1ZSIpOwotCQlSZXF1aXJlZENhcGFiaWxpdHkgY2FwYWJpbGl0eSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIHJlcXVpcmVkSVUuZ2V0SWQoKSwgQU5ZX1ZFUlNJT04sIGZpbHRlciwgZmFsc2UsIGZhbHNlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB0b0luc3RhbGxJVSA9IGNyZWF0ZUlVKCJ0b0luc3RhbGwuIiArIGdldE5hbWUoKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtjYXBhYmlsaXR5fSk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdFtdIGFsbFVuaXRzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cmVxdWlyZWRJVSwgdG9JbnN0YWxsSVV9OwotCQlJSW5zdGFsbGFibGVVbml0W10gdG9JbnN0YWxsQXJyYXkgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt0b0luc3RhbGxJVX07Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShhbGxVbml0cyk7Ci0JCUlEaXJlY3RvciBkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0KLQkJLy9JbnN0YWxsIGludG8gYSBwcm9maWxlIGluIHdoaWNoIHRoZSBmaWx0ZXIgaXMgc2F0aXNmaWVkCi0JCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMsICJGaWx0ZXJLZXk9dHJ1ZSIpOwotCQlJUHJvZmlsZSBzYXRpc2ZpZWQgPSBjcmVhdGVQcm9maWxlKCJTYXRpc2ZpZWQuIiArIGdldE5hbWUoKSwgbnVsbCwgcHJvcGVydGllcyk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3Qoc2F0aXNmaWVkKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKHRvSW5zdGFsbEFycmF5KTsKLQkJSVN0YXR1cyByZXN1bHQgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHJlc3VsdC5pc09LKCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnMoIjEuMSIsIHNhdGlzZmllZCwgYWxsVW5pdHMpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGluc3RhbGxpbmcgYW4gSVUgdGhhdCBoYXMgYW4gb3B0aW9uYWwgcHJlcmVxdWlzaXRlIHRoYXQgaXMgYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsT3B0aW9uYWxBdmFpbGFibGUoKSB7Ci0JCVN0cmluZyBjYXBhYmlsaXR5SWQgPSAidGVzdC4iICsgZ2V0TmFtZSgpOwotCQkvL1RoZSBJVSB0aGF0IGV4cG9ydHMgdGhlIGNhcGFiaWxpdHkKLQkJSUluc3RhbGxhYmxlVW5pdCByZXF1aXJlZElVID0gY3JlYXRlSVUoInJlcXVpcmVkLiIgKyBnZXROYW1lKCksIG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eSgidGVzdC5jYXBhYmlsaXR5IiwgY2FwYWJpbGl0eUlkLCBERUZBVUxUX1ZFUlNJT04pfSk7Ci0KLQkJLy9UaGUgSVUgdGhhdCBvcHRpb25hbGx5IHJlcXVpcmVzIHRoZSBjYXBhYmlsaXR5Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSByZXF1aXJlZCA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlJZCwgQU5ZX1ZFUlNJT04sIG51bGwsIC8qIG9wdGlvbmFsPT4gKi90cnVlLCAvKiBtdWx0aXBsZT0+ICovZmFsc2UsIC8qIGdyZWVkeT0+Ki9mYWxzZSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsSVUgPSBjcmVhdGVJVSgidG9JbnN0YWxsLiIgKyBnZXROYW1lKCksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7cmVxdWlyZWR9KTsKLQotCQlJSW5zdGFsbGFibGVVbml0W10gYWxsVW5pdHMgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt0b0luc3RhbGxJVSwgcmVxdWlyZWRJVX07Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSB0b0luc3RhbGxBcnJheSA9IG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3RvSW5zdGFsbElVfTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KGFsbFVuaXRzKTsKLQotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCUlEaXJlY3RvciBkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyh0b0luc3RhbGxBcnJheSk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpOwotCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQlMb2dIZWxwZXIubG9nKHJlc3VsdCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHJlc3VsdC5pc09LKCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnMoIjEuMSIsIHByb2ZpbGUsIHRvSW5zdGFsbEFycmF5KTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBpbnN0YWxsaW5nIGFuIElVIHRoYXQgaGFzIGFuIG9wdGlvbmFsIHByZXJlcXVpc2l0ZSB0aGF0IGlzIG5vdCBhdmFpbGFibGUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxPcHRpb25hbFVuYXZhaWxhYmxlKCkgewotCQlTdHJpbmcgY2FwYWJpbGl0eUlkID0gInRlc3QuIiArIGdldE5hbWUoKTsKLQkJLy9ubyBJVSB3aWxsIGJlIGF2YWlsYWJsZSB0aGF0IGV4cG9ydHMgdGhpcyBjYXBhYmlsaXR5Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSByZXF1aXJlZCA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlJZCwgQU5ZX1ZFUlNJT04sIG51bGwsIHRydWUsIGZhbHNlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB0b0luc3RhbGxJVSA9IGNyZWF0ZUlVKCJ0b0luc3RhbGwuIiArIGdldE5hbWUoKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtyZXF1aXJlZH0pOwotCi0JCUlJbnN0YWxsYWJsZVVuaXRbXSBhbGxVbml0cyA9IG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3RvSW5zdGFsbElVfTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KGFsbFVuaXRzKTsKLQotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCUlEaXJlY3RvciBkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyhhbGxVbml0cyk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpOwotCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQlMb2dIZWxwZXIubG9nKHJlc3VsdCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHJlc3VsdC5pc09LKCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnMoIjEuMSIsIHByb2ZpbGUsIGFsbFVuaXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBpbnN0YWxsaW5nIGFuIElVIHRoYXQgaGFzIGEgcmVxdWlyZWQgY2FwYWJpbGl0eSwgYW5kIHRoZSBJVSBwcm92aWRpbmcKLQkgKiB0aGUgY2FwYWJpbGl0eSBoYXMgYSBwbGF0Zm9ybSBmaWx0ZXIgdGhhdCBpcyBub3Qgc2F0aXNmaWVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsUGxhdGZvcm1GaWx0ZXIoKSB7Ci0JCS8vVGhlIElVIHRoYXQgZXhwb3J0cyB0aGUgY2FwYWJpbGl0eQotCQlTdHJpbmcgY2FwYWJpbGl0eUlkID0gInRlc3QuIiArIGdldE5hbWUoKTsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdmlkZXMgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlJZCwgREVGQVVMVF9WRVJTSU9OKX07Ci0JCUlJbnN0YWxsYWJsZVVuaXQgcmVxdWlyZWRJVSA9IGNyZWF0ZUlVKCJyZXF1aXJlZC4iICsgZ2V0TmFtZSgpLCBjcmVhdGVGaWx0ZXIoIm9zZ2kub3MiLCAiYmxvcnQiKSwgcHJvdmlkZXMpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsSVUgPSBjcmVhdGVJVSgidG9JbnN0YWxsLiIgKyBnZXROYW1lKCksIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKCJ0ZXN0LmNhcGFiaWxpdHkiLCBjYXBhYmlsaXR5SWQsIEFOWV9WRVJTSU9OLCBudWxsKSk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdFtdIGFsbFVuaXRzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cmVxdWlyZWRJVSwgdG9JbnN0YWxsSVV9OwotCQlJSW5zdGFsbGFibGVVbml0W10gdG9JbnN0YWxsQXJyYXkgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt0b0luc3RhbGxJVX07Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShhbGxVbml0cyk7Ci0KLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlJRGlyZWN0b3IgZGlyZWN0b3IgPSBjcmVhdGVEaXJlY3RvcigpOwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHModG9JbnN0YWxsQXJyYXkpOwotCQlJU3RhdHVzIHJlc3VsdCA9IGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgIXJlc3VsdC5pc09LKCkpOwotCi0JCS8vdHJ5IGFnYWluIHdpdGggdGhlIGZpbHRlciBzYXRpc2ZpZWQKLQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwcm9wZXJ0aWVzLnB1dChJUHJvZmlsZS5QUk9QX0VOVklST05NRU5UUywgIm9zZ2kub3M9YmxvcnQiKTsKLQkJSVByb2ZpbGUgcHJvZmlsZTIgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZTIuIiArIGdldE5hbWUoKSwgbnVsbCwgcHJvcGVydGllcyk7Ci0JCXJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTIpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHModG9JbnN0YWxsQXJyYXkpOwotCQlyZXN1bHQgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoIjIuMCIsIHJlc3VsdC5pc09LKCkpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIGluc3RhbGxpbmcgYW4gSVUgdGhhdCBoYXMgYW4gdW5zYXRpc2ZpZWQgcGxhdGZvcm0gZmlsdGVyCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxQbGF0Zm9ybUZpbHRlclVuc2F0aXNmaWVkKCkgewotCQkvL1RoZSBJVSB0byBpbnN0YWxsCi0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsSVUgPSBjcmVhdGVJVSgidG9JbnN0YWxsLiIgKyBnZXROYW1lKCksIGNyZWF0ZUZpbHRlcigib3NnaS5vcyIsICJibG9ydCIpLCBOT19QUk9WSURFUyk7Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSBhbGxVbml0cyA9IG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3RvSW5zdGFsbElVfTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIHRvSW5zdGFsbEFycmF5ID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7dG9JbnN0YWxsSVV9OwotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkoYWxsVW5pdHMpOwotCi0JCUlQcm9maWxlIHByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJSURpcmVjdG9yIGRpcmVjdG9yID0gY3JlYXRlRGlyZWN0b3IoKTsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKHRvSW5zdGFsbEFycmF5KTsKLQkJSVN0YXR1cyByZXN1bHQgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsICFyZXN1bHQuaXNPSygpKTsKLQotCQkvL3RyeSBhZ2FpbiB3aXRoIHRoZSBmaWx0ZXIgc2F0aXNmaWVkCi0JCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMsICJvc2dpLm9zPWJsb3J0Iik7Ci0JCUlQcm9maWxlIHByb2ZpbGUyID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUyLiIgKyBnZXROYW1lKCksIG51bGwsIHByb3BlcnRpZXMpOwotCQlyZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUyKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKHRvSW5zdGFsbEFycmF5KTsKLQkJcmVzdWx0ID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpOwotCQlhc3NlcnRUcnVlKCIyLjAiLCByZXN1bHQuaXNPSygpKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGUgdGVzdCBvZiBpbnN0YWxsaW5nIGFuIElVIHRoYXQgaGFzIGEgcmVxdWlyZWQgY2FwYWJpbGl0eSwgYW5kIGVuc3VyaW5nCi0JICogdGhhdCB0aGUgSVUgcHJvdmlkaW5nIHRoZSBjYXBhYmlsaXR5IGlzIGluc3RhbGxlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlSW5zdGFsbFJlcXVpcmVkKCkgewotCQlTdHJpbmcgY2FwYWJpbGl0eUlkID0gInRlc3QuIiArIGdldE5hbWUoKTsKLQkJLy9UaGUgSVUgdGhhdCBleHBvcnRzIHRoZSBjYXBhYmlsaXR5Ci0JCUlJbnN0YWxsYWJsZVVuaXQgcmVxdWlyZWRJVSA9IGNyZWF0ZUlVKCJyZXF1aXJlZC4iICsgZ2V0TmFtZSgpLCBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHlJZCwgREVGQVVMVF9WRVJTSU9OKX0pOwotCi0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsSVUgPSBjcmVhdGVJVSgidG9JbnN0YWxsLiIgKyBnZXROYW1lKCksIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKCJ0ZXN0LmNhcGFiaWxpdHkiLCBjYXBhYmlsaXR5SWQsIEFOWV9WRVJTSU9OLCBudWxsKSk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdFtdIGFsbFVuaXRzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cmVxdWlyZWRJVSwgdG9JbnN0YWxsSVV9OwotCQlJSW5zdGFsbGFibGVVbml0W10gdG9JbnN0YWxsQXJyYXkgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt0b0luc3RhbGxJVX07Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShhbGxVbml0cyk7Ci0KLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCi0JCUlEaXJlY3RvciBkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyh0b0luc3RhbGxBcnJheSk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpOwotCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQlMb2dIZWxwZXIubG9nKHJlc3VsdCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHJlc3VsdC5pc09LKCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnMoIjEuMSIsIHByb2ZpbGUsIGFsbFVuaXRzKTsKLQl9Ci0KLQkvKioKLQkgKiBTaW1wbGUgdGVzdCBvZiBpbnN0YWxsaW5nIGFuIElVIHRoYXQgaGFzIGEgcmVxdWlyZWQgY2FwYWJpbGl0eSwgYnV0IHdpdGhvdXQKLQkgKiBzcGVjaWZ5aW5nIGEgdmVyc2lvbiByYW5nZSAoYW55IHZlcnNpb24gd2lsbCBkbykuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxSZXF1aXJlZE5vVmVyc2lvbigpIHsKLQkJLy9UaGUgSVUgdGhhdCBpcyBuZWVkZWQKLQkJSUluc3RhbGxhYmxlVW5pdCByZXF1aXJlZElVID0gY3JlYXRlSVUoInJlcXVpcmVkLiIgKyBnZXROYW1lKCkpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgcmVxdWlyZWRJVS5nZXRJZCgpLCBudWxsLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlJSW5zdGFsbGFibGVVbml0IHRvSW5zdGFsbElVID0gY3JlYXRlSVUoInRvSW5zdGFsbC4iICsgZ2V0TmFtZSgpLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge2NhcGFiaWxpdHl9KTsKLQotCQlJSW5zdGFsbGFibGVVbml0W10gYWxsVW5pdHMgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtyZXF1aXJlZElVLCB0b0luc3RhbGxJVX07Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSB0b0luc3RhbGxBcnJheSA9IG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3RvSW5zdGFsbElVfTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KGFsbFVuaXRzKTsKLQotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0KLQkJSURpcmVjdG9yIGRpcmVjdG9yID0gY3JlYXRlRGlyZWN0b3IoKTsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKHRvSW5zdGFsbEFycmF5KTsKLQkJSVN0YXR1cyByZXN1bHQgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCk7Ci0JCWlmICghcmVzdWx0LmlzT0soKSkKLQkJCUxvZ0hlbHBlci5sb2cocmVzdWx0KTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgcmVzdWx0LmlzT0soKSk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWlucygiMS4xIiwgcHJvZmlsZSwgYWxsVW5pdHMpOwotCX0KLQotCS8qKgotCSAqIFNpbXBsZSB0ZXN0IG9mIGluc3RhbGxpbmcgYW4gSVUgdGhhdCBoYXMgYSByZXF1aXJlZCBJVSwgYW5kIGVuc3VyaW5nCi0JICogdGhhdCB0aGUgcmVxdWlyZWQgSVUgaXMgaW5zdGFsbGVkLiBJbiBvdGhlciB3b3JkcywgdGhlIElVIHRvIGluc3RhbGwgaGFzIGEgcmVxdWlyZWQKLQkgKiBjYXBhYmlsaXR5IG9uIHRoZSBJVSBuYW1lc3BhY2UuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFNpbXBsZUluc3RhbGxSZXF1aXJlZElVKCkgewotCQkvL1RoZSBJVSB0aGF0IGV4cG9ydHMgdGhlIGNhcGFiaWxpdHkKLQkJSUluc3RhbGxhYmxlVW5pdCByZXF1aXJlZElVID0gY3JlYXRlSVUoInJlcXVpcmVkLiIgKyBnZXROYW1lKCkpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgcmVxdWlyZWRJVS5nZXRJZCgpLCBBTllfVkVSU0lPTiwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB0b0luc3RhbGxJVSA9IGNyZWF0ZUlVKCJ0b0luc3RhbGwuIiArIGdldE5hbWUoKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtjYXBhYmlsaXR5fSk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdFtdIGFsbFVuaXRzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cmVxdWlyZWRJVSwgdG9JbnN0YWxsSVV9OwotCQlJSW5zdGFsbGFibGVVbml0W10gdG9JbnN0YWxsQXJyYXkgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt0b0luc3RhbGxJVX07Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShhbGxVbml0cyk7Ci0KLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCi0JCUlEaXJlY3RvciBkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyh0b0luc3RhbGxBcnJheSk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpOwotCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQlMb2dIZWxwZXIubG9nKHJlc3VsdCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHJlc3VsdC5pc09LKCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnMoIjEuMSIsIHByb2ZpbGUsIGFsbFVuaXRzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9CdWcyMDM2MzcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9CdWcyMDM2MzcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdjNDdkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvQnVnMjAzNjM3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSURpcmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgQnVnMjAzNjM3IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwdWJsaWMgdm9pZCB0ZXN0KCkgewotCQlJRGlyZWN0b3IgZCA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIHRydWUpOwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0WzBdKTsKLQkJYXNzZXJ0T0soIjEuMCIsIGQucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvT3BlcmF0aW9uR2VuZXJhdGlvblRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9PcGVyYXRpb25HZW5lcmF0aW9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDgxZWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9PcGVyYXRpb25HZW5lcmF0aW9uVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLk9wZXJhdGlvbkdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnJlc29sdXRpb24uUmVzb2x1dGlvbkhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE9wZXJhdGlvbkdlbmVyYXRpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbFVuaW5zdGFsbCgpIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBhMSA9IGNyZWF0ZUlVKCJhIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIGZhbHNlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBhMiA9IGNyZWF0ZUlVKCJhIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIGZhbHNlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBhMyA9IGNyZWF0ZUlVKCJhIiwgbmV3IFZlcnNpb24oMywgMCwgMCksIGZhbHNlKTsKLQotCQlDb2xsZWN0aW9uIGZyb207Ci0JCWZyb20gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZyb20uYWRkKGExKTsKLQkJZnJvbS5hZGQoYTIpOwotCi0JCUNvbGxlY3Rpb24gdG87Ci0JCXRvID0gbmV3IEFycmF5TGlzdCgpOwotCQl0by5hZGQoYTEpOwotCQl0by5hZGQoYTMpOwotCi0JCWZyb20gPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihudWxsLCBudWxsKS5hdHRhY2hDVXMoZnJvbSk7Ci0JCXRvID0gbmV3IFJlc29sdXRpb25IZWxwZXIobnVsbCwgbnVsbCkuYXR0YWNoQ1VzKHRvKTsKLQkJbmV3IE9wZXJhdGlvbkdlbmVyYXRvcigpLmdlbmVyYXRlT3BlcmF0aW9uKGZyb20sIHRvKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBhMSA9IGNyZWF0ZUlVKCJhIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIGZhbHNlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBhMiA9IGNyZWF0ZUlVKCJhIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIGZhbHNlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBhMyA9IGNyZWF0ZUlVKCJhIiwgbmV3IFZlcnNpb24oMywgMCwgMCksIGZhbHNlKTsKLQotCQlDb2xsZWN0aW9uIGZyb207Ci0JCWZyb20gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZyb20uYWRkKGExKTsKLQkJZnJvbS5hZGQoYTMpOwotCi0JCUNvbGxlY3Rpb24gdG87Ci0JCXRvID0gbmV3IEFycmF5TGlzdCgpOwotCQl0by5hZGQoYTEpOwotCQl0by5hZGQoYTMpOwotCQl0by5hZGQoYTIpOwotCi0JCWZyb20gPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihudWxsLCBudWxsKS5hdHRhY2hDVXMoZnJvbSk7Ci0JCXRvID0gbmV3IFJlc29sdXRpb25IZWxwZXIobnVsbCwgbnVsbCkuYXR0YWNoQ1VzKHRvKTsKLQkJbmV3IE9wZXJhdGlvbkdlbmVyYXRvcigpLmdlbmVyYXRlT3BlcmF0aW9uKGZyb20sIHRvKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0MigpIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBhMSA9IGNyZWF0ZUlVKCJhIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIGZhbHNlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBhMiA9IGNyZWF0ZUlVKCJhIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIGZhbHNlKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBhMyA9IGNyZWF0ZUlVKCJhIiwgbmV3IFZlcnNpb24oMywgMCwgMCksIGZhbHNlKTsKLQotCQlDb2xsZWN0aW9uIGZyb207Ci0JCWZyb20gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZyb20uYWRkKGExKTsKLQkJZnJvbS5hZGQoYTIpOwotCQlmcm9tLmFkZChhMyk7Ci0KLQkJQ29sbGVjdGlvbiB0bzsKLQkJdG8gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRvLmFkZChhMSk7Ci0JCXRvLmFkZChhMyk7Ci0KLQkJZnJvbSA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG51bGwsIG51bGwpLmF0dGFjaENVcyhmcm9tKTsKLQkJdG8gPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihudWxsLCBudWxsKS5hdHRhY2hDVXModG8pOwotCQluZXcgT3BlcmF0aW9uR2VuZXJhdG9yKCkuZ2VuZXJhdGVPcGVyYXRpb24oZnJvbSwgdG8pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGUzKCkgewotCQlJSW5zdGFsbGFibGVVbml0IGExID0gY3JlYXRlSVUoImEiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgZmFsc2UpOwotCQlJSW5zdGFsbGFibGVVbml0IGEyID0gY3JlYXRlSVUoImEiLCBuZXcgVmVyc2lvbigyLCAwLCAwKSwgZmFsc2UpOwotCi0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGIgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWIuc2V0SWQoImIiKTsKLQkJYi5zZXRWZXJzaW9uKG5ldyBWZXJzaW9uKDEsIDAsIDApKTsKLQkJYi5zZXRVcGRhdGVEZXNjcmlwdG9yKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVVcGRhdGVEZXNjcmlwdG9yKCJhIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMCkiKSwgSVVwZGF0ZURlc2NyaXB0b3IuTk9STUFMLCBudWxsKSk7Ci0KLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gYyA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJYy5zZXRJZCgiYyIpOwotCQljLnNldFZlcnNpb24obmV3IFZlcnNpb24oMSwgMCwgMCkpOwotCQljLnNldFVwZGF0ZURlc2NyaXB0b3IoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVVwZGF0ZURlc2NyaXB0b3IoImEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMi4wLjAsIDIuMy4wKSIpLCBJVXBkYXRlRGVzY3JpcHRvci5OT1JNQUwsIG51bGwpKTsKLQotCQlDb2xsZWN0aW9uIGZyb207Ci0JCWZyb20gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZyb20uYWRkKGExKTsKLQkJZnJvbS5hZGQoYTIpOwotCi0JCUNvbGxlY3Rpb24gdG87Ci0JCXRvID0gbmV3IEFycmF5TGlzdCgpOwotCQl0by5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChiKSk7Ci0JCXRvLmFkZChNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGMpKTsKLQotCQlmcm9tID0gbmV3IFJlc29sdXRpb25IZWxwZXIobnVsbCwgbnVsbCkuYXR0YWNoQ1VzKGZyb20pOwotCQl0byA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG51bGwsIG51bGwpLmF0dGFjaENVcyh0byk7Ci0JCW5ldyBPcGVyYXRpb25HZW5lcmF0b3IoKS5nZW5lcmF0ZU9wZXJhdGlvbihmcm9tLCB0byk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZTIoKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgYTEgPSBjcmVhdGVJVSgiYSIsIG5ldyBWZXJzaW9uKDEsIDAsIDApLCBmYWxzZSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgYTIgPSBjcmVhdGVJVSgiYSIsIG5ldyBWZXJzaW9uKDIsIDAsIDApLCBmYWxzZSk7Ci0KLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gYiA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJYi5zZXRJZCgiYiIpOwotCQliLnNldFZlcnNpb24obmV3IFZlcnNpb24oMSwgMCwgMCkpOwotCQliLnNldFVwZGF0ZURlc2NyaXB0b3IoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVVwZGF0ZURlc2NyaXB0b3IoImEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDMuMC4wKSIpLCBJVXBkYXRlRGVzY3JpcHRvci5OT1JNQUwsIG51bGwpKTsKLQotCQlDb2xsZWN0aW9uIGZyb207Ci0JCWZyb20gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZyb20uYWRkKGExKTsKLQkJZnJvbS5hZGQoYTIpOwotCi0JCUNvbGxlY3Rpb24gdG87Ci0JCXRvID0gbmV3IEFycmF5TGlzdCgpOwotCQl0by5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChiKSk7Ci0KLQkJZnJvbSA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG51bGwsIG51bGwpLmF0dGFjaENVcyhmcm9tKTsKLQkJdG8gPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihudWxsLCBudWxsKS5hdHRhY2hDVXModG8pOwotCQluZXcgT3BlcmF0aW9uR2VuZXJhdG9yKCkuZ2VuZXJhdGVPcGVyYXRpb24oZnJvbSwgdG8pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGUxKCkgewotCQlJSW5zdGFsbGFibGVVbml0IGEgPSBjcmVhdGVJVSgiYSIsIG5ldyBWZXJzaW9uKDEsIDAsIDApLCBmYWxzZSk7Ci0KLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gYiA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJYi5zZXRJZCgiYiIpOwotCQliLnNldFZlcnNpb24obmV3IFZlcnNpb24oMSwgMCwgMCkpOwotCQliLnNldFVwZGF0ZURlc2NyaXB0b3IoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVVwZGF0ZURlc2NyaXB0b3IoImEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wKSIpLCBJVXBkYXRlRGVzY3JpcHRvci5OT1JNQUwsIG51bGwpKTsKLQotCQlDb2xsZWN0aW9uIGZyb207Ci0JCWZyb20gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZyb20uYWRkKGEpOwotCi0JCUNvbGxlY3Rpb24gdG87Ci0JCXRvID0gbmV3IEFycmF5TGlzdCgpOwotCQl0by5hZGQoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChiKSk7Ci0KLQkJZnJvbSA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG51bGwsIG51bGwpLmF0dGFjaENVcyhmcm9tKTsKLQkJdG8gPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihudWxsLCBudWxsKS5hdHRhY2hDVXModG8pOwotCQluZXcgT3BlcmF0aW9uR2VuZXJhdG9yKCkuZ2VuZXJhdGVPcGVyYXRpb24oZnJvbSwgdG8pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL09yYWNsZVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9PcmFjbGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NzQ2M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL09yYWNsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JRGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5SZXF1aXJlZENhcGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE9yYWNsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMjsKLQlJSW5zdGFsbGFibGVVbml0IGIxOwotCUlJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JSUluc3RhbGxhYmxlVW5pdCBkMTsKLQlJSW5zdGFsbGFibGVVbml0IGQyOwotCi0JSURpcmVjdG9yIGRpcmVjdG9yOwotCUlQcm9maWxlIHByb2ZpbGU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlcyA9IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQyIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIG51bGwpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgcmVxdWlyZXMsIHRydWUpOwotCi0JCXJlcXVpcmVzID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJEIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAzLjAuMCkiKSwgbnVsbCk7Ci0JCWMxID0gY3JlYXRlSVUoIkMiLCByZXF1aXJlcywgdHJ1ZSk7Ci0KLQkJZDEgPSBjcmVhdGVJVSgiRCIsIERFRkFVTFRfVkVSU0lPTiwgdHJ1ZSk7Ci0KLQkJcmVxdWlyZXMgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkQiLCBuZXcgVmVyc2lvblJhbmdlKCJbMi4wLjAsIDMuMC4wKSIpLCBudWxsKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIHJlcXVpcmVzLCB0cnVlKTsKLQotCQlkMiA9IGNyZWF0ZUlVKCJEIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIHRydWUpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYzEsIGQxLCBiMX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJZGlyZWN0b3IgPSBjcmVhdGVEaXJlY3RvcigpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxBMSgpIHsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCkuZ2V0U2V2ZXJpdHkoKSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2QyfSk7Ci0JCS8vCQlhc3NlcnRFcXVhbHMobmV3IE9yYWNsZSgpLmNhbkluc3RhbGwobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YjF9LCBwcm9maWxlLCBudWxsKSwgdHJ1ZSk7Ci0JCXJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtiMX0pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9PcmFjbGVUZXN0Mi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL09yYWNsZVRlc3QyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNmFhZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL09yYWNsZVRlc3QyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSURpcmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBPcmFjbGVUZXN0MiBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBhMjsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGMxOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBjMjsKLQotCUlEaXJlY3RvciBkaXJlY3RvcjsKLQlJUHJvZmlsZSBwcm9maWxlOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZXMgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wKSIpLCBudWxsKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIHJlcXVpcmVzLCB0cnVlKTsKLQotCQljMSA9IGNyZWF0ZUlVKCJDIiwgREVGQVVMVF9WRVJTSU9OLCB0cnVlKTsKLQotCQlyZXF1aXJlcyA9IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQyIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjAuMCwgMy4wLjApIiksIG51bGwpOwotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBkZXNjID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlkZXNjLnNldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKHJlcXVpcmVzKTsKLQkJZGVzYy5zZXRJZCgiQSIpOwotCQlkZXNjLnNldFZlcnNpb24obmV3IFZlcnNpb24oMiwgMCwgMCkpOwotCQlkZXNjLnNldFNpbmdsZXRvbih0cnVlKTsKLQkJZGVzYy5zZXRVcGRhdGVEZXNjcmlwdG9yKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVVcGRhdGVEZXNjcmlwdG9yKCJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjMuMCkiKSwgSVVwZGF0ZURlc2NyaXB0b3IuTk9STUFMLCBudWxsKSk7Ci0KLQkJYTIgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGRlc2MpOwotCi0JCWIxID0gY3JlYXRlSVUoIkIiLCBERUZBVUxUX1ZFUlNJT04sIHJlcXVpcmVzLCBOT19QUk9QRVJUSUVTLCB0cnVlKTsKLQotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBkZXNjMiA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJZGVzYzIuc2V0SWQoIkMiKTsKLQkJZGVzYzIuc2V0VmVyc2lvbihuZXcgVmVyc2lvbigyLCAwLCAwKSk7Ci0JCWRlc2MyLnNldFNpbmdsZXRvbih0cnVlKTsKLQkJZGVzYzIuc2V0VXBkYXRlRGVzY3JpcHRvcihNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVXBkYXRlRGVzY3JpcHRvcigiQyIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4zLjApIiksIElVcGRhdGVEZXNjcmlwdG9yLk5PUk1BTCwgbnVsbCkpOwotCQljMiA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoZGVzYzIpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYzF9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCWRpcmVjdG9yID0gY3JlYXRlRGlyZWN0b3IoKTsKLQotCX0KLQotCS8qIEknbSBub3Qgc3VyZSB3aGF0IHRoaXMgdGVzdCBzaG91bGQgbG9vayBsaWtlIG5vdwotCSAqCi0JIAotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQTEoKSB7Ci0JCWFzc2VydEVxdWFscyhkaXJlY3Rvci5pbnN0YWxsKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSwgcHJvZmlsZSwgbnVsbCkuZ2V0U2V2ZXJpdHkoKSwgSVN0YXR1cy5PSyk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2EyLCBjMiwgYjF9KTsKLQkJQ29sbGVjdGlvbiBicm9rZW5FbnRyeVBvaW50ID0gKENvbGxlY3Rpb24pIG5ldyBPcmFjbGUoKS5jYW5JbnN0YWxsKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2IxfSwgcHJvZmlsZSwgbnVsbCk7Ci0JCS8vCQlhc3NlcnROb3ROdWxsKGJyb2tlbkVudHJ5UG9pbnQuZ2V0UHJvcGVydHkoImVudHJ5UG9pbnQiKSk7Ci0KLQkJbmV3IE9yYWNsZSgpLmhhc1VwZGF0ZShhMSk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbihuZXcgT3JhY2xlKCkuY2FuSW5zdGFsbChuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtiMX0sIChJSW5zdGFsbGFibGVVbml0W10pIGJyb2tlbkVudHJ5UG9pbnQudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFticm9rZW5FbnRyeVBvaW50LnNpemUoKV0pLCBwcm9maWxlLCBudWxsKSk7Ci0JfQotCSAqLwotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxBMWJpcygpIHsKLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoInRlc3RJbnN0YWxsQTFiaXMuIiArIGdldE5hbWUoKSk7Ci0JCWRpcmVjdG9yID0gY3JlYXRlRGlyZWN0b3IoKTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBhMiwgYzEsIGMyLCBiMX0pOwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBudWxsKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvUGlja2VyVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1BpY2tlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlkODk1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvUGlja2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmRpcmVjdG9yLlBpY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBUZXN0aW5nIG9mIHRoZSB7QGxpbmsgUGlja2VyfSBjbGFzcy4KLSAqLwotcHVibGljIGNsYXNzIFBpY2tlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgdW5pdFZlcnNpb241OwotCXByaXZhdGUgUGlja2VyIHBpY2tlcjsKLQotCXB1YmxpYyBQaWNrZXJUZXN0KCkgewotCQlzdXBlcigiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgUGlja2VyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbig1LCAwLCAwKTsKLQotCQkvL2NyZWF0ZSBzb21lIHNhbXBsZSBJVXMgdG8gYmUgYXZhaWxhYmxlIGZvciB0aGUgcGlja2VyCi0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3ZpZGVzID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KCJ0ZXN0LmNhcGFiaWxpdHkiLCAidGVzdCIsIHZlcnNpb24pfTsKLQkJdW5pdFZlcnNpb241ID0gY3JlYXRlSVUoInJlcXVpcmVkIiwgdmVyc2lvbiwgcHJvdmlkZXMpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXRbXSB1bml0cyA9IG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3VuaXRWZXJzaW9uNX07Ci0JCXBpY2tlciA9IG5ldyBQaWNrZXIodW5pdHMsIG51bGwpOwotCi0JfQotCi0JLyoqCi0JICogVGVzdHMgcGlja2luZyBhbiBJVSB0aGF0IHJlcXVpcmVzIGEgY2FwYWJpbGl0eSwgYW5kIHRoZSBhdmFpbGFibGUKLQkgKiBwcm92aWRlZCBjYXBhYmlsaXR5IGlzIGFib3ZlIHRoZSByZXF1aXJlZCBjYXBhYmlsaXR5J3MgdmVyc2lvbiByYW5nZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRCZWxvd1ZlcnNpb25SYW5nZSgpIHsKLQotCQkvL2FuIElVIHdob3NlIHJlcXVpcmVkIGNhcGFiaWxpdHkgZmFsbHMgb3V0c2lkZSBhdmFpbGFibGUgcmFuZ2UKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZWQgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcygidGVzdC5jYXBhYmlsaXR5IiwgInRlc3QiLCBuZXcgVmVyc2lvblJhbmdlKCJbMi4wLDUuMCkiKSwgbnVsbCk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdFtdW10gcmVzdWx0ID0gcGlja2VyLmZpbmRJbnN0YWxsYWJsZVVuaXQobnVsbCwgbnVsbCwgcmVxdWlyZWQsIGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAwLCByZXN1bHRbMF0ubGVuZ3RoICsgcmVzdWx0WzFdLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgcGlja2luZyBhbiBJVSB0aGF0IHJlcXVpcmVzIGEgY2FwYWJpbGl0eSwgYW5kIHRoZSBhdmFpbGFibGUKLQkgKiBwcm92aWRlZCBjYXBhYmlsaXR5IGlzIGFib3ZlIHRoZSByZXF1aXJlZCBjYXBhYmlsaXR5J3MgdmVyc2lvbiByYW5nZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRXaXRoaW5WZXJzaW9uUmFuZ2UoKSB7Ci0KLQkJLy9pbiBtaWRkbGUgb2YgcmFuZ2UKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZWQgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcygidGVzdC5jYXBhYmlsaXR5IiwgInRlc3QiLCBuZXcgVmVyc2lvblJhbmdlKCJbMi4wLDYuMCkiKSwgbnVsbCk7Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSByZXN1bHQgPSBwaWNrZXIuZmluZEluc3RhbGxhYmxlVW5pdChudWxsLCBudWxsLCByZXF1aXJlZCwgZmFsc2UpWzFdOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDEsIHJlc3VsdC5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIHVuaXRWZXJzaW9uNSwgcmVzdWx0WzBdKTsKLQotCQkvL29uIGxvd2VyIGJvdW5kCi0JCXJlcXVpcmVkID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoInRlc3QuY2FwYWJpbGl0eSIsICJ0ZXN0IiwgbmV3IFZlcnNpb25SYW5nZSgiWzUuMCw2LjApIiksIG51bGwpOwotCQlyZXN1bHQgPSBwaWNrZXIuZmluZEluc3RhbGxhYmxlVW5pdChudWxsLCBudWxsLCByZXF1aXJlZCwgZmFsc2UpWzFdOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDEsIHJlc3VsdC5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIHVuaXRWZXJzaW9uNSwgcmVzdWx0WzBdKTsKLQotCQkvL29uIHVwcGVyIGJvdW5kCi0JCXJlcXVpcmVkID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoInRlc3QuY2FwYWJpbGl0eSIsICJ0ZXN0IiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMCw1LjBdIiksIG51bGwpOwotCQlyZXN1bHQgPSBwaWNrZXIuZmluZEluc3RhbGxhYmxlVW5pdChudWxsLCBudWxsLCByZXF1aXJlZCwgZmFsc2UpWzFdOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDEsIHJlc3VsdC5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsIHVuaXRWZXJzaW9uNSwgcmVzdWx0WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBwaWNraW5nIGFuIElVIHRoYXQgcmVxdWlyZXMgYSBjYXBhYmlsaXR5LCBhbmQgdGhlIGF2YWlsYWJsZQotCSAqIHByb3ZpZGVkIGNhcGFiaWxpdHkgaXMgYWJvdmUgdGhlIHJlcXVpcmVkIGNhcGFiaWxpdHkncyB2ZXJzaW9uIHJhbmdlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZEFib3ZlVmVyc2lvblJhbmdlKCkgewotCi0JCS8vYW4gSVUgd2hvc2UgcmVxdWlyZWQgY2FwYWJpbGl0eSBmYWxscyBvdXRzaWRlIGF2YWlsYWJsZSByYW5nZQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZCA9IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKCJ0ZXN0LmNhcGFiaWxpdHkiLCAidGVzdCIsIG5ldyBWZXJzaW9uUmFuZ2UoIls1LjEsNi4wKSIpLCBudWxsKTsKLQotCQlJSW5zdGFsbGFibGVVbml0W11bXSByZXN1bHQgPSBwaWNrZXIuZmluZEluc3RhbGxhYmxlVW5pdChudWxsLCBudWxsLCByZXF1aXJlZCwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDAsIHJlc3VsdFswXS5sZW5ndGggKyByZXN1bHRbMV0ubGVuZ3RoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9SZWNvbW1lbmRhdGlvblRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9SZWNvbW1lbmRhdGlvblRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzNWZkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvUmVjb21tZW5kYXRpb25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3I7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFJlY29tbWVuZGF0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JLy90ZXN0IG5hbWUgZGVwZW5kZW5jeSBvdmVyCi0JLy90ZXN0Ci0JLy9jaGVjayB0aGF0IHRoZSBwaWNrZXIgaXMgcmV0dXJuaW5nIHNvbWV0aGluZyBpbiB0aGUgcmFuZ2UKLQlwdWJsaWMgdm9pZCB0ZXN0UmVjb21tZW5kYXRpb24oKSB7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBhcHBseU9uLCBuZXdWYWx1ZTsKLQkJYXBwbHlPbiA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoIm5hbWVzcGFjZSIsICJuYW1lIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMCwgMi4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQluZXdWYWx1ZSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoIm5hbWVzcGFjZSIsICJuYW1lIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMSwgMi4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlSZWNvbW1lbmRhdGlvbiByMSA9IG5ldyBSZWNvbW1lbmRhdGlvbihhcHBseU9uLCBuZXdWYWx1ZSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGdvb2RNYXRjaCA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoIm5hbWVzcGFjZSIsICJuYW1lIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMCwgMi4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHModHJ1ZSwgcjEubWF0Y2hlcyhnb29kTWF0Y2gpKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHkgYmFkTmFtZXNwYWNlID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgiYmFkTmFtZXNwYWNlIiwgIm5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCWFzc2VydEVxdWFscyhmYWxzZSwgcjEubWF0Y2hlcyhiYWROYW1lc3BhY2UpKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHkgYmFkTmFtZSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoIm5hbWVzcGFjZSIsICJiYWROYW1lIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMCwgMi4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMoZmFsc2UsIHIxLm1hdGNoZXMoYmFkTmFtZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQaWNrZXIoKSB7Ci0JCS8vVGhlIElVcyB3ZSB3aWxsIHBpY2sgZnJvbQotCQlJSW5zdGFsbGFibGVVbml0IGl1MSA9IGNyZWF0ZUlVKCJpdTEiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUyID0gY3JlYXRlSVUoIml1MiIsIG5ldyBWZXJzaW9uKDQsIDAsIDApKTsKLQotCQkvL1RoZSByZWNvbW1lbmRhdGlvbnMgdG8gYmUgdXNlZAotCQlSZXF1aXJlZENhcGFiaWxpdHkgYXBwbHlPbiwgbmV3VmFsdWU7Ci0JCWFwcGx5T24gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiaXUxIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMCwgMi4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQluZXdWYWx1ZSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJpdTEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4xLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCVJlY29tbWVuZGF0aW9uIHIxID0gbmV3IFJlY29tbWVuZGF0aW9uKGFwcGx5T24sIG5ld1ZhbHVlKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHkgYXBwbHlPbjIsIG5ld1ZhbHVlMjsKLQkJYXBwbHlPbjIgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiaXUyIiwgbmV3IFZlcnNpb25SYW5nZSgiWzQuMiwgNS4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQluZXdWYWx1ZTIgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiaXUyIiwgbmV3IFZlcnNpb25SYW5nZSgiWzQuMCwgNS4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlSZWNvbW1lbmRhdGlvbiByMiA9IG5ldyBSZWNvbW1lbmRhdGlvbihhcHBseU9uMiwgbmV3VmFsdWUyKTsKLQkJU2V0IHJlY29tbWVuZGF0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXJlY29tbWVuZGF0aW9ucy5hZGQocjEpOwotCQlyZWNvbW1lbmRhdGlvbnMuYWRkKHIyKTsKLQotCQlQaWNrZXIgcCA9IG5ldyBQaWNrZXIobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7aXUxLCBpdTJ9LCBudWxsKTsKLQkJSUluc3RhbGxhYmxlVW5pdFtdW10gbWF0Y2hlcyA9IHAuZmluZEluc3RhbGxhYmxlVW5pdChudWxsLCBudWxsLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJpdTEiLCBudWxsLCBudWxsLCBmYWxzZSwgZmFsc2UpfSwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMobWF0Y2hlc1sxXVswXSwgaXUxKTsKLQotCQlQaWNrZXIgcDEgPSBuZXcgUGlja2VyKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2l1MSwgaXUyfSwgbmV3IFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvcihyZWNvbW1lbmRhdGlvbnMpKTsKLQkJbWF0Y2hlcyA9IHAxLmZpbmRJbnN0YWxsYWJsZVVuaXQobnVsbCwgbnVsbCwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiaXUxIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMCwgMi4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpfSwgZmFsc2UpOwotCQlhc3NlcnRFcXVhbHMobWF0Y2hlc1swXS5sZW5ndGgsIDApOwotCQlhc3NlcnRFcXVhbHMobWF0Y2hlc1sxXS5sZW5ndGgsIDApOwotCi0JCW1hdGNoZXMgPSBwMS5maW5kSW5zdGFsbGFibGVVbml0KG51bGwsIG51bGwsIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIml1MSIsIG5ldyBWZXJzaW9uUmFuZ2UoIls0LjIsIDUuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlKX0sIGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKG1hdGNoZXNbMF0ubGVuZ3RoLCAwKTsKLQkJYXNzZXJ0RXF1YWxzKG1hdGNoZXNbMV0ubGVuZ3RoLCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0V2lkZW5pbmdSYW5nZXMoKSB7Ci0JCS8vVGhlIElVcyB3ZSB3aWxsIHBpY2sgZnJvbQotCQlJSW5zdGFsbGFibGVVbml0IGl1MSA9IGNyZWF0ZUlVKCJpdTEiLCBuZXcgVmVyc2lvbig0LCAwLCAwKSk7Ci0KLQkJLy9IZXJlIHdlIGFkZCByZWNvbW1lbmRhdGlvbiB0aGF0IHdpZGVuIHRoZSByYW5nZSBvZiB0aGUgYnVuZGxlIHdlIGFyZSBsb29raW5nIGZvcgotCQlSZXF1aXJlZENhcGFiaWxpdHkgYXBwbHlPbjIsIG5ld1ZhbHVlMjsKLQkJYXBwbHlPbjIgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiaXUxIiwgbmV3IFZlcnNpb25SYW5nZSgiWzQuMiwgNS4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQluZXdWYWx1ZTIgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiaXUxIiwgbmV3IFZlcnNpb25SYW5nZSgiWzQuMCwgNS4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlSZWNvbW1lbmRhdGlvbiByMiA9IG5ldyBSZWNvbW1lbmRhdGlvbihhcHBseU9uMiwgbmV3VmFsdWUyKTsKLQkJU2V0IHJlY29tbWVuZGF0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXJlY29tbWVuZGF0aW9ucy5hZGQocjIpOwotCi0JCS8vQ2hlY2sgd2l0aG91dCB0aGUgcmVjb21tZW5kYXRpb25zCi0JCVBpY2tlciBwMiA9IG5ldyBQaWNrZXIobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7aXUxfSwgbnVsbCk7Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXVtdIG1hdGNoZXMgPSBwMi5maW5kSW5zdGFsbGFibGVVbml0KG51bGwsIG51bGwsIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIml1MSIsIG5ldyBWZXJzaW9uUmFuZ2UoIls0LjAsIDUuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlKX0sIGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKG1hdGNoZXNbMV0ubGVuZ3RoLCAxKTsKLQotCQkvL0NoZWNrIHRoZSB3aWRlbmluZyB3b3JrcwotCQlQaWNrZXIgcDEgPSBuZXcgUGlja2VyKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2l1MX0sIG5ldyBSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3IocmVjb21tZW5kYXRpb25zKSk7Ci0JCW1hdGNoZXMgPSBwMS5maW5kSW5zdGFsbGFibGVVbml0KG51bGwsIG51bGwsIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIml1MSIsIG5ldyBWZXJzaW9uUmFuZ2UoIls0LjIsIDUuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlKX0sIGZhbHNlKTsKLQkJYXNzZXJ0RXF1YWxzKG1hdGNoZXNbMV0ubGVuZ3RoLCAxKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZWNvbW1lbmRhdGlvbkRlc2NyaXB0b3JNZXJnZSgpIHsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGFwcGx5T24xLCBuZXdWYWx1ZTE7Ci0JCWFwcGx5T24xID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgibmFtZXNwYWNlIiwgIm5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCW5ld1ZhbHVlMSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoIm5hbWVzcGFjZSIsICJuYW1lIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMSwgMi4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlSZWNvbW1lbmRhdGlvbiByMSA9IG5ldyBSZWNvbW1lbmRhdGlvbihhcHBseU9uMSwgbmV3VmFsdWUxKTsKLQkJU2V0IGxpc3QxID0gbmV3IEhhc2hTZXQoKTsKLQkJbGlzdDEuYWRkKHIxKTsKLQkJUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yIGRlc2MxID0gbmV3IFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvcihsaXN0MSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGFwcGx5T24yLCBuZXdWYWx1ZTI7Ci0JCWFwcGx5T24yID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgibmFtZXNwYWNlIiwgIm5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCW5ld1ZhbHVlMiA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoIm5hbWVzcGFjZSIsICJuYW1lIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMywgMi4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlSZWNvbW1lbmRhdGlvbiByMiA9IG5ldyBSZWNvbW1lbmRhdGlvbihhcHBseU9uMiwgbmV3VmFsdWUyKTsKLQkJU2V0IGxpc3QyID0gbmV3IEhhc2hTZXQoKTsKLQkJbGlzdDIuYWRkKHIyKTsKLQkJUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yIGRlc2MyID0gbmV3IFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvcihsaXN0Mik7Ci0KLQkJLy9XZSB0ZXN0IHRoYXQgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2Ugd29ya2VkLgotCQlhc3NlcnRFcXVhbHMoU3RhdHVzLk9LX1NUQVRVUywgZGVzYzEubWVyZ2UoZGVzYzIpKTsKLQkJYXNzZXJ0RXF1YWxzKHIyLCBkZXNjMS5maW5kUmVjb21tZW5kYXRpb24oTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgibmFtZXNwYWNlIiwgIm5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVjb21tZW5kYXRpb25EZXNjcmlwdG9yTWVyZ2VDb25mbGljdCgpIHsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGFwcGx5T24xLCBuZXdWYWx1ZTE7Ci0JCWFwcGx5T24xID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgibmFtZXNwYWNlIiwgIm5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCW5ld1ZhbHVlMSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoIm5hbWVzcGFjZSIsICJuYW1lIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMSwgMi4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlSZWNvbW1lbmRhdGlvbiByMSA9IG5ldyBSZWNvbW1lbmRhdGlvbihhcHBseU9uMSwgbmV3VmFsdWUxKTsKLQkJU2V0IGxpc3QxID0gbmV3IEhhc2hTZXQoKTsKLQkJbGlzdDEuYWRkKHIxKTsKLQkJUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yIGRlc2MxID0gbmV3IFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvcihsaXN0MSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGFwcGx5T24yLCBuZXdWYWx1ZTI7Ci0JCWFwcGx5T24yID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgibmFtZXNwYWNlIiwgIm5hbWUiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLCAyLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCW5ld1ZhbHVlMiA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoIm5hbWVzcGFjZSIsICJuYW1lIiwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMSwgMy4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlSZWNvbW1lbmRhdGlvbiByMiA9IG5ldyBSZWNvbW1lbmRhdGlvbihhcHBseU9uMiwgbmV3VmFsdWUyKTsKLQkJU2V0IGxpc3QyID0gbmV3IEhhc2hTZXQoKTsKLQkJbGlzdDIuYWRkKHIyKTsKLQkJUmVjb21tZW5kYXRpb25EZXNjcmlwdG9yIGRlc2MyID0gbmV3IFJlY29tbWVuZGF0aW9uRGVzY3JpcHRvcihsaXN0Mik7Ci0KLQkJLy9XZSB0ZXN0IHRoYXQgdGhlIHJlc3VsdCBvZiB0aGUgbWVyZ2Ugd29ya2VkLgotCQlhc3NlcnRFcXVhbHMoU3RhdHVzLklORk8sIGRlc2MxLm1lcmdlKGRlc2MyKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmFuZ2VJbnRlcnNlY3Rpb24oKSB7Ci0JCVJlY29tbWVuZGF0aW9uIHJlYyA9IG5ldyBSZWNvbW1lbmRhdGlvbihudWxsLCBudWxsKTsKLQkJdHJ5IHsKLQkJCU1ldGhvZCBtID0gcmVjLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoImludGVyc2VjdCIsIG5ldyBDbGFzc1tdIHtWZXJzaW9uUmFuZ2UuY2xhc3MsIFZlcnNpb25SYW5nZS5jbGFzc30pOwotCQkJbS5zZXRBY2Nlc3NpYmxlKHRydWUpOwotCQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIG0uaW52b2tlKHJlYywgbmV3IE9iamVjdFtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wKSIpLCBuZXcgVmVyc2lvblJhbmdlKCJbMC4xLjAsIDMuMC4wXSIpfSkpOwotCi0JCQlhc3NlcnRFcXVhbHMobmV3IFZlcnNpb25SYW5nZSgiWzEuMS4wLCAxLjkuMF0iKSwgbS5pbnZva2UocmVjLCBuZXcgT2JqZWN0W10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjEuMCwgMS45LjBdIil9KSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3IFZlcnNpb25SYW5nZSgiWzEuMS4wLCAyLjAuMCkiKSwgbS5pbnZva2UocmVjLCBuZXcgT2JqZWN0W10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjEuMCwgMi4xLjBdIil9KSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjMuMF0iKSwgbS5pbnZva2UocmVjLCBuZXcgT2JqZWN0W10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIG5ldyBWZXJzaW9uUmFuZ2UoIlswLjkuMCwgMS4zLjBdIil9KSk7Ci0JCQlhc3NlcnRFcXVhbHMobnVsbCwgbS5pbnZva2UocmVjLCBuZXcgT2JqZWN0W10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIG5ldyBWZXJzaW9uUmFuZ2UoIlszLjAuMCwgNC4wLjBdIil9KSk7Ci0KLQkJCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvblJhbmdlKCIoMS4wLjAsIDIuMC4wXSIpLCBtLmludm9rZShyZWMsIG5ldyBPYmplY3RbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMF0iKSwgbmV3IFZlcnNpb25SYW5nZSgiKDEuMC4wLCAyLjEuMF0iKX0pKTsKLQkJCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvblJhbmdlKCIoMS4wLjAsIDIuMC4wXSIpLCBtLmludm9rZShyZWMsIG5ldyBPYmplY3RbXSB7bmV3IFZlcnNpb25SYW5nZSgiKDEuMC4wLCAyLjAuMF0iKSwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjEuMF0iKX0pKTsKLQotCQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIG0uaW52b2tlKHJlYywgbmV3IE9iamVjdFtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wKSIpLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wXSIpfSkpOwotCQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIG0uaW52b2tlKHJlYywgbmV3IE9iamVjdFtdIHtuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wXSIpLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wKSIpfSkpOwotCi0JCQlhc3NlcnRFcXVhbHMobmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMF0iKSwgbS5pbnZva2UocmVjLCBuZXcgT2JqZWN0W10ge25ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjBdIiksIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjBdIil9KSk7Ci0JCQlhc3NlcnRFcXVhbHMobmV3IFZlcnNpb25SYW5nZSgiKDEuMC4wLCAyLjAuMCkiKSwgbS5pbnZva2UocmVjLCBuZXcgT2JqZWN0W10ge25ldyBWZXJzaW9uUmFuZ2UoIigxLjAuMCwgMi4wLjApIiksIG5ldyBWZXJzaW9uUmFuZ2UoIigxLjAuMCwgMi4wLjApIil9KSk7Ci0KLQkJCWFzc2VydEVxdWFscyhudWxsLCBtLmludm9rZShyZWMsIG5ldyBPYmplY3RbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMCkiKSwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAzLjAuMCkiKX0pKTsKLQkJCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvblJhbmdlKCJbMi4wLjAsIDIuMC4wXSIpLCBtLmludm9rZShyZWMsIG5ldyBPYmplY3RbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMF0iKSwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAzLjAuMCkiKX0pKTsKLQkJCWFzc2VydEVxdWFscyhudWxsLCBtLmludm9rZShyZWMsIG5ldyBPYmplY3RbXSB7bmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMF0iKSwgbmV3IFZlcnNpb25SYW5nZSgiKDIuMC4wLCAzLjAuMCkiKX0pKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIlVzYWdlIG9mIHJlZmxlY3Rpb24gZmFpbGVkIik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvUmVwbGFjZVBsYW5UZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvUmVwbGFjZVBsYW5UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZmIzZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1JlcGxhY2VQbGFuVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuUmVxdWlyZWRDYXBhYmlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogVGVzdHMge0BsaW5rIElQbGFubmVyI2dldFByb3Zpc2lvbmluZ1BsYW4oUHJvZmlsZUNoYW5nZVJlcXVlc3QsIFByb3Zpc2lvbmluZ0NvbnRleHQsIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKX0KLSAqIGludm9sdmluZyByZXBsYWNpbmcgYW4gSVUgd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uLgotICovCi1wdWJsaWMgY2xhc3MgUmVwbGFjZVBsYW5UZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGYxOwotCUlJbnN0YWxsYWJsZVVuaXQgZjFfMTsKLQlJSW5zdGFsbGFibGVVbml0IGYxXzQ7Ci0JSUluc3RhbGxhYmxlVW5pdCBmcmFnMTsKLQlJSW5zdGFsbGFibGVVbml0IGZyYWcxXzE7Ci0JSUluc3RhbGxhYmxlVW5pdCBmcmFnMV80OwotCUlJbnN0YWxsYWJsZVVuaXQgZmE7Ci0JSUluc3RhbGxhYmxlVW5pdCBmYXA7Ci0JSURpcmVjdG9yIGRpcmVjdG9yOwotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vYmFzZSBJVSB0aGF0IG90aGVycyByZXF1aXJlCi0JCWYxID0gY3JlYXRlSVUoImYxIiwgREVGQVVMVF9WRVJTSU9OLCB0cnVlKTsKLQkJZjFfMSA9IGNyZWF0ZUlVKCJmMSIsIG5ldyBWZXJzaW9uKDEsIDEsIDApLCB0cnVlKTsKLQkJZjFfNCA9IGNyZWF0ZUlVKCJmMSIsIG5ldyBWZXJzaW9uKDEsIDQsIDApLCB0cnVlKTsKLQotCQkvL2ZyYWdtZW50cyBvZiBiYXNlIElVCi0JCWZyYWcxID0gY3JlYXRlSVVGcmFnbWVudChmMSwgImZyYWcxIiwgZjEuZ2V0VmVyc2lvbigpKTsKLQkJZnJhZzFfMSA9IGNyZWF0ZUlVRnJhZ21lbnQoZjEsICJmcmFnMSIsIGYxXzEuZ2V0VmVyc2lvbigpKTsKLQkJZnJhZzFfNCA9IGNyZWF0ZUlVRnJhZ21lbnQoZjEsICJmcmFnMSIsIGYxXzQuZ2V0VmVyc2lvbigpKTsKLQotCQkvL0lVcyB0aGF0IHJlcXVpcmUgYmFzZSBJVQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlcyA9IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiZjEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMy4wKSIpLCBudWxsKTsKLQkJZmEgPSBjcmVhdGVJVSgiZmEiLCByZXF1aXJlcywgZmFsc2UpOwotCQlyZXF1aXJlcyA9IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiZjEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuNC4wKSIpLCBudWxsKTsKLQkJZmFwID0gY3JlYXRlSVUoImZhIiwgbmV3IFZlcnNpb24oMSwgMSwgMCksIHJlcXVpcmVzLCBOT19QUk9QRVJUSUVTLCBmYWxzZSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxLCBmYSwgZnJhZzF9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCWRpcmVjdG9yID0gY3JlYXRlRGlyZWN0b3IoKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZmEsIGZyYWcxfSk7Ci0JCWRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBudWxsKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZjFfMSwgZjFfNCwgZnJhZzFfMSwgZnJhZzFfNH0pOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RTaW1wbGVSZXBsYWNlKCkgewotCQlJSW5zdGFsbGFibGVVbml0W10gb2xkVW5pdHMgPSBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmYX07Ci0JCUlJbnN0YWxsYWJsZVVuaXRbXSBuZXdVbml0cyA9IG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ZhcH07Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QucmVtb3ZlSW5zdGFsbGFibGVVbml0cyhvbGRVbml0cyk7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyhuZXdVbml0cyk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXF1ZXN0LCBuZXcgUHJvdmlzaW9uaW5nQ29udGV4dCgpLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgcGxhbi5nZXRTdGF0dXMoKS5pc09LKCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIjEuMSIsIHByb2ZpbGUsIG9sZFVuaXRzKTsKLQkJSVN0YXR1cyByZXN1bHQgPSBjcmVhdGVFbmdpbmUoKS5wZXJmb3JtKHByb2ZpbGUsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbi5nZXRPcGVyYW5kcygpLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgcmVzdWx0LmlzT0soKSk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiMS4zIiwgcHJvZmlsZSwgbmV3VW5pdHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlRnJhZ21lbnQoKSB7Ci0JCS8vVE9ETyBpdCBpcyBzdHJhbmdlIHRoYXQgdGhpcyBzdWNjZWVkcywgc2luY2UgZnJhZzFfNCBhbmQgZmEgY2Fubm90IGNvLWV4aXN0Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QucmVtb3ZlSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmcmFnMX0pOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZnJhZzFfNH0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4gPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxdWVzdCwgbmV3IFByb3Zpc2lvbmluZ0NvbnRleHQoKSwgbnVsbCk7Ci0JCWFzc2VydFRydWUoIjEuMCIsIHBsYW4uZ2V0U3RhdHVzKCkuaXNPSygpKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9SZXNvbHV0aW9uSGVscGVyVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1Jlc29sdXRpb25IZWxwZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNzllNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1Jlc29sdXRpb25IZWxwZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVzb2x1dGlvbi5SZXNvbHV0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVzb2x1dGlvbi5VbnNhdGlzZmllZENhcGFiaWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8qKgotICogVGVzdHMgZm9yIHtAbGluayBSZXNvbHV0aW9uSGVscGVyfS4KLSAqLwotcHVibGljIGNsYXNzIFJlc29sdXRpb25IZWxwZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX0tFWSA9ICJvc2dpLm9zIjsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJcmV0dXJuIG5ldyBUZXN0U3VpdGUoUmVzb2x1dGlvbkhlbHBlclRlc3QuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBSZXNvbHV0aW9uSGVscGVyVGVzdCgpIHsKLQkJc3VwZXIoIiIpOwotCX0KLQotCXB1YmxpYyBSZXNvbHV0aW9uSGVscGVyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyByZXNvbHZpbmcgYW4gSVUgdGhhdCByZXF1aXJlcyBhIGNhcGFiaWxpdHksIGFuZCB0aGUgYXZhaWxhYmxlCi0JICogcHJvdmlkZWQgY2FwYWJpbGl0eSBpcyBhYm92ZSB0aGUgcmVxdWlyZWQgY2FwYWJpbGl0eSdzIHZlcnNpb24gcmFuZ2UuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlcGVuZGVuY3lBYm92ZVZlcnNpb25SYW5nZSgpIHsKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24oNSwgMCwgMCk7Ci0KLQkJLy9UaGUgSVUgdGhhdCBleHBvcnRzIHRoZSBjYXBhYmlsaXR5Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3ZpZGVzID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KCJ0ZXN0LmNhcGFiaWxpdHkiLCAidGVzdCIsIHZlcnNpb24pfTsKLQkJSUluc3RhbGxhYmxlVW5pdCByZXF1aXJlZCA9IGNyZWF0ZUlVKCJyZXF1aXJlZCIsIHZlcnNpb24sIHByb3ZpZGVzKTsKLQotCQkvL2FuIElVIHdob3NlIHJlcXVpcmVkIGNhcGFiaWxpdHkgZmFsbHMgb3V0c2lkZSBhdmFpbGFibGUgcmFuZ2UKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZXMgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcygidGVzdC5jYXBhYmlsaXR5IiwgInRlc3QiLCBuZXcgVmVyc2lvblJhbmdlKCJbMi4wLDUuMCkiKSwgbnVsbCk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsID0gY3JlYXRlSVUoIm1hdGNoIiwgdmVyc2lvbiwgcmVxdWlyZXMpOwotCi0JCVJlc29sdXRpb25IZWxwZXIgcmggPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihudWxsLCBudWxsKTsKLQkJSGFzaFNldCBpbnN0YWxsU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJaW5zdGFsbFNldC5hZGQodG9JbnN0YWxsKTsKLQkJSGFzaFNldCBhdmFpbGFibGUgPSBuZXcgSGFzaFNldCgpOwotCQlhdmFpbGFibGUuYWRkKHJlcXVpcmVkKTsKLQkJVW5zYXRpc2ZpZWRDYXBhYmlsaXR5W10gdW5zYXRpc2ZpZWQgPSByaC5pbnN0YWxsKGluc3RhbGxTZXQsIGF2YWlsYWJsZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAxLCB1bnNhdGlzZmllZC5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsICJtYXRjaCIsIHVuc2F0aXNmaWVkWzBdLmdldFVuc2F0aXNmaWVkVW5pdCgpLmdldElkKCkpOwotCQlSZXF1aXJlZENhcGFiaWxpdHkgY2FwYWJpbGl0eSA9IHVuc2F0aXNmaWVkWzBdLmdldFJlcXVpcmVkQ2FwYWJpbGl0eSgpOwotCQlhc3NlcnRFcXVhbHMoIjEuNCIsICJ0ZXN0LmNhcGFiaWxpdHkiLCBjYXBhYmlsaXR5LmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjUiLCAidGVzdCIsIGNhcGFiaWxpdHkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyByZXNvbHZpbmcgYW4gSVUgdGhhdCByZXF1aXJlcyBhIGNhcGFiaWxpdHksIGFuZCB0aGUgYXZhaWxhYmxlCi0JICogcHJvdmlkZWQgY2FwYWJpbGl0eSBpcyBiZWxvdyB0aGUgcmVxdWlyZWQgY2FwYWJpbGl0eSdzIHZlcnNpb24gcmFuZ2UuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdERlcGVuZGVuY3lCZWxvd1ZlcnNpb25SYW5nZSgpIHsKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24oMiwgMCwgMCk7Ci0KLQkJLy9UaGUgSVUgdGhhdCBleHBvcnRzIHRoZSBjYXBhYmlsaXR5Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3ZpZGVzID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KCJ0ZXN0LmNhcGFiaWxpdHkiLCAidGVzdCIsIHZlcnNpb24pfTsKLQkJSUluc3RhbGxhYmxlVW5pdCByZXF1aXJlZCA9IGNyZWF0ZUlVKCJyZXF1aXJlZCIsIHZlcnNpb24sIHByb3ZpZGVzKTsKLQotCQkvL2FuIElVIHdob3NlIHJlcXVpcmVkIGNhcGFiaWxpdHkgZmFsbHMgb3V0c2lkZSBhdmFpbGFibGUgcmFuZ2UKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZXMgPSBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcygidGVzdC5jYXBhYmlsaXR5IiwgInRlc3QiLCBuZXcgVmVyc2lvblJhbmdlKCIoMi4wLDMuMCkiKSwgbnVsbCk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsID0gY3JlYXRlSVUoIm1hdGNoIiwgdmVyc2lvbiwgcmVxdWlyZXMpOwotCi0JCVJlc29sdXRpb25IZWxwZXIgcmggPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihudWxsLCBudWxsKTsKLQkJSGFzaFNldCBpbnN0YWxsU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJaW5zdGFsbFNldC5hZGQodG9JbnN0YWxsKTsKLQkJSGFzaFNldCBhdmFpbGFibGUgPSBuZXcgSGFzaFNldCgpOwotCQlhdmFpbGFibGUuYWRkKHJlcXVpcmVkKTsKLQkJVW5zYXRpc2ZpZWRDYXBhYmlsaXR5W10gdW5zYXRpc2ZpZWQgPSByaC5pbnN0YWxsKGluc3RhbGxTZXQsIGF2YWlsYWJsZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAxLCB1bnNhdGlzZmllZC5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjEuMSIsICJtYXRjaCIsIHVuc2F0aXNmaWVkWzBdLmdldFVuc2F0aXNmaWVkVW5pdCgpLmdldElkKCkpOwotCQlSZXF1aXJlZENhcGFiaWxpdHkgY2FwYWJpbGl0eSA9IHVuc2F0aXNmaWVkWzBdLmdldFJlcXVpcmVkQ2FwYWJpbGl0eSgpOwotCQlhc3NlcnRFcXVhbHMoIjEuNCIsICJ0ZXN0LmNhcGFiaWxpdHkiLCBjYXBhYmlsaXR5LmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjUiLCAidGVzdCIsIGNhcGFiaWxpdHkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVwZW5kZW5jeVdpdGhQbGF0Zm9ybUZpbHRlcigpIHsKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24oMSwgMCwgMCk7Ci0KLQkJLy9UaGUgSVUgdGhhdCBleHBvcnRzIHRoZSBjYXBhYmlsaXR5Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3ZpZGVzID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KCJ0ZXN0LmNhcGFiaWxpdHkiLCAidGVzdCIsIHZlcnNpb24pfTsKLQkJSUluc3RhbGxhYmxlVW5pdCByZXF1aXJlZCA9IGNyZWF0ZUlVKCJyZXF1aXJlZCIsIHZlcnNpb24sIGNyZWF0ZUZpbHRlcihGSUxURVJfS0VZLCAid2luMzIiKSwgcHJvdmlkZXMpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVzID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoInRlc3QuY2FwYWJpbGl0eSIsICJ0ZXN0IiwgQU5ZX1ZFUlNJT04sIG51bGwpOwotCQlJSW5zdGFsbGFibGVVbml0IHRvSW5zdGFsbCA9IGNyZWF0ZUlVKCJ0b0luc3RhbGwiLCB2ZXJzaW9uLCByZXF1aXJlcyk7Ci0KLQkJLy9zZXR1cCBjb250ZXh0IHNvIHRoYXQgcGxhdGZvcm0gZmlsdGVyIHdpbGwgc2F0aXNmeSBkZXBlbmRlbmN5Ci0JCUhhc2h0YWJsZSBjb250ZXh0ID0gbmV3IEhhc2h0YWJsZSgpOwotCQljb250ZXh0LnB1dChGSUxURVJfS0VZLCAid2luMzIiKTsKLQkJUmVzb2x1dGlvbkhlbHBlciByaCA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKGNvbnRleHQsIG51bGwpOwotCQlIYXNoU2V0IGluc3RhbGxTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlpbnN0YWxsU2V0LmFkZCh0b0luc3RhbGwpOwotCQlIYXNoU2V0IGF2YWlsYWJsZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCWF2YWlsYWJsZS5hZGQocmVxdWlyZWQpOwotCQlVbnNhdGlzZmllZENhcGFiaWxpdHlbXSB1bnNhdGlzZmllZCA9IHJoLmluc3RhbGwoaW5zdGFsbFNldCwgYXZhaWxhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAwLCB1bnNhdGlzZmllZC5sZW5ndGgpOwotCi0JCS8vbm93IHRyeSB3aXRoIGEgbnVsbCBldmFsdWF0aW9uIGNvbnRleHQKLQkJcmggPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihudWxsLCBudWxsKTsKLQkJdW5zYXRpc2ZpZWQgPSByaC5pbnN0YWxsKGluc3RhbGxTZXQsIGF2YWlsYWJsZSk7Ci0JCWFzc2VydEVxdWFscygiMS4xIiwgMSwgdW5zYXRpc2ZpZWQubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjIiLCAidG9JbnN0YWxsIiwgdW5zYXRpc2ZpZWRbMF0uZ2V0VW5zYXRpc2ZpZWRVbml0KCkuZ2V0SWQoKSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5ID0gdW5zYXRpc2ZpZWRbMF0uZ2V0UmVxdWlyZWRDYXBhYmlsaXR5KCk7Ci0JCWFzc2VydEVxdWFscygiMS4zIiwgInRlc3QuY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHkuZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIjEuNCIsICJ0ZXN0IiwgY2FwYWJpbGl0eS5nZXROYW1lKCkpOwotCi0JCS8vbm93IHVzZSBhIGNvbnRleHQgd2hlcmUgcGxhdGZvcm0gZmlsdGVyIHdpbGwgbm90IGJlIHNhdGlzZmllZAotCQljb250ZXh0LnB1dChGSUxURVJfS0VZLCAibm9tYXRjaCIpOwotCQlyaCA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKGNvbnRleHQsIG51bGwpOwotCQl1bnNhdGlzZmllZCA9IHJoLmluc3RhbGwoaW5zdGFsbFNldCwgYXZhaWxhYmxlKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjEiLCAxLCB1bnNhdGlzZmllZC5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjIuMiIsICJ0b0luc3RhbGwiLCB1bnNhdGlzZmllZFswXS5nZXRVbnNhdGlzZmllZFVuaXQoKS5nZXRJZCgpKTsKLQkJY2FwYWJpbGl0eSA9IHVuc2F0aXNmaWVkWzBdLmdldFJlcXVpcmVkQ2FwYWJpbGl0eSgpOwotCQlhc3NlcnRFcXVhbHMoIjIuMyIsICJ0ZXN0LmNhcGFiaWxpdHkiLCBjYXBhYmlsaXR5LmdldE5hbWVzcGFjZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjQiLCAidGVzdCIsIGNhcGFiaWxpdHkuZ2V0TmFtZSgpKTsKLQotCX0KLQotCS8qKgotCSAqIFRlc3RzIHJlc29sdmluZyBhbiBJVSB0aGF0IGhhcyBhIGZpbHRlciBvbiBpdHMgcmVxdWlyZWQgY2FwYWJpbGl0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2F0aXNmaWVkRGVwZW5kZW5jeVdpdGhNYXRjaGluZ0ZpbHRlcigpIHsKLQkJLy91c2UgdGhlIHNhbWUgdmVyc2lvbiBldmVyeXdoZXJlIGJlY2F1c2UgaXQncyBub3QgaW50ZXJlc3RpbmcgZm9yIHRoaXMgdGVzdAotCQlWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbigxLCAwLCAwKTsKLQotCQkvL1RoZSBJVSB0aGF0IGV4cG9ydHMgdGhlIGNhcGFiaWxpdHkKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdmlkZXMgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoInRlc3QuY2FwYWJpbGl0eSIsICJ0ZXN0IiwgdmVyc2lvbil9OwotCQlJSW5zdGFsbGFibGVVbml0IHJlcXVpcmVkID0gY3JlYXRlSVUoInJlcXVpcmVkIiwgdmVyc2lvbiwgcHJvdmlkZXMpOwotCi0JCS8vYW4gSVUgd2hvc2UgZmlsdGVyIHdpbGwgbWF0Y2ggdGhlIGVudmlyb25tZW50Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVzID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoInRlc3QuY2FwYWJpbGl0eSIsICJ0ZXN0IiwgY3JlYXRlRmlsdGVyKEZJTFRFUl9LRVksICJtYXRjaFZhbHVlIikpOwotCQlJSW5zdGFsbGFibGVVbml0IHRvSW5zdGFsbCA9IGNyZWF0ZUlVKCJtYXRjaCIsIHZlcnNpb24sIHJlcXVpcmVzKTsKLQotCQlEaWN0aW9uYXJ5IGVudmlyb25tZW50ID0gbmV3IEhhc2h0YWJsZSgpOwotCQllbnZpcm9ubWVudC5wdXQoRklMVEVSX0tFWSwgIm1hdGNoVmFsdWUiKTsKLQkJUmVzb2x1dGlvbkhlbHBlciByaCA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKGVudmlyb25tZW50LCBudWxsKTsKLQkJSGFzaFNldCBpbnN0YWxsU2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJaW5zdGFsbFNldC5hZGQodG9JbnN0YWxsKTsKLQkJSGFzaFNldCBhdmFpbGFibGUgPSBuZXcgSGFzaFNldCgpOwotCQlhdmFpbGFibGUuYWRkKHJlcXVpcmVkKTsKLQkJVW5zYXRpc2ZpZWRDYXBhYmlsaXR5W10gdW5zYXRpc2ZpZWQgPSByaC5pbnN0YWxsKGluc3RhbGxTZXQsIGF2YWlsYWJsZSk7Ci0KLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCAwLCB1bnNhdGlzZmllZC5sZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEluIHRoaXMgdGVzdCB3ZSB0cnkgdG8gcmVzb2x2ZSBhbiBJVSB0aGF0IGhhcyBhIHJlcXVpcmVkIGNhcGFiaWxpdHkgdGhhdCBpcwotCSAqIGF2YWlsYWJsZSwgYnV0IHRoZXJlIGlzIGEgZmlsdGVyIG9uIHRoZSByZXF1aXJlZCBjYXBhYmlsaXR5IHNvIGl0IHNob3VsZCBub3QgYmUgY29uc2lkZXJlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0U2F0aXNmaWVkRGVwZW5kZW5jeVdpdGhVbm1hdGNoaW5nRmlsdGVyKCkgewotCQkvL3VzZSB0aGUgc2FtZSB2ZXJzaW9uIGV2ZXJ5d2hlcmUgYmVjYXVzZSBpdCdzIG5vdCBpbnRlcmVzdGluZyBmb3IgdGhpcyB0ZXN0Ci0JCVZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApOwotCi0JCS8vVGhlIElVIHRoYXQgZXhwb3J0cyB0aGUgY2FwYWJpbGl0eQotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBwcm92aWRlcyA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eSgidGVzdC5jYXBhYmlsaXR5IiwgInRlc3QiLCB2ZXJzaW9uKX07Ci0JCUlJbnN0YWxsYWJsZVVuaXQgcmVxdWlyZWQgPSBjcmVhdGVJVSgicmVxdWlyZWQiLCB2ZXJzaW9uLCBwcm92aWRlcyk7Ci0KLQkJLy9hbiBJVSB3aG9zZSBmaWx0ZXIgd2lsbCBub3QgbWF0Y2ggdGhlIGVudmlyb25tZW50Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVzID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoInRlc3QuY2FwYWJpbGl0eSIsICJ0ZXN0IiwgY3JlYXRlRmlsdGVyKEZJTFRFUl9LRVksICJub01hdGNoVmFsdWUiKSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsID0gY3JlYXRlSVUoIm5vTWF0Y2giLCB2ZXJzaW9uLCByZXF1aXJlcyk7Ci0KLQkJRGljdGlvbmFyeSBlbnZpcm9ubWVudCA9IG5ldyBIYXNodGFibGUoKTsKLQkJZW52aXJvbm1lbnQucHV0KEZJTFRFUl9LRVksICJtYXRjaFZhbHVlIik7Ci0JCVJlc29sdXRpb25IZWxwZXIgcmggPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihlbnZpcm9ubWVudCwgbnVsbCk7Ci0JCUhhc2hTZXQgaW5zdGFsbFNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCWluc3RhbGxTZXQuYWRkKHRvSW5zdGFsbCk7Ci0JCUhhc2hTZXQgYXZhaWxhYmxlID0gbmV3IEhhc2hTZXQoKTsKLQkJYXZhaWxhYmxlLmFkZChyZXF1aXJlZCk7Ci0JCVVuc2F0aXNmaWVkQ2FwYWJpbGl0eVtdIHVuc2F0aXNmaWVkID0gcmguaW5zdGFsbChpbnN0YWxsU2V0LCBhdmFpbGFibGUpOwotCi0JCWFzc2VydEVxdWFscygiMS4wIiwgMCwgdW5zYXRpc2ZpZWQubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlRGVwZW5kZW5jeSgpIHsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZXMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoImphdmEucnVudGltZSIsICJKUkUiLCBudWxsLCBudWxsLCBmYWxzZSwgZmFsc2UpfTsKLQkJSUluc3RhbGxhYmxlVW5pdCBvc2dpID0gY3JlYXRlSVUoIm9yZy5lY2xpcHNlLm9zZ2kiLCBuZXcgVmVyc2lvbigzLCAyLCAwLCBudWxsKSwgcmVxdWlyZXMsIE5PX1BST1BFUlRJRVMsIGZhbHNlKTsKLQotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBwcm92aWRlcyA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eSgiamF2YS5ydW50aW1lIiwgIkpSRSIsIG5ldyBWZXJzaW9uKDEsIDQsIDIsICJzcjIiKSl9OwotCQlJSW5zdGFsbGFibGVVbml0IGpyZSA9IGNyZWF0ZUlVKCJjb20uaWJtLmpyZSIsIG5ldyBWZXJzaW9uKDEsIDQsIDIsICJzcjIiKSwgcHJvdmlkZXMpOwotCi0JCVJlc29sdXRpb25IZWxwZXIgcmggPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihudWxsLCBudWxsKTsKLQkJSGFzaFNldCBvc2dpU2V0ID0gbmV3IEhhc2hTZXQoMSk7Ci0JCW9zZ2lTZXQuYWRkKG9zZ2kpOwotCQlIYXNoU2V0IGpyZVNldCA9IG5ldyBIYXNoU2V0KDEpOwotCQlqcmVTZXQuYWRkKGpyZSk7Ci0JCWFzc2VydEVxdWFscygiMS4wIiwgMCwgcmguaW5zdGFsbChvc2dpU2V0LCBqcmVTZXQpLmxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogVGVzdHMgcmVzb2x2aW5nIGFuIElVIHRoYXQgaGFzIGEgZmlsdGVyIG9uIGl0cyByZXF1aXJlZCBjYXBhYmlsaXR5LCBhbmQKLQkgKiB0aGUgcmVxdWlyZWQgY2FwYWJpbGl0eSBpcyBub3QgYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RVbnNhdGlzZmllZERlcGVuZGVuY3lXaXRoTWF0Y2hpbmdGaWx0ZXIoKSB7Ci0JCS8vdXNlIHRoZSBzYW1lIHZlcnNpb24gZXZlcnl3aGVyZSBiZWNhdXNlIGl0J3Mgbm90IGludGVyZXN0aW5nIGZvciB0aGlzIHRlc3QKLQkJVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24oMSwgMCwgMCk7Ci0KLQkJLy9UaGUgSVUgdGhhdCBleHBvcnRzIHRoZSBjYXBhYmlsaXR5Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3ZpZGVzID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KCJ0ZXN0LmNhcGFiaWxpdHkiLCAidGVzdCIsIHZlcnNpb24pfTsKLQkJSUluc3RhbGxhYmxlVW5pdCByZXF1aXJlZCA9IGNyZWF0ZUlVKCJyZXF1aXJlZCIsIHZlcnNpb24sIHByb3ZpZGVzKTsKLQotCQkvL2FuIElVIHdob3NlIGZpbHRlciB3aWxsIG1hdGNoIHRoZSBlbnZpcm9ubWVudAotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlcyA9IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKCJ0ZXN0LmNhcGFiaWxpdHkiLCAiZG9lcy5ub3QuZXhpc3QiLCBjcmVhdGVGaWx0ZXIoRklMVEVSX0tFWSwgIm1hdGNoVmFsdWUiKSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdG9JbnN0YWxsID0gY3JlYXRlSVUoIm1hdGNoIiwgdmVyc2lvbiwgcmVxdWlyZXMpOwotCi0JCURpY3Rpb25hcnkgZW52aXJvbm1lbnQgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWVudmlyb25tZW50LnB1dChGSUxURVJfS0VZLCAibWF0Y2hWYWx1ZSIpOwotCQlSZXNvbHV0aW9uSGVscGVyIHJoID0gbmV3IFJlc29sdXRpb25IZWxwZXIoZW52aXJvbm1lbnQsIG51bGwpOwotCQlIYXNoU2V0IGluc3RhbGxTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlpbnN0YWxsU2V0LmFkZCh0b0luc3RhbGwpOwotCQlIYXNoU2V0IGF2YWlsYWJsZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCWF2YWlsYWJsZS5hZGQocmVxdWlyZWQpOwotCQlVbnNhdGlzZmllZENhcGFiaWxpdHlbXSB1bnNhdGlzZmllZCA9IHJoLmluc3RhbGwoaW5zdGFsbFNldCwgYXZhaWxhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDEsIHVuc2F0aXNmaWVkLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMS4xIiwgIm1hdGNoIiwgdW5zYXRpc2ZpZWRbMF0uZ2V0VW5zYXRpc2ZpZWRVbml0KCkuZ2V0SWQoKSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5ID0gdW5zYXRpc2ZpZWRbMF0uZ2V0UmVxdWlyZWRDYXBhYmlsaXR5KCk7Ci0JCWFzc2VydEVxdWFscygiMS40IiwgInRlc3QuY2FwYWJpbGl0eSIsIGNhcGFiaWxpdHkuZ2V0TmFtZXNwYWNlKCkpOwotCQlhc3NlcnRFcXVhbHMoIjEuNSIsICJkb2VzLm5vdC5leGlzdCIsIGNhcGFiaWxpdHkuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbiB0aGlzIHRlc3Qgd2UgdHJ5IHRvIHJlc29sdmUgYW4gSVUgdGhhdCBoYXMgYW4gdW5zYXRpc2ZpZWQgZGVwZW5kZW5jeS4KLQkgKiBIb3dldmVyLCB0aGVyZSBpcyBhIGZpbHRlciBvbiB0aGUgdW5yZXNvbHZlZCBkZXBlbmRlbmN5IHRoYXQgZG9lcyBub3QKLQkgKiBtYXRjaCB0aGUgZW52aXJvbm1lbnQsIHNvIGl0IHNob3VsZCBub3QgcHJldmVudCB0aGUgSVUgYmVpbmcgcmVzb2x2ZWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdFVuc2F0aXNmaWVkRGVwZW5kZW5jeVdpdGhVbm1hdGNoaW5nRmlsdGVyKCkgewotCQkvL3VzZSB0aGUgc2FtZSB2ZXJzaW9uIGV2ZXJ5d2hlcmUgYmVjYXVzZSBpdCdzIG5vdCBpbnRlcmVzdGluZyBmb3IgdGhpcyB0ZXN0Ci0JCVZlcnNpb24gdmVyc2lvbiA9IG5ldyBWZXJzaW9uKDEsIDAsIDApOwotCi0JCS8vVGhlIElVIHRoYXQgZXhwb3J0cyB0aGUgY2FwYWJpbGl0eQotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBwcm92aWRlcyA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eSgidGVzdC5jYXBhYmlsaXR5IiwgInRlc3QiLCB2ZXJzaW9uKX07Ci0JCUlJbnN0YWxsYWJsZVVuaXQgcmVxdWlyZWQgPSBjcmVhdGVJVSgicmVxdWlyZWQiLCB2ZXJzaW9uLCBwcm92aWRlcyk7Ci0KLQkJLy9hbiBJVSB3aG9zZSBmaWx0ZXIgd2lsbCBub3QgbWF0Y2ggdGhlIGVudmlyb25tZW50Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVzID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoInRlc3QuY2FwYWJpbGl0eSIsICJkb2VzLm5vdC5leGlzdCIsIGNyZWF0ZUZpbHRlcihGSUxURVJfS0VZLCAibm9NYXRjaFZhbHVlIikpOwotCQlJSW5zdGFsbGFibGVVbml0IHRvSW5zdGFsbCA9IGNyZWF0ZUlVKCJub01hdGNoIiwgdmVyc2lvbiwgcmVxdWlyZXMpOwotCi0JCURpY3Rpb25hcnkgZW52aXJvbm1lbnQgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWVudmlyb25tZW50LnB1dChGSUxURVJfS0VZLCAibWF0Y2hWYWx1ZSIpOwotCQlSZXNvbHV0aW9uSGVscGVyIHJoID0gbmV3IFJlc29sdXRpb25IZWxwZXIoZW52aXJvbm1lbnQsIG51bGwpOwotCQlIYXNoU2V0IGluc3RhbGxTZXQgPSBuZXcgSGFzaFNldCgpOwotCQlpbnN0YWxsU2V0LmFkZCh0b0luc3RhbGwpOwotCQlIYXNoU2V0IGF2YWlsYWJsZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCWF2YWlsYWJsZS5hZGQocmVxdWlyZWQpOwotCQlVbnNhdGlzZmllZENhcGFiaWxpdHlbXSB1bnNhdGlzZmllZCA9IHJoLmluc3RhbGwoaW5zdGFsbFNldCwgYXZhaWxhYmxlKTsKLQotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDAsIHVuc2F0aXNmaWVkLmxlbmd0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1JvbGxiYWNrVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1JvbGxiYWNrVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGNjZDM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9Sb2xsYmFja1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3RvcjsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuRGlyZWN0b3JBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24uQWdlbnRMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklEaXJlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLlByb2ZpbGVDaGFuZ2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgUm9sbGJhY2tUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlJSW5zdGFsbGFibGVVbml0IGMxOwotCUlJbnN0YWxsYWJsZVVuaXQgZDE7Ci0KLQlwcml2YXRlIElQcm9maWxlIHByb2ZpbGU7Ci0JcHJpdmF0ZSBJRGlyZWN0b3IgZGlyZWN0b3I7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgREVGQVVMVF9WRVJTSU9OLCB0cnVlKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIERFRkFVTFRfVkVSU0lPTiwgdHJ1ZSk7Ci0JCWMxID0gY3JlYXRlSVUoIkMiLCBERUZBVUxUX1ZFUlNJT04sIHRydWUpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcSA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbMV07Ci0JCXJlcVswXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWQxID0gY3JlYXRlSVUoIkQiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgcmVxKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBjMSwgZDF9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCWRpcmVjdG9yID0gY3JlYXRlRGlyZWN0b3IoKTsKLQotCQl0cnkgewotCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByb2xsYmFja1JlcG8gPSBnZXRSb2xsYmFja1JlcG9zaXRvcnkoKTsKLQkJCWlmIChyb2xsYmFja1JlcG8gIT0gbnVsbCkKLQkJCQlyb2xsYmFja1JlcG8ucmVtb3ZlQWxsKCk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElNZXRhZGF0YVJlcG9zaXRvcnkgZ2V0Um9sbGJhY2tSZXBvc2l0b3J5KCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciByZXBvTWFuID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlVUkwgbG9jYXRpb24gPSAoKEFnZW50TG9jYXRpb24pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShEaXJlY3RvckFjdGl2YXRvci5jb250ZXh0LCBBZ2VudExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSkpLmdldERhdGFBcmVhKERpcmVjdG9yQWN0aXZhdG9yLlBJX0RJUkVDVE9SKTsKLQkJCXJldHVybiByZXBvTWFuLmxvYWRSZXBvc2l0b3J5KG5ldyBVUkwobG9jYXRpb24sICJyb2xsYmFjayIpLCBudWxsKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMDIiLCBlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFzc2VydEVtcHR5Um9sbGJhY2tSZXBvKCkgewotCQl0cnkgewotCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByb2xsYmFja1JlcG8gPSBnZXRSb2xsYmFja1JlcG9zaXRvcnkoKTsKLQkJCUlJbnN0YWxsYWJsZVVuaXRbXSBpdXMgPSAoSUluc3RhbGxhYmxlVW5pdFtdKSByb2xsYmFja1JlcG8ucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JCQlhc3NlcnRFcXVhbHMoIjAuMDEiLCAwLCBpdXMubGVuZ3RoKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb2xsYmFja1Byb2ZpbGVQcm9wZXJ0aWVzKCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVtcHR5Um9sbGJhY2tSZXBvKCk7Ci0KLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdDEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QxLnNldFByb2ZpbGVQcm9wZXJ0eSgidGVzdDEiLCAidGVzdCIpOwotCQlyZXF1ZXN0MS5zZXRQcm9maWxlUHJvcGVydHkoInRlc3QyIiwgInRlc3QiKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdDEsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIElTdGF0dXMuT0ssIHN0YXR1cy5nZXRDb2RlKCkpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsICJ0ZXN0IiwgcHJvZmlsZS5nZXRQcm9wZXJ0eSgidGVzdDEiKSk7Ci0JCWFzc2VydEVxdWFscygiMy4wIiwgInRlc3QiLCBwcm9maWxlLmdldFByb3BlcnR5KCJ0ZXN0MiIpKTsKLQotCQlJSW5zdGFsbGFibGVVbml0W10gaXVzID0gKElJbnN0YWxsYWJsZVVuaXRbXSkgZ2V0Um9sbGJhY2tSZXBvc2l0b3J5KCkucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiNC4wIiwgMSwgaXVzLmxlbmd0aCk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgZW1wdHlQcm9maWxlSVUgPSBpdXNbMF07Ci0KLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdDIgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QyLnJlbW92ZVByb2ZpbGVQcm9wZXJ0eSgidGVzdDEiKTsKLQkJcmVxdWVzdDIuc2V0UHJvZmlsZVByb3BlcnR5KCJ0ZXN0MiIsICJiYWQiKTsKLQkJcmVxdWVzdDIuc2V0UHJvZmlsZVByb3BlcnR5KCJ0ZXN0MyIsICJ0ZXN0Iik7Ci0JCXN0YXR1cyA9IGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0MiwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygiNS4wIiwgSVN0YXR1cy5PSywgc3RhdHVzLmdldENvZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiNi4wIiwgbnVsbCwgcHJvZmlsZS5nZXRQcm9wZXJ0eSgidGVzdDEiKSk7Ci0JCWFzc2VydEVxdWFscygiNy4wIiwgImJhZCIsIHByb2ZpbGUuZ2V0UHJvcGVydHkoInRlc3QyIikpOwotCQlhc3NlcnRFcXVhbHMoIjguMCIsICJ0ZXN0IiwgcHJvZmlsZS5nZXRQcm9wZXJ0eSgidGVzdDMiKSk7Ci0KLQkJaXVzID0gKElJbnN0YWxsYWJsZVVuaXRbXSkgZ2V0Um9sbGJhY2tSZXBvc2l0b3J5KCkucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiOS4wIiwgMiwgaXVzLmxlbmd0aCk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCByZXZlcnRQcm9maWxlSVUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl1cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFpdXNbaV0uZXF1YWxzKGVtcHR5UHJvZmlsZUlVKSkKLQkJCQlyZXZlcnRQcm9maWxlSVUgPSBpdXNbaV07Ci0JCX0KLQotCQlzdGF0dXMgPSBkaXJlY3Rvci5yZXZlcnQocmV2ZXJ0UHJvZmlsZUlVLCBwcm9maWxlLCBuZXcgUHJvdmlzaW9uaW5nQ29udGV4dCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxMC4wIiwgSVN0YXR1cy5PSywgc3RhdHVzLmdldENvZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiMTEuMCIsICJ0ZXN0IiwgcHJvZmlsZS5nZXRQcm9wZXJ0eSgidGVzdDEiKSk7Ci0JCWFzc2VydEVxdWFscygiMTIuMCIsICJ0ZXN0IiwgcHJvZmlsZS5nZXRQcm9wZXJ0eSgidGVzdDIiKSk7Ci0JCWFzc2VydEVxdWFscygiMTMuMCIsIG51bGwsIHByb2ZpbGUuZ2V0UHJvcGVydHkoInRlc3QzIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb2xsYmFja0lVcygpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlhc3NlcnRFbXB0eVJvbGxiYWNrUmVwbygpOwotCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0MS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCXJlcXVlc3QxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YjF9KTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdDEsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIElTdGF0dXMuT0ssIHN0YXR1cy5nZXRDb2RlKCkpOwotCi0JCUxpc3QgcHJvZmlsZUlVcyA9IG5ldyBBcnJheUxpc3QocHJvZmlsZS5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkudG9Db2xsZWN0aW9uKCkpOwotCQlhc3NlcnRUcnVlKCIyLjAiLCBwcm9maWxlSVVzLmNvbnRhaW5zKGExKSk7Ci0JCWFzc2VydFRydWUoIjMuMCIsIHByb2ZpbGVJVXMuY29udGFpbnMoYjEpKTsKLQotCQlJSW5zdGFsbGFibGVVbml0W10gaXVzID0gKElJbnN0YWxsYWJsZVVuaXRbXSkgZ2V0Um9sbGJhY2tSZXBvc2l0b3J5KCkucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiNC4wIiwgMSwgaXVzLmxlbmd0aCk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgZW1wdHlQcm9maWxlSVUgPSBpdXNbMF07Ci0KLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdDIgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QyLnJlbW92ZUluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJcmVxdWVzdDIuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtjMX0pOwotCQlzdGF0dXMgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdDIsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoIjUuMCIsIElTdGF0dXMuT0ssIHN0YXR1cy5nZXRDb2RlKCkpOwotCi0JCXByb2ZpbGVJVXMgPSBuZXcgQXJyYXlMaXN0KHByb2ZpbGUucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQ29sbGVjdGlvbigpKTsKLQkJYXNzZXJ0RmFsc2UoIjYuMCIsIHByb2ZpbGVJVXMuY29udGFpbnMoYTEpKTsKLQkJYXNzZXJ0VHJ1ZSgiNy4wIiwgcHJvZmlsZUlVcy5jb250YWlucyhiMSkpOwotCQlhc3NlcnRUcnVlKCI4LjAiLCBwcm9maWxlSVVzLmNvbnRhaW5zKGMxKSk7Ci0KLQkJaXVzID0gKElJbnN0YWxsYWJsZVVuaXRbXSkgZ2V0Um9sbGJhY2tSZXBvc2l0b3J5KCkucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiOS4wIiwgMiwgaXVzLmxlbmd0aCk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCByZXZlcnRQcm9maWxlSVUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl1cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFpdXNbaV0uZXF1YWxzKGVtcHR5UHJvZmlsZUlVKSkKLQkJCQlyZXZlcnRQcm9maWxlSVUgPSBpdXNbaV07Ci0JCX0KLQotCQlzdGF0dXMgPSBkaXJlY3Rvci5yZXZlcnQocmV2ZXJ0UHJvZmlsZUlVLCBwcm9maWxlLCBuZXcgUHJvdmlzaW9uaW5nQ29udGV4dCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxMC4wIiwgSVN0YXR1cy5PSywgc3RhdHVzLmdldENvZGUoKSk7Ci0KLQkJcHJvZmlsZUlVcyA9IG5ldyBBcnJheUxpc3QocHJvZmlsZS5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkudG9Db2xsZWN0aW9uKCkpOwotCQlhc3NlcnRUcnVlKCIxMS4wIiwgcHJvZmlsZUlVcy5jb250YWlucyhhMSkpOwotCQlhc3NlcnRUcnVlKCIxMi4wIiwgcHJvZmlsZUlVcy5jb250YWlucyhiMSkpOwotCQlhc3NlcnRGYWxzZSgiMTMuMCIsIHByb2ZpbGVJVXMuY29udGFpbnMoYzEpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Um9sbGJhY2tJVVByb2ZpbGVQcm9wZXJ0aWVzKCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCWFzc2VydEVtcHR5Um9sbGJhY2tSZXBvKCk7Ci0KLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdDEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJcmVxdWVzdDEuc2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KGExLCAidGVzdDEiLCAidGVzdCIpOwotCQlyZXF1ZXN0MS5zZXRJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydHkoYTEsICJ0ZXN0MiIsICJ0ZXN0Iik7Ci0JCUlTdGF0dXMgc3RhdHVzID0gZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QxLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCBJU3RhdHVzLk9LLCBzdGF0dXMuZ2V0Q29kZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLCAidGVzdCIsIHByb2ZpbGUuZ2V0SW5zdGFsbGFibGVVbml0UHJvcGVydHkoYTEsICJ0ZXN0MSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjAiLCAidGVzdCIsIHByb2ZpbGUuZ2V0SW5zdGFsbGFibGVVbml0UHJvcGVydHkoYTEsICJ0ZXN0MiIpKTsKLQotCQlJSW5zdGFsbGFibGVVbml0W10gaXVzID0gKElJbnN0YWxsYWJsZVVuaXRbXSkgZ2V0Um9sbGJhY2tSZXBvc2l0b3J5KCkucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiNC4wIiwgMSwgaXVzLmxlbmd0aCk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgZW1wdHlQcm9maWxlSVUgPSBpdXNbMF07Ci0KLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdDIgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QyLnJlbW92ZUluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0eShhMSwgInRlc3QxIik7Ci0JCXJlcXVlc3QyLnNldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0eShhMSwgInRlc3QyIiwgImJhZCIpOwotCQlyZXF1ZXN0Mi5zZXRJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydHkoYTEsICJ0ZXN0MyIsICJ0ZXN0Iik7Ci0JCXN0YXR1cyA9IGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0MiwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWFzc2VydEVxdWFscygiNS4wIiwgSVN0YXR1cy5PSywgc3RhdHVzLmdldENvZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiNi4wIiwgbnVsbCwgcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShhMSwgInRlc3QxIikpOwotCQlhc3NlcnRFcXVhbHMoIjcuMCIsICJiYWQiLCBwcm9maWxlLmdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGExLCAidGVzdDIiKSk7Ci0JCWFzc2VydEVxdWFscygiOC4wIiwgInRlc3QiLCBwcm9maWxlLmdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGExLCAidGVzdDMiKSk7Ci0KLQkJaXVzID0gKElJbnN0YWxsYWJsZVVuaXRbXSkgZ2V0Um9sbGJhY2tSZXBvc2l0b3J5KCkucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiOS4wIiwgMiwgaXVzLmxlbmd0aCk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCByZXZlcnRQcm9maWxlSVUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl1cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFpdXNbaV0uZXF1YWxzKGVtcHR5UHJvZmlsZUlVKSkKLQkJCQlyZXZlcnRQcm9maWxlSVUgPSBpdXNbaV07Ci0JCX0KLQotCQlzdGF0dXMgPSBkaXJlY3Rvci5yZXZlcnQocmV2ZXJ0UHJvZmlsZUlVLCBwcm9maWxlLCBuZXcgUHJvdmlzaW9uaW5nQ29udGV4dCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxMC4wIiwgSVN0YXR1cy5PSywgc3RhdHVzLmdldENvZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiMTEuMCIsICJ0ZXN0IiwgcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShhMSwgInRlc3QxIikpOwotCQlhc3NlcnRFcXVhbHMoIjEyLjAiLCAidGVzdCIsIHByb2ZpbGUuZ2V0SW5zdGFsbGFibGVVbml0UHJvcGVydHkoYTEsICJ0ZXN0MiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxMy4wIiwgbnVsbCwgcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShhMSwgInRlc3QzIikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSb2xsYmFja0RlcGVuZGVudElVUHJvZmlsZVByb3BlcnRpZXMoKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJYXNzZXJ0RW1wdHlSb2xsYmFja1JlcG8oKTsKLQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0MSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdDEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtkMX0pOwotCQlyZXF1ZXN0MS5zZXRJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydHkoZDEsICJ0ZXN0MSIsICJ0ZXN0Iik7Ci0JCXJlcXVlc3QxLnNldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0eShhMSwgInRlc3QyIiwgInRlc3QiKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdDEsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIElTdGF0dXMuT0ssIHN0YXR1cy5nZXRDb2RlKCkpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsICJ0ZXN0IiwgcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShkMSwgInRlc3QxIikpOwotCQlhc3NlcnRFcXVhbHMoIjMuMCIsICJ0ZXN0IiwgcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShhMSwgInRlc3QyIikpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXRbXSBpdXMgPSAoSUluc3RhbGxhYmxlVW5pdFtdKSBnZXRSb2xsYmFja1JlcG9zaXRvcnkoKS5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkudG9BcnJheShJSW5zdGFsbGFibGVVbml0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKCI0LjAiLCAxLCBpdXMubGVuZ3RoKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBlbXB0eVByb2ZpbGVJVSA9IGl1c1swXTsKLQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0MiA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdDIucmVtb3ZlSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtkMX0pOwotCQlyZXF1ZXN0Mi5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2IxfSk7Ci0JCXJlcXVlc3QyLnNldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0eShiMSwgInRlc3QzIiwgInRlc3QiKTsKLQotCQlzdGF0dXMgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdDIsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoIjUuMCIsIElTdGF0dXMuT0ssIHN0YXR1cy5nZXRDb2RlKCkpOwotCQlhc3NlcnRFcXVhbHMoIjYuMCIsIG51bGwsIHByb2ZpbGUuZ2V0SW5zdGFsbGFibGVVbml0UHJvcGVydHkoZDEsICJ0ZXN0MSIpKTsKLQkJYXNzZXJ0RXF1YWxzKCI3LjAiLCBudWxsLCBwcm9maWxlLmdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGExLCAidGVzdDIiKSk7Ci0JCWFzc2VydEVxdWFscygiOC4wIiwgInRlc3QiLCBwcm9maWxlLmdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGIxLCAidGVzdDMiKSk7Ci0KLQkJaXVzID0gKElJbnN0YWxsYWJsZVVuaXRbXSkgZ2V0Um9sbGJhY2tSZXBvc2l0b3J5KCkucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JCWFzc2VydEVxdWFscygiOS4wIiwgMiwgaXVzLmxlbmd0aCk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCByZXZlcnRQcm9maWxlSVUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl1cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFpdXNbaV0uZXF1YWxzKGVtcHR5UHJvZmlsZUlVKSkKLQkJCQlyZXZlcnRQcm9maWxlSVUgPSBpdXNbaV07Ci0JCX0KLQotCQlzdGF0dXMgPSBkaXJlY3Rvci5yZXZlcnQocmV2ZXJ0UHJvZmlsZUlVLCBwcm9maWxlLCBuZXcgUHJvdmlzaW9uaW5nQ29udGV4dCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxMC4wIiwgSVN0YXR1cy5PSywgc3RhdHVzLmdldENvZGUoKSk7Ci0JCWFzc2VydEVxdWFscygiMTEuMCIsICJ0ZXN0IiwgcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShkMSwgInRlc3QxIikpOwotCQlhc3NlcnRFcXVhbHMoIjEyLjAiLCAidGVzdCIsIHByb2ZpbGUuZ2V0SW5zdGFsbGFibGVVbml0UHJvcGVydHkoYTEsICJ0ZXN0MiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCIxMy4wIiwgbnVsbCwgcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShiMSwgInRlc3QzIikpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9TaW5nbGV0b25UZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3IvU2luZ2xldG9uVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGM1Yjg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9TaW5nbGV0b25UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSURpcmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgU2luZ2xldG9uVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBmMTsKLQlJSW5zdGFsbGFibGVVbml0IGYxXzE7Ci0KLQlJSW5zdGFsbGFibGVVbml0IGYyOwotCUlJbnN0YWxsYWJsZVVuaXQgZjJfMTsKLQotCUlJbnN0YWxsYWJsZVVuaXQganVuaXQzODsKLQlJSW5zdGFsbGFibGVVbml0IGp1bml0NDA7Ci0KLQlJRGlyZWN0b3IgZGlyZWN0b3I7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWYxID0gY3JlYXRlSVUoImYxIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIHRydWUpOwotCi0JCWYxXzEgPSBjcmVhdGVJVSgiZjEiLCBuZXcgVmVyc2lvbigxLCAxLCAwKSwgdHJ1ZSk7Ci0KLQkJZjIgPSBjcmVhdGVJVSgiZjIiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgdHJ1ZSk7Ci0KLQkJZjJfMSA9IGNyZWF0ZUlVKCJmMiIsIG5ldyBWZXJzaW9uKDEsIDAsIDEpKTsKLQotCQlqdW5pdDM4ID0gY3JlYXRlSVUoImp1bml0IiwgbmV3IFZlcnNpb24oMywgOCwgMSkpOwotCi0JCWp1bml0NDAgPSBjcmVhdGVJVSgianVuaXQiLCBuZXcgVmVyc2lvbig0LCAwLCAxKSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxLCBmMV8xLCBqdW5pdDM4LCBqdW5pdDQwLCBmMiwgZjJfMX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJZGlyZWN0b3IgPSBjcmVhdGVEaXJlY3RvcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVZlcnNpb25Ob25TaW5nbGV0b24oKSB7Ci0JCS8vIFRoZSBpbnN0YWxsYXRpb24gb2YganVuaXQzOCBhbmQganVuaXQgNDAgdG9nZXRoZXIgc2hvdWxkIHN1Y2NlZWQKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2p1bml0MzgsIGp1bml0NDB9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVWZXJzaW9uU2luZ2xldG9uKCkgewotCQkvLyBUaGUgaW5zdGFsbGF0aW9uIG9mIGp1bml0MzggYW5kIGp1bml0IDQwIHRvZ2V0aGVyIHNob3VsZCBub3Qgc3VjY2VlZAotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZjEsIGYxXzF9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVWZXJzaW9uU2luZ2xldG9uMigpIHsKLQkJLy8gVGhlIGluc3RhbGxhdGlvbiBvZiBqdW5pdDM4IGFuZCBqdW5pdCA0MCB0b2dldGhlciBzaG91bGQgbm90IHN1Y2NlZWQKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YyLCBmMl8xfSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLkVSUk9SLCBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1VuaW5zdGFsbFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9Vbmluc3RhbGxUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNjBjZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1VuaW5zdGFsbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JRGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBVbmluc3RhbGxUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JcHJpdmF0ZSBJUHJvZmlsZSBwcm9maWxlOwotCXByaXZhdGUgSURpcmVjdG9yIGRpcmVjdG9yOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIERFRkFVTFRfVkVSU0lPTiwgdHJ1ZSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuaW5zdGFsbCgpIHsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIHVuaXRzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9OwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHModW5pdHMpOwotCQlhc3NlcnRUcnVlKCIxLjAiLCBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCkuaXNPSygpKTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zKCIxLjEiLCBwcm9maWxlLCB1bml0cyk7Ci0JCXJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcXVlc3QucmVtb3ZlSW5zdGFsbGFibGVVbml0cyh1bml0cyk7Ci0JCWFzc2VydFRydWUoIjEuMiIsIGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBudWxsKS5pc09LKCkpOwotCQlhc3NlcnRFbXB0eVByb2ZpbGUocHJvZmlsZSk7Ci0JCS8vIHVuaW5zdGFsbGluZyBvbiBlbXB0eSBwcm9maWxlIHNob3VsZCBiZSBhIG5vLW9wCi0JCWFzc2VydFRydWUoIjEuMyIsIGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBudWxsKS5pc09LKCkpOwotCQlhc3NlcnRFbXB0eVByb2ZpbGUocHJvZmlsZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1VwZGF0ZVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvci9VcGRhdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjN2YwYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yL1VwZGF0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuUmVxdWlyZWRDYXBhYmlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBVcGRhdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGYxOwotCUlJbnN0YWxsYWJsZVVuaXQgZjFfMTsKLQlJSW5zdGFsbGFibGVVbml0IGYxXzQ7Ci0KLQlJSW5zdGFsbGFibGVVbml0IGZhOwotCUlJbnN0YWxsYWJsZVVuaXQgZmFwOwotCUlEaXJlY3RvciBkaXJlY3RvcjsKLQlJUGxhbm5lciBwbGFubmVyOwotCUlQcm9maWxlIHByb2ZpbGU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlTdHJpbmcgZjFJZCA9IGdldE5hbWUoKSArICJmMSI7Ci0JCWYxID0gY3JlYXRlSVUoZjFJZCwgREVGQVVMVF9WRVJTSU9OLCB0cnVlKTsKLQkJZjFfMSA9IGNyZWF0ZUlVKGYxSWQsIG5ldyBWZXJzaW9uKDEsIDEsIDApLCB0cnVlKTsKLQkJZjFfNCA9IGNyZWF0ZUlVKGYxSWQsIG5ldyBWZXJzaW9uKDEsIDQsIDApLCB0cnVlKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlcyA9IGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCBmMUlkLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMy4wKSIpLCBudWxsKTsKLQkJU3RyaW5nIGZhSWQgPSBnZXROYW1lKCkgKyAiLmZhIjsKLQkJZmEgPSBjcmVhdGVJVShmYUlkLCByZXF1aXJlcywgZmFsc2UpOwotCi0JCXJlcXVpcmVzID0gY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIGYxSWQsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS40LjApIiksIG51bGwpOwotCQlmYXAgPSBjcmVhdGVJVShmYUlkLCBuZXcgVmVyc2lvbigxLCAxLCAwKSwgcmVxdWlyZXMsIE5PX1BST1BFUlRJRVMsIGZhbHNlKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZjEsIGZhfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlVwZGF0ZVRlc3QuIiArIGdldE5hbWUoKSk7Ci0JCWRpcmVjdG9yID0gY3JlYXRlRGlyZWN0b3IoKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ZhfSk7Ci0JCWFzc2VydE9LKCIxLjAiLCBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnMoIlByb2ZpbGUgc2V0dXAiLCBwcm9maWxlLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmMSwgZmF9KTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxXzEsIGYxXzR9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbCgpIHsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxXzF9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcXVlc3QsIG5ldyBQcm92aXNpb25pbmdDb250ZXh0KCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRPSygiMS4wIiwgcGxhbi5nZXRTdGF0dXMoKSk7Ci0JCWFzc2VydE9LKCIxLjEiLCBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbnVsbCkpOwotCQlyZXF1ZXN0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXF1ZXN0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZjFfNH0pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvcnl3YXRjaGVyL0Fic3RyYWN0RGlyZWN0b3J5V2F0Y2hlclRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvcnl3YXRjaGVyL0Fic3RyYWN0RGlyZWN0b3J5V2F0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlNGQ1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9BYnN0cmFjdERpcmVjdG9yeVdhdGNoZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yeXdhdGNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci0KLS8qKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REaXJlY3RvcnlXYXRjaGVyVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0KLQkvLyBsaXN0IG9mIEZpbGUgb2JqZWN0cyB0byByZW1vdmUgbGF0ZXIgZHVyaW5nIHRlYXJkb3duCi0JcHJvdGVjdGVkIFNldCB0b1JlbW92ZSA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkvKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuCi0JICovCi0JcHVibGljIEFic3RyYWN0RGlyZWN0b3J5V2F0Y2hlclRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QjdGVhckRvd24oKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IHRvUmVtb3ZlLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLQkJCWRlbGV0ZSgoRmlsZSkgaXRlci5uZXh0KCkpOwotCQl0b1JlbW92ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yeXdhdGNoZXIvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2MzhhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZGlyZWN0b3J5d2F0Y2hlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFBlcmZvcm1zIGFsbCBhdXRvbWF0ZWQgZGlyZWN0b3IgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRGlyZWN0b3J5V2F0Y2hlclRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUmVwb3NpdG9yeUxpc3RlbmVyVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQcm9maWxlU3luY2hyb25pemVyVGVzdC5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9EaXJlY3RvcnlXYXRjaGVyVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yeXdhdGNoZXIvRGlyZWN0b3J5V2F0Y2hlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjlkYTEyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9EaXJlY3RvcnlXYXRjaGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yeXdhdGNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yeXdhdGNoZXIuRGlyZWN0b3J5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvcnl3YXRjaGVyLkRpcmVjdG9yeVdhdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5V2F0Y2hlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCi0JcHVibGljIERpcmVjdG9yeVdhdGNoZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDcmVhdGVEaXJlY3RvcnlXYXRjaGVyTnVsbERpcmVjdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgewotCQkJbmV3IERpcmVjdG9yeVdhdGNoZXIoKEZpbGUpIG51bGwpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRGlyZWN0b3J5V2F0Y2hlck9uZURpcmVjdG9yeSgpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgYmFzZSA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEiKTsKLQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShGaWxlTG9jYXRvci50b0ZpbGVVUkwoYmFzZSkuZ2V0UGF0aCgpKTsKLQkJRGlyZWN0b3J5V2F0Y2hlciB3YXRjaGVyID0gbmV3IERpcmVjdG9yeVdhdGNoZXIoZm9sZGVyKTsKLQkJd2F0Y2hlci5zdGFydCgpOwotCQl3YXRjaGVyLnN0b3AoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRGlyZWN0b3J5V2F0Y2hlclByb3BzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVVSTCBiYXNlID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0QnVuZGxlKCkuZ2V0RW50cnkoIi90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMSIpOwotCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKEZpbGVMb2NhdG9yLnRvRmlsZVVSTChiYXNlKS5nZXRQYXRoKCkpOwotCi0JCUhhc2h0YWJsZSBwcm9wcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcHJvcHMucHV0KERpcmVjdG9yeVdhdGNoZXIuRElSLCBmb2xkZXIuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCURpcmVjdG9yeVdhdGNoZXIgd2F0Y2hlciA9IG5ldyBEaXJlY3RvcnlXYXRjaGVyKHByb3BzLCBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSk7Ci0JCXdhdGNoZXIuc3RhcnQoKTsKLQkJd2F0Y2hlci5zdG9wKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcmVjdG9yeVdhdGNoZXJMaXN0ZW5lcigpIHRocm93cyBFeGNlcHRpb24gewotCQlVUkwgYmFzZSA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KCIvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEiKTsKLQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShGaWxlTG9jYXRvci50b0ZpbGVVUkwoYmFzZSkuZ2V0UGF0aCgpKTsKLQotCQlIYXNodGFibGUgcHJvcHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXByb3BzLnB1dChEaXJlY3RvcnlXYXRjaGVyLkRJUiwgZm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKLQotCQlEaXJlY3RvcnlXYXRjaGVyIHdhdGNoZXIgPSBuZXcgRGlyZWN0b3J5V2F0Y2hlcihwcm9wcywgVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkpOwotCQlmaW5hbCBMaXN0IGxpc3QgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3QoKSk7Ci0JCURpcmVjdG9yeUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IERpcmVjdG9yeUNoYW5nZUxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgYm9vbGVhbiBhZGRlZChGaWxlIGZpbGUpIHsKLQkJCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzKCJDVlMiKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWxpc3QuYWRkKGZpbGUpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBjaGFuZ2VkKEZpbGUgZmlsZSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gcmVtb3ZlZChGaWxlIGZpbGUpIHsKLQkJCQlpZiAoZmlsZS5nZXROYW1lKCkuZXF1YWxzKCJDVlMiKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWxpc3QucmVtb3ZlKGZpbGUpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0ludGVyZXN0ZWQoRmlsZSBmaWxlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMb25nIGdldFNlZW5GaWxlKEZpbGUgZmlsZSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzdGFydFBvbGwoKSB7Ci0KLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc3RvcFBvbGwoKSB7Ci0JCQl9Ci0KLQkJfTsKLQkJd2F0Y2hlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXdhdGNoZXIucG9sbCgpOwotCQlhc3NlcnRFcXVhbHMoMiwgbGlzdC5zaXplKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvcnl3YXRjaGVyL1Byb2ZpbGVTeW5jaHJvbml6ZXJUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9Qcm9maWxlU3luY2hyb25pemVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTEzYmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvcnl3YXRjaGVyL1Byb2ZpbGVTeW5jaHJvbml6ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3Rvcnl3YXRjaGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVTeW5jaHJvbml6ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3REaXJlY3RvcnlXYXRjaGVyVGVzdCB7Ci0KLQkvKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuCi0JICovCi0JcHVibGljIFByb2ZpbGVTeW5jaHJvbml6ZXJUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qCi0JICogUnVuIGFsbCB0aGUgdGVzdHMgaW4gdGhpcyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFByb2ZpbGVTeW5jaHJvbml6ZXJUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0KCkgewotCQkvLyBlbXB0eSB0ZXN0IGJlY2F1c2UgdGhlIG90aGVycyBhcmVuJ3QgZW5hYmxlZCB5ZXQKLQl9Ci0KLQkvKgotCSAqIFRlc3QgdGhhdCB3ZSBvbmx5IHRyeSB0byBpbnN0YWxsIGJ1bmRsZXMgd2l0aCBtYXRjaGluZyBwbGF0Zm9ybSBmaWx0ZXJzLgotCSAqIAotCSAqIFRPRE8gd2UgZG9uJ3Qgd2FudCB0byB0ZXN0IHRvIHNlZSBpZiB0aGUgYnVuZGxlcyBhcmUgaW4gdGhlIHJlcG8sIGJ1dCBpZgotCSAqIHRoZSBidW5kbGVzIGFyZSBmaWx0ZXJlZCB3aGVuIHRoZXkgYXJlIGluc3RhbGxlZCBpbnRvIGEgcHJvZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBfdGVzdFBsYXRmb3JtRmlsdGVyKCkgewotCQlTdHJpbmcgYmFzZSA9ICIvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci8iOwotCQlTdHJpbmdbXSBleHRlbnNpb25zID0gbmV3IFN0cmluZ1tdIHsiYmJiXzEuMC4wLmphciIsICJiYmIubGludXhfMS4wLjAuamFyIiwgImJiYi53aW4zMl8xLjAuMC5qYXIifTsKLQkJU2V0IGphcnMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspCi0JCQlqYXJzLmFkZChnZXRUZXN0RGF0YSgiMC45OSIsIGJhc2UgKyBleHRlbnNpb25zW2ldKSk7Ci0JCUZpbGUgZm9sZGVyID0gZ2V0VGVtcEZvbGRlcigpOwotCQl0b1JlbW92ZS5hZGQoZm9sZGVyKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gamFycy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCUZpbGUgbmV4dCA9IChGaWxlKSBpdGVyLm5leHQoKTsKLQkJCWNvcHkoIjEuMCAiICsgbmV4dC5nZXRBYnNvbHV0ZVBhdGgoKSwgbmV4dCwgbmV3IEZpbGUoZm9sZGVyLCBuZXh0LmdldE5hbWUoKSkpOwotCQl9Ci0KLQkJLy8gV2Ugc2hvdWxkIGhhdmUgYW4gZW1wdHkgcmVwb3NpdG9yeSBiZWNhdXNlIHdlIGhhdmVuJ3QgZG9uZSBhbnl0aGluZyB5ZXQKLQkJVGVzdFJlcG9zaXRvcnlXYXRjaGVyIHdhdGNoZXIgPSBUZXN0UmVwb3NpdG9yeVdhdGNoZXIuY3JlYXRlV2F0Y2hlcihmb2xkZXIpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIDAsIHdhdGNoZXIuZ2V0SW5zdGFsbGFibGVVbml0cygpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMi4xIiwgMCwgd2F0Y2hlci5nZXRBcnRpZmFjdEtleXMoKS5sZW5ndGgpOwotCi0JCXdhdGNoZXIucG9sbCgpOwotCi0JCS8vIHdoaWNoIElVcyB3ZSBhcmUgZXhwZWN0aW5nIGlzIGRlcGVuZGVudCBvbiB3aGljaCBPUyB3ZSBhcmUgcnVubmluZwotCQlTZXQgZXhwZWN0ZWQgPSBuZXcgSGFzaFNldCgpOwotCQlleHBlY3RlZC5hZGQoImJiYiIpOwotCQlTdHJpbmcgb3MgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoIm9zZ2kub3MiKTsKLQkJaWYgKCJ3aW4zMiIuZXF1YWxzKG9zKSkgewotCQkJZXhwZWN0ZWQuYWRkKCJiYmIud2luMzIiKTsKLQkJfSBlbHNlIGlmICgibGludXgiLmVxdWFscyhvcykpIHsKLQkJCWV4cGVjdGVkLmFkZCgiYmJiLmxpbnV4Iik7Ci0JCX0KLQotCQlJSW5zdGFsbGFibGVVbml0W10gaXVzID0gd2F0Y2hlci5nZXRJbnN0YWxsYWJsZVVuaXRzKCk7Ci0JCWFzc2VydEVxdWFscygiMy4wIiwgZXhwZWN0ZWQuc2l6ZSgpLCBpdXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdXMubGVuZ3RoOyBpKyspCi0JCQlhc3NlcnRUcnVlKCIzLjEgIiArIGl1c1tpXS5nZXRJZCgpLCBleHBlY3RlZC5jb250YWlucyhpdXNbaV0uZ2V0SWQoKSkpOwotCQlhc3NlcnRFcXVhbHMoIjMuMiIsIGV4cGVjdGVkLnNpemUoKSwgd2F0Y2hlci5nZXRBcnRpZmFjdEtleXMoKS5sZW5ndGgpOwotCX0KLQotCS8qCi0JICogVGVzdCB0byBlbnN1cmUgdGhhdCB3ZSBvbmx5IHRyeSB0byBpbnN0YWxsIHRoZSBoaWdoZXN0IHZlcnNpb24gb2Ygc2luZ2xldG9uIGJ1bmRsZXMKLQkgKiB3aGVyZSBtdWx0aXBsZSB2ZXJzaW9ucyBleGlzdC4KLQkgKiAKLQkgKiBUT0RPIHdlIGRvbid0IHdhbnQgdG8gdGVzdCB0byBzZWUgaWYgdGhlIGJ1bmRsZXMgYXJlIGluIHRoZSByZXBvLCBidXQgaWYKLQkgKiB0aGUgYnVuZGxlcyBhcmUgZmlsdGVyZWQgd2hlbiB0aGV5IGFyZSBpbnN0YWxsZWQgaW50byBhIHByb2ZpbGUuCi0JICovCi0JcHVibGljIHZvaWQgX3Rlc3RNdWx0aXBsZVZlcnNpb25zKCkgewotCQlGaWxlIG9uZSA9IGdldFRlc3REYXRhKCIwLjEiLCAiL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvY2NjXzEuMC4wLmphciIpOwotCQlGaWxlIHR3byA9IGdldFRlc3REYXRhKCIwLjIiLCAiL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvY2NjXzIuMC4wLmphciIpOwotCQlGaWxlIGZvbGRlciA9IGdldFRlbXBGb2xkZXIoKTsKLQkJdG9SZW1vdmUuYWRkKGZvbGRlcik7Ci0KLQkJY29weSgiMS4wIiwgb25lLCBuZXcgRmlsZShmb2xkZXIsIG9uZS5nZXROYW1lKCkpKTsKLQkJY29weSgiMS4xIiwgdHdvLCBuZXcgRmlsZShmb2xkZXIsIHR3by5nZXROYW1lKCkpKTsKLQotCQlUZXN0UmVwb3NpdG9yeVdhdGNoZXIgd2F0Y2hlciA9IFRlc3RSZXBvc2l0b3J5V2F0Y2hlci5jcmVhdGVXYXRjaGVyKGZvbGRlcik7Ci0KLQkJLy8gV2Ugc2hvdWxkIGhhdmUgYW4gZW1wdHkgcmVwb3NpdG9yeSBiZWNhdXNlIHdlIGhhdmVuJ3QgZG9uZSBhbnl0aGluZyB5ZXQKLQkJYXNzZXJ0RXF1YWxzKCIyLjAiLCAwLCB3YXRjaGVyLmdldEluc3RhbGxhYmxlVW5pdHMoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjIuMSIsIDAsIHdhdGNoZXIuZ2V0QXJ0aWZhY3RLZXlzKCkubGVuZ3RoKTsKLQotCQl3YXRjaGVyLnBvbGwoKTsKLQotCQlJSW5zdGFsbGFibGVVbml0W10gaXVzID0gd2F0Y2hlci5nZXRJbnN0YWxsYWJsZVVuaXRzKCk7Ci0JCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IHdhdGNoZXIuZ2V0QXJ0aWZhY3RLZXlzKCk7Ci0JCWFzc2VydEVxdWFscygiMy4wIiwgMSwgaXVzLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMy4xIiwgImNjYyIsIGl1c1swXS5nZXRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjIiLCBuZXcgVmVyc2lvbigiMi4wLjAiKSwgaXVzWzBdLmdldFZlcnNpb24oKSk7Ci0JCWFzc2VydEVxdWFscygiNC4wIiwgMSwgYXJ0aWZhY3RzLmxlbmd0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9SZXBvc2l0b3J5TGlzdGVuZXJUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9SZXBvc2l0b3J5TGlzdGVuZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ZjU0OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2RpcmVjdG9yeXdhdGNoZXIvUmVwb3NpdG9yeUxpc3RlbmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRpcmVjdG9yeXdhdGNoZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3REZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLQotcHVibGljIGNsYXNzIFJlcG9zaXRvcnlMaXN0ZW5lclRlc3QgZXh0ZW5kcyBBYnN0cmFjdERpcmVjdG9yeVdhdGNoZXJUZXN0IHsKLQotCS8qCi0JICogQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgUmVwb3NpdG9yeUxpc3RlbmVyVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIFJ1biBhbGwgdGhlIHRlc3RzIGluIHRoaXMgY2xhc3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShSZXBvc2l0b3J5TGlzdGVuZXJUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNaaXBwZWQoVG91Y2hwb2ludERhdGFbXSBkYXRhKSB7Ci0JCWlmIChkYXRhID09IG51bGwgfHwgZGF0YS5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZGF0YVtpXS5nZXRJbnN0cnVjdGlvbnMoInppcHBlZCIpICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBSZW1vdmUgdGhlIGZpbGVzIGZyb20gdGhlIHRhcmdldCwgaWYgdGhleSBleGlzdCBpbiB0aGUgc291cmNlLgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVDb250ZW50cyhGaWxlIHNvdXJjZSwgRmlsZSB0YXJnZXQpIHsKLQkJaWYgKHNvdXJjZS5leGlzdHMoKSAmJiBzb3VyY2UuaXNEaXJlY3RvcnkoKSAmJiB0YXJnZXQuZXhpc3RzKCkgJiYgdGFyZ2V0LmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IHNvdXJjZS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0JCQkJaWYgKGZpbGVzW2ldICE9IG51bGwpCi0JCQkJCWRlbGV0ZShuZXcgRmlsZSh0YXJnZXQsIGZpbGVzW2ldLmdldE5hbWUoKSkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERpcmVjdG9yeVdhdGNoZXJMaXN0ZW5lcigpIHsKLQkJRmlsZSBiYXNlRm9sZGVyID0gZ2V0VGVzdERhdGEoIjAuOTkiLCAiL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxIik7Ci0JCUZpbGUgYmFzZUZvbGRlcjIgPSBnZXRUZXN0RGF0YSgiMC4xMDAiLCAiL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyIik7Ci0KLQkJLy8gbWFrZSBzdXJlIHdlIHJlbW92ZSB0aGlzIGZpbGUgYWZ0ZXIgd2UgZmluaXNoIHJ1bm5pbmcgdGhlIHRlc3RzCi0JCUZpbGUgZm9sZGVyID0gZ2V0VGVtcEZvbGRlcigpOwotCQl0b1JlbW92ZS5hZGQoZm9sZGVyKTsKLQotCQkvLyBjcmVhdGUgdGhlIHdhdGNoZXIKLQkJVGVzdFJlcG9zaXRvcnlXYXRjaGVyIHdhdGNoZXIgPSBUZXN0UmVwb3NpdG9yeVdhdGNoZXIuY3JlYXRlV2F0Y2hlcihmb2xkZXIpOwotCQl3YXRjaGVyLnBvbGwoKTsKLQotCQkvLyBXZSBzaG91bGQgaGF2ZSBhbiBlbXB0eSByZXBvc2l0b3J5IGJlY2F1c2Ugd2UgaGF2ZW4ndCBkb25lIGFueXRoaW5nIHlldAotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIDAsIHdhdGNoZXIuZ2V0SW5zdGFsbGFibGVVbml0cygpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMS4xIiwgMCwgd2F0Y2hlci5nZXRBcnRpZmFjdEtleXMoKS5sZW5ndGgpOwotCi0JCS8vIGNvcHkgdGhlIGZpcnN0IHNldCBvZiBkYXRhIHRvIHRoZSBmb2xkZXIgc28gaXQgaXMgZGlzY292ZXJlZCBhbmQgdGhlbiB2ZXJpZnkgdGhlIGNvbnRlbnRzCi0JCWNvcHkoIjIuMCIsIGJhc2VGb2xkZXIsIGZvbGRlcik7Ci0JCXdhdGNoZXIucG9sbCgpOwotCQlJQXJ0aWZhY3RLZXlbXSBrZXlzID0gd2F0Y2hlci5nZXRBcnRpZmFjdEtleXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgZmlsZSA9IHdhdGNoZXIuZ2V0QXJ0aWZhY3RGaWxlKGtleXNbaV0pLmdldEFic29sdXRlUGF0aCgpOwotCQkJYXNzZXJ0VHJ1ZSgiMi4xLiIgKyBmaWxlLCBmaWxlLnN0YXJ0c1dpdGgoZm9sZGVyLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKCIzLjAiLCAyLCB3YXRjaGVyLmdldEluc3RhbGxhYmxlVW5pdHMoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjMuMSIsIDIsIHdhdGNoZXIuZ2V0QXJ0aWZhY3RLZXlzKCkubGVuZ3RoKTsKLQotCQkvLyBjb3B5IHRoZSBzZWNvbmQgZGF0YSBzZXQgdG8gYmUgZGlzY292ZXJlZCBhbmQgdGhlbiB2ZXJpZnkgdGhlIG51bWJlciBvZiBlbnRyaWVzCi0JCWNvcHkoIjQuOTkiLCBiYXNlRm9sZGVyMiwgZm9sZGVyKTsKLQkJd2F0Y2hlci5wb2xsKCk7Ci0JCWFzc2VydEVxdWFscygiNS4wIiwgMywgd2F0Y2hlci5nZXRJbnN0YWxsYWJsZVVuaXRzKCkubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCI1LjEiLCAzLCB3YXRjaGVyLmdldEFydGlmYWN0S2V5cygpLmxlbmd0aCk7Ci0KLQkJLy8gcmVtb3ZlIHNvbWUgb2YgdGhlIGRhdGEgYW5kIHRoZW4gdmVyaWZ5IHRoZSBjb250ZW50cwotCQlyZW1vdmVDb250ZW50cyhiYXNlRm9sZGVyLCBmb2xkZXIpOwotCQl3YXRjaGVyLnBvbGwoKTsKLQkJYXNzZXJ0RXF1YWxzKCI2LjAiLCAxLCB3YXRjaGVyLmdldEluc3RhbGxhYmxlVW5pdHMoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoIjYuMSIsIDEsIHdhdGNoZXIuZ2V0QXJ0aWZhY3RLZXlzKCkubGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QnVuZGxlU2hhcGUoKSB7Ci0KLQkJLy8gbWFrZSBzdXJlIHdlIHJlbW92ZSB0aGlzIGZpbGUgYWZ0ZXIgd2UgZmluaXNoIHJ1bm5pbmcgdGhlIHRlc3RzCi0JCUZpbGUgZm9sZGVyID0gZ2V0VGVtcEZvbGRlcigpOwotCQl0b1JlbW92ZS5hZGQoZm9sZGVyKTsKLQotCQkvLyBjcmVhdGUgdGhlIHdhdGNoZXIKLQkJVGVzdFJlcG9zaXRvcnlXYXRjaGVyIHdhdGNoZXIgPSBUZXN0UmVwb3NpdG9yeVdhdGNoZXIuY3JlYXRlV2F0Y2hlcihmb2xkZXIpOwotCi0JCS8vIHRoaXMgZm9sZGVyIGNvbnRhaW5zIGEgamFyZWQgcGx1Z2luIGFuZCBhIGRpcmVjdG9yeSBwbHVnaW4KLQkJRmlsZSBiYXNlRm9sZGVyID0gZ2V0VGVzdERhdGEoIjAuOTkiLCAiL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxIik7Ci0JCWNvcHkoIjIuMCIsIGJhc2VGb2xkZXIsIGZvbGRlcik7Ci0JCXdhdGNoZXIucG9sbCgpOwotCi0JCS8vIHZlcmlmeSBtZXRhZGF0YQotCQlJSW5zdGFsbGFibGVVbml0IGphcmVkSVUgPSBudWxsOwotCQlJSW5zdGFsbGFibGVVbml0IGRpcmVjdG9yeUlVID0gbnVsbDsKLQkJSUluc3RhbGxhYmxlVW5pdFtdIGl1cyA9IHdhdGNoZXIuZ2V0SW5zdGFsbGFibGVVbml0cygpOwotCQlhc3NlcnRFcXVhbHMoIjMuMCIsIDIsIGl1cy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl1cy5sZW5ndGg7IGkrKykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IGl1c1tpXTsKLQkJCWlmIChpc1ppcHBlZChpdS5nZXRUb3VjaHBvaW50RGF0YSgpKSkgewotCQkJCWFzc2VydE51bGwoIjQuMCIsIGphcmVkSVUpOwotCQkJCWphcmVkSVUgPSBpdTsKLQkJCX0gZWxzZSB7Ci0JCQkJYXNzZXJ0TnVsbCgiNS4wIiwgZGlyZWN0b3J5SVUpOwotCQkJCWRpcmVjdG9yeUlVID0gaXU7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0VHJ1ZSgiNi4wIiwgZGlyZWN0b3J5SVUgIT0gbnVsbCAmJiBqYXJlZElVICE9IG51bGwpOwotCi0JCS8vIHZlcmlmeSBhcnRpZmFjdCBkZXNjcmlwdG9ycwotCQlJQXJ0aWZhY3REZXNjcmlwdG9yIGphcmVkRGVzY3JpcHRvciA9IG51bGw7Ci0JCUlBcnRpZmFjdERlc2NyaXB0b3IgZGlyZWN0b3J5RGVzY3JpcHRvciA9IG51bGw7Ci0JCUlBcnRpZmFjdEtleVtdIGtleXMgPSB3YXRjaGVyLmdldEFydGlmYWN0S2V5cygpOwotCQlhc3NlcnRFcXVhbHMoIjcuMCIsIDIsIGtleXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQXJ0aWZhY3RLZXkga2V5ID0ga2V5c1tpXTsKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHdhdGNoZXIuZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhrZXkpOwotCQkJYXNzZXJ0RXF1YWxzKCI4LjAiLCAxLCBkZXNjcmlwdG9ycy5sZW5ndGgpOwotCQkJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSAoQXJ0aWZhY3REZXNjcmlwdG9yKSBkZXNjcmlwdG9yc1swXTsKLQkJCVN0cmluZyBpc0ZvbGRlciA9IGRlc2NyaXB0b3IuZ2V0UmVwb3NpdG9yeVByb3BlcnR5KCJhcnRpZmFjdC5mb2xkZXIiKTsKLQkJCWlmIChCb29sZWFuLnZhbHVlT2YoaXNGb2xkZXIpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJYXNzZXJ0TnVsbCgiOS4wIiwgZGlyZWN0b3J5RGVzY3JpcHRvcik7Ci0JCQkJZGlyZWN0b3J5RGVzY3JpcHRvciA9IGRlc2NyaXB0b3JzWzBdOwotCQkJfSBlbHNlIHsKLQkJCQlhc3NlcnROdWxsKCIxMC4wIiwgamFyZWREZXNjcmlwdG9yKTsKLQkJCQlqYXJlZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yc1swXTsKLQkJCX0KLQkJfQotCQlhc3NlcnRUcnVlKCIxMS4wIiwgamFyZWREZXNjcmlwdG9yICE9IG51bGwgJiYgZGlyZWN0b3J5RGVzY3JpcHRvciAhPSBudWxsKTsKLQl9Ci0KLQkvKgotCSAqIFRlc3QgdG8gZW5zdXJlIHRoYXQgd2UgY29udmVydCBidW5kbGVzIHdpdGggRWNsaXBzZSAyLngtc3R5bGUgcGx1Z2luLnhtbCBmaWxlcyBpbnRvIAotCSAqIHByb3BlciBPU0dpIG1hbmlmZXN0IGZpbGVzIHNvIHRoZSBidW5kbGUgY2FuIGJlIGluc3RhbGxlZAotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3RQbHVnaW5YTUxDb252ZXJzaW9uKCkgewotCQkvLyB0ZXN0IHBsdWdpbi54bWwgaW4gYSBKQVInZCBidW5kbGUKLQkJRmlsZSBvbGRCdW5kbGVKQVIgPSBnZXRUZXN0RGF0YSgiMC4xIiwgIi90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlSkFSLmphciIpOwotCQkvLyB0ZXN0IHBsdWdpbi54bWwgaW4gYSBkaXJlY3RvcnktYmFzZWQgYnVuZGxlCi0JCUZpbGUgb2xkQnVuZGxlRGlyZWN0b3J5ID0gZ2V0VGVzdERhdGEoIjAuMiIsICIvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZURpcmVjdG9yeSIpOwotCQkvLyB0ZXN0IHBsdWdpbi54bWwgaW4gdGhlIHByZXNlbmNlIG9mIGFuIEFudCBNYW5pZmVzdCBmaWxlIGluIGEgSkFSJ2QgYnVuZGxlCi0JCUZpbGUgb2xkQnVuZGxlSkFSVHdvID0gZ2V0VGVzdERhdGEoIjAuMyIsICIvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZUpBUlR3by5qYXIiKTsKLQkJLy8gdGVzdCBwbHVnaW4ueG1sIGluIHRoZSBwcmVzZW5jZSBvZiBhbiBBbnQgTWFuaWZlc3QgZmlsZSBpbiBhIGRpcmVjdG9yeS1iYXNlZCBidW5kbGUKLQkJRmlsZSBvbGRCdW5kbGVEaXJlY3RvcnlUd28gPSBnZXRUZXN0RGF0YSgiMC40IiwgIi90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlRGlyZWN0b3J5VHdvIik7Ci0KLQkJLy8gY29weSB0aGUgdGVzdCBidW5kbGVzIG92ZXIgdG8gd2hlcmUgd2Ugd2lsbCBiZSB3YXRjaGluZyBpbiB0aGUgcmVwbyBsaXN0ZW5lcgotCQlGaWxlIGZvbGRlciA9IGdldFRlbXBGb2xkZXIoKTsKLQkJdG9SZW1vdmUuYWRkKGZvbGRlcik7Ci0JCWNvcHkoIjEuMCIsIG9sZEJ1bmRsZUpBUiwgbmV3IEZpbGUoZm9sZGVyLCBvbGRCdW5kbGVKQVIuZ2V0TmFtZSgpKSk7Ci0JCWNvcHkoIjEuMSIsIG9sZEJ1bmRsZUpBUlR3bywgbmV3IEZpbGUoZm9sZGVyLCBvbGRCdW5kbGVKQVJUd28uZ2V0TmFtZSgpKSk7Ci0JCWNvcHkoIjEuMiIsIG9sZEJ1bmRsZURpcmVjdG9yeSwgbmV3IEZpbGUoZm9sZGVyLCBvbGRCdW5kbGVEaXJlY3RvcnkuZ2V0TmFtZSgpKSk7Ci0JCWNvcHkoIjEuMyIsIG9sZEJ1bmRsZURpcmVjdG9yeVR3bywgbmV3IEZpbGUoZm9sZGVyLCBvbGRCdW5kbGVEaXJlY3RvcnlUd28uZ2V0TmFtZSgpKSk7Ci0KLQkJLy8gV2Ugc2hvdWxkIGhhdmUgYW4gZW1wdHkgcmVwb3NpdG9yeSBiZWNhdXNlIHdlIGhhdmVuJ3QgZG9uZSBhbnl0aGluZyB5ZXQKLQkJVGVzdFJlcG9zaXRvcnlXYXRjaGVyIHdhdGNoZXIgPSBUZXN0UmVwb3NpdG9yeVdhdGNoZXIuY3JlYXRlV2F0Y2hlcihmb2xkZXIpOwotCQlhc3NlcnRFcXVhbHMoIjIuMCIsIDAsIHdhdGNoZXIuZ2V0SW5zdGFsbGFibGVVbml0cygpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygiMi4xIiwgMCwgd2F0Y2hlci5nZXRBcnRpZmFjdEtleXMoKS5sZW5ndGgpOwotCi0JCXdhdGNoZXIucG9sbCgpOwotCQkvLyB0aGUgcmVwbyBzaG91bGQgaGF2ZSBhZGRlZCBhbGwgNCBidW5kbGVzCi0JCWFzc2VydEVxdWFscygiMy4wIiwgNCwgd2F0Y2hlci5nZXRJbnN0YWxsYWJsZVVuaXRzKCkubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKCIzLjEiLCA0LCB3YXRjaGVyLmdldEFydGlmYWN0S2V5cygpLmxlbmd0aCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZGlyZWN0b3J5d2F0Y2hlci9UZXN0UmVwb3NpdG9yeVdhdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvcnl3YXRjaGVyL1Rlc3RSZXBvc2l0b3J5V2F0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjE2MTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9kaXJlY3Rvcnl3YXRjaGVyL1Rlc3RSZXBvc2l0b3J5V2F0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5kaXJlY3Rvcnl3YXRjaGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdERlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5EaXJlY3RvcnlXYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5SZXBvc2l0b3J5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKioKLSAqIEhlbHBlciB0ZXN0IGNsYXNzIHdoaWNoIHdyYXBzIGEgcmVwb3NpdG9yeSBsaXN0ZW5lci4KLSAqLwotY2xhc3MgVGVzdFJlcG9zaXRvcnlXYXRjaGVyIGV4dGVuZHMgRGlyZWN0b3J5V2F0Y2hlciB7Ci0KLQlwcml2YXRlIFJlcG9zaXRvcnlMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qCi0JICogQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgdGVzdCBkaXJlY3Rvcnkgd2F0Y2hlciBjbGFzcyB3aGljaCB3aWxsIGxpc3RlbiBvbiB0aGUgZ2l2ZW4gZm9sZGVyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVGVzdFJlcG9zaXRvcnlXYXRjaGVyIGNyZWF0ZVdhdGNoZXIoRmlsZSBmb2xkZXIpIHsKLQkJUmVwb3NpdG9yeUxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFJlcG9zaXRvcnlMaXN0ZW5lcihUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSwgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LmdldFVuaXF1ZVN0cmluZygpLCBudWxsLCBmYWxzZSk7Ci0JCURpY3Rpb25hcnkgcHJvcHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXByb3BzLnB1dChEaXJlY3RvcnlXYXRjaGVyLkRJUiwgZm9sZGVyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJcHJvcHMucHV0KERpcmVjdG9yeVdhdGNoZXIuUE9MTCwgIjUwMCIpOwotCQlUZXN0UmVwb3NpdG9yeVdhdGNoZXIgcmVzdWx0ID0gbmV3IFRlc3RSZXBvc2l0b3J5V2F0Y2hlcihwcm9wcywgVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkpOwotCQlyZXN1bHQuYWRkTGlzdGVuZXIobGlzdGVuZXIpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogQ29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcy4KLQkgKi8KLQlwcml2YXRlIFRlc3RSZXBvc2l0b3J5V2F0Y2hlcihEaWN0aW9uYXJ5IHByb3BzLCBCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIocHJvcHMsIGNvbnRleHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5EaXJlY3RvcnlXYXRjaGVyI2FkZExpc3RlbmVyKG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3J5d2F0Y2hlci5EaXJlY3RvcnlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkTGlzdGVuZXIoUmVwb3NpdG9yeUxpc3RlbmVyIHJlcG9MaXN0ZW5lcikgewotCQlzdXBlci5hZGRMaXN0ZW5lcihyZXBvTGlzdGVuZXIpOwotCQl0aGlzLmxpc3RlbmVyID0gcmVwb0xpc3RlbmVyOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIGFsbCB0aGUgSVVzIGtub3duIHRvIHRoZSBtZXRhZGF0YSByZXBvc2l0b3J5IHRoaXMgd2F0Y2hlcidzIGxpc3RlbmVyLgotCSAqLwotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0W10gZ2V0SW5zdGFsbGFibGVVbml0cygpIHsKLQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0W10pIGxpc3RlbmVyLmdldE1ldGFkYXRhUmVwb3NpdG9yeSgpLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS50b0FycmF5KElJbnN0YWxsYWJsZVVuaXQuY2xhc3MpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIGFydGlmYWN0IGtleXMga25vd24gdG8gdGhpcyBsaXN0ZW5lcidzIHJlcG9zaXRvcnkuCi0JICovCi0JcHVibGljIElBcnRpZmFjdEtleVtdIGdldEFydGlmYWN0S2V5cygpIHsKLQkJcmV0dXJuIGxpc3RlbmVyLmdldEFydGlmYWN0UmVwb3NpdG9yeSgpLmdldEFydGlmYWN0S2V5cygpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBsaXN0IG9mIGFydGlmYWN0IGRlc2NyaXB0b3JzIGtub3duIHRvIHRoaXMgbGlzdGVuZXIncyByZXBvc2l0b3J5LgotCSAqLwotCXB1YmxpYyBJQXJ0aWZhY3REZXNjcmlwdG9yW10gZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCXJldHVybiBsaXN0ZW5lci5nZXRBcnRpZmFjdFJlcG9zaXRvcnkoKS5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKGtleSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBhcnRpZmFjdCBrZXkuCi0JICovCi0JcHVibGljIEZpbGUgZ2V0QXJ0aWZhY3RGaWxlKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJcmV0dXJuICgoSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkpIGxpc3RlbmVyLmdldEFydGlmYWN0UmVwb3NpdG9yeSgpKS5nZXRBcnRpZmFjdEZpbGUoa2V5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2Rvd25sb2FkL0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZG93bmxvYWQvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM1ZTA1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZG93bmxvYWQvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmRvd25sb2FkOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUGVyZm9ybXMgYWxsIGF1dG9tYXRlZCBkb3dubG9hZCBtYW5hZ2VyIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERvd25sb2FkTWFuYWdlclRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZG93bmxvYWQvRG93bmxvYWRNYW5hZ2VyVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2Rvd25sb2FkL0Rvd25sb2FkTWFuYWdlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg0Y2E1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZG93bmxvYWQvRG93bmxvYWRNYW5hZ2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZG93bmxvYWQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZS5Eb3dubG9hZE1hbmFnZXI7Ci0KLS8qKgotICogU2ltcGxlIHRlc3RzIG9mIHtAbGluayBEb3dubG9hZE1hbmFnZXJ9IEFQSS4KLSAqLwotcHVibGljIGNsYXNzIERvd25sb2FkTWFuYWdlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShEb3dubG9hZE1hbmFnZXJUZXN0LmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyBpbnZvY2F0aW9uIG9mIERvd25sb2FkTWFuYWdlciB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG93bmxvYWQuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgewotCQlEb3dubG9hZE1hbmFnZXIgbWFuYWdlciA9IG5ldyBEb3dubG9hZE1hbmFnZXIobnVsbCk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gbWFuYWdlci5zdGFydChudWxsKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgcmVzdWx0LmlzT0soKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZW1iZWRkZWRlcXVpbm94L0VtYmVkZGVkRXF1aW5veC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VtYmVkZGVkZXF1aW5veC9FbWJlZGRlZEVxdWlub3guamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmZmYxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZW1iZWRkZWRlcXVpbm94L0VtYmVkZGVkRXF1aW5veC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZW1iZWRkZWRlcXVpbm94OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi0vKgotICogVGhpcyBjbGFzcyBhc3N1bWVzIHRoZSBidW5kbGUncyBjbGFzc2xvYWRlciBvbmx5IGhhcyBhY2Nlc3MgdG8gb3JnLm9zZ2kuZnJhbWV3b3JrCi0gKiBmcm9tIHRoZSBob3N0aW5nIGZyYW1ld29yay4gIEFueSBtb3JlIGFjY2VzcyBjb3VsZCByZXN1bHQgaW4gQ2xhc3NWZXJpZmllciBlcnJvcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbWJlZGRlZEVxdWlub3ggewotCXByaXZhdGUgZmluYWwgTWFwIGZyYW1ld29ya1Byb3BlcnRpZXM7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBmcmFtZXdvcmtBcmdzOwotCXByaXZhdGUgQ2xhc3MgZWNsaXBzZVN0YXJ0ZXJDbGF6ejsKLQlwcml2YXRlIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIFVSTFtdIGZyYW1ld29ya0NsYXNzUGF0aDsKLQotCXB1YmxpYyBFbWJlZGRlZEVxdWlub3goTWFwIGZyYW1ld29ya1Byb3BlcnRpZXMsIFN0cmluZ1tdIGZyYW1ld29ya0FyZ3MsIFVSTFtdIGZyYW1ld29ya0NsYXNzUGF0aCkgewotCQl0aGlzLmZyYW1ld29ya1Byb3BlcnRpZXMgPSBmcmFtZXdvcmtQcm9wZXJ0aWVzOwotCQl0aGlzLmZyYW1ld29ya0FyZ3MgPSBmcmFtZXdvcmtBcmdzOwotCQl0aGlzLmZyYW1ld29ya0NsYXNzUGF0aCA9IGZyYW1ld29ya0NsYXNzUGF0aDsKLQl9Ci0KLQlwdWJsaWMgQnVuZGxlQ29udGV4dCBzdGFydEZyYW1ld29yaygpIHsKLQkJU3lzdGVtLnNldFByb3BlcnR5KCJvc2dpLmZyYW1ld29yay51c2VTeXN0ZW1Qcm9wZXJ0aWVzIiwgImZhbHNlIik7Ci0JCXRyeSB7Ci0JCQlVUkxDbGFzc0xvYWRlciBmcmFtZXdvcmtMb2FkZXIgPSBuZXcgRnJhbWV3b3JrQ2xhc3NMb2FkZXIoZnJhbWV3b3JrQ2xhc3NQYXRoLCB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JCQllY2xpcHNlU3RhcnRlckNsYXp6ID0gZnJhbWV3b3JrTG9hZGVyLmxvYWRDbGFzcygib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3IuRWNsaXBzZVN0YXJ0ZXIiKTsKLQotCQkJTWV0aG9kIHNldEluaXRpYWxQcm9wZXJ0aWVzID0gZWNsaXBzZVN0YXJ0ZXJDbGF6ei5nZXRNZXRob2QoInNldEluaXRpYWxQcm9wZXJ0aWVzIiwgbmV3IENsYXNzW10ge01hcC5jbGFzc30pOyAvLyROT04tTkxTLTEkCi0JCQlzZXRJbml0aWFsUHJvcGVydGllcy5pbnZva2UobnVsbCwgbmV3IE9iamVjdFtdIHtmcmFtZXdvcmtQcm9wZXJ0aWVzfSk7Ci0KLQkJCU1ldGhvZCBydW5NZXRob2QgPSBlY2xpcHNlU3RhcnRlckNsYXp6LmdldE1ldGhvZCgic3RhcnR1cCIsIG5ldyBDbGFzc1tdIHtTdHJpbmdbXS5jbGFzcywgUnVubmFibGUuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQkJY29udGV4dCA9IChCdW5kbGVDb250ZXh0KSBydW5NZXRob2QuaW52b2tlKG51bGwsIG5ldyBPYmplY3RbXSB7ZnJhbWV3b3JrQXJncywgbnVsbH0pOwotCQl9IGNhdGNoIChUaHJvd2FibGUgdCkgewotCQkJaWYgKHQgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKQotCQkJCXRocm93IChSdW50aW1lRXhjZXB0aW9uKSB0OwotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXRyeSB7Ci0JCQlNZXRob2Qgc2h1dGRvd25NZXRob2QgPSBlY2xpcHNlU3RhcnRlckNsYXp6LmdldE1ldGhvZCgic2h1dGRvd24iLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJc2h1dGRvd25NZXRob2QuaW52b2tlKG51bGwsIG51bGwpOwotCi0JCX0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0JCQlpZiAodCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pCi0JCQkJdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIHQ7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0KTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBGcmFtZXdvcmtDbGFzc0xvYWRlciBleHRlbmRzIFVSTENsYXNzTG9hZGVyIHsKLQkJQ2xhc3NMb2FkZXIgZW1iZWRkZWRCdW5kbGVMb2FkZXI7Ci0KLQkJcHVibGljIEZyYW1ld29ya0NsYXNzTG9hZGVyKFVSTFtdIHVybHMsIENsYXNzTG9hZGVyIHBhcmVudCkgewotCQkJc3VwZXIodXJscywgbnVsbCk7Ci0JCQl0aGlzLmVtYmVkZGVkQnVuZGxlTG9hZGVyID0gcGFyZW50OwotCQl9Ci0KLQkJcHJvdGVjdGVkIENsYXNzIGZpbmRDbGFzcyhTdHJpbmcgbmFtZSkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgib3JnLm9zZ2kuZnJhbWV3b3JrLiIpKQotCQkJCS8vIFRPRE8gdGhpcyBzaG91bGQgY2FsbCBmaW5kQ2xhc3M7IGJ1dCB0aGVuIGhhdmUgdG8gdXNlIHJlZmxlY3Rpb24hIQotCQkJCXJldHVybiBlbWJlZGRlZEJ1bmRsZUxvYWRlci5sb2FkQ2xhc3MobmFtZSk7Ci0JCQlyZXR1cm4gc3VwZXIuZmluZENsYXNzKG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIFVSTCBmaW5kUmVzb3VyY2UoU3RyaW5nIG5hbWUpIHsKLQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIm9yZy9vc2dpL2ZyYW1ld29yay8iKSkKLQkJCQkvLyBUT0RPIHRoaXMgc2hvdWxkIGNhbGwgZmluZFJlc291cmNlOyBidXQgdGhlbiBoYXZlIHRvIHVzZSByZWZsZWN0aW9uISEKLQkJCQlyZXR1cm4gZW1iZWRkZWRCdW5kbGVMb2FkZXIuZ2V0UmVzb3VyY2UobmFtZSk7Ci0JCQlyZXR1cm4gc3VwZXIuZmluZFJlc291cmNlKG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIEVudW1lcmF0aW9uIGZpbmRSZXNvdXJjZXMoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlpZiAobmFtZS5zdGFydHNXaXRoKCJvcmcvb3NnaS9mcmFtZXdvcmsvIikpCi0JCQkJLy8gVE9ETyB0aGlzIHNob3VsZCBjYWxsIGZpbmRSZXNvdXJjZXM7IGJ1dCB0aGVuIGhhdmUgdG8gdXNlIHJlZmxlY3Rpb24hIQotCQkJCXJldHVybiBlbWJlZGRlZEJ1bmRsZUxvYWRlci5nZXRSZXNvdXJjZXMobmFtZSk7Ci0JCQlyZXR1cm4gc3VwZXIuZmluZFJlc291cmNlcyhuYW1lKTsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VuZ2luZS9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VuZ2luZS9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmRkYjU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmVuZ2luZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay4qOwotCi0vKioKLSAqIFBlcmZvcm1zIGFsbCBlbmdpbmUgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRW5naW5lVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQaGFzZVNldFRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGhhc2VUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb2ZpbGVUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFByb2ZpbGVSZWdpc3RyeVRlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVG91Y2hwb2ludFRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZW5naW5lL0VuZ2luZVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvRW5naW5lVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzhiZDI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvRW5naW5lVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmVuZ2luZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLnBoYXNlcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotLyoqCi0gKiBTaW1wbGUgdGVzdCBvZiB0aGUgZW5naW5lIEFQSS4KLSAqIAotICogTm90ZToKLSAqIEN1cnJlbnRseSB5b3UgTVVTVCBoYXZlIHByZXZpb3VzbHkgZ2VuZXJhdGVkIG1ldGFkYXRhIGZyb20gYSAzLjMuMSBpbnN0YWxsLgotICogVGhlcmUgYXJlIG9yZGVyaW5nIGRlcGVuZGVuY2llcyBmb3IgdGhlIHRlc3RzIHRlbXBvcmFyaWx5IAotICovCi1wdWJsaWMgY2xhc3MgRW5naW5lVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOUEVQaGFzZSBleHRlbmRzIFBoYXNlIHsKLQkJcHJvdGVjdGVkIE5QRVBoYXNlKGludCB3ZWlnaHQpIHsKLQkJCXN1cGVyKCJOUEUiLCAxKTsKLQkJfQotCi0JCXByb3RlY3RlZCBQcm92aXNpb25pbmdBY3Rpb25bXSBnZXRBY3Rpb25zKE9wZXJhbmQgb3BlcmFuZCkgewotCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBOUEVQaGFzZVNldCBleHRlbmRzIFBoYXNlU2V0IHsKLQkJcHVibGljIE5QRVBoYXNlU2V0KCkgewotCQkJc3VwZXIobmV3IFBoYXNlW10ge25ldyBDb2xsZWN0KDEwMCksIG5ldyBVbmNvbmZpZ3VyZSgxMCksIG5ldyBVbmluc3RhbGwoNTApLCBuZXcgUHJvcGVydHkoMSksIG5ldyBDaGVja1RydXN0KDEwKSwgbmV3IEluc3RhbGwoNTApLCBuZXcgQ29uZmlndXJlKDEwKSwgbmV3IE5QRVBoYXNlKDEpfSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNlcnZpY2VSZWZlcmVuY2UgZW5naW5lUmVmOwotCXByaXZhdGUgSUVuZ2luZSBlbmdpbmU7Ci0JcHJpdmF0ZSBGaWxlIHRlc3RQcm92aXNpb25pbmc7Ci0KLQlwdWJsaWMgRW5naW5lVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQkJdGVzdFByb3Zpc2lvbmluZyA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSwgInRlc3RQcm92aXNpb2luaW5nIik7Ci0JCWRlbGV0ZURpcmVjdG9yeSh0ZXN0UHJvdmlzaW9uaW5nKTsKLQkJdGVzdFByb3Zpc2lvbmluZy5ta2RpcigpOwotCX0KLQotCXB1YmxpYyBFbmdpbmVUZXN0KCkgewotCQl0aGlzKCIiKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRlbGV0ZURpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkgewotCQlpZiAoZGlyZWN0b3J5LmV4aXN0cygpICYmIGRpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBkaXJlY3RvcnkubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZpbGVzW2ldLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQkJZGVsZXRlRGlyZWN0b3J5KGZpbGVzW2ldKTsKLQkJCQl9IGVsc2UgewotCQkJCQlmaWxlc1tpXS5kZWxldGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRpcmVjdG9yeS5kZWxldGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQllbmdpbmVSZWYgPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKElFbmdpbmUuU0VSVklDRV9OQU1FKTsKLQkJZW5naW5lID0gKElFbmdpbmUpIFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UoZW5naW5lUmVmKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQllbmdpbmUgPSBudWxsOwotCQlUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2UoZW5naW5lUmVmKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFByb2ZpbGUoKSB7Ci0KLQkJSVByb2ZpbGUgcHJvZmlsZSA9IG51bGw7Ci0JCVBoYXNlU2V0IHBoYXNlU2V0ID0gbmV3IERlZmF1bHRQaGFzZVNldCgpOwotCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10gb3BlcmFuZHMgPSBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIHt9OwotCQl0cnkgewotCQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgcGhhc2VTZXQsIG9wZXJhbmRzLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsUGhhc2VTZXQoKSB7Ci0KLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoInRlc3QiKTsKLQkJUGhhc2VTZXQgcGhhc2VTZXQgPSBudWxsOwotCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10gb3BlcmFuZHMgPSBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIHt9OwotCQl0cnkgewotCQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgcGhhc2VTZXQsIG9wZXJhbmRzLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROdWxsT3BlcmFuZHMoKSB7Ci0KLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoInRlc3QiKTsKLQkJUGhhc2VTZXQgcGhhc2VTZXQgPSBuZXcgRGVmYXVsdFBoYXNlU2V0KCk7Ci0JCUluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSBvcGVyYW5kcyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQllbmdpbmUucGVyZm9ybShwcm9maWxlLCBwaGFzZVNldCwgb3BlcmFuZHMsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLQkJCS8vZXhwZWN0ZWQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eU9wZXJhbmRzKCkgewotCi0JCUlQcm9maWxlIHByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJ0ZXN0Iik7Ci0JCVBoYXNlU2V0IHBoYXNlU2V0ID0gbmV3IERlZmF1bHRQaGFzZVNldCgpOwotCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10gb3BlcmFuZHMgPSBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIHt9OwotCQlJU3RhdHVzIHJlc3VsdCA9IGVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIHBoYXNlU2V0LCBvcGVyYW5kcywgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWFzc2VydFRydWUocmVzdWx0LmlzT0soKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5UGhhc2VTZXQoKSB7Ci0KLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoInRlc3RFbXB0eVBoYXNlU2V0Iik7Ci0JCVBoYXNlU2V0IHBoYXNlU2V0ID0gbmV3IFBoYXNlU2V0KG5ldyBQaGFzZVtdIHt9KSB7Ci0JCQkvLyBlbXB0eSBQaGFzZVNldAotCQl9OwotCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wID0gbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmQoY3JlYXRlUmVzb2x2ZWRJVShjcmVhdGVJVSgibmFtZSIpKSwgbnVsbCk7Ci0JCUluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSBvcGVyYW5kcyA9IG5ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10ge29wfTsKLQkJSVN0YXR1cyByZXN1bHQgPSBlbmdpbmUucGVyZm9ybShwcm9maWxlLCBwaGFzZVNldCwgb3BlcmFuZHMsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5pc09LKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtU2luZ2xlTnVsbE9wZXJhbmQoKSB7Ci0JCXRyeSB7Ci0JCQluZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZChudWxsLCBudWxsKTsKLQkJCWZhaWwoIlNob3VsZCBub3QgYWxsb3cgbnVsbCBvcGVyYW5kIik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBlcmZvcm1JbnN0YWxsT1NHaUZyYW1ld29yaygpIHsKLQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwcm9wZXJ0aWVzLnB1dChJUHJvZmlsZS5QUk9QX0lOU1RBTExfRk9MREVSLCB0ZXN0UHJvdmlzaW9uaW5nLmdldEFic29sdXRlUGF0aCgpKTsKLQotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgidGVzdFBlcmZvcm1JbnN0YWxsT1NHaUZyYW1ld29yayIsIG51bGwsIHByb3BlcnRpZXMpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZ2V0SW5zdGFsbGFibGVVbml0cyhwcm9maWxlKTsgaXQuaGFzTmV4dCgpOykgewotCQkJUGhhc2VTZXQgcGhhc2VTZXQgPSBuZXcgRGVmYXVsdFBoYXNlU2V0KCk7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGRvb21lZCA9IChJSW5zdGFsbGFibGVVbml0KSBpdC5uZXh0KCk7Ci0JCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10gb3BlcmFuZHMgPSBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIHtuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZChjcmVhdGVSZXNvbHZlZElVKGRvb21lZCksIG51bGwpfTsKLQkJCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIHBoYXNlU2V0LCBvcGVyYW5kcywgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCX0KLQkJUGhhc2VTZXQgcGhhc2VTZXQgPSBuZXcgRGVmYXVsdFBoYXNlU2V0KCk7Ci0KLQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIG9wZXJhbmRzID0gbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSB7bmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmQobnVsbCwgY3JlYXRlT1NHaUlVKCkpfTsKLQkJSVN0YXR1cyByZXN1bHQgPSBlbmdpbmUucGVyZm9ybShwcm9maWxlLCBwaGFzZVNldCwgb3BlcmFuZHMsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5pc09LKCkpOwotCQlJdGVyYXRvciBpdXMgPSBnZXRJbnN0YWxsYWJsZVVuaXRzKHByb2ZpbGUpOwotCQlhc3NlcnRUcnVlKGl1cy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtVXBkYXRlT1NHaUZyYW1ld29yaygpIHsKLQotCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXByb3BlcnRpZXMucHV0KElQcm9maWxlLlBST1BfSU5TVEFMTF9GT0xERVIsIHRlc3RQcm92aXNpb25pbmcuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgidGVzdFBlcmZvcm1VcGRhdGVPU0dpRnJhbWV3b3JrIiwgbnVsbCwgcHJvcGVydGllcyk7Ci0JCVBoYXNlU2V0IHBoYXNlU2V0ID0gbmV3IERlZmF1bHRQaGFzZVNldCgpOwotCQlJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10gb3BlcmFuZHMgPSBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIHtuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZChjcmVhdGVPU0dpSVUoKSwgY3JlYXRlT1NHaUlVKCkpfTsKLQkJSVN0YXR1cyByZXN1bHQgPSBlbmdpbmUucGVyZm9ybShwcm9maWxlLCBwaGFzZVNldCwgb3BlcmFuZHMsIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5pc09LKCkpOwotCQlJdGVyYXRvciBpdXMgPSBnZXRJbnN0YWxsYWJsZVVuaXRzKHByb2ZpbGUpOwotCQlhc3NlcnRUcnVlKGl1cy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtVW5pbnN0YWxsT1NHaUZyYW1ld29yaygpIHsKLQotCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXByb3BlcnRpZXMucHV0KElQcm9maWxlLlBST1BfSU5TVEFMTF9GT0xERVIsIHRlc3RQcm92aXNpb25pbmcuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCi0JCUlQcm9maWxlIHByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJ0ZXN0UGVyZm9ybVVuaW5zdGFsbE9TR2lGcmFtZXdvcmsiLCBudWxsLCBwcm9wZXJ0aWVzKTsKLQkJUGhhc2VTZXQgcGhhc2VTZXQgPSBuZXcgRGVmYXVsdFBoYXNlU2V0KCk7Ci0JCUluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSBvcGVyYW5kcyA9IG5ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10ge25ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKGNyZWF0ZU9TR2lJVSgpLCBudWxsKX07Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgcGhhc2VTZXQsIG9wZXJhbmRzLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0VHJ1ZShyZXN1bHQuaXNPSygpKTsKLQkJYXNzZXJ0RW1wdHlQcm9maWxlKHByb2ZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtUm9sbGJhY2soKSB7Ci0KLQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwcm9wZXJ0aWVzLnB1dChJUHJvZmlsZS5QUk9QX0lOU1RBTExfRk9MREVSLCB0ZXN0UHJvdmlzaW9uaW5nLmdldEFic29sdXRlUGF0aCgpKTsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoInRlc3RQZXJmb3JtUm9sbGJhY2siLCBudWxsLCBwcm9wZXJ0aWVzKTsKLQkJUGhhc2VTZXQgcGhhc2VTZXQgPSBuZXcgRGVmYXVsdFBoYXNlU2V0KCk7Ci0KLQkJSXRlcmF0b3IgaXVzID0gZ2V0SW5zdGFsbGFibGVVbml0cyhwcm9maWxlKTsKLQkJYXNzZXJ0RmFsc2UoaXVzLmhhc05leHQoKSk7Ci0KLQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIG9wZXJhbmRzID0gbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSB7bmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmQobnVsbCwgY3JlYXRlT1NHaUlVKCkpLCBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZChudWxsLCBjcmVhdGVCYWRJVSgpKX07Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgcGhhc2VTZXQsIG9wZXJhbmRzLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0RmFsc2UocmVzdWx0LmlzT0soKSk7Ci0JCWl1cyA9IGdldEluc3RhbGxhYmxlVW5pdHMocHJvZmlsZSk7Ci0JCWFzc2VydEZhbHNlKGl1cy5oYXNOZXh0KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtUm9sbGJhY2tPbkVycm9yKCkgewotCi0JCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9JTlNUQUxMX0ZPTERFUiwgdGVzdFByb3Zpc2lvbmluZy5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJ0ZXN0UGVyZm9ybVJvbGxiYWNrT25FcnJvciIsIG51bGwsIHByb3BlcnRpZXMpOwotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBOUEVQaGFzZVNldCgpOwotCi0JCUl0ZXJhdG9yIGl1cyA9IGdldEluc3RhbGxhYmxlVW5pdHMocHJvZmlsZSk7Ci0JCWFzc2VydEZhbHNlKGl1cy5oYXNOZXh0KCkpOwotCi0JCUluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSBvcGVyYW5kcyA9IG5ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10ge25ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKG51bGwsIGNyZWF0ZU9TR2lJVSgpKX07Ci0JCUlTdGF0dXMgcmVzdWx0ID0gZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgcGhhc2VTZXQsIG9wZXJhbmRzLCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0RmFsc2UocmVzdWx0LmlzT0soKSk7Ci0JCWl1cyA9IGdldEluc3RhbGxhYmxlVW5pdHMocHJvZmlsZSk7Ci0JCWFzc2VydEZhbHNlKGl1cy5oYXNOZXh0KCkpOwotCX0KLQotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVPU0dpSVUoKSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlkZXNjcmlwdGlvbi5zZXRJZCgib3JnLmVjbGlwc2Uub3NnaSIpOwotCQlkZXNjcmlwdGlvbi5zZXRWZXJzaW9uKG5ldyBWZXJzaW9uKCIzLjMuMS5SMzN4X3YyMDA3MDgyOCIpKTsKLQkJZGVzY3JpcHRpb24uc2V0VG91Y2hwb2ludFR5cGUoQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LlRPVUNIUE9JTlRfT1NHSSk7Ci0JCU1hcCB0b3VjaHBvaW50RGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCVN0cmluZyBtYW5pZmVzdCA9ICJNYW5pZmVzdC1WZXJzaW9uOiAxLjBcclxuIiArICJCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5jb3JlLlN5c3RlbUJ1bmRsXHJcbiIgKyAiIGVBY3RpdmF0b3JcclxuIiArICJCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQsT1NHaS9NaW5pbXVtLTEuMFxyXG4iICsgIkV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5vc2dpLmV2ZW50O3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLlxyXG4iICsgIiBmcmFtZXdvcmsuY29uc29sZTt2ZXJzaW9uPVwiMS4wXCIsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuZXZlbnRtZ3I7dlxyXG4iICsgIiBlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5sb2c7dmVyc2lvbj1cIjEuMFwiLG9yZy5lY2xpcHNlXHJcbiIgKyAiIC5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uO3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGViXHJcbiIgKyAiIHVnO3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQ7dmVyc2lvbj1cIjEuMFwiLG9cclxuIiArICIgcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UubG9jYWxpemF0aW9uO3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLnNcclxuIiArICIgZXJ2aWNlLnBsdWdpbmNvbnZlcnNpb247dmVyc2lvbj1cIjEuMFwiLG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZcclxuIgotCQkJCSsgIiBlcjt2ZXJzaW9uPVwiMS4xXCIsb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJ1bm5hYmxlO3ZlcnNpb249XCIxLjBcIixvcmcuXHJcbiIgKyAiIGVjbGlwc2Uub3NnaS5zZXJ2aWNlLnVybGNvbnZlcnNpb247dmVyc2lvbj1cIjEuMFwiLG9yZy5lY2xpcHNlLm9zZ2kuc3RvXHJcbiIgKyAiIHJhZ2VtYW5hZ2VyO3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj1cIjEuMFwiLG9yZy5vc2dcclxuIiArICIgaS5mcmFtZXdvcms7dmVyc2lvbj1cIjEuM1wiLG9yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbjt2ZXJzaW9uPVwiMS4wXHJcbiIgKyAiIFwiLG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluO3ZlcnNpb249XCIxLjJcIixvcmcub3NnaS5zZXJ2aWNlLnBlcm1pc1xyXG4iICsgIiBzaW9uYWRtaW47dmVyc2lvbj1cIjEuMlwiLG9yZy5vc2dpLnNlcnZpY2Uuc3RhcnRsZXZlbDt2ZXJzaW9uPVwiMS4wXCIsb3JnXHJcbiIgKyAiIC5vc2dpLnNlcnZpY2UudXJsO3ZlcnNpb249XCIxLjBcIixvcmcub3NnaS51dGlsLnRyYWNrZXI7dmVyc2lvbj1cIjEuMy4yXCJcclxuIiArICIgLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdG9yO3gtZnJpZW5kczo9XCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbVxyXG4iICsgIiBlXCIsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmludGVybmFsLmFkYXB0b3I7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsXHJcbiIKLQkJCQkrICIgaXBzZS5jb3JlLnJ1bnRpbWUuaW50ZXJuYWwuc3RhdHM7eC1mcmllbmRzOj1cIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZVxyXG4iICsgIiBcIixvcmcuZWNsaXBzZS5vc2dpLmJhc2VhZGFwdG9yO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5iYXNlXHJcbiIgKyAiIGFkYXB0b3IuYnVuZGxlZmlsZTt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuYmFzZWFkYXB0b3IuaG9va1xyXG4iICsgIiBzO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5iYXNlYWRhcHRvci5sb2FkZXI7eC1pbnRlcm5hbDo9dHJcclxuIiArICIgdWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuYWRhcHRvcjt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zXHJcbiIgKyAiIGdpLmZyYW1ld29yay5kZWJ1Zzt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmludGVyblxyXG4iICsgIiBhbC5jb3JlO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWwucHJvdG9jb2xcclxuIiArICIgO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWwucHJvdG9jb2wuYnVuZGxlXHJcbiIgKyAiIGVudHJ5O3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWwucHJvdG9jb2wuYlxyXG4iCi0JCQkJKyAiIHVuZGxlcmVzb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5wclxyXG4iICsgIiBvdG9jb2wucmVmZXJlbmNlO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWxcclxuIiArICIgLnJlbGlhYmxlZmlsZTt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmxhdW5jaGVyO3gtXHJcbiIgKyAiIGludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZVxyXG4iICsgIiBjbGlwc2Uub3NnaS5pbnRlcm5hbC5iYXNlYWRhcHRvcjt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuaW5cclxuIiArICIgdGVybmFsLm1vZHVsZTt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwucHJvZmlsZTt4LWluXHJcbiIgKyAiIHRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnJlc29sdmVyO3gtaW50ZXJuYWw6PXRydWUsb3JnLlxyXG4iICsgIiBlY2xpcHNlLm9zZ2kuaW50ZXJuYWwudmVyaWZpZXI7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmludGVcclxuIiArICIgcm5hbC5wcm92aXNpb25hbC52ZXJpZmllcjt4LWZyaWVuZHM6PVwib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUsb3JnLmVjbFxyXG4iICsgIiBpcHNlLnVpLndvcmtiZW5jaFwiXHJcbiIgKyAiQnVuZGxlLVZlcnNpb246IDMuMy4wLnYyMDA2MDkyNVxyXG4iCi0JCQkJKyAiRWNsaXBzZS1TeXN0ZW1CdW5kbGU6IHRydWVcclxuIiArICJCdW5kbGUtQ29weXJpZ2h0OiAlY29weXJpZ2h0XHJcbiIgKyAiQnVuZGxlLU5hbWU6ICVzeXN0ZW1CdW5kbGVcclxuIiArICJCdW5kbGUtRGVzY3JpcHRpb246ICVzeXN0ZW1CdW5kbGVcclxuIiArICJCdW5kbGUtRG9jVXJsOiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnXHJcbiIgKyAiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMlxyXG4iICsgIkV4cG9ydC1TZXJ2aWNlOiBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbi5QYWNrYWdlQWRtaW4sb3JnLm9zZ2kuc2VcclxuIiArICIgcnZpY2UucGVybWlzc2lvbmFkbWluLlBlcm1pc3Npb25BZG1pbixvcmcub3NnaS5zZXJ2aWNlLnN0YXJ0bGV2ZWwuU3RhXHJcbiIgKyAiIHJ0TGV2ZWwsb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYnVnLkRlYnVnT3B0aW9uc1xyXG4iICsgIkJ1bmRsZS1WZW5kb3I6ICVlY2xpcHNlLm9yZ1xyXG4iICsgIk1haW4tQ2xhc3M6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdG9yLkVjbGlwc2VTdGFydGVyXHJcbiIgKyAiQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uub3NnaTsgc2luZ2xldG9uOj10cnVlXHJcbiIgKyAiQnVuZGxlLUxvY2FsaXphdGlvbjogc3lzdGVtYnVuZGxlXHJcbiIgKyAiRWNsaXBzZS1FeHRlbnNpYmxlQVBJOiB0cnVlXHJcbiIgKyAiXHJcbiIgKyAiIjsKLQkJdG91Y2hwb2ludERhdGEucHV0KCJtYW5pZmVzdCIsIG1hbmlmZXN0KTsKLQkJLy90b3VjaHBvaW50RGF0YS5wdXQoImluc3RhbGwiLCAiaW5zdGFsbEJ1bmRsZShidW5kbGU6JHthcnRpZmFjdH0pOyIpOwotCQkvL3RvdWNocG9pbnREYXRhLnB1dCgidW5pbnN0YWxsIiwgInVuaW5zdGFsbEJ1bmRsZShidW5kbGU6JHthcnRpZmFjdH0pOyIpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudFtdIGN1cyA9IG5ldyBJSW5zdGFsbGFibGVVbml0RnJhZ21lbnRbMV07Ci0JCUluc3RhbGxhYmxlVW5pdEZyYWdtZW50RGVzY3JpcHRpb24gZGVzYyA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCWRlc2MuYWRkVG91Y2hwb2ludERhdGEoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKHRvdWNocG9pbnREYXRhKSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCBmcmFnbWVudCA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXRGcmFnbWVudChkZXNjKTsKLQkJY3VzWzBdID0gZnJhZ21lbnQ7Ci0KLQkJLy9JQXJ0aWZhY3RLZXkga2V5ID0gbmV3IEFydGlmYWN0S2V5KCJlY2xpcHNlIiwgInBsdWdpbiIsICJvcmcuZWNsaXBzZS5vc2dpIiwgbmV3IFZlcnNpb24oIjMuMy4xLlIzM3hfdjIwMDcwODI4IikpOwotCQkvL2l1LnNldEFydGlmYWN0cyhuZXcgSUFydGlmYWN0S2V5W10ge2tleX0pOwotCi0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGRlc2NyaXB0aW9uKTsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXNvbHZlZEluc3RhbGxhYmxlVW5pdChpdSwgY3VzKTsKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlQmFkSVUoKSB7Ci0JCUluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbmV3IE1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQlkZXNjcmlwdGlvbi5zZXRJZCgib3JnLmVjbGlwc2Uub3NnaS5iYWQiKTsKLQkJZGVzY3JpcHRpb24uc2V0VmVyc2lvbihuZXcgVmVyc2lvbigiMy4zLjEuUjMzeF92MjAwNzA4MjgiKSk7Ci0JCWRlc2NyaXB0aW9uLnNldFRvdWNocG9pbnRUeXBlKEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdC5UT1VDSFBPSU5UX09TR0kpOwotCQlNYXAgdG91Y2hwb2ludERhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQlTdHJpbmcgbWFuaWZlc3QgPSAiTWFuaWZlc3QtVmVyc2lvbjogMS4wXHJcbiIgKyAiQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWwuY29yZS5TeXN0ZW1CdW5kbFxyXG4iICsgIiBlQWN0aXZhdG9yXHJcbiIgKyAiQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LE9TR2kvTWluaW11bS0xLjBcclxuIiArICJFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uub3NnaS5ldmVudDt2ZXJzaW9uPVwiMS4wXCIsb3JnLmVjbGlwc2Uub3NnaS5cclxuIiArICIgZnJhbWV3b3JrLmNvbnNvbGU7dmVyc2lvbj1cIjEuMFwiLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmV2ZW50bWdyO3ZcclxuIiArICIgZXJzaW9uPVwiMS4wXCIsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsubG9nO3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZVxyXG4iICsgIiAub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbjt2ZXJzaW9uPVwiMS4wXCIsb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRlYlxyXG4iICsgIiB1Zzt2ZXJzaW9uPVwiMS4wXCIsb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50O3ZlcnNpb249XCIxLjBcIixvXHJcbiIgKyAiIHJnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmxvY2FsaXphdGlvbjt2ZXJzaW9uPVwiMS4wXCIsb3JnLmVjbGlwc2Uub3NnaS5zXHJcbiIgKyAiIGVydmljZS5wbHVnaW5jb252ZXJzaW9uO3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2XHJcbiIKLQkJCQkrICIgZXI7dmVyc2lvbj1cIjEuMVwiLG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5ydW5uYWJsZTt2ZXJzaW9uPVwiMS4wXCIsb3JnLlxyXG4iICsgIiBlY2xpcHNlLm9zZ2kuc2VydmljZS51cmxjb252ZXJzaW9uO3ZlcnNpb249XCIxLjBcIixvcmcuZWNsaXBzZS5vc2dpLnN0b1xyXG4iICsgIiByYWdlbWFuYWdlcjt2ZXJzaW9uPVwiMS4wXCIsb3JnLmVjbGlwc2Uub3NnaS51dGlsO3ZlcnNpb249XCIxLjBcIixvcmcub3NnXHJcbiIgKyAiIGkuZnJhbWV3b3JrO3ZlcnNpb249XCIxLjNcIixvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW47dmVyc2lvbj1cIjEuMFxyXG4iICsgIiBcIixvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbjt2ZXJzaW9uPVwiMS4yXCIsb3JnLm9zZ2kuc2VydmljZS5wZXJtaXNcclxuIiArICIgc2lvbmFkbWluO3ZlcnNpb249XCIxLjJcIixvcmcub3NnaS5zZXJ2aWNlLnN0YXJ0bGV2ZWw7dmVyc2lvbj1cIjEuMFwiLG9yZ1xyXG4iICsgIiAub3NnaS5zZXJ2aWNlLnVybDt2ZXJzaW9uPVwiMS4wXCIsb3JnLm9zZ2kudXRpbC50cmFja2VyO3ZlcnNpb249XCIxLjMuMlwiXHJcbiIgKyAiICxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRvcjt4LWZyaWVuZHM6PVwib3JnLmVjbGlwc2UuY29yZS5ydW50aW1cclxuIiArICIgZVwiLG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5pbnRlcm5hbC5hZGFwdG9yO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbFxyXG4iCi0JCQkJKyAiIGlwc2UuY29yZS5ydW50aW1lLmludGVybmFsLnN0YXRzO3gtZnJpZW5kczo9XCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWVcclxuIiArICIgXCIsb3JnLmVjbGlwc2Uub3NnaS5iYXNlYWRhcHRvcjt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuYmFzZVxyXG4iICsgIiBhZGFwdG9yLmJ1bmRsZWZpbGU7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmJhc2VhZGFwdG9yLmhvb2tcclxuIiArICIgczt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuYmFzZWFkYXB0b3IubG9hZGVyO3gtaW50ZXJuYWw6PXRyXHJcbiIgKyAiIHVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmFkYXB0b3I7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc1xyXG4iICsgIiBnaS5mcmFtZXdvcmsuZGVidWc7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5cclxuIiArICIgYWwuY29yZTt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmludGVybmFsLnByb3RvY29sXHJcbiIgKyAiIDt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmludGVybmFsLnByb3RvY29sLmJ1bmRsZVxyXG4iICsgIiBlbnRyeTt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmludGVybmFsLnByb3RvY29sLmJcclxuIgotCQkJCSsgIiB1bmRsZXJlc291cmNlO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWwucHJcclxuIiArICIgb3RvY29sLnJlZmVyZW5jZTt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmludGVybmFsXHJcbiIgKyAiIC5yZWxpYWJsZWZpbGU7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5sYXVuY2hlcjt4LVxyXG4iICsgIiBpbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay51dGlsO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVcclxuIiArICIgY2xpcHNlLm9zZ2kuaW50ZXJuYWwuYmFzZWFkYXB0b3I7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmluXHJcbiIgKyAiIHRlcm5hbC5tb2R1bGU7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnByb2ZpbGU7eC1pblxyXG4iICsgIiB0ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC5yZXNvbHZlcjt4LWludGVybmFsOj10cnVlLG9yZy5cclxuIiArICIgZWNsaXBzZS5vc2dpLmludGVybmFsLnZlcmlmaWVyO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5pbnRlXHJcbiIgKyAiIHJuYWwucHJvdmlzaW9uYWwudmVyaWZpZXI7eC1mcmllbmRzOj1cIm9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLG9yZy5lY2xcclxuIiArICIgaXBzZS51aS53b3JrYmVuY2hcIlxyXG4iICsgIkJ1bmRsZS1WZXJzaW9uOiAzLjMuMC52MjAwNjA5MjVcclxuIgotCQkJCSsgIkVjbGlwc2UtU3lzdGVtQnVuZGxlOiB0cnVlXHJcbiIgKyAiQnVuZGxlLUNvcHlyaWdodDogJWNvcHlyaWdodFxyXG4iICsgIkJ1bmRsZS1OYW1lOiAlc3lzdGVtQnVuZGxlXHJcbiIgKyAiQnVuZGxlLURlc2NyaXB0aW9uOiAlc3lzdGVtQnVuZGxlXHJcbiIgKyAiQnVuZGxlLURvY1VybDogaHR0cDovL3d3dy5lY2xpcHNlLm9yZ1xyXG4iICsgIkJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDJcclxuIiArICJFeHBvcnQtU2VydmljZTogb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluLG9yZy5vc2dpLnNlXHJcbiIgKyAiIHJ2aWNlLnBlcm1pc3Npb25hZG1pbi5QZXJtaXNzaW9uQWRtaW4sb3JnLm9zZ2kuc2VydmljZS5zdGFydGxldmVsLlN0YVxyXG4iICsgIiBydExldmVsLG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJ1Zy5EZWJ1Z09wdGlvbnNcclxuIiArICJCdW5kbGUtVmVuZG9yOiAlZWNsaXBzZS5vcmdcclxuIiArICJNYWluLUNsYXNzOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRvci5FY2xpcHNlU3RhcnRlclxyXG4iICsgIkJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLm9zZ2k7IHNpbmdsZXRvbjo9dHJ1ZVxyXG4iICsgIkJ1bmRsZS1Mb2NhbGl6YXRpb246IHN5c3RlbWJ1bmRsZVxyXG4iICsgIkVjbGlwc2UtRXh0ZW5zaWJsZUFQSTogdHJ1ZVxyXG4iICsgIlxyXG4iICsgIiI7Ci0JCXRvdWNocG9pbnREYXRhLnB1dCgibWFuaWZlc3QiLCBtYW5pZmVzdCk7Ci0JCXRvdWNocG9pbnREYXRhLnB1dCgiaW5zdGFsbCIsICJCQUQiKTsKLQotCQlJSW5zdGFsbGFibGVVbml0RnJhZ21lbnRbXSBjdXMgPSBuZXcgSUluc3RhbGxhYmxlVW5pdEZyYWdtZW50WzFdOwotCQlJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uIGRlc2MgPSBuZXcgSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbigpOwotCQlkZXNjLmFkZFRvdWNocG9pbnREYXRhKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YSh0b3VjaHBvaW50RGF0YSkpOwotCQljdXNbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0RnJhZ21lbnQoZGVzYyk7Ci0KLQkJLy9JQXJ0aWZhY3RLZXkga2V5ID0gbmV3IEFydGlmYWN0S2V5KCJlY2xpcHNlIiwgInBsdWdpbiIsICJvcmcuZWNsaXBzZS5vc2dpIiwgbmV3IFZlcnNpb24oIjMuMy4xLlIzM3hfdjIwMDcwODI4IikpOwotCQkvL2l1LnNldEFydGlmYWN0cyhuZXcgSUFydGlmYWN0S2V5W10ge2tleX0pOwotCi0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlSW5zdGFsbGFibGVVbml0KGRlc2NyaXB0aW9uKTsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXNvbHZlZEluc3RhbGxhYmxlVW5pdChpdSwgY3VzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvUGhhc2VTZXRUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZW5naW5lL1BoYXNlU2V0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODUwOTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvUGhhc2VTZXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotCi0vKioKLSAqIFNpbXBsZSB0ZXN0IG9mIHRoZSBlbmdpbmUgQVBJLgotICovCi1wdWJsaWMgY2xhc3MgUGhhc2VTZXRUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwdWJsaWMgUGhhc2VTZXRUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBQaGFzZVNldFRlc3QoKSB7Ci0JCXN1cGVyKCIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFBoYXNlcygpIHsKLQkJdHJ5IHsKLQkJCW5ldyBQaGFzZVNldChudWxsKSB7Ci0JCQkJLy8gZW1wdHkgUGhhc2VTZXQKLQkJCX07Ci0JCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGVwY3RlZCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWZhaWwoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9UcnVzdENoZWNrKCkgewotCQlQaGFzZVNldCBzZXQxID0gbmV3IERlZmF1bHRQaGFzZVNldCgpOwotCQlQaGFzZVNldCBzZXQyID0gRGVmYXVsdFBoYXNlU2V0LmNyZWF0ZURlZmF1bHRQaGFzZVNldChEZWZhdWx0UGhhc2VTZXQuUEhBU0VfQ0hFQ0tfVFJVU1QpOwotCQlhc3NlcnRUcnVlKCIxLjAiLCAhc2V0MS5lcXVhbHMoc2V0MikpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eVBoYXNlcygpIHsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlBoYXNlU2V0VGVzdCIpOwotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBQaGFzZVNldChuZXcgUGhhc2VbXSB7fSkgewotCQkJLy8gZW1wdHkgUGhhc2VTZXQKLQkJfTsKLQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcCA9IG5ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKGNyZWF0ZVJlc29sdmVkSVUoY3JlYXRlSVUoIml1IikpLCBudWxsKTsKLQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIG9wZXJhbmRzID0gbmV3IEluc3RhbGxhYmxlVW5pdE9wZXJhbmRbXSB7b3B9OwotCi0JCVByb3Zpc2lvbmluZ0NvbnRleHQgY29udGV4dCA9IG5ldyBQcm92aXNpb25pbmdDb250ZXh0KCk7Ci0JCUlTdGF0dXMgcmVzdWx0ID0gcGhhc2VTZXQucGVyZm9ybShuZXcgRW5naW5lU2Vzc2lvbihwcm9maWxlLCBjb250ZXh0KSwgcHJvZmlsZSwgb3BlcmFuZHMsIGNvbnRleHQsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRUcnVlKHJlc3VsdC5pc09LKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvUGhhc2VUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZW5naW5lL1BoYXNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWJkMmY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvUGhhc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZW5naW5lOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLS8qKgotICogU2ltcGxlIHRlc3Qgb2YgdGhlIGVuZ2luZSBBUEkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQaGFzZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFBoYXNlU2V0IGV4dGVuZHMgUGhhc2VTZXQgewotCi0JCXB1YmxpYyBUZXN0UGhhc2VTZXQoKSB7Ci0JCQlzdXBlcihuZXcgUGhhc2VbXSB7bmV3IFRlc3RQaGFzZSgpfSk7Ci0JCX0KLQotCQlwdWJsaWMgVGVzdFBoYXNlU2V0KFBoYXNlIHBoYXNlKSB7Ci0JCQlzdXBlcihuZXcgUGhhc2VbXSB7cGhhc2V9KTsKLQkJfQotCi0JCXB1YmxpYyBUZXN0UGhhc2VTZXQoUGhhc2VbXSBwaGFzZXMpIHsKLQkJCXN1cGVyKHBoYXNlcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RQaGFzZSBleHRlbmRzIEluc3RhbGxhYmxlVW5pdFBoYXNlIHsKLQotCQlib29sZWFuIGNvbXBsZXRlT3BlcmFuZDsKLQkJYm9vbGVhbiBnZXRBY3Rpb247Ci0JCWJvb2xlYW4gaW5pdGlhbGl6ZU9wZXJhbmQ7Ci0JCWJvb2xlYW4gY29tcGxldGVQaGFzZTsKLQkJYm9vbGVhbiBpbml0aWFsaXplUGhhc2U7Ci0KLQkJcHJvdGVjdGVkIFRlc3RQaGFzZSgpIHsKLQkJCXN1cGVyKCJ0ZXN0IiwgMSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgVGVzdFBoYXNlKFN0cmluZyBwaGFzZUlkLCBpbnQgd2VpZ2h0KSB7Ci0JCQlzdXBlcihwaGFzZUlkLCB3ZWlnaHQpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIElTdGF0dXMgY29tcGxldGVPcGVyYW5kKElQcm9maWxlIHByb2ZpbGUsIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCwgTWFwIHBhcmFtZXRlcnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJY29tcGxldGVPcGVyYW5kID0gdHJ1ZTsKLQkJCXJldHVybiBzdXBlci5jb21wbGV0ZU9wZXJhbmQocHJvZmlsZSwgb3BlcmFuZCwgcGFyYW1ldGVycywgbW9uaXRvcik7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBpbml0aWFsaXplT3BlcmFuZChJUHJvZmlsZSBwcm9maWxlLCBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQsIE1hcCBwYXJhbWV0ZXJzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCWluaXRpYWxpemVPcGVyYW5kID0gdHJ1ZTsKLQkJCXJldHVybiBzdXBlci5pbml0aWFsaXplT3BlcmFuZChwcm9maWxlLCBvcGVyYW5kLCBwYXJhbWV0ZXJzLCBtb25pdG9yKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIGNvbXBsZXRlSW5zdGFsbGFibGVVbml0UGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBNYXAgcGFyYW1ldGVycykgewotCQkJY29tcGxldGVQaGFzZSA9IHRydWU7Ci0JCQlyZXR1cm4gc3VwZXIuY29tcGxldGVJbnN0YWxsYWJsZVVuaXRQaGFzZShtb25pdG9yLCBwcm9maWxlLCBwYXJhbWV0ZXJzKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIGluaXRpYWxpemVJbnN0YWxsYWJsZVVuaXRQaGFzZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9maWxlIHByb2ZpbGUsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCQlpbml0aWFsaXplUGhhc2UgPSB0cnVlOwotCQkJcmV0dXJuIHN1cGVyLmluaXRpYWxpemVJbnN0YWxsYWJsZVVuaXRQaGFzZShtb25pdG9yLCBwcm9maWxlLCBwYXJhbWV0ZXJzKTsKLQkJfQotCi0JCXByb3RlY3RlZCBQcm92aXNpb25pbmdBY3Rpb25bXSBnZXRBY3Rpb25zKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNlcnZpY2VSZWZlcmVuY2UgZW5naW5lUmVmOwotCXByaXZhdGUgSUVuZ2luZSBlbmdpbmU7Ci0KLQlwdWJsaWMgUGhhc2VUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCXB1YmxpYyBQaGFzZVRlc3QoKSB7Ci0JCXN1cGVyKCIiKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQllbmdpbmVSZWYgPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKElFbmdpbmUuU0VSVklDRV9OQU1FKTsKLQkJZW5naW5lID0gKElFbmdpbmUpIFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UoZW5naW5lUmVmKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQllbmdpbmUgPSBudWxsOwotCQlUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2UoZW5naW5lUmVmKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFBoYXNlSWQoKSB7Ci0JCXRyeSB7Ci0JCQluZXcgVGVzdFBoYXNlKG51bGwsIDEpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5UGhhc2VJZCgpIHsKLQkJdHJ5IHsKLQkJCW5ldyBUZXN0UGhhc2UoIiIsIDEpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lZ2F0aXZlV2VpZ2h0KCkgewotCQl0cnkgewotCQkJbmV3IFRlc3RQaGFzZSgieHl6IiwgLTEpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFplcm9XZWlnaHQoKSB7Ci0JCXRyeSB7Ci0JCQluZXcgVGVzdFBoYXNlKCJ4eXoiLCAwKTsKLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZmFpbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQZXJmb3JtKCkgewotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBUZXN0UGhhc2VTZXQoKTsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlBoYXNlVGVzdCIpOwotCi0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIHBoYXNlU2V0LCBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFswXSwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaXRDb21wbGV0ZVBoYXNlKCkgewotCQlUZXN0UGhhc2UgcGhhc2UgPSBuZXcgVGVzdFBoYXNlKCkgewotCQkJcHJvdGVjdGVkIElTdGF0dXMgaW5pdGlhbGl6ZVBoYXNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2ZpbGUgcHJvZmlsZSwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJCQlhc3NlcnRGYWxzZShpbml0aWFsaXplUGhhc2UpOwotCQkJCWFzc2VydEZhbHNlKGNvbXBsZXRlUGhhc2UpOwotCQkJCXN1cGVyLmluaXRpYWxpemVQaGFzZShtb25pdG9yLCBwcm9maWxlLCBwYXJhbWV0ZXJzKTsKLQkJCQlhc3NlcnRUcnVlKGluaXRpYWxpemVQaGFzZSk7Ci0JCQkJYXNzZXJ0RmFsc2UoY29tcGxldGVQaGFzZSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCBJU3RhdHVzIGNvbXBsZXRlUGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBNYXAgcGFyYW1ldGVycykgewotCQkJCWFzc2VydFRydWUoaW5pdGlhbGl6ZVBoYXNlKTsKLQkJCQlhc3NlcnRGYWxzZShjb21wbGV0ZVBoYXNlKTsKLQkJCQlzdXBlci5jb21wbGV0ZVBoYXNlKG1vbml0b3IsIHByb2ZpbGUsIHBhcmFtZXRlcnMpOwotCQkJCWFzc2VydFRydWUoaW5pdGlhbGl6ZVBoYXNlKTsKLQkJCQlhc3NlcnRUcnVlKGNvbXBsZXRlUGhhc2UpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBUZXN0UGhhc2VTZXQocGhhc2UpOwotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiUGhhc2VUZXN0Iik7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdW5pdCA9IGNyZWF0ZUlVKCJ1bml0Iik7Ci0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIHBoYXNlU2V0LCBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIHtuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZChudWxsLCB1bml0KX0sIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRUcnVlKHBoYXNlLmluaXRpYWxpemVQaGFzZSk7Ci0JCWFzc2VydFRydWUocGhhc2UuY29tcGxldGVQaGFzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaXRDb21wbGV0ZU9wZXJhbmQoKSB7Ci0JCVRlc3RQaGFzZSBwaGFzZSA9IG5ldyBUZXN0UGhhc2UoKSB7Ci0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBjb21wbGV0ZU9wZXJhbmQoSVByb2ZpbGUgcHJvZmlsZSwgT3BlcmFuZCBvcGVyYW5kLCBNYXAgcGFyYW1ldGVycywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJYXNzZXJ0VHJ1ZShpbml0aWFsaXplT3BlcmFuZCk7Ci0JCQkJYXNzZXJ0RmFsc2UoY29tcGxldGVPcGVyYW5kKTsKLQkJCQlzdXBlci5jb21wbGV0ZU9wZXJhbmQocHJvZmlsZSwgb3BlcmFuZCwgcGFyYW1ldGVycywgbW9uaXRvcik7Ci0JCQkJYXNzZXJ0VHJ1ZShpbml0aWFsaXplT3BlcmFuZCk7Ci0JCQkJYXNzZXJ0VHJ1ZShjb21wbGV0ZU9wZXJhbmQpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBpbml0aWFsaXplT3BlcmFuZChJUHJvZmlsZSBwcm9maWxlLCBPcGVyYW5kIG9wZXJhbmQsIE1hcCBwYXJhbWV0ZXJzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQlhc3NlcnRGYWxzZShpbml0aWFsaXplT3BlcmFuZCk7Ci0JCQkJYXNzZXJ0RmFsc2UoY29tcGxldGVPcGVyYW5kKTsKLQkJCQlzdXBlci5pbml0aWFsaXplT3BlcmFuZChwcm9maWxlLCBvcGVyYW5kLCBwYXJhbWV0ZXJzLCBtb25pdG9yKTsKLQkJCQlhc3NlcnRUcnVlKGluaXRpYWxpemVPcGVyYW5kKTsKLQkJCQlhc3NlcnRGYWxzZShjb21wbGV0ZU9wZXJhbmQpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9OwotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBUZXN0UGhhc2VTZXQocGhhc2UpOwotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiUGhhc2VUZXN0Iik7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgdW5pdCA9IGNyZWF0ZUlVKCJ0ZXN0SW5pdENvbXBsZXRlT3BlcmFuZCIpOwotCi0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIHBoYXNlU2V0LCBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIHtuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZChudWxsLCB1bml0KX0sIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRUcnVlKHBoYXNlLmluaXRpYWxpemVPcGVyYW5kKTsKLQkJYXNzZXJ0VHJ1ZShwaGFzZS5jb21wbGV0ZU9wZXJhbmQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvUHJvZmlsZVJlZ2lzdHJ5VGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VuZ2luZS9Qcm9maWxlUmVnaXN0cnlUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGU4NDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VuZ2luZS9Qcm9maWxlUmVnaXN0cnlUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5lbmdpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLQotLyoqCi0gKiBTaW1wbGUgdGVzdCBvZiB0aGUgZW5naW5lIEFQSS4KLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVSZWdpc3RyeVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX05BTUUgPSAiUHJvZmlsZVJlZ2lzdHJ5VGVzdC5wcm9maWxlIjsKLQlwcml2YXRlIElQcm9maWxlUmVnaXN0cnkgcmVnaXN0cnk7Ci0JcHJpdmF0ZSBTZXJ2aWNlUmVmZXJlbmNlIHJlZ2lzdHJ5UmVmOwotCi0JcHVibGljIFByb2ZpbGVSZWdpc3RyeVRlc3QoKSB7Ci0JCXN1cGVyKCIiKTsKLQl9Ci0KLQlwdWJsaWMgUHJvZmlsZVJlZ2lzdHJ5VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZXRTZXJ2aWNlcygpIHsKLQkJcmVnaXN0cnlSZWYgPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmVnaXN0cnkgPSAoSVByb2ZpbGVSZWdpc3RyeSkgVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZShyZWdpc3RyeVJlZik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc3RhcnQoKSB7Ci0JCXRyeSB7Ci0JCQl1bmdldFNlcnZpY2VzKCk7Ci0JCQlUZXN0QWN0aXZhdG9yLmdldEJ1bmRsZSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCIpLnN0b3AoKTsKLQkJCVRlc3RBY3RpdmF0b3IuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwIikuc3RhcnQoKTsKLQkJCWdldFNlcnZpY2VzKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCk7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZ2V0U2VydmljZXMoKTsKLQkJLy9lbnN1cmUgd2Ugc3RhcnQgaW4gYSBjbGVhbiBzdGF0ZQotCQlyZWdpc3RyeS5yZW1vdmVQcm9maWxlKFBST0ZJTEVfTkFNRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJdW5nZXRTZXJ2aWNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRSZW1vdmVQcm9maWxlKCkgewotCQlhc3NlcnROdWxsKHJlZ2lzdHJ5LmdldFByb2ZpbGUoUFJPRklMRV9OQU1FKSk7Ci0JCUlQcm9maWxlIHRlc3QgPSBjcmVhdGVQcm9maWxlKFBST0ZJTEVfTkFNRSk7Ci0JCWFzc2VydEVxdWFscyh0ZXN0LmdldFByb2ZpbGVJZCgpLCByZWdpc3RyeS5nZXRQcm9maWxlKFBST0ZJTEVfTkFNRSkuZ2V0UHJvZmlsZUlkKCkpOwotCQlyZWdpc3RyeS5yZW1vdmVQcm9maWxlKFBST0ZJTEVfTkFNRSk7Ci0JCWFzc2VydE51bGwocmVnaXN0cnkuZ2V0UHJvZmlsZShQUk9GSUxFX05BTUUpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGVyaXN0ZW5jZSgpIHsKLQkJYXNzZXJ0TnVsbChyZWdpc3RyeS5nZXRQcm9maWxlKFBST0ZJTEVfTkFNRSkpOwotCQlJUHJvZmlsZSB0ZXN0ID0gY3JlYXRlUHJvZmlsZShQUk9GSUxFX05BTUUpOwotCQlhc3NlcnRFcXVhbHModGVzdC5nZXRQcm9maWxlSWQoKSwgcmVnaXN0cnkuZ2V0UHJvZmlsZShQUk9GSUxFX05BTUUpLmdldFByb2ZpbGVJZCgpKTsKLQotCQlyZXN0YXJ0KCk7Ci0JCXRlc3QgPSByZWdpc3RyeS5nZXRQcm9maWxlKFBST0ZJTEVfTkFNRSk7Ci0JCWFzc2VydE5vdE51bGwodGVzdCk7Ci0JCXJlZ2lzdHJ5LnJlbW92ZVByb2ZpbGUoUFJPRklMRV9OQU1FKTsKLQotCQlyZXN0YXJ0KCk7Ci0JCWFzc2VydE51bGwocmVnaXN0cnkuZ2V0UHJvZmlsZShQUk9GSUxFX05BTUUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5nZXRTZXJ2aWNlcygpIHsKLQkJcmVnaXN0cnkgPSBudWxsOwotCQlUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2UocmVnaXN0cnlSZWYpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvUHJvZmlsZVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvUHJvZmlsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRiMjliNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZW5naW5lL1Byb2ZpbGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZW5naW5lOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotLyoqCi0gKiBTaW1wbGUgdGVzdCBvZiB0aGUgZW5naW5lIEFQSS4KLSAqLwotcHVibGljIGNsYXNzIFByb2ZpbGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQotCXB1YmxpYyBQcm9maWxlVGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgUHJvZmlsZVRlc3QoKSB7Ci0JCXN1cGVyKCIiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0TnVsbFByb2ZpbGUoKSB7Ci0JCXRyeSB7Ci0JCQljcmVhdGVQcm9maWxlKG51bGwpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5UHJvZmlsZSgpIHsKLQkJdHJ5IHsKLQkJCWNyZWF0ZVByb2ZpbGUoIiIpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmYWlsKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFByb2ZpbGVTdHJ1Y3R1cmUoKSB7Ci0JCUlQcm9maWxlIHBhcmVudCA9IGNyZWF0ZVByb2ZpbGUoInBhcmVudCIpOwotCQlJUHJvZmlsZSBjaGlsZCA9IGNyZWF0ZVByb2ZpbGUoImNoaWxkIiwgInBhcmVudCIpOwotCQlwYXJlbnQgPSBnZXRQcm9maWxlKCJwYXJlbnQiKTsKLQkJYXNzZXJ0VHJ1ZSgiUGFyZW50bGVzcyBwcm9maWxlIHNob3VsZCBiZSBhIHJvb3QuIiwgcGFyZW50LmlzUm9vdFByb2ZpbGUoKSk7Ci0JCWFzc2VydEZhbHNlKCJDaGlsZCBwcm9maWxlIHNob3VsZCBub3QgYmUgYSByb290LiIsIGNoaWxkLmlzUm9vdFByb2ZpbGUoKSk7Ci0JCWFzc2VydFRydWUoIlBhcmVudCBzaG91bGQgYmUgcGFyZW50IG9mIGNoaWxkIiwgY2hpbGQuZ2V0UGFyZW50UHJvZmlsZSgpLmdldFByb2ZpbGVJZCgpLmVxdWFscyhwYXJlbnQuZ2V0UHJvZmlsZUlkKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiUGFyZW50IHNob3VsZCBoYXZlIG9uZSBjaGlsZC4iLCBwYXJlbnQuZ2V0U3ViUHJvZmlsZUlkcygpLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSgiQ2hpbGQgc2hvdWxkIGhhdmUgbm8gY2hpbGRyZW4uIiwgY2hpbGQuZ2V0U3ViUHJvZmlsZUlkcygpLmxlbmd0aCA9PSAwKTsKLQotCQlJUHJvZmlsZSBncmFuZGNoaWxkID0gY3JlYXRlUHJvZmlsZSgiZ3JhbmQiLCAiY2hpbGQiKTsKLQkJY2hpbGQgPSBnZXRQcm9maWxlKCJjaGlsZCIpOwotCQlhc3NlcnRGYWxzZSgiR3JhbmRjaGlsZCBwcm9maWxlIHNob3VsZCBub3QgYmUgYSByb290LiIsIGdyYW5kY2hpbGQuaXNSb290UHJvZmlsZSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiUGFyZW50IHNob3VsZCBoYXZlIG9uZSBjaGlsZC4iLCBwYXJlbnQuZ2V0U3ViUHJvZmlsZUlkcygpLmxlbmd0aCA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZSgiQ2hpbGQgc2hvdWxkIGhhdmUgb25lIGNoaWxkLiIsIGNoaWxkLmdldFN1YlByb2ZpbGVJZHMoKS5sZW5ndGggPT0gMSk7Ci0JCWFzc2VydFRydWUoIkdyYW5kcGFyZW50IG9mIGdyYW5kY2hpbGQgc2hvdWxkIGJlIHBhcmVudCBvZiBjaGlsZC4iLCBncmFuZGNoaWxkLmdldFBhcmVudFByb2ZpbGUoKS5nZXRQYXJlbnRQcm9maWxlKCkuZ2V0UHJvZmlsZUlkKCkuZXF1YWxzKHBhcmVudC5nZXRQcm9maWxlSWQoKSkpOwotCX0KLQotCS8qCVRoZSB0ZXN0IHByb2ZpbGUgaGFzIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlIGFuZCBwcm9wZXJ0aWVzIHdoZXJlCi0JICogIAlpZHt4LHl9ICBpbmRpY2F0ZXMgYSBwcm9maWxlIHdpdGggaWQgImlkIiBhbmQgcHJvcGVydGllcyBkZWZpbmVkCi0JICoJCQkJIHdpdGgga2V5cyAieCIgYW5kICJ5IgotCSAqCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZGNoaWxkMDB7Zm9vfQotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCi0JICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLwotCSAqICAgICAgICAgICAgICAgICAgICAgIGNoaWxkMHtmb299IHwgLS0tIGdyYW5kY2hpbGQwMXt9Ci0JICogICAgICAgICAgICAgICAgICAgICAvICAgICAgICAgICAgIFwKLQkgKgkJCQkJICAvICAgICAgICAgICAgICAgXAotCSAqICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgIGdyYW5kY2hpbGQwMXtiYXJ9Ci0JICoJcGFyZW50e2ZvbyxiYXJ9IHwJCQkJICAgCi0JICogICAgICAgICAgICAgICAgICAgXCAgICAgICAgICAgIGdyYW5kY2hpbGQxMHtmb299Ci0JICogICAgICAgICAgICAgICAgICAgIFwgICAgICAgICAgLwotCSAqICAgICAgICAgICAgICAgICAgICAgY2hpbGQxe30gfAotCSAqCQkJCQkJCQkgXAotCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFuZGNoaWxkMTF7fQotCSAqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBhcmVudElkID0gInBhcmVudCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoaWxkMElkID0gImNoaWxkMCI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdyYW5kY2hpbGQwMElkID0gImdyYW5kMDAiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBncmFuZGNoaWxkMDFJZCA9ICJncmFuZDAxIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3JhbmRjaGlsZDAySWQgPSAiZ3JhbmQwMiI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNoaWxkMUlkID0gImNoaWxkMSI7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdyYW5kY2hpbGQxMElkID0gImdyYW5kMTAiOwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBncmFuZGNoaWxkMTFJZCA9ICJncmFuZDExIjsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBrZXkgPSAib3JnLmVjbGlwc2UucDIuZm9vIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFyZW50VmFsdWUgPSAicGFyZW50IjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hpbGQwVmFsdWUgPSAiY2hpbGQwIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3JhbmRjaGlsZDAwVmFsdWUgPSAiZ3JhbmRjaGlsZDAwIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3JhbmRjaGlsZDAyVmFsdWUgPSAiZ3JhbmRjaGlsZDAyIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ3JhbmRjaGlsZDEwVmFsdWUgPSAiZ3JhbmRjaGlsZDEwIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgb3RoZXJLZXkgPSAib3JnLmVjbGlwc2UucDIuYmFyIjsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgb3RoZXJWYWx1ZSA9ICJvdGhlciI7Ci0KLQkvLyBDcmVhdGUgdGhlIHByb2ZpbGVzIGFuZCB0ZXN0IGdldCBhZnRlciBzZXQKLQkvLyBmb3IgYXNzb2NpYXRlZCBwcm9wZXJ0aWVzLgotCXByaXZhdGUgSVByb2ZpbGVbXSBjcmVhdGVUZXN0UHJvZmlsZXMoKSB7Ci0KLQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByb3BlcnRpZXMucHV0KGtleSwgcGFyZW50VmFsdWUpOwotCQlwcm9wZXJ0aWVzLnB1dChvdGhlcktleSwgb3RoZXJWYWx1ZSk7Ci0JCUlQcm9maWxlIHBhcmVudCA9IGNyZWF0ZVByb2ZpbGUocGFyZW50SWQsIG51bGwsIHByb3BlcnRpZXMpOwotCQlwcm9wZXJ0aWVzLmNsZWFyKCk7Ci0JCWFzc2VydFRydWUocGFyZW50VmFsdWUuZXF1YWxzKHBhcmVudC5nZXRQcm9wZXJ0eShrZXkpKSk7Ci0JCWFzc2VydFRydWUob3RoZXJWYWx1ZS5lcXVhbHMocGFyZW50LmdldFByb3BlcnR5KG90aGVyS2V5KSkpOwotCi0JCXByb3BlcnRpZXMucHV0KGtleSwgY2hpbGQwVmFsdWUpOwotCQlJUHJvZmlsZSBjaGlsZDAgPSBjcmVhdGVQcm9maWxlKGNoaWxkMElkLCBwYXJlbnRJZCwgcHJvcGVydGllcyk7Ci0JCXByb3BlcnRpZXMuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZDBWYWx1ZS5lcXVhbHMoY2hpbGQwLmdldFByb3BlcnR5KGtleSkpKTsKLQotCQlJUHJvZmlsZSBjaGlsZDEgPSBjcmVhdGVQcm9maWxlKGNoaWxkMUlkLCBwYXJlbnRJZCwgcHJvcGVydGllcyk7Ci0JCS8vIG5vIHZhbHVlIGluIGNoaWxkMQotCi0JCXByb3BlcnRpZXMucHV0KGtleSwgZ3JhbmRjaGlsZDAwVmFsdWUpOwotCQlJUHJvZmlsZSBncmFuZGNoaWxkMDAgPSBjcmVhdGVQcm9maWxlKGdyYW5kY2hpbGQwMElkLCBjaGlsZDBJZCwgcHJvcGVydGllcyk7Ci0JCXByb3BlcnRpZXMuY2xlYXIoKTsKLQkJYXNzZXJ0VHJ1ZShncmFuZGNoaWxkMDBWYWx1ZS5lcXVhbHMoZ3JhbmRjaGlsZDAwLmdldFByb3BlcnR5KGtleSkpKTsKLQotCQlJUHJvZmlsZSBncmFuZGNoaWxkMDEgPSBjcmVhdGVQcm9maWxlKGdyYW5kY2hpbGQwMUlkLCBjaGlsZDBJZCk7Ci0JCS8vIG5vIHZhbHVlIGluIGdyYW5kY2hpbGQwMQotCi0JCXByb3BlcnRpZXMucHV0KG90aGVyS2V5LCBncmFuZGNoaWxkMDJWYWx1ZSk7Ci0JCUlQcm9maWxlIGdyYW5kY2hpbGQwMiA9IGNyZWF0ZVByb2ZpbGUoZ3JhbmRjaGlsZDAySWQsIGNoaWxkMElkLCBwcm9wZXJ0aWVzKTsKLQkJcHJvcGVydGllcy5jbGVhcigpOwotCQlhc3NlcnRUcnVlKGdyYW5kY2hpbGQwMlZhbHVlLmVxdWFscyhncmFuZGNoaWxkMDIuZ2V0UHJvcGVydHkob3RoZXJLZXkpKSk7Ci0KLQkJcHJvcGVydGllcy5wdXQoa2V5LCBncmFuZGNoaWxkMTBWYWx1ZSk7Ci0JCUlQcm9maWxlIGdyYW5kY2hpbGQxMCA9IGNyZWF0ZVByb2ZpbGUoZ3JhbmRjaGlsZDEwSWQsIGNoaWxkMUlkLCBwcm9wZXJ0aWVzKTsKLQkJcHJvcGVydGllcy5jbGVhcigpOwotCQlhc3NlcnRUcnVlKGdyYW5kY2hpbGQxMFZhbHVlLmVxdWFscyhncmFuZGNoaWxkMTAuZ2V0UHJvcGVydHkoa2V5KSkpOwotCi0JCUlQcm9maWxlIGdyYW5kY2hpbGQxMSA9IGNyZWF0ZVByb2ZpbGUoZ3JhbmRjaGlsZDExSWQsIGNoaWxkMUlkKTsKLQkJLy8gbm8gdmFsdWUgaW4gZ3JhbmRjaGlsZDExCi0KLQkJcGFyZW50ID0gZ2V0UHJvZmlsZShwYXJlbnRJZCk7Ci0JCWNoaWxkMCA9IGdldFByb2ZpbGUoY2hpbGQwSWQpOwotCQljaGlsZDEgPSBnZXRQcm9maWxlKGNoaWxkMUlkKTsKLQkJZ3JhbmRjaGlsZDAwID0gZ2V0UHJvZmlsZShncmFuZGNoaWxkMDBJZCk7Ci0JCWdyYW5kY2hpbGQwMSA9IGdldFByb2ZpbGUoZ3JhbmRjaGlsZDAxSWQpOwotCQlncmFuZGNoaWxkMDIgPSBnZXRQcm9maWxlKGdyYW5kY2hpbGQwMklkKTsKLQkJZ3JhbmRjaGlsZDEwID0gZ2V0UHJvZmlsZShncmFuZGNoaWxkMTBJZCk7Ci0JCWdyYW5kY2hpbGQxMSA9IGdldFByb2ZpbGUoZ3JhbmRjaGlsZDExSWQpOwotCi0JCUlQcm9maWxlW10gcHJvZmlsZXMgPSB7cGFyZW50LCBjaGlsZDAsIGNoaWxkMSwgZ3JhbmRjaGlsZDAwLCBncmFuZGNoaWxkMDEsIGdyYW5kY2hpbGQwMiwgZ3JhbmRjaGlsZDEwLCBncmFuZGNoaWxkMTF9OwotCQlyZXR1cm4gcHJvZmlsZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5lc3RlZFByb2ZpbGVQcm9wZXJ0aWVzKCkgewotCQl2YWxpZGF0ZVByb2ZpbGVzKGNyZWF0ZVRlc3RQcm9maWxlcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZVByb2ZpbGVzKElQcm9maWxlW10gcHJvZmlsZXMpIHsKLQkJSVByb2ZpbGUgcGFyZW50ID0gcHJvZmlsZXNbMF07Ci0JCUlQcm9maWxlIGNoaWxkMCA9IHByb2ZpbGVzWzFdOwotCQlJUHJvZmlsZSBjaGlsZDEgPSBwcm9maWxlc1syXTsKLQkJSVByb2ZpbGUgZ3JhbmRjaGlsZDAwID0gcHJvZmlsZXNbM107Ci0JCUlQcm9maWxlIGdyYW5kY2hpbGQwMSA9IHByb2ZpbGVzWzRdOwotCQlJUHJvZmlsZSBncmFuZGNoaWxkMDIgPSBwcm9maWxlc1s1XTsKLQkJSVByb2ZpbGUgZ3JhbmRjaGlsZDEwID0gcHJvZmlsZXNbNl07Ci0JCUlQcm9maWxlIGdyYW5kY2hpbGQxMSA9IHByb2ZpbGVzWzddOwotCi0JCWFzc2VydFRydWUocGFyZW50SWQuZXF1YWxzKHBhcmVudC5nZXRQcm9maWxlSWQoKSkpOwotCQlhc3NlcnRUcnVlKCJQcm9maWxlIHNob3VsZCBoYXZlIDMgbG9jYWwgcHJvcGVydGllcyIsIHBhcmVudC5nZXRMb2NhbFByb3BlcnRpZXMoKS5zaXplKCkgPT0gMik7Ci0JCWFzc2VydFRydWUocGFyZW50VmFsdWUuZXF1YWxzKHBhcmVudC5nZXRQcm9wZXJ0eShrZXkpKSk7Ci0JCWFzc2VydFRydWUob3RoZXJWYWx1ZS5lcXVhbHMocGFyZW50LmdldFByb3BlcnR5KG90aGVyS2V5KSkpOwotCQlhc3NlcnRUcnVlKCJQYXJlbnQgc2hvdWxkIGhhdmUgMiBjaGlsZHJlbi4iLCBwYXJlbnQuZ2V0U3ViUHJvZmlsZUlkcygpLmxlbmd0aCA9PSAyKTsKLQotCQlhc3NlcnRUcnVlKGNoaWxkMElkLmVxdWFscyhjaGlsZDAuZ2V0UHJvZmlsZUlkKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiRmlyc3QgQ2hpbGQgc2hvdWxkIGhhdmUgMSBsb2NhbCBwcm9wZXJ0aWVzLiIsIGNoaWxkMC5nZXRMb2NhbFByb3BlcnRpZXMoKS5zaXplKCkgPT0gMSk7Ci0JCWFzc2VydFRydWUoY2hpbGQwVmFsdWUuZXF1YWxzKGNoaWxkMC5nZXRQcm9wZXJ0eShrZXkpKSk7Ci0JCWFzc2VydFRydWUob3RoZXJWYWx1ZS5lcXVhbHMoY2hpbGQwLmdldFByb3BlcnR5KG90aGVyS2V5KSkpOwotCQlhc3NlcnRUcnVlKCJGaXJzdCBDaGlsZCBzaG91bGQgaGF2ZSAzIGNoaWxkcmVuLiIsIGNoaWxkMC5nZXRTdWJQcm9maWxlSWRzKCkubGVuZ3RoID09IDMpOwotCi0JCWFzc2VydFRydWUoY2hpbGQxSWQuZXF1YWxzKGNoaWxkMS5nZXRQcm9maWxlSWQoKSkpOwotCQlhc3NlcnRUcnVlKCJTZWNvbmQgQ2hpbGQgc2hvdWxkIGhhdmUgMCBsb2NhbCBwcm9wZXJ0aWVzLiIsIGNoaWxkMS5nZXRMb2NhbFByb3BlcnRpZXMoKS5zaXplKCkgPT0gMCk7Ci0JCWFzc2VydFRydWUocGFyZW50VmFsdWUuZXF1YWxzKGNoaWxkMS5nZXRQcm9wZXJ0eShrZXkpKSk7Ci0JCWFzc2VydFRydWUob3RoZXJWYWx1ZS5lcXVhbHMoY2hpbGQxLmdldFByb3BlcnR5KG90aGVyS2V5KSkpOwotCQlhc3NlcnRUcnVlKCJTZWNvbmQgQ2hpbGQgc2hvdWxkIGhhdmUgMiBjaGlsZHJlbi4iLCBjaGlsZDEuZ2V0U3ViUHJvZmlsZUlkcygpLmxlbmd0aCA9PSAyKTsKLQotCQlhc3NlcnRUcnVlKGdyYW5kY2hpbGQwMElkLmVxdWFscyhncmFuZGNoaWxkMDAuZ2V0UHJvZmlsZUlkKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiRmlyc3QgR3JhbmRjaGlsZCBvZiBmaXJzdCBDaGlsZCBzaG91bGQgaGF2ZSAxIHByb3BlcnR5LiIsIGdyYW5kY2hpbGQwMC5nZXRMb2NhbFByb3BlcnRpZXMoKS5zaXplKCkgPT0gMSk7Ci0JCWFzc2VydFRydWUoZ3JhbmRjaGlsZDAwVmFsdWUuZXF1YWxzKGdyYW5kY2hpbGQwMC5nZXRQcm9wZXJ0eShrZXkpKSk7Ci0JCWFzc2VydFRydWUob3RoZXJWYWx1ZS5lcXVhbHMoZ3JhbmRjaGlsZDAwLmdldFByb3BlcnR5KG90aGVyS2V5KSkpOwotCi0JCWFzc2VydFRydWUoZ3JhbmRjaGlsZDAxSWQuZXF1YWxzKGdyYW5kY2hpbGQwMS5nZXRQcm9maWxlSWQoKSkpOwotCQlhc3NlcnRUcnVlKCJTZWNvbmQgR3JhbmRjaGlsZCBvZiBmaXJzdCBDaGlsZCBzaG91bGQgaGF2ZSAwIHByb3BlcnRpZXMuIiwgZ3JhbmRjaGlsZDAxLmdldExvY2FsUHJvcGVydGllcygpLnNpemUoKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZDBWYWx1ZS5lcXVhbHMoZ3JhbmRjaGlsZDAxLmdldFByb3BlcnR5KGtleSkpKTsKLQkJYXNzZXJ0VHJ1ZShvdGhlclZhbHVlLmVxdWFscyhncmFuZGNoaWxkMDEuZ2V0UHJvcGVydHkob3RoZXJLZXkpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShncmFuZGNoaWxkMDJJZC5lcXVhbHMoZ3JhbmRjaGlsZDAyLmdldFByb2ZpbGVJZCgpKSk7Ci0JCWFzc2VydFRydWUoIlRoaXJkIEdyYW5kY2hpbGQgb2YgZmlyc3QgQ2hpbGQgc2hvdWxkIGhhdmUgMSBwcm9wZXJ0eS4iLCBncmFuZGNoaWxkMDIuZ2V0TG9jYWxQcm9wZXJ0aWVzKCkuc2l6ZSgpID09IDEpOwotCQlhc3NlcnRUcnVlKGNoaWxkMFZhbHVlLmVxdWFscyhncmFuZGNoaWxkMDIuZ2V0UHJvcGVydHkoa2V5KSkpOwotCQlhc3NlcnRUcnVlKGdyYW5kY2hpbGQwMlZhbHVlLmVxdWFscyhncmFuZGNoaWxkMDIuZ2V0UHJvcGVydHkob3RoZXJLZXkpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShncmFuZGNoaWxkMTBJZC5lcXVhbHMoZ3JhbmRjaGlsZDEwLmdldFByb2ZpbGVJZCgpKSk7Ci0JCWFzc2VydFRydWUoIkZpcnN0IEdyYW5kY2hpbGQgb2Ygc2Vjb25kIENoaWxkIHNob3VsZCBoYXZlIDEgcHJvcGVydHkuIiwgZ3JhbmRjaGlsZDEwLmdldExvY2FsUHJvcGVydGllcygpLnNpemUoKSA9PSAxKTsKLQkJYXNzZXJ0VHJ1ZShncmFuZGNoaWxkMTBWYWx1ZS5lcXVhbHMoZ3JhbmRjaGlsZDEwLmdldFByb3BlcnR5KGtleSkpKTsKLQkJYXNzZXJ0VHJ1ZShvdGhlclZhbHVlLmVxdWFscyhncmFuZGNoaWxkMTAuZ2V0UHJvcGVydHkob3RoZXJLZXkpKSk7Ci0KLQkJYXNzZXJ0VHJ1ZShncmFuZGNoaWxkMTFJZC5lcXVhbHMoZ3JhbmRjaGlsZDExLmdldFByb2ZpbGVJZCgpKSk7Ci0JCWFzc2VydFRydWUoIlNlY29uZCBHcmFuZGNoaWxkIG9mIHNlY29uZCBDaGlsZCBzaG91bGQgaGF2ZSAwIHByb3BlcnRpZXMuIiwgZ3JhbmRjaGlsZDExLmdldExvY2FsUHJvcGVydGllcygpLnNpemUoKSA9PSAwKTsKLQkJYXNzZXJ0VHJ1ZShwYXJlbnRWYWx1ZS5lcXVhbHMoZ3JhbmRjaGlsZDExLmdldFByb3BlcnR5KGtleSkpKTsKLQkJYXNzZXJ0VHJ1ZShvdGhlclZhbHVlLmVxdWFscyhncmFuZGNoaWxkMTEuZ2V0UHJvcGVydHkob3RoZXJLZXkpKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBST0ZJTEVfVEVTVF9UQVJHRVQgPSAicHJvZmlsZVRlc3QiOwotCXByaXZhdGUgc3RhdGljIFZlcnNpb24gUFJPRklMRV9URVNUX1ZFUlNJT04gPSBuZXcgVmVyc2lvbigiMC4wLjEiKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBQUk9GSUxFX1RFU1RfRUxFTUVOVCA9ICJ0ZXN0IjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFU19FTEVNRU5UID0gInByb2ZpbGVzIjsgLy8kTk9OLU5MUy0xJAotCi0JY2xhc3MgUHJvZmlsZVN0cmluZ1dyaXRlciBleHRlbmRzIFByb2ZpbGVXcml0ZXIgewotCi0JCXB1YmxpYyBQcm9maWxlU3RyaW5nV3JpdGVyKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQlzdXBlcihzdHJlYW0sIG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25bXSB7UHJvY2Vzc2luZ0luc3RydWN0aW9uLm1ha2VDbGFzc1ZlcnNpb25JbnN0cnVjdGlvbihQUk9GSUxFX1RFU1RfVEFSR0VULCBQcm9maWxlLmNsYXNzLCBQUk9GSUxFX1RFU1RfVkVSU0lPTil9KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdyaXRlVGVzdChJUHJvZmlsZVtdIHByb2ZpbGVzKSB7Ci0JCQlzdGFydChQUk9GSUxFX1RFU1RfRUxFTUVOVCk7Ci0JCQl3cml0ZVByb2ZpbGVzKHByb2ZpbGVzKTsKLQkJCWVuZChQUk9GSUxFX1RFU1RfRUxFTUVOVCk7Ci0JCQlmbHVzaCgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd3JpdGVQcm9maWxlcyhJUHJvZmlsZVtdIHByb2ZpbGVzKSB7Ci0JCQlpZiAocHJvZmlsZXMubGVuZ3RoID4gMCkgewotCQkJCXN0YXJ0KFBST0ZJTEVTX0VMRU1FTlQpOwotCQkJCWF0dHJpYnV0ZShDT0xMRUNUSU9OX1NJWkVfQVRUUklCVVRFLCBwcm9maWxlcy5sZW5ndGgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJd3JpdGVQcm9maWxlKHByb2ZpbGVzW2ldKTsKLQkJCQl9Ci0JCQkJZW5kKFBST0ZJTEVTX0VMRU1FTlQpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgUHJvZmlsZVN0cmluZ1BhcnNlciBleHRlbmRzIFByb2ZpbGVQYXJzZXIgewotCi0JCXByaXZhdGUgSVByb2ZpbGVbXSBwcm9maWxlcyA9IG51bGw7Ci0KLQkJcHVibGljIFByb2ZpbGVTdHJpbmdQYXJzZXIoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgYnVuZGxlSWQpIHsKLQkJCXN1cGVyKGNvbnRleHQsIGJ1bmRsZUlkKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBwcm9maWxlU3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJdGhpcy5zdGF0dXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlnZXRQYXJzZXIoKTsKLQkJCQlUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOwotCQkJCXhtbFJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgUHJvZmlsZURvY0hhbmRsZXIoUFJPRklMRV9URVNUX0VMRU1FTlQsIHRlc3RIYW5kbGVyKSk7Ci0JCQkJeG1sUmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHByb2ZpbGVTdHJpbmcpKSk7Ci0JCQkJaWYgKGlzVmFsaWRYTUwoKSkgewotCQkJCQlwcm9maWxlcyA9IHRlc3RIYW5kbGVyLnByb2ZpbGVzOwotCQkJCX0KLQkJCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWZhaWwoKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgZmluYWwgY2xhc3MgUHJvZmlsZURvY0hhbmRsZXIgZXh0ZW5kcyBEb2NIYW5kbGVyIHsKLQotCQkJcHVibGljIFByb2ZpbGVEb2NIYW5kbGVyKFN0cmluZyByb290TmFtZSwgUm9vdEhhbmRsZXIgcm9vdEhhbmRsZXIpIHsKLQkJCQlzdXBlcihyb290TmFtZSwgcm9vdEhhbmRsZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCWlmIChQUk9GSUxFX1RFU1RfVEFSR0VULmVxdWFscyh0YXJnZXQpKSB7Ci0JCQkJCVN0cmluZyBjbGF6eiA9IGV4dHJhY3RQSUNsYXNzKGRhdGEpOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKCFDbGFzcy5mb3JOYW1lKGNsYXp6KS5lcXVhbHMoUHJvZmlsZS5jbGFzcykpIHsKLQkJCQkJCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJXcm9uZyBjbGFzcyAnIiArIGNsYXp6ICsgIicgaW4gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oIlByb2ZpbGUgY2xhc3MgJyIgKyBjbGF6eiArICInIG5vdCBmb3VuZCIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0KLQkJCQkJVmVyc2lvbiBwcm9maWxlVGVzdFZlcnNpb24gPSBleHRyYWN0UElWZXJzaW9uKHRhcmdldCwgZGF0YSk7Ci0JCQkJCWlmICghUFJPRklMRV9URVNUX1ZFUlNJT04uZXF1YWxzKHByb2ZpbGVUZXN0VmVyc2lvbikpIHsKLQkJCQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oIkJhZCBwcm9maWxlIHRlc3QgdmVyc2lvbi4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgZmluYWwgY2xhc3MgVGVzdEhhbmRsZXIgZXh0ZW5kcyBSb290SGFuZGxlciB7Ci0KLQkJCXByaXZhdGUgUHJvZmlsZXNIYW5kbGVyIHByb2ZpbGVzSGFuZGxlcjsKLQkJCUlQcm9maWxlW10gcHJvZmlsZXM7Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJvb3RBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJaWYgKFBST0ZJTEVTX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCWlmIChwcm9maWxlc0hhbmRsZXIgPT0gbnVsbCkgewotCQkJCQkJcHJvZmlsZXNIYW5kbGVyID0gbmV3IFByb2ZpbGVzSGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkKCkgewotCQkJCWlmIChpc1ZhbGlkWE1MKCkpIHsKLQkJCQkJaWYgKHByb2ZpbGVzSGFuZGxlciAhPSBudWxsKSB7Ci0JCQkJCQlwcm9maWxlcyA9IHByb2ZpbGVzSGFuZGxlci5nZXRQcm9maWxlcygpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlwcm90ZWN0ZWQgY2xhc3MgUHJvZmlsZXNIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCQkJcHJpdmF0ZSBmaW5hbCBNYXAgcHJvZmlsZUhhbmRsZXJzOwotCi0JCQlwdWJsaWMgUHJvZmlsZXNIYW5kbGVyKEFic3RyYWN0SGFuZGxlciBwYXJlbnRIYW5kbGVyLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCQlzdXBlcihwYXJlbnRIYW5kbGVyLCBQUk9GSUxFU19FTEVNRU5UKTsKLQkJCQlTdHJpbmcgc2l6ZSA9IHBhcnNlT3B0aW9uYWxBdHRyaWJ1dGUoYXR0cmlidXRlcywgQ09MTEVDVElPTl9TSVpFX0FUVFJJQlVURSk7Ci0JCQkJcHJvZmlsZUhhbmRsZXJzID0gKHNpemUgIT0gbnVsbCA/IG5ldyBIYXNoTWFwKG5ldyBJbnRlZ2VyKHNpemUpLmludFZhbHVlKCkpIDogbmV3IEhhc2hNYXAoNCkpOwotCQkJfQotCi0JCQlwdWJsaWMgSVByb2ZpbGVbXSBnZXRQcm9maWxlcygpIHsKLQkJCQlpZiAocHJvZmlsZUhhbmRsZXJzLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuIG5ldyBJUHJvZmlsZVswXTsKLQotCQkJCU1hcCBwcm9maWxlTWFwID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gcHJvZmlsZUhhbmRsZXJzLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJU3RyaW5nIHByb2ZpbGVJZCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQkJYWRkUHJvZmlsZShwcm9maWxlSWQsIHByb2ZpbGVNYXApOwotCQkJCX0KLQotCQkJCXJldHVybiAoSVByb2ZpbGVbXSkgcHJvZmlsZU1hcC52YWx1ZXMoKS50b0FycmF5KG5ldyBJUHJvZmlsZVtwcm9maWxlTWFwLnNpemUoKV0pOwotCQkJfQotCi0JCQlwcml2YXRlIHZvaWQgYWRkUHJvZmlsZShTdHJpbmcgcHJvZmlsZUlkLCBNYXAgcHJvZmlsZU1hcCkgewotCQkJCWlmIChwcm9maWxlTWFwLmNvbnRhaW5zS2V5KHByb2ZpbGVJZCkpCi0JCQkJCXJldHVybjsKLQotCQkJCVByb2ZpbGVIYW5kbGVyIHByb2ZpbGVIYW5kbGVyID0gKFByb2ZpbGVIYW5kbGVyKSBwcm9maWxlSGFuZGxlcnMuZ2V0KHByb2ZpbGVJZCk7Ci0JCQkJUHJvZmlsZSBwYXJlbnRQcm9maWxlID0gbnVsbDsKLQotCQkJCVN0cmluZyBwYXJlbnRJZCA9IHByb2ZpbGVIYW5kbGVyLmdldFBhcmVudElkKCk7Ci0JCQkJaWYgKHBhcmVudElkICE9IG51bGwpIHsKLQkJCQkJYWRkUHJvZmlsZShwYXJlbnRJZCwgcHJvZmlsZU1hcCk7Ci0JCQkJCXBhcmVudFByb2ZpbGUgPSAoUHJvZmlsZSkgcHJvZmlsZU1hcC5nZXQocGFyZW50SWQpOwotCQkJCX0KLQotCQkJCVByb2ZpbGUgcHJvZmlsZSA9IG5ldyBQcm9maWxlKHByb2ZpbGVJZCwgcGFyZW50UHJvZmlsZSwgcHJvZmlsZUhhbmRsZXIuZ2V0UHJvcGVydGllcygpKTsKLQkJCQlwcm9maWxlLnNldFRpbWVzdGFtcChwcm9maWxlSGFuZGxlci5nZXRUaW1lc3RhbXAoKSk7Ci0JCQkJSUluc3RhbGxhYmxlVW5pdFtdIGl1cyA9IHByb2ZpbGVIYW5kbGVyLmdldEluc3RhbGxhYmxlVW5pdHMoKTsKLQkJCQlpZiAoaXVzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSBpdXNbaV07Ci0JCQkJCQlwcm9maWxlLmFkZEluc3RhbGxhYmxlVW5pdChpdSk7Ci0JCQkJCQlNYXAgaXVQcm9wZXJ0aWVzID0gcHJvZmlsZUhhbmRsZXIuZ2V0SVVQcm9wZXJ0aWVzKGl1KTsKLQkJCQkJCWlmIChpdVByb3BlcnRpZXMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoSXRlcmF0b3IgaXQgPSBpdVByb3BlcnRpZXMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQkJCQkJCUVudHJ5IGVudHJ5ID0gKEVudHJ5KSBpdC5uZXh0KCk7Ci0JCQkJCQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLQkJCQkJCQkJU3RyaW5nIHZhbHVlID0gKFN0cmluZykgZW50cnkuZ2V0VmFsdWUoKTsKLQkJCQkJCQkJcHJvZmlsZS5zZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShpdSwga2V5LCB2YWx1ZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXByb2ZpbGVNYXAucHV0KHByb2ZpbGVJZCwgcHJvZmlsZSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKFBST0ZJTEVfRUxFTUVOVCkpIHsKLQkJCQkJbmV3IFByb2ZpbGVzUHJvZmlsZUhhbmRsZXIodGhpcywgYXR0cmlidXRlcywgcHJvZmlsZUhhbmRsZXJzKTsKLQkJCQl9IGVsc2UgewotCQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgY2xhc3MgUHJvZmlsZXNQcm9maWxlSGFuZGxlciBleHRlbmRzIFByb2ZpbGVIYW5kbGVyIHsKLQkJCXByaXZhdGUgZmluYWwgTWFwIHByb2ZpbGVIYW5kbGVyczsKLQotCQkJcHVibGljIFByb2ZpbGVzUHJvZmlsZUhhbmRsZXIoUHJvZmlsZXNIYW5kbGVyIHByb2ZpbGVzSGFuZGxlciwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzLCBNYXAgcHJvZmlsZUhhbmRsZXJzKSB7Ci0JCQkJdGhpcy5wcm9maWxlSGFuZGxlcnMgPSBwcm9maWxlSGFuZGxlcnM7Ci0JCQkJdGhpcy5wYXJlbnRIYW5kbGVyID0gcHJvZmlsZXNIYW5kbGVyOwotCQkJCXhtbFJlYWRlci5zZXRDb250ZW50SGFuZGxlcih0aGlzKTsKLQkJCQloYW5kbGVSb290QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSB7Ci0JCQkJaWYgKGlzVmFsaWRYTUwoKSkgewotCQkJCQlwcm9maWxlSGFuZGxlcnMucHV0KGdldFByb2ZpbGVJZCgpLCB0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJCXJldHVybiAiRXJyb3IgcGFyc2luZyBwcm9maWxlIHN0cmluZyI7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7Ci0JCQlNYXAgcmVzdWx0ID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZXN1bHQucHV0KHByb2ZpbGVzW2ldLmdldFByb2ZpbGVJZCgpLCBwcm9maWxlc1tpXSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb2ZpbGVQZXJzaXN0ZW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlQcm9maWxlW10gdGVzdFByb2ZpbGVzID0gY3JlYXRlVGVzdFByb2ZpbGVzKCk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQwID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxNDkyKTsKLQkJUHJvZmlsZVN0cmluZ1dyaXRlciB3cml0ZXIwID0gbmV3IFByb2ZpbGVTdHJpbmdXcml0ZXIob3V0cHV0MCk7Ci0JCXdyaXRlcjAud3JpdGVUZXN0KHRlc3RQcm9maWxlcyk7Ci0JCVN0cmluZyBwcm9maWxlVGV4dDAgPSBvdXRwdXQwLnRvU3RyaW5nKCk7Ci0JCW91dHB1dDAuY2xvc2UoKTsKLQotCQlQcm9maWxlU3RyaW5nUGFyc2VyIHBhcnNlciA9IG5ldyBQcm9maWxlU3RyaW5nUGFyc2VyKFRlc3RBY3RpdmF0b3IuY29udGV4dCwgVGVzdEFjdGl2YXRvci5QSV9QUk9WX1RFU1RTKTsKLQkJcGFyc2VyLnBhcnNlKHByb2ZpbGVUZXh0MCk7Ci0JCWFzc2VydFRydWUoIkVycm9yIHBhcnNpbmcgdGVzdCBwcm9maWxlOiAiICsgcGFyc2VyLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSwgcGFyc2VyLmdldFN0YXR1cygpLmlzT0soKSk7Ci0JCU1hcCBwcm9maWxlTWFwID0gKE1hcCkgcGFyc2VyLmdldFJvb3RPYmplY3QoKTsKLQkJSVByb2ZpbGUgcGFyZW50ID0gKElQcm9maWxlKSBwcm9maWxlTWFwLmdldChwYXJlbnRJZCk7Ci0JCUlQcm9maWxlIGNoaWxkMCA9IChJUHJvZmlsZSkgcHJvZmlsZU1hcC5nZXQoY2hpbGQwSWQpOwotCQlJUHJvZmlsZSBjaGlsZDEgPSAoSVByb2ZpbGUpIHByb2ZpbGVNYXAuZ2V0KGNoaWxkMUlkKTsKLQkJSVByb2ZpbGUgZ3JhbmRjaGlsZDAwID0gKElQcm9maWxlKSBwcm9maWxlTWFwLmdldChncmFuZGNoaWxkMDBJZCk7Ci0JCUlQcm9maWxlIGdyYW5kY2hpbGQwMSA9IChJUHJvZmlsZSkgcHJvZmlsZU1hcC5nZXQoZ3JhbmRjaGlsZDAxSWQpOwotCQlJUHJvZmlsZSBncmFuZGNoaWxkMDIgPSAoSVByb2ZpbGUpIHByb2ZpbGVNYXAuZ2V0KGdyYW5kY2hpbGQwMklkKTsKLQkJSVByb2ZpbGUgZ3JhbmRjaGlsZDEwID0gKElQcm9maWxlKSBwcm9maWxlTWFwLmdldChncmFuZGNoaWxkMTBJZCk7Ci0JCUlQcm9maWxlIGdyYW5kY2hpbGQxMSA9IChJUHJvZmlsZSkgcHJvZmlsZU1hcC5nZXQoZ3JhbmRjaGlsZDExSWQpOwotCQlJUHJvZmlsZVtdIHByb2ZpbGVzID0ge3BhcmVudCwgY2hpbGQwLCBjaGlsZDEsIGdyYW5kY2hpbGQwMCwgZ3JhbmRjaGlsZDAxLCBncmFuZGNoaWxkMDIsIGdyYW5kY2hpbGQxMCwgZ3JhbmRjaGlsZDExfTsKLQkJdmFsaWRhdGVQcm9maWxlcyhwcm9maWxlcyk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQxID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxNDkyKTsKLQkJUHJvZmlsZVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgUHJvZmlsZVN0cmluZ1dyaXRlcihvdXRwdXQxKTsKLQotCQl3cml0ZXIud3JpdGVUZXN0KHByb2ZpbGVzKTsKLQkJU3RyaW5nIHByb2ZpbGVUZXh0MSA9IG91dHB1dDEudG9TdHJpbmcoKTsKLQkJb3V0cHV0MS5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJQcm9maWxlIHdyaXRlIGFmdGVyIHJlYWQgYWZ0ZXIgd3JpdGUgcHJvZHVjZWQgZGlmZmVyZW50IFhNTCIsIHByb2ZpbGVUZXh0MS5lcXVhbHMocHJvZmlsZVRleHQwKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VuZ2luZS9Ub3VjaHBvaW50VGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2VuZ2luZS9Ub3VjaHBvaW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGJlZDg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9lbmdpbmUvVG91Y2hwb2ludFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5lbmdpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmVuZ2luZS5QaGFzZVRlc3QuVGVzdFBoYXNlU2V0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFNpbXBsZSB0ZXN0IG9mIHRoZSBlbmdpbmUgQVBJLgotICovCi1wdWJsaWMgY2xhc3MgVG91Y2hwb2ludFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCi0Jc3RhdGljIHZvbGF0aWxlIFRlc3RUb3VjaHBvaW50IHRlc3RUb3VjaHBvaW50OwotCi0JYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFRlc3RUb3VjaHBvaW50IGV4dGVuZHMgVG91Y2hwb2ludCB7Ci0JCWludCBjb21wbGV0ZU9wZXJhbmQ7Ci0JCWludCBjb21wbGV0ZVBoYXNlOwotCQlpbnQgaW5pdGlhbGl6ZU9wZXJhbmQ7Ci0JCWludCBpbml0aWFsaXplUGhhc2U7Ci0KLQkJcHVibGljIFRlc3RUb3VjaHBvaW50KCkgewotCQkJdGVzdFRvdWNocG9pbnQgPSB0aGlzOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgY29tcGxldGVPcGVyYW5kKElQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBwaGFzZUlkLCBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCQljb21wbGV0ZU9wZXJhbmQrKzsKLQkJCXJldHVybiBzdXBlci5jb21wbGV0ZU9wZXJhbmQocHJvZmlsZSwgcGhhc2VJZCwgb3BlcmFuZCwgcGFyYW1ldGVycyk7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBjb21wbGV0ZVBoYXNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIHBoYXNlSWQsIE1hcCB0b3VjaHBvaW50UGFyYW1ldGVycykgewotCQkJY29tcGxldGVQaGFzZSsrOwotCQkJcmV0dXJuIHN1cGVyLmNvbXBsZXRlUGhhc2UobW9uaXRvciwgcHJvZmlsZSwgcGhhc2VJZCwgdG91Y2hwb2ludFBhcmFtZXRlcnMpOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgaW5pdGlhbGl6ZU9wZXJhbmQoSVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIHBoYXNlSWQsIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQgb3BlcmFuZCwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJCWluaXRpYWxpemVPcGVyYW5kKys7Ci0JCQlyZXR1cm4gc3VwZXIuaW5pdGlhbGl6ZU9wZXJhbmQocHJvZmlsZSwgcGhhc2VJZCwgb3BlcmFuZCwgcGFyYW1ldGVycyk7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBpbml0aWFsaXplUGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgcGhhc2VJZCwgTWFwIHRvdWNocG9pbnRQYXJhbWV0ZXJzKSB7Ci0JCQlpbml0aWFsaXplUGhhc2UrKzsKLQkJCXJldHVybiBzdXBlci5pbml0aWFsaXplUGhhc2UobW9uaXRvciwgcHJvZmlsZSwgcGhhc2VJZCwgdG91Y2hwb2ludFBhcmFtZXRlcnMpOwotCQl9Ci0KLQkJcHVibGljIFByb3Zpc2lvbmluZ0FjdGlvbiBnZXRBY3Rpb24oU3RyaW5nIGFjdGlvbklkKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBUb3VjaHBvaW50VHlwZSBnZXRUb3VjaHBvaW50VHlwZSgpIHsKLQkJCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludFR5cGUoInRlc3QiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE9wZXJhbmRUZXN0VG91Y2hwb2ludCBleHRlbmRzIFRlc3RUb3VjaHBvaW50IHsKLQkJcHVibGljIElTdGF0dXMgY29tcGxldGVPcGVyYW5kKElQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBwaGFzZUlkLCBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgaW5pdGlhbGl6ZU9wZXJhbmQpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIGNvbXBsZXRlT3BlcmFuZCk7Ci0JCQlzdXBlci5jb21wbGV0ZU9wZXJhbmQocHJvZmlsZSwgcGhhc2VJZCwgb3BlcmFuZCwgcGFyYW1ldGVycyk7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgaW5pdGlhbGl6ZU9wZXJhbmQpOwotCQkJYXNzZXJ0RXF1YWxzKDEsIGNvbXBsZXRlT3BlcmFuZCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIGluaXRpYWxpemVPcGVyYW5kKElQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBwaGFzZUlkLCBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgaW5pdGlhbGl6ZU9wZXJhbmQpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIGNvbXBsZXRlT3BlcmFuZCk7Ci0JCQlzdXBlci5pbml0aWFsaXplT3BlcmFuZChwcm9maWxlLCBwaGFzZUlkLCBvcGVyYW5kLCBwYXJhbWV0ZXJzKTsKLQkJCWFzc2VydEVxdWFscygxLCBpbml0aWFsaXplT3BlcmFuZCk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgY29tcGxldGVPcGVyYW5kKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBQaGFzZVRlc3RUb3VjaHBvaW50IGV4dGVuZHMgVGVzdFRvdWNocG9pbnQgewotCQlwdWJsaWMgSVN0YXR1cyBjb21wbGV0ZVBoYXNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIHBoYXNlSWQsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgaW5pdGlhbGl6ZVBoYXNlKTsKLQkJCWFzc2VydEVxdWFscygwLCBjb21wbGV0ZVBoYXNlKTsKLQkJCXN1cGVyLmNvbXBsZXRlUGhhc2UobW9uaXRvciwgcHJvZmlsZSwgcGhhc2VJZCwgcGFyYW1ldGVycyk7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgaW5pdGlhbGl6ZVBoYXNlKTsKLQkJCWFzc2VydEVxdWFscygxLCBjb21wbGV0ZVBoYXNlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgaW5pdGlhbGl6ZVBoYXNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIHBoYXNlSWQsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgaW5pdGlhbGl6ZVBoYXNlKTsKLQkJCWFzc2VydEVxdWFscygwLCBjb21wbGV0ZVBoYXNlKTsKLQkJCXN1cGVyLmluaXRpYWxpemVQaGFzZShtb25pdG9yLCBwcm9maWxlLCBwaGFzZUlkLCBwYXJhbWV0ZXJzKTsKLQkJCWFzc2VydEVxdWFscygxLCBpbml0aWFsaXplUGhhc2UpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIGNvbXBsZXRlUGhhc2UpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFNlcnZpY2VSZWZlcmVuY2UgZW5naW5lUmVmOwotCXByaXZhdGUgSUVuZ2luZSBlbmdpbmU7Ci0KLQlwdWJsaWMgVG91Y2hwb2ludFRlc3QoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JcHVibGljIFRvdWNocG9pbnRUZXN0KCkgewotCQlzdXBlcigiIik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZW5naW5lUmVmID0gVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZVJlZmVyZW5jZShJRW5naW5lLlNFUlZJQ0VfTkFNRSk7Ci0JCWVuZ2luZSA9IChJRW5naW5lKSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlKGVuZ2luZVJlZik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZW5naW5lID0gbnVsbDsKLQkJVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCkudW5nZXRTZXJ2aWNlKGVuZ2luZVJlZik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaXRDb21wbGV0ZU9wZXJhbmQoKSB7Ci0JCVBoYXNlU2V0IHBoYXNlU2V0ID0gbmV3IFRlc3RQaGFzZVNldCgpOwotCQlJUHJvZmlsZSBwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgidGVzdFByb2ZpbGUiKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgcGhhc2VTZXQsIG5ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kW10ge25ldyBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKG51bGwsIGNyZWF0ZVRlc3RJVSgib3BlcmFuZFRlc3QiKSl9LCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3RUb3VjaHBvaW50LmluaXRpYWxpemVPcGVyYW5kKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHRlc3RUb3VjaHBvaW50LmNvbXBsZXRlT3BlcmFuZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluaXRDb21wbGV0ZVBoYXNlKCkgewotCQlQaGFzZVNldCBwaGFzZVNldCA9IG5ldyBUZXN0UGhhc2VTZXQoKTsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoInRlc3RQcm9maWxlIik7Ci0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIHBoYXNlU2V0LCBuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZFtdIHtuZXcgSW5zdGFsbGFibGVVbml0T3BlcmFuZChudWxsLCBjcmVhdGVUZXN0SVUoInBoYXNlVGVzdCIpKX0sIG51bGwsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGVzdFRvdWNocG9pbnQuaW5pdGlhbGl6ZU9wZXJhbmQpOwotCQlhc3NlcnRFcXVhbHMoMSwgdGVzdFRvdWNocG9pbnQuY29tcGxldGVPcGVyYW5kKTsKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlVGVzdElVKFN0cmluZyB0b3VjaHBvaW50TmFtZSkgewotCQlJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG5ldyBNZXRhZGF0YUZhY3RvcnkuSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24oKTsKLQkJZGVzY3JpcHRpb24uc2V0SWQoIm9yZy5lY2xpcHNlLnRlc3QiKTsKLQkJZGVzY3JpcHRpb24uc2V0VmVyc2lvbihuZXcgVmVyc2lvbigiMS4wLjAiKSk7Ci0JCWRlc2NyaXB0aW9uLnNldFRvdWNocG9pbnRUeXBlKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50VHlwZSh0b3VjaHBvaW50TmFtZSwgbmV3IFZlcnNpb24oIjEuMC4wIikpKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB1bml0ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdChkZXNjcmlwdGlvbik7Ci0JCXJldHVybiBjcmVhdGVSZXNvbHZlZElVKHVuaXQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2V4dGVuc2lvbmxvY2F0aW9uL0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZXh0ZW5zaW9ubG9jYXRpb24vQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUxYjI2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZXh0ZW5zaW9ubG9jYXRpb24vQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmV4dGVuc2lvbmxvY2F0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUGVyZm9ybXMgYWxsIGF1dG9tYXRlZCBkaXJlY3RvciB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShFeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnlUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEV4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeVRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5VGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxYjZlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmV4dGVuc2lvbmxvY2F0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5leHRlbnNpb25sb2NhdGlvbi5FeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnlUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQotCXByaXZhdGUgRmlsZSB0ZW1wRGlyZWN0b3J5OwotCXByaXZhdGUgRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5IGZhY3Rvcnk7Ci0KLQlwdWJsaWMgRXh0ZW5zaW9uTG9jYXRpb25BcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlkZWxldGUodGVtcERpcmVjdG9yeSk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJU3RyaW5nIHRlbXBEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7Ci0JCXRlbXBEaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wRGlyLCAiZXh0ZW5zaW9ubG9jYXRpb250ZXN0Iik7Ci0JCWRlbGV0ZSh0ZW1wRGlyZWN0b3J5KTsKLQkJdGVtcERpcmVjdG9yeS5ta2RpcnMoKTsKLQkJZmFjdG9yeSA9IG5ldyBFeHRlbnNpb25Mb2NhdGlvbkFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkoKTsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRGaWxlKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlVUkwgZmlsZVVSTCA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpLmdldEVudHJ5KHBhdGgpOwotCQlyZXR1cm4gbmV3IEZpbGUoRmlsZUxvY2F0b3IudG9GaWxlVVJMKGZpbGVVUkwpLmdldFBhdGgoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vbkZpbGVVUkwoKSB7Ci0JCXRyeSB7Ci0JCQlVUkwgbm9uRmlsZVVSTCA9IG5ldyBVUkwoImh0dHA6Ly93d3cuZWNsaXBzZS5vcmciKTsKLQkJCWZhY3RvcnkubG9hZChub25GaWxlVVJMLCBnZXRNb25pdG9yKCkpOwotCQkJZmFpbCgiMC4xIik7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjAuNSIsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC45OSIsIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vbkV4aXN0ZW50RmlsZSgpIHsKLQkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wRGlyZWN0b3J5LCAibm9uZXhpc3RlbnQiKTsKLQkJZGVsZXRlKGRpcmVjdG9yeSk7Ci0JCXRyeSB7Ci0JCQlmYWN0b3J5LmxvYWQoZGlyZWN0b3J5LnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCQlmYWlsKCIwLjEiKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiMC41IiwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5ELCBlLmdldFN0YXR1cygpLmdldENvZGUoKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjk5IiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90RGlyZWN0b3J5KCkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh0ZW1wRGlyZWN0b3J5LCAiZXhpc3RzLmZpbGUiKTsKLQkJdHJ5IHsKLQkJCWZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJZmFjdG9yeS5sb2FkKGZpbGUudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJCWZhaWwoIjAuMSIpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCIwLjUiLCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQsIGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuOTkiLCBlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4xMDAiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb0ZlYXR1cmVPclBsdWdpbnNEaXJlY3RvcnkoKSB7Ci0JCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUodGVtcERpcmVjdG9yeSwgImV4aXN0cyIpOwotCQlkaXJlY3RvcnkubWtkaXJzKCk7Ci0JCXRyeSB7Ci0JCQlmYWN0b3J5LmxvYWQoZGlyZWN0b3J5LnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5EKQotCQkJCXJldHVybjsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuOTkiLCBlKTsKLQkJfQotCQlmYWlsKCIxLjAiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlGZWF0dXJlQW5kUGx1Z2luc0RpcmVjdG9yeSgpIHsKLQkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wRGlyZWN0b3J5LCAiZXhpc3RzIik7Ci0JCWRpcmVjdG9yeS5ta2RpcnMoKTsKLQkJbmV3IEZpbGUoZGlyZWN0b3J5LCAicGx1Z2lucyIpLm1rZGlyKCk7Ci0JCW5ldyBGaWxlKGRpcmVjdG9yeSwgImZlYXR1cmVzIikubWtkaXIoKTsKLQkJdHJ5IHsKLQkJCWZhY3RvcnkubG9hZChkaXJlY3RvcnkudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMSIsIGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC45OSIsIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5RmVhdHVyZXNEaXJlY3RvcnkoKSB7Ci0JCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUodGVtcERpcmVjdG9yeSwgImV4aXN0cyIpOwotCQlkaXJlY3RvcnkubWtkaXJzKCk7Ci0JCW5ldyBGaWxlKGRpcmVjdG9yeSwgImZlYXR1cmVzIikubWtkaXIoKTsKLQkJdHJ5IHsKLQkJCWZhY3RvcnkubG9hZChkaXJlY3RvcnkudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMSIsIGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC45OSIsIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVtcHR5UGx1Z2luc0RpcmVjdG9yeSgpIHsKLQkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wRGlyZWN0b3J5LCAiZXhpc3RzIik7Ci0JCWRpcmVjdG9yeS5ta2RpcnMoKTsKLQkJbmV3IEZpbGUoZGlyZWN0b3J5LCAicGx1Z2lucyIpLm1rZGlyKCk7Ci0JCXRyeSB7Ci0JCQlmYWN0b3J5LmxvYWQoZGlyZWN0b3J5LnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjEiLCBlKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuOTkiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFY2xpcHNlQmFzZUVtcHR5RmVhdHVyZUFuZFBsdWdpbnNEaXJlY3RvcnkoKSB7Ci0JCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUodGVtcERpcmVjdG9yeSwgImV4aXN0cyIpOwotCQlkaXJlY3RvcnkubWtkaXJzKCk7Ci0JCUZpbGUgZWNsaXBzZURpcmVjdG9yeSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgImVjbGlwc2UiKTsKLQkJZWNsaXBzZURpcmVjdG9yeS5ta2RpcigpOwotCQluZXcgRmlsZShlY2xpcHNlRGlyZWN0b3J5LCAicGx1Z2lucyIpLm1rZGlyKCk7Ci0JCW5ldyBGaWxlKGVjbGlwc2VEaXJlY3RvcnksICJmZWF0dXJlcyIpLm1rZGlyKCk7Ci0JCXRyeSB7Ci0JCQlmYWN0b3J5LmxvYWQoZGlyZWN0b3J5LnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjEiLCBlKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuOTkiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb3RFY2xpcHNlQmFzZUVtcHR5RmVhdHVyZUFuZFBsdWdpbnNEaXJlY3RvcnkoKSB7Ci0JCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUodGVtcERpcmVjdG9yeSwgImV4aXN0cyIpOwotCQlkaXJlY3RvcnkubWtkaXJzKCk7Ci0JCUZpbGUgZWNsaXBzZURpcmVjdG9yeSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgIm5vdGVjbGlwc2UiKTsKLQkJZWNsaXBzZURpcmVjdG9yeS5ta2RpcigpOwotCQluZXcgRmlsZShlY2xpcHNlRGlyZWN0b3J5LCAicGx1Z2lucyIpLm1rZGlyKCk7Ci0JCW5ldyBGaWxlKGVjbGlwc2VEaXJlY3RvcnksICJmZWF0dXJlcyIpLm1rZGlyKCk7Ci0JCXRyeSB7Ci0JCQlmYWN0b3J5LmxvYWQoZGlyZWN0b3J5LnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5EKQotCQkJCXJldHVybjsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuOTkiLCBlKTsKLQkJfQotCQlmYWlsKCIxLjAiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsRmVhdHVyZXNhbmRQbHVnaW5zRGlyZWN0b3J5KCkgewotCQlGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKHRlbXBEaXJlY3RvcnksICJleGlzdHMiKTsKLQkJZGlyZWN0b3J5Lm1rZGlycygpOwotCQljb3B5KCIxLjAiLCBnZXRUZXN0RGF0YSgiMS4xIiwgIi90ZXN0RGF0YS9leHRlbnNpb25sb2NhdGlvbiIpLCBkaXJlY3RvcnkpOwotCQl0cnkgewotCQkJVVJMIGxvY2F0aW9uID0gZGlyZWN0b3J5LnRvVVJMKCk7Ci0JCQl0cnkgewotCQkJCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbyA9IGZhY3RvcnkubG9hZChsb2NhdGlvbiwgZ2V0TW9uaXRvcigpKTsKLQkJCQlpZiAocmVwby5nZXRBcnRpZmFjdEtleXMoKS5sZW5ndGggIT0gMikKLQkJCQkJZmFpbCgiMi4xIik7Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZXgpIHsKLQkJCQlmYWlsKCIyLjAiKTsKLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjMuOTkiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb3JtYWxGZWF0dXJlc0RpcmVjdG9yeSgpIHsKLQkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wRGlyZWN0b3J5LCAiZXhpc3RzL2ZlYXR1cmVzIik7Ci0JCWRpcmVjdG9yeS5ta2RpcnMoKTsKLQkJRmlsZSBmZWF0dXJlcyA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgImZlYXR1cmVzIik7Ci0JCWZlYXR1cmVzLm1rZGlyKCk7Ci0JCWNvcHkoIjEuMCIsIGdldFRlc3REYXRhKCIxLjEiLCAiL3Rlc3REYXRhL2V4dGVuc2lvbmxvY2F0aW9uL2ZlYXR1cmVzIiksIGZlYXR1cmVzKTsKLQkJdHJ5IHsKLQkJCVVSTCBsb2NhdGlvbiA9IGRpcmVjdG9yeS50b1VSTCgpOwotCQkJdHJ5IHsKLQkJCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG8gPSBmYWN0b3J5LmxvYWQobG9jYXRpb24sIGdldE1vbml0b3IoKSk7Ci0JCQkJaWYgKHJlcG8uZ2V0QXJ0aWZhY3RLZXlzKCkubGVuZ3RoICE9IDEpCi0JCQkJCWZhaWwoIjIuMSIpOwotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZmFpbCgiMi4wIik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIzLjk5IiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsUGx1Z2luc0RpcmVjdG9yeSgpIHsKLQkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wRGlyZWN0b3J5LCAiZXhpc3RzL3BsdWdpbnMiKTsKLQkJZGlyZWN0b3J5Lm1rZGlycygpOwotCQlGaWxlIHBsdWdpbnMgPSBuZXcgRmlsZShkaXJlY3RvcnksICJwbHVnaW5zIik7Ci0JCXBsdWdpbnMubWtkaXIoKTsKLQkJY29weSgiMS4wIiwgZ2V0VGVzdERhdGEoIjEuMSIsICIvdGVzdERhdGEvZXh0ZW5zaW9ubG9jYXRpb24vcGx1Z2lucyIpLCBwbHVnaW5zKTsKLQkJdHJ5IHsKLQkJCVVSTCBsb2NhdGlvbiA9IGRpcmVjdG9yeS50b1VSTCgpOwotCQkJdHJ5IHsKLQkJCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG8gPSBmYWN0b3J5LmxvYWQobG9jYXRpb24sIGdldE1vbml0b3IoKSk7Ci0JCQkJaWYgKHJlcG8uZ2V0QXJ0aWZhY3RLZXlzKCkubGVuZ3RoICE9IDEpCi0JCQkJCWZhaWwoIjIuMSIpOwotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZmFpbCgiMi4wIik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIzLjk5IiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWNsaXBzZUJhc2VOb3JtYWxGZWF0dXJlc2FuZFBsdWdpbnNEaXJlY3RvcnkoKSB7Ci0JCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUodGVtcERpcmVjdG9yeSwgImV4aXN0cyIpOwotCQlkaXJlY3RvcnkubWtkaXJzKCk7Ci0JCUZpbGUgZWNsaXBzZURpcmVjdG9yeSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgImVjbGlwc2UiKTsKLQkJY29weSgiMS4xIiwgZ2V0VGVzdERhdGEoIjEuMSIsICIvdGVzdERhdGEvZXh0ZW5zaW9ubG9jYXRpb24iKSwgZWNsaXBzZURpcmVjdG9yeSk7Ci0JCXRyeSB7Ci0JCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG8gPSBmYWN0b3J5LmxvYWQoZGlyZWN0b3J5LnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCQlpZiAocmVwby5nZXRBcnRpZmFjdEtleXMoKS5sZW5ndGggIT0gMikKLQkJCQlmYWlsKCIxLjAiKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuNSIsIGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC45OSIsIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVwZGF0ZVNpdGVYTUxVUkwoKSB7Ci0JCUZpbGUgc2l0ZSA9IGdldFRlc3REYXRhKCIwLjEiLCAiL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZSIpOwotCQl0cnkgewotCQkJZmFjdG9yeS5sb2FkKHNpdGUudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChlLmdldFN0YXR1cygpLmdldENvZGUoKSA9PSBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQpCi0JCQkJcmV0dXJuOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC45OSIsIGUpOwotCQl9Ci0JCWZhaWwoIjEuMCIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RYWFhTaXRlWFhYWE1MVVJMKCkgewotCQlGaWxlIHNpdGUgPSBnZXRUZXN0RGF0YSgiMC4xIiwgIi90ZXN0RGF0YS91cGRhdGVzaXRlL3h4eHNpdGV4eHgiKTsKLQkJdHJ5IHsKLQkJCWZhY3RvcnkubG9hZChzaXRlLnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5EKQotCQkJCXJldHVybjsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuOTkiLCBlKTsKLQkJfQotCQlmYWlsKCIxLjAiKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5VGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2V4dGVuc2lvbmxvY2F0aW9uL0V4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgyZDE2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZXh0ZW5zaW9ubG9jYXRpb24vRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmV4dGVuc2lvbmxvY2F0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmV4dGVuc2lvbmxvY2F0aW9uLkV4dGVuc2lvbkxvY2F0aW9uTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci0KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25Mb2NhdGlvbk1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnlUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQotCXByaXZhdGUgRmlsZSB0ZW1wRGlyZWN0b3J5OwotCXByaXZhdGUgRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5IGZhY3Rvcnk7Ci0KLQlwdWJsaWMgRXh0ZW5zaW9uTG9jYXRpb25NZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlkZWxldGUodGVtcERpcmVjdG9yeSk7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJU3RyaW5nIHRlbXBEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIik7Ci0JCXRlbXBEaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wRGlyLCAiZXh0ZW5zaW9ubG9jYXRpb250ZXN0Iik7Ci0JCWRlbGV0ZSh0ZW1wRGlyZWN0b3J5KTsKLQkJdGVtcERpcmVjdG9yeS5ta2RpcnMoKTsKLQkJZmFjdG9yeSA9IG5ldyBFeHRlbnNpb25Mb2NhdGlvbk1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9uRmlsZVVSTCgpIHsKLQkJdHJ5IHsKLQkJCVVSTCBub25GaWxlVVJMID0gbmV3IFVSTCgiaHR0cDovL3d3dy5lY2xpcHNlLm9yZyIpOwotCQkJZmFjdG9yeS5sb2FkKG5vbkZpbGVVUkwsIGdldE1vbml0b3IoKSk7Ci0JCQlmYWlsKCIwLjEiKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiMC4yIiwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5ELCBlLmdldFN0YXR1cygpLmdldENvZGUoKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjMiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb25FeGlzdGVudEZpbGUoKSB7Ci0JCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUodGVtcERpcmVjdG9yeSwgIm5vbmV4aXN0ZW50Iik7Ci0JCWRlbGV0ZShkaXJlY3RvcnkpOwotCQl0cnkgewotCQkJZmFjdG9yeS5sb2FkKGRpcmVjdG9yeS50b1VSTCgpLCBnZXRNb25pdG9yKCkpOwotCQkJZmFpbCgiMC4xIik7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIjAuMiIsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCwgZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4zIiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm90RGlyZWN0b3J5KCkgewotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh0ZW1wRGlyZWN0b3J5LCAiZXhpc3RzLmZpbGUiKTsKLQkJdHJ5IHsKLQkJCWZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCQkJZmFjdG9yeS5sb2FkKGZpbGUudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJCWZhaWwoIjAuMSIpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCIwLjIiLCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQsIGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMyIsIGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjQiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb0ZlYXR1cmVPclBsdWdpbnNEaXJlY3RvcnkoKSB7Ci0JCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUodGVtcERpcmVjdG9yeSwgImV4aXN0cyIpOwotCQlkaXJlY3RvcnkubWtkaXJzKCk7Ci0JCXRyeSB7Ci0JCQlmYWN0b3J5LmxvYWQoZGlyZWN0b3J5LnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCQlmYWlsKCIwLjEiKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWFzc2VydEVxdWFscygiMC4yIiwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5ELCBlLmdldFN0YXR1cygpLmdldENvZGUoKSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjMiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUZlYXR1cmVBbmRQbHVnaW5zRGlyZWN0b3J5KCkgewotCQlGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKHRlbXBEaXJlY3RvcnksICJleGlzdHMiKTsKLQkJZGlyZWN0b3J5Lm1rZGlycygpOwotCQluZXcgRmlsZShkaXJlY3RvcnksICJwbHVnaW5zIikubWtkaXIoKTsKLQkJbmV3IEZpbGUoZGlyZWN0b3J5LCAiZmVhdHVyZXMiKS5ta2RpcigpOwotCQl0cnkgewotCQkJZmFjdG9yeS5sb2FkKGRpcmVjdG9yeS50b1VSTCgpLCBnZXRNb25pdG9yKCkpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4xIik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjk5IiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlGZWF0dXJlc0RpcmVjdG9yeSgpIHsKLQkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wRGlyZWN0b3J5LCAiZXhpc3RzIik7Ci0JCWRpcmVjdG9yeS5ta2RpcnMoKTsKLQkJbmV3IEZpbGUoZGlyZWN0b3J5LCAiZmVhdHVyZXMiKS5ta2RpcigpOwotCQl0cnkgewotCQkJZmFjdG9yeS5sb2FkKGRpcmVjdG9yeS50b1VSTCgpLCBnZXRNb25pdG9yKCkpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4xIik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjk5IiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlQbHVnaW5zRGlyZWN0b3J5KCkgewotCQlGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKHRlbXBEaXJlY3RvcnksICJleGlzdHMiKTsKLQkJZGlyZWN0b3J5Lm1rZGlycygpOwotCQluZXcgRmlsZShkaXJlY3RvcnksICJwbHVnaW5zIikubWtkaXIoKTsKLQkJdHJ5IHsKLQkJCWZhY3RvcnkubG9hZChkaXJlY3RvcnkudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMSIpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC45OSIsIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEVjbGlwc2VCYXNlRW1wdHlGZWF0dXJlQW5kUGx1Z2luc0RpcmVjdG9yeSgpIHsKLQkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wRGlyZWN0b3J5LCAiZXhpc3RzIik7Ci0JCWRpcmVjdG9yeS5ta2RpcnMoKTsKLQkJRmlsZSBlY2xpcHNlRGlyZWN0b3J5ID0gbmV3IEZpbGUoZGlyZWN0b3J5LCAiZWNsaXBzZSIpOwotCQllY2xpcHNlRGlyZWN0b3J5Lm1rZGlyKCk7Ci0JCW5ldyBGaWxlKGVjbGlwc2VEaXJlY3RvcnksICJwbHVnaW5zIikubWtkaXIoKTsKLQkJbmV3IEZpbGUoZWNsaXBzZURpcmVjdG9yeSwgImZlYXR1cmVzIikubWtkaXIoKTsKLQkJdHJ5IHsKLQkJCWZhY3RvcnkubG9hZChkaXJlY3RvcnkudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMSIpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC45OSIsIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vdEVjbGlwc2VCYXNlRW1wdHlGZWF0dXJlQW5kUGx1Z2luc0RpcmVjdG9yeSgpIHsKLQkJRmlsZSBkaXJlY3RvcnkgPSBuZXcgRmlsZSh0ZW1wRGlyZWN0b3J5LCAiZXhpc3RzIik7Ci0JCWRpcmVjdG9yeS5ta2RpcnMoKTsKLQkJRmlsZSBlY2xpcHNlRGlyZWN0b3J5ID0gbmV3IEZpbGUoZGlyZWN0b3J5LCAibm90ZWNsaXBzZSIpOwotCQllY2xpcHNlRGlyZWN0b3J5Lm1rZGlyKCk7Ci0JCW5ldyBGaWxlKGVjbGlwc2VEaXJlY3RvcnksICJwbHVnaW5zIikubWtkaXIoKTsKLQkJbmV3IEZpbGUoZWNsaXBzZURpcmVjdG9yeSwgImZlYXR1cmVzIikubWtkaXIoKTsKLQkJdHJ5IHsKLQkJCWZhY3RvcnkubG9hZChkaXJlY3RvcnkudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJCWZhaWwoIjAuMSIpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0RXF1YWxzKCIwLjIiLCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQsIGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuOTkiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb3JtYWxGZWF0dXJlc2FuZFBsdWdpbnNEaXJlY3RvcnkoKSB7Ci0JCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUodGVtcERpcmVjdG9yeSwgImV4aXN0cyIpOwotCQlkaXJlY3RvcnkubWtkaXJzKCk7Ci0JCWNvcHkoIjEuMCIsIGdldFRlc3REYXRhKCIxLjEiLCAiL3Rlc3REYXRhL2V4dGVuc2lvbmxvY2F0aW9uIiksIGRpcmVjdG9yeSk7Ci0JCXRyeSB7Ci0JCQlVUkwgbG9jYXRpb24gPSBkaXJlY3RvcnkudG9VUkwoKTsKLQkJCXRyeSB7Ci0JCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gZmFjdG9yeS5sb2FkKGxvY2F0aW9uLCBnZXRNb25pdG9yKCkpOwotCQkJCWlmIChyZXBvLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS50b0NvbGxlY3Rpb24oKS5zaXplKCkgIT0gMykKLQkJCQkJZmFpbCgiMi45OSIpOwotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZmFpbCgiMi4wIik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCI0Ljk5IiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsRmVhdHVyZXNEaXJlY3RvcnkoKSB7Ci0JCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUodGVtcERpcmVjdG9yeSwgImV4aXN0cy9mZWF0dXJlcyIpOwotCQlkaXJlY3RvcnkubWtkaXJzKCk7Ci0JCUZpbGUgZmVhdHVyZXMgPSBuZXcgRmlsZShkaXJlY3RvcnksICJmZWF0dXJlcyIpOwotCQlmZWF0dXJlcy5ta2RpcigpOwotCQljb3B5KCIxLjAiLCBnZXRUZXN0RGF0YSgiMS4xIiwgIi90ZXN0RGF0YS9leHRlbnNpb25sb2NhdGlvbi9mZWF0dXJlcyIpLCBmZWF0dXJlcyk7Ci0JCXRyeSB7Ci0JCQlVUkwgbG9jYXRpb24gPSBkaXJlY3RvcnkudG9VUkwoKTsKLQkJCXRyeSB7Ci0JCQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gZmFjdG9yeS5sb2FkKGxvY2F0aW9uLCBnZXRNb25pdG9yKCkpOwotCQkJCWlmIChyZXBvLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS50b0NvbGxlY3Rpb24oKS5zaXplKCkgIT0gMikKLQkJCQkJZmFpbCgiMy4wIik7Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZXgpIHsKLQkJCQlmYWlsKCIyLjAiKTsKLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjQuOTkiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3ROb3JtYWxQbHVnaW5zRGlyZWN0b3J5KCkgewotCQlGaWxlIGRpcmVjdG9yeSA9IG5ldyBGaWxlKHRlbXBEaXJlY3RvcnksICJleGlzdHMvcGx1Z2lucyIpOwotCQlkaXJlY3RvcnkubWtkaXJzKCk7Ci0JCUZpbGUgcGx1Z2lucyA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgInBsdWdpbnMiKTsKLQkJcGx1Z2lucy5ta2RpcigpOwotCQljb3B5KCIxLjAiLCBnZXRUZXN0RGF0YSgiMS4xIiwgIi90ZXN0RGF0YS9leHRlbnNpb25sb2NhdGlvbi9wbHVnaW5zIiksIHBsdWdpbnMpOwotCQl0cnkgewotCQkJVVJMIGxvY2F0aW9uID0gZGlyZWN0b3J5LnRvVVJMKCk7Ci0JCQl0cnkgewotCQkJCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwbyA9IGZhY3RvcnkubG9hZChsb2NhdGlvbiwgZ2V0TW9uaXRvcigpKTsKLQkJCQlpZiAocmVwby5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkudG9Db2xsZWN0aW9uKCkuc2l6ZSgpICE9IDEpCi0JCQkJCWZhaWwoIjMuMCIpOwotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQkJZmFpbCgiMi4wIik7Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCI0Ljk5IiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RWNsaXBzZUJhc2VOb3JtYWxGZWF0dXJlc2FuZFBsdWdpbnNEaXJlY3RvcnkoKSB7Ci0JCUZpbGUgZGlyZWN0b3J5ID0gbmV3IEZpbGUodGVtcERpcmVjdG9yeSwgImV4aXN0cyIpOwotCQlkaXJlY3RvcnkubWtkaXJzKCk7Ci0JCUZpbGUgZWNsaXBzZURpcmVjdG9yeSA9IG5ldyBGaWxlKGRpcmVjdG9yeSwgImVjbGlwc2UiKTsKLQkJY29weSgiMS4wIiwgZ2V0VGVzdERhdGEoIjEuMSIsICIvdGVzdERhdGEvZXh0ZW5zaW9ubG9jYXRpb24iKSwgZWNsaXBzZURpcmVjdG9yeSk7Ci0JCXRyeSB7Ci0JCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG8gPSBmYWN0b3J5LmxvYWQoZGlyZWN0b3J5LnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCQlpZiAocmVwby5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkudG9Db2xsZWN0aW9uKCkuc2l6ZSgpICE9IDMpCi0JCQkJZmFpbCgiMy4wIik7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIyLjAiKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjIuOTkiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RVcGRhdGVTaXRlWE1MVVJMKCkgewotCQlGaWxlIHNpdGUgPSBnZXRUZXN0RGF0YSgiMC4xIiwgIi90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGUiKTsKLQkJdHJ5IHsKLQkJCWZhY3RvcnkubG9hZChzaXRlLnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlpZiAoZS5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfTk9UX0ZPVU5EKQotCQkJCXJldHVybjsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuOTkiLCBlKTsKLQkJfQotCQlmYWlsKCIxLjAiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WFhYU2l0ZVhYWFhNTFVSTCgpIHsKLQkJRmlsZSBzaXRlID0gZ2V0VGVzdERhdGEoIjAuMSIsICIvdGVzdERhdGEvdXBkYXRlc2l0ZS94eHhzaXRleHh4Iik7Ci0JCXRyeSB7Ci0JCQlmYWN0b3J5LmxvYWQoc2l0ZS50b1VSTCgpLCBnZXRNb25pdG9yKCkpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJaWYgKGUuZ2V0U3RhdHVzKCkuZ2V0Q29kZSgpID09IFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX05PVF9GT1VORCkKLQkJCQlyZXR1cm47Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjk5IiwgZSk7Ci0JCX0KLQkJZmFpbCgiMS4wIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2Z1bGwvRGlyZWN0b3JUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZnVsbC9EaXJlY3RvclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2ZjA5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZnVsbC9EaXJlY3RvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5mdWxsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLkFnZW50TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JRGlyZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50LkVudmlyb25tZW50SW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotCi0vKioKLSAqIFRoaXMgdGVzdCBpbnN0YWxscyBvciB1bmluc3RhbGxzIHRoZSBJVSBkZWZpbmVkIGJ5IHRoZSBwcm9wZXJ0eSAiZWNsaXBzZS5wMi5hdXRvSW5zdGFsbCIuCi0gKiBNZXRhZGF0YSBmb3IgdGhlIElVcyB0byBpbnN0YWxsIG11c3QgYmUgZ2VuZXJhdGVkIHNlcGFyYXRlbHkgYmVmb3JlIHJ1bm5pbmcgdGhpcyB0ZXN0LgotICovCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsSVUoKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJU2VydmljZVJlZmVyZW5jZSBzciA9IFRlc3RBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKElEaXJlY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAoc3IgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkRpcmVjdG9yIHNlcnZpY2Ugbm90IGF2YWlsYWJsZSIpOwotCQl9Ci0JCUlEaXJlY3RvciBkaXJlY3RvciA9IChJRGlyZWN0b3IpIFRlc3RBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlKHNyKTsKLQkJaWYgKGRpcmVjdG9yID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEaXJlY3RvciBjb3VsZCBub3QgYmUgbG9hZGVkIik7Ci0JCX0KLQotCQlTZXJ2aWNlUmVmZXJlbmNlIHNyMiA9IFRlc3RBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG1nciA9IChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgVGVzdEFjdGl2YXRvci5jb250ZXh0LmdldFNlcnZpY2Uoc3IyKTsKLQkJaWYgKG1nciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUmVwb3NpdG9yeSBtYW5hZ2VyIGNvdWxkIG5vdCBiZSBsb2FkZWQiKTsKLQkJfQotCi0JCVN0cmluZyBhdXRvSW5zdGFsbCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZWNsaXBzZS5wMi5hdXRvSW5zdGFsbCIpOwotCQlDb2xsZWN0b3IgYWxsSm9icyA9IG1nci5xdWVyeShuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkoYXV0b0luc3RhbGwsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlKSwgbmV3IENvbGxlY3RvcigpLCBudWxsKTsKLQotCQlTdHJpbmcgaW5zdGFsbEZvbGRlciA9IFN5c3RlbS5nZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0lOU1RBTExfRk9MREVSKTsKLQkJU2VydmljZVJlZmVyZW5jZSBwcm9maWxlUmVnU3IgPSBUZXN0QWN0aXZhdG9yLmNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFRlc3RBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlKHByb2ZpbGVSZWdTcik7Ci0JCWlmIChwcm9maWxlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlByb2ZpbGUgcmVnaXN0cnkgc2VydmljZSBub3QgYXZhaWxhYmxlIik7Ci0JCX0KLQotCQlTdHJpbmcgbmV3Rmxhdm9yID0gU3lzdGVtLmdldFByb3BlcnR5KCJlY2xpcHNlLnAyLmNvbmZpZ3VyYXRpb25GbGF2b3IiKTsKLQkJYm9vbGVhbiBkb1VuaW5zdGFsbCA9IChCb29sZWFuLlRSVUUuZXF1YWxzKEJvb2xlYW4udmFsdWVPZihTeXN0ZW0uZ2V0UHJvcGVydHkoImVjbGlwc2UucDIuZG9Vbmluc3RhbGwiKSkpKTsKLQotCQlJUHJvZmlsZSBwID0gbnVsbDsKLQkJaWYgKGRvVW5pbnN0YWxsKSB7Ci0JCQlwID0gcHJvZmlsZVJlZ2lzdHJ5LmdldFByb2ZpbGUoaW5zdGFsbEZvbGRlcik7Ci0JCQlpZiAocCA9PSBudWxsKQotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmluc3RhbGxpbmcgZnJvbSBhIG5vbmV4aXN0ZW50IHByb2ZpbGUiKTsKLQkJfSBlbHNlIHsKLQkJCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCXByb3BlcnRpZXMucHV0KElQcm9maWxlLlBST1BfSU5TVEFMTF9GT0xERVIsIGluc3RhbGxGb2xkZXIpOwotCQkJcHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9GTEFWT1IsIG5ld0ZsYXZvcik7Ci0JCQlFbnZpcm9ubWVudEluZm8gaW5mbyA9IChFbnZpcm9ubWVudEluZm8pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSwgRW52aXJvbm1lbnRJbmZvLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKQotCQkJCXByb3BlcnRpZXMucHV0KElQcm9maWxlLlBST1BfRU5WSVJPTk1FTlRTLCAib3NnaS5vcz0iICsgaW5mby5nZXRPUygpICsgIixvc2dpLndzPSIgKyBpbmZvLmdldFdTKCkgKyAiLG9zZ2kuYXJjaD0iICsgaW5mby5nZXRPU0FyY2goKSk7Ci0KLQkJCXAgPSBjcmVhdGVQcm9maWxlKGluc3RhbGxGb2xkZXIsIG51bGwsIHByb3BlcnRpZXMpOwotCQl9Ci0KLQkJSUluc3RhbGxhYmxlVW5pdFtdIGFsbFJvb3RzID0gbmV3IElJbnN0YWxsYWJsZVVuaXRbMV07Ci0JCUlTdGF0dXMgb3BlcmF0aW9uU3RhdHVzID0gbnVsbDsKLQkJaWYgKCFhbGxKb2JzLmlzRW1wdHkoKSkgewotCQkJYWxsUm9vdHNbMF0gPSAoSUluc3RhbGxhYmxlVW5pdCkgYWxsSm9icy5pdGVyYXRvcigpLm5leHQoKTsKLQkJCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocCk7Ci0JCQlpZiAoIWRvVW5pbnN0YWxsKQotCQkJCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyhhbGxSb290cyk7Ci0JCQllbHNlCi0JCQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKGFsbFJvb3RzKTsKLQkJCW9wZXJhdGlvblN0YXR1cyA9IGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBudWxsKTsKLQkJfSBlbHNlIHsKLQkJCW9wZXJhdGlvblN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5JTkZPLCAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci50ZXN0IiwgIlRoZSBpbnN0YWxsYWJsZSB1bml0ICciICsgU3lzdGVtLmdldFByb3BlcnR5KCJlY2xpcHNlLnAyLmF1dG9JbnN0YWxsIikgKyAiJyBoYXMgbm90IGJlZW4gZm91bmQiKTsKLQkJfQotCi0JCWlmICghb3BlcmF0aW9uU3RhdHVzLmlzT0soKSkKLQkJCWZhaWwoIlRoZSBpbnN0YWxsYXRpb24gaGFzIGZhaWxlZCIpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXRbXSByZXN1bHQgPSAoSUluc3RhbGxhYmxlVW5pdFtdKSBwLnF1ZXJ5KG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShhbGxSb290c1swXS5nZXRJZCgpLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkudG9BcnJheShJSW5zdGFsbGFibGVVbml0LmNsYXNzKTsKLQkJYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsICghZG9Vbmluc3RhbGwgPyAxIDogMCkpOwotCQlyZXN1bHQgPSAoSUluc3RhbGxhYmxlVW5pdFtdKSBwLnF1ZXJ5KG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeSgidG9vbGluZ2RlZmF1bHQiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkudG9BcnJheShJSW5zdGFsbGFibGVVbml0LmNsYXNzKTsKLQotCQllbnN1cmVGcmFnbWVudEFzc29jaWF0aW9uSXNOb3RQZXJzaXN0ZWQobWdyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5zdXJlRnJhZ21lbnRBc3NvY2lhdGlvbklzTm90UGVyc2lzdGVkKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIG1ncikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCS8vVGVzdCBmb3IgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE3NzY2MQotCQlBZ2VudExvY2F0aW9uIGxvY2F0aW9uID0gKEFnZW50TG9jYXRpb24pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSwgQWdlbnRMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotCQltZ3IucmVtb3ZlUmVwb3NpdG9yeShsb2NhdGlvbi5nZXRNZXRhZGF0YVJlcG9zaXRvcnlVUkwoKSk7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwbyA9IG51bGw7Ci0JCXJlcG8gPSBtZ3IubG9hZFJlcG9zaXRvcnkobG9jYXRpb24uZ2V0TWV0YWRhdGFSZXBvc2l0b3J5VVJMKCksIG51bGwpOwotCQlJdGVyYXRvciBpdCA9IHJlcG8ucXVlcnkobmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlKSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pdGVyYXRvcigpOwotCQlpZiAoIWl0Lmhhc05leHQoKSkKLQkJCXJldHVybjsKLQkJSUluc3RhbGxhYmxlVW5pdCBzYyA9IChJSW5zdGFsbGFibGVVbml0KSBpdC5uZXh0KCk7Ci0JCWlmIChzYy5pc1Jlc29sdmVkKCkpCi0JCQlmYWlsKCJUaGUgcmVwb3NpdG9yeSBzaG91bGQgbm90IHN0b3JlIHJlc29sdmVkIGluc3RhbGxhYmxlIHVuaXRzIik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2Z1bGwvRW5kMkVuZFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9mdWxsL0VuZDJFbmRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0OWRkMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2Z1bGwvRW5kMkVuZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5mdWxsOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5FbnZpcm9ubWVudEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEVuZDJFbmRUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQotCXByaXZhdGUgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbmFnZXI7Ci0JcHJpdmF0ZSBJRGlyZWN0b3IgZGlyZWN0b3I7Ci0JcHJpdmF0ZSBJUGxhbm5lciBwbGFubmVyOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2VydmljZVJlZmVyZW5jZSBzciA9IFRlc3RBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKElEaXJlY3Rvci5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAoc3IgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEaXJlY3RvciBzZXJ2aWNlIG5vdCBhdmFpbGFibGUiKTsKLQkJZGlyZWN0b3IgPSBjcmVhdGVEaXJlY3RvcigpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCQlTZXJ2aWNlUmVmZXJlbmNlIHNyMiA9IFRlc3RBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXJlcG9NYW5hZ2VyID0gKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBUZXN0QWN0aXZhdG9yLmNvbnRleHQuZ2V0U2VydmljZShzcjIpOwotCQlpZiAocmVwb01hbmFnZXIgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZXBvc2l0b3J5IG1hbmFnZXIgY291bGQgbm90IGJlIGxvYWRlZCIpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvZmlsZSBjcmVhdGVQcm9maWxlKFN0cmluZyBwcm9maWxlSWQpIHsKLQkJU3RyaW5nIGluc3RhbGxGb2xkZXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9JTlNUQUxMX0ZPTERFUik7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcHJvZmlsZVJlZ1NyID0gVGVzdEFjdGl2YXRvci5jb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSVByb2ZpbGVSZWdpc3RyeS5jbGFzcy5nZXROYW1lKCkpOwotCQlJUHJvZmlsZVJlZ2lzdHJ5IHByb2ZpbGVSZWdpc3RyeSA9IChJUHJvZmlsZVJlZ2lzdHJ5KSBUZXN0QWN0aXZhdG9yLmNvbnRleHQuZ2V0U2VydmljZShwcm9maWxlUmVnU3IpOwotCQlpZiAocHJvZmlsZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQcm9maWxlIHJlZ2lzdHJ5IHNlcnZpY2Ugbm90IGF2YWlsYWJsZSIpOwotCQl9Ci0KLQkJU3RyaW5nIG5ld0ZsYXZvciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZWNsaXBzZS5wMi5jb25maWd1cmF0aW9uRmxhdm9yIik7Ci0JCWJvb2xlYW4gZG9Vbmluc3RhbGwgPSAoQm9vbGVhbi5UUlVFLmVxdWFscyhCb29sZWFuLnZhbHVlT2YoU3lzdGVtLmdldFByb3BlcnR5KCJlY2xpcHNlLnAyLmRvVW5pbnN0YWxsIikpKSk7Ci0KLQkJSVByb2ZpbGUgcCA9IG51bGw7Ci0JCWlmIChkb1VuaW5zdGFsbCkgewotCQkJcCA9IHByb2ZpbGVSZWdpc3RyeS5nZXRQcm9maWxlKHByb2ZpbGVJZCk7Ci0JCQlpZiAocCA9PSBudWxsKQotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmluc3RhbGxpbmcgZnJvbSBhIG5vbmV4aXN0ZW50IHByb2ZpbGUiKTsKLQkJfSBlbHNlIHsKLQkJCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCXByb3BlcnRpZXMucHV0KElQcm9maWxlLlBST1BfSU5TVEFMTF9GT0xERVIsIGluc3RhbGxGb2xkZXIgKyAnLycgKyBwcm9maWxlSWQpOwotCQkJcHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9GTEFWT1IsIG5ld0ZsYXZvcik7Ci0JCQlFbnZpcm9ubWVudEluZm8gaW5mbyA9IChFbnZpcm9ubWVudEluZm8pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSwgRW52aXJvbm1lbnRJbmZvLmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKQotCQkJCXByb3BlcnRpZXMucHV0KElQcm9maWxlLlBST1BfRU5WSVJPTk1FTlRTLCAib3NnaS5vcz0iICsgaW5mby5nZXRPUygpICsgIixvc2dpLndzPSIgKyBpbmZvLmdldFdTKCkgKyAiLG9zZ2kuYXJjaD0iICsgaW5mby5nZXRPU0FyY2goKSk7Ci0KLQkJCXAgPSBjcmVhdGVQcm9maWxlKHByb2ZpbGVJZCwgbnVsbCwgcHJvcGVydGllcyk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxTREsoKSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUyID0gY3JlYXRlUHJvZmlsZSgicHJvZmlsZTIiKTsKLQkJLy9GaXJzdCB3ZSBpbnN0YWxsIHRoZSBzZGsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMik7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtnZXRJVSgic2RrIiwgbmV3IFZlcnNpb24oIjMuMy4wIikpfSk7Ci0JCUlTdGF0dXMgcyA9IGRpcmVjdG9yLnByb3Zpc2lvbihyZXF1ZXN0LCBudWxsLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJaWYgKCFzLmlzT0soKSkKLQkJCWZhaWwoIkluc3RhbGxhdGlvbiBmYWlsZWQiKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBmaXJzdFNuYXBzaG90ID0gZ2V0SVUoInByb2ZpbGUyIik7IC8vVGhpcyBzaG91bGQgcmVwcmVzZW50IHRoZSBlbXB0eSBwcm9maWxlCi0JCWFzc2VydE5vdE51bGwoZmlyc3RTbmFwc2hvdCk7Ci0JCWFzc2VydE5vdE51bGwoZmlyc3RTbmFwc2hvdC5nZXRQcm9wZXJ0eSgicHJvZmlsZUlVIikpOwotCi0JCS8vVW5pbnN0YWxsIHRoZSBTREsKLQkJcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMik7Ci0JCXJlcXVlc3QucmVtb3ZlSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtnZXRJVSgic2RrIiwgbmV3IFZlcnNpb24oIjMuMy4wIikpfSk7Ci0JCXMgPSBkaXJlY3Rvci5wcm92aXNpb24ocmVxdWVzdCwgbnVsbCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWlmICghcy5pc09LKCkpCi0JCQlmYWlsKCJUaGUgdW5pbnN0YWxsYXRpb24gaGFzIGZhaWxlZCBhbmQgaXQgd2FzIG5vdCBleHBlY3RlZCIpOwotCi0JCWFzc2VydEVxdWFscyhmYWxzZSwgZ2V0SW5zdGFsbGFibGVVbml0cyhwcm9maWxlMikuaGFzTmV4dCgpKTsgLy90aGUgcHJvZmlsZSBzaG91bGQgYmUgZW1wdHkgc2luY2Ugd2UgdW5pbnN0YWxsZWQgZXZlcnl0aGluZwotCQlJSW5zdGFsbGFibGVVbml0W10gc25hcHNob3RzID0gZ2V0SVVzKCJwcm9maWxlMiIpOwotCQlhc3NlcnRUcnVlKCJzbmFwIiArIHNuYXBzaG90cy5sZW5ndGgsIHNuYXBzaG90cy5sZW5ndGggPj0gMik7Ly9UT0RPIE5vcm1hbGx5IGhlcmUgaXQgc2hvdWxkIGJlIDIhISEKLQkJYXNzZXJ0VHJ1ZShwcm9maWxlMi5xdWVyeShuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkoInNkayIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlKSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pc0VtcHR5KCkpOwotCi0JCS8vIE5vdyB0ZXN0IHRoZSByb2xsYmFjayB0byBhIHByZXZpb3VzIHN0YXRlLCBpbiB0aGlzIGNhc2Ugd2UgcmVpbnN0YWxsIHRoZSBTREsKLQkJcyA9IGRpcmVjdG9yLnJldmVydChzbmFwc2hvdHNbMF0uZXF1YWxzKGZpcnN0U25hcHNob3QpID8gc25hcHNob3RzWzFdIDogc25hcHNob3RzWzBdLCBwcm9maWxlMiwgbmV3IFByb3Zpc2lvbmluZ0NvbnRleHQoKSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCWlmICghcy5pc09LKCkpCi0JCQlmYWlsKCJUaGUgYmVjb21lIG9wZXJhdGlvbiBmYWlsZWQiKTsKLQotCQlhc3NlcnROb3ROdWxsKGdldElVKCJzZGsiKSk7Ci0KLQkJLy9UZXN0IHJlcGxhY2UKLQkJcmVxdWVzdCA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMik7Ci0JCXJlcXVlc3QuYWRkSW5zdGFsbGFibGVVbml0cyhwbGFubmVyLnVwZGF0ZXNGb3IoZ2V0SVUoInNkayIsIG5ldyBWZXJzaW9uKCIzLjMuMCIpKSwgbnVsbCwgbnVsbCkpOwotCQlyZXF1ZXN0LnJlbW92ZUluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7Z2V0SVUoInNkayIsIG5ldyBWZXJzaW9uKCIzLjMuMCIpKX0pOwotCQlhc3NlcnRPSygiMi4wIiwgZGlyZWN0b3IucHJvdmlzaW9uKHJlcXVlc3QsIG51bGwsIG51bGwpKTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCIiLCBwcm9maWxlMiwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7Z2V0SVUoInNkayIsIG5ldyBWZXJzaW9uKCIzLjQuMCIpKX0pOwotCQlhc3NlcnROb3RJVXMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7Z2V0SVUoInNkayIsIG5ldyBWZXJzaW9uKCIzLjMuMCIpKX0sIGdldEluc3RhbGxhYmxlVW5pdHMocHJvZmlsZTIpKTsKLQotCQkvL1JlbW92ZSBldmVyeXRoaW5nIGZyb20gdGhlIHByb2ZpbGUgYnkgYmVjb21pbmcgYW4gZW1wdHkgcHJvZmlsZQotCQlzID0gZGlyZWN0b3IucmV2ZXJ0KGZpcnN0U25hcHNob3QsIHByb2ZpbGUyLCBuZXcgUHJvdmlzaW9uaW5nQ29udGV4dCgpLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJYXNzZXJ0T0soIjIuMSIsIHMpOwotCQlhc3NlcnRFbXB0eVByb2ZpbGUocHJvZmlsZTIpOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0W10gZ2V0SVVzKFN0cmluZyBpZCkgewotCQlyZXR1cm4gKElJbnN0YWxsYWJsZVVuaXRbXSkgcmVwb01hbmFnZXIucXVlcnkobmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KGlkLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkudG9BcnJheShJSW5zdGFsbGFibGVVbml0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdCBnZXRJVShTdHJpbmcgaWQpIHsKLQkJSXRlcmF0b3IgaXQgPSByZXBvTWFuYWdlci5xdWVyeShuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkoaWQsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlKSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pdGVyYXRvcigpOwotCQlpZiAoaXQuaGFzTmV4dCgpKQotCQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0KSBpdC5uZXh0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IGdldElVKFN0cmluZyBpZCwgVmVyc2lvbiB2KSB7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVwb01hbmFnZXIucXVlcnkobmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KGlkLCB2KSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pdGVyYXRvcigpOwotCQlpZiAoaXQuaGFzTmV4dCgpKQotCQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0KSBpdC5uZXh0KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9mdWxsL1JlcG9WYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9mdWxsL1JlcG9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTViNjdmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZnVsbC9SZXBvVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZnVsbDsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklQbGFubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlNlcnZpY2VSZWZlcmVuY2U7Ci0KLXB1YmxpYyBjbGFzcyBSZXBvVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGUoKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlVUkwgcmVwb0xvYyA9IG5ldyBVUkwoImZpbGU6ZDovZ2FueW1lZGVNNSIpOwotCQlTZXJ2aWNlUmVmZXJlbmNlIHNyID0gVGVzdEFjdGl2YXRvci5jb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSVBsYW5uZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKHNyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQbGFubmVyIHNlcnZpY2Ugbm90IGF2YWlsYWJsZSIpOwotCQl9Ci0JCUlQbGFubmVyIHBsYW5uZXIgPSAoSVBsYW5uZXIpIFRlc3RBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlKHNyKTsKLQkJaWYgKHBsYW5uZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlBsYW5uZXIgY291bGQgbm90IGJlIGxvYWRlZCIpOwotCQl9Ci0KLQkJU2VydmljZVJlZmVyZW5jZSBzcjIgPSBUZXN0QWN0aXZhdG9yLmNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBtZ3IgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFRlc3RBY3RpdmF0b3IuY29udGV4dC5nZXRTZXJ2aWNlKHNyMik7Ci0JCWlmIChtZ3IgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlJlcG9zaXRvcnkgbWFuYWdlciBjb3VsZCBub3QgYmUgbG9hZGVkIik7Ci0JCX0KLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSB2YWxpZGF0ZWRSZXBvID0gbWdyLmxvYWRSZXBvc2l0b3J5KHJlcG9Mb2MsIG51bGwpOwotCi0JCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJcHJvcGVydGllcy5wdXQoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfRkxBVk9SLCAidG9vbGluZyIpOwotCQlJUHJvZmlsZSBwID0gY3JlYXRlUHJvZmlsZSgicmVwb1ZhbGlkYXRvciIsIG51bGwsIHByb3BlcnRpZXMpOwotCi0JCVF1ZXJ5IHE7Ci0JCS8vCQlxID0gbmV3IFF1ZXJ5KCkgewotCQkvLwkJCXB1YmxpYyBib29sZWFuIGlzTWF0Y2goT2JqZWN0IG9iamVjdCkgewotCQkvLwkJCQlpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBJSW5zdGFsbGFibGVVbml0KSkKLQkJLy8JCQkJCXJldHVybiBmYWxzZTsKLQkJLy8JCQkJSUluc3RhbGxhYmxlVW5pdCBjYW5kaWRhdGUgPSAoSUluc3RhbGxhYmxlVW5pdCkgb2JqZWN0OwotCQkvLwkJCQlpZiAoY2FuZGlkYXRlLmdldElkKCkuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2UuanN0IikgfHwgY2FuZGlkYXRlLmdldElkKCkuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2Uud3N0IikpCi0JCS8vCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJLy8JCQkJcmV0dXJuIGZhbHNlOwotCQkvLwkJCX0KLQkJLy8JCX07Ci0KLQkJLy8JCXEgPSBuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkoIm9yZy5lY2xpcHNlLndzdC53cy5wYXJzZXIiKTsKLQotCQlxID0gSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZOwotCQlDb2xsZWN0b3IgaXVzVG9UZXN0ID0gdmFsaWRhdGVkUmVwby5xdWVyeShxLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCi0JCVByb3Zpc2lvbmluZ0NvbnRleHQgcGMgPSBuZXcgUHJvdmlzaW9uaW5nQ29udGV4dChuZXcgVVJMW10ge3JlcG9Mb2N9KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGl1c1RvVGVzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQl0cnkgewotCQkJCUlJbnN0YWxsYWJsZVVuaXQgaXNJbnN0YWxsYWJsZSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHApOwotCQkJCXJlcS5zZXRQcm9maWxlUHJvcGVydHkoImVjbGlwc2UucDIuaW5zdGFsbC5mZWF0dXJlcyIsICJ0cnVlIik7Ci0JCQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7aXNJbnN0YWxsYWJsZX0pOwotCQkJCS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV29ya2luZyBvbjogIiArIGlzSW5zdGFsbGFibGUpOwotCQkJCUlTdGF0dXMgcyA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIHBjLCBudWxsKS5nZXRTdGF0dXMoKTsKLQkJCQlpZiAoIXMuaXNPSygpKSB7Ci0JCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiQ2FuJ3QgcmVzb2x2ZTogIiArIGlzSW5zdGFsbGFibGUpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9pZ25vcmUKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9nZW5lcmF0b3IvQWxsVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9nZW5lcmF0b3IvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ1NTBhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5nZW5lcmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBQZXJmb3JtcyBhbGwgZW5naW5lIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEVjbGlwc2VTREszM1Rlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRmVhdHVyZVRvSVUuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2l0ZVBhcnNlclRlc3QuY2xhc3MpOwotCQlyZXR1cm4gc3VpdGU7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL0VjbGlwc2VTREszM1Rlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9nZW5lcmF0b3IvRWNsaXBzZVNESzMzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2NiZDY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9nZW5lcmF0b3IvRWNsaXBzZVNESzMzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLklHZW5lcmF0b3JJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFRlc3RzIHJ1bm5pbmcgdGhlIG1ldGFkYXRhIGdlbmVyYXRvciBhZ2FpbnN0IEVjbGlwc2UgMy4zIGZlYXR1cmVzLgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZVNESzMzVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShFY2xpcHNlU0RLMzNUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgRWNsaXBzZVNESzMzVGVzdCgpIHsKLQkJc3VwZXIoIiIpOwotCX0KLQotCXB1YmxpYyBFY2xpcHNlU0RLMzNUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIFRPRE8gVGhpcyB0ZXN0IGlzIGN1cnJlbnRseSBmYWlsaW5nIG9uIHRoZSBidWlsZCBtYWNoaW5lIGZvciBhbiB1bmtub3duIHJlYXNvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGlvbigpIHsKLQkJaWYgKHRydWUpCi0JCQlyZXR1cm47Ci0JCUlHZW5lcmF0b3JJbmZvIGdlbmVyYXRvckluZm8gPSBjcmVhdGVHZW5lcmF0b3JJbmZvKCk7Ci0JCUdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgR2VuZXJhdG9yKGdlbmVyYXRvckluZm8pOwotCQlnZW5lcmF0b3IuZ2VuZXJhdGUoKTsKLQotCQlUZXN0TWV0YWRhdGFSZXBvc2l0b3J5IHJlcG8gPSAoVGVzdE1ldGFkYXRhUmVwb3NpdG9yeSkgZ2VuZXJhdG9ySW5mby5nZXRNZXRhZGF0YVJlcG9zaXRvcnkoKTsKLQkJSUluc3RhbGxhYmxlVW5pdCB1bml0ID0gcmVwby5maW5kKCJvcmcuZWNsaXBzZS5jdnMuc291cmNlLmZlYXR1cmUuZ3JvdXAiLCAiMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUiKTsKLQkJYXNzZXJ0Tm90TnVsbCh1bml0KTsKLQkJYXNzZXJ0R3JvdXAodW5pdCk7Ci0JCXVuaXQgPSByZXBvLmZpbmQoIm9yZy5lY2xpcHNlLnJjcC5mZWF0dXJlLmdyb3VwIiwgIjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIpOwotCQlhc3NlcnROb3ROdWxsKHVuaXQpOwotCQlhc3NlcnRHcm91cCh1bml0KTsKLQkJdW5pdCA9IHJlcG8uZmluZCgib3JnLmVjbGlwc2UuamR0LmZlYXR1cmUuZ3JvdXAiLCAiMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUiIpOwotCQlhc3NlcnROb3ROdWxsKHVuaXQpOwotCQlhc3NlcnRHcm91cCh1bml0KTsKLQkJdW5pdCA9IHJlcG8uZmluZCgib3JnLmVjbGlwc2UuY3ZzLmZlYXR1cmUuZ3JvdXAiLCAiMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUiKTsKLQkJYXNzZXJ0Tm90TnVsbCh1bml0KTsKLQkJYXNzZXJ0R3JvdXAodW5pdCk7Ci0JCXVuaXQgPSByZXBvLmZpbmQoIm9yZy5lY2xpcHNlLnBkZS5zb3VyY2UuZmVhdHVyZS5ncm91cCIsICIzLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDIik7Ci0JCWFzc2VydE5vdE51bGwodW5pdCk7Ci0JCWFzc2VydEdyb3VwKHVuaXQpOwotCQl1bml0ID0gcmVwby5maW5kKCJvcmcuZWNsaXBzZS5zZGsuZmVhdHVyZS5ncm91cCIsICIzLjMuMC52MjAwNzA2MDctN003Si1CSW9sei1PY3hXeHZXQVBTZkxQcWV2TyIpOwotCQlhc3NlcnROb3ROdWxsKHVuaXQpOwotCQlhc3NlcnRHcm91cCh1bml0KTsKLQkJdW5pdCA9IHJlcG8uZmluZCgib3JnLmVjbGlwc2UucGxhdGZvcm0uZmVhdHVyZS5ncm91cCIsICIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciKTsKLQkJYXNzZXJ0Tm90TnVsbCh1bml0KTsKLQkJYXNzZXJ0R3JvdXAodW5pdCk7Ci0JCXVuaXQgPSByZXBvLmZpbmQoIm9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5mZWF0dXJlLmdyb3VwIiwgIjMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRyIpOwotCQlhc3NlcnROb3ROdWxsKHVuaXQpOwotCQlhc3NlcnRHcm91cCh1bml0KTsKLQkJdW5pdCA9IHJlcG8uZmluZCgib3JnLmVjbGlwc2UuamR0LnNvdXJjZS5mZWF0dXJlLmdyb3VwIiwgIjMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIiKTsKLQkJYXNzZXJ0Tm90TnVsbCh1bml0KTsKLQkJYXNzZXJ0R3JvdXAodW5pdCk7Ci0JCXVuaXQgPSByZXBvLmZpbmQoIm9yZy5lY2xpcHNlLnBkZS5mZWF0dXJlLmdyb3VwIiwgIjMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MiKTsKLQkJYXNzZXJ0Tm90TnVsbCh1bml0KTsKLQkJYXNzZXJ0R3JvdXAodW5pdCk7Ci0JCXVuaXQgPSByZXBvLmZpbmQoIm9yZy5lY2xpcHNlLnJjcC5zb3VyY2UuZmVhdHVyZS5ncm91cCIsICIzLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkciKTsKLQkJYXNzZXJ0Tm90TnVsbCh1bml0KTsKLQkJYXNzZXJ0R3JvdXAodW5pdCk7Ci0KLQkJSUFydGlmYWN0UmVwb3NpdG9yeSBhcnRpZmFjdFJlcG8gPSAoVGVzdEFydGlmYWN0UmVwb3NpdG9yeSkgZ2VuZXJhdG9ySW5mby5nZXRBcnRpZmFjdFJlcG9zaXRvcnkoKTsKLQkJSUFydGlmYWN0S2V5W10ga2V5cyA9IGFydGlmYWN0UmVwby5nZXRBcnRpZmFjdEtleXMoKTsKLQkJYXNzZXJ0VHJ1ZShrZXlzLmxlbmd0aCA9PSAxMSk7Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBJVSByZXByZXNlbnRzIGEgZ3JvdXAuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFzc2VydEdyb3VwKElJbnN0YWxsYWJsZVVuaXQgdW5pdCkgewotCQlhc3NlcnRFcXVhbHMoIklVIGlzIG5vdCBhIGdyb3VwIiwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCksIHVuaXQuZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfR1JPVVApKTsKLQl9Ci0KLQlwcml2YXRlIElHZW5lcmF0b3JJbmZvIGNyZWF0ZUdlbmVyYXRvckluZm8oKSB7Ci0JCUJ1bmRsZSBteUJ1bmRsZSA9IFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldEJ1bmRsZSgpOwotCQlVUkwgcm9vdCA9IEZpbGVMb2NhdG9yLmZpbmQobXlCdW5kbGUsIG5ldyBQYXRoKCJ0ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMyIpLCBudWxsKTsKLQkJRmlsZSByb290RmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyb290ID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKHJvb3QpOwotCQkJcm9vdEZpbGUgPSBuZXcgRmlsZShyb290LmdldFBhdGgoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjQuOTkiLCBlKTsKLQkJfQotCQlUZXN0R2VuZXJhdG9ySW5mbyBpbmZvID0gbmV3IFRlc3RHZW5lcmF0b3JJbmZvKHJvb3RGaWxlKTsKLQkJcmV0dXJuIGluZm87Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL0ZlYXR1cmVUb0lVLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL0ZlYXR1cmVUb0lVLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNjc3NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2dlbmVyYXRvci9GZWF0dXJlVG9JVS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuZ2VuZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuZmVhdHVyZXMuRmVhdHVyZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5NZXRhZGF0YUdlbmVyYXRvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLQotcHVibGljIGNsYXNzIEZlYXR1cmVUb0lVIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQotCXB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdGlvbigpIHsKLQkJRmVhdHVyZSBmID0gbmV3IEZlYXR1cmVQYXJzZXIoKS5wYXJzZShnZXRUZXN0RGF0YSgiRkZGIDEuMC4wIiwgInRlc3REYXRhL2ZlYXR1cmVUb0lVL2ZlYXR1cmUxLmphciIpKTsKLQkJYXNzZXJ0Tm90TnVsbChmKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBncm91cCA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUdyb3VwSVUoZiwgTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlRmVhdHVyZUphcklVKGYsIGZhbHNlKSk7Ci0JCWFzc2VydEVxdWFscyhmLmdldERlc2NyaXB0aW9uKCksIGdyb3VwLmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9ERVNDUklQVElPTikpOwotCQlhc3NlcnRFcXVhbHMoZi5nZXREZXNjcmlwdGlvblVSTCgpLCBncm91cC5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfREVTQ1JJUFRJT05fVVJMKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vRGVzY3JpcHRpb24xKCkgewotCQlGZWF0dXJlIGYgPSBuZXcgRmVhdHVyZVBhcnNlcigpLnBhcnNlKGdldFRlc3REYXRhKCJGRkYgMS4wLjAiLCAidGVzdERhdGEvZmVhdHVyZVRvSVUvZmVhdHVyZTIuamFyIikpOwotCQlhc3NlcnROb3ROdWxsKGYpOwotCQlJSW5zdGFsbGFibGVVbml0IGdyb3VwID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlR3JvdXBJVShmLCBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVGZWF0dXJlSmFySVUoZiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKGYuZ2V0RGVzY3JpcHRpb24oKSwgZ3JvdXAuZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX0RFU0NSSVBUSU9OKSk7Ci0JCWFzc2VydEVxdWFscyhmLmdldERlc2NyaXB0aW9uVVJMKCksIGdyb3VwLmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9ERVNDUklQVElPTl9VUkwpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9EZXNjcmlwdGlvbjIoKSB7Ci0JCUZlYXR1cmUgZiA9IG5ldyBGZWF0dXJlUGFyc2VyKCkucGFyc2UoZ2V0VGVzdERhdGEoIkZGRiAxLjAuMCIsICJ0ZXN0RGF0YS9mZWF0dXJlVG9JVS9mZWF0dXJlMy5qYXIiKSk7Ci0JCWFzc2VydE5vdE51bGwoZik7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgZ3JvdXAgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVHcm91cElVKGYsIE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUZlYXR1cmVKYXJJVShmLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoZi5nZXREZXNjcmlwdGlvbigpLCBncm91cC5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfREVTQ1JJUFRJT04pKTsKLQkJYXNzZXJ0RXF1YWxzKGYuZ2V0RGVzY3JpcHRpb25VUkwoKSwgZ3JvdXAuZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX0RFU0NSSVBUSU9OX1VSTCkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2dlbmVyYXRvci9QYXRjaElVR2VuZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2dlbmVyYXRvci9QYXRjaElVR2VuZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDA2NmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9nZW5lcmF0b3IvUGF0Y2hJVUdlbmVyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmdlbmVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLmZlYXR1cmVzLkZlYXR1cmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdFBhdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLkZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLQotcHVibGljIGNsYXNzIFBhdGNoSVVHZW5lcmF0aW9uIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQotCXB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZWRJVSgpIHsKLQkJRmVhdHVyZVBhcnNlciBwYXJzZXIgPSBuZXcgRmVhdHVyZVBhcnNlcigpOwotCQlGZWF0dXJlIGZlYXR1cmUgPSBwYXJzZXIucGFyc2UoZ2V0VGVzdERhdGEoIm9yZy5lY2xpcHNlLmpkdC5jb3JlLmZlYXR1cmUucGF0Y2giLCAidGVzdERhdGEvb3JnLmVjbGlwc2UuamR0LjMuMi4xLnBhdGNoXzEuMC4wLmphciIpKTsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCWZhaWwoKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBmZWF0dXJlSVUgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVGZWF0dXJlSmFySVUoZmVhdHVyZSwgdHJ1ZSwgbnVsbCk7Ci0JCUlJbnN0YWxsYWJsZVVuaXRQYXRjaCBwYXRjaElVID0gKElJbnN0YWxsYWJsZVVuaXRQYXRjaCkgTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlR3JvdXBJVShmZWF0dXJlLCBmZWF0dXJlSVUsIG51bGwpOwotCi0JCS8vQ2hlY2sgaWQKLQkJYXNzZXJ0RXF1YWxzKHBhdGNoSVUuZ2V0SWQoKSwgIm9yZy5lY2xpcHNlLmpkdC4zLjIuMS5wYXRjaC5mZWF0dXJlLmdyb3VwIik7Ci0KLQkJLy9DaGVjayBhcHBsaWNhYmlsaXR5IHNjb3BlCi0JCWFzc2VydEVxdWFscyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgcGF0Y2hJVS5nZXRBcHBsaWNhYmlsaXR5U2NvcGUoKVswXVswXS5nZXROYW1lc3BhY2UoKSk7Ci0JCWFzc2VydEVxdWFscygib3JnLmVjbGlwc2UuamR0LmZlYXR1cmUuZ3JvdXAiLCBwYXRjaElVLmdldEFwcGxpY2FiaWxpdHlTY29wZSgpWzBdWzBdLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvblJhbmdlKCJbMy4yLjEucjMyMV92MjAwNjA5MDUtUjRDTTFabmt2cmU5d0MtLDMuMi4xLnIzMjFfdjIwMDYwOTA1LVI0Q00xWm5rdnJlOXdDLV0iKSwgcGF0Y2hJVS5nZXRBcHBsaWNhYmlsaXR5U2NvcGUoKVswXVswXS5nZXRSYW5nZSgpKTsKLQotCQlhc3NlcnRFcXVhbHMoIm9yZy5lY2xpcHNlLmpkdC5jb3JlIiwgcGF0Y2hJVS5nZXRSZXF1aXJlbWVudHNDaGFuZ2UoKVswXS5hcHBseU9uKCkuZ2V0TmFtZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBwYXRjaElVLmdldFJlcXVpcmVtZW50c0NoYW5nZSgpWzBdLmFwcGx5T24oKS5nZXRSYW5nZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKCJvcmcuZWNsaXBzZS5qZHQuY29yZSIsIHBhdGNoSVUuZ2V0UmVxdWlyZW1lbnRzQ2hhbmdlKClbMF0ubmV3VmFsdWUoKS5nZXROYW1lKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFZlcnNpb25SYW5nZSgiWzMuMi4yLDMuMi4yXSIpLCBwYXRjaElVLmdldFJlcXVpcmVtZW50c0NoYW5nZSgpWzBdLm5ld1ZhbHVlKCkuZ2V0UmFuZ2UoKSk7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUudG9TdHJpbmcoKSwgcGF0Y2hJVS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfVFlQRV9QQVRDSCkpOwotCQlhc3NlcnRFcXVhbHMoMSwgcGF0Y2hJVS5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscyhmZWF0dXJlSVUuZ2V0SWQoKSwgcGF0Y2hJVS5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpWzBdLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscygib3JnLmVjbGlwc2UuamR0LmZlYXR1cmUuZ3JvdXAiLCBwYXRjaElVLmdldExpZmVDeWNsZSgpLmdldE5hbWUoKSk7Ci0JCWFzc2VydEZhbHNlKHBhdGNoSVUuZ2V0TGlmZUN5Y2xlKCkuaXNHcmVlZHkoKSk7Ci0JCWFzc2VydEZhbHNlKHBhdGNoSVUuZ2V0TGlmZUN5Y2xlKCkuaXNPcHRpb25hbCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL1NpdGVQYXJzZXJUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL1NpdGVQYXJzZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjZjZmN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2dlbmVyYXRvci9TaXRlUGFyc2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuZmVhdHVyZXMuRGVmYXVsdFNpdGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0RGF0YTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogVGVzdCB0aGUgc2l0ZS54bWwgcGFyc2VyIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBTaXRlUGFyc2VyVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RXVyb3BhU2l0ZSgpIHsKLQkJRGVmYXVsdFNpdGVQYXJzZXIgcGFyc2VyID0gbmV3IERlZmF1bHRTaXRlUGFyc2VyKCk7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucGFyc2UoVGVzdERhdGEuZ2V0KCJnZW5lcmF0b3IiLCAiRXVyb3BhL3NpdGUueG1sIikpOwotCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiNC45OCIsIGUpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCI0Ljk5IiwgZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL1Rlc3RHZW5lcmF0b3JJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvZ2VuZXJhdG9yL1Rlc3RHZW5lcmF0b3JJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjMyZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL2dlbmVyYXRvci9UZXN0R2VuZXJhdG9ySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmdlbmVyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5Db25maWdEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTGF1bmNoZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS5JQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5JR2VuZXJhdG9ySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0TWV0YWRhdGFSZXBvc2l0b3J5OwotCi0vKioKLSAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiBJR2VuZXJhdG9ySW5mbyB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgotICovCi1wdWJsaWMgY2xhc3MgVGVzdEdlbmVyYXRvckluZm8gaW1wbGVtZW50cyBJR2VuZXJhdG9ySW5mbyB7Ci0KLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgYXJ0aWZhY3RSZXBvOwotCXByaXZhdGUgRmlsZSBiYXNlTG9jYXRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgZmxhdm9yOwotCXByaXZhdGUgSU1ldGFkYXRhUmVwb3NpdG9yeSBtZXRhZGF0YVJlcG87Ci0JcHJpdmF0ZSBTdHJpbmcgcm9vdElkOwotCXByaXZhdGUgU3RyaW5nIHJvb3RWZXJzaW9uOwotCXByaXZhdGUgU3RyaW5nIGxhdW5jaGVyQ29uZmlnOwotCXByaXZhdGUgVVJMIHNpdGVMb2NhdGlvbjsKLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlQ29tcGF0aWJpbHR5ID0gZmFsc2U7Ci0KLQlwdWJsaWMgVGVzdEdlbmVyYXRvckluZm8oRmlsZSBiYXNlTG9jYXRpb24pIHsKLQkJdGhpcy5iYXNlTG9jYXRpb24gPSBiYXNlTG9jYXRpb247Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkRGVmYXVsdElVcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFwcGVuZCgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5IGdldEFydGlmYWN0UmVwb3NpdG9yeSgpIHsKLQkJaWYgKGFydGlmYWN0UmVwbyA9PSBudWxsKQotCQkJYXJ0aWZhY3RSZXBvID0gbmV3IFRlc3RBcnRpZmFjdFJlcG9zaXRvcnkoKTsKLQkJcmV0dXJuIGFydGlmYWN0UmVwbzsKLQl9Ci0KLQlwdWJsaWMgRmlsZVtdIGdldEJ1bmRsZUxvY2F0aW9ucygpIHsKLQkJRmlsZVtdIGNoaWxkcmVuID0gbmV3IEZpbGUoYmFzZUxvY2F0aW9uLCAicGx1Z2lucyIpLmxpc3RGaWxlcygpOwotCQlyZXR1cm4gY2hpbGRyZW4gPT0gbnVsbCA/IG5ldyBGaWxlWzBdIDogY2hpbGRyZW47Ci0JfQotCi0JcHVibGljIENvbmZpZ0RhdGEgZ2V0Q29uZmlnRGF0YSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0Q29uZmlndXJhdGlvbkxvY2F0aW9uKCkgewotCQlyZXR1cm4gbmV3IEZpbGUoYmFzZUxvY2F0aW9uLCAiY29uZmlndXJhdGlvbiIpOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0RGVmYXVsdElVcyhTZXQgaXVzKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBGaWxlIGdldEV4ZWN1dGFibGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0RmVhdHVyZXNMb2NhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKGJhc2VMb2NhdGlvbiwgImZlYXR1cmVzIik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGbGF2b3IoKSB7Ci0JCXJldHVybiBmbGF2b3I7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0SlJFTG9jYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMYXVuY2hlckRhdGEgZ2V0TGF1bmNoZXJEYXRhKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW11bXSBnZXRNYXBwaW5nUnVsZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGdldE1ldGFkYXRhUmVwb3NpdG9yeSgpIHsKLQkJaWYgKG1ldGFkYXRhUmVwbyA9PSBudWxsKQotCQkJbWV0YWRhdGFSZXBvID0gbmV3IFRlc3RNZXRhZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbMF0pOwotCQlyZXR1cm4gbWV0YWRhdGFSZXBvOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Um9vdElkKCkgewotCQlyZXR1cm4gcm9vdElkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Um9vdFZlcnNpb24oKSB7Ci0JCXJldHVybiByb290VmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgVVJMIGdldFNpdGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIHNpdGVMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhdW5jaGVyQ29uZmlnKCkgewotCQlyZXR1cm4gbGF1bmNoZXJDb25maWc7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHVibGlzaEFydGlmYWN0UmVwb3NpdG9yeSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHB1Ymxpc2hBcnRpZmFjdHMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdFJlcG9zaXRvcnkoSUFydGlmYWN0UmVwb3NpdG9yeSB2YWx1ZSkgewotCQl0aGlzLmFydGlmYWN0UmVwbyA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZsYXZvcihTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5mbGF2b3IgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNZXRhZGF0YVJlcG9zaXRvcnkoSU1ldGFkYXRhUmVwb3NpdG9yeSB2YWx1ZSkgewotCQl0aGlzLm1ldGFkYXRhUmVwbyA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFB1Ymxpc2hBcnRpZmFjdHMoYm9vbGVhbiB2YWx1ZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJvb3RJZChTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy5yb290SWQgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTaXRlTG9jYXRpb24oVVJMIGxvY2F0aW9uKSB7Ci0JCXRoaXMuc2l0ZUxvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF1bmNoZXJDb25maWcoU3RyaW5nIGxhdW5jaGVyQ29uZmlnKSB7Ci0JCXRoaXMubGF1bmNoZXJDb25maWcgPSBsYXVuY2hlckNvbmZpZzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJc1VwZGF0ZUNvbXBhdGlibGUoKSB7Ci0JCXJldHVybiB0aGlzLnVwZGF0ZUNvbXBhdGliaWx0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJc1VwZGF0ZUNvbXBhdGlibGUoYm9vbGVhbiBpc0NvbXBhdGlibGUpIHsKLQkJdGhpcy51cGRhdGVDb21wYXRpYmlsdHkgPSBpc0NvbXBhdGlibGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmV1c2VFeGlzdGluZ1BhY2syMDBGaWxlcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJldXNlRXhpc3RpbmdQYWNrMjAwRmlsZXMoYm9vbGVhbiBwdWJsaXNoUGFjaykgewotCQkvLwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjdEZpbGUoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0T3RoZXJJVXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbkFkdmljZSgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWZXJzaW9uQWR2aWNlKFN0cmluZyBhZHZpY2UpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkxMDVhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm1ldGFkYXRhOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUGVyZm9ybXMgYWxsIG1ldGFkYXRhIHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEFydGlmYWN0S2V5UGFyc2luZ1Rlc3QuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoRnJhZ21lbnRNZXRob2RUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEZyYWdtZW50VGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJVVBlcnNpc3RlbmNlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShMaWNlbnNlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNdWx0aXBsZUlVQW5kRnJhZ21lbnRUZXN0LmNsYXNzKTsKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL0FydGlmYWN0S2V5UGFyc2luZ1Rlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9BcnRpZmFjdEtleVBhcnNpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1YjUwMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL0FydGlmYWN0S2V5UGFyc2luZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgY29tcGVvcGxlIEFHIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIAljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5tZXRhZGF0YTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIFRlc3QgPGNvZGU+QXJ0aWZhY3RrZXlEZVNlcmlhbGl6ZXI8L2NvZGU+Ci0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdEtleVBhcnNpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZSgpIHsKLQkJSUFydGlmYWN0S2V5IGtleSA9IG5ldyBBcnRpZmFjdEtleSgiY2xhc3NpZmllciIsICJpZGVudGlmaWVyIiwgbmV3IFZlcnNpb24oIjEuMCIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJjbGFzc2lmaWVyLGlkZW50aWZpZXIsMS4wLjAiLCBrZXkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZUVtcHR5Q2xhc3NpZmllcigpIHsKLQkJSUFydGlmYWN0S2V5IGtleSA9IG5ldyBBcnRpZmFjdEtleSgiIiwgImlkZW50aWZpZXIiLCBuZXcgVmVyc2lvbigiMS4wIikpOwotCQlhc3NlcnRFcXVhbHMoIixpZGVudGlmaWVyLDEuMC4wIiwga2V5LnRvRXh0ZXJuYWxGb3JtKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXNlcmlhbGl6ZSgpIHsKLQkJSUFydGlmYWN0S2V5IGtleSA9IEFydGlmYWN0S2V5LnBhcnNlKCJjbGFzc2lmaWVyLGlkZW50aWZpZXIsMS4wLjAiKTsKLQkJYXNzZXJ0Tm90TnVsbChrZXkpOwotCQlhc3NlcnRFcXVhbHMoImNsYXNzaWZpZXIiLCBrZXkuZ2V0Q2xhc3NpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZGVudGlmaWVyIiwga2V5LmdldElkKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFZlcnNpb24oIjEuMCIpLCBrZXkuZ2V0VmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzZXJpYWxpemVFbXB0eUNsYXNzaWZpZXIoKSB7Ci0JCUlBcnRpZmFjdEtleSBrZXkgPSBBcnRpZmFjdEtleS5wYXJzZSgiLGlkZW50aWZpZXIsMS4wLjAiKTsKLQkJYXNzZXJ0Tm90TnVsbChrZXkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGtleS5nZXRDbGFzc2lmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoImlkZW50aWZpZXIiLCBrZXkuZ2V0SWQoKSk7Ci0JCWFzc2VydEVxdWFscyhuZXcgVmVyc2lvbigiMS4wIiksIGtleS5nZXRWZXJzaW9uKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXNlcmlhbGl6ZUVtcHR5SWRlbnRpZmllcigpIHsKLQkJSUFydGlmYWN0S2V5IGtleSA9IEFydGlmYWN0S2V5LnBhcnNlKCJjbGFzc2lmaWVyLCwxLjAuMCIpOwotCQlhc3NlcnROb3ROdWxsKGtleSk7Ci0JCWFzc2VydEVxdWFscygiY2xhc3NpZmllciIsIGtleS5nZXRDbGFzc2lmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGtleS5nZXRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uKCIxLjAiKSwga2V5LmdldFZlcnNpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlc2VyaWFsaXplRW1wdHlWZXJzaW9uKCkgewotCQlJQXJ0aWZhY3RLZXkga2V5ID0gQXJ0aWZhY3RLZXkucGFyc2UoImNsYXNzaWZpZXIsaWRlbnRpZmllciwiKTsKLQkJYXNzZXJ0Tm90TnVsbChrZXkpOwotCQlhc3NlcnRFcXVhbHMoImNsYXNzaWZpZXIiLCBrZXkuZ2V0Q2xhc3NpZmllcigpKTsKLQkJYXNzZXJ0RXF1YWxzKCJpZGVudGlmaWVyIiwga2V5LmdldElkKCkpOwotCQlhc3NlcnRFcXVhbHMobmV3IFZlcnNpb24oIjAuMCIpLCBrZXkuZ2V0VmVyc2lvbigpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVzZXJpYWxpemVFbXB0eUV2ZXJ5dGhpbmcoKSB7Ci0JCUlBcnRpZmFjdEtleSBrZXkgPSBBcnRpZmFjdEtleS5wYXJzZSgiLCwiKTsKLQkJYXNzZXJ0Tm90TnVsbChrZXkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGtleS5nZXRDbGFzc2lmaWVyKCkpOwotCQlhc3NlcnRFcXVhbHMoIiIsIGtleS5nZXRJZCgpKTsKLQkJYXNzZXJ0RXF1YWxzKG5ldyBWZXJzaW9uKCIwLjAiKSwga2V5LmdldFZlcnNpb24oKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdERlc2VyaWFsaXplVG9vRmV3UGFydHNJKCkgewotCQl0cnkgewotCQkJQXJ0aWZhY3RLZXkucGFyc2UoIiIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXNlcmlhbGl6ZVRvb01hbnlQYXJ0c0koKSB7Ci0JCXRyeSB7Ci0JCQlBcnRpZmFjdEtleS5wYXJzZSgiLCwsLCIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZXNlcmlhbGl6ZVRvb0Zld1BhcnRzSUkoKSB7Ci0JCXRyeSB7Ci0JCQlBcnRpZmFjdEtleS5wYXJzZSgiY2xhc3NpZmllciIpOwotCQkJZmFpbCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJYXNzZXJ0VHJ1ZSh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9GcmFnbWVudE1ldGhvZFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9GcmFnbWVudE1ldGhvZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU5MWE1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvRnJhZ21lbnRNZXRob2RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIucmVzb2x1dGlvbi5SZXNvbHV0aW9uSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBGcmFnbWVudE1ldGhvZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfRlJBRyA9ICJwcm9wRnJhZyI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfSVUgPSAicHJvcElVIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9SRVFVSVJFRCA9ICJ0ZXN0UmVxdWlyZWQiOwotCUlJbnN0YWxsYWJsZVVuaXQgaXUxOwotCUlJbnN0YWxsYWJsZVVuaXQgaXUzOwotCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIGl1MURlcHM7Ci0JUmVxdWlyZWRDYXBhYmlsaXR5W10gaXUzRGVwczsKLQlQcm92aWRlZENhcGFiaWxpdHlbXSBpdTFDYXBzOwotCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIGl1M0NhcHM7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlpdTEgPSBjcmVhdGVJVSgiaXUudGVzdDEiKTsKLQkJaXUzID0gY3JlYXRlSVVGcmFnbWVudCgiaXUuZnJhZ21lbnQiKTsKLQkJaXUxQ2FwcyA9IGl1MS5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpOwotCQlpdTNDYXBzID0gaXUzLmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCk7Ci0JCWl1MURlcHMgPSBpdTEuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKTsKLQkJaXUzRGVwcyA9IGl1My5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpOwotCQlIYXNoU2V0IGhhc2ggPSBuZXcgSGFzaFNldCgpOwotCQloYXNoLmFkZChpdTEpOwotCQloYXNoLmFkZChpdTMpOwotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG5ldyBIYXNodGFibGUoKSwgbnVsbCkuYXR0YWNoQ1VzKGhhc2gpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGl1LmdldElkKCkuZXF1YWxzKGl1MS5nZXRJZCgpKSkKLQkJCQlpdTEgPSBpdTsKLQkJCWlmIChpdS5nZXRJZCgpLmVxdWFscyhpdTMuZ2V0SWQoKSkpCi0JCQkJaXUzID0gaXU7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlpdTEgPSBudWxsOwotCQlpdTMgPSBudWxsOwotCQlpdTFEZXBzID0gbnVsbDsKLQkJaXUzRGVwcyA9IG51bGw7Ci0JCWl1MUNhcHMgPSBudWxsOwotCQlpdTNDYXBzID0gbnVsbDsKLQkJc3VwZXIudGVhckRvd24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q2FwYWJpbGl0aWVzKCkgewotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBpdUNhcGFiaWxpdGllcyA9IGl1MUNhcHM7Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIGluaXRpYWxGcmFnbWVudENhcGFiaWxpdGllcyA9IGl1M0NhcHM7Ci0KLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gbWVyZ2VkQ2FwYWJpbGl0aWVzID0gaXUxLmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaXVDYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUZyYWdtZW50VGVzdC5hc3NlcnRDb250YWluc1dpdGhFcXVhbHMobWVyZ2VkQ2FwYWJpbGl0aWVzLCBpdUNhcGFiaWxpdGllc1tpXSk7Ci0JCX0KLQotCQkvL1RoZSBmcmFnbWVudCBwcm9wZXJ0eSBpcyBub3Qgc2V0Ci0JCWFzc2VydE51bGwoaXUxLmdldFByb3BlcnR5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0ZSQUdNRU5UKSk7Ci0KLQkJLy9UaGUgZnJhZ21lbnQgZG9lcyBub3QgY29udGFpbiBpdSBuYW1lc3BhY2UKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbml0aWFsRnJhZ21lbnRDYXBhYmlsaXRpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpbml0aWFsRnJhZ21lbnRDYXBhYmlsaXRpZXNbaV0uZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lEKSkgewotCQkJCWFzc2VydERvZXNOb3RDb250YWluKG1lcmdlZENhcGFiaWxpdGllcywgaW5pdGlhbEZyYWdtZW50Q2FwYWJpbGl0aWVzW2ldKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWFzc2VydEVxdWFscygiVGhlIGZyYWdtZW50IGNhcGFiaWxpdGllcyBzaG91bGQgbm90IGNoYW5nZSIsIGluaXRpYWxGcmFnbWVudENhcGFiaWxpdGllcywgaXUzLmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCksIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdFtdIGV4cGVjdGVkLCBPYmplY3RbXSBhY3R1YWwpIHsKLQkJaWYgKGV4cGVjdGVkID09IG51bGwgJiYgYWN0dWFsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChleHBlY3RlZCA9PSBudWxsIHx8IGFjdHVhbCA9PSBudWxsKQotCQkJZmFpbChtZXNzYWdlKTsKLQkJaWYgKGV4cGVjdGVkLmxlbmd0aCAhPSBhY3R1YWwubGVuZ3RoKQotCQkJZmFpbChtZXNzYWdlKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkrKykKLQkJCWFzc2VydEVxdWFscyhtZXNzYWdlLCBleHBlY3RlZFtpXSwgYWN0dWFsW2ldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhc3NlcnRFcXVhbHMoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdFtdIGV4cGVjdGVkLCBPYmplY3RbXSBhY3R1YWwsIGJvb2xlYW4gb3JkZXJJbXBvcnRhbnQpIHsKLQkJLy8gaWYgdGhlIG9yZGVyIGluIHRoZSBhcnJheSBtdXN0IG1hdGNoIGV4YWN0bHksIHRoZW4gY2FsbCB0aGUgb3RoZXIgbWV0aG9kCi0JCWlmIChvcmRlckltcG9ydGFudCkgewotCQkJYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGV4cGVjdGVkLCBhY3R1YWwpOwotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIG90aGVyd2lzZSB1c2UgdGhpcyBtZXRob2QgYW5kIGNoZWNrIHRoYXQgdGhlIGFycmF5cyBhcmUgZXF1YWwgaW4gYW55IG9yZGVyCi0JCWlmIChleHBlY3RlZCA9PSBudWxsICYmIGFjdHVhbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKQotCQkJcmV0dXJuOwotCQlpZiAoZXhwZWN0ZWQgPT0gbnVsbCB8fCBhY3R1YWwgPT0gbnVsbCkKLQkJCWFzc2VydFRydWUobWVzc2FnZSArICIuMSIsIGZhbHNlKTsKLQkJaWYgKGV4cGVjdGVkLmxlbmd0aCAhPSBhY3R1YWwubGVuZ3RoKQotCQkJYXNzZXJ0VHJ1ZShtZXNzYWdlICsgIi4yIiwgZmFsc2UpOwotCQlib29sZWFuW10gZm91bmQgPSBuZXcgYm9vbGVhbltleHBlY3RlZC5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKCFmb3VuZFtqXSAmJiBleHBlY3RlZFtpXS5lcXVhbHMoYWN0dWFsW2pdKSkKLQkJCQkJZm91bmRbal0gPSB0cnVlOwotCQkJfQotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZm91bmQubGVuZ3RoOyBpKyspCi0JCQlpZiAoIWZvdW5kW2ldKQotCQkJCWFzc2VydFRydWUobWVzc2FnZSArICIuMy4iICsgaSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnREb2VzTm90Q29udGFpbihPYmplY3RbXSBvYmplY3RzLCBPYmplY3Qgc2VhcmNoZWQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob2JqZWN0c1tpXS5lcXVhbHMoc2VhcmNoZWQpKQotCQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcigiVGhlIGFycmF5IHNob3VsZCBub3QgY29udGFpbiB0aGUgc2VhcmNoZWQgZWxlbWVudCIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXMoKSB7Ci0JCWFzc2VydE5vdE51bGwoIlRoZSBwcm9wZXJ0eSBpcyBtaXNzaW5nIiwgaXUzLmdldFByb3BlcnR5KFBST1BfRlJBRykpOwotCQlhc3NlcnROb3ROdWxsKCJUaGUgcHJvcGVydHkgaXMgbWlzc2luZyIsIGl1MS5nZXRQcm9wZXJ0eShQUk9QX0lVKSk7Ci0JCWFzc2VydE51bGwoIlRoZSBwcm9wZXJ0eSBzaG91bGQgbm90IGJlIGF2YWlsYWJsZSIsIGl1MS5nZXRQcm9wZXJ0eSgiZG9lc25vdGV4aXN0IikpOwotCX0KLQotCXB1YmxpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVRnJhZ21lbnQoU3RyaW5nIG5hbWUpIHsKLQkJSW5zdGFsbGFibGVVbml0RnJhZ21lbnREZXNjcmlwdGlvbiBpdSA9IG5ldyBJbnN0YWxsYWJsZVVuaXRGcmFnbWVudERlc2NyaXB0aW9uKCk7Ci0JCWl1LnNldElkKG5hbWUpOwotCQlpdS5zZXRWZXJzaW9uKG5ldyBWZXJzaW9uKDEsIDAsIDApKTsKLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LlRPVUNIUE9JTlRfT1NHSSk7Ci0JCWl1LnNldFByb3BlcnR5KFBST1BfRlJBRywgInZhbHVlIik7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoImVjbGlwc2UudG91Y2hwb2ludCIsICJidW5kbGUiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIHRydWUpLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KFRFU1RfUkVRVUlSRUQsIFRFU1RfUkVRVUlSRUQsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCB0cnVlLCBmYWxzZSl9OwotCQlpdS5zZXRIb3N0KHJlcXMpOwotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBjYXAgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoInRlc3RDYXBhYmlsaXR5SW5GcmFnbWVudCIsICJ0ZXN0Q2FwYWJpbGl0eUluRnJhZ21lbnQiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSl9OwotCQlpdS5zZXRDYXBhYmlsaXRpZXMoY2FwKTsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXRGcmFnbWVudChpdSk7Ci0JfQotCi0JcHVibGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlSVUoU3RyaW5nIG5hbWUpIHsKLQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gaXUgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWl1LnNldElkKG5hbWUpOwotCQlpdS5zZXRWZXJzaW9uKG5ldyBWZXJzaW9uKDEsIDAsIDApKTsKLQkJaXUuc2V0VG91Y2hwb2ludFR5cGUoQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0LlRPVUNIUE9JTlRfT1NHSSk7Ci0JCWl1LnNldFByb3BlcnR5KFBST1BfSVUsICJ2YWx1ZUlVIik7Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIGNhcCA9IG5ldyBQcm92aWRlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eSgiZWNsaXBzZS50b3VjaHBvaW50IiwgImJ1bmRsZSIsIG5ldyBWZXJzaW9uKDEsIDAsIDApKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eSgidGVzdENhcGFiaWxpdHkiLCAidGVzdENhcGFiaWxpdHkiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSl9OwotCQlpdS5zZXRDYXBhYmlsaXRpZXMoY2FwKTsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9GcmFnbWVudFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9GcmFnbWVudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMyZWMwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvRnJhZ21lbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0aW9uRmFpbGVkRXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uLlJlc29sdXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotCi1wdWJsaWMgY2xhc3MgRnJhZ21lbnRUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQotCXB1YmxpYyB2b2lkIHRlc3RBc3NvY2lhdGlvbigpIHsKLQkJU3RyaW5nIElEID0gInVpLnRlc3QxIjsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdTEgPSBjcmVhdGVFY2xpcHNlSVUoSUQpOwotCQlJSW5zdGFsbGFibGVVbml0IGl1MiA9IGNyZWF0ZUJ1bmRsZUZyYWdtZW50KCJpdUZyYWdtZW50LnRlc3QxIik7Ci0JCVJlc29sdXRpb25IZWxwZXIgcmggPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihuZXcgSGFzaHRhYmxlKCksIG51bGwpOwotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoaXUxKTsKLQkJc2V0LmFkZChpdTIpOwotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IHJoLmF0dGFjaENVcyhzZXQpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVzdWx0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKGl1LmdldElkKCkuZXF1YWxzKElEKSkgewotCQkJCWFzc2VydEVxdWFscyhpdS5nZXRGcmFnbWVudHMoKS5sZW5ndGgsIDEpOwotCQkJCWFzc2VydEVxdWFscyhpdS5nZXRGcmFnbWVudHMoKVswXS5nZXRJZCgpLCAiaXVGcmFnbWVudC50ZXN0MSIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFzc29jaWF0aW9uMigpIHsKLQkJU3RyaW5nIElEMSA9ICJ1aS50ZXN0MSI7Ci0JCVN0cmluZyBJRDMgPSAidWkudGVzdDMiOwotCQlJSW5zdGFsbGFibGVVbml0IGl1MSA9IGNyZWF0ZUVjbGlwc2VJVShJRDEpOwotCQlJSW5zdGFsbGFibGVVbml0IGl1MyA9IGNyZWF0ZUVjbGlwc2VJVShJRDMpOwotCQlJSW5zdGFsbGFibGVVbml0IGl1MiA9IGNyZWF0ZUJ1bmRsZUZyYWdtZW50KCJpdUZyYWdtZW50LnRlc3QxIik7Ci0JCVJlc29sdXRpb25IZWxwZXIgcmggPSBuZXcgUmVzb2x1dGlvbkhlbHBlcihuZXcgSGFzaHRhYmxlKCksIG51bGwpOwotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoaXUxKTsKLQkJc2V0LmFkZChpdTIpOwotCQlzZXQuYWRkKGl1Myk7Ci0JCUNvbGxlY3Rpb24gcmVzdWx0ID0gcmguYXR0YWNoQ1VzKHNldCk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSByZXN1bHQuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoaXUuZ2V0SWQoKS5lcXVhbHMoSUQxKSkgewotCQkJCWFzc2VydEVxdWFscyhpdS5nZXRGcmFnbWVudHMoKS5sZW5ndGgsIDEpOwotCQkJCWFzc2VydEVxdWFscyhpdS5nZXRGcmFnbWVudHMoKVswXS5nZXRJZCgpLCAiaXVGcmFnbWVudC50ZXN0MSIpOwotCQkJfQotCQkJaWYgKGl1LmdldElkKCkuZXF1YWxzKElEMykpIHsKLQkJCQlhc3NlcnRFcXVhbHMoaXUuZ2V0RnJhZ21lbnRzKCkubGVuZ3RoLCAxKTsKLQkJCQlhc3NlcnRFcXVhbHMoaXUuZ2V0RnJhZ21lbnRzKClbMF0uZ2V0SWQoKSwgIml1RnJhZ21lbnQudGVzdDEiKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RUb3VjaHBvaW50RGF0YSgpIHsKLQkJYXNzZXJ0RXF1YWxzKGNyZWF0ZUlVV2l0aFRvdWNocG9pbnREYXRhKCkuZ2V0VG91Y2hwb2ludERhdGEoKS5sZW5ndGgsIDEpOwotCQlhc3NlcnRFcXVhbHMoY3JlYXRlQnVuZGxlRnJhZ21lbnQoIml1RnJhZ21lbnQudGVzdDEiKS5nZXRUb3VjaHBvaW50RGF0YSgpLmxlbmd0aCwgMSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUxID0gY3JlYXRlSVVXaXRoVG91Y2hwb2ludERhdGEoKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdTIgPSBjcmVhdGVCdW5kbGVGcmFnbWVudCgiaXVGcmFnbWVudC50ZXN0MSIpOwotCQlSZXNvbHV0aW9uSGVscGVyIHJoID0gbmV3IFJlc29sdXRpb25IZWxwZXIobmV3IEhhc2h0YWJsZSgpLCBudWxsKTsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlzZXQuYWRkKGl1MSk7Ci0JCXNldC5hZGQoaXUyKTsKLQkJQ29sbGVjdGlvbiByZXN1bHQgPSByaC5hdHRhY2hDVXMoc2V0KTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlc3VsdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpdS5nZXRJZCgpLmVxdWFscyhpdTEuZ2V0SWQoKSkpCi0JCQkJYXNzZXJ0RXF1YWxzKDIsIGl1LmdldFRvdWNocG9pbnREYXRhKCkubGVuZ3RoKTsKLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZyYWdtZW50Q2FwYWJpbGl0eSgpIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IGNyZWF0ZUJ1bmRsZUZyYWdtZW50KCJpdUZyYWdtZW50LnRlc3QxIik7Ci0JCWFzc2VydEVxdWFscyhCb29sZWFuLlRSVUUudG9TdHJpbmcoKSwgaXUuZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfRlJBR01FTlQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdElVQ2FwYWJpbGl0eSgpIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IGNyZWF0ZUVjbGlwc2VJVSgidWkudGVzdDEiKTsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gY2FwID0gaXUuZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXAubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChjYXBbaV0uZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lEKSkgewotCQkJCWFzc2VydEVxdWFscyhjYXBbaV0uZ2V0TmFtZXNwYWNlKCksIElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lEKTsKLQkJCQlhc3NlcnRFcXVhbHMoY2FwW2ldLmdldE5hbWUoKSwgaXUuZ2V0SWQoKSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFcnJvcigiTm8gY2FwYWJpbGl0eSBmb3IgdGhlIGl1IGlkIik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydENvbnRhaW5zKE9iamVjdFtdIG9iamVjdHMsIE9iamVjdCBzZWFyY2hlZCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvYmplY3RzW2ldID09IHNlYXJjaGVkKQotCQkJCXJldHVybjsKLQkJfQotCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIlRoZSBhcnJheSBkb2VzIG5vdCBjb250YWluIHRoZSBzZWFyY2hlZCBlbGVtZW50Iik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydENvbnRhaW5zV2l0aEVxdWFscyhPYmplY3RbXSBvYmplY3RzLCBPYmplY3Qgc2VhcmNoZWQpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob2JqZWN0c1tpXS5lcXVhbHMoc2VhcmNoZWQpKQotCQkJCXJldHVybjsKLQkJfQotCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXJyb3IoIlRoZSBhcnJheSBkb2VzIG5vdCBjb250YWluIHRoZSBzZWFyY2hlZCBlbGVtZW50Iik7Ci0JfQotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZUlVV2l0aFRvdWNocG9pbnREYXRhKCkgewotCQlUb3VjaHBvaW50RGF0YSBkYXRhID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKG5ldyBIYXNoTWFwKCkpOwotCQlyZXR1cm4gY3JlYXRlRWNsaXBzZUlVKCJ1aS50ZXN0MSIsIERFRkFVTFRfVkVSU0lPTiwgTk9fUkVRVUlSRVMsIGRhdGEpOwotCX0KLQotCS8vCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVJVUZyYWdtZW50V2l0aFRvdWNocG9pbnREYXRhKCkgewotCS8vCQlUb3VjaHBvaW50RGF0YSBkYXRhID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnREYXRhKG5ldyBIYXNoTWFwKCkpOwotCS8vCQlJSW5zdGFsbGFibGVVbml0RnJhZ21lbnQgdW5pdCA9IGNyZWF0ZUJ1bmRsZUZyYWdtZW50KCJpdUZyYWdtZW50LnRlc3QxIik7Ci0JLy8JCXJldHVybiB1bml0OwotCS8vCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9JVVBhdGNoUGVyc2lzdGVuY2VUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvSVVQYXRjaFBlcnNpc3RlbmNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmNjMzc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9JVVBhdGNoUGVyc2lzdGVuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMubWV0YWRhdGE7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5PcmRlcmVkUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLkluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuaW8uTWV0YWRhdGFQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LmlvLk1ldGFkYXRhV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLWltcG9ydCBvcmcueG1sLnNheC4qOwotCi1wdWJsaWMgY2xhc3MgSVVQYXRjaFBlcnNpc3RlbmNlVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0KLQkvLyBSYW5kb21seSBjaG9zZSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzIGFzIHRoZSBJVSBmb3IgdGVzdGluZyBwZXJzaXN0ZW5jZQotCS8vIGJ1dCAnZW5oYW5jZWQnIGl0IGZvciBiZXR0ZXIgY292ZXJhZ2UuCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBhY2thZ2VzTlMgPSAib3NnaS5wYWNrYWdlcyI7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgaWQgPSAib3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyI7Ci0JcHJpdmF0ZSBzdGF0aWMgVmVyc2lvbiB2ZXJzaW9uID0gbmV3IFZlcnNpb24oIjMuMS4yMDAudjIwMDcwNjA1Iik7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbHRlciA9ICIoJiAob3NnaS53cz13aW4zMikgKG9zZ2kub3M9d2luMzIpIChvc2dpLmFyY2g9eDg2KSkiOyAvLyBub3QgcmVhbGx5Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXVtdIHByb3BlcnRpZXMgPSBuZXcgU3RyaW5nW11bXSB7bmV3IFN0cmluZ1tdIHsiZXF1aW5veC5wMi5uYW1lIiwgIk9TR2kgUmVsZWFzZSA0LjAuMSBTZXJ2aWNlcyJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHsiZXF1aW5veC5wMi5kZXNjcmlwdGlvbiIsICJPU0dpIFNlcnZpY2UgUGxhdGZvcm0gUmVsZWFzZSA0LjAuMSBTZXJ2aWNlIEludGVyZmFjZXMgYW5kIENsYXNzZXMifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7ImVxdWlub3gucDIucHJvdmlkZXIiLCAiRWNsaXBzZS5vcmcifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7ImVxdWlub3gucDIuY29udGFjdCIsICJ3d3cuZWNsaXBzZS5vcmcifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7ImVxdWlub3gucDIuY29weXJpZ2h0IiwgIkNvcHlyaWdodCAoYykgMjAwMywgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQSBsb25nLXdpbmRlZCBjb3B5cmlnaHQgbm90aWNlLiJ9fTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdW10gcHJvdmlkZXMgPSBuZXcgU3RyaW5nW11bXSB7bmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAib3JnLm9zZ2kuc2VydmljZS5jbSIsICIxLjIuMCJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAib3JnLm9zZ2kuc2VydmljZS5jb21wb25lbnQiLCAiMS4wLjAifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgIm9yZy5vc2dpLnNlcnZpY2UuZGV2aWNlIiwgIjEuMS4wIn0sIC8vCi0JCQluZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJvcmcub3NnaS5zZXJ2aWNlLmV2ZW50IiwgIjEuMS4wIn0sIC8vCi0JCQluZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJvcmcub3NnaS5zZXJ2aWNlLmh0dHAiLCAiMS4yLjAifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgIm9yZy5vc2dpLnNlcnZpY2UuaW8iLCAiMS4wLjAifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgIm9yZy5vc2dpLnNlcnZpY2UubG9nIiwgIjEuMy4wIn0sIC8vCi0JCQluZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJvcmcub3NnaS5zZXJ2aWNlLm1ldGF0eXBlIiwgIjEuMS4wIn0sIC8vCi0JCQluZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJvcmcub3NnaS5zZXJ2aWNlLnByb3Zpc2lvbmluZyIsICIxLjEuMCJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAib3JnLm9zZ2kuc2VydmljZS51cG5wIiwgIjEuMS4wIn0sIC8vCi0JCQluZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJvcmcub3NnaS5zZXJ2aWNlLnVzZXJhZG1pbiIsICIxLjEuMCJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAib3JnLm9zZ2kuc2VydmljZS53aXJlYWRtaW4iLCAiMS4wLjAifX07IC8vCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXVtdIHJlcXVpcmVzID0gbmV3IFN0cmluZ1tdW10ge25ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgImphdmF4LnNlcnZsZXQiLCAiMC4wLjAiLCAidHJ1ZSJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAiamF2YXguc2VydmxldC5odHRwIiwgIjAuMC4wIiwgInRydWUifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgIm9yZy5vc2dpLmZyYW1ld29yayIsICIxLjIuMCIsICJmYWxzZSJ9fTsgLy8KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdW10gaW5zdHJ1Y3Rpb25zID0gbmV3IFN0cmluZ1tdW10ge25ldyBTdHJpbmdbXSB7Im1hbmlmZXN0IiwgIk1hbmlmZXN0LVZlcnNpb246IDEuMFxcQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmdcXEJ1bmRsZS1Db250YWN0QWRkcmVzczogd3d3LmVjbGlwc2Uub3JnXFwuLi5hIHdob2xlIGJ1bmNoIG9mIG90aGVyIG1hbmlmZXN0IGNvbnRlbnQuLi4ifSwgbmV3IFN0cmluZ1tdIHsiemlwcGVkIiwgInRydWUifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7ImNvbmZpZ3VyZSIsICJhZGRQcm9ncmFtQXJnKHByb2dyYW1Bcmc6LXN0YXJ0dXApO2FkZFByb2dyYW1BcmcocHJvZ3JhbUFyZzpAYXJ0aWZhY3QpOyJ9fTsgLy8KLQotCXB1YmxpYyBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVQZXJzaXN0ZW5jZVRlc3RJVSgpIHsKLQkJTWFwIHByb3BlcnR5TWFwID0gY3JlYXRlUHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gYWRkaXRpb25hbFByb3ZpZGVzID0gY3JlYXRlUHJvdmlkZWQocHJvdmlkZXMpOwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlbWVudHMgPSBjcmVhdGVSZXF1aXJlZChyZXF1aXJlcyk7Ci0JCVRvdWNocG9pbnREYXRhIHRwRGF0YSA9IGNyZWF0ZVRvdWNocG9pbnREYXRhKGluc3RydWN0aW9ucyk7Ci0JCUlVcGRhdGVEZXNjcmlwdG9yIHVwZGF0ZSA9IGNyZWF0ZVVwZGF0ZURlc2NyaXB0b3IoKTsKLQkJYm9vbGVhbiBzaW5nbGV0b24gPSBmYWxzZTsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IGNyZWF0ZUlVKGlkLCB2ZXJzaW9uLCBmaWx0ZXIsIHJlcXVpcmVtZW50cywgYWRkaXRpb25hbFByb3ZpZGVzLCBwcm9wZXJ0eU1hcCwgVE9VQ0hQT0lOVF9PU0dJLCB0cERhdGEsIHNpbmdsZXRvbiwgdXBkYXRlKTsKLQkJcmV0dXJuIGl1OwotCX0KLQotCXByaXZhdGUgc3RhdGljIElVcGRhdGVEZXNjcmlwdG9yIGNyZWF0ZVVwZGF0ZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVXBkYXRlRGVzY3JpcHRvcihpZCwgbmV3IFZlcnNpb25SYW5nZShJVV9URVNUX1ZFUlNJT04sIHRydWUsIElVX1RFU1RfVkVSU0lPTiwgdHJ1ZSksIElVcGRhdGVEZXNjcmlwdG9yLkhJR0gsICJkZXNjIik7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTWFwIGNyZWF0ZVByb3BlcnRpZXMoU3RyaW5nW11bXSBrZXlWYWx1ZVBhaXJzKSB7Ci0JCU9yZGVyZWRQcm9wZXJ0aWVzIHByb3BzID0gbmV3IE9yZGVyZWRQcm9wZXJ0aWVzKGtleVZhbHVlUGFpcnMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlWYWx1ZVBhaXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBuZXh0UGFpciA9IGtleVZhbHVlUGFpcnNbaV07Ci0JCQlwcm9wcy5wdXQobmV4dFBhaXJbMF0sIG5leHRQYWlyWzFdKTsKLQkJfQotCQlyZXR1cm4gcHJvcHM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJvdmlkZWRDYXBhYmlsaXR5W10gY3JlYXRlUHJvdmlkZWQoU3RyaW5nW11bXSBwcm92aWRlVHVwbGVzKSB7Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3ZpZGVkID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtwcm92aWRlVHVwbGVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZVR1cGxlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gbmV4dFR1cGxlID0gcHJvdmlkZVR1cGxlc1tpXTsKLQkJCXByb3ZpZGVkW2ldID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVByb3ZpZGVkQ2FwYWJpbGl0eShuZXh0VHVwbGVbMF0sIG5leHRUdXBsZVsxXSwgbmV3IFZlcnNpb24obmV4dFR1cGxlWzJdKSk7Ci0JCX0KLQkJLy8gcHJvdmlkZWRbcHJvdmlkZVR1cGxlcy5sZW5ndGhdID0gQlVORExFX0NBUEFCSUxJVFk7Ci0JCXJldHVybiBwcm92aWRlZDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBSZXF1aXJlZENhcGFiaWxpdHlbXSBjcmVhdGVSZXF1aXJlZChTdHJpbmdbXVtdIHJlcXVpcmVUdXBsZXMpIHsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZWQgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W3JlcXVpcmVUdXBsZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlVHVwbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBuZXh0VHVwbGUgPSByZXF1aXJlVHVwbGVzW2ldOwotCQkJcmVxdWlyZWRbaV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KG5leHRUdXBsZVswXSwgbmV4dFR1cGxlWzFdLCBuZXcgVmVyc2lvblJhbmdlKG5leHRUdXBsZVsyXSksIG51bGwsIEJvb2xlYW4udmFsdWVPZihuZXh0VHVwbGVbM10pLmJvb2xlYW5WYWx1ZSgpLCBmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIHJlcXVpcmVkOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFRvdWNocG9pbnREYXRhIGNyZWF0ZVRvdWNocG9pbnREYXRhKFN0cmluZ1tdW10gaW5zdHJ1Y3Rpb25EYXRhKSB7Ci0JCU1hcCBtYXAgPSBuZXcgTGlua2VkSGFzaE1hcChpbnN0cnVjdGlvbkRhdGEubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnN0cnVjdGlvbkRhdGEubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZ1tdIG5leHRJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uRGF0YVtpXTsKLQkJCW1hcC5wdXQobmV4dEluc3RydWN0aW9uWzBdLCBuZXh0SW5zdHJ1Y3Rpb25bMV0pOwotCQl9Ci0JCXJldHVybiBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludERhdGEobWFwKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSVVfVEVTVF9UQVJHRVQgPSAiaW5zdGFsbGFibGVVbml0VGVzdCI7Ci0JcHJpdmF0ZSBzdGF0aWMgVmVyc2lvbiBJVV9URVNUX1ZFUlNJT04gPSBuZXcgVmVyc2lvbigiMC4wLjEiKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBJVV9URVNUX0VMRU1FTlQgPSAidGVzdCI7Ci0KLQljbGFzcyBJVVN0cmluZ1dyaXRlciBleHRlbmRzIE1ldGFkYXRhV3JpdGVyIHsKLQotCQlwdWJsaWMgSVVTdHJpbmdXcml0ZXIoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXN1cGVyKHN0cmVhbSwgbmV3IFByb2Nlc3NpbmdJbnN0cnVjdGlvbltdIHtQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24ubWFrZUNsYXNzVmVyc2lvbkluc3RydWN0aW9uKElVX1RFU1RfVEFSR0VULCBJbnN0YWxsYWJsZVVuaXQuY2xhc3MsIElVX1RFU1RfVkVSU0lPTil9KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdyaXRlVGVzdChJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCQlzdGFydChJVV9URVNUX0VMRU1FTlQpOwotCQkJd3JpdGVJbnN0YWxsYWJsZVVuaXQoaXUpOwotCQkJZW5kKElVX1RFU1RfRUxFTUVOVCk7Ci0JCQlmbHVzaCgpOwotCQl9Ci0JfQotCi0JY2xhc3MgSVVTdHJpbmdQYXJzZXIgZXh0ZW5kcyBNZXRhZGF0YVBhcnNlciB7Ci0KLQkJcHVibGljIElVU3RyaW5nUGFyc2VyKEJ1bmRsZUNvbnRleHQgY29udGV4dCwgU3RyaW5nIGJ1bmRsZUlkKSB7Ci0JCQlzdXBlcihjb250ZXh0LCBidW5kbGVJZCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwYXJzZShTdHJpbmcgcHJvZmlsZVN0cmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXRoaXMuc3RhdHVzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJZ2V0UGFyc2VyKCk7Ci0JCQkJVGVzdEhhbmRsZXIgdGVzdEhhbmRsZXIgPSBuZXcgVGVzdEhhbmRsZXIoKTsKLQkJCQl4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IElVRG9jSGFuZGxlcihJVV9URVNUX0VMRU1FTlQsIHRlc3RIYW5kbGVyKSk7Ci0JCQkJeG1sUmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHByb2ZpbGVTdHJpbmcpKSk7Ci0JCQkJaWYgKGlzVmFsaWRYTUwoKSkgewotCQkJCQl0aGVJVSA9IHRlc3RIYW5kbGVyLmdldElVKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfSBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZmFpbCgpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IHRoZUlVID0gbnVsbDsKLQotCQlwcml2YXRlIGZpbmFsIGNsYXNzIElVRG9jSGFuZGxlciBleHRlbmRzIERvY0hhbmRsZXIgewotCi0JCQlwdWJsaWMgSVVEb2NIYW5kbGVyKFN0cmluZyByb290TmFtZSwgUm9vdEhhbmRsZXIgcm9vdEhhbmRsZXIpIHsKLQkJCQlzdXBlcihyb290TmFtZSwgcm9vdEhhbmRsZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCWlmIChJVV9URVNUX1RBUkdFVC5lcXVhbHModGFyZ2V0KSkgewotCQkJCQlTdHJpbmcgY2xhenogPSBleHRyYWN0UElDbGFzcyhkYXRhKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmICghQ2xhc3MuZm9yTmFtZShjbGF6eikuZXF1YWxzKEluc3RhbGxhYmxlVW5pdC5jbGFzcykpIHsKLQkJCQkJCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJXcm9uZyBjbGFzcyAnIiArIGNsYXp6ICsgIicgaW4gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oIkluc3RhbGxhYmxlVW5pdCBjbGFzcyAnIiArIGNsYXp6ICsgIicgbm90IGZvdW5kIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCX0KLQotCQkJCQlWZXJzaW9uIGl1VGVzdFZlcnNpb24gPSBleHRyYWN0UElWZXJzaW9uKHRhcmdldCwgZGF0YSk7Ci0JCQkJCWlmICghSVVfVEVTVF9WRVJTSU9OLmVxdWFscyhpdVRlc3RWZXJzaW9uKSkgewotCQkJCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiQmFkIGl1IHRlc3QgdmVyc2lvbi4iKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgZmluYWwgY2xhc3MgVGVzdEhhbmRsZXIgZXh0ZW5kcyBSb290SGFuZGxlciB7Ci0KLQkJCXByaXZhdGUgSW5zdGFsbGFibGVVbml0SGFuZGxlciBpdUhhbmRsZXIgPSBudWxsOwotCi0JCQlwcml2YXRlIEluc3RhbGxhYmxlVW5pdCBpdSA9IG51bGw7Ci0JCQlwcml2YXRlIExpc3Qgc2luZ2xldG9uID0gbmV3IEFycmF5TGlzdCgxKTsKLQotCQkJcHVibGljIFRlc3RIYW5kbGVyKCkgewotCQkJCXN1cGVyKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBJbnN0YWxsYWJsZVVuaXQgZ2V0SVUoKSB7Ci0JCQkJcmV0dXJuIGl1OwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSb290QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJCQlwYXJzZUF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbm9BdHRyaWJ1dGVzLCBub0F0dHJpYnV0ZXMpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJCWlmIChJTlNUQUxMQUJMRV9VTklUX0VMRU1FTlQuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJCWlmIChpdUhhbmRsZXIgPT0gbnVsbCkgewotCQkJCQkJaXVIYW5kbGVyID0gbmV3IEluc3RhbGxhYmxlVW5pdEhhbmRsZXIodGhpcywgYXR0cmlidXRlcywgc2luZ2xldG9uKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWR1cGxpY2F0ZUVsZW1lbnQodGhpcywgbmFtZSwgYXR0cmlidXRlcyk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlpbnZhbGlkRWxlbWVudChuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGZpbmlzaGVkKCkgewotCQkJCWlmIChpc1ZhbGlkWE1MKCkpIHsKLQkJCQkJaWYgKGl1SGFuZGxlciAhPSBudWxsICYmIHNpbmdsZXRvbi5zaXplKCkgPT0gMSkgewotCQkJCQkJaXUgPSAoSW5zdGFsbGFibGVVbml0KSBpdUhhbmRsZXIuZ2V0SW5zdGFsbGFibGVVbml0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJCXJldHVybiAiRXJyb3IgcGFyc2luZyBpbnN0YWxsYWJsZSB1bml0IHN0cmluZyI7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldFJvb3RPYmplY3QoKSB7Ci0JCQlyZXR1cm4gdGhlSVU7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJVVBlcnNpc3RlbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdTAgPSBjcmVhdGVQZXJzaXN0ZW5jZVRlc3RJVSgpOwotCQl2YWxpZGF0ZUlVKGl1MCk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQwID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgzMDcyKTsKLQkJSVVTdHJpbmdXcml0ZXIgd3JpdGVyMCA9IG5ldyBJVVN0cmluZ1dyaXRlcihvdXRwdXQwKTsKLQkJd3JpdGVyMC53cml0ZVRlc3QoaXUwKTsKLQkJU3RyaW5nIGl1VGV4dDAgPSBvdXRwdXQwLnRvU3RyaW5nKCk7Ci0JCW91dHB1dDAuY2xvc2UoKTsKLQotCQlJVVN0cmluZ1BhcnNlciBwYXJzZXIgPSBuZXcgSVVTdHJpbmdQYXJzZXIoVGVzdEFjdGl2YXRvci5jb250ZXh0LCBUZXN0QWN0aXZhdG9yLlBJX1BST1ZfVEVTVFMpOwotCQlwYXJzZXIucGFyc2UoaXVUZXh0MCk7Ci0JCWFzc2VydFRydWUoIkVycm9yIHBhcnNpbmcgdGVzdCBpdTogIiArIHBhcnNlci5nZXRTdGF0dXMoKS5nZXRNZXNzYWdlKCksIHBhcnNlci5nZXRTdGF0dXMoKS5pc09LKCkpOwotCQlJbnN0YWxsYWJsZVVuaXQgaXUxID0gKEluc3RhbGxhYmxlVW5pdCkgcGFyc2VyLmdldFJvb3RPYmplY3QoKTsKLQkJdmFsaWRhdGVJVShpdTEpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0MSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTQ5Mik7Ci0JCUlVU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBJVVN0cmluZ1dyaXRlcihvdXRwdXQxKTsKLQkJd3JpdGVyLndyaXRlVGVzdChpdTEpOwotCQlTdHJpbmcgaXVUZXh0MSA9IG91dHB1dDEudG9TdHJpbmcoKTsKLQkJb3V0cHV0MS5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IHdyaXRlIGFmdGVyIHJlYWQgYWZ0ZXIgd3JpdGUgcHJvZHVjZWQgZGlmZmVyZW50IFhNTCIsIGl1VGV4dDEuZXF1YWxzKGl1VGV4dDApKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SVVQYXRjaFBlcnNpc3RlbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdTAgPSBjcmVhdGVQYXRjaElVKCk7Ci0JCXZhbGlkYXRlSVUoaXUwKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dDAgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDMwNzIpOwotCQlJVVN0cmluZ1dyaXRlciB3cml0ZXIwID0gbmV3IElVU3RyaW5nV3JpdGVyKG91dHB1dDApOwotCQl3cml0ZXIwLndyaXRlVGVzdChpdTApOwotCQlTdHJpbmcgaXVUZXh0MCA9IG91dHB1dDAudG9TdHJpbmcoKTsKLQkJb3V0cHV0MC5jbG9zZSgpOwotCi0JCUlVU3RyaW5nUGFyc2VyIHBhcnNlciA9IG5ldyBJVVN0cmluZ1BhcnNlcihUZXN0QWN0aXZhdG9yLmNvbnRleHQsIFRlc3RBY3RpdmF0b3IuUElfUFJPVl9URVNUUyk7Ci0JCXBhcnNlci5wYXJzZShpdVRleHQwKTsKLQkJYXNzZXJ0VHJ1ZSgiRXJyb3IgcGFyc2luZyB0ZXN0IGl1OiAiICsgcGFyc2VyLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSwgcGFyc2VyLmdldFN0YXR1cygpLmlzT0soKSk7Ci0JCUluc3RhbGxhYmxlVW5pdFBhdGNoIGl1MSA9IChJbnN0YWxsYWJsZVVuaXRQYXRjaCkgcGFyc2VyLmdldFJvb3RPYmplY3QoKTsKLQkJdmFsaWRhdGVJVShpdTEpOwotCQl2YWxpZGF0ZUlVUGF0Y2goaXUxKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dDEgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDE0OTIpOwotCQlJVVN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgSVVTdHJpbmdXcml0ZXIob3V0cHV0MSk7Ci0JCXdyaXRlci53cml0ZVRlc3QoaXUxKTsKLQkJU3RyaW5nIGl1VGV4dDEgPSBvdXRwdXQxLnRvU3RyaW5nKCk7Ci0JCW91dHB1dDEuY2xvc2UoKTsKLQkJYXNzZXJ0VHJ1ZSgiSW5zdGFsbGFibGUgdW5pdCB3cml0ZSBhZnRlciByZWFkIGFmdGVyIHdyaXRlIHByb2R1Y2VkIGRpZmZlcmVudCBYTUwiLCBpdVRleHQxLmVxdWFscyhpdVRleHQwKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXRQYXRjaCBjcmVhdGVQYXRjaElVKCkgewotCQlNYXAgcHJvcGVydHlNYXAgPSBjcmVhdGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBhZGRpdGlvbmFsUHJvdmlkZXMgPSBjcmVhdGVQcm92aWRlZChwcm92aWRlcyk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVtZW50cyA9IGNyZWF0ZVJlcXVpcmVkKHJlcXVpcmVzKTsKLQkJVG91Y2hwb2ludERhdGEgdHBEYXRhID0gY3JlYXRlVG91Y2hwb2ludERhdGEoaW5zdHJ1Y3Rpb25zKTsKLQkJSVVwZGF0ZURlc2NyaXB0b3IgdXBkYXRlID0gY3JlYXRlVXBkYXRlRGVzY3JpcHRvcigpOwotCQlib29sZWFuIHNpbmdsZXRvbiA9IGZhbHNlOwotCQlSZXF1aXJlbWVudENoYW5nZSBjaGFuZ2UxID0gbmV3IFJlcXVpcmVtZW50Q2hhbmdlKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjEuMCwgMS4zLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotCQlSZXF1aXJlbWVudENoYW5nZSBjaGFuZ2UyID0gbmV3IFJlcXVpcmVtZW50Q2hhbmdlKG51bGwsIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMS4wLCAxLjMuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCVJlcXVpcmVtZW50Q2hhbmdlIGNoYW5nZTMgPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSksIG51bGwpOwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHNjb3BlID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10geyB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgiZm9vIiwgImJhciIsIG51bGwsIG51bGwsIHRydWUsIHRydWUpLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KCJmb28iLCAiYmFyIiwgbnVsbCwgbnVsbCwgdHJ1ZSwgdHJ1ZSl9LCB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgiem9vIiwgImZhciIsIG51bGwsIG51bGwsIHRydWUsIHRydWUpfX07Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBsaWZlQ3ljbGUgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KCJ6b28iLCAieCIsIG51bGwsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlJSW5zdGFsbGFibGVVbml0UGF0Y2ggaXUgPSBjcmVhdGVJVVBhdGNoKGlkLCB2ZXJzaW9uLCBmaWx0ZXIsIHJlcXVpcmVtZW50cywgYWRkaXRpb25hbFByb3ZpZGVzLCBwcm9wZXJ0eU1hcCwgVE9VQ0hQT0lOVF9PU0dJLCB0cERhdGEsIHNpbmdsZXRvbiwgdXBkYXRlLCBuZXcgUmVxdWlyZW1lbnRDaGFuZ2VbXSB7Y2hhbmdlMSwgY2hhbmdlMiwgY2hhbmdlM30sIHNjb3BlLCBsaWZlQ3ljbGUpOwotCQlyZXR1cm4gaXU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZUlVUGF0Y2goSUluc3RhbGxhYmxlVW5pdFBhdGNoIGl1KSB7Ci0JCXZhbGlkYXRlSVUoaXUpOwotCQlhc3NlcnRUcnVlKGl1LmdldEFwcGxpY2FiaWxpdHlTY29wZSgpICE9IG51bGwpOwotCQlhc3NlcnRUcnVlKGl1LmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCkgIT0gbnVsbCk7Ci0JCWFzc2VydEVxdWFscygzLCBpdS5nZXRSZXF1aXJlbWVudHNDaGFuZ2UoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgaXUuZ2V0UmVxdWlyZW1lbnRzQ2hhbmdlKClbMV0uYXBwbHlPbigpKTsKLQkJYXNzZXJ0Tm90TnVsbChpdS5nZXRSZXF1aXJlbWVudHNDaGFuZ2UoKVsxXS5uZXdWYWx1ZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKG51bGwsIGl1LmdldFJlcXVpcmVtZW50c0NoYW5nZSgpWzJdLm5ld1ZhbHVlKCkpOwotCQlhc3NlcnROb3ROdWxsKGl1LmdldFJlcXVpcmVtZW50c0NoYW5nZSgpWzJdLmFwcGx5T24oKSk7Ci0JCWFzc2VydEVxdWFscygyLCBpdS5nZXRBcHBsaWNhYmlsaXR5U2NvcGUoKS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoMiwgaXUuZ2V0QXBwbGljYWJpbGl0eVNjb3BlKClbMF0ubGVuZ3RoKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGl1LmdldEFwcGxpY2FiaWxpdHlTY29wZSgpWzFdLmxlbmd0aCk7Ci0JCWFzc2VydE5vdE51bGwoaXUuZ2V0TGlmZUN5Y2xlKCkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVJVShJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCWFzc2VydFRydWUoIkluc3RhbGxhYmxlIHVuaXQgaWQgaXMgbm90IGNvcnJlY3QiLCBpZC5lcXVhbHMoaXUuZ2V0SWQoKSkpOwotCQlhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IHZlcnNpb24gaXMgbm90IGNvcnJlY3QiLCB2ZXJzaW9uLmVxdWFscyhpdS5nZXRWZXJzaW9uKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiSW5zdGFsbGFibGUgdW5pdCBmaWx0ZXIgaXMgbm90IGNvcnJlY3QiLCBmaWx0ZXIuZXF1YWxzKGl1LmdldEZpbHRlcigpKSk7Ci0JCS8vIGFzc2VydFRydWUoIkluc3RhbGxhYmxlIHVuaXQgcHJvcGVydGllcyBhcmUgbm90IGNvcnJlY3QiLCBBcnJheXMuZXF1YWxzKHByb3BlcnRpZXMsIGV4dHJhY3RQcm9wZXJ0aWVzKGl1KSkpOwotCQlhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IHByb3BlcnRpZXMgYXJlIG5vdCBjb3JyZWN0IiwgZXF1YWwocHJvcGVydGllcywgZXh0cmFjdFByb3BlcnRpZXMoaXUpKSk7Ci0JCWFzc2VydFRydWUoIkluc3RhbGxhYmxlIHVuaXQgcHJvdmlkZWQgY2FwYWJpbGl0aWVzIGFyZSBub3QgY29ycmVjdCIsIGVxdWFsKGFkZFNlbGZDYXBhYmlsaXR5KGl1LCBwcm92aWRlcyksIGV4dHJhY3RQcm92aWRlcyhpdSkpKTsKLQkJLy8JCWFzc2VydFRydWUoIkluc3RhbGxhYmxlIHVuaXQgcmVxdWlyZWQgY2FwYWJpbGl0aWVzIGFyZSBub3QgY29ycmVjdCIsIGVxdWFsKHJlcXVpcmVzLCBleHRyYWN0UmVxdWlyZXMoaXUpKSk7CSBUaGUgbGlmZWN5Y2xlIGlzIGFkZGVkIGFzIGEgcmVxdWlyZW1lbnQgZm9yIG5vdyB0byBtYWtlIHRoaW5ncyBlYXNpZXIKLQkJYXNzZXJ0VHJ1ZSgiSW5zdGFsbGFibGUgdW5pdCB1cGRhdGUgZGVzY3JpcHRvciBhcmUgbm90IGNvcnJlY3QiLCBpZC5lcXVhbHMoaXUuZ2V0VXBkYXRlRGVzY3JpcHRvcigpLmdldElkKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiSW5zdGFsbGFibGUgdW5pdCB1cGRhdGUgZGVzY3JpcHRvciBhcmUgbm90IGNvcnJlY3QiLCBJVXBkYXRlRGVzY3JpcHRvci5ISUdIID09IGl1LmdldFVwZGF0ZURlc2NyaXB0b3IoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0VHJ1ZSgiSW5zdGFsbGFibGUgdW5pdCB1cGRhdGUgZGVzY3JpcHRvciBhcmUgbm90IGNvcnJlY3QiLCAiZGVzYyIuZXF1YWxzKGl1LmdldFVwZGF0ZURlc2NyaXB0b3IoKS5nZXREZXNjcmlwdGlvbigpKSk7Ci0JCWFzc2VydFRydWUoIkluc3RhbGxhYmxlIHVuaXQgdXBkYXRlIGRlc2NyaXB0b3IgYXJlIG5vdCBjb3JyZWN0IiwgbmV3IFZlcnNpb25SYW5nZShJVV9URVNUX1ZFUlNJT04sIHRydWUsIElVX1RFU1RfVkVSU0lPTiwgdHJ1ZSkuZXF1YWxzKGl1LmdldFVwZGF0ZURlc2NyaXB0b3IoKS5nZXRSYW5nZSgpKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW11bXSBleHRyYWN0UHJvcGVydGllcyhJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCU1hcCBwcm9wcyA9IGl1LmdldFByb3BlcnRpZXMoKTsKLQkJU2V0IGtleXMgPSBwcm9wcy5rZXlTZXQoKTsKLQkJU3RyaW5nW11bXSBwYWlycyA9IG5ldyBTdHJpbmdba2V5cy5zaXplKCldWzJdOwotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBrZXlzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIG5leHRLZXkgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLQkJCVN0cmluZyBuZXh0VmFsdWUgPSAoU3RyaW5nKSBwcm9wcy5nZXQobmV4dEtleSk7Ci0JCQlwYWlyc1tpbmRleF0gPSBuZXcgU3RyaW5nW10ge25leHRLZXksIG5leHRWYWx1ZX07Ci0JCQlpbmRleCsrOwotCQl9Ci0JCXJldHVybiBwYWlyczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXVtdIGFkZFNlbGZDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQgaXUsIFN0cmluZ1tdW10gcHJvdmlkZVR1cGxlcykgewotCQlTdHJpbmdbXVtdIGF1Z21lbnRlZFByb3ZpZGVzID0gbmV3IFN0cmluZ1twcm92aWRlVHVwbGVzLmxlbmd0aCArIDFdWzNdOwotCQlQcm92aWRlZENhcGFiaWxpdHkgc2VsZiA9IGdldFNlbGZDYXBhYmlsaXR5KGl1KTsKLQkJYXVnbWVudGVkUHJvdmlkZXNbMF0gPSBuZXcgU3RyaW5nW10ge3NlbGYuZ2V0TmFtZXNwYWNlKCksIHNlbGYuZ2V0TmFtZSgpLCBzZWxmLmdldFZlcnNpb24oKS50b1N0cmluZygpfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlVHVwbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhdWdtZW50ZWRQcm92aWRlc1tpICsgMV0gPSBwcm92aWRlVHVwbGVzW2ldOwotCQl9Ci0JCXJldHVybiBhdWdtZW50ZWRQcm92aWRlczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXVtdIGV4dHJhY3RQcm92aWRlcyhJSW5zdGFsbGFibGVVbml0IGl1KSB7Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3Z5ZGVzID0gaXUuZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKTsKLQkJU3RyaW5nW11bXSB0dXBsZXMgPSBuZXcgU3RyaW5nW3Byb3Z5ZGVzLmxlbmd0aF1bM107Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvdnlkZXMubGVuZ3RoOyBpKyspIHsKLQkJCVByb3ZpZGVkQ2FwYWJpbGl0eSBuZXh0ID0gcHJvdnlkZXNbaV07Ci0JCQl0dXBsZXNbaV0gPSBuZXcgU3RyaW5nW10ge25leHQuZ2V0TmFtZXNwYWNlKCksIG5leHQuZ2V0TmFtZSgpLCBuZXh0LmdldFZlcnNpb24oKS50b1N0cmluZygpfTsKLQkJfQotCQlyZXR1cm4gdHVwbGVzOwotCX0KLQotCS8vCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdW10gZXh0cmFjdFJlcXVpcmVzKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkvLwkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdXlyZXMgPSBpdS5nZXRSZXF1aXJlZENhcGFiaWxpdGllcygpOwotCS8vCQlTdHJpbmdbXVtdIHR1cGxlcyA9IG5ldyBTdHJpbmdbcmVxdXlyZXMubGVuZ3RoXVs0XTsKLQkvLwkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1eXJlcy5sZW5ndGg7IGkrKykgewotCS8vCQkJUmVxdWlyZWRDYXBhYmlsaXR5IG5leHQgPSByZXF1eXJlc1tpXTsKLQkvLwkJCXR1cGxlc1tpXSA9IG5ldyBTdHJpbmdbXSB7bmV4dC5nZXROYW1lc3BhY2UoKSwgbmV4dC5nZXROYW1lKCksIG5leHQuZ2V0UmFuZ2UoKS50b1N0cmluZygpLCBCb29sZWFuLnZhbHVlT2YobmV4dC5pc09wdGlvbmFsKCkpLnRvU3RyaW5nKCl9OwotCS8vCQl9Ci0JLy8JCXJldHVybiB0dXBsZXM7Ci0JLy8JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvSVVQZXJzaXN0ZW5jZVRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9JVVBlcnNpc3RlbmNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTg1MmU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9JVVBlcnNpc3RlbmNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm1ldGFkYXRhOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuT3JkZXJlZFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5JbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LmlvLk1ldGFkYXRhUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5pby5NZXRhZGF0YVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguKjsKLQotcHVibGljIGNsYXNzIElVUGVyc2lzdGVuY2VUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQotCS8vIFJhbmRvbWx5IGNob3NlIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMgYXMgdGhlIElVIGZvciB0ZXN0aW5nIHBlcnNpc3RlbmNlCi0JLy8gYnV0ICdlbmhhbmNlZCcgaXQgZm9yIGJldHRlciBjb3ZlcmFnZS4KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUGFja2FnZXNOUyA9ICJvc2dpLnBhY2thZ2VzIjsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBpZCA9ICJvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzIjsKLQlwcml2YXRlIHN0YXRpYyBWZXJzaW9uIHZlcnNpb24gPSBuZXcgVmVyc2lvbigiMy4xLjIwMC52MjAwNzA2MDUiKTsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmlsdGVyID0gIigmIChvc2dpLndzPXdpbjMyKSAob3NnaS5vcz13aW4zMikgKG9zZ2kuYXJjaD14ODYpKSI7IC8vIG5vdCByZWFsbHkKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdW10gcHJvcGVydGllcyA9IG5ldyBTdHJpbmdbXVtdIHtuZXcgU3RyaW5nW10geyJlcXVpbm94LnAyLm5hbWUiLCAiT1NHaSBSZWxlYXNlIDQuMC4xIFNlcnZpY2VzIn0sIC8vCi0JCQluZXcgU3RyaW5nW10geyJlcXVpbm94LnAyLmRlc2NyaXB0aW9uIiwgIk9TR2kgU2VydmljZSBQbGF0Zm9ybSBSZWxlYXNlIDQuMC4xIFNlcnZpY2UgSW50ZXJmYWNlcyBhbmQgQ2xhc3NlcyJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHsiZXF1aW5veC5wMi5wcm92aWRlciIsICJFY2xpcHNlLm9yZyJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHsiZXF1aW5veC5wMi5jb250YWN0IiwgInd3dy5lY2xpcHNlLm9yZyJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHsiZXF1aW5veC5wMi5jb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChjKSAyMDAzLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBIGxvbmctd2luZGVkIGNvcHlyaWdodCBub3RpY2UuIn19OwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW11bXSBwcm92aWRlcyA9IG5ldyBTdHJpbmdbXVtdIHtuZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJvcmcub3NnaS5zZXJ2aWNlLmNtIiwgIjEuMi4wIn0sIC8vCi0JCQluZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJvcmcub3NnaS5zZXJ2aWNlLmNvbXBvbmVudCIsICIxLjAuMCJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAib3JnLm9zZ2kuc2VydmljZS5kZXZpY2UiLCAiMS4xLjAifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgIm9yZy5vc2dpLnNlcnZpY2UuZXZlbnQiLCAiMS4xLjAifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgIm9yZy5vc2dpLnNlcnZpY2UuaHR0cCIsICIxLjIuMCJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAib3JnLm9zZ2kuc2VydmljZS5pbyIsICIxLjAuMCJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAib3JnLm9zZ2kuc2VydmljZS5sb2ciLCAiMS4zLjAifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgIm9yZy5vc2dpLnNlcnZpY2UubWV0YXR5cGUiLCAiMS4xLjAifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgIm9yZy5vc2dpLnNlcnZpY2UucHJvdmlzaW9uaW5nIiwgIjEuMS4wIn0sIC8vCi0JCQluZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJvcmcub3NnaS5zZXJ2aWNlLnVwbnAiLCAiMS4xLjAifSwgLy8KLQkJCW5ldyBTdHJpbmdbXSB7UGFja2FnZXNOUywgIm9yZy5vc2dpLnNlcnZpY2UudXNlcmFkbWluIiwgIjEuMS4wIn0sIC8vCi0JCQluZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJvcmcub3NnaS5zZXJ2aWNlLndpcmVhZG1pbiIsICIxLjAuMCJ9fTsgLy8KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdW10gcmVxdWlyZXMgPSBuZXcgU3RyaW5nW11bXSB7bmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAiamF2YXguc2VydmxldCIsICIwLjAuMCIsICJ0cnVlIn0sIC8vCi0JCQluZXcgU3RyaW5nW10ge1BhY2thZ2VzTlMsICJqYXZheC5zZXJ2bGV0Lmh0dHAiLCAiMC4wLjAiLCAidHJ1ZSJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHtQYWNrYWdlc05TLCAib3JnLm9zZ2kuZnJhbWV3b3JrIiwgIjEuMi4wIiwgImZhbHNlIn19OyAvLwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW11bXSBpbnN0cnVjdGlvbnMgPSBuZXcgU3RyaW5nW11bXSB7bmV3IFN0cmluZ1tdIHsibWFuaWZlc3QiLCAiTWFuaWZlc3QtVmVyc2lvbjogMS4wXFxCdW5kbGUtVmVuZG9yOiBFY2xpcHNlLm9yZ1xcQnVuZGxlLUNvbnRhY3RBZGRyZXNzOiB3d3cuZWNsaXBzZS5vcmdcXC4uLmEgd2hvbGUgYnVuY2ggb2Ygb3RoZXIgbWFuaWZlc3QgY29udGVudC4uLiJ9LCBuZXcgU3RyaW5nW10geyJ6aXBwZWQiLCAidHJ1ZSJ9LCAvLwotCQkJbmV3IFN0cmluZ1tdIHsiY29uZmlndXJlIiwgImFkZFByb2dyYW1BcmcocHJvZ3JhbUFyZzotc3RhcnR1cCk7YWRkUHJvZ3JhbUFyZyhwcm9ncmFtQXJnOkBhcnRpZmFjdCk7In19OyAvLwotCi0JcHVibGljIHN0YXRpYyBJSW5zdGFsbGFibGVVbml0IGNyZWF0ZVBlcnNpc3RlbmNlVGVzdElVKCkgewotCQlNYXAgcHJvcGVydHlNYXAgPSBjcmVhdGVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwotCQlQcm92aWRlZENhcGFiaWxpdHlbXSBhZGRpdGlvbmFsUHJvdmlkZXMgPSBjcmVhdGVQcm92aWRlZChwcm92aWRlcyk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcXVpcmVtZW50cyA9IGNyZWF0ZVJlcXVpcmVkKHJlcXVpcmVzKTsKLQkJVG91Y2hwb2ludERhdGEgdHBEYXRhID0gY3JlYXRlVG91Y2hwb2ludERhdGEoaW5zdHJ1Y3Rpb25zKTsKLQkJSVVwZGF0ZURlc2NyaXB0b3IgdXBkYXRlID0gY3JlYXRlVXBkYXRlRGVzY3JpcHRvcigpOwotCQlib29sZWFuIHNpbmdsZXRvbiA9IGZhbHNlOwotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gY3JlYXRlSVUoaWQsIHZlcnNpb24sIGZpbHRlciwgcmVxdWlyZW1lbnRzLCBhZGRpdGlvbmFsUHJvdmlkZXMsIHByb3BlcnR5TWFwLCBUT1VDSFBPSU5UX09TR0ksIHRwRGF0YSwgc2luZ2xldG9uLCB1cGRhdGUpOwotCQlyZXR1cm4gaXU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSVVwZGF0ZURlc2NyaXB0b3IgY3JlYXRlVXBkYXRlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVVcGRhdGVEZXNjcmlwdG9yKGlkLCBuZXcgVmVyc2lvblJhbmdlKElVX1RFU1RfVkVSU0lPTiwgdHJ1ZSwgSVVfVEVTVF9WRVJTSU9OLCB0cnVlKSwgSVVwZGF0ZURlc2NyaXB0b3IuSElHSCwgImRlc2MiKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgY3JlYXRlUHJvcGVydGllcyhTdHJpbmdbXVtdIGtleVZhbHVlUGFpcnMpIHsKLQkJT3JkZXJlZFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgT3JkZXJlZFByb3BlcnRpZXMoa2V5VmFsdWVQYWlycy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleVZhbHVlUGFpcnMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZ1tdIG5leHRQYWlyID0ga2V5VmFsdWVQYWlyc1tpXTsKLQkJCXByb3BzLnB1dChuZXh0UGFpclswXSwgbmV4dFBhaXJbMV0pOwotCQl9Ci0JCXJldHVybiBwcm9wczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm92aWRlZENhcGFiaWxpdHlbXSBjcmVhdGVQcm92aWRlZChTdHJpbmdbXVtdIHByb3ZpZGVUdXBsZXMpIHsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdmlkZWQgPSBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W3Byb3ZpZGVUdXBsZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlVHVwbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmdbXSBuZXh0VHVwbGUgPSBwcm92aWRlVHVwbGVzW2ldOwotCQkJcHJvdmlkZWRbaV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KG5leHRUdXBsZVswXSwgbmV4dFR1cGxlWzFdLCBuZXcgVmVyc2lvbihuZXh0VHVwbGVbMl0pKTsKLQkJfQotCQkvLyBwcm92aWRlZFtwcm92aWRlVHVwbGVzLmxlbmd0aF0gPSBCVU5ETEVfQ0FQQUJJTElUWTsKLQkJcmV0dXJuIHByb3ZpZGVkOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFJlcXVpcmVkQ2FwYWJpbGl0eVtdIGNyZWF0ZVJlcXVpcmVkKFN0cmluZ1tdW10gcmVxdWlyZVR1cGxlcykgewotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlZCA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbcmVxdWlyZVR1cGxlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXVpcmVUdXBsZXMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZ1tdIG5leHRUdXBsZSA9IHJlcXVpcmVUdXBsZXNbaV07Ci0JCQlyZXF1aXJlZFtpXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkobmV4dFR1cGxlWzBdLCBuZXh0VHVwbGVbMV0sIG5ldyBWZXJzaW9uUmFuZ2UobmV4dFR1cGxlWzJdKSwgbnVsbCwgQm9vbGVhbi52YWx1ZU9mKG5leHRUdXBsZVszXSkuYm9vbGVhblZhbHVlKCksIGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gcmVxdWlyZWQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgVG91Y2hwb2ludERhdGEgY3JlYXRlVG91Y2hwb2ludERhdGEoU3RyaW5nW11bXSBpbnN0cnVjdGlvbkRhdGEpIHsKLQkJTWFwIG1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwKGluc3RydWN0aW9uRGF0YS5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluc3RydWN0aW9uRGF0YS5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gbmV4dEluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb25EYXRhW2ldOwotCQkJbWFwLnB1dChuZXh0SW5zdHJ1Y3Rpb25bMF0sIG5leHRJbnN0cnVjdGlvblsxXSk7Ci0JCX0KLQkJcmV0dXJuIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVUb3VjaHBvaW50RGF0YShtYXApOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBJVV9URVNUX1RBUkdFVCA9ICJpbnN0YWxsYWJsZVVuaXRUZXN0IjsKLQlwcml2YXRlIHN0YXRpYyBWZXJzaW9uIElVX1RFU1RfVkVSU0lPTiA9IG5ldyBWZXJzaW9uKCIwLjAuMSIpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIElVX1RFU1RfRUxFTUVOVCA9ICJ0ZXN0IjsKLQotCWNsYXNzIElVU3RyaW5nV3JpdGVyIGV4dGVuZHMgTWV0YWRhdGFXcml0ZXIgewotCi0JCXB1YmxpYyBJVVN0cmluZ1dyaXRlcihCeXRlQXJyYXlPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJc3VwZXIoc3RyZWFtLCBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uW10ge1Byb2Nlc3NpbmdJbnN0cnVjdGlvbi5tYWtlQ2xhc3NWZXJzaW9uSW5zdHJ1Y3Rpb24oSVVfVEVTVF9UQVJHRVQsIEluc3RhbGxhYmxlVW5pdC5jbGFzcywgSVVfVEVTVF9WRVJTSU9OKX0pOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd3JpdGVUZXN0KElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJCXN0YXJ0KElVX1RFU1RfRUxFTUVOVCk7Ci0JCQl3cml0ZUluc3RhbGxhYmxlVW5pdChpdSk7Ci0JCQllbmQoSVVfVEVTVF9FTEVNRU5UKTsKLQkJCWZsdXNoKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBJVVN0cmluZ1BhcnNlciBleHRlbmRzIE1ldGFkYXRhUGFyc2VyIHsKLQotCQlwdWJsaWMgSVVTdHJpbmdQYXJzZXIoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgYnVuZGxlSWQpIHsKLQkJCXN1cGVyKGNvbnRleHQsIGJ1bmRsZUlkKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBwcm9maWxlU3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJdGhpcy5zdGF0dXMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlnZXRQYXJzZXIoKTsKLQkJCQlUZXN0SGFuZGxlciB0ZXN0SGFuZGxlciA9IG5ldyBUZXN0SGFuZGxlcigpOwotCQkJCXhtbFJlYWRlci5zZXRDb250ZW50SGFuZGxlcihuZXcgSVVEb2NIYW5kbGVyKElVX1RFU1RfRUxFTUVOVCwgdGVzdEhhbmRsZXIpKTsKLQkJCQl4bWxSZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBTdHJpbmdSZWFkZXIocHJvZmlsZVN0cmluZykpKTsKLQkJCQlpZiAoaXNWYWxpZFhNTCgpKSB7Ci0JCQkJCXRoZUlVID0gdGVzdEhhbmRsZXIuZ2V0SVUoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlmYWlsKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgdGhlSVUgPSBudWxsOwotCi0JCXByaXZhdGUgZmluYWwgY2xhc3MgSVVEb2NIYW5kbGVyIGV4dGVuZHMgRG9jSGFuZGxlciB7Ci0KLQkJCXB1YmxpYyBJVURvY0hhbmRsZXIoU3RyaW5nIHJvb3ROYW1lLCBSb290SGFuZGxlciByb290SGFuZGxlcikgewotCQkJCXN1cGVyKHJvb3ROYW1lLCByb290SGFuZGxlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJaWYgKElVX1RFU1RfVEFSR0VULmVxdWFscyh0YXJnZXQpKSB7Ci0JCQkJCVN0cmluZyBjbGF6eiA9IGV4dHJhY3RQSUNsYXNzKGRhdGEpOwotCQkJCQl0cnkgewotCQkJCQkJaWYgKCFDbGFzcy5mb3JOYW1lKGNsYXp6KS5lcXVhbHMoSW5zdGFsbGFibGVVbml0LmNsYXNzKSkgewotCQkJCQkJCXRocm93IG5ldyBTQVhFeGNlcHRpb24oIldyb25nIGNsYXNzICciICsgY2xhenogKyAiJyBpbiBwcm9jZXNzaW5nIGluc3RydWN0aW9uIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCQkJdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiSW5zdGFsbGFibGVVbml0IGNsYXNzICciICsgY2xhenogKyAiJyBub3QgZm91bmQiKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCi0JCQkJCVZlcnNpb24gaXVUZXN0VmVyc2lvbiA9IGV4dHJhY3RQSVZlcnNpb24odGFyZ2V0LCBkYXRhKTsKLQkJCQkJaWYgKCFJVV9URVNUX1ZFUlNJT04uZXF1YWxzKGl1VGVzdFZlcnNpb24pKSB7Ci0JCQkJCQl0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJCYWQgaXUgdGVzdCB2ZXJzaW9uLiIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBmaW5hbCBjbGFzcyBUZXN0SGFuZGxlciBleHRlbmRzIFJvb3RIYW5kbGVyIHsKLQotCQkJcHJpdmF0ZSBJbnN0YWxsYWJsZVVuaXRIYW5kbGVyIGl1SGFuZGxlciA9IG51bGw7Ci0KLQkJCXByaXZhdGUgSW5zdGFsbGFibGVVbml0IGl1ID0gbnVsbDsKLQkJCXByaXZhdGUgTGlzdCBzaW5nbGV0b24gPSBuZXcgQXJyYXlMaXN0KDEpOwotCi0JCQlwdWJsaWMgVGVzdEhhbmRsZXIoKSB7Ci0JCQkJc3VwZXIoKTsKLQkJCX0KLQotCQkJcHVibGljIEluc3RhbGxhYmxlVW5pdCBnZXRJVSgpIHsKLQkJCQlyZXR1cm4gaXU7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIGhhbmRsZVJvb3RBdHRyaWJ1dGVzKEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotCQkJCXBhcnNlQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBub0F0dHJpYnV0ZXMsIG5vQXR0cmlidXRlcyk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0JCQkJaWYgKElOU1RBTExBQkxFX1VOSVRfRUxFTUVOVC5lcXVhbHMobmFtZSkpIHsKLQkJCQkJaWYgKGl1SGFuZGxlciA9PSBudWxsKSB7Ci0JCQkJCQlpdUhhbmRsZXIgPSBuZXcgSW5zdGFsbGFibGVVbml0SGFuZGxlcih0aGlzLCBhdHRyaWJ1dGVzLCBzaW5nbGV0b24pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZHVwbGljYXRlRWxlbWVudCh0aGlzLCBuYW1lLCBhdHRyaWJ1dGVzKTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCWludmFsaWRFbGVtZW50KG5hbWUsIGF0dHJpYnV0ZXMpOwotCQkJCX0KLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgZmluaXNoZWQoKSB7Ci0JCQkJaWYgKGlzVmFsaWRYTUwoKSkgewotCQkJCQlpZiAoaXVIYW5kbGVyICE9IG51bGwgJiYgc2luZ2xldG9uLnNpemUoKSA9PSAxKSB7Ci0JCQkJCQlpdSA9IChJbnN0YWxsYWJsZVVuaXQpIGl1SGFuZGxlci5nZXRJbnN0YWxsYWJsZVVuaXQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQkJcmV0dXJuICJFcnJvciBwYXJzaW5nIGluc3RhbGxhYmxlIHVuaXQgc3RyaW5nIjsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0Um9vdE9iamVjdCgpIHsKLQkJCXJldHVybiB0aGVJVTsKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdElVUGVyc2lzdGVuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJSW5zdGFsbGFibGVVbml0IGl1MCA9IGNyZWF0ZVBlcnNpc3RlbmNlVGVzdElVKCk7Ci0JCXZhbGlkYXRlSVUoaXUwKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dDAgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDMwNzIpOwotCQlJVVN0cmluZ1dyaXRlciB3cml0ZXIwID0gbmV3IElVU3RyaW5nV3JpdGVyKG91dHB1dDApOwotCQl3cml0ZXIwLndyaXRlVGVzdChpdTApOwotCQlTdHJpbmcgaXVUZXh0MCA9IG91dHB1dDAudG9TdHJpbmcoKTsKLQkJb3V0cHV0MC5jbG9zZSgpOwotCi0JCUlVU3RyaW5nUGFyc2VyIHBhcnNlciA9IG5ldyBJVVN0cmluZ1BhcnNlcihUZXN0QWN0aXZhdG9yLmNvbnRleHQsIFRlc3RBY3RpdmF0b3IuUElfUFJPVl9URVNUUyk7Ci0JCXBhcnNlci5wYXJzZShpdVRleHQwKTsKLQkJYXNzZXJ0VHJ1ZSgiRXJyb3IgcGFyc2luZyB0ZXN0IGl1OiAiICsgcGFyc2VyLmdldFN0YXR1cygpLmdldE1lc3NhZ2UoKSwgcGFyc2VyLmdldFN0YXR1cygpLmlzT0soKSk7Ci0JCUluc3RhbGxhYmxlVW5pdCBpdTEgPSAoSW5zdGFsbGFibGVVbml0KSBwYXJzZXIuZ2V0Um9vdE9iamVjdCgpOwotCQl2YWxpZGF0ZUlVKGl1MSk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQxID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgxNDkyKTsKLQkJSVVTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IElVU3RyaW5nV3JpdGVyKG91dHB1dDEpOwotCQl3cml0ZXIud3JpdGVUZXN0KGl1MSk7Ci0JCVN0cmluZyBpdVRleHQxID0gb3V0cHV0MS50b1N0cmluZygpOwotCQlvdXRwdXQxLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoIkluc3RhbGxhYmxlIHVuaXQgd3JpdGUgYWZ0ZXIgcmVhZCBhZnRlciB3cml0ZSBwcm9kdWNlZCBkaWZmZXJlbnQgWE1MIiwgaXVUZXh0MS5lcXVhbHMoaXVUZXh0MCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJVVBhdGNoUGVyc2lzdGVuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlJSW5zdGFsbGFibGVVbml0IGl1MCA9IGNyZWF0ZVBhdGNoSVUoKTsKLQkJdmFsaWRhdGVJVShpdTApOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0MCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMzA3Mik7Ci0JCUlVU3RyaW5nV3JpdGVyIHdyaXRlcjAgPSBuZXcgSVVTdHJpbmdXcml0ZXIob3V0cHV0MCk7Ci0JCXdyaXRlcjAud3JpdGVUZXN0KGl1MCk7Ci0JCVN0cmluZyBpdVRleHQwID0gb3V0cHV0MC50b1N0cmluZygpOwotCQlvdXRwdXQwLmNsb3NlKCk7Ci0KLQkJSVVTdHJpbmdQYXJzZXIgcGFyc2VyID0gbmV3IElVU3RyaW5nUGFyc2VyKFRlc3RBY3RpdmF0b3IuY29udGV4dCwgVGVzdEFjdGl2YXRvci5QSV9QUk9WX1RFU1RTKTsKLQkJcGFyc2VyLnBhcnNlKGl1VGV4dDApOwotCQlhc3NlcnRUcnVlKCJFcnJvciBwYXJzaW5nIHRlc3QgaXU6ICIgKyBwYXJzZXIuZ2V0U3RhdHVzKCkuZ2V0TWVzc2FnZSgpLCBwYXJzZXIuZ2V0U3RhdHVzKCkuaXNPSygpKTsKLQkJSW5zdGFsbGFibGVVbml0UGF0Y2ggaXUxID0gKEluc3RhbGxhYmxlVW5pdFBhdGNoKSBwYXJzZXIuZ2V0Um9vdE9iamVjdCgpOwotCQl2YWxpZGF0ZUlVKGl1MSk7Ci0JCXZhbGlkYXRlSVVQYXRjaChpdTEpOwotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0MSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTQ5Mik7Ci0JCUlVU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBJVVN0cmluZ1dyaXRlcihvdXRwdXQxKTsKLQkJd3JpdGVyLndyaXRlVGVzdChpdTEpOwotCQlTdHJpbmcgaXVUZXh0MSA9IG91dHB1dDEudG9TdHJpbmcoKTsKLQkJb3V0cHV0MS5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IHdyaXRlIGFmdGVyIHJlYWQgYWZ0ZXIgd3JpdGUgcHJvZHVjZWQgZGlmZmVyZW50IFhNTCIsIGl1VGV4dDEuZXF1YWxzKGl1VGV4dDApKTsKLQotCX0KLQotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdFBhdGNoIGNyZWF0ZVBhdGNoSVUoKSB7Ci0JCU1hcCBwcm9wZXJ0eU1hcCA9IGNyZWF0ZVByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIGFkZGl0aW9uYWxQcm92aWRlcyA9IGNyZWF0ZVByb3ZpZGVkKHByb3ZpZGVzKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxdWlyZW1lbnRzID0gY3JlYXRlUmVxdWlyZWQocmVxdWlyZXMpOwotCQlUb3VjaHBvaW50RGF0YSB0cERhdGEgPSBjcmVhdGVUb3VjaHBvaW50RGF0YShpbnN0cnVjdGlvbnMpOwotCQlJVXBkYXRlRGVzY3JpcHRvciB1cGRhdGUgPSBjcmVhdGVVcGRhdGVEZXNjcmlwdG9yKCk7Ci0JCWJvb2xlYW4gc2luZ2xldG9uID0gZmFsc2U7Ci0JCVJlcXVpcmVtZW50Q2hhbmdlIGNoYW5nZTEgPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMS4wLCAxLjMuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCVJlcXVpcmVtZW50Q2hhbmdlIGNoYW5nZTIgPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UobnVsbCwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4xLjAsIDEuMy4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLQkJUmVxdWlyZW1lbnRDaGFuZ2UgY2hhbmdlMyA9IG5ldyBSZXF1aXJlbWVudENoYW5nZShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwgbnVsbCk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdW10gc2NvcGUgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W11bXSB7IHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KCJmb28iLCAiYmFyIiwgbnVsbCwgbnVsbCwgdHJ1ZSwgdHJ1ZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoImZvbyIsICJiYXIiLCBudWxsLCBudWxsLCB0cnVlLCB0cnVlKX0sIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KCJ6b28iLCAiZmFyIiwgbnVsbCwgbnVsbCwgdHJ1ZSwgdHJ1ZSl9fTsKLQkJSUluc3RhbGxhYmxlVW5pdFBhdGNoIGl1ID0gY3JlYXRlSVVQYXRjaChpZCwgdmVyc2lvbiwgZmlsdGVyLCByZXF1aXJlbWVudHMsIGFkZGl0aW9uYWxQcm92aWRlcywgcHJvcGVydHlNYXAsIFRPVUNIUE9JTlRfT1NHSSwgdHBEYXRhLCBzaW5nbGV0b24sIHVwZGF0ZSwgbmV3IFJlcXVpcmVtZW50Q2hhbmdlW10ge2NoYW5nZTEsIGNoYW5nZTIsIGNoYW5nZTN9LCBzY29wZSwgbnVsbCk7Ci0JCXJldHVybiBpdTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlSVVQYXRjaChJSW5zdGFsbGFibGVVbml0UGF0Y2ggaXUpIHsKLQkJdmFsaWRhdGVJVShpdSk7Ci0JCWFzc2VydFRydWUoaXUuZ2V0QXBwbGljYWJpbGl0eVNjb3BlKCkgIT0gbnVsbCk7Ci0JCWFzc2VydFRydWUoaXUuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSAhPSBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDMsIGl1LmdldFJlcXVpcmVtZW50c0NoYW5nZSgpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscyhudWxsLCBpdS5nZXRSZXF1aXJlbWVudHNDaGFuZ2UoKVsxXS5hcHBseU9uKCkpOwotCQlhc3NlcnROb3ROdWxsKGl1LmdldFJlcXVpcmVtZW50c0NoYW5nZSgpWzFdLm5ld1ZhbHVlKCkpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgaXUuZ2V0UmVxdWlyZW1lbnRzQ2hhbmdlKClbMl0ubmV3VmFsdWUoKSk7Ci0JCWFzc2VydE5vdE51bGwoaXUuZ2V0UmVxdWlyZW1lbnRzQ2hhbmdlKClbMl0uYXBwbHlPbigpKTsKLQkJYXNzZXJ0RXF1YWxzKDIsIGl1LmdldEFwcGxpY2FiaWxpdHlTY29wZSgpLmxlbmd0aCk7Ci0JCWFzc2VydEVxdWFscygyLCBpdS5nZXRBcHBsaWNhYmlsaXR5U2NvcGUoKVswXS5sZW5ndGgpOwotCQlhc3NlcnRFcXVhbHMoMSwgaXUuZ2V0QXBwbGljYWJpbGl0eVNjb3BlKClbMV0ubGVuZ3RoKTsKLQkJYXNzZXJ0TnVsbChpdS5nZXRMaWZlQ3ljbGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB2YWxpZGF0ZUlVKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJYXNzZXJ0VHJ1ZSgiSW5zdGFsbGFibGUgdW5pdCBpZCBpcyBub3QgY29ycmVjdCIsIGlkLmVxdWFscyhpdS5nZXRJZCgpKSk7Ci0JCWFzc2VydFRydWUoIkluc3RhbGxhYmxlIHVuaXQgdmVyc2lvbiBpcyBub3QgY29ycmVjdCIsIHZlcnNpb24uZXF1YWxzKGl1LmdldFZlcnNpb24oKSkpOwotCQlhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IGZpbHRlciBpcyBub3QgY29ycmVjdCIsIGZpbHRlci5lcXVhbHMoaXUuZ2V0RmlsdGVyKCkpKTsKLQkJLy8gYXNzZXJ0VHJ1ZSgiSW5zdGFsbGFibGUgdW5pdCBwcm9wZXJ0aWVzIGFyZSBub3QgY29ycmVjdCIsIEFycmF5cy5lcXVhbHMocHJvcGVydGllcywgZXh0cmFjdFByb3BlcnRpZXMoaXUpKSk7Ci0JCWFzc2VydFRydWUoIkluc3RhbGxhYmxlIHVuaXQgcHJvcGVydGllcyBhcmUgbm90IGNvcnJlY3QiLCBlcXVhbChwcm9wZXJ0aWVzLCBleHRyYWN0UHJvcGVydGllcyhpdSkpKTsKLQkJYXNzZXJ0VHJ1ZSgiSW5zdGFsbGFibGUgdW5pdCBwcm92aWRlZCBjYXBhYmlsaXRpZXMgYXJlIG5vdCBjb3JyZWN0IiwgZXF1YWwoYWRkU2VsZkNhcGFiaWxpdHkoaXUsIHByb3ZpZGVzKSwgZXh0cmFjdFByb3ZpZGVzKGl1KSkpOwotCQlhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IHJlcXVpcmVkIGNhcGFiaWxpdGllcyBhcmUgbm90IGNvcnJlY3QiLCBlcXVhbChyZXF1aXJlcywgZXh0cmFjdFJlcXVpcmVzKGl1KSkpOwotCQlhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IHVwZGF0ZSBkZXNjcmlwdG9yIGFyZSBub3QgY29ycmVjdCIsIGlkLmVxdWFscyhpdS5nZXRVcGRhdGVEZXNjcmlwdG9yKCkuZ2V0SWQoKSkpOwotCQlhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IHVwZGF0ZSBkZXNjcmlwdG9yIGFyZSBub3QgY29ycmVjdCIsIElVcGRhdGVEZXNjcmlwdG9yLkhJR0ggPT0gaXUuZ2V0VXBkYXRlRGVzY3JpcHRvcigpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRUcnVlKCJJbnN0YWxsYWJsZSB1bml0IHVwZGF0ZSBkZXNjcmlwdG9yIGFyZSBub3QgY29ycmVjdCIsICJkZXNjIi5lcXVhbHMoaXUuZ2V0VXBkYXRlRGVzY3JpcHRvcigpLmdldERlc2NyaXB0aW9uKCkpKTsKLQkJYXNzZXJ0VHJ1ZSgiSW5zdGFsbGFibGUgdW5pdCB1cGRhdGUgZGVzY3JpcHRvciBhcmUgbm90IGNvcnJlY3QiLCBuZXcgVmVyc2lvblJhbmdlKElVX1RFU1RfVkVSU0lPTiwgdHJ1ZSwgSVVfVEVTVF9WRVJTSU9OLCB0cnVlKS5lcXVhbHMoaXUuZ2V0VXBkYXRlRGVzY3JpcHRvcigpLmdldFJhbmdlKCkpKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXVtdIGV4dHJhY3RQcm9wZXJ0aWVzKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJTWFwIHByb3BzID0gaXUuZ2V0UHJvcGVydGllcygpOwotCQlTZXQga2V5cyA9IHByb3BzLmtleVNldCgpOwotCQlTdHJpbmdbXVtdIHBhaXJzID0gbmV3IFN0cmluZ1trZXlzLnNpemUoKV1bMl07Ci0JCWludCBpbmRleCA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcgbmV4dEtleSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIG5leHRWYWx1ZSA9IChTdHJpbmcpIHByb3BzLmdldChuZXh0S2V5KTsKLQkJCXBhaXJzW2luZGV4XSA9IG5ldyBTdHJpbmdbXSB7bmV4dEtleSwgbmV4dFZhbHVlfTsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJcmV0dXJuIHBhaXJzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdW10gYWRkU2VsZkNhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdCBpdSwgU3RyaW5nW11bXSBwcm92aWRlVHVwbGVzKSB7Ci0JCVN0cmluZ1tdW10gYXVnbWVudGVkUHJvdmlkZXMgPSBuZXcgU3RyaW5nW3Byb3ZpZGVUdXBsZXMubGVuZ3RoICsgMV1bM107Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eSBzZWxmID0gZ2V0U2VsZkNhcGFiaWxpdHkoaXUpOwotCQlhdWdtZW50ZWRQcm92aWRlc1swXSA9IG5ldyBTdHJpbmdbXSB7c2VsZi5nZXROYW1lc3BhY2UoKSwgc2VsZi5nZXROYW1lKCksIHNlbGYuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCl9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3ZpZGVUdXBsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWF1Z21lbnRlZFByb3ZpZGVzW2kgKyAxXSA9IHByb3ZpZGVUdXBsZXNbaV07Ci0JCX0KLQkJcmV0dXJuIGF1Z21lbnRlZFByb3ZpZGVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdW10gZXh0cmFjdFByb3ZpZGVzKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gcHJvdnlkZXMgPSBpdS5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpOwotCQlTdHJpbmdbXVtdIHR1cGxlcyA9IG5ldyBTdHJpbmdbcHJvdnlkZXMubGVuZ3RoXVszXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92eWRlcy5sZW5ndGg7IGkrKykgewotCQkJUHJvdmlkZWRDYXBhYmlsaXR5IG5leHQgPSBwcm92eWRlc1tpXTsKLQkJCXR1cGxlc1tpXSA9IG5ldyBTdHJpbmdbXSB7bmV4dC5nZXROYW1lc3BhY2UoKSwgbmV4dC5nZXROYW1lKCksIG5leHQuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCl9OwotCQl9Ci0JCXJldHVybiB0dXBsZXM7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW11bXSBleHRyYWN0UmVxdWlyZXMoSUluc3RhbGxhYmxlVW5pdCBpdSkgewotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1eXJlcyA9IGl1LmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCk7Ci0JCVN0cmluZ1tdW10gdHVwbGVzID0gbmV3IFN0cmluZ1tyZXF1eXJlcy5sZW5ndGhdWzRdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcXV5cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlSZXF1aXJlZENhcGFiaWxpdHkgbmV4dCA9IHJlcXV5cmVzW2ldOwotCQkJdHVwbGVzW2ldID0gbmV3IFN0cmluZ1tdIHtuZXh0LmdldE5hbWVzcGFjZSgpLCBuZXh0LmdldE5hbWUoKSwgbmV4dC5nZXRSYW5nZSgpLnRvU3RyaW5nKCksIEJvb2xlYW4udmFsdWVPZihuZXh0LmlzT3B0aW9uYWwoKSkudG9TdHJpbmcoKX07Ci0JCX0KLQkJcmV0dXJuIHR1cGxlczsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9MaWNlbnNlVGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL0xpY2Vuc2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMWMyMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL0xpY2Vuc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMubWV0YWRhdGE7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5MaWNlbnNlOwotCi0vKioKLSAqIFRlc3RzIGZvciBMaWNlbnNlIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBMaWNlbnNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQlwdWJsaWMgdm9pZCB0ZXN0Tm9ybWFsaXplKCkgewotCQlMaWNlbnNlIGxpY2Vuc2VPbmUgPSBuZXcgTGljZW5zZShudWxsLCAiYSAgIGIiKTsKLQkJTGljZW5zZSBsaWNlbnNlVHdvID0gbmV3IExpY2Vuc2UobnVsbCwgImFcdFxuXHIgIFx0XG5cciAgYiIpOwotCQlhc3NlcnRFcXVhbHMoIjEuMCIsIGxpY2Vuc2VPbmUuZ2V0RGlnZXN0KCksIGxpY2Vuc2VUd28uZ2V0RGlnZXN0KCkpOwotCi0JCWxpY2Vuc2VPbmUgPSBuZXcgTGljZW5zZShudWxsLCAiICAgYSBiICBjICAiKTsKLQkJbGljZW5zZVR3byA9IG5ldyBMaWNlbnNlKG51bGwsICJhXHRcbmJcciAgXHRcblxyICBjIik7Ci0JCWFzc2VydEVxdWFscygiMS4xIiwgbGljZW5zZU9uZS5nZXREaWdlc3QoKSwgbGljZW5zZVR3by5nZXREaWdlc3QoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL011bHRpcGxlSVVBbmRGcmFnbWVudFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9NdWx0aXBsZUlVQW5kRnJhZ21lbnRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNTljZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL011bHRpcGxlSVVBbmRGcmFnbWVudFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm1ldGFkYXRhOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5yZXNvbHV0aW9uLlJlc29sdXRpb25IZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci0KLXB1YmxpYyBjbGFzcyBNdWx0aXBsZUlVQW5kRnJhZ21lbnRUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQotCUlJbnN0YWxsYWJsZVVuaXQgaXUxOwotCUlJbnN0YWxsYWJsZVVuaXQgaXUyOwotCUlJbnN0YWxsYWJsZVVuaXQgaXUzOwotCUNvbGxlY3Rpb24gcmVzdWx0OwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaXUxID0gY3JlYXRlRWNsaXBzZUlVKCJvbmUiKTsKLQkJaXUyID0gY3JlYXRlSVVXaXRoRGVwZW5kZW5jeU9uKCJ0d28iLCAib25lIik7Ci0JCWl1MyA9IGNyZWF0ZUJ1bmRsZUZyYWdtZW50KCJmcmFnbWVudCIpOwotCQlIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCXNldC5hZGQoaXUxKTsKLQkJc2V0LmFkZChpdTIpOwotCQlzZXQuYWRkKGl1Myk7Ci0JCXJlc3VsdCA9IG5ldyBSZXNvbHV0aW9uSGVscGVyKG5ldyBIYXNodGFibGUoKSwgbnVsbCkuYXR0YWNoQ1VzKHNldCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIudGVhckRvd24oKTsKLQkJaXUxID0gbnVsbDsKLQkJaXUyID0gbnVsbDsKLQkJaXUzID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QXR0YWNobWVudCgpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHJlc3VsdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChpdS5nZXRJZCgpLmVxdWFscyhpdTEuZ2V0SWQoKSkpIHsKLQkJCQlhc3NlcnRFcXVhbHMoMSwgaXUuZ2V0RnJhZ21lbnRzKCkubGVuZ3RoKTsKLQkJCQlhc3NlcnRFcXVhbHMoaXUuZ2V0RnJhZ21lbnRzKClbMF0uZ2V0SWQoKSwgaXUzLmdldElkKCkpOwotCQkJfQotCQkJaWYgKGl1LmdldElkKCkuZXF1YWxzKGl1Mi5nZXRJZCgpKSkgewotCQkJCWFzc2VydEVxdWFscygxLCBpdS5nZXRGcmFnbWVudHMoKS5sZW5ndGgpOwotCQkJCWFzc2VydEVxdWFscyhpdS5nZXRGcmFnbWVudHMoKVswXS5nZXRJZCgpLCBpdTMuZ2V0SWQoKSk7Ci0JCQl9Ci0JCQlpZiAoaXUuZ2V0SWQoKS5lcXVhbHMoaXUzLmdldElkKCkpKSB7Ci0JCQkJLy9mcmFnbWVudHMgZG9uJ3QgaGF2ZSBmcmFnbWVudHMKLQkJCQlhc3NlcnROdWxsKGl1LmdldEZyYWdtZW50cygpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUluc3RhbGxhYmxlVW5pdCBjcmVhdGVJVVdpdGhEZXBlbmRlbmN5T24oU3RyaW5nIGl1TmFtZSwgU3RyaW5nIGRlcGVuZGVuY3lPbikgewotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXF1aXJlcyA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgZGVwZW5kZW5jeU9uLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIHRydWUpfTsKLQkJcmV0dXJuIGNyZWF0ZUVjbGlwc2VJVShpdU5hbWUsIERFRkFVTFRfVkVSU0lPTiwgcmVxdWlyZXMsIE5PX1RQX0RBVEEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9yZXBvc2l0b3J5L0FsbFRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvcmVwb3NpdG9yeS9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzc3NWIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9yZXBvc2l0b3J5L0FsbFRlc3RzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5tZXRhZGF0YS5yZXBvc2l0b3J5OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUGVyZm9ybXMgYWxsIGF1dG9tYXRlZCBtZXRhZGF0YSByZXBvc2l0b3J5IHRlc3RzLgotICovCi1wdWJsaWMgY2xhc3MgQWxsVGVzdHMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCVRlc3RTdWl0ZSBzdWl0ZSA9IG5ldyBUZXN0U3VpdGUoQWxsVGVzdHMuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEphclVSTFJlcG9zaXRvcnlUZXN0LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKExvY2FsTWV0YWRhdGFSZXBvc2l0b3J5VGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyVGVzdC5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvcmVwb3NpdG9yeS9KYXJVUkxSZXBvc2l0b3J5VGVzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL3JlcG9zaXRvcnkvSmFyVVJMUmVwb3NpdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2NzJhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvcmVwb3NpdG9yeS9KYXJVUkxSZXBvc2l0b3J5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMubWV0YWRhdGEucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuRmlsZUxvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuVGVzdEFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIEphclVSTFJlcG9zaXRvcnlUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHJpdmF0ZSBTZXJ2aWNlUmVmZXJlbmNlIG1hbmFnZXJSZWY7Ci0JcHJpdmF0ZSBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyOwotCXByaXZhdGUgRmlsZSB0ZXN0UmVwb0phcjsKLQotCXB1YmxpYyBKYXJVUkxSZXBvc2l0b3J5VGVzdChTdHJpbmcgbmFtZSkgewotCQlzdXBlcihuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSmFyVVJMUmVwb3NpdG9yeVRlc3QoKSB7Ci0JCXRoaXMoIiIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGVsZXRlRGlyZWN0b3J5KEZpbGUgZGlyZWN0b3J5KSB7Ci0JCWlmIChkaXJlY3RvcnkuZXhpc3RzKCkgJiYgZGlyZWN0b3J5LmlzRGlyZWN0b3J5KCkpIHsKLQkJCUZpbGVbXSBmaWxlcyA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZmlsZXNbaV0uaXNEaXJlY3RvcnkoKSkgewotCQkJCQlkZWxldGVEaXJlY3RvcnkoZmlsZXNbaV0pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZpbGVzW2ldLmRlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGlyZWN0b3J5LmRlbGV0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW1hbmFnZXJSZWYgPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlUmVmZXJlbmNlKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCW1hbmFnZXIgPSAoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIpIFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLmdldFNlcnZpY2UobWFuYWdlclJlZik7Ci0KLQkJRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXIoKTsKLQkJVVJMIGJhc2UgPSBUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRCdW5kbGUoKS5nZXRFbnRyeSgiL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zIik7Ci0JCXByb3ZpZGVyLmluaXRpYWxpemUobmV3IEZpbGUoRmlsZUxvY2F0b3IudG9GaWxlVVJMKGJhc2UpLmdldFBhdGgoKSkpOwotCQlTdHJpbmcgdGVtcERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKLQkJRmlsZSB0ZXN0UmVwbyA9IG5ldyBGaWxlKHRlbXBEaXIsICJ0ZXN0UmVwbyIpOwotCQlkZWxldGVEaXJlY3RvcnkodGVzdFJlcG8pOwotCQl0ZXN0UmVwby5ta2RpcigpOwotCQlwcm92aWRlci5zZXRGbGF2b3IoImphcnRlc3QiKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KHRlc3RSZXBvLnRvVVJMKCksICJ0ZXN0UmVwbyIsIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlRZUEVfU0lNUExFX1JFUE9TSVRPUlksIG51bGwpOwotCQlwcm92aWRlci5zZXRNZXRhZGF0YVJlcG9zaXRvcnkocmVwb3NpdG9yeSk7Ci0JCW5ldyBHZW5lcmF0b3IocHJvdmlkZXIpLmdlbmVyYXRlKCk7Ci0JCUZpbGVVdGlscy56aXAobmV3IEZpbGVbXSB7dGVzdFJlcG99LCBuZXcgRmlsZSh0ZW1wRGlyLCAidGVzdFJlcG8uamFyIikpOwotCQl0ZXN0UmVwb0phciA9IG5ldyBGaWxlKHRlbXBEaXIsICJ0ZXN0UmVwby5qYXIiKTsKLQkJYXNzZXJ0VHJ1ZSh0ZXN0UmVwb0phci5leGlzdHMoKSk7Ci0JCXRlc3RSZXBvSmFyLmRlbGV0ZU9uRXhpdCgpOwotCQlkZWxldGVEaXJlY3RvcnkodGVzdFJlcG8pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCW1hbmFnZXIgPSBudWxsOwotCQlUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2UobWFuYWdlclJlZik7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEphclVSTFJlcG9zaXRvcnkoKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJVVJMIGphclJlcG9VUkwgPSBudWxsOwotCQl0cnkgewotCQkJamFyUmVwb1VSTCA9IG5ldyBVUkwoImphcjoiICsgdGVzdFJlcG9KYXIudG9VUkwoKS50b1N0cmluZygpICsgIiEvdGVzdFJlcG8vIik7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG8gPSBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KGphclJlcG9VUkwsIG51bGwpOwotCQlhc3NlcnRUcnVlKCFyZXBvLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pc0VtcHR5KCkpOwotCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkoamFyUmVwb1VSTCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL21ldGFkYXRhL3JlcG9zaXRvcnkvTG9jYWxNZXRhZGF0YVJlcG9zaXRvcnlUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvcmVwb3NpdG9yeS9Mb2NhbE1ldGFkYXRhUmVwb3NpdG9yeVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY1Y2E2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvcmVwb3NpdG9yeS9Mb2NhbE1ldGFkYXRhUmVwb3NpdG9yeVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMubWV0YWRhdGEucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuRWNsaXBzZUluc3RhbGxHZW5lcmF0b3JJbmZvUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLlRlc3RBY3RpdmF0b3I7Ci0KLS8qKgotICogVGVzdCBBUEkgb2YgdGhlIGxvY2FsIG1ldGFkYXRhIHJlcG9zaXRvcnkgaW1wbGVtZW50YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2NhbE1ldGFkYXRhUmVwb3NpdG9yeVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0tFWSA9ICJUZXN0S2V5IjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9WQUxVRSA9ICJUZXN0VmFsdWUiOwotCXByb3RlY3RlZCBGaWxlIHJlcG9Mb2NhdGlvbjsKLQotCXByaXZhdGUgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgZ2V0TWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcigpIHsKLQkJcmV0dXJuIChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVN0cmluZyB0ZW1wRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOwotCQlyZXBvTG9jYXRpb24gPSBuZXcgRmlsZSh0ZW1wRGlyLCAiTG9jYWxNZXRhZGF0YVJlcG9zaXRvcnlUZXN0Iik7Ci0JCUFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdC5kZWxldGUocmVwb0xvY2F0aW9uKTsKLQkJcmVwb0xvY2F0aW9uLm1rZGlyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZGVsZXRlKHJlcG9Mb2NhdGlvbik7Ci0JCXN1cGVyLnRlYXJEb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXByZXNzZWRSZXBvc2l0b3J5KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IGdldE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKTsKLQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlwcm9wZXJ0aWVzLnB1dChJUmVwb3NpdG9yeS5QUk9QX0NPTVBSRVNTRUQsICJ0cnVlIik7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwbyA9IG1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShyZXBvTG9jYXRpb24udG9VUkwoKSwgIlRlc3RSZXBvIiwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuVFlQRV9TSU1QTEVfUkVQT1NJVE9SWSwgcHJvcGVydGllcyk7Ci0JCUVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldE1ldGFkYXRhUmVwb3NpdG9yeShyZXBvKTsKLQkJcHJvdmlkZXIuaW5pdGlhbGl6ZShyZXBvTG9jYXRpb24pOwotCQlwcm92aWRlci5zZXRSb290VmVyc2lvbigiMy4zIik7Ci0JCXByb3ZpZGVyLnNldFJvb3RJZCgic2RrIik7Ci0JCXByb3ZpZGVyLnNldEZsYXZvcigidG9vbGluZyIpOwotCQkvLyBHZW5lcmF0ZSB0aGUgcmVwb3NpdG9yeQotCQluZXcgR2VuZXJhdG9yKHByb3ZpZGVyKS5nZW5lcmF0ZSgpOwotCQlGaWxlW10gZmlsZXMgPSByZXBvTG9jYXRpb24ubGlzdEZpbGVzKCk7Ci0JCWJvb2xlYW4gamFyRmlsZVByZXNlbnQgPSBmYWxzZTsKLQkJYm9vbGVhbiB4bWxGaWxlUHJlc2VudCA9IGZhbHNlOwotCQkvLyBvbmUgb2YgdGhlIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHNob3VsZCBiZSB0aGUgY29udGVudC54bWwuamFyCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICgiY29udGVudC5qYXIiLmVxdWFsc0lnbm9yZUNhc2UoZmlsZXNbaV0uZ2V0TmFtZSgpKSkgewotCQkJCWphckZpbGVQcmVzZW50ID0gdHJ1ZTsKLQkJCX0KLQkJCWlmICgiY29udGVudC54bWwiLmVxdWFsc0lnbm9yZUNhc2UoZmlsZXNbaV0uZ2V0TmFtZSgpKSkgewotCQkJCXhtbEZpbGVQcmVzZW50ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoIWphckZpbGVQcmVzZW50KSB7Ci0JCQlmYWlsKCJSZXBvc2l0b3J5IGRpZCBub3QgY3JlYXRlIEpBUiBmb3IgY29udGVudC54bWwiKTsKLQkJfQotCQlpZiAoeG1sRmlsZVByZXNlbnQpIHsKLQkJCWZhaWwoIlJlcG9zaXRvcnkgc2hvdWxkIG5vdCBjcmVhdGUgY29udGVudC54bWwiKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RHZXRQcm9wZXJ0aWVzKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IGdldE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbi50b1VSTCgpLCAiVGVzdFJlcG8iLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZLCBudWxsKTsKLQkJTWFwIHByb3BlcnRpZXMgPSByZXBvLmdldFByb3BlcnRpZXMoKTsKLQkJLy9hdHRlbXB0aW5nIHRvIG1vZGlmeSB0aGUgcHJvcGVydGllcyBzaG91bGQgZmFpbAotCQl0cnkgewotCQkJcHJvcGVydGllcy5wdXQoVEVTVF9LRVksIFRFU1RfVkFMVUUpOwotCQkJZmFpbCgiU2hvdWxkIG5vdCBhbGxvdyBzZXR0aW5nIHByb3BlcnR5Iik7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFNldFByb3BlcnR5KCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlciA9IGdldE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIoKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvID0gbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbi50b1VSTCgpLCAiVGVzdFJlcG8iLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZLCBudWxsKTsKLQkJTWFwIHByb3BlcnRpZXMgPSByZXBvLmdldFByb3BlcnRpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4wIiwgIXByb3BlcnRpZXMuY29udGFpbnNLZXkoVEVTVF9LRVkpKTsKLQkJcmVwby5zZXRQcm9wZXJ0eShURVNUX0tFWSwgVEVTVF9WQUxVRSk7Ci0KLQkJLy90aGUgcHJldmlvdXNseSBvYnRhaW5lZCBwcm9wZXJ0aWVzIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQgYnkgc3Vic2VxdWVudCBjaGFuZ2VzCi0JCWFzc2VydFRydWUoIjEuMSIsICFwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFRFU1RfS0VZKSk7Ci0JCXByb3BlcnRpZXMgPSByZXBvLmdldFByb3BlcnRpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4yIiwgcHJvcGVydGllcy5jb250YWluc0tleShURVNUX0tFWSkpOwotCi0JCS8vZ29pbmcgYmFjayB0byByZXBvIG1hbmFnZXIsIHNob3VsZCBzdGlsbCBnZXQgdGhlIG5ldyBwcm9wZXJ0eQotCQlyZXBvID0gbWFuYWdlci5sb2FkUmVwb3NpdG9yeShyZXBvTG9jYXRpb24udG9VUkwoKSwgbnVsbCk7Ci0JCXByb3BlcnRpZXMgPSByZXBvLmdldFByb3BlcnRpZXMoKTsKLQkJYXNzZXJ0VHJ1ZSgiMS4zIiwgcHJvcGVydGllcy5jb250YWluc0tleShURVNUX0tFWSkpOwotCi0JCS8vc2V0dGluZyBhIG51bGwgdmFsdWUgc2hvdWxkIHJlbW92ZSB0aGUga2V5Ci0JCXJlcG8uc2V0UHJvcGVydHkoVEVTVF9LRVksIG51bGwpOwotCQlwcm9wZXJ0aWVzID0gcmVwby5nZXRQcm9wZXJ0aWVzKCk7Ci0JCWFzc2VydFRydWUoIjEuNCIsICFwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KFRFU1RfS0VZKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFVuY29tcHJlc3NlZFJlcG9zaXRvcnkoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24gewotCQlJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlciBtYW5hZ2VyID0gZ2V0TWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcigpOwotCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCXByb3BlcnRpZXMucHV0KElSZXBvc2l0b3J5LlBST1BfQ09NUFJFU1NFRCwgImZhbHNlIik7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnkgcmVwbyA9IG1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShyZXBvTG9jYXRpb24udG9VUkwoKSwgIlRlc3RSZXBvIiwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuVFlQRV9TSU1QTEVfUkVQT1NJVE9SWSwgcHJvcGVydGllcyk7Ci0JCUVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyIHByb3ZpZGVyID0gbmV3IEVjbGlwc2VJbnN0YWxsR2VuZXJhdG9ySW5mb1Byb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldE1ldGFkYXRhUmVwb3NpdG9yeShyZXBvKTsKLQkJcHJvdmlkZXIuaW5pdGlhbGl6ZShyZXBvTG9jYXRpb24pOwotCQlwcm92aWRlci5zZXRSb290VmVyc2lvbigiMy4zIik7Ci0JCXByb3ZpZGVyLnNldFJvb3RJZCgic2RrIik7Ci0JCXByb3ZpZGVyLnNldEZsYXZvcigidG9vbGluZyIpOwotCQkvLyBHZW5lcmF0ZSB0aGUgcmVwb3NpdG9yeQotCQluZXcgR2VuZXJhdG9yKHByb3ZpZGVyKS5nZW5lcmF0ZSgpOwotCQlGaWxlW10gZmlsZXMgPSByZXBvTG9jYXRpb24ubGlzdEZpbGVzKCk7Ci0JCWJvb2xlYW4gamFyRmlsZVByZXNlbnQgPSBmYWxzZTsKLQkJLy8gbm9uZSBvZiB0aGUgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgc2hvdWxkIGJlIHRoZSBjb250ZW50LnhtbC5qYXIKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCJjb250ZW50LmphciIuZXF1YWxzSWdub3JlQ2FzZShmaWxlc1tpXS5nZXROYW1lKCkpKSB7Ci0JCQkJamFyRmlsZVByZXNlbnQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmIChqYXJGaWxlUHJlc2VudCkgewotCQkJZmFpbCgiUmVwb3NpdG9yeSBzaG91bGQgbm90IGNyZWF0ZSBKQVIgZm9yIGNvbnRlbnQueG1sIik7Ci0JCX0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9yZXBvc2l0b3J5L01ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXJUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvbWV0YWRhdGEvcmVwb3NpdG9yeS9NZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWI5ZjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9tZXRhZGF0YS9yZXBvc2l0b3J5L01ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMubWV0YWRhdGEucmVwb3NpdG9yeTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlVSTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUubG9jYXRpb24uQWdlbnRMb2NhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotCi0vKioKLSAqIFRlc3RzIGZvciBBUEkgb2Yge0BsaW5rIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyfS4KLSAqLwotcHVibGljIGNsYXNzIE1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwcm90ZWN0ZWQgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgbWFuYWdlcjsKLQkvKioKLQkgKiBDb250YWlucyB0ZW1wIEZpbGUgaGFuZGxlcyB0aGF0IHNob3VsZCBiZSBkZWxldGVkIGF0IHRoZSBlbmQgb2YgdGhlIHRlc3QuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0IHRvRGVsZXRlID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlyZXR1cm4gbmV3IFRlc3RTdWl0ZShNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyVGVzdC5jbGFzcyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJbWFuYWdlciA9IChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuY29udGV4dCwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gdG9EZWxldGUuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCWRlbGV0ZSgoRmlsZSkgaXQubmV4dCgpKTsKLQkJdG9EZWxldGUuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFzaWNBZGRSZW1vdmUoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJRmlsZSB0ZW1wRmlsZSA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7Ci0JCVVSTCBsb2NhdGlvbiA9IHRlbXBGaWxlLnRvVVJMKCk7Ci0JCWFzc2VydFRydWUoIW1hbmFnZXJDb250YWlucyhsb2NhdGlvbikpOwotCQltYW5hZ2VyLmFkZFJlcG9zaXRvcnkobG9jYXRpb24pOwotCQlhc3NlcnRUcnVlKG1hbmFnZXJDb250YWlucyhsb2NhdGlvbikpOwotCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkobG9jYXRpb24pOwotCQlhc3NlcnRUcnVlKCFtYW5hZ2VyQ29udGFpbnMobG9jYXRpb24pKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2V0S25vd25SZXBvc2l0b3JpZXMoKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24gewotCQlpbnQgbm9uU3lzdGVtQ291bnQgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19OT05fU1lTVEVNKS5sZW5ndGg7Ci0JCWludCBzeXN0ZW1Db3VudCA9IG1hbmFnZXIuZ2V0S25vd25SZXBvc2l0b3JpZXMoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX1NZU1RFTSkubGVuZ3RoOwotCQlpbnQgYWxsQ291bnQgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19BTEwpLmxlbmd0aDsKLQkJYXNzZXJ0RXF1YWxzKCIxLjAiLCBhbGxDb3VudCwgbm9uU3lzdGVtQ291bnQgKyBzeXN0ZW1Db3VudCk7Ci0KLQkJLy9jcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQotCQlGaWxlIHJlcG9Mb2NhdGlvbiA9IGdldFRlbXBMb2NhdGlvbigpOwotCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHRlc3RSZXBvID0gbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbi50b1VSTCgpLCAiTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlclRlc3QiLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZLCBudWxsKTsKLQkJaW50IG5ld05vblN5c3RlbUNvdW50ID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcyhJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfTk9OX1NZU1RFTSkubGVuZ3RoOwotCQlpbnQgbmV3U3lzdGVtQ291bnQgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19TWVNURU0pLmxlbmd0aDsKLQkJaW50IG5ld0FsbENvdW50ID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcyhJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfQUxMKS5sZW5ndGg7Ci0KLQkJLy90aGVyZSBzaG91bGQgYmUgb25lIG1vcmUgbm9uLXN5c3RlbSByZXBvc2l0b3J5Ci0JCWFzc2VydEVxdWFscygiMi4wIiwgbm9uU3lzdGVtQ291bnQgKyAxLCBuZXdOb25TeXN0ZW1Db3VudCk7Ci0JCWFzc2VydEVxdWFscygiMi4xIiwgc3lzdGVtQ291bnQsIG5ld1N5c3RlbUNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKCIyLjIiLCBhbGxDb3VudCArIDEsIG5ld0FsbENvdW50KTsKLQotCQkvL21ha2UgdGhlIHJlcG9zaXRvcnkgYSBzeXN0ZW0gcmVwb3NpdG9yeQotCQl0ZXN0UmVwby5zZXRQcm9wZXJ0eShJUmVwb3NpdG9yeS5QUk9QX1NZU1RFTSwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCi0JCS8vdGhlcmUgc2hvdWxkIGJlIG9uZSBtb3JlIHN5c3RlbSByZXBvc2l0b3J5Ci0JCW5ld05vblN5c3RlbUNvdW50ID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcyhJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfTk9OX1NZU1RFTSkubGVuZ3RoOwotCQluZXdTeXN0ZW1Db3VudCA9IG1hbmFnZXIuZ2V0S25vd25SZXBvc2l0b3JpZXMoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX1NZU1RFTSkubGVuZ3RoOwotCQluZXdBbGxDb3VudCA9IG1hbmFnZXIuZ2V0S25vd25SZXBvc2l0b3JpZXMoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX0FMTCkubGVuZ3RoOwotCQlhc3NlcnRFcXVhbHMoIjMuMCIsIG5vblN5c3RlbUNvdW50LCBuZXdOb25TeXN0ZW1Db3VudCk7Ci0JCWFzc2VydEVxdWFscygiMy4xIiwgc3lzdGVtQ291bnQgKyAxLCBuZXdTeXN0ZW1Db3VudCk7Ci0JCWFzc2VydEVxdWFscygiMy4yIiwgYWxsQ291bnQgKyAxLCBuZXdBbGxDb3VudCk7Ci0KLQkJaW50IGRpc2FibGVkQ291bnQgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19ESVNBQkxFRCkubGVuZ3RoOwotCQlhbGxDb3VudCA9IG5ld0FsbENvdW50OwotCi0JCS8vbWFyayB0aGUgcmVwb3NpdG9yeSBhcyBkaXNhYmxlZAotCQltYW5hZ2VyLnNldEVuYWJsZWQodGVzdFJlcG8uZ2V0TG9jYXRpb24oKSwgZmFsc2UpOwotCi0JCS8vc2hvdWxkIGJlIG9uZSBsZXNzIGVuYWJsZWQgcmVwb3NpdG9yeSBhbmQgb25lIG1vcmUgZGlzYWJsZWQgcmVwb3NpdG9yeQotCQlpbnQgbmV3RGlzYWJsZWRDb3VudCA9IG1hbmFnZXIuZ2V0S25vd25SZXBvc2l0b3JpZXMoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX0RJU0FCTEVEKS5sZW5ndGg7Ci0JCW5ld0FsbENvdW50ID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcyhJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfQUxMKS5sZW5ndGg7Ci0JCWFzc2VydEVxdWFscygiNC4wIiwgZGlzYWJsZWRDb3VudCArIDEsIG5ld0Rpc2FibGVkQ291bnQpOwotCQlhc3NlcnRFcXVhbHMoIjQuMSIsIGFsbENvdW50IC0gMSwgbmV3QWxsQ291bnQpOwotCi0JCS8vcmUtbG9hZGluZyB0aGUgcmVwb3NpdG9yeSBzaG91bGQgbm90IGNoYW5nZSBhbnl0aGluZwotCQltYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KHRlc3RSZXBvLmdldExvY2F0aW9uKCksIG51bGwpOwotCQluZXdEaXNhYmxlZENvdW50ID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcyhJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfRElTQUJMRUQpLmxlbmd0aDsKLQkJbmV3QWxsQ291bnQgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19BTEwpLmxlbmd0aDsKLQkJYXNzZXJ0RXF1YWxzKCI1LjAiLCBkaXNhYmxlZENvdW50ICsgMSwgbmV3RGlzYWJsZWRDb3VudCk7Ci0JCWFzc2VydEVxdWFscygiNS4xIiwgYWxsQ291bnQgLSAxLCBuZXdBbGxDb3VudCk7Ci0KLQkJLy9yZS1lbmFibGUgdGhlIHJlcG9zaXRvcnkKLQkJbWFuYWdlci5zZXRFbmFibGVkKHRlc3RSZXBvLmdldExvY2F0aW9uKCksIHRydWUpOwotCi0JCS8vc2hvdWxkIGJlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGNvdW50cwotCQluZXdEaXNhYmxlZENvdW50ID0gbWFuYWdlci5nZXRLbm93blJlcG9zaXRvcmllcyhJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfRElTQUJMRUQpLmxlbmd0aDsKLQkJbmV3QWxsQ291bnQgPSBtYW5hZ2VyLmdldEtub3duUmVwb3NpdG9yaWVzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19BTEwpLmxlbmd0aDsKLQkJYXNzZXJ0RXF1YWxzKCI2LjAiLCBkaXNhYmxlZENvdW50LCBuZXdEaXNhYmxlZENvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKCI2LjEiLCBhbGxDb3VudCwgbmV3QWxsQ291bnQpOwotCX0KLQotCS8qKgotCSAqIFRlc3RzIHRoYXQgd2UgZG9uJ3QgY3JlYXRlIGEgbG9jYWwgY2FjaGUgd2hlbiBjb250YWN0aW5nIGEgbG9jYWwgbWV0YWRhdGEgcmVwb3NpdG9yeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0TWV0YWRhdGFDYWNoaW5nTG9jYWxSZXBvKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJRmlsZSByZXBvTG9jYXRpb24gPSBnZXRUZW1wTG9jYXRpb24oKTsKLQkJQWdlbnRMb2NhdGlvbiBhZ2VudExvY2F0aW9uID0gKEFnZW50TG9jYXRpb24pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSwgQWdlbnRMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotCQlVUkwgZGF0YUFyZWEgPSBhZ2VudExvY2F0aW9uLmdldERhdGFBcmVhKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvY2FjaGUvIik7Ci0JCUZpbGUgZGF0YUFyZWFGaWxlID0gVVJMVXRpbC50b0ZpbGUoZGF0YUFyZWEpOwotCQlGaWxlIGNhY2hlRmlsZVhNTCA9IG5ldyBGaWxlKGRhdGFBcmVhRmlsZSwgImNvbnRlbnQiICsgcmVwb0xvY2F0aW9uLmhhc2hDb2RlKCkgKyAiLnhtbCIpOwotCQlGaWxlIGNhY2hlRmlsZUpBUiA9IG5ldyBGaWxlKGRhdGFBcmVhRmlsZSwgImNvbnRlbnQiICsgcmVwb0xvY2F0aW9uLmhhc2hDb2RlKCkgKyAiLmphciIpOwotCi0JCS8vIGNyZWF0ZSBhIGxvY2FsIHJlcG9zaXRvcnkKLQkJbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbi50b1VSTCgpLCAiTWV0YWRhdGFSZXBvc2l0b3J5Q2FjaGluZ1Rlc3QiLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5UWVBFX1NJTVBMRV9SRVBPU0lUT1JZLCBudWxsKTsKLQkJbWFuYWdlci5sb2FkUmVwb3NpdG9yeShyZXBvTG9jYXRpb24udG9VUkwoKSwgbnVsbCk7Ci0KLQkJLy8gY2hlY2sgdGhhdCBhIGxvY2FsIGNhY2hlIHdhcyBub3QgY3JlYXRlZAotCQlhc3NlcnRGYWxzZSgiQ2FjaGUgZmlsZSB3YXMgY3JlYXRlZC4iLCBjYWNoZUZpbGVYTUwuZXhpc3RzKCkgfHwgY2FjaGVGaWxlSkFSLmV4aXN0cygpKTsKLQl9Ci0KLQkvKioKLQkgKiBUZXN0cyB0aGF0IGxvY2FsIGNhY2hpbmcgb2YgcmVtb3RlIG1ldGFkYXRhIHJlcG9zaXRvcmllcyB3b3JrcywgYW5kIHRoYXQgdGhlCi0JICogY2FjaGUgaXMgdXBkYXRlZCB3aGVuIGl0IGJlY29tZXMgc3RhbGUuCi0JICovCi0JcHVibGljIHZvaWQgdGVzdE1ldGFkYXRhQ2FjaGluZ1JlbW90ZVJlcG8oKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24gewotCQlVUkwgcmVwb0xvY2F0aW9uID0gbmV3IFVSTCgiaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL2VjbGlwc2UvdXBkYXRlcy8zLjRtaWxlc3RvbmVzLyIpOwotCQlpZiAoIXJlcG9BdmFpbGFibGUocmVwb0xvY2F0aW9uKSkKLQkJCXJldHVybjsKLQkJQWdlbnRMb2NhdGlvbiBhZ2VudExvY2F0aW9uID0gKEFnZW50TG9jYXRpb24pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShUZXN0QWN0aXZhdG9yLmdldENvbnRleHQoKSwgQWdlbnRMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotCQlVUkwgZGF0YUFyZWEgPSBhZ2VudExvY2F0aW9uLmdldERhdGFBcmVhKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkvY2FjaGUvIik7Ci0JCUZpbGUgZGF0YUFyZWFGaWxlID0gVVJMVXRpbC50b0ZpbGUoZGF0YUFyZWEpOwotCQlGaWxlIGNhY2hlRmlsZVhNTCA9IG5ldyBGaWxlKGRhdGFBcmVhRmlsZSwgImNvbnRlbnQiICsgcmVwb0xvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkuaGFzaENvZGUoKSArICIueG1sIik7Ci0JCUZpbGUgY2FjaGVGaWxlSkFSID0gbmV3IEZpbGUoZGF0YUFyZWFGaWxlLCAiY29udGVudCIgKyByZXBvTG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKS5oYXNoQ29kZSgpICsgIi5qYXIiKTsKLQkJRmlsZSBjYWNoZUZpbGU7Ci0KLQkJLy8gbG9hZCBhIHJlbW90ZSByZXBvc2l0b3J5IGFuZCBjaGVjayB0aGF0IGEgbG9jYWwgY2FjaGUgd2FzIGNyZWF0ZWQKLQkJbWFuYWdlci5sb2FkUmVwb3NpdG9yeShyZXBvTG9jYXRpb24sIG51bGwpOwotCQlhc3NlcnRUcnVlKCJDYWNoZSBmaWxlIHdhcyBub3QgY3JlYXRlZC4iLCBjYWNoZUZpbGVYTUwuZXhpc3RzKCkgfHwgY2FjaGVGaWxlSkFSLmV4aXN0cygpKTsKLQkJaWYgKGNhY2hlRmlsZVhNTC5leGlzdHMoKSkKLQkJCWNhY2hlRmlsZSA9IGNhY2hlRmlsZVhNTDsKLQkJZWxzZQotCQkJY2FjaGVGaWxlID0gY2FjaGVGaWxlSkFSOwotCi0JCS8vIG1vZGlmeSB0aGUgbGFzdCBtb2RpZmllZCBkYXRlIHRvIGJlIG9sZGVyIHRoYW4gdGhlIHJlbW90ZSBmaWxlCi0JCWNhY2hlRmlsZS5zZXRMYXN0TW9kaWZpZWQoMCk7Ci0JCS8vIHJlbG9hZCB0aGUgcmVwb3NpdG9yeSBhbmQgY2hlY2sgdGhhdCB0aGUgY2FjaGUgd2FzIHVwZGF0ZWQKLQkJbWFuYWdlci5hZGRSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbik7Ci0JCW1hbmFnZXIubG9hZFJlcG9zaXRvcnkocmVwb0xvY2F0aW9uLCBudWxsKTsKLQkJbG9uZyBsYXN0TW9kaWZpZWQgPSBjYWNoZUZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCWFzc2VydFRydWUoMCAhPSBsYXN0TW9kaWZpZWQpOwotCi0JCS8vIHJlbG9hZCB0aGUgcmVwb3NpdG9yeSBhbmQgY2hlY2sgdGhhdCB0aGUgY2FjaGUgd2FzIG5vdCB1cGRhdGVkCi0JCW1hbmFnZXIuYWRkUmVwb3NpdG9yeShyZXBvTG9jYXRpb24pOwotCQltYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KHJlcG9Mb2NhdGlvbiwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhsYXN0TW9kaWZpZWQsIGNhY2hlRmlsZS5sYXN0TW9kaWZpZWQoKSk7Ci0KLQkJY2FjaGVGaWxlLmRlbGV0ZSgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiByZXBvQXZhaWxhYmxlKFVSTCByZXBvTG9jYXRpb24pIHsKLQkJdHJ5IHsKLQkJCXJlcG9Mb2NhdGlvbi5vcGVuU3RyZWFtKCkuY2xvc2UoKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBub24tZXhpc3RlbnQgZmlsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHdyaXRlIGEgdGVtcG9yYXJ5Ci0JICogZmlsZSBvciBkaXJlY3RvcnkuIFRoZSBsb2NhdGlvbiB3aWxsIGJlIGRlbGV0ZWQgaW4gdGhlIHRlc3QgdGVhckRvd24gbWV0aG9kLgotCSAqLwotCXByaXZhdGUgRmlsZSBnZXRUZW1wTG9jYXRpb24oKSB7Ci0JCUZpbGUgdGVtcERpciA9IG5ldyBGaWxlKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKSk7Ci0JCUZpbGUgdGVtcEZpbGUgPSBuZXcgRmlsZSh0ZW1wRGlyLCAiTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlclRlc3QiKTsKLQkJZGVsZXRlKHRlbXBGaWxlKTsKLQkJYXNzZXJ0VHJ1ZSghdGVtcEZpbGUuZXhpc3RzKCkpOwotCQlyZXR1cm4gdGVtcEZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEZhaWx1cmVBZGRSZW1vdmUoKSB7Ci0JCXRyeSB7Ci0JCQltYW5hZ2VyLmFkZFJlcG9zaXRvcnkobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JCXRyeSB7Ci0JCQltYW5hZ2VyLnJlbW92ZVJlcG9zaXRvcnkobnVsbCk7Ci0JCQlmYWlsKCk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJLy9leHBlY3RlZAotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHtAbGluayBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcn0gY29udGFpbnMgYSByZWZlcmVuY2UKLQkgKiB0byBhIHJlcG9zaXRvcnkgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBtYW5hZ2VyQ29udGFpbnMoVVJMIGxvY2F0aW9uKSB7Ci0JCVVSTFtdIGxvY2F0aW9ucyA9IG1hbmFnZXIuZ2V0S25vd25SZXBvc2l0b3JpZXMoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX0FMTCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAobG9jYXRpb25zW2ldLmVxdWFscyhsb2NhdGlvbikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0FkZElVUHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0FkZElVUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA5OTVlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9BZGRJVVByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZGlyZWN0b3IuU2ltcGxlUGxhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LkNvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEFkZElVUHJvcGVydHkgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMjsKLQlJUHJvZmlsZSBwcm9maWxlOwotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSUVuZ2luZSBlbmdpbmU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCWEyID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMi4wLjAiKSwgdHJ1ZSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBhMn0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQkJZW5naW5lID0gY3JlYXRlRW5naW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFdpdGhvdXRJVVByb3BlcnR5KCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYTEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RXaXRoSVVQcm9wZXJ0eSgpIHsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlyZXEuc2V0SW5zdGFsbGFibGVVbml0SW5jbHVzaW9uUnVsZXMoYTEsIFBsYW5uZXJIZWxwZXIuY3JlYXRlT3B0aW9uYWxJbmNsdXNpb25SdWxlKGExKSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYTEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VJVVByb3BlcnR5KCkgewotCQkvL0FkZCBhMSwgc3RyaWN0bHkgOwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgbmV3IERlZmF1bHRQaGFzZVNldCgpLCBwbGFuLmdldE9wZXJhbmRzKCksIG51bGwsIG51bGwpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkExIGlzIG1pc3NpbmciLCBwcm9maWxlLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlDb2xsZWN0b3IgYWxsUHJvZmlsZUlVcyA9IHByb2ZpbGUucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYWxsUHJvZmlsZUlVcy5zaXplKCksIDEpOwotCi0JCS8vQWRkIGEyIHdpdGggYTEuIFRoaXMgaXMgYW4gZXJyb3IKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxNCA9IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmNyZWF0ZUJ5UHJvZmlsZUlkKHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpOwotCQlyZXE0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTJ9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuNCA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXE0LCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW40LmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCi0JCS8vQWRkIGEyLCBtYWtpbmcgYTEgb3B0aW9uYWw7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTIgPSBQcm9maWxlQ2hhbmdlUmVxdWVzdC5jcmVhdGVCeVByb2ZpbGVJZChwcm9maWxlLmdldFByb2ZpbGVJZCgpKTsKLQkJcmVxMi5zZXRJbnN0YWxsYWJsZVVuaXRJbmNsdXNpb25SdWxlcyhhMSwgUGxhbm5lckhlbHBlci5jcmVhdGVPcHRpb25hbEluY2x1c2lvblJ1bGUoYTEpKTsKLQkJcmVxMi5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2EyfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjIgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMiwgYTIpOwotCi0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbjIuZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQTIgaXMgbWlzc2luZyIsIHByb2ZpbGUsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2EyfSk7Ci0JCWFsbFByb2ZpbGVJVXMgPSBwcm9maWxlLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKGFsbFByb2ZpbGVJVXMuc2l6ZSgpLCAxKTsKLQotCQlDb2xsZWN0b3IgaXVQcm9maWxlUHJvcGVydGllcyA9IHByb2ZpbGUucXVlcnkobmV3IElVUHJvZmlsZVByb3BlcnR5UXVlcnkocHJvZmlsZSwgU2ltcGxlUGxhbm5lci5JTkNMVVNJT05fUlVMRVMsIG51bGwpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoaXVQcm9maWxlUHJvcGVydGllcy5zaXplKCksIDEpOwotCi0JCS8vUmVtb3ZlIGExIG9wdGlvbmFsaXR5IC0gc2hvdWxkIGJlIGEgbm8tb3AKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMyA9IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmNyZWF0ZUJ5UHJvZmlsZUlkKHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpOwotCQlyZXEzLnJlbW92ZUluc3RhbGxhYmxlVW5pdEluY2x1c2lvblJ1bGVzKGExKTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMyA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEzLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbjMuZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCWFsbFByb2ZpbGVJVXMgPSBwcm9maWxlLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCJBMiBpcyBtaXNzaW5nIiwgcHJvZmlsZSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTJ9KTsKLQkJYXNzZXJ0RXF1YWxzKGFsbFByb2ZpbGVJVXMuc2l6ZSgpLCAxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9BbGxPcHRpb25hbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvQWxsT3B0aW9uYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyNmViMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9BbGxPcHRpb25hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEFsbE9wdGlvbmFsIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGIxOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBjMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgZDE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGUxOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFBID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpfTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFBKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFDID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsyXTsKLQkJcmVxQ1swXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJEIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJcmVxQ1sxXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJFIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJYzEgPSBjcmVhdGVJVSgiQyIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFDKTsKLQkJZDEgPSBjcmVhdGVJVSgiRCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQkJZTEgPSBjcmVhdGVJVSgiRSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBjMSwgZDEsIGUxfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsYXRpb24oKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGMxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBiMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGMxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgZDEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBlMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvQWxsT3JiaXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0FsbE9yYml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NGZkZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvQWxsT3JiaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotCi1wdWJsaWMgY2xhc3MgQWxsT3JiaXQgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlQcm9maWxlIHByb2ZpbGUxOwotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSUVuZ2luZSBlbmdpbmU7Ci0JSU1ldGFkYXRhUmVwb3NpdG9yeSByZXBvOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgcmVwb01hbiA9IChNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXJlcG8gPSByZXBvTWFuLmxvYWRSZXBvc2l0b3J5KGdldFRlc3REYXRhKCJyZXBvc2l0b3J5IGZvciB3c2RsIHRlc3QiLCAidGVzdERhdGEvb3JiaXRSZXBvLyIpLnRvVVJMKCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCi0JCXByb2ZpbGUxID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JCWVuZ2luZSA9IGNyZWF0ZUVuZ2luZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsVHdvVmVyc2lvbnNPcHRpb25hbHkoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQlDb2xsZWN0b3IgYWxsSVVzID0gcmVwby5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCk7Ci0JCXJlcTEuYWRkSW5zdGFsbGFibGVVbml0cygoSUluc3RhbGxhYmxlVW5pdFtdKSBhbGxJVXMudG9BcnJheShJSW5zdGFsbGFibGVVbml0LmNsYXNzKSk7Ci0JCWZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhbGxJVXMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAoIWl1LmdldElkKCkuZXF1YWxzKCJqYXZheC53c2RsIikpCi0JCQkJcmVxMS5zZXRJbnN0YWxsYWJsZVVuaXRJbmNsdXNpb25SdWxlcyhpdSwgUGxhbm5lckhlbHBlci5jcmVhdGVPcHRpb25hbEluY2x1c2lvblJ1bGUoaXUpKTsKLQkJfQotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4xID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTEsIG51bGwsIG51bGwpOwotCQlPcGVyYW5kW10gb3BzID0gcGxhbjEuZ2V0T3BlcmFuZHMoKTsKLQkJaW50IGNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcHNbaV0gaW5zdGFuY2VvZiBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kKSB7Ci0JCQkJY291bnQrKzsKLQkJCX0KLQkJfQotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbjEuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0JCS8vSW5zdGFsbCBldmVyeXRoaW5nIGV4Y2VwdCBjb20uaWJtLmljdQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXExID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJQ29sbGVjdG9yIGFsbElVcyA9IHJlcG8ucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCQlBcnJheUxpc3QgdG9JbnN0YWxsID0gbmV3IEFycmF5TGlzdChhbGxJVXMuc2l6ZSgpKTsKLQkJaW50IHJlbW92ZWQgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsSVVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgdG9BZGQgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCF0b0FkZC5nZXRJZCgpLmVxdWFscygiY29tLmlibS5pY3UiKSkgewotCQkJCXRvSW5zdGFsbC5hZGQodG9BZGQpOwotCQkJfSBlbHNlCi0JCQkJcmVtb3ZlZCsrOwotCQl9Ci0JCXJlcTEuYWRkSW5zdGFsbGFibGVVbml0cygoSUluc3RhbGxhYmxlVW5pdFtdKSB0b0luc3RhbGwudG9BcnJheShuZXcgSUluc3RhbGxhYmxlVW5pdFt0b0luc3RhbGwuc2l6ZSgpXSkpOwotCi0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjEgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMSwgbnVsbCwgbnVsbCk7Ci0JCU9wZXJhbmRbXSBvcHMgPSBwbGFuMS5nZXRPcGVyYW5kcygpOwotCQlpbnQgY291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9wc1tpXSBpbnN0YW5jZW9mIEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIHsKLQkJCQljb3VudCsrOwotCQkJfQotCQl9Ci0JCWFzc2VydEVxdWFscygxNzgsIGNvdW50KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4xLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QzKCkgewotCQkvL0luc3RhbGwgZXZlcnl0aGluZyBvcHRpb25hbHkgKGV4Y2VwdCBjb20uaWJtLmljdSB0aGF0IHdlIGRvbid0IGluc3RhbGwgYXQgYWxsKQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXExID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJQ29sbGVjdG9yIGFsbElVcyA9IHJlcG8ucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCQlBcnJheUxpc3QgdG9JbnN0YWxsID0gbmV3IEFycmF5TGlzdChhbGxJVXMuc2l6ZSgpKTsKLQkJaW50IHJlbW92ZWQgPSAwOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYWxsSVVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgdG9BZGQgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlcmF0b3IubmV4dCgpOwotCQkJaWYgKCF0b0FkZC5nZXRJZCgpLmVxdWFscygiY29tLmlibS5pY3UiKSkgewotCQkJCXRvSW5zdGFsbC5hZGQodG9BZGQpOwotCQkJCXJlcTEuc2V0SW5zdGFsbGFibGVVbml0SW5jbHVzaW9uUnVsZXModG9BZGQsIFBsYW5uZXJIZWxwZXIuY3JlYXRlT3B0aW9uYWxJbmNsdXNpb25SdWxlKHRvQWRkKSk7Ci0JCQl9IGVsc2UKLQkJCQlyZW1vdmVkKys7Ci0JCX0KLQkJcmVxMS5hZGRJbnN0YWxsYWJsZVVuaXRzKChJSW5zdGFsbGFibGVVbml0W10pIHRvSW5zdGFsbC50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W3RvSW5zdGFsbC5zaXplKCldKSk7Ci0KLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMSA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXExLCBudWxsLCBudWxsKTsKLQkJT3BlcmFuZFtdIG9wcyA9IHBsYW4xLmdldE9wZXJhbmRzKCk7Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3BzW2ldIGluc3RhbmNlb2YgSW5zdGFsbGFibGVVbml0T3BlcmFuZCkgewotCQkJCWNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJYXNzZXJ0RXF1YWxzKDE3OCwgY291bnQpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbjEuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvQWxsVGVzdHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0FsbFRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNWQwYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBQZXJmb3JtcyBhbGwgYXV0b21hdGVkIHBsYW5uZXIgdGVzdHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBBbGxUZXN0cyBleHRlbmRzIFRlc3RDYXNlIHsKLQotCXB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpIHsKLQkJVGVzdFN1aXRlIHN1aXRlID0gbmV3IFRlc3RTdWl0ZShBbGxUZXN0cy5jbGFzcy5nZXROYW1lKCkpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoQWRkSVVQcm9wZXJ0eS5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbGxPcHRpb25hbC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbGxPcmJpdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShBbm90aGVyU2luZ2xldG9uLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKEJ1ZzIwNzMxOS5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShEZXBlbmRlbmN5T25TZWxmLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKERyb3BpbnNTY2VuYXJpby5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShHcmVlZHlSZXF1aXJlbWVudC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJbmNsdXNpb25SdWxlVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShJbmNsdXNpb25SdWxlVGVzdDIuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSVVQcm9wZXJ0eVJlbW92YWwuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoSVVXaXRoRmlsdGVyLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKElVV2l0aEZpbHRlcjIuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWluaW1hbEluc3RhbGwuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWlzc2luZ0RlcGVuZGVuY3kuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWlzc2luZ0RlcGVuZGVuY3kyLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE1pc3NpbmdEZXBlbmRlbmN5My5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNaXNzaW5nTm9uR3JlZWR5UmVxdWlyZW1lbnQuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWlzc2luZ05vbkdyZWVkeVJlcXVpcmVtZW50Mi5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNaXNzaW5nT3B0aW9uYWwuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWlzc2luZ09wdGlvbmFsTm9uR3JlZWR5UmVxdWlyZW1lbnQuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoTWlzc2luZ09wdGlvbmFsV2l0aERlcGVuZGVuY2llcy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNaXNzaW5nT3B0aW9uYWxXaXRoRGVwZW5kZW5jaWVzMi5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNaXNzaW5nT3B0aW9uYWxXaXRoRGVwZW5kZW5jaWVzMy5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShNdWx0aXBsZVByb3ZpZGVyLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE11bHRpcGxlU2luZ2xldG9uLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKE5vUmVxdWlyZW1lbnRzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBhdGNoVGVzdDEuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGF0Y2hUZXN0MTAuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGF0Y2hUZXN0MWIuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGF0Y2hUZXN0MWMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGF0Y2hUZXN0Mi5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQYXRjaFRlc3QzLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBhdGNoVGVzdDQuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGF0Y2hUZXN0NS5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQYXRjaFRlc3Q2LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFBhdGNoVGVzdDcuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGF0Y2hUZXN0N2IuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoUGF0Y2hUZXN0OC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShQYXRjaFRlc3Q5LmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZU9wdGlvbmFsVGVzdC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVPcHRpb25hbFRlc3QyLmNsYXNzKTsKLQkJc3VpdGUuYWRkVGVzdFN1aXRlKFNpbXBsZU9wdGlvbmFsVGVzdDMuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoU2ltcGxlT3B0aW9uYWxUZXN0NC5jbGFzcyk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShTaW1wbGVTaW5nbGV0b24uY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVHdvVmVyc2lvbnNPZldTREwuY2xhc3MpOwotCQlzdWl0ZS5hZGRUZXN0U3VpdGUoVW5pbnN0YWxsRXZlcnl0aGluZy5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvQW5vdGhlclNpbmdsZXRvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvQW5vdGhlclNpbmdsZXRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjU4OTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0Fub3RoZXJTaW5nbGV0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklQbGFubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBBbm90aGVyU2luZ2xldG9uIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCUlJbnN0YWxsYWJsZVVuaXQgYTI7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMzsKLQlJSW5zdGFsbGFibGVVbml0IGE0OwotCUlJbnN0YWxsYWJsZVVuaXQgdSwgdiwgdywgeCwgeSwgejsKLQotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJYTIgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIyLjAuMCIpLCB0cnVlKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHkgYzEgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCXggPSBjcmVhdGVJVSgiWCIsIG5ldyBWZXJzaW9uKDIsIDAsIDApLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge2MxfSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGMyID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMi4wLjAsIDIuMC4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQl5ID0gY3JlYXRlSVUoIlkiLCBuZXcgVmVyc2lvbigyLCAwLCAwKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtjMn0pOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYTIsIHgsIHl9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0MSgpIHsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt4LCB5fSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLkVSUk9SLCBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9CdWcyMDczMTkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0J1ZzIwNzMxOS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTZkYmMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0J1ZzIwNzMxOS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSURpcmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIEJ1ZzIwNzMxOSBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBhLCBiLCBjOwotCi0JSURpcmVjdG9yIGRpcmVjdG9yOwotCUlQcm9maWxlIHByb2ZpbGU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSk7Ci0JCWIgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBuZXcgUHJvdmlkZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVQcm92aWRlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIikpfSk7Ci0JCWMgPSBjcmVhdGVJVSgiQyIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMC4wXSIpLCBudWxsKSk7Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthLCBiLCBjfSk7Ci0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKEJ1ZzIwNzMxOS5jbGFzcy5nZXROYW1lKCkpOwotCQlkaXJlY3RvciA9IGNyZWF0ZURpcmVjdG9yKCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RW5zdXJlQU5ldmVySW5zdGFsbGVkKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2J9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIGRpcmVjdG9yLnByb3Zpc2lvbihyZXEsIG51bGwsIG51bGwpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkIgaXMgbWlzc2luZyIsIHByb2ZpbGUsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2J9KTsKLQkJYXNzZXJ0Tm90SVVzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2F9LCBwcm9maWxlLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pdGVyYXRvcigpKTsKLQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEyID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEyLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7Y30pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgZGlyZWN0b3IucHJvdmlzaW9uKHJlcTIsIG51bGwsIG51bGwpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkIgYW5kIEMgYXJlIG1pc3NpbmciLCBwcm9maWxlLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtiLCBjfSk7Ci0JCWFzc2VydE5vdElVcyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthfSwgcHJvZmlsZS5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuaXRlcmF0b3IoKSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9EZXBlbmRlbmN5T25TZWxmLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9EZXBlbmRlbmN5T25TZWxmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZWFiZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvRGVwZW5kZW5jeU9uU2VsZi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklQbGFubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBEZXBlbmRlbmN5T25TZWxmIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCi0JSVBsYW5uZXIgcGxhbm5lcjsKLQlJUHJvZmlsZSBwcm9maWxlOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMC4wXSIpLCBudWxsKSk7Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZShEZXBlbmRlbmN5T25TZWxmLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0Ryb3BpbnNTY2VuYXJpby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvRHJvcGluc1NjZW5hcmlvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNGI1ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvRHJvcGluc1NjZW5hcmlvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgRHJvcGluc1NjZW5hcmlvIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGEwOwotCUlJbnN0YWxsYWJsZVVuaXQgYjA7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlJSW5zdGFsbGFibGVVbml0IGIxOwotCUlJbnN0YWxsYWJsZVVuaXQgYXM7Ci0JSUluc3RhbGxhYmxlVW5pdCBiczsKLQlwcml2YXRlIElQcm9maWxlIHByb2ZpbGU7Ci0JcHJpdmF0ZSBJUGxhbm5lciBwbGFubmVyOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCWEwID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMC4wLjAiKSwgdHJ1ZSk7Ci0JCWIwID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMC4wLjAiKSwgdHJ1ZSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxQXMgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzAuMC4wLCAxLjAuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKX07Ci0JCWFzID0gY3JlYXRlSVUoIkFTIiwgbmV3IFZlcnNpb24oIjAuMC4wIiksIHJlcUFzKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFCcyA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMC4wLjAsIDEuMC4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpfTsKLQkJYnMgPSBjcmVhdGVJVSgiQlMiLCBuZXcgVmVyc2lvbigiMC4wLjAiKSwgcmVxQnMpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjEsIGEwLCBiMCwgYXMsIGJzfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsYXRpb24oKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YXMsIGJzfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0dyZWVkeVJlcXVpcmVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9HcmVlZHlSZXF1aXJlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTFiNzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0dyZWVkeVJlcXVpcmVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgR3JlZWR5UmVxdWlyZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGMxOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcUIgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzFdOwotCQlyZXFCWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFCKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFDID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsxXTsKLQkJcmVxQ1swXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWMxID0gY3JlYXRlSVUoIkMiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgcmVxQyk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgYzF9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB7Ci0JCS8vVGhlIHBsYW4gY29udGFpbnMgQiBiZWNhdXNlIHRoZSByZXF1aXJlbWVudCBmcm9tIEEgb24gQiBpcyBub24gZ3JlZWR5LCBidXQgd2UgYXJlIGluc3RhbGxpbmcgQyB0aGF0IGhhcyBhIGdyZWVkeSByZXF1aXJlbWVudCBvbiB0aGUgQgotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBjMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4gPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGExKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYjEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBjMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvSVVQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9JVVByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRkMWU0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9JVVByb3BlcnRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIElVUHJvcGVydGllcyBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBjOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0JcHJpdmF0ZSBJRW5naW5lIGVuZ2luZTsKLQlwcml2YXRlIFN0cmluZyBwcm9maWxlSWQ7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQjEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wKSIpLCBudWxsKSk7Ci0KLQkJYjEgPSBjcmVhdGVJVSgiQjEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJYjExID0gY3JlYXRlSVUoIkIxIiwgbmV3IFZlcnNpb24oIjEuMS4wIiksIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQyIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMy4wLjApIiksIG51bGwpLCBOT19QUk9QRVJUSUVTLCB0cnVlKTsKLQotCQljID0gY3JlYXRlSVUoIkMiLCBuZXcgVmVyc2lvbigyLCAwLCAwKSwgdHJ1ZSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgYjExLCBjfSk7Ci0KLQkJcHJvZmlsZUlkID0gIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCk7Ci0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKHByb2ZpbGVJZCk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JCWVuZ2luZSA9IGNyZWF0ZUVuZ2luZSgpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUlVUHJvcGVydHkoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcTEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlyZXExLnNldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0eShhMSwgIkZPTyIsICJCQVIiKTsKLQkJcmVxMS5zZXRJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydHkoYjEsICJGT08iLCAiQkFSIik7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcHAxID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcHAxLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlJU3RhdHVzIHMgPSBlbmdpbmUucGVyZm9ybShwcm9maWxlLCBuZXcgRGVmYXVsdFBoYXNlU2V0KCksIHBwMS5nZXRPcGVyYW5kcygpLCBudWxsLCBudWxsKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHMpOwotCQlDb2xsZWN0b3IgYyA9IGdldFByb2ZpbGUocHJvZmlsZUlkKS5xdWVyeShuZXcgSVVQcm9maWxlUHJvcGVydHlRdWVyeShnZXRQcm9maWxlKHByb2ZpbGVJZCksICJGT08iLCBudWxsKSwgbmV3IENvbGxlY3RvcigpLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGMuc2l6ZSgpKTsKLQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEyID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEyLnJlbW92ZUluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0eShiMSwgIkZPTyIpOwotCQlQcm92aXNpb25pbmdQbGFuIHBwMiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEyLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBwMi5nZXRPcGVyYW5kcygpLmxlbmd0aCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvSVVQcm9wZXJ0eVJlbW92YWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0lVUHJvcGVydHlSZW1vdmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMDM4Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvSVVQcm9wZXJ0eVJlbW92YWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIElVUHJvcGVydHlSZW1vdmFsIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGIxOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0JcHJpdmF0ZSBJRW5naW5lIGVuZ2luZTsKLQlwcml2YXRlIFN0cmluZyBwcm9maWxlSWQ7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQjEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wKSIpLCBudWxsKSk7Ci0KLQkJYjEgPSBjcmVhdGVJVSgiQjEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMX0pOwotCi0JCXByb2ZpbGVJZCA9ICJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpOwotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZShwcm9maWxlSWQpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCQllbmdpbmUgPSBjcmVhdGVFbmdpbmUoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJVVByb3BlcnR5KCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXExID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXExLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJcmVxMS5zZXRJbnN0YWxsYWJsZVVuaXRQcm9maWxlUHJvcGVydHkoYTEsICJGT08iLCAiQkFSIik7Ci0JCXJlcTEuc2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KGIxLCAiRk9PIiwgIkJBUiIpOwotCQlQcm92aXNpb25pbmdQbGFuIHBwMSA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXExLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBwMS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgbmV3IERlZmF1bHRQaGFzZVNldCgpLCBwcDEuZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCUNvbGxlY3RvciByZXMgPSBnZXRQcm9maWxlKHByb2ZpbGVJZCkucXVlcnkobmV3IElVUHJvZmlsZVByb3BlcnR5UXVlcnkoZ2V0UHJvZmlsZShwcm9maWxlSWQpLCAiRk9PIiwgbnVsbCksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscygyLCByZXMuc2l6ZSgpKTsKLQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEyID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEyLnJlbW92ZUluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0eShiMSwgIkZPTyIpOwotCQlQcm92aXNpb25pbmdQbGFuIHBwMiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEyLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIHBwMi5nZXRPcGVyYW5kcygpLmxlbmd0aCk7Ci0JCWVuZ2luZS5wZXJmb3JtKGdldFByb2ZpbGUocHJvZmlsZUlkKSwgbmV3IERlZmF1bHRQaGFzZVNldCgpLCBwcDIuZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCUNvbGxlY3RvciByZXMyID0gZ2V0UHJvZmlsZShwcm9maWxlSWQpLnF1ZXJ5KG5ldyBJVVByb2ZpbGVQcm9wZXJ0eVF1ZXJ5KGdldFByb2ZpbGUocHJvZmlsZUlkKSwgIkZPTyIsIG51bGwpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoMSwgcmVzMi5zaXplKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0lVV2l0aEZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvSVVXaXRoRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0NThhOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvSVVXaXRoRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSVBsYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5NZXRhZGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIElVV2l0aEZpbHRlciBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMTsKLQotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCU1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbiBpdWQgPSBuZXcgTWV0YWRhdGFGYWN0b3J5Lkluc3RhbGxhYmxlVW5pdERlc2NyaXB0aW9uKCk7Ci0JCWl1ZC5zZXRJZCgiQSIpOwotCQlpdWQuc2V0VmVyc2lvbihuZXcgVmVyc2lvbigiMS4wLjAiKSk7Ci0JCWl1ZC5zZXRSZXF1aXJlZENhcGFiaWxpdGllcyhjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMC4wXSIpLCBudWxsKSk7Ci0JCWl1ZC5zZXRBcHBsaWNhYmlsaXR5RmlsdGVyKCIoaW52YWxpZD10cnVlKSIpOwotCQlpdWQuc2V0RmlsdGVyKCIoaW52YWxpZD10cnVlKSIpOwotCQlhMSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVJbnN0YWxsYWJsZVVuaXQoaXVkKTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKElVV2l0aEZpbHRlci5jbGFzcy5nZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLkVSUk9SLCBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9JVVdpdGhGaWx0ZXIyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9JVVdpdGhGaWx0ZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMDJiZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvSVVXaXRoRmlsdGVyMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklQbGFubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBJVVdpdGhGaWx0ZXIyIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExLCBhMjsKLQlJSW5zdGFsbGFibGVVbml0IGIxOwotCi0JSVBsYW5uZXIgcGxhbm5lcjsKLQlJUHJvZmlsZSBwcm9maWxlOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxcyA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbMV07Ci0JCXJlcXNbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCByZXFzKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFzQTIgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzFdOwotCQlyZXFzQTJbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4wLjBdIiksIG51bGwsIHRydWUsIGZhbHNlKTsKLQkJYTIgPSBjcmVhdGVJVSgiQSIsIHJlcXNBMik7Ci0KLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCAiKGludmFsaWQ9dHJ1ZSkiLCBOT19QUk9WSURFUyk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBhMiwgYjF9KTsKLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoSVVXaXRoRmlsdGVyMi5jbGFzcy5nZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQTEoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQTIoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTJ9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0luY2x1c2lvblJ1bGVUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9JbmNsdXNpb25SdWxlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTM2NDY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0luY2x1c2lvblJ1bGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgSW5jbHVzaW9uUnVsZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMjsKLQlJSW5zdGFsbGFibGVVbml0IGIxOwotCUlQcm9maWxlIHByb2ZpbGUxOwotCUlQcm9maWxlIHByb2ZpbGUyOwotCUlQcm9maWxlIHByb2ZpbGUzOwotCUlQcm9maWxlIHByb2ZpbGU0OwotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSUVuZ2luZSBlbmdpbmU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCWEyID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMi4wLjAiKSwgdHJ1ZSk7Ci0KLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGEyfSk7Ci0KLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQkJZW5naW5lID0gY3JlYXRlRW5naW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE11bHRpcGxlSW5zdGFsbGF0aW9ucygpIHsKLQkJcHJvZmlsZTEgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQllbmdpbmUucGVyZm9ybShwcm9maWxlMSwgbmV3IERlZmF1bHRQaGFzZVNldCgpLCBwbGFuLmdldE9wZXJhbmRzKCksIG51bGwsIG51bGwpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkExIGlzIG1pc3NpbmciLCBwcm9maWxlMSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJYXNzZXJ0RXF1YWxzKHByb2ZpbGUxLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5zaXplKCksIDEpOwotCi0JCS8vTWFrZSBhMSBvcHRpb25hbC4KLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMiA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTIuc2V0SW5zdGFsbGFibGVVbml0SW5jbHVzaW9uUnVsZXMoYTEsIFBsYW5uZXJIZWxwZXIuY3JlYXRlT3B0aW9uYWxJbmNsdXNpb25SdWxlKGExKSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjIgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuMi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZTEsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbjIuZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQTEgaXMgbWlzc2luZyIsIHByb2ZpbGUxLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlhc3NlcnRFcXVhbHMocHJvZmlsZTEucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnNpemUoKSwgMSk7Ci0KLQkJLy9JbnN0YWxsIGIxICh0aGlzIHNob3VsZCBub3QgY2hhbmdlIGFueXRoaW5nIGZvciBhMSkKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMyA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTMuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtiMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4zID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTMsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbjMuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUxLCBuZXcgRGVmYXVsdFBoYXNlU2V0KCksIHBsYW4zLmdldE9wZXJhbmRzKCksIG51bGwsIG51bGwpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkExIG9yIEIxIGlzIG1pc3NpbmciLCBwcm9maWxlMSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxfSk7Ci0JCWFzc2VydEVxdWFscyhwcm9maWxlMS5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuc2l6ZSgpLCAyKTsKLQotCQkvL0FkZCBhMiwgdGhpcyByZW1vdmVzIGExLgotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXE0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxNC5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2EyfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjQgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxNCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuNC5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZTEsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbjQuZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQTIgaXMgbWlzc2luZyIsIHByb2ZpbGUxLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMn0pOwotCQlhc3NlcnROb3RJVXMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9LCBwcm9maWxlMS5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuaXRlcmF0b3IoKSk7Ci0JCWFzc2VydEVxdWFscyhwcm9maWxlMS5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuc2l6ZSgpLCAyKTsKLQotCQkvL1RyeSB0byBhZGQgYTEgYWdhaW4uIFRoaXMgd2lsbCBmYWlsIGJlY2F1c2Ugc2luY2UgYTEgaGFzIGJlZW4gdW5pbnN0YWxsZWQgaW4gdGhlIHByZXZpb3VzIHN0ZXAgYW5kIHdlIG5vIGxvbmdlciBrbm93IGFib3V0IGl0cyBvcHRpb25hbCBpbmNsdXNpb24KLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxNSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTUuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW41ID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTUsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbjUuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFJlbW92ZUluY2x1c2lvblJ1bGUoKSB7Ci0JCXByb2ZpbGUyID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUyLiIgKyBnZXROYW1lKCkpOwotCQkvL0luc3RhbGwgYTEKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUyKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQllbmdpbmUucGVyZm9ybShwcm9maWxlMiwgbmV3IERlZmF1bHRQaGFzZVNldCgpLCBwbGFuLmdldE9wZXJhbmRzKCksIG51bGwsIG51bGwpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkExIGlzIG1pc3NpbmciLCBwcm9maWxlMiwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJYXNzZXJ0RXF1YWxzKHByb2ZpbGUyLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5zaXplKCksIDEpOwotCi0JCS8vTWFrZSBhMSBvcHRpb25hbC4KLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMiA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMik7Ci0JCXJlcTIuc2V0SW5zdGFsbGFibGVVbml0SW5jbHVzaW9uUnVsZXMoYTEsIFBsYW5uZXJIZWxwZXIuY3JlYXRlT3B0aW9uYWxJbmNsdXNpb25SdWxlKGExKSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjIgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuMi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZTIsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbjIuZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQTEgaXMgbWlzc2luZyIsIHByb2ZpbGUyLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlhc3NlcnRFcXVhbHMocHJvZmlsZTIucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnNpemUoKSwgMSk7Ci0KLQkJLy9JbnN0YWxsIGIxICh0aGlzIHNob3VsZCBub3QgY2hhbmdlIGFueXRoaW5nIGZvciBhMSkKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMyA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMik7Ci0JCXJlcTMuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtiMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4zID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTMsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbjMuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUyLCBuZXcgRGVmYXVsdFBoYXNlU2V0KCksIHBsYW4zLmdldE9wZXJhbmRzKCksIG51bGwsIG51bGwpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkExIG9yIEIxIGlzIG1pc3NpbmciLCBwcm9maWxlMiwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxfSk7Ci0JCWFzc2VydEVxdWFscyhwcm9maWxlMi5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuc2l6ZSgpLCAyKTsKLQotCQkvL1JlbW92ZSB0aGUgb3B0aW9uYWwgaW5jbHVzaW9uIHJ1bGUgZnJvbSBhMS4gYTEgYW5kIGIxIGFyZSBzdGlsbCBoZXJlIAotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXE1ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUyKTsKLQkJcmVxNS5yZW1vdmVJbnN0YWxsYWJsZVVuaXRJbmNsdXNpb25SdWxlcyhhMSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjUgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxNSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuNS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZTIsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbjUuZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQTEgb3IgQjEgaXMgbWlzc2luZyIsIHByb2ZpbGUyLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjF9KTsKLQkJYXNzZXJ0RXF1YWxzKHByb2ZpbGUyLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5zaXplKCksIDIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RSZW1vdmVJVWFuZEluY2x1c2lvblJ1bGUoKSB7Ci0JCXByb2ZpbGUzID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUzLiIgKyBnZXROYW1lKCkpOwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTMpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4gPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUzLCBuZXcgRGVmYXVsdFBoYXNlU2V0KCksIHBsYW4uZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQTEgaXMgbWlzc2luZyIsIHByb2ZpbGUzLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlhc3NlcnRFcXVhbHMocHJvZmlsZTMucXVlcnkoSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLnNpemUoKSwgMSk7Ci0KLQkJLy9NYWtlIGExIG9wdGlvbmFsLgotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEyID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUzKTsKLQkJcmVxMi5zZXRJbnN0YWxsYWJsZVVuaXRJbmNsdXNpb25SdWxlcyhhMSwgUGxhbm5lckhlbHBlci5jcmVhdGVPcHRpb25hbEluY2x1c2lvblJ1bGUoYTEpKTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEyLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4yLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQllbmdpbmUucGVyZm9ybShwcm9maWxlMywgbmV3IERlZmF1bHRQaGFzZVNldCgpLCBwbGFuMi5nZXRPcGVyYW5kcygpLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCJBMSBpcyBtaXNzaW5nIiwgcHJvZmlsZTMsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCWFzc2VydEVxdWFscyhwcm9maWxlMy5xdWVyeShJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCkuc2l6ZSgpLCAxKTsKLQotCQkvL0luc3RhbGwgYjEgKHRoaXMgc2hvdWxkIG5vdCBjaGFuZ2UgYW55dGhpbmcgZm9yIGExKQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEzID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUzKTsKLQkJcmVxMy5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2IxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjMgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMywgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuMy5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZTMsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbjMuZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQTEgb3IgQjEgaXMgbWlzc2luZyIsIHByb2ZpbGUzLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjF9KTsKLQkJYXNzZXJ0RXF1YWxzKHByb2ZpbGUzLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5zaXplKCksIDIpOwotCi0JCS8vUmVtb3ZlIHRoZSBhMSBhbmQgaXRzIGluY2x1c2lvbiBydWxlCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTUgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTMpOwotCQlyZXE1LnJlbW92ZUluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJcmVxNS5yZW1vdmVJbnN0YWxsYWJsZVVuaXRJbmNsdXNpb25SdWxlcyhhMSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjUgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxNSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuNS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZTMsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbjUuZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiYkIxIGlzIG1pc3NpbmciLCBwcm9maWxlMywgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YjF9KTsKLQkJYXNzZXJ0RXF1YWxzKHByb2ZpbGUzLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5zaXplKCksIDEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBZGRpdGlvbldpdGhJbmNsdXNpb25SdWxlKCkgewotCQlwcm9maWxlNCA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlNC4iICsgZ2V0TmFtZSgpKTsKLQkJLy9UcnkgdG8gSW5zdGFsbCBhMSBhbmQgYTIKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxNSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlNCk7Ci0JCXJlcTUuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYTJ9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuNSA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXE1LCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW41LmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCi0JCS8vSW5zdGFsbCBhMSBhbmQgYTIgbWFya2luZyBhMSBvcHRpb25hbCAKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGU0KTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGEyfSk7Ci0JCXJlcS5zZXRJbnN0YWxsYWJsZVVuaXRJbmNsdXNpb25SdWxlcyhhMSwgUGxhbm5lckhlbHBlci5jcmVhdGVPcHRpb25hbEluY2x1c2lvblJ1bGUoYTEpKTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQllbmdpbmUucGVyZm9ybShwcm9maWxlNCwgbmV3IERlZmF1bHRQaGFzZVNldCgpLCBwbGFuLmdldE9wZXJhbmRzKCksIG51bGwsIG51bGwpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkEyIGlzIG1pc3NpbmciLCBwcm9maWxlNCwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTJ9KTsKLQkJYXNzZXJ0RXF1YWxzKHByb2ZpbGU0LnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5zaXplKCksIDEpOwotCi0JCS8vTWFrZSBhMSBvcHRpb25hbCwgdGhpcyBpcyBhIG5vLW9wIHNpbmNlIGExIGlzIG5vdCBpbiB0aGUgc3lzdGVtCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTIgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTQpOwotCQlyZXEyLnNldEluc3RhbGxhYmxlVW5pdEluY2x1c2lvblJ1bGVzKGExLCBQbGFubmVySGVscGVyLmNyZWF0ZU9wdGlvbmFsSW5jbHVzaW9uUnVsZShhMSkpOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4yID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTIsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbjIuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGU0LCBuZXcgRGVmYXVsdFBoYXNlU2V0KCksIHBsYW4yLmdldE9wZXJhbmRzKCksIG51bGwsIG51bGwpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkEyIGlzIG1pc3NpbmciLCBwcm9maWxlNCwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTJ9KTsKLQkJYXNzZXJ0RXF1YWxzKHByb2ZpbGU0LnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5zaXplKCksIDEpOwotCi0JCS8vSW5zdGFsbCBhMSwgdGhpcyBpcyBleHBlY3RlZCB0byBmYWlsCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTMgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTQpOwotCQlyZXEzLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMyA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEzLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW4zLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL0luY2x1c2lvblJ1bGVUZXN0Mi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvSW5jbHVzaW9uUnVsZVRlc3QyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYTE1MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvSW5jbHVzaW9uUnVsZVRlc3QyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBJbmNsdXNpb25SdWxlVGVzdDIgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMjsKLQlJUHJvZmlsZSBwcm9maWxlOwotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSUVuZ2luZSBlbmdpbmU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCWNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjIuMC4wIiksIG51bGwsIE5PX1JFUVVJUkVTLCBOT19QUk9WSURFUywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgdHJ1ZSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVVwZGF0ZURlc2NyaXB0b3IoIkEiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgMCwgImZvbyBiYXIiKSk7Ci0JCWEyID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMi4wLjAiKSwgdHJ1ZSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBhMn0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQkJZW5naW5lID0gY3JlYXRlRW5naW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENoYW5nZUlVUHJvcGVydHkoKSB7Ci0JCS8vQWRkIGludG8gdGhlIHByb2ZpbGUgdGhlIHZlcnNpb24gYTE7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJcmVxLnNldEluc3RhbGxhYmxlVW5pdFByb2ZpbGVQcm9wZXJ0eShhMSwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BST0ZJTEVfUk9PVF9JVSwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4gPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbi5nZXRPcGVyYW5kcygpLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCJBMSBpcyBtaXNzaW5nIiwgcHJvZmlsZSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQotCQlJUHJvZmlsZVJlZ2lzdHJ5IHByb2ZpbGVSZWdpc3RyeSA9IChJUHJvZmlsZVJlZ2lzdHJ5KSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoVGVzdEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElQcm9maWxlUmVnaXN0cnkuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJcHJvZmlsZSA9IHByb2ZpbGVSZWdpc3RyeS5nZXRQcm9maWxlKHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpOwotCQlDb2xsZWN0b3IgYyA9IHByb2ZpbGUucXVlcnkobmV3IElVUHJvZmlsZVByb3BlcnR5UXVlcnkocHJvZmlsZSwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BST0ZJTEVfUk9PVF9JVSwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoYy5zaXplKCksIDEpOwotCi0JCVN5c3RlbS5nYygpOwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEyID0gUHJvZmlsZUNoYW5nZVJlcXVlc3QuY3JlYXRlQnlQcm9maWxlSWQocHJvZmlsZS5nZXRQcm9maWxlSWQoKSk7Ci0JCXJlcTIucmVtb3ZlSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlyZXEyLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTJ9KTsKLQkJLy8JCXJlcTIuc2V0SW5zdGFsbGFibGVVbml0UHJvZmlsZVByb3BlcnR5KGEyLCBJSW5zdGFsbGFibGVVbml0LlBST1BfUFJPRklMRV9ST09UX0lVLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjIgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuMi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIGEyKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZSwgbmV3IERlZmF1bHRQaGFzZVNldCgpLCBwbGFuMi5nZXRPcGVyYW5kcygpLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zKCJBMiBpcyBtaXNzaW5nIiwgcHJvZmlsZSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTJ9KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaW5pbWFsSW5zdGFsbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWluaW1hbEluc3RhbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQwNzYwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaW5pbWFsSW5zdGFsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSVBsYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE1pbmltYWxJbnN0YWxsIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCUlJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBjOwotCi0JSVByb2ZpbGUgcHJvZmlsZTsKLQlJUGxhbm5lciBwbGFubmVyOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIxIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMCkiKSwgbnVsbCkpOwotCi0JCWIxID0gY3JlYXRlSVUoIkIxIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCWIxMSA9IGNyZWF0ZUlVKCJCMSIsIG5ldyBWZXJzaW9uKCIxLjEuMCIpLCBjcmVhdGVSZXF1aXJlZENhcGFiaWxpdGllcyhJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDMuMC4wKSIpLCBudWxsKSwgTk9fUFJPUEVSVElFUywgdHJ1ZSk7Ci0KLQkJYyA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIHRydWUpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjEsIGIxMSwgY30pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsQTEoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdEZXBlbmRlbmN5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nRGVwZW5kZW5jeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzcxYWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdEZXBlbmRlbmN5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgTWlzc2luZ0RlcGVuZGVuY3kgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElQcm9maWxlIHByb2ZpbGU7Ci0JcHJpdmF0ZSBJUGxhbm5lciBwbGFubmVyOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQotCQkvL01pc3Npbmcgbm9uIG9wdGlvbmFsIGRlcGVuZGVuY3kKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsxXTsKLQkJcmVxWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXEpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjF9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbnRyYWRpY3Rpb24oKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nRGVwZW5kZW5jeTIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdEZXBlbmRlbmN5Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjQ2YzI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdEZXBlbmRlbmN5Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE1pc3NpbmdEZXBlbmRlbmN5MiBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlJSW5zdGFsbGFibGVVbml0IGIxOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFBID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsxXTsKLQkJcmVxQVswXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgcmVxQSk7Ci0KLQkJLy9NaXNzaW5nIG9wdGlvbmFsIGRlcGVuZGVuY3kKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsxXTsKLQkJcmVxWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHJlcSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29udHJhZGljdGlvbigpIHsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4gPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ0RlcGVuZGVuY3kzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nRGVwZW5kZW5jeTMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmMDUwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nRGVwZW5kZW5jeTMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBNaXNzaW5nRGVwZW5kZW5jeTMgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElQcm9maWxlIHByb2ZpbGU7Ci0JcHJpdmF0ZSBJUGxhbm5lciBwbGFubmVyOwotCi0JLy9UaGlzIHRlc3RzIHRoYXQgQSBjYW4gc3RpbGwgYmUgcmVzb2x2ZWQgYW5kIGluc3RhbGxlZAotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcUEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzFdOwotCQlyZXFBWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHJlcUEpOwotCi0JCS8vTWlzc2luZyBkZXBlbmRlbmN5Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcSA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbMV07Ci0JCXJlcVswXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgcmVxKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb250cmFkaWN0aW9uKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5XQVJOSU5HLCBwbGFuLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBhMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ05vbkdyZWVkeVJlcXVpcmVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nTm9uR3JlZWR5UmVxdWlyZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY0NjJhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nTm9uR3JlZWR5UmVxdWlyZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBNaXNzaW5nTm9uR3JlZWR5UmVxdWlyZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGMxOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCWMxID0gY3JlYXRlSVUoIkMiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxQiA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbMl07Ci0JCXJlcUJbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJcmVxQlsxXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFCKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBjMX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbCgpIHsKLQkJLy9UaGUgcGxhbm5lciByZXR1cm5zIGFuIGVycm9yIGJlY2F1c2UgdGhlIHJlcXVpcmVtZW50IGZyb20gQSBvbiBCIGlzIG5vbiBncmVlZHkgYW5kIG5vIG9uZSBicmluZ3MgaW4gQgotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nTm9uR3JlZWR5UmVxdWlyZW1lbnQyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nTm9uR3JlZWR5UmVxdWlyZW1lbnQyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMTM0NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ05vbkdyZWVkeVJlcXVpcmVtZW50Mi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE1pc3NpbmdOb25HcmVlZHlSZXF1aXJlbWVudDIgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JcHJpdmF0ZSBJUHJvZmlsZSBwcm9maWxlOwotCXByaXZhdGUgSVBsYW5uZXIgcGxhbm5lcjsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWMxID0gY3JlYXRlSVUoIkMiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxQiA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbMl07Ci0JCXJlcUJbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLQkJcmVxQlsxXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFCKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGMxfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsKCkgewotCQkvL1RoZSBwbGFubmVyIHJldHVybnMgYW4gZXJyb3IgYmVjYXVzZSB0aGUgcmVxdWlyZW1lbnQgZnJvbSBBIG9uIEIgaXMgbm9uIGdyZWVkeSBhbmQgbm8gb25lIGJyaW5ncyBpbiBCLgotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nT3B0aW9uYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdPcHRpb25hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjdhZTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdPcHRpb25hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE1pc3NpbmdPcHRpb25hbCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgZDsKLQlwcml2YXRlIElQcm9maWxlIHByb2ZpbGU7Ci0JcHJpdmF0ZSBJUGxhbm5lciBwbGFubmVyOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzNdOwotCQlyZXFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlyZXFbMV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXJlcVsyXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJZCA9IGNyZWF0ZUlVKCJEIiwgcmVxKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBkfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsYXRpb24oKSB7Ci0JCS8vRW5zdXJlIHRoYXQgRCdzIGluc3RhbGxhdGlvbiBkb2VzIG5vdCBmYWlsIGJlY2F1c2Ugb2YgQydzIGFic2VuY2UKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtkfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBiMSk7IC8vVEhJUyBNYXkgbm90IGJlIGluCi0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdPcHRpb25hbE5vbkdyZWVkeVJlcXVpcmVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nT3B0aW9uYWxOb25HcmVlZHlSZXF1aXJlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjlhOWI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdPcHRpb25hbE5vbkdyZWVkeVJlcXVpcmVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgTWlzc2luZ09wdGlvbmFsTm9uR3JlZWR5UmVxdWlyZW1lbnQgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JcHJpdmF0ZSBJUHJvZmlsZSBwcm9maWxlOwotCXByaXZhdGUgSVBsYW5uZXIgcGxhbm5lcjsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxQiA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbMV07Ci0JCXJlcUJbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHJlcUIpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjF9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB7Ci0JCS8vVGhlIHBsYW4gZG9lcyBub3QgY29udGFpbnMgQiBiZWNhdXNlIHRoZSByZXF1aXJlbWVudCBmcm9tIEEgb24gQiBpcyBub24gZ3JlZWR5IGFuZCBubyBvbmUgYnJpbmdzIGluIEIKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4gPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGExKTsKLQkJYXNzZXJ0Tm9PcGVyYW5kKHBsYW4sIGIxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nT3B0aW9uYWxXaXRoRGVwZW5kZW5jaWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NaXNzaW5nT3B0aW9uYWxXaXRoRGVwZW5kZW5jaWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZGZkYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ09wdGlvbmFsV2l0aERlcGVuZGVuY2llcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE1pc3NpbmdPcHRpb25hbFdpdGhEZXBlbmRlbmNpZXMgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGQ7Ci0JcHJpdmF0ZSBJUHJvZmlsZSBwcm9maWxlOwotCXByaXZhdGUgSVBsYW5uZXIgcGxhbm5lcjsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJLy9CJ3MgZGVwZW5kZW5jeSBpcyBtaXNzaW5nCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcUIgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzJdOwotCQlyZXFCWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQlyZXFCWzFdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFCKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzJdOwotCQlyZXFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlyZXFbMV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlkID0gY3JlYXRlSVUoIkQiLCByZXEpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjEsIGR9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxhdGlvbigpIHsKLQkJLy9FbnN1cmUgdGhhdCBEJ3MgaW5zdGFsbGF0aW9uIGRvZXMgbm90IGZhaWwgYmVjYXVzZSBvZiBDJ3MgYWJzZW5jZQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2R9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBhMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGIxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ09wdGlvbmFsV2l0aERlcGVuZGVuY2llczIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdPcHRpb25hbFdpdGhEZXBlbmRlbmNpZXMyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYjk2ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ09wdGlvbmFsV2l0aERlcGVuZGVuY2llczIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBNaXNzaW5nT3B0aW9uYWxXaXRoRGVwZW5kZW5jaWVzMiBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGMyOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBkOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCQljMSA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCQljMiA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oIjIuMC4wIiksIHRydWUpOwotCi0JCS8vQidzIGRlcGVuZGVuY3kgb24gQyBjYW4gbm90IGJlIHNhdGlzZmllZAotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFCID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsyXTsKLQkJcmVxQlswXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjAuMF0iKSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQlyZXFCWzFdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFCKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzNdOwotCQlyZXFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlyZXFbMV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlyZXFbMl0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQyIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsyLjAuMCwgMi4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCWQgPSBjcmVhdGVJVSgiRCIsIHJlcSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgYzEsIGMyLCBkfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsYXRpb24oKSB7Ci0JCS8vRW5zdXJlIHRoYXQgRCdzIGluc3RhbGxhdGlvbiBkb2VzIG5vdCBmYWlsIGJlY2F1c2Ugb2YgQydzIGFic2VuY2UKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtkfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgZCk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGExKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYjEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBjMik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ09wdGlvbmFsV2l0aERlcGVuZGVuY2llczMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL01pc3NpbmdPcHRpb25hbFdpdGhEZXBlbmRlbmNpZXMzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlNDI3ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTWlzc2luZ09wdGlvbmFsV2l0aERlcGVuZGVuY2llczMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBNaXNzaW5nT3B0aW9uYWxXaXRoRGVwZW5kZW5jaWVzMyBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGMyOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBkOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCQljMSA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCQljMiA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oIjIuMC4wIiksIHRydWUpOwotCi0JCS8vQidzIGRlcGVuZGVuY3kgb24gQyBjYW4gbm90IGJlIHNhdGlzZmllZAotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFCID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsyXTsKLQkJcmVxQlswXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjAuMF0iKSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQlyZXFCWzFdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFCKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzNdOwotCQlyZXFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQlyZXFbMV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXJlcVsyXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAyLjAuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJZCA9IGNyZWF0ZUlVKCJEIiwgcmVxKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBjMSwgYzIsIGR9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxhdGlvbigpIHsKLQkJLy9FbnN1cmUgdGhhdCBEJ3MgaW5zdGFsbGF0aW9uIGRvZXMgbm90IGZhaWwgYmVjYXVzZSBvZiBDJ3MgYWJzZW5jZQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2R9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBhMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGIxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgZCk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGMyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NdWx0aXBsZVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NdWx0aXBsZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMzg3YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTXVsdGlwbGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSVBsYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE11bHRpcGxlUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlJSW5zdGFsbGFibGVVbml0IGIxMTsKLQlJSW5zdGFsbGFibGVVbml0IGIxMjsKLQlJSW5zdGFsbGFibGVVbml0IGIxMzsKLQlJSW5zdGFsbGFibGVVbml0IGIxNDsKLQotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCMSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIG51bGwpKTsKLQotCQliMSA9IGNyZWF0ZUlVKCJCMSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQotCQliMTEgPSBjcmVhdGVJVSgiQjEiLCBuZXcgVmVyc2lvbigiMS4xLjAiKSwgdHJ1ZSk7Ci0KLQkJYjEyID0gY3JlYXRlSVUoIkIxIiwgbmV3IFZlcnNpb24oIjEuMi4wIiksIHRydWUpOwotCi0JCWIxMyA9IGNyZWF0ZUlVKCJCMSIsIG5ldyBWZXJzaW9uKCIxLjMuMCIpLCB0cnVlKTsKLQotCQliMTQgPSBjcmVhdGVJVSgiQjEiLCBuZXcgVmVyc2lvbigiMS40LjAiKSwgdHJ1ZSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgYjExLCBiMTIsIGIxMywgYjE0fSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL011bHRpcGxlU2luZ2xldG9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9NdWx0aXBsZVNpbmdsZXRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2FjODRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL011bHRpcGxlU2luZ2xldG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSVBsYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm9maWxlQ2hhbmdlUmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE11bHRpcGxlU2luZ2xldG9uIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCUlJbnN0YWxsYWJsZVVuaXQgYTI7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMzsKLQlJSW5zdGFsbGFibGVVbml0IGE0OwotCUlJbnN0YWxsYWJsZVVuaXQgdSwgdiwgdywgeCwgeSwgejsKLQotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJYTIgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIyLjAuMCIpLCB0cnVlKTsKLQotCQlhMyA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjMuMC4wIiksIGZhbHNlKTsKLQotCQlhNCA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjQuMC4wIiksIGZhbHNlKTsKLQotCQl4ID0gY3JlYXRlSVUoIlgiLCBuZXcgVmVyc2lvbigyLCAwLCAwKSwgY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXRpZXMoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCA0LjEuMCkiKSwgbnVsbCkpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjMSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjAuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGMyID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMi4wLjAsIDIuMC4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQl5ID0gY3JlYXRlSVUoIlkiLCBuZXcgVmVyc2lvbigyLCAwLCAwKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtjMSwgYzJ9KTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHkgYzMgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlszLjAuMCwgMy4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjNCA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzQuMC4wLCA0LjAuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJeiA9IGNyZWF0ZUlVKCJaIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7YzMsIGM0fSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGM1ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMC4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQlSZXF1aXJlZENhcGFiaWxpdHkgYzYgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlszLjAuMCwgMy4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCXcgPSBjcmVhdGVJVSgiVyIsIG5ldyBWZXJzaW9uKDIsIDAsIDApLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge2M1LCBjNn0pOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjNyA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAyLjAuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGM4ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMy4wLjAsIDQuMC4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UpOwotCQl2ID0gY3JlYXRlSVUoIlYiLCBuZXcgVmVyc2lvbigyLCAwLCAwKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtjN30pOwotCQl1ID0gY3JlYXRlSVUoIlUiLCBuZXcgVmVyc2lvbigyLCAwLCAwKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtjOH0pOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYTIsIGEzLCBhNCwgdywgeCwgeSwgen0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS5NdWx0aXBsZVNpbmdsZXRvbiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCi0JfQotCi0JcHVibGljIHZvaWQgdGVzdDEoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7eH0pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCkuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDIoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7eX0pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCkuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDMoKSB7Ci0JCS8vVGVzdCB0aGF0IHdlIGNhbiBpbnN0YWxsIEEzIGFuZCBBNCB0b2dldGhlcgotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3p9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Q0KCkgewotCQkvL0Vuc3VyZSB0aGF0IEExIGFuZCBBMyBjYW4ndCBiZSBpbnN0YWxsZWQgdG9nZXRoZXIgc2luY2Ugb25lIGlzIHNpbmdsZXRvbiBhbmQgdGhlIG90aGVyIG5vdAotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3d9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3Q1YigpIHsKLQkJLy9WYWxpZGF0ZSB0aGUgc2V0dXAKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt1fSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0NWMoKSB7Ci0JCS8vVmFsaWRhdGUgdGhlIHNldHVwCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7dn0pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCkuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdDUoKSB7Ci0JCS8vRW5zdXJlCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7dSwgdn0pOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcSwgbnVsbCwgbnVsbCkuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTm9SZXF1aXJlbWVudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL05vUmVxdWlyZW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3MDdmMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvTm9SZXF1aXJlbWVudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JUGxhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLlByb2ZpbGVDaGFuZ2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgTm9SZXF1aXJlbWVudHMgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0KLQlJUGxhbm5lciBwbGFubmVyOwotCUlQcm9maWxlIHByb2ZpbGU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIGNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0aWVzKElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4wLjBdIiksIG51bGwpKTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKE5vUmVxdWlyZW1lbnRzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk3ZTA1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9QYXRjaFRlc3QxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaFRlc3QxIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCUlJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JSUluc3RhbGxhYmxlVW5pdFBhdGNoIHAxOwotCi0JSVByb2ZpbGUgcHJvZmlsZTE7Ci0JSVBsYW5uZXIgcGxhbm5lcjsKLQlJRW5naW5lIGVuZ2luZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjApIiksIG51bGwsIGZhbHNlLCB0cnVlKX0pOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oMSwgMiwgMCksIHRydWUpOwotCQlSZXF1aXJlbWVudENoYW5nZSBjaGFuZ2UgPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMS4wLCAxLjMuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCXAxID0gY3JlYXRlSVVQYXRjaCgiUCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlLCBuZXcgUmVxdWlyZW1lbnRDaGFuZ2VbXSB7Y2hhbmdlfSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10ge3tNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UpfX0sIG51bGwpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjEsIHAxfSk7Ci0KLQkJcHJvZmlsZTEgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQkJZW5naW5lID0gY3JlYXRlRW5naW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQlyZXExLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIHAxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjEgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLldBUk5JTkcsIHBsYW4xLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDEwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9QYXRjaFRlc3QxMC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODRlMWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDEwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaFRlc3QxMCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlJSW5zdGFsbGFibGVVbml0IGIxOwotCUlJbnN0YWxsYWJsZVVuaXQgYjI7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMzsKLQlJSW5zdGFsbGFibGVVbml0UGF0Y2ggcDE7Ci0JSUluc3RhbGxhYmxlVW5pdFBhdGNoIHBwMTsKLQotCUlQcm9maWxlIHByb2ZpbGUxOwotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSUVuZ2luZSBlbmdpbmU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMS4wKSIpLCBudWxsLCBmYWxzZSwgdHJ1ZSl9KTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKDEsIDAsIDApLCB0cnVlKTsKLQkJYjIgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKDEsIDIsIDApLCB0cnVlKTsKLQkJYjMgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKDEsIDMsIDApLCB0cnVlKTsKLQkJUmVxdWlyZW1lbnRDaGFuZ2UgY2hhbmdlID0gbmV3IFJlcXVpcmVtZW50Q2hhbmdlKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjIuMCwgMS4yLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotCQlwMSA9IGNyZWF0ZUlVUGF0Y2goIlAiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSwgbmV3IFJlcXVpcmVtZW50Q2hhbmdlW10ge2NoYW5nZX0sIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHt7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlKX19LCBudWxsKTsKLQotCQlSZXF1aXJlbWVudENoYW5nZSBhbm90aGVyQ2hhbmdlQiA9IG5ldyBSZXF1aXJlbWVudENoYW5nZShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4zLjAsIDEuMy4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLQkJcHAxID0gY3JlYXRlSVVQYXRjaCgiUFAiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSwgbmV3IFJlcXVpcmVtZW50Q2hhbmdlW10ge2Fub3RoZXJDaGFuZ2VCfSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10ge3tNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UpfX0sIG51bGwpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjEsIGIyLCBiMywgcDEsIHBwMX0pOwotCi0JCXByb2ZpbGUxID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JCWVuZ2luZSA9IGNyZWF0ZUVuZ2luZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RDb25mbGljdGluZ1BhdGNoZXMoKSB7Ci0JCS8vYTEgYW5kIHAxIGNhbiBiZSBpbnN0YWxsZWQgdG9nZXRoZXIgIAotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXExID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxMS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBwMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4xID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbjEuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4xLCBhMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4xLCBwMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4xLCBiMik7Ci0KLQkJLy9hMSBhbmQgcHAxIGNhbiBiZSBpbnN0YWxsZWQgdG9nZXRoZXIKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMiA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTIuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgcHAxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjIgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuMi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIGExKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIHBwMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4yLCBiMyk7Ci0KLQkJLy9hMSwgcDEsIGFuZCBwcDEgY2FuIG5vdCBiZSBpbnN0YWxsZWQgdG9nZXRoZXIKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMyA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTMuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgcDEsIHBwMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4zID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTMsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbjMuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0MTEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDExLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYzEwMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0MTEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSUVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFBhdGNoVGVzdDExIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCUlJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMjsKLQlJSW5zdGFsbGFibGVVbml0UGF0Y2ggcDE7Ci0KLQlJUHJvZmlsZSBwcm9maWxlMTsKLQlJUGxhbm5lciBwbGFubmVyOwotCUlFbmdpbmUgZW5naW5lOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjEuMCkiKSwgbnVsbCwgZmFsc2UsIHRydWUsIHRydWUpfSk7Ci0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgdHJ1ZSk7Ci0JCWIyID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigxLCAyLCAwKSwgdHJ1ZSk7Ci0JCVJlcXVpcmVtZW50Q2hhbmdlIGNoYW5nZSA9IG5ldyBSZXF1aXJlbWVudENoYW5nZShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4xLjAsIDEuMy4wKSIpLCAiZm9vPWJhciIsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotCQlwMSA9IGNyZWF0ZUlVUGF0Y2goIlAiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSwgbmV3IFJlcXVpcmVtZW50Q2hhbmdlW10ge2NoYW5nZX0sIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHt7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlKX19LCBudWxsKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBiMiwgcDF9KTsKLQotCQlwcm9maWxlMSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCQllbmdpbmUgPSBjcmVhdGVFbmdpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbEJvZ3VzSW5zdGFsbEZpbHRlckluUGF0Y2goKSB7Ci0JCS8vVmVyaWZ5IHRoYXQgYTEgaW5zdGFsbHMgcHJvcGVybHkKLQkJLy8JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQkvLwkJcmVxMS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCS8vCQlQcm92aXNpb25pbmdQbGFuIHBsYW4xID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTEsIG51bGwsIG51bGwpOwotCQkvLwkJYXNzZXJ0VHJ1ZShJU3RhdHVzLkVSUk9SICE9IHBsYW4xLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQkvLwkJYXNzZXJ0Tm9PcGVyYW5kKHBsYW4xLCBwMSk7Ci0JCS8vCQlhc3NlcnROb09wZXJhbmQocGxhbjEsIGIyKTsKLQkJLy8JCWFzc2VydE5vT3BlcmFuZChwbGFuMSwgcDEpOwotCQkvLwkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjEsIGExKTsKLQkJLy8JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4xLCBiMSk7Ci0KLQkJLy9UcnkgdG8gaW5zdGFsbCBhMSBhbmQgcDEgb3B0aW9uYWxseQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEyID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxMi5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBwMX0pOwotCQlyZXEyLnNldEluc3RhbGxhYmxlVW5pdEluY2x1c2lvblJ1bGVzKHAxLCBQbGFubmVySGVscGVyLmNyZWF0ZU9wdGlvbmFsSW5jbHVzaW9uUnVsZShwMSkpOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4yID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTIsIG51bGwsIG51bGwpOwotCQlhc3NlcnRUcnVlKElTdGF0dXMuRVJST1IgIT0gcGxhbjIuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydE5vT3BlcmFuZChwbGFuMiwgcDEpOwotCQlhc3NlcnROb09wZXJhbmQocGxhbjIsIGIyKTsKLQkJYXNzZXJ0Tm9PcGVyYW5kKHBsYW4yLCBwMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4yLCBhMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4yLCBiMSk7Ci0KLQkJLy9UcnkgdG8gaW5zdGFsbCBhMSBhbmQgcDEuIFRoaXMgc2hvdWxkIGZhaWwgYmVjYXVzZSB0aGUgcGF0Y2ggYWRkcyBhbiBpbnZhbGlkIGZpbHRlciAKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMyA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTMuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgcDF9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMyA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEzLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShJU3RhdHVzLkVSUk9SID09IHBsYW4zLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0MTIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDEyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMzcwNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0MTIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSUVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFBhdGNoVGVzdDEyIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCUlJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMjsKLQlJSW5zdGFsbGFibGVVbml0UGF0Y2ggcDE7Ci0KLQlJUHJvZmlsZSBwcm9maWxlMTsKLQlJUGxhbm5lciBwbGFubmVyOwotCUlFbmdpbmUgZW5naW5lOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjEuMCkiKSwgbnVsbCwgZmFsc2UsIHRydWUsIHRydWUpfSk7Ci0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgdHJ1ZSk7Ci0JCWIyID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigxLCAyLCAwKSwgdHJ1ZSk7Ci0JCVJlcXVpcmVtZW50Q2hhbmdlIGNoYW5nZSA9IG5ldyBSZXF1aXJlbWVudENoYW5nZShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS40LjAsIDEuNS4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLQkJcDEgPSBjcmVhdGVJVVBhdGNoKCJQIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUsIG5ldyBSZXF1aXJlbWVudENoYW5nZVtdIHtjaGFuZ2V9LCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W11bXSB7e01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSl9fSwgbnVsbCk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgYjIsIHAxfSk7Ci0KLQkJcHJvZmlsZTEgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQkJZW5naW5lID0gY3JlYXRlRW5naW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxCb2d1c0luc3RhbGxGaWx0ZXJJblBhdGNoKCkgewotCQkvL1ZlcmlmeSB0aGF0IGExIGluc3RhbGxzIHByb3Blcmx5Ci0JCS8vCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXExID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJLy8JCXJlcTEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQkvLwkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMSA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXExLCBudWxsLCBudWxsKTsKLQkJLy8JCWFzc2VydFRydWUoSVN0YXR1cy5FUlJPUiAhPSBwbGFuMS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJLy8JCWFzc2VydE5vT3BlcmFuZChwbGFuMSwgcDEpOwotCQkvLwkJYXNzZXJ0Tm9PcGVyYW5kKHBsYW4xLCBiMik7Ci0JCS8vCQlhc3NlcnROb09wZXJhbmQocGxhbjEsIHAxKTsKLQkJLy8JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4xLCBhMSk7Ci0JCS8vCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMSwgYjEpOwotCi0JCS8vVHJ5IHRvIGluc3RhbGwgYTEgYW5kIHAxIG9wdGlvbmFsbHkKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMiA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTIuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgcDF9KTsKLQkJcmVxMi5zZXRJbnN0YWxsYWJsZVVuaXRJbmNsdXNpb25SdWxlcyhwMSwgUGxhbm5lckhlbHBlci5jcmVhdGVPcHRpb25hbEluY2x1c2lvblJ1bGUocDEpKTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEyLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShJU3RhdHVzLkVSUk9SICE9IHBsYW4yLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnROb09wZXJhbmQocGxhbjIsIHAxKTsKLQkJYXNzZXJ0Tm9PcGVyYW5kKHBsYW4yLCBiMik7Ci0JCWFzc2VydE5vT3BlcmFuZChwbGFuMiwgcDEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMiwgYTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMiwgYjEpOwotCi0JCS8vVHJ5IHRvIGluc3RhbGwgYTEgYW5kIHAxLiBUaGlzIHNob3VsZCBmYWlsIGJlY2F1c2UgdGhlIHBhdGNoIGFkZHMgYW4gaW52YWxpZCBmaWx0ZXIgCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTMgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQlyZXEzLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIHAxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjMgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMywgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoSVN0YXR1cy5FUlJPUiA9PSBwbGFuMy5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDEzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9QYXRjaFRlc3QxMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzhhYWRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDEzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaFRlc3QxMyBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlJSW5zdGFsbGFibGVVbml0IGIxOwotCUlJbnN0YWxsYWJsZVVuaXQgZDE7Ci0JSUluc3RhbGxhYmxlVW5pdCBjMTsKLQlJSW5zdGFsbGFibGVVbml0UGF0Y2ggcDE7Ci0KLQlJUHJvZmlsZSBwcm9maWxlMTsKLQlJUGxhbm5lciBwbGFubmVyOwotCUlFbmdpbmUgZW5naW5lOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjEuMCkiKSwgbnVsbCwgZmFsc2UsIHRydWUpLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQyIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjApIiksIG51bGwsIGZhbHNlLCB0cnVlKX0pOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIHRydWUpOwotCQlkMSA9IGNyZWF0ZUlVKCJEIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIHRydWUpOwotCQljMSA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIHRydWUpOwotCQlSZXF1aXJlbWVudENoYW5nZSBjaGFuZ2UgPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJEIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjMuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCXAxID0gY3JlYXRlSVVQYXRjaCgiUCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlLCBuZXcgUmVxdWlyZW1lbnRDaGFuZ2VbXSB7Y2hhbmdlfSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10ge3tNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UpfX0sIG51bGwpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjEsIGMxLCBkMSwgcDF9KTsKLQotCQlwcm9maWxlMSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCQllbmdpbmUgPSBjcmVhdGVFbmdpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbCgpIHsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgcDF9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMSA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXExLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShJU3RhdHVzLkVSUk9SICE9IHBsYW4xLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDFiLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9QYXRjaFRlc3QxYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWZiZjU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaFRlc3QxYiBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlJSW5zdGFsbGFibGVVbml0IGIxOwotCUlJbnN0YWxsYWJsZVVuaXQgYjI7Ci0JSUluc3RhbGxhYmxlVW5pdFBhdGNoIHAxOwotCi0JSVByb2ZpbGUgcHJvZmlsZTE7Ci0JSVBsYW5uZXIgcGxhbm5lcjsKLQlJRW5naW5lIGVuZ2luZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjApIiksIG51bGwsIGZhbHNlLCB0cnVlKX0pOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIHRydWUpOwotCQliMiA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oMSwgMiwgMCksIHRydWUpOwotCQlSZXF1aXJlbWVudENoYW5nZSBjaGFuZ2UgPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMS4wLCAxLjMuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCXAxID0gY3JlYXRlSVVQYXRjaCgiUCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlLCBuZXcgUmVxdWlyZW1lbnRDaGFuZ2VbXSB7Y2hhbmdlfSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10ge3tNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UpfX0sIG51bGwpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjEsIGIyLCBwMX0pOwotCi0JCXByb2ZpbGUxID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JCWVuZ2luZSA9IGNyZWF0ZUVuZ2luZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXExID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxMS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBwMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4xID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRUcnVlKElTdGF0dXMuRVJST1IgIT0gcGxhbjEuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4xLCBhMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4xLCBwMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4xLCBiMik7Ci0JCWFzc2VydE5vT3BlcmFuZChwbGFuMSwgYjEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDFjLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9QYXRjaFRlc3QxYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmJiOTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDFjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaFRlc3QxYyBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlJSW5zdGFsbGFibGVVbml0IGIxOwotCUlJbnN0YWxsYWJsZVVuaXQgYjI7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMzsKLQlJSW5zdGFsbGFibGVVbml0UGF0Y2ggcDE7Ci0KLQlJUHJvZmlsZSBwcm9maWxlMTsKLQlJUGxhbm5lciBwbGFubmVyOwotCUlFbmdpbmUgZW5naW5lOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjEuMCkiKSwgbnVsbCwgZmFsc2UsIHRydWUpfSk7Ci0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgdHJ1ZSk7Ci0JCWIyID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigxLCAyLCAwKSwgdHJ1ZSk7Ci0JCWIzID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigxLCAzLCAwKSwgdHJ1ZSk7Ci0JCVJlcXVpcmVtZW50Q2hhbmdlIGNoYW5nZSA9IG5ldyBSZXF1aXJlbWVudENoYW5nZShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4yLjAsIDEuMi4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLQkJcDEgPSBjcmVhdGVJVVBhdGNoKCJQIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUsIG5ldyBSZXF1aXJlbWVudENoYW5nZVtdIHtjaGFuZ2V9LCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W11bXSB7e01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSl9fSwgbnVsbCk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgYjIsIHAxfSk7Ci0KLQkJcHJvZmlsZTEgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQkJZW5naW5lID0gY3JlYXRlRW5naW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB7Ci0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQlyZXExLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIHAxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjEgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoSVN0YXR1cy5FUlJPUiAhPSBwbGFuMS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjEsIGExKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjEsIHAxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjEsIGIyKTsKLQkJYXNzZXJ0Tm9PcGVyYW5kKHBsYW4xLCBiMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0Mi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0Mi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDc5NjU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSUVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFBhdGNoVGVzdDIgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlJSW5zdGFsbGFibGVVbml0UGF0Y2ggcDE7Ci0JSUluc3RhbGxhYmxlVW5pdFBhdGNoIHAyOwotCUlJbnN0YWxsYWJsZVVuaXRQYXRjaCBwMzsKLQlJSW5zdGFsbGFibGVVbml0UGF0Y2ggcDQ7Ci0JSUluc3RhbGxhYmxlVW5pdFBhdGNoIHA1OwotCUlJbnN0YWxsYWJsZVVuaXRQYXRjaCBwNjsKLQlJSW5zdGFsbGFibGVVbml0UGF0Y2ggcDc7Ci0KLQlJUHJvZmlsZSBwcm9maWxlMTsKLQlJUGxhbm5lciBwbGFubmVyOwotCUlFbmdpbmUgZW5naW5lOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gY2FwID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KCJmb28iLCAiYmFyIiwgbmV3IFZlcnNpb24oMSwgMCwgMCkpfTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBudWxsLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjEuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlKX0sIGNhcCwgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UsIG51bGwpOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oMSwgMiwgMCksIHRydWUpOwotCQlSZXF1aXJlbWVudENoYW5nZSBjaGFuZ2UgPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMS4wLCAxLjMuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCXAxID0gY3JlYXRlSVVQYXRjaCgiUCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlLCBuZXcgUmVxdWlyZW1lbnRDaGFuZ2VbXSB7Y2hhbmdlfSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10ge3tNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpfX0sIG51bGwpOwotCQlwMiA9IGNyZWF0ZUlVUGF0Y2goIlAiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSwgbmV3IFJlcXVpcmVtZW50Q2hhbmdlW10ge2NoYW5nZX0sIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHt7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4zLjAsIDEuNS4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKX19LCBudWxsKTsKLQkJcDMgPSBjcmVhdGVJVVBhdGNoKCJQIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUsIG5ldyBSZXF1aXJlbWVudENoYW5nZVtdIHtjaGFuZ2V9LCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W11bXSB7IHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpfSwge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMy4wLCAxLjUuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSl9fSwgbnVsbCk7Ci0JCXA0ID0gY3JlYXRlSVVQYXRjaCgiUCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlLCBuZXcgUmVxdWlyZW1lbnRDaGFuZ2VbXSB7Y2hhbmdlfSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10geyB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS42LjAsIDEuNy4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKX0sIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjMuMCwgMS41LjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpfX0sIG51bGwpOwotCQlwNSA9IGNyZWF0ZUlVUGF0Y2goIlAiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSwgbmV3IFJlcXVpcmVtZW50Q2hhbmdlW10ge2NoYW5nZX0sIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHt7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eSgiZm9vIiwgImJhciIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS41LjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpfX0sIG51bGwpOwotCQlwNiA9IGNyZWF0ZUlVUGF0Y2goIlAiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSwgbmV3IFJlcXVpcmVtZW50Q2hhbmdlW10ge2NoYW5nZX0sIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHt9LCBudWxsKTsKLQkJcDcgPSBjcmVhdGVJVVBhdGNoKCJQIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUsIG5ldyBSZXF1aXJlbWVudENoYW5nZVtdIHtjaGFuZ2V9LCBudWxsLCBudWxsKTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgcDEsIHAyLCBwMywgcDQsIHA1LCBwNn0pOwotCi0JCXByb2ZpbGUxID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JCWVuZ2luZSA9IGNyZWF0ZUVuZ2luZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RQYXRjaFNjb3BlKCkgewotCQkvL3A2IGFwcGxpZXMgdG8gYWxsIElVcyB0aGVyZWZvcmUgQSdzIGluc3RhbGxhdGlvbiBzdWNjZWVkCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTggPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQlyZXE4LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIHA2fSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjggPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxOCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLldBUk5JTkcsIHBsYW44LmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCi0JCS8vcDcgZG9lcyBub3QgYXBwbHkgdGhlcmVmb3JlIEEgc2hvdWxkIG5vdCBiZSBpbnN0YWxsYWJsZSAKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxNyA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTcuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgcDd9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuNyA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXE3LCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW43LmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCi0JCS8vcDUgZG9lcyBub3QgY2F1c2VzIGExIHRvIHJlc29sdmUgdGhlcmVmb3JlIHRoZSBhcHBsaWNhdGlvbiBmYWlscwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXE2ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxNi5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBwNX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW42ID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTYsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5XQVJOSU5HLCBwbGFuNi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQotCQkvL0Vuc3VyZSB0aGF0IHAxIGNhdXNlcyBhMSB0byByZXNvbHZlCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTIgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQlyZXEyLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIHAxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjIgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLldBUk5JTkcsIHBsYW4yLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCi0JCS8vcDIgZG9lcyBub3QgY2F1c2VzIGExIHRvIHJlc29sdmUgdGhlcmVmb3JlIHRoZSBhcHBsaWNhdGlvbiBmYWlscwotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEzID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxMy5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBwMn0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4zID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTMsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbjMuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0KLQkJLy9FbnN1cmUgdGhhdCBwMyBjYXVzZXMgYTEgdG8gcmVzb2x2ZSBzaW5jZSBpdCBoYXMgdHdvIHNjb3BlcyB3aGVyZSBvbmUgaXMgYXBwbGljYWJsZQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXE0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxNC5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBwM30pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW40ID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTQsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5XQVJOSU5HLCBwbGFuNC5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQotCQkvL3A0IGRvZXMgbm90IGNhdXNlcyBhMSB0byByZXNvbHZlIHRoZXJlZm9yZSB0aGUgYXBwbGljYXRpb24gZmFpbHMKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxNSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTUuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgcDR9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuNSA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXE1LCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW41LmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0My5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0My5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTM4M2Y1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaFRlc3QzIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGYxOwotCUlJbnN0YWxsYWJsZVVuaXQgZjI7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlJSW5zdGFsbGFibGVVbml0IGEzOwotCUlJbnN0YWxsYWJsZVVuaXQgYjEsIGIyOwotCUlJbnN0YWxsYWJsZVVuaXRQYXRjaCBwMTsKLQotCUlQcm9maWxlIHByb2ZpbGUxOwotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSUVuZ2luZSBlbmdpbmU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlmMSA9IGNyZWF0ZUlVKCJGIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMS4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpfSk7Ci0JCWYyID0gY3JlYXRlSVUoIkYiLCBuZXcgVmVyc2lvbigyLCAwLCAwKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlszLjAuMCwgNC4wLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSl9KTsKLQkJUHJvdmlkZWRDYXBhYmlsaXR5W10gY2FwID0gbmV3IFByb3ZpZGVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUHJvdmlkZWRDYXBhYmlsaXR5KCJmb28iLCAiYmFyIiwgbmV3IFZlcnNpb24oMSwgMCwgMCkpfTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBudWxsLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjEuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlKX0sIGNhcCwgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UsIG51bGwpOwotCQlhMyA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oMywgMCwgMCksIHRydWUpOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIHRydWUpOwotCQliMiA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIHRydWUpOwotCQlSZXF1aXJlbWVudENoYW5nZSBjaGFuZ2UgPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAyLjEuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBsaWZlQ3ljbGUgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiRiIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlwMSA9IGNyZWF0ZUlVUGF0Y2goIlAiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSwgbmV3IFJlcXVpcmVtZW50Q2hhbmdlW10ge2NoYW5nZX0sIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHt7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMS4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKX19LCBsaWZlQ3ljbGUpOwotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBiMiwgcDEsIGEzLCBmMSwgZjJ9KTsKLQotCQlwcm9maWxlMSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCQllbmdpbmUgPSBjcmVhdGVFbmdpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGVTY2VuYXJpbygpIHsKLQkJLy8JSW5zdGFsbCBhMQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXExID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxMS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjEgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuMS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjEsIGIxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjEsIGExKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjEsIGYxKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZTEsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbjEuZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQTEgaXMgbWlzc2luZyIsIHByb2ZpbGUxLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkIxIGlzIG1pc3NpbmciLCBwcm9maWxlMSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YjF9KTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCJCMSBpcyBtaXNzaW5nIiwgcHJvZmlsZTEsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxfSk7Ci0KLQkJLy9JbnN0YWxsIHAxLCB0aGlzIHNob3VsZCBjYXVzZSBiMSB0byBiZSB1bmluc3RhbGxlZCBhbmQgYjIgdG8gYmUgdXNlZCBpbnN0ZWFkCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTIgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQlyZXEyLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cDF9KTsKLQkJcmVxMi5zZXRJbnN0YWxsYWJsZVVuaXRJbmNsdXNpb25SdWxlcyhwMSwgUGxhbm5lckhlbHBlci5jcmVhdGVPcHRpb25hbEluY2x1c2lvblJ1bGUocDEpKTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEyLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShJU3RhdHVzLkVSUk9SICE9IHBsYW4yLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMiwgcDEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMiwgYjIpOwotCQllbmdpbmUucGVyZm9ybShwcm9maWxlMSwgbmV3IERlZmF1bHRQaGFzZVNldCgpLCBwbGFuMi5nZXRPcGVyYW5kcygpLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCJBMSBpcyBtaXNzaW5nIiwgcHJvZmlsZTEsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQjIgaXMgbWlzc2luZyIsIHByb2ZpbGUxLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtiMn0pOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIlAxIGlzIG1pc3NpbmciLCBwcm9maWxlMSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cDF9KTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCJQMSBpcyBtaXNzaW5nIiwgcHJvZmlsZTEsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxfSk7Ci0KLQkJLy9UcnkgdG8gdW5pbnN0YWxsIHAxLCB0aGlzIGNhdXNlcyBiMSB0byBjb21lIGJhY2sgYW5kIGIyIHRvIGdvIGF3YXkKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMyA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTMucmVtb3ZlSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtwMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4zID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTMsIG51bGwsIG51bGwpOwotCQlhc3NlcnRUcnVlKElTdGF0dXMuRVJST1IgIT0gcGxhbjMuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4zLCBiMSk7Ci0JCWFzc2VydFVuaW5zdGFsbE9wZXJhbmQocGxhbjMsIGIyKTsKLQkJYXNzZXJ0VW5pbnN0YWxsT3BlcmFuZChwbGFuMywgcDEpOwotCi0JCS8vVHJ5IHRvIHVuaW5zdGFsbCBmIHNob3VsZCBub3QgYmUgYmxvY2tlZCBieSBwMSBzaW5jZSBpdCBpcyBpbnN0YWxsZWQgb3B0aW9uYWxseQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXE0ID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxNC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjQgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxNCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoSVN0YXR1cy5FUlJPUiAhPSBwbGFuNC5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0VW5pbnN0YWxsT3BlcmFuZChwbGFuNCwgYjIpOwotCQlhc3NlcnRVbmluc3RhbGxPcGVyYW5kKHBsYW40LCBhMSk7Ci0JCWFzc2VydFVuaW5zdGFsbE9wZXJhbmQocGxhbjQsIGYxKTsKLQkJYXNzZXJ0VW5pbnN0YWxsT3BlcmFuZChwbGFuNCwgcDEpOwotCi0JCS8vdXBkYXRlIGZyb20gZjEgdG8gZjIuIFRoaXMgc2hvdWxkIGNhdXNlIHAxIHRvIGdvIGF3YXkKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxNSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTUucmVtb3ZlSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmMX0pOwotCQlyZXE1LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZjJ9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuNSA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXE1LCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShJU3RhdHVzLkVSUk9SICE9IHBsYW41LmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRVbmluc3RhbGxPcGVyYW5kKHBsYW41LCBiMik7Ci0JCWFzc2VydFVuaW5zdGFsbE9wZXJhbmQocGxhbjUsIGExKTsKLQkJYXNzZXJ0VW5pbnN0YWxsT3BlcmFuZChwbGFuNSwgZjEpOwotCQlhc3NlcnRVbmluc3RhbGxPcGVyYW5kKHBsYW41LCBwMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW41LCBmMik7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW41LCBhMyk7Ci0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUxLCBuZXcgRGVmYXVsdFBoYXNlU2V0KCksIHBsYW41LmdldE9wZXJhbmRzKCksIG51bGwsIG51bGwpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIiIsIHByb2ZpbGUxLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmMiwgYTN9KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0NC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0NC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmI0NWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaFRlc3Q0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGYxOwotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlJSW5zdGFsbGFibGVVbml0IGIyOwotCUlJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JSUluc3RhbGxhYmxlVW5pdCBkMTsKLQlJSW5zdGFsbGFibGVVbml0IGQyOwotCi0JSUluc3RhbGxhYmxlVW5pdFBhdGNoIHAxOwotCUlJbnN0YWxsYWJsZVVuaXRQYXRjaCBwMjsKLQotCUlQcm9maWxlIHByb2ZpbGUxOwotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSUVuZ2luZSBlbmdpbmU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQlmMSA9IGNyZWF0ZUlVKCJGIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKX0pOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMS4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpfSk7Ci0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgdHJ1ZSk7Ci0JCWMxID0gY3JlYXRlSVUoIkMiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiRCIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSl9KTsKLQkJZDEgPSBjcmVhdGVJVSgiRCIsIG5ldyBWZXJzaW9uKDEsIDAsIDApLCB0cnVlKTsKLQkJYjIgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKDIsIDAsIDApLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJEIiwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAzLjEuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKX0pOwotCQlkMiA9IGNyZWF0ZUlVKCJEIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIHRydWUpOwotCi0JCVJlcXVpcmVtZW50Q2hhbmdlIGNoYW5nZUEgPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAyLjEuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCVJlcXVpcmVtZW50Q2hhbmdlIGNoYW5nZUMgPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkQiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJEIiwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAyLjEuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGxpZmVDeWNsZSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJGIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHNjb3BlID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10geyB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMS4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKX0sIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQyIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpfX07Ci0JCXAxID0gY3JlYXRlSVVQYXRjaCgiUCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlLCBuZXcgUmVxdWlyZW1lbnRDaGFuZ2VbXSB7Y2hhbmdlQSwgY2hhbmdlQ30sIHNjb3BlLCBsaWZlQ3ljbGUpOwotCQlwMiA9IGNyZWF0ZUlVUGF0Y2goIlAiLCBuZXcgVmVyc2lvbigiMi4wLjAiKSwgdHJ1ZSwgbmV3IFJlcXVpcmVtZW50Q2hhbmdlW10ge2NoYW5nZUEsIGNoYW5nZUN9LCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzBdWzBdLCBsaWZlQ3ljbGUpOwotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZjEsIGExLCBiMSwgYjIsIGMxLCBkMSwgZDIsIHAxfSk7Ci0KLQkJcHJvZmlsZTEgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQkJZW5naW5lID0gY3JlYXRlRW5naW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdENvbXBsZXRlU2NlbmFyaW8oKSB7Ci0JCS8vCUluc3RhbGwgZjEKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4xID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbjEuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4xLCBiMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4xLCBhMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4xLCBmMSk7Ci0JCWVuZ2luZS5wZXJmb3JtKHByb2ZpbGUxLCBuZXcgRGVmYXVsdFBoYXNlU2V0KCksIHBsYW4xLmdldE9wZXJhbmRzKCksIG51bGwsIG51bGwpOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkExIGlzIG1pc3NpbmciLCBwcm9maWxlMSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTF9KTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCJCMSBpcyBtaXNzaW5nIiwgcHJvZmlsZTEsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2IxfSk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQzEgaXMgbWlzc2luZyIsIHByb2ZpbGUxLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtjMX0pOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkQxIGlzIG1pc3NpbmciLCBwcm9maWxlMSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZDF9KTsKLQotCQkvL0luc3RhbGwgcDEsIHRoaXMgd2lsbCBjYXVzZSBDMiBhbmQgRDIgdG8gYmUgaW5zdGFsbGVkCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTIgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQlyZXEyLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cDF9KTsKLQkJcmVxMi5zZXRJbnN0YWxsYWJsZVVuaXRJbmNsdXNpb25SdWxlcyhwMSwgUGxhbm5lckhlbHBlci5jcmVhdGVPcHRpb25hbEluY2x1c2lvblJ1bGUocDEpKTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEyLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0VHJ1ZShJU3RhdHVzLkVSUk9SICE9IHBsYW4yLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMiwgYjIpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMiwgZDIpOwotCQllbmdpbmUucGVyZm9ybShwcm9maWxlMSwgbmV3IERlZmF1bHRQaGFzZVNldCgpLCBwbGFuMi5nZXRPcGVyYW5kcygpLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCJBMSBpcyBtaXNzaW5nIiwgcHJvZmlsZTEsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExfSk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQjIgaXMgbWlzc2luZyIsIHByb2ZpbGUxLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtiMn0pOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIlAxIGlzIG1pc3NpbmciLCBwcm9maWxlMSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7cDF9KTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCJDMSBpcyBtaXNzaW5nIiwgcHJvZmlsZTEsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2MxfSk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiRDIgaXMgbWlzc2luZyIsIHByb2ZpbGUxLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtkMn0pOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkYxIGlzIG1pc3NpbmciLCBwcm9maWxlMSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZjF9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBPZmZ0ZXN0Q29tcGxldGVTY2VuYXJpbzIoKSB7Ci0JCS8vVGhpcyB0ZXN0IHdoZW4gbm8gc2NvcGVzIGFyZSBzcGVjaWZpZWQKLQkJLy8JSW5zdGFsbCBmMQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXExID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxMS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjEgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuMS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjEsIGIxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjEsIGExKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjEsIGYxKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZTEsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbjEuZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQTEgaXMgbWlzc2luZyIsIHByb2ZpbGUxLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkIxIGlzIG1pc3NpbmciLCBwcm9maWxlMSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YjF9KTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCJDMSBpcyBtaXNzaW5nIiwgcHJvZmlsZTEsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2MxfSk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiRDEgaXMgbWlzc2luZyIsIHByb2ZpbGUxLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtkMX0pOwotCi0JCS8vSW5zdGFsbCBwMiwgdGhpcyBzaG91bGQgY2F1c2UgYjEgdG8gYmUgdW5pbnN0YWxsZWQgYW5kIGIyIHRvIGJlIHVzZWQgaW5zdGVhZAotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEyID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxMi5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3AyfSk7Ci0JCXJlcTIuc2V0SW5zdGFsbGFibGVVbml0SW5jbHVzaW9uUnVsZXMocDEsIFBsYW5uZXJIZWxwZXIuY3JlYXRlT3B0aW9uYWxJbmNsdXNpb25SdWxlKHAxKSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjIgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFRydWUoSVN0YXR1cy5FUlJPUiAhPSBwbGFuMi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIGIyKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIGQyKTsKLQkJZW5naW5lLnBlcmZvcm0ocHJvZmlsZTEsIG5ldyBEZWZhdWx0UGhhc2VTZXQoKSwgcGxhbjIuZ2V0T3BlcmFuZHMoKSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQTEgaXMgbWlzc2luZyIsIHByb2ZpbGUxLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkIyIGlzIG1pc3NpbmciLCBwcm9maWxlMSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YjJ9KTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCJQMSBpcyBtaXNzaW5nIiwgcHJvZmlsZTEsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3AxfSk7Ci0JCWFzc2VydFByb2ZpbGVDb250YWluc0FsbCgiQzEgaXMgbWlzc2luZyIsIHByb2ZpbGUxLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtjMX0pOwotCQlhc3NlcnRQcm9maWxlQ29udGFpbnNBbGwoIkQyIGlzIG1pc3NpbmciLCBwcm9maWxlMSwgbmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZDJ9KTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCJGMSBpcyBtaXNzaW5nIiwgcHJvZmlsZTEsIG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0NS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0NS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2JlYTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSUVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFBhdGNoVGVzdDUgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBmMTsKLQlJSW5zdGFsbGFibGVVbml0IHRvcDsKLQlJSW5zdGFsbGFibGVVbml0IGIxOwotCUlJbnN0YWxsYWJsZVVuaXRQYXRjaCBwMTsKLQotCUlQcm9maWxlIHByb2ZpbGUxOwotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSUVuZ2luZSBlbmdpbmU7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQl0b3AgPSBjcmVhdGVJVSgiVE9QIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkYiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMC4wXSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpfSk7Ci0JCWYxID0gY3JlYXRlSVUoIkYiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSl9KTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjEuMCkiKSwgbnVsbCwgZmFsc2UsIHRydWUpfSk7Ci0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigxLCAyLCAwKSwgdHJ1ZSk7Ci0JCVJlcXVpcmVtZW50Q2hhbmdlIGNoYW5nZSA9IG5ldyBSZXF1aXJlbWVudENoYW5nZShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4xLjAsIDEuMy4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5IGxpZmVDeWNsZSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJGIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjAuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W11bXSBzY29wZSA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHt7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsMS4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSl9fTsKLQkJcDEgPSBjcmVhdGVJVVBhdGNoKCJQIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUsIG5ldyBSZXF1aXJlbWVudENoYW5nZVtdIHtjaGFuZ2V9LCBzY29wZSwgbGlmZUN5Y2xlKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxLCBmMSwgdG9wLCBwMX0pOwotCi0JCXByb2ZpbGUxID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JCWVuZ2luZSA9IGNyZWF0ZUVuZ2luZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXExID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxMS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3RvcH0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4xID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbjEuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0KLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMiA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTIuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt0b3AsIHAxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjIgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLldBUk5JTkcsIHBsYW4yLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0ZDEzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9QYXRjaFRlc3Q2LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaFRlc3Q2IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCUlJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JSUluc3RhbGxhYmxlVW5pdCBjMTsKLQlJSW5zdGFsbGFibGVVbml0IGQxOwotCi0JSUluc3RhbGxhYmxlVW5pdFBhdGNoIHAxOwotCUlJbnN0YWxsYWJsZVVuaXRQYXRjaCBwcDE7Ci0KLQlJUHJvZmlsZSBwcm9maWxlMTsKLQlJUGxhbm5lciBwbGFubmVyOwotCUlFbmdpbmUgZW5naW5lOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjEuMCkiKSwgbnVsbCwgZmFsc2UsIHRydWUpfSk7Ci0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigxLCAyLCAwKSwgdHJ1ZSk7Ci0KLQkJYzEgPSBjcmVhdGVJVSgiQyIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJEIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjEuMCkiKSwgbnVsbCwgZmFsc2UsIHRydWUpfSk7Ci0JCWQxID0gY3JlYXRlSVUoIkQiLCBuZXcgVmVyc2lvbigxLCAyLCAwKSwgdHJ1ZSk7Ci0KLQkJUmVxdWlyZW1lbnRDaGFuZ2UgY2hhbmdlQSA9IG5ldyBSZXF1aXJlbWVudENoYW5nZShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4xLjAsIDEuMy4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W11bXSBzY29wZVAxID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10ge3tNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKX19OwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFPblBQID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiUFAiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDIuMC4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpfTsKLQkJcDEgPSBjcmVhdGVJVVBhdGNoKCJQIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIG51bGwsIHJlcU9uUFAsIE5PX1BST1ZJREVTLCBOT19QUk9QRVJUSUVTLCBUb3VjaHBvaW50VHlwZS5OT05FLCBOT19UUF9EQVRBLCBmYWxzZSwgbnVsbCwgbmV3IFJlcXVpcmVtZW50Q2hhbmdlW10ge2NoYW5nZUF9LCBzY29wZVAxLCBudWxsKTsKLQotCQlSZXF1aXJlbWVudENoYW5nZSBjaGFuZ2VDID0gbmV3IFJlcXVpcmVtZW50Q2hhbmdlKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJEIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiRCIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjEuMCwgMS4zLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHNjb3BlUFAxID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10ge3tNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQyIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKX19OwotCQlwcDEgPSBjcmVhdGVJVVBhdGNoKCJQUCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlLCBuZXcgUmVxdWlyZW1lbnRDaGFuZ2VbXSB7Y2hhbmdlQ30sIHNjb3BlUFAxLCBudWxsKTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgYzEsIGQxLCBwMSwgcHAxfSk7Ci0KLQkJcHJvZmlsZTEgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQkJZW5naW5lID0gY3JlYXRlRW5naW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGwoKSB7Ci0JCS8vQ29uZmlybSB0aGF0IGExIGFuZCBjMSBjYW4ndCBiZSBpbnN0YWxsZWQKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYzF9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMSA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXExLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW4xLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCi0JCS8vVmVyaWZ5IHRoYXQgdGhlIGluc3RhbGxhdGlvbiBvZiBjMSBhbmQgcHAxIHN1Y2NlZWQKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMiA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTIuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtjMSwgcHAxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjIgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMiwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLldBUk5JTkcsIHBsYW4yLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCi0JCS8vVmVyaWZ5IHRoYXQgcDEgY2FuIGJlIGluc3RhbGxlZCBhbG9uZSAoa2luZCBvZiBtZWFuaW5nbGVzcykKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMyA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTMuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtwMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4zID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTMsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbjMuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0KLQkJLy9JbnN0YWxsIGExIGFuZCBwMS4gCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTQgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQlyZXE0LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIHAxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjQgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxNCwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLldBUk5JTkcsIHBsYW40LmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuNCwgYTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuNCwgcDEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuNCwgcHAxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjQsIGIxKTsKLQotCQkvL0luc3RhbGwgYTEsIGMxIGFuZCBwMS4gCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTUgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQlyZXE1LmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGMxLCBwMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW41ID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTUsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5XQVJOSU5HLCBwbGFuNS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjQsIGExKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjQsIHAxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjQsIGIxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjQsIHBwMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW41LCBkMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW41LCBjMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0Ny5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0Ny5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTE2NmJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaFRlc3Q3IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQkvLwlJSW5zdGFsbGFibGVVbml0IGExOwotCS8vCUlJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JSUluc3RhbGxhYmxlVW5pdCBjMTsKLQkvLwlJSW5zdGFsbGFibGVVbml0IHgxOwotCUlJbnN0YWxsYWJsZVVuaXQgeTE7Ci0JSUluc3RhbGxhYmxlVW5pdCB5MjsKLQlJSW5zdGFsbGFibGVVbml0IGYxOwotCi0JLy8JSUluc3RhbGxhYmxlVW5pdFBhdGNoIHAxOwotCUlJbnN0YWxsYWJsZVVuaXRQYXRjaCBwcDE7Ci0KLQlJUHJvZmlsZSBwcm9maWxlMTsKLQlJUGxhbm5lciBwbGFubmVyOwotCUlFbmdpbmUgZW5naW5lOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJLy8JCXgxID0gY3JlYXRlSVUoIlgiLCBuZXcgVmVyc2lvbigxLCAyLCAwKSwgdHJ1ZSk7Ci0JCXkxID0gY3JlYXRlSVUoIlkiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgdHJ1ZSk7Ci0JCXkyID0gY3JlYXRlSVUoIlkiLCBuZXcgVmVyc2lvbigxLCAyLCAwKSwgdHJ1ZSk7Ci0JCS8vCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIlgiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMS4wKSIpLCBudWxsLCBmYWxzZSwgdHJ1ZSl9KTsKLQkJLy8JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiWCIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjApIiksIG51bGwsIGZhbHNlLCB0cnVlKX0pOwotCQljMSA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIlkiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMS4wKSIpLCBudWxsLCBmYWxzZSwgdHJ1ZSl9KTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzFdOwotCQkvLwkJcmVxWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMS4wKSIpLCBudWxsLCBmYWxzZSwgdHJ1ZSk7Ci0JCS8vCQlyZXFbMV0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjApIiksIG51bGwsIGZhbHNlLCB0cnVlKTsKLQkJcmVxWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMS4wKSIpLCBudWxsLCBmYWxzZSwgdHJ1ZSk7Ci0JCWYxID0gY3JlYXRlSVUoIkYiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgcmVxKTsKLQotCQkvLwkJUmVxdWlyZW1lbnRDaGFuZ2UgY2hhbmdlWCA9IG5ldyBSZXF1aXJlbWVudENoYW5nZShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiWCIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIlgiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4xLjAsIDEuMy4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLQkJLy8JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdW10gc2NvcGUgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzBdWzBdOyAvL25ldyBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHt7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSl9fTsKLQkJLy8JCXAxID0gY3JlYXRlSVVQYXRjaCgiUCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBudWxsLCBOT19SRVFVSVJFUywgTk9fUFJPVklERVMsIE5PX1BST1BFUlRJRVMsIFRvdWNocG9pbnRUeXBlLk5PTkUsIE5PX1RQX0RBVEEsIGZhbHNlLCBudWxsLCBuZXcgUmVxdWlyZW1lbnRDaGFuZ2VbXSB7Y2hhbmdlWH0sIHNjb3BlLCBudWxsKTsKLQotCQlSZXF1aXJlbWVudENoYW5nZSBjaGFuZ2VZID0gbmV3IFJlcXVpcmVtZW50Q2hhbmdlKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJZIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiWSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjEuMCwgMS4zLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHNjb3BlUFAgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzBdWzBdOyAvL25ldyBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHt7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSl9fTsKLQkJcHAxID0gY3JlYXRlSVVQYXRjaCgiUFAiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgbnVsbCwgTk9fUkVRVUlSRVMsIE5PX1BST1ZJREVTLCBOT19QUk9QRVJUSUVTLCBUb3VjaHBvaW50VHlwZS5OT05FLCBOT19UUF9EQVRBLCBmYWxzZSwgbnVsbCwgbmV3IFJlcXVpcmVtZW50Q2hhbmdlW10ge2NoYW5nZVl9LCBzY29wZVBQLCBudWxsKTsKLQotCQkvLwkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgYzEsIHgxLCB5MSwgeTIsIGYxLCBwMSwgcHAxfSk7Ci0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtjMSwgeTEsIHkyLCBmMSwgcHAxfSk7Ci0KLQkJcHJvZmlsZTEgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQkJZW5naW5lID0gY3JlYXRlRW5naW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdlbmVyYWxTY29wZSgpIHsKLQkJLy8JCS8vQ29uZmlybSB0aGF0IGYxIGNhbid0IGJlIGluc3RhbGxlZAotCQkvLwkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCS8vCQlyZXExLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZjF9KTsKLQkJLy8JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjEgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMSwgbnVsbCwgbnVsbCk7Ci0JCS8vCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5FUlJPUiwgcGxhbjEuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCS8vCi0JCS8vCQkvL1ZlcmlmeSB0aGF0IHRoZSBpbnN0YWxsYXRpb24gb2YgZjEgYW5kIHAxIHN1Y2NlZWQKLQkJLy8JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTIgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQkvLwkJcmVxMi5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxLCBwMX0pOwotCQkvLwkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEyLCBudWxsLCBudWxsKTsKLQkJLy8JCWFzc2VydEVxdWFscyhJU3RhdHVzLldBUk5JTkcsIHBsYW4yLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQkvLwkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIGYxKTsKLQkJLy8JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4yLCBhMSk7Ci0JCS8vCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMiwgYjEpOwotCQkvLwkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIGMxKTsKLQkJLy8JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4yLCB4MSk7Ci0JCS8vCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMiwgeTEpOwotCQkvLwkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIHAxKTsKLQotCQkvL1ZlcmlmeSB0aGF0IHRoZSBpbnN0YWxsYXRpb24gb2YgZjEgYW5kIHAxIHN1Y2NlZWQKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMyA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTMuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmMSwgcHAxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjMgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMywgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBwbGFuMy5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjMsIGYxKTsKLQkJLy8JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4zLCBhMSk7Ci0JCS8vCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMywgYjEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMywgYzEpOwotCQkvLwkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjMsIHgxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjMsIHkyKTsKLQkJLy8JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4zLCBwMSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4zLCBwcDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDdiLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9QYXRjaFRlc3Q3Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTRkNDNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDdiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaFRlc3Q3YiBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlJSW5zdGFsbGFibGVVbml0IGIxOwotCUlJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JSUluc3RhbGxhYmxlVW5pdCB4MTsKLQlJSW5zdGFsbGFibGVVbml0IHkxOwotCUlJbnN0YWxsYWJsZVVuaXQgeTI7Ci0JSUluc3RhbGxhYmxlVW5pdCBmMTsKLQotCUlJbnN0YWxsYWJsZVVuaXRQYXRjaCBwMTsKLQlJSW5zdGFsbGFibGVVbml0UGF0Y2ggcHAxOwotCi0JSVByb2ZpbGUgcHJvZmlsZTE7Ci0JSVBsYW5uZXIgcGxhbm5lcjsKLQlJRW5naW5lIGVuZ2luZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCXgxID0gY3JlYXRlSVUoIlgiLCBuZXcgVmVyc2lvbigxLCAyLCAwKSwgdHJ1ZSk7Ci0JCXkxID0gY3JlYXRlSVUoIlkiLCBuZXcgVmVyc2lvbigxLCAwLCAwKSwgdHJ1ZSk7Ci0JCXkyID0gY3JlYXRlSVUoIlkiLCBuZXcgVmVyc2lvbigxLCAyLCAwKSwgdHJ1ZSk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdIHtNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiWCIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjApIiksIG51bGwsIGZhbHNlLCB0cnVlKX0pOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIlgiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMS4wKSIpLCBudWxsLCBmYWxzZSwgdHJ1ZSl9KTsKLQkJYzEgPSBjcmVhdGVJVSgiQyIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJZIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjEuMCkiKSwgbnVsbCwgZmFsc2UsIHRydWUpfSk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVszXTsKLQkJcmVxWzJdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMS4wKSIpLCBudWxsLCBmYWxzZSwgdHJ1ZSk7Ci0JCXJlcVsxXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjEuMCkiKSwgbnVsbCwgZmFsc2UsIHRydWUpOwotCQlyZXFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQyIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjApIiksIG51bGwsIGZhbHNlLCB0cnVlKTsKLQkJZjEgPSBjcmVhdGVJVSgiRiIsIG5ldyBWZXJzaW9uKDEsIDAsIDApLCByZXEpOwotCi0JCVJlcXVpcmVtZW50Q2hhbmdlIGNoYW5nZVggPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIlgiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJYIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMS4wLCAxLjMuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdW10gc2NvcGUgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzBdWzBdOyAvL25ldyBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHt7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSl9fTsKLQkJcDEgPSBjcmVhdGVJVVBhdGNoKCJQIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIG51bGwsIE5PX1JFUVVJUkVTLCBOT19QUk9WSURFUywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UsIG51bGwsIG5ldyBSZXF1aXJlbWVudENoYW5nZVtdIHtjaGFuZ2VYfSwgc2NvcGUsIG51bGwpOwotCi0JCVJlcXVpcmVtZW50Q2hhbmdlIGNoYW5nZVkgPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIlkiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJZIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMS4wLCAxLjMuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdW10gc2NvcGVQUCA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbMF1bMF07IC8vbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVtdW10ge3tNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQyIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKX19OwotCQlwcDEgPSBjcmVhdGVJVVBhdGNoKCJQUCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBudWxsLCBOT19SRVFVSVJFUywgTk9fUFJPVklERVMsIE5PX1BST1BFUlRJRVMsIFRvdWNocG9pbnRUeXBlLk5PTkUsIE5PX1RQX0RBVEEsIGZhbHNlLCBudWxsLCBuZXcgUmVxdWlyZW1lbnRDaGFuZ2VbXSB7Y2hhbmdlWX0sIHNjb3BlUFAsIG51bGwpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjEsIGMxLCB4MSwgeTEsIHkyLCBmMSwgcDEsIHBwMX0pOwotCQkvLwkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2MxLCB5MSwgeTIsIGYxLCBwcDF9KTsKLQotCQlwcm9maWxlMSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCQllbmdpbmUgPSBjcmVhdGVFbmdpbmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhbFNjb3BlKCkgewotCQkvL0NvbmZpcm0gdGhhdCBmMSBjYW4ndCBiZSBpbnN0YWxsZWQKLQkJLy8JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQkvLwkJcmVxMS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxfSk7Ci0JCS8vCQlQcm92aXNpb25pbmdQbGFuIHBsYW4xID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTEsIG51bGwsIG51bGwpOwotCQkvLwkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW4xLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCi0JCS8vVmVyaWZ5IHRoYXQgdGhlIGluc3RhbGxhdGlvbiBvZiBmMSBhbmQgcDEgc3VjY2VlZAotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEyID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxMi5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxLCBwMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4yID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTIsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5XQVJOSU5HLCBwbGFuMi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIGYxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIGExKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIGIxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIGMxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIHgxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIHkxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIHAxKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmNTU3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9QYXRjaFRlc3Q4LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBQYXRjaFRlc3Q4IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCUlJbnN0YWxsYWJsZVVuaXQgYTI7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlJSW5zdGFsbGFibGVVbml0IGIyOwotCUlJbnN0YWxsYWJsZVVuaXQgYzI7Ci0JSUluc3RhbGxhYmxlVW5pdCBmMTsKLQotCUlJbnN0YWxsYWJsZVVuaXRQYXRjaCBwMTsKLQlJSW5zdGFsbGFibGVVbml0UGF0Y2ggcjE7Ci0KLQlJUHJvZmlsZSBwcm9maWxlMTsKLQlJUGxhbm5lciBwbGFubmVyOwotCUlFbmdpbmUgZW5naW5lOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKDEsIDAsIDApLCB0cnVlKTsKLQkJYTIgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIyLjAuMCIpLCB0cnVlKTsKLQkJYjEgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQkJYjIgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIyLjAuMCIpLCB0cnVlKTsKLQkJYzIgPSBjcmVhdGVJVSgiQyIsIG5ldyBWZXJzaW9uKCIyLjAuMCIpLCB0cnVlKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzNdOwotCQlyZXFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjApIiksIG51bGwsIGZhbHNlLCB0cnVlKTsKLQkJcmVxWzFdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS4wLjAsIDEuMS4wKSIpLCBudWxsLCBmYWxzZSwgdHJ1ZSk7Ci0JCXJlcVsyXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAzLjEuMCkiKSwgbnVsbCwgZmFsc2UsIHRydWUpOwotCQlmMSA9IGNyZWF0ZUlVKCJGIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIHJlcSk7Ci0KLQkJUmVxdWlyZW1lbnRDaGFuZ2UgY2hhbmdlQSA9IG5ldyBSZXF1aXJlbWVudENoYW5nZShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIFZlcnNpb25SYW5nZS5lbXB0eVJhbmdlLCBudWxsLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwgTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkEiLCBuZXcgVmVyc2lvblJhbmdlKCJbMi4wLjAsIDMuMC4wKSIpLCBudWxsLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W11bXSBzY29wZSA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHt7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkYiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSl9fTsKLQkJcDEgPSBjcmVhdGVJVVBhdGNoKCJQIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIG51bGwsIE5PX1JFUVVJUkVTLCBOT19QUk9WSURFUywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UsIG51bGwsIG5ldyBSZXF1aXJlbWVudENoYW5nZVtdIHtjaGFuZ2VBfSwgc2NvcGUsIG51bGwpOwotCi0JCVJlcXVpcmVtZW50Q2hhbmdlIGNoYW5nZUIgPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAzLjAuMCkiKSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdW10gc2NvcGVQUCA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXVtdIHt7TWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkYiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSl9fTsKLQkJcjEgPSBjcmVhdGVJVVBhdGNoKCJSIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIG51bGwsIE5PX1JFUVVJUkVTLCBOT19QUk9WSURFUywgTk9fUFJPUEVSVElFUywgVG91Y2hwb2ludFR5cGUuTk9ORSwgTk9fVFBfREFUQSwgZmFsc2UsIG51bGwsIG5ldyBSZXF1aXJlbWVudENoYW5nZVtdIHtjaGFuZ2VCfSwgc2NvcGVQUCwgbnVsbCk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBhMiwgYjEsIGIyLCBjMiwgZjEsIHAxLCByMX0pOwotCi0JCXByb2ZpbGUxID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JCWVuZ2luZSA9IGNyZWF0ZUVuZ2luZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RPbmVJVVdpdGhNdWx0aXBsZVBhdGNoZXNBcHBseWluZ09uSXQoKSB7Ci0JCS8vCQkJCS8vQ29uZmlybSB0aGF0IGYxIGNhbid0IGJlIGluc3RhbGxlZAotCQkvLwkJCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXExID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJLy8JCQkJcmVxMS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2YxfSk7Ci0JCS8vCQkJCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjEgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMSwgbnVsbCwgbnVsbCk7Ci0JCS8vCQkJCWFzc2VydEVxdWFscyhJU3RhdHVzLkVSUk9SLCBwbGFuMS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJLy8JCQotCQkvLwkJCQkvL1ZlcmlmeSB0aGF0IHRoZSBpbnN0YWxsYXRpb24gb2YgZjEgYW5kIHAxIHN1Y2NlZWQKLQkJLy8JCQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMiA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCS8vCQkJCXJlcTIuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHtmMSwgcDF9KTsKLQkJLy8JCQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEyLCBudWxsLCBudWxsKTsKLQkJLy8JCQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuV0FSTklORywgcGxhbjIuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCS8vCQkJCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4yLCBmMSk7Ci0JCS8vCQkJCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4yLCBhMSk7Ci0JCS8vCQkJCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4yLCBiMSk7Ci0JCS8vCQkJCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4yLCBjMSk7Ci0JCS8vCQkJCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4yLCB4MSk7Ci0JCS8vCQkJCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4yLCB5MSk7Ci0JCS8vCQkJCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4yLCBwMSk7Ci0KLQkJLy9WZXJpZnkgdGhhdCB0aGUgaW5zdGFsbGF0aW9uIG9mIGYxIGFuZCBwMSBzdWNjZWVkCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTMgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQlyZXEzLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7ZjEsIHAxLCByMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4zID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTMsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbjMuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0OS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvUGF0Y2hUZXN0OS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTEwYzE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1BhdGNoVGVzdDkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnBsYW5uZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSUVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFBhdGNoVGVzdDkgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCUlJbnN0YWxsYWJsZVVuaXQgYTE7Ci0JSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlJSW5zdGFsbGFibGVVbml0IGIyOwotCUlJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JSUluc3RhbGxhYmxlVW5pdFBhdGNoIHAxOwotCUlJbnN0YWxsYWJsZVVuaXRQYXRjaCBwcDE7Ci0KLQlJUHJvZmlsZSBwcm9maWxlMTsKLQlJUGxhbm5lciBwbGFubmVyOwotCUlFbmdpbmUgZW5naW5lOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W10ge01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMC4wLCAxLjEuMCkiKSwgbnVsbCwgZmFsc2UsIHRydWUpLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQyIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4xLjApIiksIG51bGwsIGZhbHNlLCB0cnVlKX0pOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIHRydWUpOwotCQliMiA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oMSwgMiwgMCksIHRydWUpOwotCQljMSA9IGNyZWF0ZUlVKCJDIiwgbmV3IFZlcnNpb24oMSwgMCwgMCksIHRydWUpOwotCQlSZXF1aXJlbWVudENoYW5nZSBjaGFuZ2VCID0gbmV3IFJlcXVpcmVtZW50Q2hhbmdlKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjEuMCwgMS4zLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotCQlSZXF1aXJlbWVudENoYW5nZSBjaGFuZ2VDID0gbmV3IFJlcXVpcmVtZW50Q2hhbmdlKE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLCBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQyIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjEuMCwgMS4zLjApIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwotCQlwMSA9IGNyZWF0ZUlVUGF0Y2goIlAiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSwgbmV3IFJlcXVpcmVtZW50Q2hhbmdlW10ge2NoYW5nZUIsIGNoYW5nZUN9LCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W11bXSB7e01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSl9fSwgbnVsbCk7Ci0KLQkJUmVxdWlyZW1lbnRDaGFuZ2UgYW5vdGhlckNoYW5nZUMgPSBuZXcgUmVxdWlyZW1lbnRDaGFuZ2UoTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCBmYWxzZSksIE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgbmV3IFZlcnNpb25SYW5nZSgiWzEuMS4wLCAxLjMuMCkiKSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpKTsKLQkJcHAxID0gY3JlYXRlSVVQYXRjaCgiUCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlLCBuZXcgUmVxdWlyZW1lbnRDaGFuZ2VbXSB7Y2hhbmdlQiwgYW5vdGhlckNoYW5nZUN9LCBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5W11bXSB7e01ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSl9fSwgbnVsbCk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgYjIsIGMxLCBwMSwgcHAxfSk7Ci0KLQkJcHJvZmlsZTEgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQkJZW5naW5lID0gY3JlYXRlRW5naW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdFBhdGNoRG9lc05vdEFwcGx5KCkgewotCQkvL1RoZSBhcHBsaWNhdGlvbiBvZiB0aGUgcGF0Y2ggZG9lcyBub3Qgc3VjY2VlZCBiZWNhdXNlIHRoZXJlIGlzIG5vIEMgbWF0Y2hpbmcgdGhlIHJlcXVpcmVtZW50IGltcG9zZWQgYnkgdGhlIHBhdGNoCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcTEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZTEpOwotCQlyZXExLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIHAxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbjEgPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxMSwgbnVsbCwgbnVsbCk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLkVSUk9SLCBwbGFuMS5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UGF0Y2hBcHBseSgpIHsKLQkJLy9UaGUgYXBwbGljYXRpb24gb2YgdGhlIHBhdGNoIHN1Y2NlZWQgYmVjYXVzZSB0aGUgZGVwZW5kZW5jeSB0aGF0IFBQIHB1dHMgb24gQyBpcyBvcHRpb25hbAotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEyID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUxKTsKLQkJcmVxMi5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBwcDF9KTsKLQkJUHJvdmlzaW9uaW5nUGxhbiBwbGFuMiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEyLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4yLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMiwgYTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMiwgcHAxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbjIsIGIyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9TaW1wbGVPcHRpb25hbFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1NpbXBsZU9wdGlvbmFsVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTc4YTNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1NpbXBsZU9wdGlvbmFsVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZU9wdGlvbmFsVGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JLy9BIGRlcCBCIG9wLCBDLCBEIG9wIAotCS8vWCBkZXAgQgotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCS8vQidzIGRlcGVuZGVuY3kgaXMgbWlzc2luZwotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXFBID0gbmV3IFJlcXVpcmVkQ2FwYWJpbGl0eVsxXTsKLQkJcmVxQVswXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFBKTsKLQotCQljcmVhdGVUZXN0TWV0ZGF0YVJlcG9zaXRvcnkobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIGIxfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsYXRpb24oKSB7Ci0JCS8vRW5zdXJlIHRoYXQgRCdzIGluc3RhbGxhdGlvbiBkb2VzIG5vdCBmYWlsIGJlY2F1c2Ugb2YgQydzIGFic2VuY2UKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4gPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGExKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYjEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1NpbXBsZU9wdGlvbmFsVGVzdDIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1NpbXBsZU9wdGlvbmFsVGVzdDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiZTk2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9TaW1wbGVPcHRpb25hbFRlc3QyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlT3B0aW9uYWxUZXN0MiBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjI7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGIzOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBjMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYzI7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGQxOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBkMjsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgeDE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IHkxOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCB6MTsKLQotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCQliMiA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjIuMC4wIiksIHRydWUpOwotCQliMyA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjMuMC4wIiksIHRydWUpOwotCi0JCWMxID0gY3JlYXRlSVUoIkMiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0JCWMyID0gY3JlYXRlSVUoIkMiLCBuZXcgVmVyc2lvbigiMi4wLjAiKSwgdHJ1ZSk7Ci0KLQkJZDEgPSBjcmVhdGVJVSgiRCIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQkJZDIgPSBjcmVhdGVJVSgiRCIsIG5ldyBWZXJzaW9uKCIyLjAuMCIpLCB0cnVlKTsKLQotCQl5MSA9IGNyZWF0ZUlVKCJZIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCi0JCXoxID0gY3JlYXRlSVUoIloiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJLy9CJ3MgZGVwZW5kZW5jeSBpcyBtaXNzaW5nCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcUEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzNdOwotCQlyZXFBWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJcmVxQVsxXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJDIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJcmVxQVsyXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJEIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFBKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzNdOwotCQlyZXFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiRCIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXJlcVsxXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJZIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXJlcVsyXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJaIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJeDEgPSBjcmVhdGVJVSgiWCIsIHJlcSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMSwgYjIsIGIzLCBjMSwgYzIsIGQxLCBkMiwgeDEsIHoxLCB5MX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5zdGFsbGF0aW9uKCkgewotCQkvL0Vuc3VyZSB0aGF0IEQncyBpbnN0YWxsYXRpb24gZG9lcyBub3QgZmFpbCBiZWNhdXNlIG9mIEMncyBhYnNlbmNlCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIHgxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBjMik7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGQxKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgeTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCB6MSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIHgxKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9TaW1wbGVPcHRpb25hbFRlc3QzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9TaW1wbGVPcHRpb25hbFRlc3QzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4ZDFlMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvU2ltcGxlT3B0aW9uYWxUZXN0My5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIFNpbXBsZU9wdGlvbmFsVGVzdDMgZXh0ZW5kcyBBYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3QgewotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBhMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGIyOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMzsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYzE7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGMyOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBkMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgZDI7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IHgxOwotCi0JcHJpdmF0ZSBJUHJvZmlsZSBwcm9maWxlOwotCXByaXZhdGUgSVBsYW5uZXIgcGxhbm5lcjsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWIxID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0JCWIyID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMi4wLjAiKSwgdHJ1ZSk7Ci0JCWIzID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMy4wLjAiKSwgdHJ1ZSk7Ci0KLQkJYzEgPSBjcmVhdGVJVSgiQyIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCB0cnVlKTsKLQkJYzIgPSBjcmVhdGVJVSgiQyIsIG5ldyBWZXJzaW9uKCIyLjAuMCIpLCB0cnVlKTsKLQotCQlkMSA9IGNyZWF0ZUlVKCJEIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHRydWUpOwotCQlkMiA9IGNyZWF0ZUlVKCJEIiwgbmV3IFZlcnNpb24oIjIuMC4wIiksIHRydWUpOwotCi0JCVJlcXVpcmVkQ2FwYWJpbGl0eVtdIHJlcUEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzNdOwotCQlyZXFBWzBdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQlyZXFBWzFdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkMiLCBWZXJzaW9uUmFuZ2UuZW1wdHlSYW5nZSwgbnVsbCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJcmVxQVsyXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJEIiwgVmVyc2lvblJhbmdlLmVtcHR5UmFuZ2UsIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJYTEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpLCByZXFBKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHlbXSByZXEgPSBuZXcgUmVxdWlyZWRDYXBhYmlsaXR5WzFdOwotCQlyZXFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMi4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXgxID0gY3JlYXRlSVUoIlgiLCByZXEpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjEsIGIyLCBiMywgYzEsIGMyLCBkMSwgZDIsIHgxfSk7Ci0KLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoIlRlc3RQcm9maWxlLiIgKyBnZXROYW1lKCkpOwotCQlwbGFubmVyID0gY3JlYXRlUGxhbm5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsYXRpb24oKSB7Ci0JCS8vRW5zdXJlIHRoYXQgQSBhbmQgWDEncyBpbnN0YWxsYXRpb24gZG9lcyBub3QgZmFpbCBiZWNhdXNlIG9mIEMncyBhYnNlbmNlCi0JCVByb2ZpbGVDaGFuZ2VSZXF1ZXN0IHJlcSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxLmFkZEluc3RhbGxhYmxlVW5pdHMobmV3IElJbnN0YWxsYWJsZVVuaXRbXSB7YTEsIHgxfSk7Ci0JCVByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbi5nZXRTdGF0dXMoKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYTEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBjMik7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGQyKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgeDEpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1NpbXBsZU9wdGlvbmFsVGVzdDQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1NpbXBsZU9wdGlvbmFsVGVzdDQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0YWI1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9TaW1wbGVPcHRpb25hbFRlc3Q0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlT3B0aW9uYWxUZXN0NCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JLy9BIGRlcCBCIG9wLCBDLCBEIG9wIAotCS8vWCBkZXAgQgotCi0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGExOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiMTsKLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgYjI7Ci0JcHJpdmF0ZSBJSW5zdGFsbGFibGVVbml0IGIzOwotCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdCBiNDsKLQotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlwcml2YXRlIElQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zZXRVcCgpOwotCQliMSA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIGZhbHNlKTsKLQkJYjIgPSBjcmVhdGVJVSgiQiIsIG5ldyBWZXJzaW9uKCIyLjAuMCIpLCBmYWxzZSk7Ci0JCWIzID0gY3JlYXRlSVUoIkIiLCBuZXcgVmVyc2lvbigiMy4wLjAiKSwgZmFsc2UpOwotCQliNCA9IGNyZWF0ZUlVKCJCIiwgbmV3IFZlcnNpb24oIjQuMC4wIiksIGZhbHNlKTsKLQotCQkvL0IncyBkZXBlbmRlbmN5IGlzIG1pc3NpbmcKLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxQSA9IG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbNF07Ci0JCXJlcUFbMF0gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwxLjAuMF0iKSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQlyZXFBWzFdID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVJlcXVpcmVkQ2FwYWJpbGl0eShJSW5zdGFsbGFibGVVbml0Lk5BTUVTUEFDRV9JVV9JRCwgIkIiLCBuZXcgVmVyc2lvblJhbmdlKCJbMi4wLjAsMi4wLjBdIiksIG51bGwsIHRydWUsIGZhbHNlLCB0cnVlKTsKLQkJcmVxQVsyXSA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJCIiwgbmV3IFZlcnNpb25SYW5nZSgiWzMuMC4wLDMuMC4wXSIpLCBudWxsLCB0cnVlLCBmYWxzZSwgdHJ1ZSk7Ci0JCXJlcUFbM10gPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQiIsIG5ldyBWZXJzaW9uUmFuZ2UoIls0LjAuMCw0LjAuMF0iKSwgbnVsbCwgdHJ1ZSwgZmFsc2UsIHRydWUpOwotCQlhMSA9IGNyZWF0ZUlVKCJBIiwgbmV3IFZlcnNpb24oIjEuMC4wIiksIHJlcUEpOwotCi0JCWNyZWF0ZVRlc3RNZXRkYXRhUmVwb3NpdG9yeShuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthMSwgYjEsIGIyLCBiMywgYjR9KTsKLQotCQlwcm9maWxlID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluc3RhbGxhdGlvbigpIHsKLQkJLy9FbnN1cmUgdGhhdCBEJ3MgaW5zdGFsbGF0aW9uIGRvZXMgbm90IGZhaWwgYmVjYXVzZSBvZiBDJ3MgYWJzZW5jZQotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBiMX0pOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4gPSBwbGFubmVyLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxLCBudWxsLCBudWxsKTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIHBsYW4uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGExKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYjEpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuLCBiMik7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4sIGIzKTsKLQkJYXNzZXJ0SW5zdGFsbE9wZXJhbmQocGxhbiwgYjQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1NpbXBsZVNpbmdsZXRvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvU2ltcGxlU2luZ2xldG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZTllZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvU2ltcGxlU2luZ2xldG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5JUGxhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLlByb2ZpbGVDaGFuZ2VSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLkFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlU2luZ2xldG9uIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGExOwotCUlJbnN0YWxsYWJsZVVuaXQgYTI7Ci0JSUluc3RhbGxhYmxlVW5pdCBhMzsKLQlJSW5zdGFsbGFibGVVbml0IGE0OwotCUlJbnN0YWxsYWJsZVVuaXQgdSwgdiwgdywgeCwgeSwgejsKLQotCUlQbGFubmVyIHBsYW5uZXI7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWExID0gY3JlYXRlSVUoIkEiLCBuZXcgVmVyc2lvbigiMS4wLjAiKSwgdHJ1ZSk7Ci0KLQkJYTIgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIyLjAuMCIpLCB0cnVlKTsKLQotCQlSZXF1aXJlZENhcGFiaWxpdHkgYzEgPSBNZXRhZGF0YUZhY3RvcnkuY3JlYXRlUmVxdWlyZWRDYXBhYmlsaXR5KElJbnN0YWxsYWJsZVVuaXQuTkFNRVNQQUNFX0lVX0lELCAiQSIsIG5ldyBWZXJzaW9uUmFuZ2UoIlsxLjAuMCwgMS4wLjBdIiksIG51bGwsIGZhbHNlLCBmYWxzZSk7Ci0JCVJlcXVpcmVkQ2FwYWJpbGl0eSBjMiA9IE1ldGFkYXRhRmFjdG9yeS5jcmVhdGVSZXF1aXJlZENhcGFiaWxpdHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsICJBIiwgbmV3IFZlcnNpb25SYW5nZSgiWzIuMC4wLCAyLjAuMF0iKSwgbnVsbCwgZmFsc2UsIGZhbHNlKTsKLQkJeSA9IGNyZWF0ZUlVKCJZIiwgbmV3IFZlcnNpb24oMiwgMCwgMCksIG5ldyBSZXF1aXJlZENhcGFiaWxpdHlbXSB7YzEsIGMyfSk7Ci0KLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2ExLCBhMiwgeX0pOwotCi0JCXByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJUZXN0UHJvZmlsZS4iICsgZ2V0TmFtZSgpKTsKLQkJcGxhbm5lciA9IGNyZWF0ZVBsYW5uZXIoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3QxKCkgewotCQlQcm9maWxlQ2hhbmdlUmVxdWVzdCByZXEgPSBuZXcgUHJvZmlsZUNoYW5nZVJlcXVlc3QocHJvZmlsZSk7Ci0JCXJlcS5hZGRJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge3l9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuRVJST1IsIHBsYW5uZXIuZ2V0UHJvdmlzaW9uaW5nUGxhbihyZXEsIG51bGwsIG51bGwpLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1R3b1ZlcnNpb25zT2ZXU0RMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9Ud29WZXJzaW9uc09mV1NETC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzQ2YmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9wbGFubmVyL1R3b1ZlcnNpb25zT2ZXU0RMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5wbGFubmVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSUVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeS5JbnN0YWxsYWJsZVVuaXRRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5UZXN0QWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5WZXJzaW9uUmFuZ2U7Ci0KLXB1YmxpYyBjbGFzcyBUd29WZXJzaW9uc09mV1NETCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0JSUluc3RhbGxhYmxlVW5pdCB3c2RsMTQ7Ci0JSUluc3RhbGxhYmxlVW5pdCB3c2RsMTU7Ci0JSVByb2ZpbGUgcHJvZmlsZTE7Ci0JSVBsYW5uZXIgcGxhbm5lcjsKLQlJRW5naW5lIGVuZ2luZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCUlNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyIHJlcG9NYW4gPSAoTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKFRlc3RBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHJlcG8gPSByZXBvTWFuLmxvYWRSZXBvc2l0b3J5KGdldFRlc3REYXRhKCJyZXBvc2l0b3J5IGZvciB3c2RsIHRlc3QiLCAidGVzdERhdGEvd3NkbFRlc3RSZXBvLyIpLnRvVVJMKCksIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQl3c2RsMTUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcmVwby5xdWVyeShuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkoImphdmF4LndzZGwiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS41LCAxLjYpIikpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLml0ZXJhdG9yKCkubmV4dCgpOwotCQl3c2RsMTQgPSAoSUluc3RhbGxhYmxlVW5pdCkgcmVwby5xdWVyeShuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkoImphdmF4LndzZGwiLCBuZXcgVmVyc2lvblJhbmdlKCJbMS40LCAxLjUpIikpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0JCXByb2ZpbGUxID0gY3JlYXRlUHJvZmlsZSgiVGVzdFByb2ZpbGUuIiArIGdldE5hbWUoKSk7Ci0JCXBsYW5uZXIgPSBjcmVhdGVQbGFubmVyKCk7Ci0JCWVuZ2luZSA9IGNyZWF0ZUVuZ2luZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RJbnN0YWxsVHdvVmVyc2lvbnNPcHRpb25hbHkoKSB7Ci0JCS8vRW5zdXJlIHRoYXQgcDEgY2F1c2VzIGExIHRvIHJlc29sdmUKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMSA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlMSk7Ci0JCXJlcTEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHt3c2RsMTUsIHdzZGwxNH0pOwotCQlyZXExLnNldEluc3RhbGxhYmxlVW5pdEluY2x1c2lvblJ1bGVzKHdzZGwxNSwgUGxhbm5lckhlbHBlci5jcmVhdGVTdHJpY3RJbmNsdXNpb25SdWxlKHdzZGwxNSkpOwotCQlyZXExLnNldEluc3RhbGxhYmxlVW5pdEluY2x1c2lvblJ1bGVzKHdzZGwxNCwgUGxhbm5lckhlbHBlci5jcmVhdGVTdHJpY3RJbmNsdXNpb25SdWxlKHdzZGwxNCkpOwotCQlQcm92aXNpb25pbmdQbGFuIHBsYW4xID0gcGxhbm5lci5nZXRQcm92aXNpb25pbmdQbGFuKHJlcTEsIG51bGwsIG51bGwpOwotCQlhc3NlcnRFcXVhbHMoSVN0YXR1cy5PSywgcGxhbjEuZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSk7Ci0JCWFzc2VydEluc3RhbGxPcGVyYW5kKHBsYW4xLCB3c2RsMTUpOwotCQlhc3NlcnRJbnN0YWxsT3BlcmFuZChwbGFuMSwgd3NkbDE0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9Vbmluc3RhbGxFdmVyeXRoaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvcGxhbm5lci9Vbmluc3RhbGxFdmVyeXRoaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwNzgyZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3BsYW5uZXIvVW5pbnN0YWxsRXZlcnl0aGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMucGxhbm5lcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuSURpcmVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5BYnN0cmFjdFByb3Zpc2lvbmluZ1Rlc3Q7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBVbmluc3RhbGxFdmVyeXRoaW5nIGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQlJSW5zdGFsbGFibGVVbml0IGE7Ci0KLQlJRGlyZWN0b3IgZGlyZWN0b3I7Ci0JSVByb2ZpbGUgcHJvZmlsZTsKLQotCXByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnNldFVwKCk7Ci0JCWEgPSBjcmVhdGVJVSgiQSIsIG5ldyBWZXJzaW9uKCIxLjAuMCIpKTsKLQkJY3JlYXRlVGVzdE1ldGRhdGFSZXBvc2l0b3J5KG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2F9KTsKLQkJcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoQnVnMjA3MzE5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWRpcmVjdG9yID0gY3JlYXRlRGlyZWN0b3IoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHsKLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxID0gbmV3IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0KHByb2ZpbGUpOwotCQlyZXEuYWRkSW5zdGFsbGFibGVVbml0cyhuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthfSk7Ci0JCWFzc2VydEVxdWFscyhJU3RhdHVzLk9LLCBkaXJlY3Rvci5wcm92aXNpb24ocmVxLCBudWxsLCBudWxsKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0UHJvZmlsZUNvbnRhaW5zQWxsKCJBIGlzIG1pc3NpbmciLCBwcm9maWxlLCBuZXcgSUluc3RhbGxhYmxlVW5pdFtdIHthfSk7Ci0KLQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxMiA9IG5ldyBQcm9maWxlQ2hhbmdlUmVxdWVzdChwcm9maWxlKTsKLQkJcmVxMi5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2F9KTsKLQkJYXNzZXJ0RXF1YWxzKElTdGF0dXMuT0ssIGRpcmVjdG9yLnByb3Zpc2lvbihyZXEyLCBudWxsLCBudWxsKS5nZXRTZXZlcml0eSgpKTsKLQkJYXNzZXJ0Tm90SVVzKG5ldyBJSW5zdGFsbGFibGVVbml0W10ge2F9LCBwcm9maWxlLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pdGVyYXRvcigpKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9zaW1wbGVjb25maWd1cmF0b3IvQnVuZGxlc1R4dFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy9zaW1wbGVjb25maWd1cmF0b3IvQnVuZGxlc1R4dFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGMyYjA0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvc2ltcGxlY29uZmlndXJhdG9yL0J1bmRsZXNUeHRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBSZWQgSGF0LCBJbmMuIC0gdGVzdHMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnNpbXBsZWNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLmVtYmVkZGVkZXF1aW5veC5FbWJlZGRlZEVxdWlub3g7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBCdW5kbGVzVHh0VGVzdCBleHRlbmRzIEFic3RyYWN0UHJvdmlzaW9uaW5nVGVzdCB7Ci0KLQlzdGF0aWMgU3RyaW5nIEJVTkRMRV9KQVJfRElSRUNUT1JZID0gImJ1bmRsZXNUeHQiOwotCWludCBudW1CdW5kbGVzID0gLTE7Ci0JRW1iZWRkZWRFcXVpbm94IGVxdWlub3ggPSBudWxsOwotCUJ1bmRsZUNvbnRleHQgZXF1aW5veENvbnRleHQgPSBudWxsOwotCUZpbGVbXSBidW5kbGVKYXJzID0gbnVsbDsKLQlGaWxlIGJ1bmRsZXNUeHQgPSBudWxsOwotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc2V0VXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci50ZWFyRG93bigpOwotCQllcXVpbm94LnNodXRkb3duKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJ1bmRsZXNUeHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRmlsZSBzaW1wbGVjb25maWd1cmF0b3JEYXRhRGlyID0gVGVzdERhdGEuZ2V0RmlsZShCVU5ETEVfSkFSX0RJUkVDVE9SWSwgIiIpOwotCQlidW5kbGVKYXJzID0gZ2V0QnVuZGxlSmFycyhzaW1wbGVjb25maWd1cmF0b3JEYXRhRGlyKTsKLQotCQludW1CdW5kbGVzID0gYnVuZGxlSmFycy5sZW5ndGg7Ci0KLQkJLy8gQ3JlYXRlIGEgdGVzdCBidW5kbGVzLmluZm8KLQkJY3JlYXRlQnVuZGxlc1R4dCgpOwotCi0JCS8vIGZvciBkZW1vbnN0cmF0aW9uIHB1cnBvc2VzIHRoaXMgaXMganVzdCB1c2luZyBhbiBpbnN0YWxsLmFyZWEgYW5kIGNvbmZpZ3VyYXRpb24uYXJlYSBsb2NhdGVkCi0JCS8vIGluIHRoZSBsb2NhbCBidW5kbGUgZGF0YSBhcmVhLiAgRm9yIHAyIHRlc3RpbmcgeW91IHdpbGwgd2FudCB0byBwb2ludCB0aGlzIHRvIHlvdXIgb3duIHByb3BlcnRpZXMKLQkJRmlsZSBpbnN0YWxsYXJlYSA9IFRlc3RBY3RpdmF0b3IuY29udGV4dC5nZXREYXRhRmlsZSgiZWNsaXBzZSIpOwotCQlGaWxlIGNvbmZpZ2FyZWEgPSBuZXcgRmlsZShpbnN0YWxsYXJlYSwgImNvbmZpZ3VyYXRpb24iKTsKLQotCQlGaWxlIHNpbXBsZUNvbmZpZ3VyYXRvckJ1bmRsZSA9IGdldFNpbXBsZUNvbmZpZ3VyYXRvckJ1bmRsZSgpOwotCQlVUkwgb3NnaUJ1bmRsZSA9IGdldEZyYW1ld29ya0J1bmRsZSgpOwotCi0JCU1hcCBmcmFtZXdvcmtQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gbm90ZSB0aGF0IGFueSBwcm9wZXJ0aWVzIHlvdSBkbyBub3Qgd2FudCB0byBiZSBpbmhlcml0ZWQgZnJvbSB0aGUgaG9zdGluZyBFcXVpbm94IHdpbGwgbmVlZAotCQkvLyB0byBiZSBudWxsZWQgb3V0LiAgT3RoZXJ3aXNlIHlvdSB3aWxsIHBpY2sgdGhlbSB1cCBmcm9tIHRoZSBob3N0aW5nIGVudi4KLQkJZnJhbWV3b3JrUHJvcGVydGllcy5wdXQoIm9zZ2kuZnJhbWV3b3JrIiwgbnVsbCk7Ci0JCWZyYW1ld29ya1Byb3BlcnRpZXMucHV0KCJvc2dpLmluc3RhbGwuYXJlYSIsIGluc3RhbGxhcmVhLnRvVVJMKCkudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCWZyYW1ld29ya1Byb3BlcnRpZXMucHV0KCJvc2dpLmNvbmZpZ3VyYXRpb24uYXJlYSIsIGNvbmZpZ2FyZWEudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJZnJhbWV3b3JrUHJvcGVydGllcy5wdXQoIm9zZ2kuYnVuZGxlcyIsICJyZWZlcmVuY2U6IiArIHNpbXBsZUNvbmZpZ3VyYXRvckJ1bmRsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkgKyAiQDE6c3RhcnQiKTsgLy8gc2hvdWxkIHBvaW50IHRvIHNpbXBsZSBjb25maWd1cmF0b3IKLQkJZnJhbWV3b3JrUHJvcGVydGllcy5wdXQoIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmNvbmZpZ1VybCIsIGJ1bmRsZXNUeHQudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJdHJ5IHsKLQkJCWVxdWlub3ggPSBuZXcgRW1iZWRkZWRFcXVpbm94KGZyYW1ld29ya1Byb3BlcnRpZXMsIG5ldyBTdHJpbmdbXSB7fSwgbmV3IFVSTFtdIHtvc2dpQnVuZGxlfSk7Ci0JCQllcXVpbm94Q29udGV4dCA9IGVxdWlub3guc3RhcnRGcmFtZXdvcmsoKTsKLQotCQkJLy8gdmVyaWZ5IHRoYXQgbG9hZGVkIGJ1bmRsZXMgc2hvdWxkIGJlCi0JCQlCdW5kbGVbXSBidW5kbGVzSW5Db250ZXh0ID0gZXF1aW5veENvbnRleHQuZ2V0QnVuZGxlcygpOwotCQkJLy8gYXJlIGFsbCBidW5kbGVzIGluIGxpc3Qgb2YgZXhwZWN0ZWQgYnVuZGxlcz8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlc0luQ29udGV4dC5sZW5ndGg7IGkrKykgewotCQkJCUJ1bmRsZSBidW5kbGUgPSBidW5kbGVzSW5Db250ZXh0W2ldOwotCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQlCdW5kbGUgbm90Rm91bmRCdW5kbGUgPSBidW5kbGU7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBidW5kbGVKYXJzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCUZpbGUgZXhwZWN0ZWRCdW5kbGVGaWxlID0gYnVuZGxlSmFyc1tqXTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBnZXRNYW5pZmVzdEVudHJ5KGV4cGVjdGVkQnVuZGxlRmlsZSwgQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpOwotCQkJCQlTdHJpbmcgYnVuZGxlTmFtZSA9IGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCQkJaWYgKGJ1bmRsZU5hbWUuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKCFmb3VuZCkKLQkJCQkJZmFpbCgiQnVuZGxlIHNob3VsZCBub3QgYmUgcHJlc2VudDogICIgKyBub3RGb3VuZEJ1bmRsZSk7Ci0JCQl9Ci0KLQkJCS8vIFRPRE86ICBzaG91bGQgd2UgY2hlY2sgc3RhcnQgbGV2ZWxzPwotCi0JCQkvLyB2ZXJpZnkgdGhhdCBhbGwgYnVuZGxlcyBleHBlY3RlZCB0byBiZSBsb2FkZWQgYXJlIGluIGZhY3QgbG9hZGVkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZUphcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlGaWxlIGJ1bmRsZSA9IGJ1bmRsZUphcnNbaV07Ci0JCQkJU3RyaW5nIG5hbWUgPSBnZXRNYW5pZmVzdEVudHJ5KGJ1bmRsZSwgQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpOwotCQkJCWJvb2xlYW4gbG9hZGVkID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBidW5kbGVzSW5Db250ZXh0Lmxlbmd0aDsgaisrKSB7Ci0JCQkJCUJ1bmRsZSBsb2FkZWRCdW5kbGUgPSBidW5kbGVzSW5Db250ZXh0W2pdOwotCQkJCQlpZiAobG9hZGVkQnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQkJCQlsb2FkZWQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoIWxvYWRlZCkKLQkJCQkJZmFpbCgiQnVuZGxlIGV4cGVjdGVkIHRvIGJlIGxvYWRlZCBidXQgaXMgbm90OiAgIiArIG5hbWUpOwotCQkJfQotCi0JCQlhc3NlcnRFcXVhbHMoIlRvbyBtYW55L3RvbyBmZXcgYnVuZGxlcyEhIiwgbnVtQnVuZGxlcywgYnVuZGxlc0luQ29udGV4dC5sZW5ndGgpOwotCQl9IGZpbmFsbHkgewotCQkJZXF1aW5veC5zaHV0ZG93bigpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGdldFNpbXBsZUNvbmZpZ3VyYXRvckJ1bmRsZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVKYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGJ1bmRsZUphciA9IGJ1bmRsZUphcnNbaV07Ci0JCQlpZiAoYnVuZGxlSmFyLmdldE5hbWUoKS5zdGFydHNXaXRoKCJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIpKQotCQkJCXJldHVybiBidW5kbGVKYXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUJ1bmRsZXNUeHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlidW5kbGVzVHh0ID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiYnVuZGxlcyIsICIudHh0Iik7Ci0JCWJ1bmRsZXNUeHQuZGVsZXRlT25FeGl0KCk7Ci0KLQkJQnVmZmVyZWRXcml0ZXIgYnVuZGxlc1R4dE91dCA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihidW5kbGVzVHh0KSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVKYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGJ1bmRsZUphciA9IGJ1bmRsZUphcnNbaV07Ci0JCQlidW5kbGVzVHh0T3V0LndyaXRlKGdldEJ1bmRsZXNUeHRFbnRyeShidW5kbGVKYXIpICsgIlxuIik7Ci0JCX0KLQotCQlidW5kbGVzVHh0T3V0LmNsb3NlKCk7Ci0KLQkJLy8JCUZpbGVJbnB1dFN0cmVhbSBmID0gbmV3IEZpbGVJbnB1dFN0cmVhbShidW5kbGVzVHh0KTsKLQkJLy8JCUJ1ZmZlcmVkSW5wdXRTdHJlYW0gYiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGYpOwotCQkvLwkJRGF0YUlucHV0U3RyZWFtIGQgPSBuZXcgRGF0YUlucHV0U3RyZWFtKGIpOwotCQkvLwkJd2hpbGUgKGQuYXZhaWxhYmxlKCkgIT0gMCkgewotCQkvLwkJCVN5c3RlbS5vdXQucHJpbnRsbihkLnJlYWRMaW5lKCkpOwotCQkvLwkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEJ1bmRsZXNUeHRFbnRyeShGaWxlIGJ1bmRsZUphcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRNYW5pZmVzdEVudHJ5KGJ1bmRsZUphciwgQ29uc3RhbnRzLkJVTkRMRV9TWU1CT0xJQ05BTUUpOwotCQlTdHJpbmcgdmVyc2lvbiA9IGdldE1hbmlmZXN0RW50cnkoYnVuZGxlSmFyLCBDb25zdGFudHMuQlVORExFX1ZFUlNJT04pOwotCQkvLyA8bmFtZT4sPHZlcnNpb24+LGZpbGU6PGZpbGU+LDxzdGFydGxldmVsPix0cnVlCi0JCXJldHVybiBuYW1lICsgIiwiICsgdmVyc2lvbiArICIsIiArICJmaWxlOiIgKyBidW5kbGVKYXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLCIgKyBnZXRTdGFydExldmVsKG5hbWUpICsgIix0cnVlIjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNYW5pZmVzdEVudHJ5KEZpbGUgYnVuZGxlRmlsZSwgU3RyaW5nIGVudHJ5KSB7Ci0JCXRyeSB7Ci0JCQlKYXJGaWxlIGJ1bmRsZUphciA9IG5ldyBKYXJGaWxlKGJ1bmRsZUZpbGUpOwotCQkJU3RyaW5nIHZhbHVlID0gYnVuZGxlSmFyLmdldE1hbmlmZXN0KCkuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShlbnRyeSk7Ci0JCQlpZiAodmFsdWUuaW5kZXhPZigiOyIpID4gLTEpIHsKLQkJCQlTdHJpbmdbXSB2YWx1ZUVsZW1lbnRzID0gdmFsdWUuc3BsaXQoIjsiKTsKLQkJCQlyZXR1cm4gdmFsdWVFbGVtZW50c1swXTsKLQkJCX0gZWxzZQotCQkJCXJldHVybiB2YWx1ZTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIFVSTCBnZXRGcmFtZXdvcmtCdW5kbGUoKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlSmFycy5sZW5ndGg7IGkrKykgewotCQkJRmlsZSBidW5kbGVKYXIgPSBidW5kbGVKYXJzW2ldOwotCQkJaWYgKGJ1bmRsZUphci5nZXROYW1lKCkuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2Uub3NnaSIpKQotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBidW5kbGVKYXIudG9VUkwoKTsKLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgaW50IGdldFN0YXJ0TGV2ZWwoU3RyaW5nIGJ1bmRsZU5hbWUpIHsKLQkJaW50IHN0YXJ0TGV2ZWwgPSA0OwotCQkvLyBzb21lIHNwZWNpYWwgY2FzZSBzdGFydCBsZXZlbHMKLQkJaWYgKGJ1bmRsZU5hbWUubWF0Y2hlcygib3JnLmVjbGlwc2Uub3NnaSIpKSB7Ci0JCQlzdGFydExldmVsID0gLTE7Ci0JCX0gZWxzZSBpZiAoYnVuZGxlTmFtZS5tYXRjaGVzKCJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiIpKSB7Ci0JCQlzdGFydExldmVsID0gMjsKLQkJfSBlbHNlIGlmIChidW5kbGVOYW1lLm1hdGNoZXMoIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIikpIHsKLQkJCXN0YXJ0TGV2ZWwgPSAxOwotCQl9Ci0JCXJldHVybiBzdGFydExldmVsOwotCX0KLQotCXByaXZhdGUgRmlsZVtdIGdldEJ1bmRsZUphcnMoRmlsZSBkaXJlY3RvcnkpIHsKLQkJRmlsZW5hbWVGaWx0ZXIgYnVuZGxlRmlsdGVyID0gbmV3IEZpbGVuYW1lRmlsdGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gYWNjZXB0KEZpbGUgZGlyZWN0b3J5TmFtZSwgU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCQkJcmV0dXJuICFmaWxlbmFtZS5zdGFydHNXaXRoKCIuIikgJiYgIWZpbGVuYW1lLmVxdWFscygiQ1ZTIik7Ci0JCQl9Ci0JCX07Ci0JCXJldHVybiBkaXJlY3RvcnkubGlzdEZpbGVzKGJ1bmRsZUZpbHRlcik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvc2ltcGxlY29uZmlndXJhdG9yL1NpbXBsZUNvbmZpZ3VyYXRvclRlc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvc2ltcGxlY29uZmlndXJhdG9yL1NpbXBsZUNvbmZpZ3VyYXRvclRlc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZmZjN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3NpbXBsZWNvbmZpZ3VyYXRvci9TaW1wbGVDb25maWd1cmF0b3JUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBSZWQgSGF0LCBJbmMuIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogUmVkIEhhdCwgSW5jLiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5zaW1wbGVjb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29uZmlndXJhdG9yVGVzdHMgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKCJUZXN0cyBmb3Igb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiKTsKLQkJLy8kSlVuaXQtQkVHSU4kCi0JCXN1aXRlLmFkZFRlc3RTdWl0ZShCdW5kbGVzVHh0VGVzdC5jbGFzcyk7Ci0JCS8vJEpVbml0LUVORCQKLQkJcmV0dXJuIHN1aXRlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3RvdWNocG9pbnQvZWNsaXBzZS9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3RvdWNocG9pbnQvZWNsaXBzZS9BbGxUZXN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2JiZWYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy90b3VjaHBvaW50L2VjbGlwc2UvQWxsVGVzdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMudG91Y2hwb2ludC5lY2xpcHNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUGVyZm9ybXMgYWxsIGF1dG9tYXRlZCBkaXJlY3RvciB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShVdGlsVGVzdC5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy90b3VjaHBvaW50L2VjbGlwc2UvVXRpbFRlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy90b3VjaHBvaW50L2VjbGlwc2UvVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM3ZDAzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvdG91Y2hwb2ludC9lY2xpcHNlL1V0aWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLnRvdWNocG9pbnQuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLkFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5sb2NhdGlvbi5BZ2VudExvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotCi0vKioKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFV0aWxUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQkvKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuCi0JICovCi0JcHVibGljIFV0aWxUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qCi0JICogUnVuIGFsbCB0aGUgdGVzdHMgaW4gdGhpcyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFV0aWxUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEJ1bmRsZVBvb2woKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGNyZWF0ZVByb2ZpbGUoInRlc3QiKTsKLQkJQWdlbnRMb2NhdGlvbiBhZ2VudExvY2F0aW9uID0gKEFnZW50TG9jYXRpb24pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBBZ2VudExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWFzc2VydEVxdWFscyhhZ2VudExvY2F0aW9uLmdldERhdGFBcmVhKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSIpLnRvRXh0ZXJuYWxGb3JtKCksIFV0aWwuZ2V0QnVuZGxlUG9vbExvY2F0aW9uKHByb2ZpbGUpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdEJ1bmRsZVBvb2woKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uIHsKLQkJUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCUZpbGUgY2FjaGVEaXIgPSBuZXcgRmlsZShTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIiksICJjYWNoZSIpOwotCQlwcm9wcy5wdXQoSVByb2ZpbGUuUFJPUF9DQUNIRSwgY2FjaGVEaXIudG9TdHJpbmcoKSk7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBjcmVhdGVQcm9maWxlKCJ0ZXN0IiwgbnVsbCwgcHJvcHMpOwotCQlhc3NlcnRFcXVhbHMoY2FjaGVEaXIudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpLCBVdGlsLmdldEJ1bmRsZVBvb2xMb2NhdGlvbihwcm9maWxlKS50b0V4dGVybmFsRm9ybSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvdXBkYXRlc2l0ZS9BbGxUZXN0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L3AyL3Rlc3RzL3VwZGF0ZXNpdGUvQWxsVGVzdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFiZWEzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvdXBkYXRlc2l0ZS9BbGxUZXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy51cGRhdGVzaXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogUGVyZm9ybXMgYWxsIGF1dG9tYXRlZCBkaXJlY3RvciB0ZXN0cy4KLSAqLwotcHVibGljIGNsYXNzIEFsbFRlc3RzIGV4dGVuZHMgVGVzdENhc2UgewotCi0JcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkgewotCQlUZXN0U3VpdGUgc3VpdGUgPSBuZXcgVGVzdFN1aXRlKEFsbFRlc3RzLmNsYXNzLmdldE5hbWUoKSk7Ci0JCXN1aXRlLmFkZFRlc3RTdWl0ZShVcGRhdGVTaXRlVGVzdC5jbGFzcyk7Ci0JCXJldHVybiBzdWl0ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy91cGRhdGVzaXRlL1VwZGF0ZVNpdGVUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvcDIvdGVzdHMvdXBkYXRlc2l0ZS9VcGRhdGVTaXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGJkYmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9wMi90ZXN0cy91cGRhdGVzaXRlL1VwZGF0ZVNpdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy51cGRhdGVzaXRlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZXNpdGUuVXBkYXRlU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0OwotCi0vKioKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZVNpdGVUZXN0IGV4dGVuZHMgQWJzdHJhY3RQcm92aXNpb25pbmdUZXN0IHsKLQkvKgotCSAqIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MuCi0JICovCi0JcHVibGljIFVwZGF0ZVNpdGVUZXN0KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qCi0JICogUnVuIGFsbCB0aGUgdGVzdHMgaW4gdGhpcyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKSB7Ci0JCXJldHVybiBuZXcgVGVzdFN1aXRlKFVwZGF0ZVNpdGVUZXN0LmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdmVTaXRlVVJMKCkgewotCQlGaWxlIHNpdGUgPSBnZXRUZXN0RGF0YSgiMC4xIiwgIi90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGV1cmwiKTsKLQkJVXBkYXRlU2l0ZSB1cGRhdGVzaXRlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVwZGF0ZXNpdGUgPSBVcGRhdGVTaXRlLmxvYWQoc2l0ZS50b1VSTCgpLCBnZXRNb25pdG9yKCkpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4yIiwgZSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjMiLCBlKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpbnQgZmVhdHVyZUNvdW50ID0gdXBkYXRlc2l0ZS5sb2FkRmVhdHVyZXMoKS5sZW5ndGg7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgZmVhdHVyZUNvdW50KTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuNCIsIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFic29sdXRlU2l0ZVVSTCgpIHsKLQkJRmlsZSBzaXRlID0gZ2V0VGVzdERhdGEoIjAuMSIsICIvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRldXJsMiIpOwotCQlGaWxlIHNpdGVEaXJlY3RvcnkgPSBnZXRUZXN0RGF0YSgiMC4xIiwgIi90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGV1cmwyL3NpdGV1cmwvIik7Ci0JCVVwZGF0ZVNpdGUgdXBkYXRlc2l0ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cGRhdGVzaXRlID0gVXBkYXRlU2l0ZS5sb2FkKHNpdGUudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJCXVwZGF0ZXNpdGUuZ2V0U2l0ZSgpLnNldExvY2F0aW9uVVJMU3RyaW5nKHNpdGVEaXJlY3RvcnkudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMiIsIGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4zIiwgZSk7Ci0JCX0KLQotCQl0cnkgewotCQkJaW50IGZlYXR1cmVDb3VudCA9IHVwZGF0ZXNpdGUubG9hZEZlYXR1cmVzKCkubGVuZ3RoOwotCQkJYXNzZXJ0RXF1YWxzKDEsIGZlYXR1cmVDb3VudCk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjQiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3REZWZhdWx0RGlnZXN0VVJMKCkgewotCQlGaWxlIHNpdGUgPSBnZXRUZXN0RGF0YSgiMC4xIiwgIi90ZXN0RGF0YS91cGRhdGVzaXRlL2RpZ2VzdCIpOwotCQlVcGRhdGVTaXRlIHVwZGF0ZXNpdGUgPSBudWxsOwotCQl0cnkgewotCQkJdXBkYXRlc2l0ZSA9IFVwZGF0ZVNpdGUubG9hZChzaXRlLnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjIiLCBlKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMyIsIGUpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWludCBmZWF0dXJlQ291bnQgPSB1cGRhdGVzaXRlLmxvYWRGZWF0dXJlcygpLmxlbmd0aDsKLQkJCWFzc2VydEVxdWFscygxLCBmZWF0dXJlQ291bnQpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC40IiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdmVEaWdlc3RVUkwoKSB7Ci0JCUZpbGUgc2l0ZSA9IGdldFRlc3REYXRhKCIwLjEiLCAiL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0dXJsIik7Ci0JCVVwZGF0ZVNpdGUgdXBkYXRlc2l0ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cGRhdGVzaXRlID0gVXBkYXRlU2l0ZS5sb2FkKHNpdGUudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMiIsIGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4zIiwgZSk7Ci0JCX0KLQotCQl0cnkgewotCQkJaW50IGZlYXR1cmVDb3VudCA9IHVwZGF0ZXNpdGUubG9hZEZlYXR1cmVzKCkubGVuZ3RoOwotCQkJYXNzZXJ0RXF1YWxzKDEsIGZlYXR1cmVDb3VudCk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjQiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZURpZ2VzdFVSTCgpIHsKLQkJRmlsZSBzaXRlID0gZ2V0VGVzdERhdGEoIjAuMSIsICIvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3R1cmwyIik7Ci0JCUZpbGUgZGlnZXN0RGlyZWN0b3J5ID0gZ2V0VGVzdERhdGEoIjAuMSIsICIvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3R1cmwyL2RpZ2VzdHVybC8iKTsKLQkJVXBkYXRlU2l0ZSB1cGRhdGVzaXRlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVwZGF0ZXNpdGUgPSBVcGRhdGVTaXRlLmxvYWQoc2l0ZS50b1VSTCgpLCBnZXRNb25pdG9yKCkpOwotCQkJdXBkYXRlc2l0ZS5nZXRTaXRlKCkuc2V0RGlnZXN0VVJMU3RyaW5nKGRpZ2VzdERpcmVjdG9yeS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4yIiwgZSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjMiLCBlKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlpbnQgZmVhdHVyZUNvdW50ID0gdXBkYXRlc2l0ZS5sb2FkRmVhdHVyZXMoKS5sZW5ndGg7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgZmVhdHVyZUNvdW50KTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuNCIsIGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUZXN0IGluIHdoaWNoIHdlIGxvYWQgYW4gdXBkYXRlIHNpdGUgZnJvbSBhIHZhbGlkIHNpdGUueG1sIGZpbGUuIEhhbmRsZQotCSAqIGFsbCB0aGUgdmFyaWF0aW9ucyBpbiB0aGUgZmlsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9EaWdlc3RHb29kU2l0ZSgpIHsKLQkJRmlsZSBzaXRlID0gZ2V0VGVzdERhdGEoIjAuMSIsICIvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRlIik7Ci0JCVVwZGF0ZVNpdGUgdXBkYXRlc2l0ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cGRhdGVzaXRlID0gVXBkYXRlU2l0ZS5sb2FkKHNpdGUudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMiIsIGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4zIiwgZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludCBmZWF0dXJlQ291bnQgPSB1cGRhdGVzaXRlLmxvYWRGZWF0dXJlcygpLmxlbmd0aDsKLQkJCWFzc2VydEVxdWFscygxLCBmZWF0dXJlQ291bnQpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC40IiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0Tm9FbmRpbmdTbGFzaFVSTCgpIHsKLQkJRmlsZSBiYXNlID0gZ2V0VGVzdERhdGEoIjAuMSIsICIvdGVzdERhdGEvdXBkYXRlc2l0ZSIpOwotCQlVcGRhdGVTaXRlIHVwZGF0ZXNpdGUgPSBudWxsOwotCQl0cnkgewotCQkJVVJMIHNpdGVVUkwgPSBuZXcgVVJMKGJhc2UudG9VUkwoKSwgInNpdGUiKTsKLQkJCXVwZGF0ZXNpdGUgPSBVcGRhdGVTaXRlLmxvYWQoc2l0ZVVSTCwgZ2V0TW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMiIsIGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4zIiwgZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludCBmZWF0dXJlQ291bnQgPSB1cGRhdGVzaXRlLmxvYWRGZWF0dXJlcygpLmxlbmd0aDsKLQkJCWFzc2VydEVxdWFscygxLCBmZWF0dXJlQ291bnQpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC40IiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0U2l0ZVhNTFVSTCgpIHsKLQkJRmlsZSBzaXRlID0gZ2V0VGVzdERhdGEoIjAuMSIsICIvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRlL3NpdGUueG1sIik7Ci0JCVVwZGF0ZVNpdGUgdXBkYXRlc2l0ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cGRhdGVzaXRlID0gVXBkYXRlU2l0ZS5sb2FkKHNpdGUudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMiIsIGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4zIiwgZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludCBmZWF0dXJlQ291bnQgPSB1cGRhdGVzaXRlLmxvYWRGZWF0dXJlcygpLmxlbmd0aDsKLQkJCWFzc2VydEVxdWFscygxLCBmZWF0dXJlQ291bnQpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC40IiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0WFhYU2l0ZVhYWFhNTFVSTCgpIHsKLQkJRmlsZSBzaXRlID0gZ2V0VGVzdERhdGEoIjAuMSIsICIvdGVzdERhdGEvdXBkYXRlc2l0ZS94eHhzaXRleHh4L3h4eHNpdGV4eHgueG1sIik7Ci0JCVVwZGF0ZVNpdGUgdXBkYXRlc2l0ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cGRhdGVzaXRlID0gVXBkYXRlU2l0ZS5sb2FkKHNpdGUudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMiIsIGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4zIiwgZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludCBmZWF0dXJlQ291bnQgPSB1cGRhdGVzaXRlLmxvYWRGZWF0dXJlcygpLmxlbmd0aDsKLQkJCWFzc2VydEVxdWFscygxLCBmZWF0dXJlQ291bnQpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC40IiwgZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QmFkWFhYU2l0ZVhYWFhNTFVSTCgpIHsKLQkJRmlsZSBzaXRlRGlyID0gZ2V0VGVzdERhdGEoIjAuMSIsICIvdGVzdERhdGEvdXBkYXRlc2l0ZS94eHhzaXRleHh4Iik7Ci0JCUZpbGUgc2l0ZSA9IG5ldyBGaWxlKHNpdGVEaXIsICJzaXRlLnhtbCIpOwotCQl0cnkgewotCQkJVXBkYXRlU2l0ZS5sb2FkKHNpdGUudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJCWZhaWwoIjAuMiIpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMyIsIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZERpZ2VzdEdvb2RTaXRlKCkgewotCQlGaWxlIHNpdGUgPSBnZXRUZXN0RGF0YSgiMC4xIiwgIi90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGRpZ2VzdGdvb2RzaXRlIik7Ci0JCVVwZGF0ZVNpdGUgdXBkYXRlc2l0ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cGRhdGVzaXRlID0gVXBkYXRlU2l0ZS5sb2FkKHNpdGUudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMiIsIGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4zIiwgZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCXVwZGF0ZXNpdGUubG9hZEZlYXR1cmVzKCk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjQiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWREaWdlc3RCYWRTaXRlKCkgewotCQlGaWxlIHNpdGUgPSBnZXRUZXN0RGF0YSgiMC4xIiwgIi90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGRpZ2VzdGJhZHNpdGUiKTsKLQkJdHJ5IHsKLQkJCVVwZGF0ZVNpdGUubG9hZChzaXRlLnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCQlmYWlsKCIwLjIiKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGV4cGVjdGVkCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjMiLCBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RCYWRTaXRlWE1MKCkgewotCQkvLyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHNpdGUueG1sIGRvZXNuJ3QgcGFyc2UgY29ycmVjdGx5Ci0JCUZpbGUgc2l0ZSA9IGdldFRlc3REYXRhKCIwLjEiLCAiL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkU2l0ZVhNTCIpOwotCQl0cnkgewotCQkJVXBkYXRlU2l0ZS5sb2FkKHNpdGUudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJCWZhaWwoIjAuMiIpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy8gZXhwZWN0ZWQgZXhjZXB0aW9uCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjMiLCBlKTsKLQkJfQotCX0KLQotCS8qCi0JICogVGVzdCB0aGUgY2FzZSB3aGVyZSB3ZSBkb24ndCBoYXZlIGEgZGlnZXN0IG9yIHNpdGUueG1sLgotCSAqLwotCXB1YmxpYyB2b2lkIHRlc3ROb1NpdGUoKSB7Ci0JCS8vIGVuc3VyZSB3ZSBoYXZlIGEgdmFsaWRhdGUsIGVtcHR5IGxvY2F0aW9uCi0JCUZpbGUgdGVtcCA9IGdldFRlbXBGb2xkZXIoKTsKLQkJdGVtcC5ta2RpcnMoKTsKLQkJdHJ5IHsKLQkJCVVwZGF0ZVNpdGUubG9hZCh0ZW1wLnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCQlmYWlsKCIwLjIiKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHdlIGV4cGVjdCBhbiBleGNlcHRpb24KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMSIsIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE51bGxTaXRlKCkgewotCQl0cnkgewotCQkJYXNzZXJ0TnVsbCgiMS4wIiwgVXBkYXRlU2l0ZS5sb2FkKG51bGwsIGdldE1vbml0b3IoKSkpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMS45OSIsIGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZEZlYXR1cmVVUkwoKSB7Ci0JCUZpbGUgc2l0ZSA9IGdldFRlc3REYXRhKCIwLjEiLCAiL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZmVhdHVyZXVybCIpOwotCQlVcGRhdGVTaXRlIHVwZGF0ZXNpdGUgPSBudWxsOwotCQl0cnkgewotCQkJdXBkYXRlc2l0ZSA9IFVwZGF0ZVNpdGUubG9hZChzaXRlLnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjIiLCBlKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMyIsIGUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnQgZmVhdHVyZUNvdW50ID0gdXBkYXRlc2l0ZS5sb2FkRmVhdHVyZXMoKS5sZW5ndGg7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgZmVhdHVyZUNvdW50KTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuNSIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEdvb2RGZWF0dXJlVVJMKCkgewotCQlGaWxlIHNpdGUgPSBnZXRUZXN0RGF0YSgiMC4xIiwgIi90ZXN0RGF0YS91cGRhdGVzaXRlL2dvb2RmZWF0dXJldXJsIik7Ci0JCVVwZGF0ZVNpdGUgdXBkYXRlc2l0ZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl1cGRhdGVzaXRlID0gVXBkYXRlU2l0ZS5sb2FkKHNpdGUudG9VUkwoKSwgZ2V0TW9uaXRvcigpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMiIsIGUpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4zIiwgZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWludCBmZWF0dXJlQ291bnQgPSB1cGRhdGVzaXRlLmxvYWRGZWF0dXJlcygpLmxlbmd0aDsKLQkJCWFzc2VydEVxdWFscygxLCBmZWF0dXJlQ291bnQpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC41Iik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZWRGZWF0dXJlKCkgewotCQlGaWxlIHNpdGUgPSBnZXRUZXN0RGF0YSgiMC4xIiwgIi90ZXN0RGF0YS91cGRhdGVzaXRlL2luY2x1ZGVkZmVhdHVyZSIpOwotCQlVcGRhdGVTaXRlIHVwZGF0ZXNpdGUgPSBudWxsOwotCQl0cnkgewotCQkJdXBkYXRlc2l0ZSA9IFVwZGF0ZVNpdGUubG9hZChzaXRlLnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjIiLCBlKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMyIsIGUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnQgZmVhdHVyZUNvdW50ID0gdXBkYXRlc2l0ZS5sb2FkRmVhdHVyZXMoKS5sZW5ndGg7Ci0JCQlhc3NlcnRFcXVhbHMoMiwgZmVhdHVyZUNvdW50KTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuNSIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEluY2x1ZGVkRmVhdHVyZUFyY2hpdmUoKSB7Ci0JCUZpbGUgc2l0ZSA9IGdldFRlc3REYXRhKCIwLjEiLCAiL3Rlc3REYXRhL3VwZGF0ZXNpdGUvaW5jbHVkZWRmZWF0dXJlYXJjaGl2ZSIpOwotCQlVcGRhdGVTaXRlIHVwZGF0ZXNpdGUgPSBudWxsOwotCQl0cnkgewotCQkJdXBkYXRlc2l0ZSA9IFVwZGF0ZVNpdGUubG9hZChzaXRlLnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjIiLCBlKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMyIsIGUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnQgZmVhdHVyZUNvdW50ID0gdXBkYXRlc2l0ZS5sb2FkRmVhdHVyZXMoKS5sZW5ndGg7Ci0JCQlhc3NlcnRFcXVhbHMoMiwgZmVhdHVyZUNvdW50KTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuNSIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEJhZEluY2x1ZGVkRmVhdHVyZUFyY2hpdmUoKSB7Ci0JCUZpbGUgc2l0ZSA9IGdldFRlc3REYXRhKCIwLjEiLCAiL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkaW5jbHVkZWRmZWF0dXJlYXJjaGl2ZSIpOwotCQlVcGRhdGVTaXRlIHVwZGF0ZXNpdGUgPSBudWxsOwotCQl0cnkgewotCQkJdXBkYXRlc2l0ZSA9IFVwZGF0ZVNpdGUubG9hZChzaXRlLnRvVVJMKCksIGdldE1vbml0b3IoKSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjIiLCBlKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuMyIsIGUpOwotCQl9Ci0JCXRyeSB7Ci0JCQlpbnQgZmVhdHVyZUNvdW50ID0gdXBkYXRlc2l0ZS5sb2FkRmVhdHVyZXMoKS5sZW5ndGg7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgZmVhdHVyZUNvdW50KTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCWZhaWwoIjAuNSIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdE5vRmVhdHVyZUlkQW5kVmVyc2lvbigpIHsKLQkJRmlsZSBzaXRlID0gZ2V0VGVzdERhdGEoIjAuMSIsICIvdGVzdERhdGEvdXBkYXRlc2l0ZS9ub2ZlYXR1cmVpZGFuZHZlcnNpb24iKTsKLQkJVXBkYXRlU2l0ZSB1cGRhdGVzaXRlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXVwZGF0ZXNpdGUgPSBVcGRhdGVTaXRlLmxvYWQoc2l0ZS50b1VSTCgpLCBnZXRNb25pdG9yKCkpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJZmFpbCgiMC4yIiwgZSk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjMiLCBlKTsKLQkJfQotCQl0cnkgewotCQkJaW50IGZlYXR1cmVDb3VudCA9IHVwZGF0ZXNpdGUubG9hZEZlYXR1cmVzKCkubGVuZ3RoOwotCQkJYXNzZXJ0RXF1YWxzKDIsIGZlYXR1cmVDb3VudCk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlmYWlsKCIwLjUiKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHRlc3RNaXJyb3JzKCkgewotCQkvLyBUT0RPIHRlc3QgdGhlIGNhc2Ugd2hlcmUgdGhlIHNpdGUueG1sIHBvaW50cyB0byBhIG1pcnJvciBsb2NhdGlvbgotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2Nzc0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTxwcm9qZWN0IG5hbWU9InAyIEF1dG9tYXRlZCBUZXN0cyIgZGVmYXVsdD0icnVuIiBiYXNlZGlyPSIuIj4KLQotCTwhLS0gVGhlIHByb3BlcnR5ICR7ZWNsaXBzZS1ob21lfSBzaG91bGQgYmUgcGFzc2VkIGludG8gdGhpcyBzY3JpcHQgLS0+Ci0JPCEtLSBzZXRzIHRoZSBwcm9wZXJ0aWVzIGVjbGlwc2UtaG9tZSwgYW5kIGxpYnJhcnktZmlsZSAtLT4KLQk8cHJvcGVydHkgbmFtZT0iZWNsaXBzZS1ob21lIiB2YWx1ZT0iJHtiYXNlZGlyfS8uLi8uLi8iIC8+Ci0JPHByb3BlcnR5IG5hbWU9ImxpYnJhcnktZmlsZSIgdmFsdWU9IiR7ZWNsaXBzZS1ob21lfS9wbHVnaW5zL29yZy5lY2xpcHNlLnRlc3QvbGlicmFyeS54bWwiIC8+Ci0JPHByb3BlcnR5IG5hbWU9InAyX2xvY2F0aW9uIiB2YWx1ZT0iJHtlY2xpcHNlLWhvbWV9L3AyX3NuaWZmX2ZvbGRlciIgLz4KLQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzIiAvPgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBhbGwgaW5pdGlhbGl6YXRpb24gY29kZSB0aGF0IG5lZWRzIHRvIGJlIGRvbmUgZm9yIC0tPgotCTwhLS0gYWxsIHRlc3RzIHRoYXQgYXJlIHRvIGJlIHJ1bi4gSW5pdGlhbGl6YXRpb24gZm9yIGluZGl2aWR1YWwgdGVzdHMgLS0+Ci0JPCEtLSBzaG91bGQgYmUgZG9uZSB3aXRoaW4gdGhlIGJvZHkgb2YgdGhlIHN1aXRlIHRhcmdldC4gLS0+Ci0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHRzdGFtcCAvPgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBob2xkcyBjb2RlIHRvIGNsZWFudXAgdGhlIHRlc3RpbmcgZW52aXJvbm1lbnQgYWZ0ZXIgdGhlIHRlc3RzIC0tPgotCTwhLS0gaGF2ZSBiZWVuIHJ1bi4gWW91IGNhbiB1c2UgdGhpcyB0byBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQuIC0tPgotCTx0YXJnZXQgbmFtZT0iY2xlYW51cCI+Ci0JCTxkZWxldGUgZGlyPSIke3AyX2xvY2F0aW9ufSIgcXVpZXQ9InRydWUiIC8+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHRlc3Qgc3VpdGUuIEFueSBhY3Rpb25zIHRoYXQgbmVlZCB0byBoYXBwZW4gYWZ0ZXIgYWxsIC0tPgotCTwhLS0gdGhlIHRlc3RzIGhhdmUgYmVlbiBydW4gc2hvdWxkIGdvIGhlcmUuIC0tPgotCTx0YXJnZXQgbmFtZT0icnVuIiBkZXBlbmRzPSJpbml0LHN1aXRlLGNsZWFudXAiPgotCQk8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIgLz4KLQkJPC9hbnQ+Ci0JPC90YXJnZXQ+Ci0KLQk8IS0tIFRoaXMgdGFyZ2V0IHJ1bnMgdGhlIHBlcmZvcm1hbmNlIHRlc3Qgc3VpdGVzLiBBbnkgYWN0aW9ucyB0aGF0IG5lZWQgdG8gaGFwcGVuIGFmdGVyIGFsbCAtLT4KLQk8IS0tIHRoZSB0ZXN0cyBoYXZlIGJlZW4gcnVuIHNob3VsZCBnbyBoZXJlLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlIiBkZXBlbmRzPSJpbml0LHBlcmZvcm1hbmNlLXN1aXRlLGNsZWFudXAiPgotCQk8YW50IHRhcmdldD0iY29sbGVjdCIgYW50ZmlsZT0iJHtsaWJyYXJ5LWZpbGV9IiBkaXI9IiR7ZWNsaXBzZS1ob21lfSI+Ci0JCQk8cHJvcGVydHkgbmFtZT0iaW5jbHVkZXMiIHZhbHVlPSJvcmcqLnhtbCIgLz4KLQkJCTxwcm9wZXJ0eSBuYW1lPSJvdXRwdXQtZmlsZSIgdmFsdWU9IiR7cGx1Z2luLW5hbWV9LnhtbCIgLz4KLQkJPC9hbnQ+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InAyVGVzdHMiIGRlcGVuZHM9ImluaXQsY2xlYW51cCI+Ci0JCTxhbnQgdGFyZ2V0PSJjb3JlLXRlc3QiIGFudGZpbGU9IiR7bGlicmFyeS1maWxlfSIgZGlyPSIke2VjbGlwc2UtaG9tZX0iPgotCQkJPHByb3BlcnR5IG5hbWU9ImRhdGEtZGlyIiB2YWx1ZT0iJHtwMl9sb2NhdGlvbn0iIC8+Ci0JCQk8cHJvcGVydHkgbmFtZT0icGx1Z2luLW5hbWUiIHZhbHVlPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzIiAvPgotCQkJPHByb3BlcnR5IG5hbWU9ImNsYXNzbmFtZSIgdmFsdWU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMuQXV0b21hdGVkVGVzdHMiIC8+Ci0JCTwvYW50PgotCTwvdGFyZ2V0PgotCi0JPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InN1aXRlIiBkZXBlbmRzPSJwMlRlc3RzIiAvPgotCi0JPCEtLSBUaGlzIHRhcmdldCBkZWZpbmVzIHRoZSBwZXJmb3JtYW5jZSB0ZXN0cyB0aGF0IG5lZWQgdG8gYmUgcnVuLiAtLT4KLQk8dGFyZ2V0IG5hbWU9InBlcmZvcm1hbmNlLXN1aXRlIiBkZXBlbmRzPSJwMlBlcmZvcm1hbmNlVGVzdHMiIC8+Ci0KLQk8dGFyZ2V0IG5hbWU9InAyUGVyZm9ybWFuY2VUZXN0cyI+Ci0JCTwhLS0gVE9ETyAtLT4KLQk8L3RhcmdldD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9idW5kbGVzVHh0L29yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uXzMuNC4wLnYyMDA3MDkxMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvYnVuZGxlc1R4dC9vcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbl8zLjQuMC52MjAwNzA5MTAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGIyYjc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9idW5kbGVzVHh0L29yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uXzMuNC4wLnYyMDA3MDkxMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvYnVuZGxlc1R4dC9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvYnVuZGxlc1R4dC9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NTQyOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2J1bmRsZXNUeHQvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2J1bmRsZXNUeHQvb3JnLmVjbGlwc2Uub3NnaV8zLjQuMC52MjAwNzEwMzAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2J1bmRsZXNUeHQvb3JnLmVjbGlwc2Uub3NnaV8zLjQuMC52MjAwNzEwMzAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NThiMDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9idW5kbGVzVHh0L29yZy5lY2xpcHNlLm9zZ2lfMy40LjAudjIwMDcxMDMwLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzXzMuMS4yMDAudjIwMDcwNjA1LmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzXzMuMS4yMDAudjIwMDcwNjA1LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2MDYxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlc18zLjEuMjAwLnYyMDA3MDYwNS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvRUNMSVBTRS5SU0EgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvRUNMSVBTRS5SU0EKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNmZkN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL0VDTElQU0UuUlNBCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL0VDTElQU0UuU0YgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvRUNMSVBTRS5TRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlNzRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvRUNMSVBTRS5TRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLVNpZ25hdHVyZS1WZXJzaW9uOiAxLjANCi1TSEExLURpZ2VzdC1NYW5pZmVzdC1NYWluLUF0dHJpYnV0ZXM6IHRQU2xSZDZzVU11OEhHQnJaenJ5RWk3eG9BST0NCi1DcmVhdGVkLUJ5OiAxLjUuMCAoSUJNIENvcnBvcmF0aW9uKQ0KLVNIQTEtRGlnZXN0LU1hbmlmZXN0OiA3QzNYbzJFN1lqbm5WM1R4SGNYMTFpNGM1QkE9DQotDQotTmFtZTogcGx1Z2luLnByb3BlcnRpZXMNCi1TSEExLURpZ2VzdDogNVhDN0VkTThFT0NhMVZBU3A0TS9iZ3V0Mm1rPQ0KLQ0KLU5hbWU6IGFib3V0Lmh0bWwNCi1TSEExLURpZ2VzdDogM0ZHbGxqV1p3WGFwcnNBeE5WSldOU2hrT2lRPQ0KLQ0KLU5hbWU6IGFib3V0X2ZpbGVzL2NwbC12MTAuaHRtbA0KLVNIQTEtRGlnZXN0OiBZWlVWK0JGbnc2WExSZFUwZUN2MUZZZHk4Y1E9DQotDQotTmFtZToganVuaXQuamFyDQotU0hBMS1EaWdlc3Q6IGFOS0Q3Z0t4cEJFajVzRHY0Y3d6V2VYUmlmUT0NCi0NCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZg0KLVNIQTEtRGlnZXN0OiBTQXFZKzVJVEFMMG1rZFllaWpsU1JoeUlhWms9DQotDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDE2YzdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDMuOC4yLnYyMDA3MDYxMTE3MzgKLUV4cG9ydC1QYWNrYWdlOiBqdW5pdC5hd3R1aTt2ZXJzaW9uPSIzLjguMiIsanVuaXQuZXh0ZW5zaW9uczt2ZXJzaW9uPSIKLSAzLjguMiIsanVuaXQuZnJhbWV3b3JrO3ZlcnNpb249IjMuOC4yIixqdW5pdC5ydW5uZXI7dmVyc2lvbj0iMy44LjIiLGoKLSB1bml0LnN3aW5ndWk7dmVyc2lvbj0iMy44LjIiLGp1bml0LnN3aW5ndWkuaWNvbnM7dmVyc2lvbj0iMy44LjIiLGp1bmkKLSB0LnRleHR1aTt2ZXJzaW9uPSIzLjguMiIKLUNyZWF0ZWQtQnk6IDIuMyAoSUJNIENvcnBvcmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmp1bml0Ci1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtQ2xhc3NQYXRoOiBqdW5pdC5qYXIKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi0KLU5hbWU6IHBsdWdpbi5wcm9wZXJ0aWVzCi1TSEExLURpZ2VzdDogbUw5eXZYQm1BQUppN0cxdGxzN2FrdXlQRytBPQotCi1OYW1lOiBhYm91dF9maWxlcy9jcGwtdjEwLmh0bWwKLVNIQTEtRGlnZXN0OiBvMGIxOWNlWitIUUhWWDBPcHM3NTFBUVZkd009Ci0KLU5hbWU6IGFib3V0Lmh0bWwKLVNIQTEtRGlnZXN0OiBpUHN5SlBFWUdUUStsdU9KaGlKZ1V0RFZZa0U9Ci0KLU5hbWU6IGp1bml0LmphcgotU0hBMS1EaWdlc3Q6IFkrS2FDUmJiQmNtVGh4RGVIQXhocnpZR2t5Zz0KLQotTmFtZTogTUVUQS1JTkYvZWNsaXBzZS5pbmYKLVNIQTEtRGlnZXN0OiBLeVQ5RkY3Qzd0ODZOb0JvYTJrWlQzWkpCZnc9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9lY2xpcHNlLmluZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9lY2xpcHNlLmluZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2NGQzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvZWNsaXBzZS5pbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNQcm9jZXNzZWQgdXNpbmcgSmFycHJvY2Vzc29yCi1wYWNrMjAwLmFyZ3MgPSAtRTQKLXBhY2syMDAuY29uZGl0aW9uZWQgPSB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDkxM2VlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAyOCwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotCi08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgCi1kaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAKLWZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIGZvciAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIGZvbGxvd3M6PC9wPgotCi08aDQ+SlVuaXQgMy44LjI8L2g0PgotCi08cD5UaGUgcGx1Zy1pbiBpcyBhY2NvbXBhbmllZCBieSBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgSlVuaXQub3JnLiAgVGhlIEpVbml0IDMuOC4yIGNvZGUgaW5jbHVkZWQgd2l0aCB0aGUgcGx1Zy1pbiBpbmNsdWRlcyBubyBtb2RpZmljYXRpb25zLgotWW91ciB1c2Ugb2YgSlVuaXQgMy44LjIgaW4gYm90aCBzb3VyY2UgYW5kIGJpbmFyeSBjb2RlIGZvcm0gY29udGFpbmVkIGluIHRoZSBwbHVnLWluIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotVGhlIGJpbmFyeSBjb2RlIGlzIGxvY2F0ZWQgaW4ganVuaXQuamFyIGFuZCB0aGUgc291cmNlIGNvZGUgaXMgbG9jYXRlZCBpbiBzcmMuamFyLjwvcD4KLQotPHA+aSkgSUJNIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgotCi08cD5paSkgSUJNIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOzwvcD4KLQotPHA+aWlpKSBJQk0gc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhlIENQTCBhcmUgb2ZmZXJlZCBieSB0aGF0IElCTSBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eS48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvYWJvdXRfZmlsZXMvY3BsLXYxMC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L2Fib3V0X2ZpbGVzL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU1ZTdiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvYWJvdXRfZmlsZXMvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+Ci0KLQotPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Ci08UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLQotPC9CT0RZPgotCi08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L2p1bml0LmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9qdW5pdC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjFmYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIxL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L2p1bml0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMS9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmYjk2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjEvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9SlVuaXQgVGVzdGluZyBGcmFtZXdvcmsKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5lY2xpcHNlLmVxdWlub3guanNwLmphc3Blci5yZWdpc3RyeV8xLjAuMC52MjAwNzA4MjcuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5lY2xpcHNlLmVxdWlub3guanNwLmphc3Blci5yZWdpc3RyeV8xLjAuMC52MjAwNzA4MjcuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjExMGE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuZWNsaXBzZS5lcXVpbm94LmpzcC5qYXNwZXIucmVnaXN0cnlfMS4wLjAudjIwMDcwODI3LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzXzMuMS4yMDAudjIwMDcwNjA1LmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzXzMuMS4yMDAudjIwMDcwNjA1LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2MDYxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlc18zLjEuMjAwLnYyMDA3MDYwNS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvRUNMSVBTRS5SU0EgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvRUNMSVBTRS5SU0EKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNmZkN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL0VDTElQU0UuUlNBCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL0VDTElQU0UuU0YgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvRUNMSVBTRS5TRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlNzRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvRUNMSVBTRS5TRgorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLVNpZ25hdHVyZS1WZXJzaW9uOiAxLjANCi1TSEExLURpZ2VzdC1NYW5pZmVzdC1NYWluLUF0dHJpYnV0ZXM6IHRQU2xSZDZzVU11OEhHQnJaenJ5RWk3eG9BST0NCi1DcmVhdGVkLUJ5OiAxLjUuMCAoSUJNIENvcnBvcmF0aW9uKQ0KLVNIQTEtRGlnZXN0LU1hbmlmZXN0OiA3QzNYbzJFN1lqbm5WM1R4SGNYMTFpNGM1QkE9DQotDQotTmFtZTogcGx1Z2luLnByb3BlcnRpZXMNCi1TSEExLURpZ2VzdDogNVhDN0VkTThFT0NhMVZBU3A0TS9iZ3V0Mm1rPQ0KLQ0KLU5hbWU6IGFib3V0Lmh0bWwNCi1TSEExLURpZ2VzdDogM0ZHbGxqV1p3WGFwcnNBeE5WSldOU2hrT2lRPQ0KLQ0KLU5hbWU6IGFib3V0X2ZpbGVzL2NwbC12MTAuaHRtbA0KLVNIQTEtRGlnZXN0OiBZWlVWK0JGbnc2WExSZFUwZUN2MUZZZHk4Y1E9DQotDQotTmFtZToganVuaXQuamFyDQotU0hBMS1EaWdlc3Q6IGFOS0Q3Z0t4cEJFajVzRHY0Y3d6V2VYUmlmUT0NCi0NCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZg0KLVNIQTEtRGlnZXN0OiBTQXFZKzVJVEFMMG1rZFllaWpsU1JoeUlhWms9DQotDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDE2YzdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDMuOC4yLnYyMDA3MDYxMTE3MzgKLUV4cG9ydC1QYWNrYWdlOiBqdW5pdC5hd3R1aTt2ZXJzaW9uPSIzLjguMiIsanVuaXQuZXh0ZW5zaW9uczt2ZXJzaW9uPSIKLSAzLjguMiIsanVuaXQuZnJhbWV3b3JrO3ZlcnNpb249IjMuOC4yIixqdW5pdC5ydW5uZXI7dmVyc2lvbj0iMy44LjIiLGoKLSB1bml0LnN3aW5ndWk7dmVyc2lvbj0iMy44LjIiLGp1bml0LnN3aW5ndWkuaWNvbnM7dmVyc2lvbj0iMy44LjIiLGp1bmkKLSB0LnRleHR1aTt2ZXJzaW9uPSIzLjguMiIKLUNyZWF0ZWQtQnk6IDIuMyAoSUJNIENvcnBvcmF0aW9uKQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmp1bml0Ci1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtQ2xhc3NQYXRoOiBqdW5pdC5qYXIKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi0KLU5hbWU6IHBsdWdpbi5wcm9wZXJ0aWVzCi1TSEExLURpZ2VzdDogbUw5eXZYQm1BQUppN0cxdGxzN2FrdXlQRytBPQotCi1OYW1lOiBhYm91dF9maWxlcy9jcGwtdjEwLmh0bWwKLVNIQTEtRGlnZXN0OiBvMGIxOWNlWitIUUhWWDBPcHM3NTFBUVZkd009Ci0KLU5hbWU6IGFib3V0Lmh0bWwKLVNIQTEtRGlnZXN0OiBpUHN5SlBFWUdUUStsdU9KaGlKZ1V0RFZZa0U9Ci0KLU5hbWU6IGp1bml0LmphcgotU0hBMS1EaWdlc3Q6IFkrS2FDUmJiQmNtVGh4RGVIQXhocnpZR2t5Zz0KLQotTmFtZTogTUVUQS1JTkYvZWNsaXBzZS5pbmYKLVNIQTEtRGlnZXN0OiBLeVQ5RkY3Qzd0ODZOb0JvYTJrWlQzWkpCZnc9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9lY2xpcHNlLmluZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9NRVRBLUlORi9lY2xpcHNlLmluZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2NGQzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvTUVUQS1JTkYvZWNsaXBzZS5pbmYKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNQcm9jZXNzZWQgdXNpbmcgSmFycHJvY2Vzc29yCi1wYWNrMjAwLmFyZ3MgPSAtRTQKLXBhY2syMDAuY29uZGl0aW9uZWQgPSB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDkxM2VlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPlNlcHRlbWJlciAyOCwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPGgzPlRoaXJkIFBhcnR5IENvbnRlbnQ8L2gzPgotCi08cD5UaGUgQ29udGVudCBpbmNsdWRlcyBpdGVtcyB0aGF0IGhhdmUgYmVlbiBzb3VyY2VkIGZyb20gdGhpcmQgcGFydGllcyBhcyBzZXQgb3V0IGJlbG93LiBJZiB5b3UgCi1kaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAKLWZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3ImcnNxdW87cyBsaWNlbnNlIGZvciAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHVzZS48L3A+Ci0KLTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIGZvbGxvd3M6PC9wPgotCi08aDQ+SlVuaXQgMy44LjI8L2g0PgotCi08cD5UaGUgcGx1Zy1pbiBpcyBhY2NvbXBhbmllZCBieSBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgSlVuaXQub3JnLiAgVGhlIEpVbml0IDMuOC4yIGNvZGUgaW5jbHVkZWQgd2l0aCB0aGUgcGx1Zy1pbiBpbmNsdWRlcyBubyBtb2RpZmljYXRpb25zLgotWW91ciB1c2Ugb2YgSlVuaXQgMy44LjIgaW4gYm90aCBzb3VyY2UgYW5kIGJpbmFyeSBjb2RlIGZvcm0gY29udGFpbmVkIGluIHRoZSBwbHVnLWluIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSAKLUNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7Q1BMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgQ1BMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+LgotVGhlIGJpbmFyeSBjb2RlIGlzIGxvY2F0ZWQgaW4ganVuaXQuamFyIGFuZCB0aGUgc291cmNlIGNvZGUgaXMgbG9jYXRlZCBpbiBzcmMuamFyLjwvcD4KLQotPHA+aSkgSUJNIGVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7PC9wPgotCi08cD5paSkgSUJNIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOzwvcD4KLQotPHA+aWlpKSBJQk0gc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhlIENQTCBhcmUgb2ZmZXJlZCBieSB0aGF0IElCTSBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eS48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvYWJvdXRfZmlsZXMvY3BsLXYxMC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L2Fib3V0X2ZpbGVzL2NwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU1ZTdiMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvYWJvdXRfZmlsZXMvY3BsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotPEhFQUQ+Ci08VElUTEU+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L1RJVExFPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9IRUFEPgotCi08Qk9EWSBCR0NPTE9SPSIjRkZGRkZGIiBWTElOSz0iIzgwMDAwMCI+Ci0KLQotPFAgQUxJR049IkNFTlRFUiI+PEI+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L0I+Ci08UD48Qj48L0I+PEZPTlQgU0laRT0iMyI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMyI+PC9GT05UPjxGT05UIFNJWkU9IjIiPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUiBUSEUgVEVSTVMgT0YgVEhJUyBDT01NT04gUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gIEFOWSBVU0UsIFJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRSBPRiBUSElTIEFHUkVFTUVOVC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj4xLiAgREVGSU5JVElPTlM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+IkNvbnRyaWJ1dGlvbiIgbWVhbnM6PC9GT05UPgotCi08VUw+PEZPTlQgU0laRT0iMiI+YSkgaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxCUiBDTEVBUj0iTEVGVCI+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmkpCSAJY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmlpKQkJYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj53aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkIGJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5BIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uIHN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gd2hpY2g6ICAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZSB3b3JrcyBvZiB0aGUgUHJvZ3JhbS4gIDwvRk9OVD48L1VMPgotCi08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iQ29udHJpYnV0b3IiIG1lYW5zIGFueSBwZXJzb24gb3IgZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPiJMaWNlbnNlZCBQYXRlbnRzICIgbWVhbiBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gIDwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIGRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj4iUmVjaXBpZW50IiBtZWFucyBhbnlvbmUgd2hvIHJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj48L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+Mi4gIEdSQU5UIE9GIFJJR0hUUzwvQj48L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YSkJPC9GT05UPjxGT05UIFNJWkU9IjIiPlN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHM8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+IFJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPC9GT05UPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj4gPC9GT05UPjxGT05UIFNJWkU9IjIiPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS48L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5iKSAJU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+UmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwODAwMCI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5yb3lhbHR5LWZyZWUgcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uIHRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuICBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvIGFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiAgTm8gaGFyZHdhcmUgcGVyIHNlIGlzIGxpY2Vuc2VkIGhlcmV1bmRlci4gICA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmMpCVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMgQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50IGZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkgdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiAgRm9yIGV4YW1wbGUsIGlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZSBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5kKQlFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodCByaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50LiA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjxCPjMuICBSRVFVSVJFTUVOVFM8L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PEI+PC9CPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aSkJZWZmZWN0aXZlbHkgZGlzY2xhaW1zPC9GT05UPjxGT05UIFNJWkU9IjIiPiBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQgY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvRk9OVD48L1VMPgotCi0KLTxVTD48Rk9OVCBTSVpFPSIyIj5paSkgCWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2ggYXMgbG9zdCBwcm9maXRzOyA8L0ZPTlQ+PC9VTD4KLQotCi08VUw+PEZPTlQgU0laRT0iMiI+aWlpKTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4Jc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdCBDb250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPml2KQlzdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kIGluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+IDwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iI0ZGMDAwMCI+PC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjRkYwMDAwIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlIGNvZGUgZm9ybTo8L0ZPTlQ+Ci0KLTxVTD48Rk9OVCBTSVpFPSIyIj5hKQlpdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9GT05UPjwvVUw+Ci0KLQotPFVMPjxGT05UIFNJWkU9IjIiPmIpCWEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiAgPC9GT05UPjwvVUw+Ci0KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIiBDT0xPUj0iIzAwMDBGRiI+PFNUUklLRT48L1NUUklLRT48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueSBjb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiAgPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUgb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3Mgc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uICA8L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj40LiAgQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L0I+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5IGFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiAgV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlIG9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsIGxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiAgIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyIENvbnRyaWJ1dG9yICgiSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IiKSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kIGNvc3RzIChjb2xsZWN0aXZlbHkgIkxvc3NlcyIpIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0byB0aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluIGNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiAgVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMgcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuICBJbiBvcmRlciB0byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQgYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuICBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlIGluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguICBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yLiAgSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UgY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gIFVuZGVyIHRoaXMgc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlIG90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiIgQ09MT1I9IiMwMDAwRkYiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiIENPTE9SPSIjMDAwMEZGIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PEI+NS4gIE5PIFdBUlJBTlRZPC9CPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMgQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgPC9GT05UPjxGT05UIFNJWkU9IjIiPnRoZSBQcm9ncmFtPC9GT05UPjxGT05UIFNJWkU9IjIiPiBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+LCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5wcm9ncmFtcyBvciBlcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9uczwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uICA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjxCPjYuICBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLDwvRk9OVD48Rk9OVCBTSVpFPSIyIj4gSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48Qj43LiAgR0VORVJBTDwvQj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+PEZPTlQgU0laRT0iMiI+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZSBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhIENvbnRyaWJ1dG9yIHdpdGggcmVzcGVjdCB0byBhIHBhdGVudCBhcHBsaWNhYmxlIHRvIHNvZnR3YXJlIChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQgYnkgdGhhdCBDb250cmlidXRvciB0byBzdWNoIFJlY2lwaWVudCB1bmRlciB0aGlzIEFncmVlbWVudCBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiAgSW4gYWRkaXRpb24sIGlmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2ggUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj48L0ZPTlQ+Ci08UD48Rk9OVCBTSVpFPSIyIj5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuICBJZiBhbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkgUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMgY29weXJpZ2h0ZWQgIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+cHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+dGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBJQk0gaXMgdGhlIGluaXRpYWwgQWdyZWVtZW50IFN0ZXdhcmQuICAgSUJNIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gIDwvRk9OVD48Rk9OVCBTSVpFPSIyIj5FYWNoIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiAgVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IDwvRk9OVD48Rk9OVCBTSVpFPSIyIj52ZXJzaW9uLiAgPC9GT05UPjxGT05UIFNJWkU9IjIiPkV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8gdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIgZXhwcmVzc2x5LCA8L0ZPTlQ+PEZPTlQgU0laRT0iMiI+YnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZTwvRk9OVD48Rk9OVCBTSVpFPSIyIj4uPC9GT05UPjxGT05UIFNJWkU9IjIiPiAgQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QgZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZSBTdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcyBBZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuICBFYWNoIHBhcnR5IHdhaXZlcyBpdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9GT05UPgotPFA+PEZPTlQgU0laRT0iMiI+PC9GT05UPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLTxQPjxGT05UIFNJWkU9IjIiPjwvRk9OVD4KLQotPC9CT0RZPgotCi08L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L2p1bml0LmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9qdW5pdC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMjFmYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2RpcmVjdG9yeXdhdGNoZXIyL29yZy5qdW5pdF8zLjguMi52MjAwNzA2MTExNzM4L2p1bml0LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9kaXJlY3Rvcnl3YXRjaGVyMi9vcmcuanVuaXRfMy44LjIudjIwMDcwNjExMTczOC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmYjk2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZGlyZWN0b3J5d2F0Y2hlcjIvb3JnLmp1bml0XzMuOC4yLnYyMDA3MDYxMTE3MzgvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWU9SlVuaXQgVGVzdGluZyBGcmFtZXdvcmsKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2VuZ2luZXJlcG8uamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2VuZ2luZXJlcG8uamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjIzYTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9lbmdpbmVyZXBvLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9leHRlbnNpb25sb2NhdGlvbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3BfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2V4dGVuc2lvbmxvY2F0aW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcF8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYTA0MTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2V4dGVuc2lvbmxvY2F0aW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcF8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUNyZWF0ZWQtQnk6IDEuNC4yIChJQk0gQ29ycG9yYXRpb24pCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotCi1OYW1lOiBmZWF0dXJlLnhtbAotU0hBMS1EaWdlc3Q6IFlWcEcyeVYrZkNLcHhqZ25jMlA3c2N3cmNOVT0KLQotTmFtZTogZmVhdHVyZS5wcm9wZXJ0aWVzCi1TSEExLURpZ2VzdDogVXpNMU1abmFaQnpiNUpIUFFaRTd3YnlkSldBPQotCi1OYW1lOiBsaWNlbnNlLmh0bWwKLVNIQTEtRGlnZXN0OiBZWGZhVkxheUU4Z2FFMFZXZkt6VUhzcDZJeU09Ci0KLU5hbWU6IE1FVEEtSU5GL2VjbGlwc2UuaW5mCi1TSEExLURpZ2VzdDogS3lUOUZGN0M3dDg2Tm9Cb2Eya1pUM1pKQmZ3PQotCi1OYW1lOiBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi1TSEExLURpZ2VzdDogeHN0QXFNZ3MvYTVBc1FYUVpTZERRNzl2ZU9BPQotCi1OYW1lOiBlcGwtdjEwLmh0bWwKLVNIQTEtRGlnZXN0OiBwVE95eWJjcEVlK1k4bGtTVlV0YXJNbGVYcUU9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9leHRlbnNpb25sb2NhdGlvbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3BfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL2ZlYXR1cmUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9leHRlbnNpb25sb2NhdGlvbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3BfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAzYTcyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZXh0ZW5zaW9ubG9jYXRpb24vZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFJDUAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgUHJvamVjdCBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1SaWNoIENsaWVudCBQbGF0Zm9ybQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9leHRlbnNpb25sb2NhdGlvbi9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3BfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL2ZlYXR1cmUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2V4dGVuc2lvbmxvY2F0aW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcF8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZWYxODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2V4dGVuc2lvbmxvY2F0aW9uL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcF8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MDkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucmNwIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBwbHVnaW49Im9yZy5lY2xpcHNlLnJjcCIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9ImNvbS5pYm0uaWN1IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuNi4xLnYyMDA3MDQxNyIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAuSTIwMDcwNjA1LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLkkyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi0gIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nLmJlYW5zIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLkkyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPiAgICAgICAgIAotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5qb2JzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDQyMyIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjEwMC52MjAwNzA1MzAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5hdXRoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAudjIwMDcwNTAyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA1MzAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDUyNCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4xLjAuSTIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5JMjAwNzA2MTQtMDgwMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5JMjAwNzA2MDgtMTEwMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNhcmJvbiIKLSAgICAgICAgIG9zPSJtYWNvc3giCi0gICAgICAgICB3cz0iY2FyYm9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAuSTIwMDcwNjA1LTAwMTAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4gICAgIAotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDYxNSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC53aW4zMi53aW4zMi54ODYiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICB3cz0id2luMzIiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotICAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3Qud3BmLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3cGYiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsubGludXgueDg2IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi0gIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4LnMzOTAiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0iczM5MCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi0gIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4LnMzOTB4IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9InMzOTB4IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+ICAgICAgICAgCi0gICAgICAgICAKLQkgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsuc29sYXJpcy5zcGFyYyIKLSAgICAgICAgIG9zPSJzb2xhcmlzIgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9InNwYXJjIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgICAgICAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLnNvbGFyaXMueDg2IgotICAgICAgICAgb3M9InNvbGFyaXMiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4LnBwYyIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJwcGMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsubGludXgueDg2XzY0IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9Ing4Nl82NCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LmNhcmJvbi5tYWNvc3giCi0gICAgICAgICBvcz0ibWFjb3N4IgotICAgICAgICAgd3M9ImNhcmJvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm1vdGlmLmFpeC5wcGMiCi0gICAgICAgICBvcz0iYWl4IgotICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgYXJjaD0icHBjIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYuaHB1eC5QQV9SSVNDIgotICAgICAgICAgb3M9ImhwdXgiCi0gICAgICAgICB3cz0ibW90aWYiCi0gICAgICAgICBhcmNoPSJQQV9SSVNDIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ1YSIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm1vdGlmLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJtb3RpZiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5saW51eC5pYTY0IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9ImlhNjQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAuSEVBRCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm1vdGlmLnNvbGFyaXMuc3BhcmMiCi0gICAgICAgICBvcz0ic29sYXJpcyIKLSAgICAgICAgIHdzPSJtb3RpZiIKLSAgICAgICAgIGFyY2g9InNwYXJjIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QucGhvdG9uLnFueC54ODYiCi0gICAgICAgICBvcz0icW54IgotICAgICAgICAgd3M9InBob3RvbiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lm1vdGlmLmhwdXguaWE2NF8zMiIKLSAgICAgICAgIG9zPSJocHV4IgotICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgYXJjaD0iaWE2NF8zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5IRUFEIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5yY3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjAudjIwMDcwNjEyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDMxOSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4gICAgICAgICAgIAotCi0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guYXBwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDQyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC52MjAwNzA1MjIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+ICAgICAgICAKLSAgICAgICAgIAotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA1MjIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLnNvbGFyaXMuc3BhcmMiCi0gICAgICAgICBvcz0ic29sYXJpcyIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJzcGFyYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPgotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmNhcmJvbi5tYWNvc3giCi0gICAgICAgICBvcz0ibWFjb3N4IgotICAgICAgICAgd3M9ImNhcmJvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPgotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5wcGMiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0icHBjIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+ICAgICAgICAgCi0gICAgICAgICAKLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXgueDg2IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPgotICAgICAgICAgCi0gICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnMzOTAiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0iczM5MCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci0gICAgICAgICAKLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MHgiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0iczM5MHgiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5saW51eC54ODYiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0ibW90aWYiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNTI0IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4gCi0gICAgICAgICAgIAotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODZfNjQiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ieDg2XzY0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIubW90aWYuYWl4LnBwYyIKLSAgICAgICAgIG9zPSJhaXgiCi0gICAgICAgICB3cz0ibW90aWYiCi0gICAgICAgICBhcmNoPSJwcGMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNTI0IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4KLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5ocHV4LlBBX1JJU0MiCi0gICAgICAgICBvcz0iaHB1eCIKLSAgICAgICAgIHdzPSJtb3RpZiIKLSAgICAgICAgIGFyY2g9IlBBX1JJU0MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwMjE5IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4gICAgICAgICAKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud3BmLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3cGYiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNTIzIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4KLSAgICAgICAgIAotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA1MjMiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPgotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2V4dGVuc2lvbmxvY2F0aW9uL3BsdWdpbnMvb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlc18zLjEuMjAwLnYyMDA3MDYwNS5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZXh0ZW5zaW9ubG9jYXRpb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzXzMuMS4yMDAudjIwMDcwNjA1LmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2MDYxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZXh0ZW5zaW9ubG9jYXRpb24vcGx1Z2lucy9vcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzXzMuMS4yMDAudjIwMDcwNjA1LmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9mZWF0dXJlVG9JVS9mZWF0dXJlMS5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZmVhdHVyZVRvSVUvZmVhdHVyZTEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjE5NDNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9mZWF0dXJlVG9JVS9mZWF0dXJlMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZmVhdHVyZVRvSVUvZmVhdHVyZTIuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2ZlYXR1cmVUb0lVL2ZlYXR1cmUyLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwMjEwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZmVhdHVyZVRvSVUvZmVhdHVyZTIuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2ZlYXR1cmVUb0lVL2ZlYXR1cmUzLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9mZWF0dXJlVG9JVS9mZWF0dXJlMy5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOTQ5ODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2ZlYXR1cmVUb0lVL2ZlYXR1cmUzLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvRXVyb3BhL3NpdGUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9FdXJvcGEvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YmYwMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9FdXJvcGEvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlIGRpZ2VzdFVSTD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzL2V1cm9wYS8iIG1pcnJvcnNVUkw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZG93bmxvYWRzL2Rvd25sb2FkLnBocD9maWxlPS9yZWxlYXNlcy9ldXJvcGEvc2l0ZS54bWwmYW1wO2Zvcm1hdD14bWwmYW1wO3Byb3RvY29sPWh0dHAiIHBhY2syMDA9InRydWUiPgotCi0gICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9ldXJvcGEvIj4KLSAgICAgICAgVGhpcyBFdXJvcGEgRGlzY292ZXJ5IFNpdGUgY29udGFpbnMgYSBudW1iZXIgb2YgRWNsaXBzZSBiYXNlZCBwcm9qZWN0cyAKLSAgICAgICAgcmVsZWFzZWQgc2ltdWx0YW5lb3VzbHksIEp1bmUgMjAwNy4KLSAgICA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iQyBhbmQgQysrIERldmVsb3BlbWVudCIgbmFtZT0iQyBhbmQgQysrIERldmVsb3BlbWVudCI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JbnRlZ3JhdGVkIERldmVsb3BlbWVudCBmb3IgQyBhbmQgQysrIHByb2dyYW1zLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeS1kZWY+Ci0gICAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iQ2hhcnRpbmcgYW5kIFJlcG9ydGluZyIgbmFtZT0iQ2hhcnRpbmcgYW5kIFJlcG9ydGluZyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5CdXNpbmVzcyBJbnRlbGxpZ2VuY2UgYW5kIFJlcG9ydGluZyBUb29sczwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeS1kZWY+Ci0gICAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iQ29sbGFib3JhdGlvbiBUb29scyIgbmFtZT0iQ29sbGFib3JhdGlvbiBUb29scyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIENvbGxhYm9yYXRpb24gYW5kIGludGVncmF0aW9uIHRvb2xzIGZvciB0aGUgRWNsaXBzZSBlbnZpcm9ubWVudC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NhdGVnb3J5LWRlZj4KLSAgICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJDb21tdW5pY2F0aW9ucyIgbmFtZT0iQ29tbXVuaWNhdGlvbnMiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBSZWFsLXRpbWUgY29tbXVuaWNhdGlvbnMgZm9yIEVjbGlwc2UuICBUbyB1c2UgYXBwbGljYXRpb25zIChlLmcuIElNLCByZWFsLXRpbWUgY29sbGFiLCBldGMuKSwgYm90aCB0aGUgQ29yZSBBUEkgYW5kIEFwcGxpY2F0aW9uIGZlYXR1cmVzIGFyZSByZXF1aXJlZC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NhdGVnb3J5LWRlZj4KLSAgICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJEYXRhYmFzZSBEZXZlbG9wbWVudCIgbmFtZT0iRGF0YWJhc2UgRGV2ZWxvcG1lbnQiPgotICAgICAgICA8ZGVzY3JpcHRpb24+VG9vbHMgdG8gYWxsb3cgaW50ZWdyYXRpb24gd2l0aCBhbmQgZWFzeSB1c2Ugb2YgRGF0YWJhc2VzLjwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeS1kZWY+Ci0gICAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iR3JhcGhpY2FsIEVkaXRvcnMgYW5kIEZyYW1ld29ya3MiIG5hbWU9IkdyYXBoaWNhbCBFZGl0b3JzIGFuZCBGcmFtZXdvcmtzIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkEgZnJhbWV3b3JrIHRvIGNyZWF0ZSBncmFwaGljYWwgZWRpdG9ycy48L2Rlc2NyaXB0aW9uPgotICAgIDwvY2F0ZWdvcnktZGVmPgotICAgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IkphdmEgRGV2ZWxvcG1lbnQiIG5hbWU9IkphdmEgRGV2ZWxvcG1lbnQiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBJbnRlZ3JhdGVkIGRldmVsb3BtZW50IHRvb2xzIGZvciBKYXZhIERldmVsb3BtZW50LCBpbmNsdWRpbmcgcGx1Z2luIGRldmVsb3BlbWVudCB3aXRoIEphdmEsIGFuZCBKMkVFIGFwcGxpY2F0aW9ucy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NhdGVnb3J5LWRlZj4KLSAgICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNb2RlbHMgYW5kIE1vZGVsIERldmVsb3BtZW50IiBuYW1lPSJNb2RlbHMgYW5kIE1vZGVsIERldmVsb3BtZW50Ij4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgTW9kZWwgY3JlYXRpb24gYW5kIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmtzIChlLmcuIEVNRiwgR01GKSBhbmQgc3BlY2lmaWMgbW9kZWxzIChTRE8sIEpFTSwgWFNEIEluZm9zZXQpLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvY2F0ZWdvcnktZGVmPgotICAgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlJlbW90ZSBBY2Nlc3MgYW5kIERldmljZSBEZXZlbG9wbWVudCIgbmFtZT0iUmVtb3RlIEFjY2VzcyBhbmQgRGV2aWNlIERldmVsb3BtZW50Ij4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlRvb2xzIGFuZCBGcmFtZXdvcmtzIGZvciBhY2Nlc3NpbmcgYW5kIG1hbmFnaW5nIHJlbW90ZSBjb21wdXRlcnMgb3IgZW1iZWRkZWQgZGV2aWNlczwvZGVzY3JpcHRpb24+Ci0gICAgPC9jYXRlZ29yeS1kZWY+Ci0gICAgPGNhdGVnb3J5LWRlZiBsYWJlbD0iU09BIERldmVsb3BtZW50IiBuYW1lPSJTT0EgRGV2ZWxvcG1lbnQiPgotICAgICAgICA8ZGVzY3JpcHRpb24+QSBwbGF0Zm9ybSBhbmQgdG9vbHMgZm9yIGRldmVsb3BpbmcKLSAgICAgICAgU2VydmljZS1PcmllbnRlZCBDb21wb25lbnQtYmFzZWQgIEFwcGxpY2F0aW9ucy48L2Rlc2NyaXB0aW9uPgotICAgIDwvY2F0ZWdvcnktZGVmPgotICAgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlRlc3RpbmcgYW5kIFBlcmZvcm1hbmNlIiBuYW1lPSJUZXN0aW5nIGFuZCBQZXJmb3JtYW5jZSI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Ub29scyBhbmQgRnJhbWV3b3JrcyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGFuZCBhdXRvbWF0aWMgdGVzdGluZy48L2Rlc2NyaXB0aW9uPgotICAgIDwvY2F0ZWdvcnktZGVmPgotICAgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IldlYiBhbmQgSkVFIERldmVsb3BtZW50IiBuYW1lPSJXZWIgYW5kIEpFRSBEZXZlbG9wbWVudCI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5BIHBsYXRmb3JtIGFuZCB0b29scyBmb3IgZGV2ZWxvcGluZyBYTUwsIFdlYlNlcnZpY2VzLCBhbmQgSkVFIEFwcGxpY2F0aW9ucy48L2Rlc2NyaXB0aW9uPgotICAgIDwvY2F0ZWdvcnktZGVmPgotICAgIDxjYXRlZ29yeS1kZWYgbGFiZWw9IlByb2dyYW1taW5nIExhbmd1YWdlcyIgbmFtZT0iUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzIj4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVG9vbHMgYW5kIEZyYW1ld29ya3Mgc3VwcG9ydGluZyBwcm9ncmFtbWluZyBsYW5ndWFnZXMgZm9yIHRoZSBFY2xpcHNlIGVudmlyb25tZW50LgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvY2F0ZWdvcnktZGVmPgotICAgIDxjYXRlZ29yeS1kZWYgbGFiZWw9Ik90aGVyIFRvb2xzIiBuYW1lPSJPdGhlciBUb29scyI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIE90aGVyIHRvb2xzIGZvciB0aGUgRWNsaXBzZSBlbnZpcm9ubWVudC4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICA8L2NhdGVnb3J5LWRlZj4KLSAgICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJFbmFibGluZyBGZWF0dXJlcyIgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGVzZSBmZWF0dXJlcyBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgcmVxdWlyZWQgYnkgb25lIG9yIG1vcmUgcHJvamVjdHMsIGJ1dCBkbyBub3QgcHJvdmlkZSBlbmQtdXNlciBmdW5jdGlvbmFsaXR5IGJ5Ci0gICAgICAgICAgICB0aGVtc2VsdmVzLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgIDwvY2F0ZWdvcnktZGVmPgotCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVjbGlwc2Vtb25rZXkiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lY2xpcHNlbW9ua2V5XzEuMC4wLjIwMDcwNjA2MDk0Ny5qYXIiIHZlcnNpb249IjEuMC4wLjIwMDcwNjA2MDk0NyI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJPdGhlciBUb29scyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmFwYWNoZS5iYXRpayIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5hcGFjaGUuYmF0aWtfMS42LjAudjIwMDYxMjIyLTEyMjItMDg0MjI4MzQ0NC0zNDQ0LmphciIgdmVyc2lvbj0iMS42LjAudjIwMDYxMjIyLTEyMjItMDg0MjI4MzQ0NC0zNDQ0Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotCi0KLQotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtXzMuMy4yLlIzM3hfdjIwMDcxMDIyLV8xOVVFa3NGLUc4WWM2YlV2M0R6LmphciIgdmVyc2lvbj0iMy4zLjIuUjMzeF92MjAwNzEwMjItXzE5VUVrc0YtRzhZYzZiVXYzRHoiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmN2cyIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmN2c18xLjAuMS5SMzN4X3IyMDA3MDgwMi03Qzc5XzlfS0tHLW1ETTllM0g1RC5qYXIiIHZlcnNpb249IjEuMC4xLlIzM3hfcjIwMDcwODAyLTdDNzlfOV9LS0ctbURNOWUzSDVEIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkNvbGxhYm9yYXRpb24gVG9vbHMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLQotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94IiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veF8zLjMuMS5SMzN4X3IyMDA3MDkxOC03bjdMRUNnRUtWc0xJTTFhR0JPNGIwMC5qYXIiIHZlcnNpb249IjMuMy4xLlIzM3hfcjIwMDcwOTE4LTduN0xFQ2dFS1ZzTElNMWFHQk80YjAwIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5iaXJ0IiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmlydF8yLjIuMS52MjAwNzA3MDktN003TTdBM09QMk16LXlBSXRpbDY0cjl6MHR3MC5qYXIiIHZlcnNpb249IjIuMi4xLnYyMDA3MDcwOS03TTdNN0EzT1AyTXoteUFJdGlsNjRyOXowdHcwIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkNoYXJ0aW5nIGFuZCBSZXBvcnRpbmciLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJpcnQuZG9jIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYmlydC5kb2NfMi4yLjEudjIwMDcwNzA5LTExMC1zMzMyQXczMTE4MV8yXy5qYXIiIHZlcnNpb249IjIuMi4xLnYyMDA3MDcwOS0xMTAtczMzMkF3MzExODFfMl8iPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iQ2hhcnRpbmcgYW5kIFJlcG9ydGluZyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICAKLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmFwYWNoZS5kZXJieS5jb3JlIiB1cmw9ImZlYXR1cmVzL29yZy5hcGFjaGUuZGVyYnkuY29yZV8xMC4xLjIuMS5qYXIiIHZlcnNpb249IjEwLjEuMi4xIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotCi0gICAgPGZlYXR1cmUgaWQ9ImNvbS5sb3dhZ2llLml0ZXh0IiB1cmw9ImZlYXR1cmVzL2NvbS5sb3dhZ2llLml0ZXh0XzEuNS4yLnYyMDA3MDYwOC0wNDEtdzMxMTgxODIxLmphciIgdmVyc2lvbj0iMS41LjIudjIwMDcwNjA4LTA0MS13MzExODE4MjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYyIgdXJsPSJmZWF0dXJlcy9vcmcuYXBhY2hlLmNvbW1vbnMuY29kZWNfMS4zLjAudjIwMDcwOTA3LTAyLS13MzExODE3MjIyODQ5LmphciIgdmVyc2lvbj0iMS4zLjAudjIwMDcwOTA3LTAyLS13MzExODE3MjIyODQ5Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcubW96aWxsYS5yaGlubyIgdXJsPSJmZWF0dXJlcy9vcmcubW96aWxsYS5yaGlub18xLjYuMC52MjAwNzA0MDYtMDUtLXczMTE4MTgyMS5qYXIiIHZlcnNpb249IjEuNi4wLnYyMDA3MDQwNi0wNS0tdzMxMTgxODIxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcudzNjLnNhYyIgdXJsPSJmZWF0dXJlcy9vcmcudzNjLnNhY18xLjMuMC52MjAwNzA0MDYtMDItLXczMTE4MTgyMS5qYXIiIHZlcnNpb249IjEuMy4wLnYyMDA3MDQwNi0wMi0tdzMxMTgxODIxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5jZHQiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5jZHRfNC4wLjEuMjAwNzA5MjQxMjAyLmphciIgdmVyc2lvbj0iNC4wLjEuMjAwNzA5MjQxMjAyIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkMgYW5kIEMrKyBEZXZlbG9wZW1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpkdCIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdF8zLjMuMS5yMzMxX3YyMDA3MDYyOS03bzdqRTcyRURsWEFicUFjbmJteWcxcmY4UklMLmphciIgdmVyc2lvbj0iMy4zLjEucjMzMV92MjAwNzA2MjktN283akU3MkVEbFhBYnFBY25ibXlnMXJmOFJJTCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJKYXZhIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5wZGUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGVfMy4zLjIuUjMzeF9yMjAwNzEwMjItN043TTRDWVdMQkN6LXlIa01JdUhOLmphciIgdmVyc2lvbj0iMy4zLjIuUjMzeF9yMjAwNzEwMjItN043TTRDWVdMQkN6LXlIa01JdUhOIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkphdmEgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mXzIuMy4xLnYyMDA3MDkyNTIxMzUuamFyIiB2ZXJzaW9uPSIyLjMuMS52MjAwNzA5MjUyMTM1Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5zZGsiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuc2RrXzIuMy4xLnYyMDA3MDkyNTIxMzUuamFyIiB2ZXJzaW9uPSIyLjMuMS52MjAwNzA5MjUyMTM1Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8iIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmUuc2RvXzIuMy4wLnYyMDA3MDkyNTIxMzUuamFyIiB2ZXJzaW9uPSIyLjMuMC52MjAwNzA5MjUyMTM1Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5zZG8uc2RrIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnNkby5zZGtfMi4zLjAudjIwMDcwOTI1MjEzNS5qYXIiIHZlcnNpb249IjIuMy4wLnYyMDA3MDkyNTIxMzUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iTW9kZWxzIGFuZCBNb2RlbCBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UueHNkIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkXzIuMy4xLnYyMDA3MDkyNTIxMzUuamFyIiB2ZXJzaW9uPSIyLjMuMS52MjAwNzA5MjUyMTM1Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnhzZC5zZGsiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS54c2Quc2RrXzIuMy4xLnYyMDA3MDkyNTIxMzUuamFyIiB2ZXJzaW9uPSIyLjMuMS52MjAwNzA5MjUyMTM1Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLmNvbW1vbiIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi5jb21tb25fMi4zLjAudjIwMDcwOTI1MjEzNS5qYXIiIHZlcnNpb249IjIuMy4wLnYyMDA3MDkyNTIxMzUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5jb21tb24udWkiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuY29tbW9uLnVpXzIuMy4xLnYyMDA3MDkyNTIxMzUuamFyIiB2ZXJzaW9uPSIyLjMuMS52MjAwNzA5MjUyMTM1Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZWNvcmVfMi4zLjEudjIwMDcwOTI1MjEzNS5qYXIiIHZlcnNpb249IjIuMy4xLnYyMDA3MDkyNTIxMzUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5lZGl0IiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmVkaXRfMi4zLjAudjIwMDcwOTI1MjEzNS5qYXIiIHZlcnNpb249IjIuMy4wLnYyMDA3MDkyNTIxMzUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0IiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVkaXRfMi4zLjEudjIwMDcwOTI1MjEzNS5qYXIiIHZlcnNpb249IjIuMy4xLnYyMDA3MDkyNTIxMzUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5lZGl0LnVpIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVkaXQudWlfMi4zLjEudjIwMDcwOTI1MjEzNS5qYXIiIHZlcnNpb249IjIuMy4xLnYyMDA3MDkyNTIxMzUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnhzZC5lZGl0IiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UueHNkLmVkaXRfMi4zLjAudjIwMDcwOTI1MjEzNS5qYXIiIHZlcnNpb249IjIuMy4wLnYyMDA3MDkyNTIxMzUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLmVtZnF0di5hbGwiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYuZW1mcXR2LmFsbF8xLjEuMS52MjAwNzA3MjUyMDM2LTY1Ml9zSVJIdHRvSGhtZHBUWVJlWFYtMktFWlouamFyIiB2ZXJzaW9uPSIxLjEuMS52MjAwNzA3MjUyMDM2LTY1Ml9zSVJIdHRvSGhtZHBUWVJlWFYtMktFWloiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iTW9kZWxzIGFuZCBNb2RlbCBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLmVtZnF0di5hbGwuc2RrIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLmVtZnF0di5hbGwuc2RrXzEuMS4xLnYyMDA3MDcyNTIwMzYtN0E3XzNEamZVQTVYaW44ZHotOWFHTlZJSFlsSy5qYXIiIHZlcnNpb249IjEuMS4xLnYyMDA3MDcyNTIwMzYtN0E3XzNEamZVQTVYaW44ZHotOWFHTlZJSFlsSyI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJNb2RlbHMgYW5kIE1vZGVsIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lbWYucXVlcnkiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYucXVlcnlfMS4xLjAudjIwMDcwNjA3MTcxMi0xMC03dzMxMTgxNzE4MjgyMy5qYXIiIHZlcnNpb249IjEuMS4wLnYyMDA3MDYwNzE3MTItMTAtN3czMTE4MTcxODI4MjMiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5xdWVyeS5vY2wiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYucXVlcnkub2NsXzEuMS4wLnYyMDA3MDYwNzE3MTItMTAtN3czMTE4MTcxODI4MjMuamFyIiB2ZXJzaW9uPSIxLjEuMC52MjAwNzA2MDcxNzEyLTEwLTd3MzExODE3MTgyODIzIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lbWYudmFsaWRhdGlvbiIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uXzEuMS4xLnYyMDA3MDgxNjE0NDUtMzE4WjlvQTU1UDVPNk84SUNfLmphciIgdmVyc2lvbj0iMS4xLjEudjIwMDcwODE2MTQ0NS0zMThaOW9BNTVQNU82TzhJQ18iPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm9jbCIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVtZi52YWxpZGF0aW9uLm9jbF8xLjEuMC52MjAwNzA2MDcxNTIwLTEwLTd3MzExODE3MTgyNjMxLmphciIgdmVyc2lvbj0iMS4xLjAudjIwMDcwNjA3MTUyMC0xMC03dzMxMTgxNzE4MjYzMSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZW1mLnRyYW5zYWN0aW9uXzEuMS4xLnYyMDA3MDgyMzE5NDgtMjA4WjhzNzMzRzNHNUM1STlELmphciIgdmVyc2lvbj0iMS4xLjEudjIwMDcwODIzMTk0OC0yMDhaOHM3MzNHM0c1QzVJOUQiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi53b3Jrc3BhY2UiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYud29ya3NwYWNlXzEuMS4xLnYyMDA3MDcyNTIwMzYtMjA4WjhzNzMzRzNGNUU2XzhCLmphciIgdmVyc2lvbj0iMS4xLjEudjIwMDcwNzI1MjAzNi0yMDhaOHM3MzNHM0Y1RTZfOEIiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmpldCIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmpldF8wLjguMS52MjAwNzA5MTMtMTdFMTlvQTU1UDVWXzguamFyIiB2ZXJzaW9uPSIwLjguMS52MjAwNzA5MTMtMTdFMTlvQTU1UDVWXzgiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iTW9kZWxzIGFuZCBNb2RlbCBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuamV0LnNkayIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmpldC5zZGtfMC44LjEudjIwMDcwOTEzLTA3VTE4MlRaN2NqV0VHa0J1SkguamFyIiB2ZXJzaW9uPSIwLjguMS52MjAwNzA5MTMtMDdVMTgyVFo3Y2pXRUdrQnVKSCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJNb2RlbHMgYW5kIE1vZGVsIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmdtZi5ldXJvcGEiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5nbWYuZXVyb3BhXzIuMC4xLnYyMDA3MDgwOS0wMDAwLTdYNzdfX0VJbi1oejBZU2ZSeThISk5BTVRGZmsuamFyIiB2ZXJzaW9uPSIyLjAuMS52MjAwNzA4MDktMDAwMC03WDc3X19FSW4taHowWVNmUnk4SEpOQU1URmZrIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLQk8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW9kbSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmVvZG1fMC45LjEudjIwMDcxMDA5MDMwMi5qYXIiIHZlcnNpb249IjAuOS4xLnYyMDA3MTAwOTAzMDIiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iTW9kZWxzIGFuZCBNb2RlbCBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZW9kbS5zZGsiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lb2RtLnNka18wLjkuMS52MjAwNzEwMDkwMzAyLmphciIgdmVyc2lvbj0iMC45LjEudjIwMDcxMDA5MDMwMiI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJNb2RlbHMgYW5kIE1vZGVsIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotCTxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5vY2wuYWxsIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2Uub2NsLmFsbF8xLjEuMS52MjAwNzA3MTMxNDE1LTMyMjdfNzVUaExCQmtCa0ZSR2RRWi5qYXIiIHZlcnNpb249IjEuMS4xLnYyMDA3MDcxMzE0MTUtMzIyN183NVRoTEJCa0JrRlJHZFFaIj4KLQkJPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLQk8L2ZlYXR1cmU+Ci0JPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLm9jbC5hbGwuc2RrIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2Uub2NsLmFsbC5zZGtfMS4xLjEudjIwMDcwNzEzMTQxNS02NTNfLUpBWVBSZ21NZHotWVhSRGxnbktvbkJrLmphciIgdmVyc2lvbj0iMS4xLjEudjIwMDcwNzEzMTQxNS02NTNfLUpBWVBSZ21NZHotWVhSRGxnbktvbkJrIj4KLQkJPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLQk8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLm9jbCIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLm9jbF8xLjEuMS52MjAwNzA3MTMxNDE1LTMyMDlvQTU1UDVON0Y4SkRILmphciIgdmVyc2lvbj0iMS4xLjEudjIwMDcwNzEzMTQxNS0zMjA5b0E1NVA1TjdGOEpESCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2Uub2NsLnVtbCIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLm9jbC51bWxfMS4xLjEudjIwMDcwNzEzMTQxNS0xMDA3dzMxMTgxODI0MjUyNi5qYXIiIHZlcnNpb249IjEuMS4xLnYyMDA3MDcxMzE0MTUtMTAwN3czMTE4MTgyNDI1MjYiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmVtZi5vY2wiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lbWYub2NsXzEuMS4xLnYyMDA3MDkxMjE5NTYtMTAwN3czMTE4MV8yMzJfNjcuamFyIiB2ZXJzaW9uPSIxLjEuMS52MjAwNzA5MTIxOTU2LTEwMDd3MzExODFfMjMyXzY3Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51bWwyIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudW1sMl8yLjEuMS52MjAwNzA4MzAxMjIyLmphciIgdmVyc2lvbj0iMi4xLjEudjIwMDcwODMwMTIyMiI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJNb2RlbHMgYW5kIE1vZGVsIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51bWwyLnNkayIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVtbDIuc2RrXzIuMS4xLnYyMDA3MDgzMDEyMjIuamFyIiB2ZXJzaW9uPSIyLjEuMS52MjAwNzA4MzAxMjIyIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9Ik1vZGVscyBhbmQgTW9kZWwgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnVtbDJ0b29scyIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnVtbDJ0b29sc18wLjcuMS52MjAwNzEwMDEwNTM0LmphciIgdmVyc2lvbj0iMC43LjEudjIwMDcxMDAxMDUzNCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJNb2RlbHMgYW5kIE1vZGVsIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS51bWwydG9vbHMuc2RrIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudW1sMnRvb2xzLnNka18wLjcuMS52MjAwNzEwMDEwNTM0LmphciIgdmVyc2lvbj0iMC43LjEudjIwMDcxMDAxMDUzNCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJNb2RlbHMgYW5kIE1vZGVsIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnRwdHAuYmlydCIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRwdHAuYmlydF80LjQuMS52MjAwNzA2MTMyMTE2LTdJN0dfQi1odGhyTXBMU1pVWXB0Q1R6LWNWLUUuamFyIiB2ZXJzaW9uPSI0LjQuMS52MjAwNzA2MTMyMTE2LTdJN0dfQi1odGhyTXBMU1pVWXB0Q1R6LWNWLUUiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iVGVzdGluZyBhbmQgUGVyZm9ybWFuY2UiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnRwdHAud3RwIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudHB0cC53dHBfNC40LjEudjIwMDcwOTI2MTc1Mi03NzQ4YS1DSUhsQVo4bElIQWxDcUpmSmVSRi5qYXIiIHZlcnNpb249IjQuNC4xLnYyMDA3MDkyNjE3NTItNzc0OGEtQ0lIbEFaOGxJSEFsQ3FKZkplUkYiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iVGVzdGluZyBhbmQgUGVyZm9ybWFuY2UiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnRwdHAubW9uaXRvcmluZy5ydW50aW1lIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudHB0cC5tb25pdG9yaW5nLnJ1bnRpbWVfNC40LjEudjIwMDcwNjEzMjExNi03VTdSX0Utd2F2bklHSDdLRmhybTV6MDhaczhULmphciIgdmVyc2lvbj0iNC40LjEudjIwMDcwNjEzMjExNi03VTdSX0Utd2F2bklHSDdLRmhybTV6MDhaczhUIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IlRlc3RpbmcgYW5kIFBlcmZvcm1hbmNlIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS50cHRwLnBsYXRmb3JtLnJ1bnRpbWUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50cHRwLnBsYXRmb3JtLnJ1bnRpbWVfNC40LjEudjIwMDcwNjEzMjExNi04STgzRUlYMUpOSzdkd3Q3dEhudHJqNnhuSDg0LmphciIgdmVyc2lvbj0iNC40LjEudjIwMDcwNjEzMjExNi04STgzRUlYMUpOSzdkd3Q3dEhudHJqNnhuSDg0Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IlRlc3RpbmcgYW5kIFBlcmZvcm1hbmNlIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS50cHRwLnRlc3QucnVudGltZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRwdHAudGVzdC5ydW50aW1lXzQuMy4xMDEudjIwMDcwOTI2MTc1Mi03RTdfQWstUWhLVUFZNjd0YTIxbU84OUdfR1hPLmphciIgdmVyc2lvbj0iNC4zLjEwMS52MjAwNzA5MjYxNzUyLTdFN19Bay1RaEtVQVk2N3RhMjFtTzg5R19HWE8iPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iVGVzdGluZyBhbmQgUGVyZm9ybWFuY2UiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnRwdHAudHJhY2UucnVudGltZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnRwdHAudHJhY2UucnVudGltZV80LjMuMS52MjAwNzA5MjYxNzUyLTdFNzgzLVVVRU5CbU0zUmlRNFV4VnotZVpEOC5qYXIiIHZlcnNpb249IjQuMy4xLnYyMDA3MDkyNjE3NTItN0U3ODMtVVVFTkJtTTNSaVE0VXhWei1lWkQ4Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IlRlc3RpbmcgYW5kIFBlcmZvcm1hbmNlIi8+Ci0gICAgPC9mZWF0dXJlPgotCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmVfMi4wLjEudjIwMDcwOTExMDY1MC03QTFFQ0dDbmJja3owYm5yNXdDcDhLTkFqaXBSLmphciIgdmVyc2lvbj0iMi4wLjEudjIwMDcwOTExMDY1MC03QTFFQ0dDbmJja3owYm5yNXdDcDhLTkFqaXBSIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IldlYiBhbmQgSkVFIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS53c3QiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS53c3RfMi4wLjEudjIwMDcwOTExMDUxMC03Qy03NzhrMEpXTnI5M1dFSUh2cGxTVm9qV2VsLmphciIgdmVyc2lvbj0iMi4wLjEudjIwMDcwOTExMDUxMC03Qy03NzhrMEpXTnI5M1dFSUh2cGxTVm9qV2VsIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IldlYiBhbmQgSkVFIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5qc3QiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5qc3RfMi4wLjEudjIwMDcwOTExMDUxMC03Qi02OGREVE5JbWF6MGRpX1R2a3MxSnlEUFZlLmphciIgdmVyc2lvbj0iMi4wLjEudjIwMDcwOTExMDUxMC03Qi02OGREVE5JbWF6MGRpX1R2a3MxSnlEUFZlIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IldlYiBhbmQgSkVFIERldmVsb3BtZW50Ii8+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJKYXZhIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5qcHQuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmpwdC5mZWF0dXJlXzEuMC4xLnYyMDA3MDkxMzAwMDAtNzctNUNZUUNDei1EN0xRQ0NDRC5qYXIiIHZlcnNpb249IjEuMC4xLnYyMDA3MDkxMzAwMDAtNzctNUNZUUNDei1EN0xRQ0NDRCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJXZWIgYW5kIEpFRSBEZXZlbG9wbWVudCIvPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iSmF2YSBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLQotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX3VpLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlXzIuMC4xLnYyMDA3MDkxMTA2MjItN0M1RUgyRTlSdlRWbmlqcnNwVnowYmdPbWZ6LS5qYXIiIHZlcnNpb249IjIuMC4xLnYyMDA3MDkxMTA2MjItN0M1RUgyRTlSdlRWbmlqcnNwVnowYmdPbWZ6LSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4gICAgICAgIAotICAgIAotICAgIAotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5nZWYiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5nZWZfMy4zLjEudjIwMDcwODE0LmphciIgdmVyc2lvbj0iMy4zLjEudjIwMDcwODE0Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkdyYXBoaWNhbCBFZGl0b3JzIGFuZCBGcmFtZXdvcmtzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIAotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5nZWYuc2RrIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZ2VmLnNka18zLjMuMS52MjAwNzA4MTQuamFyIiB2ZXJzaW9uPSIzLjMuMS52MjAwNzA4MTQiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iR3JhcGhpY2FsIEVkaXRvcnMgYW5kIEZyYW1ld29ya3MiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLmRlc2lnbmVyLmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuY29ubmVjdGl2aXR5Lm9kYS5kZXNpZ25lci5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmNvbm5lY3Rpdml0eS5vZGEuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5jb25uZWN0aXZpdHkub2RhLmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZG9jLnVzZXIiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZG9jLnVzZXJfMS41LjEuMjAwNzEwMTYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzEwMTYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkRhdGFiYXNlIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5hcGFjaGUuZGVyYnkuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmFwYWNoZS5kZXJieS5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkRhdGFiYXNlIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5oc3FsZGIuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmhzcWxkYi5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuaWJtLmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5pYm0uZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmpkYmMuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmpkYmMuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LmpkdC5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuamR0LmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5tc2Z0LmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5tc2Z0LmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5teXNxbC5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQubXlzcWwuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm9kYS5kZXNpZ25lci5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQub2RhLmRlc2lnbmVyLmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vZGEuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50Lm9kYS5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQub3JhY2xlLmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuZW5hYmxlbWVudC5vcmFjbGUuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LnBvc3RncmVzcWwuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LnBvc3RncmVzcWwuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5lbmFibGVtZW50LnN5YmFzZS5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLmVuYWJsZW1lbnQuc3liYXNlLmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuaW50cm8iIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuaW50cm9fMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkRhdGFiYXNlIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMubW9kZWxiYXNlLmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkVuYWJsaW5nIEZlYXR1cmVzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc2RrLmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuc2RrLmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkRhdGFiYXNlIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsZGV2dG9vbHMuZGF0YS5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbGRldnRvb2xzLmRhdGEuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWxkZXZ0b29scy5kZGwuZmVhdHVyZSIgcGF0Y2g9ImZhbHNlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmRhdGF0b29scy5zcWxkZXZ0b29scy5kZGwuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWxkZXZ0b29scy5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbGRldnRvb2xzLmZlYXR1cmVfMS41LjEuMjAwNzA5MjYxLmphciIgdmVyc2lvbj0iMS41LjEuMjAwNzA5MjYxIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkRhdGFiYXNlIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsZGV2dG9vbHMucGFyc2Vycy5mZWF0dXJlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGF0YXRvb2xzLnNxbGRldnRvb2xzLnBhcnNlcnMuZmVhdHVyZV8xLjUuMS4yMDA3MDkyNjEuamFyIiB2ZXJzaW9uPSIxLjUuMS4yMDA3MDkyNjEiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRhdGF0b29scy5zcWxkZXZ0b29scy5yZXN1bHRzLmZlYXR1cmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kYXRhdG9vbHMuc3FsZGV2dG9vbHMucmVzdWx0cy5mZWF0dXJlXzEuNS4xLjIwMDcwOTI2MS5qYXIiIHZlcnNpb249IjEuNS4xLjIwMDcwOTI2MSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJFbmFibGluZyBGZWF0dXJlcyIvPgotICAgIDwvZmVhdHVyZT4KLSAgICAKLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UucnNlIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucnNlXzIuMC4yLnYyMDA3MTAzMC03RC02OG1KSWtSOVdBdmlxVjh6MFU5dnotQy5qYXIiIHZlcnNpb249IjIuMC4yLnYyMDA3MTAzMC03RC02OG1KSWtSOVdBdmlxVjh6MFU5dnotQyI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJSZW1vdGUgQWNjZXNzIGFuZCBEZXZpY2UgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnJzZS5zZGsiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5yc2Uuc2RrXzIuMC4yLnYyMDA3MTAzMC03Si03OUU3Wm9IUFA1Wm9lWi1vVWUxei13Sm5sLmphciIgdmVyc2lvbj0iMi4wLjIudjIwMDcxMDMwLTdKLTc5RTdab0hQUDVab2VaLW9VZTF6LXdKbmwiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iUmVtb3RlIEFjY2VzcyBhbmQgRGV2aWNlIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5yc2UucmVtb3RlY2R0IiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UucnNlLnJlbW90ZWNkdF8yLjAuMS52MjAwNzA5MjYtNC0xOHM3MzNHM0s1SC5qYXIiIHZlcnNpb249IjIuMC4xLnYyMDA3MDkyNi00LTE4czczM0czSzVIIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IlJlbW90ZSBBY2Nlc3MgYW5kIERldmljZSBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UudG0udGVybWluYWwuc2RrIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UudG0udGVybWluYWwuc2RrXzEuMC4yLnYyMDA3MTAzMC03Xy03Q0F2Tkt3TmFiV0RMaFFnbGhORERtR1NMLmphciIgdmVyc2lvbj0iMS4wLjIudjIwMDcxMDMwLTdfLTdDQXZOS3dOYWJXRExoUWdsaE5ERG1HU0wiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iUmVtb3RlIEFjY2VzcyBhbmQgRGV2aWNlIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS50bS5kaXNjb3ZlcnkiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS50bS5kaXNjb3ZlcnlfMi4wLjAudjIwMDcwNjExLTdKLS1FOE1jSUpOSkNQci5qYXIiIHZlcnNpb249IjIuMC4wLnYyMDA3MDYxMS03Si0tRThNY0lKTkpDUHIiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iUmVtb3RlIEFjY2VzcyBhbmQgRGV2aWNlIERldmVsb3BtZW50Ii8+Ci0gICAgPC9mZWF0dXJlPgotCi0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRkLmRzZi5zZGsiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kZC5kc2Yuc2RrXzAuOS4wLnYyMDA3MDYxNS5qYXIiIHZlcnNpb249IjAuOS4wLnYyMDA3MDYxNSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJSZW1vdGUgQWNjZXNzIGFuZCBEZXZpY2UgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRkLmRzZi5nZGIiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kZC5kc2YuZ2RiXzAuOS4wLnYyMDA3MDYxNS5qYXIiIHZlcnNpb249IjAuOS4wLnYyMDA3MDYxNSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJSZW1vdGUgQWNjZXNzIGFuZCBEZXZpY2UgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0gICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmRkLmRlYnVnLm1lbW9yeS5yZW5kZXJpbmdzIiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGQuZGVidWcubWVtb3J5LnJlbmRlcmluZ3NfMC45LjAudjIwMDcwNjE1LmphciIgdmVyc2lvbj0iMC45LjAudjIwMDcwNjE1Ij4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IlJlbW90ZSBBY2Nlc3MgYW5kIERldmljZSBEZXZlbG9wbWVudCIvPgotICAgIDwvZmVhdHVyZT4KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGQuaXB4YWN0IiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGQuaXB4YWN0XzAuMi4wLnYyMDA3MDYxNS5qYXIiIHZlcnNpb249IjAuMi4wLnYyMDA3MDYxNSI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJSZW1vdGUgQWNjZXNzIGFuZCBEZXZpY2UgRGV2ZWxvcG1lbnQiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZWNmLmNvcmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lY2YuY29yZV8xLjIuMC52MjAwNzEwMTktMTMwMC5qYXIiIHZlcnNpb249IjEuMi4wLnYyMDA3MTAxOS0xMzAwIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IkNvbW11bmljYXRpb25zIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5lY2YuZXhhbXBsZXMiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5lY2YuZXhhbXBsZXNfMS4yLjAudjIwMDcxMDE5LTEzMDAuamFyIiB2ZXJzaW9uPSIxLjIuMC52MjAwNzEwMTktMTMwMCI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJDb21tdW5pY2F0aW9ucyIvPgotICAgIDwvZmVhdHVyZT4KLQotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5hamR0IiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYWpkdF8xLjUuMC4yMDA3MDYwNzA2MTkuamFyIiB2ZXJzaW9uPSIxLjUuMC4yMDA3MDYwNzA2MTkiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iSmF2YSBEZXZlbG9wbWVudCIvPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzIi8+Ci0gICAgPC9mZWF0dXJlPgotICAgIAotICAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5kbHRrLmNvcmUiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kbHRrLmNvcmVfMC45LjEucjA5X3YyMDA3MDkyMC0wOE8yRThBV2pwa095U3k1VkFQQi5qYXIiIHZlcnNpb249IjAuOS4xLnIwOV92MjAwNzA5MjAtMDhPMkU4QVdqcGtPeVN5NVZBUEIiPgotICAgICAgICA8Y2F0ZWdvcnkgbmFtZT0iRW5hYmxpbmcgRmVhdHVyZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGx0ay5ydWJ5IiBwYXRjaD0iZmFsc2UiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuZGx0ay5ydWJ5XzAuOS4xLnIwOV92MjAwNzA5MjAtMDdxMkJNRWtyei1JTUNkN2dFSy5qYXIiIHZlcnNpb249IjAuOS4xLnIwOV92MjAwNzA5MjAtMDdxMkJNRWtyei1JTUNkN2dFSyI+Ci0gICAgICAgIDxjYXRlZ29yeSBuYW1lPSJQcm9ncmFtbWluZyBMYW5ndWFnZXMiLz4KLSAgICA8L2ZlYXR1cmU+Ci0KLSAgICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UuZGx0ay50Y2wiIHBhdGNoPSJmYWxzZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5kbHRrLnRjbF8wLjkuMS5yMDlfdjIwMDcwOTIwLTA3ejFDUU1VWVhHZ0p0M0s3My5qYXIiIHZlcnNpb249IjAuOS4xLnIwOV92MjAwNzA5MjAtMDd6MUNRTVVZWEdnSnQzSzczIj4KLSAgICAgICAgPGNhdGVnb3J5IG5hbWU9IlByb2dyYW1taW5nIExhbmd1YWdlcyIvPgotICAgIDwvZmVhdHVyZT4KLQotCi0JICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJ1Y2ttaW5zdGVyLmNvcmUuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5idWNrbWluc3Rlci5jb3JlLmZlYXR1cmVfMC4yLjAucjM2MzYuamFyIiB2ZXJzaW9uPSIwLjIuMC5yMzYzNiI+Ci0JICAgICAgPGNhdGVnb3J5IG5hbWU9Ik90aGVyIFRvb2xzIi8+Ci0JICAgPC9mZWF0dXJlPgotCSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5idWNrbWluc3Rlci5jdnMuZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5idWNrbWluc3Rlci5jdnMuZmVhdHVyZV8wLjIuMC5yMzM4My5qYXIiIHZlcnNpb249IjAuMi4wLnIzMzgzIj4KLQkgICAgICA8Y2F0ZWdvcnkgbmFtZT0iT3RoZXIgVG9vbHMiLz4KLQkgICA8L2ZlYXR1cmU+Ci0JICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJ1Y2ttaW5zdGVyLm1hdmVuLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYnVja21pbnN0ZXIubWF2ZW4uZmVhdHVyZV8wLjIuMC5yMzM4OC5qYXIiIHZlcnNpb249IjAuMi4wLnIzMzg4Ij4KLQkgICAgICA8Y2F0ZWdvcnkgbmFtZT0iT3RoZXIgVG9vbHMiLz4KLQkgICA8L2ZlYXR1cmU+Ci0JICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJ1Y2ttaW5zdGVyLnA0LmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UuYnVja21pbnN0ZXIucDQuZmVhdHVyZV8wLjIuMC5yMzM4MS5qYXIiIHZlcnNpb249IjAuMi4wLnIzMzgxIj4KLQkgICAgICA8Y2F0ZWdvcnkgbmFtZT0iT3RoZXIgVG9vbHMiLz4KLQkgICA8L2ZlYXR1cmU+Ci0JICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLmJ1Y2ttaW5zdGVyLnBkZS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLmJ1Y2ttaW5zdGVyLnBkZS5mZWF0dXJlXzAuMi4wLnIzNjM2LmphciIgdmVyc2lvbj0iMC4yLjAucjM2MzYiPgotCSAgICAgIDxjYXRlZ29yeSBuYW1lPSJPdGhlciBUb29scyIvPgotCSAgIDwvZmVhdHVyZT4KLQotICAgICAgICA8Y2F0ZWdvcnktZGVmIGxhYmVsPSJNeWx5biIgbmFtZT0iTXlseW4iLz4KLSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5teWx5bl9mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLm15bHluX2ZlYXR1cmVfMi4xLjAudjIwMDcwOTI3LTA5MDAuamFyIiB2ZXJzaW9uPSIyLjEuMC52MjAwNzA5MjctMDkwMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iTXlseW4iLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5teWx5bi5jb250ZXh0X2ZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UubXlseW4uY29udGV4dF9mZWF0dXJlXzIuMS4wLnYyMDA3MDkyNy0wOTAwLmphciIgdmVyc2lvbj0iMi4xLjAudjIwMDcwOTI3LTA5MDAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9Ik15bHluIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UubXlseW4uaWRlX2ZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UubXlseW4uaWRlX2ZlYXR1cmVfMi4xLjAudjIwMDcwOTI3LTA5MDAuamFyIiB2ZXJzaW9uPSIyLjEuMC52MjAwNzA5MjctMDkwMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iTXlseW4iLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5teWx5bi5qYXZhX2ZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UubXlseW4uamF2YV9mZWF0dXJlXzIuMS4wLnYyMDA3MDkyNy0wOTAwLmphciIgdmVyc2lvbj0iMi4xLjAudjIwMDcwOTI3LTA5MDAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9Ik15bHluIi8+Ci0gICA8L2ZlYXR1cmU+Ci0gICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2UubXlseW4ucGRlX2ZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UubXlseW4ucGRlX2ZlYXR1cmVfMi4xLjAudjIwMDcwOTI3LTA5MDAuamFyIiB2ZXJzaW9uPSIyLjEuMC52MjAwNzA5MjctMDkwMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iTXlseW4iLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5teWx5bi5idWd6aWxsYV9mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLm15bHluLmJ1Z3ppbGxhX2ZlYXR1cmVfMi4xLjAudjIwMDcwOTI3LTA5MDAuamFyIiB2ZXJzaW9uPSIyLjEuMC52MjAwNzA5MjctMDkwMCI+Ci0gICAgICA8Y2F0ZWdvcnkgbmFtZT0iTXlseW4iLz4KLSAgIDwvZmVhdHVyZT4KLSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5teWx5bi50cmFjX2ZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2UubXlseW4udHJhY19mZWF0dXJlXzIuMS4wLnYyMDA3MDkyNy0wOTAwLmphciIgdmVyc2lvbj0iMi4xLjAudjIwMDcwOTI3LTA5MDAiPgotICAgICAgPGNhdGVnb3J5IG5hbWU9Ik15bHluIi8+Ci0gICA8L2ZlYXR1cmU+Ci0KLSAgIDwhLS0gU09BIFRvb2xzIC0tPgotICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnN0cC5iMmouZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5zdHAuYjJqLmZlYXR1cmVfMC43LjAuMjAwNzEwMTYxMDU0LTA3Qy03NzMzRzUzNUU1M0NBLmphciIgdmVyc2lvbj0iMC43LjAuMjAwNzEwMTYxMDU0LTA3Qy03NzMzRzUzNUU1M0NBIj4KLSAgICAgPGNhdGVnb3J5IG5hbWU9IlNPQSBEZXZlbG9wbWVudCIvPgotICAgPC9mZWF0dXJlPgotICAgCi0gICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2Uuc3RwLmJwbW4uZmVhdHVyZSIgdXJsPSJmZWF0dXJlcy9vcmcuZWNsaXBzZS5zdHAuYnBtbi5mZWF0dXJlXzAuNy4wLjIwMDcxMDE2MTA1NC0wN1EtN0U3N1lBN0FVQTdRTS5qYXIiIHZlcnNpb249IjAuNy4wLjIwMDcxMDE2MTA1NC0wN1EtN0U3N1lBN0FVQTdRTSI+Ci0gICAgIDxjYXRlZ29yeSBuYW1lPSJTT0EgRGV2ZWxvcG1lbnQiLz4KLSAgIDwvZmVhdHVyZT4KLQotICAgPGZlYXR1cmUgaWQ9Im9yZy5lY2xpcHNlLnN0cC5jb3JlLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc3RwLmNvcmUuZmVhdHVyZV8wLjcuMC4yMDA3MTAxNjEwNTQtMDdRLTdFNzdZQTdBVUE3UU0uamFyIiB2ZXJzaW9uPSIwLjcuMC4yMDA3MTAxNjEwNTQtMDdRLTdFNzdZQTdBVUE3UU0iPgotICAgICA8Y2F0ZWdvcnkgbmFtZT0iU09BIERldmVsb3BtZW50Ii8+Ci0gICA8L2ZlYXR1cmU+Ci0gICAKLSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5zdHAuc2VydmljZWNyZWF0aW9uIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnN0cC5zZXJ2aWNlY3JlYXRpb25fMC43LjAuMjAwNzEwMTYxMDU0LTA3bC03TUFBcUdBR2tHQWVZLmphciIgdmVyc2lvbj0iMC43LjAuMjAwNzEwMTYxMDU0LTA3bC03TUFBcUdBR2tHQWVZIj4KLSAgICAgPGNhdGVnb3J5IG5hbWU9IlNPQSBEZXZlbG9wbWVudCIvPgotICAgPC9mZWF0dXJlPgotICAgCi0gICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2Uuc3RwLnNjLmpheHdzLmZlYXR1cmUiIHVybD0iZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc3RwLnNjLmpheHdzLmZlYXR1cmVfMC43LjAuMjAwNzEwMTYxMDU0LTA3Si03QTU1UDg1OE04NUpHLmphciIgdmVyc2lvbj0iMC43LjAuMjAwNzEwMTYxMDU0LTA3Si03QTU1UDg1OE04NUpHIj4KLSAgICAgPGNhdGVnb3J5IG5hbWU9IlNPQSBEZXZlbG9wbWVudCIvPgotICAgPC9mZWF0dXJlPgotICAgCi0gICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2Uuc3RwLnNjLnNjYS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnN0cC5zYy5zY2EuZmVhdHVyZV8wLjcuMC4yMDA3MTAxNjEwNTQtMDdKLTdBNTVQODU4TTg1SkcuamFyIiB2ZXJzaW9uPSIwLjcuMC4yMDA3MTAxNjEwNTQtMDdKLTdBNTVQODU4TTg1SkciPgotICAgICA8Y2F0ZWdvcnkgbmFtZT0iU09BIERldmVsb3BtZW50Ii8+Ci0gICA8L2ZlYXR1cmU+Ci0gICAKLSAgIDxmZWF0dXJlIGlkPSJvcmcuZWNsaXBzZS5zdHAuc29hcy5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnN0cC5zb2FzLmZlYXR1cmVfMC43LjAuMjAwNzEwMTYxMDU0LTA3ZS03TUFBcUdBR2tHQWVZLmphciIgdmVyc2lvbj0iMC43LjAuMjAwNzEwMTYxMDU0LTA3ZS03TUFBcUdBR2tHQWVZIj4KLSAgICAgPGNhdGVnb3J5IG5hbWU9IlNPQSBEZXZlbG9wbWVudCIvPgotICAgPC9mZWF0dXJlPgotICAgCi0gICA8ZmVhdHVyZSBpZD0ib3JnLmVjbGlwc2Uuc3RwLnNvYXMucnVudGltZS5mZWF0dXJlIiB1cmw9ImZlYXR1cmVzL29yZy5lY2xpcHNlLnN0cC5zb2FzLnJ1bnRpbWUuZmVhdHVyZV8wLjcuMC4yMDA3MTAxNjEwNTQtMDdKLTdBNTVQODU4TTg1SkcuamFyIiB2ZXJzaW9uPSIwLjcuMC4yMDA3MTAxNjEwNTQtMDdKLTdBNTVQODU4TTg1SkciPgotICAgICA8Y2F0ZWdvcnkgbmFtZT0iU09BIERldmVsb3BtZW50Ii8+Ci0gICA8L2ZlYXR1cmU+Ci08L3NpdGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmN2cy5zb3VyY2VfMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuY3ZzLnNvdXJjZV8xLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY1NmI2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuY3ZzLnNvdXJjZV8xLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQ3JlYXRlZC1CeTogMS40LjIgKElCTSBDb3Jwb3JhdGlvbikKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi0KLU5hbWU6IGZlYXR1cmUueG1sCi1TSEExLURpZ2VzdDogak5mVHdBb00vRDI5ZFhRRjJ5NWpOaG5DUm5jPQotCi1OYW1lOiBmZWF0dXJlLnByb3BlcnRpZXMKLVNIQTEtRGlnZXN0OiBBZUpjTUpUcFFCTmxjMDBUOENZbEY3LzJHbDQ9Ci0KLU5hbWU6IGxpY2Vuc2UuaHRtbAotU0hBMS1EaWdlc3Q6IFlYZmFWTGF5RThnYUUwVldmS3pVSHNwNkl5TT0KLQotTmFtZTogTUVUQS1JTkYvZWNsaXBzZS5pbmYKLVNIQTEtRGlnZXN0OiBLeVQ5RkY3Qzd0ODZOb0JvYTJrWlQzWkpCZnc9Ci0KLU5hbWU6IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLVNIQTEtRGlnZXN0OiB4c3RBcU1ncy9hNUFzUVhRWlNkRFE3OXZlT0E9Ci0KLU5hbWU6IGVwbC12MTAuaHRtbAotU0hBMS1EaWdlc3Q6IHBUT3l5YmNwRWUrWThsa1NWVXRhck1sZVhxRT0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmN2cy5zb3VyY2VfMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmN2cy5zb3VyY2VfMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTU5NTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5jdnMuc291cmNlXzEuMC4wLnYyMDA3MDYwNi03Qzc5Xzc5RUk5OWdfWTllL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgQ1ZTIENsaWVudCBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFByb2plY3QgVXBkYXRlcwotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249QVBJIGRvY3VtZW50YXRpb24gYW5kIHNvdXJjZSBjb2RlIHppcHMgZm9yIEVjbGlwc2UgQ1ZTIGNsaWVudC4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuY3ZzLnNvdXJjZV8xLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZS9mZWF0dXJlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5jdnMuc291cmNlXzEuMC4wLnYyMDA3MDYwNi03Qzc5Xzc5RUk5OWdfWTllL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTkzN2ZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5jdnMuc291cmNlXzEuMC4wLnYyMDA3MDYwNi03Qzc5Xzc5RUk5OWdfWTllL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlIHByaW1hcnk9ImZhbHNlIiAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIgICBpZD0ib3JnLmVjbGlwc2UuY3ZzLnNvdXJjZSIgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNi03Qzc5Xzc5RUk5OWdfWTllIj4KLQk8ZGVzY3JpcHRpb24gPgotCQklZGVzY3JpcHRpb24KLQk8L2Rlc2NyaXB0aW9uPgotCTxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotCQklbGljZW5zZQotCTwvbGljZW5zZT4KLQk8dXJsPgotCQk8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotCQk8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotCTwvdXJsPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UuY3ZzLnNvdXJjZSIgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUiLz4KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5jdnNfMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuY3ZzXzEuMC4wLnYyMDA3MDYwNi03Qzc5Xzc5RUk5OWdfWTllL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTkyYmRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5jdnNfMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUNyZWF0ZWQtQnk6IDEuNC4yIChJQk0gQ29ycG9yYXRpb24pCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotCi1OYW1lOiBmZWF0dXJlLnhtbAotU0hBMS1EaWdlc3Q6IEhhY1E5dDN2Mm5MTUNpc29Hc0hGVUxkeWpEZz0KLQotTmFtZTogZmVhdHVyZS5wcm9wZXJ0aWVzCi1TSEExLURpZ2VzdDogQ2ZWeGdBR01HSkFuWDNEdnRJc0FQcVd0aU00PQotCi1OYW1lOiBsaWNlbnNlLmh0bWwKLVNIQTEtRGlnZXN0OiBZWGZhVkxheUU4Z2FFMFZXZkt6VUhzcDZJeU09Ci0KLU5hbWU6IE1FVEEtSU5GL2VjbGlwc2UuaW5mCi1TSEExLURpZ2VzdDogS3lUOUZGN0M3dDg2Tm9Cb2Eya1pUM1pKQmZ3PQotCi1OYW1lOiBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi1TSEExLURpZ2VzdDogeHN0QXFNZ3MvYTVBc1FYUVpTZERRNzl2ZU9BPQotCi1OYW1lOiBlcGwtdjEwLmh0bWwKLVNIQTEtRGlnZXN0OiBwVE95eWJjcEVlK1k4bGtTVlV0YXJNbGVYcUU9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5jdnNfMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmN2c18xLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzM4MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmN2c18xLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIENWUyBDbGllbnQKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFByb2plY3QgVXBkYXRlcwotCi0jICJzZWNvbmRhcnlTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi1zZWNvbmRhcnlVcGRhdGVTaXRlTmFtZT1FdXJvcGEgRGlzY292ZXJ5IFNpdGUKLQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RWNsaXBzZSBDVlMgQ2xpZW50LiAoQmluYXJ5IHJ1bnRpbWUgYW5kIHVzZXIgZG9jdW1lbnRhdGlvbi4pCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5jdnNfMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUvZmVhdHVyZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuY3ZzXzEuMC4wLnYyMDA3MDYwNi03Qzc5Xzc5RUk5OWdfWTllL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M0YWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5jdnNfMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5jdnMiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2LTdDNzlfNzlFSTk5Z19ZOWUiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjMiLz4KLSAgIDwvdXJsPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLnBsYXRmb3JtIiB2ZXJzaW9uPSIzLjMuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jdnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5JMjAwNzA2MDciCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC5JMjAwNjEyMDgiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5zc2gyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAuSTIwMDcwNjA0IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGVhbS5jdnMudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAuSTIwMDcwNjA3IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPiAgIAotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZV8zLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2VfMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2ZDY3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZV8zLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DcmVhdGVkLUJ5OiAxLjQuMiAoSUJNIENvcnBvcmF0aW9uKQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLQotTmFtZTogZmVhdHVyZS54bWwKLVNIQTEtRGlnZXN0OiBBWEYvMUoraVNtZTRSS0hBMzhNb0V2K2txUlE9Ci0KLU5hbWU6IGZlYXR1cmUucHJvcGVydGllcwotU0hBMS1EaWdlc3Q6IHlHMHdmUjdQV2Y0ektyUmlvYzFkSXNYWTkyVT0KLQotTmFtZTogbGljZW5zZS5odG1sCi1TSEExLURpZ2VzdDogWVhmYVZMYXlFOGdhRTBWV2ZLelVIc3A2SXlNPQotCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZgotU0hBMS1EaWdlc3Q6IEt5VDlGRjdDN3Q4Nk5vQm9hMmtaVDNaSkJmdz0KLQotTmFtZTogZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotU0hBMS1EaWdlc3Q6IHhzdEFxTWdzL2E1QXNRWFFaU2REUTc5dmVPQT0KLQotTmFtZTogZXBsLXYxMC5odG1sCi1TSEExLURpZ2VzdDogcFRPeXliY3BFZStZOGxrU1ZVdGFyTWxlWHFFPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0LnNvdXJjZV8zLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSL2ZlYXR1cmUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlXzMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjlkZTkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlXzMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBKRFQgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBQcm9qZWN0IFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPUFQSSBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2UgY29kZSB6aXBzIGZvciBFY2xpcHNlIEphdmEgZGV2ZWxvcG1lbnQgdG9vbHMuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2VfMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUi9mZWF0dXJlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHQuc291cmNlXzMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3MjIyZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdC5zb3VyY2VfMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUi9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBwcmltYXJ5PSJmYWxzZSIgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIgaWQ9Im9yZy5lY2xpcHNlLmpkdC5zb3VyY2UiICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSIj4KLQk8ZGVzY3JpcHRpb24gPgotCQklZGVzY3JpcHRpb24KLQk8L2Rlc2NyaXB0aW9uPgotCTxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotCQklbGljZW5zZQotCTwvbGljZW5zZT4KLQk8dXJsPgotCQk8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotCQk8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotCTwvdXJsPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiB1bnBhY2s9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UuamR0LmRvYy5pc3YiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYxMyIvPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmp1bml0LnNvdXJjZSIgdmVyc2lvbj0iMy44LjIudjIwMDcwNjExMTczOCIvPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UuamR0LnNvdXJjZSIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUiIvPgotCTxwbHVnaW4gd3M9ImNhcmJvbiIgIG9zPSJtYWNvc3giIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJwcGMiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLmpkdC5zb3VyY2UubWFjb3N4LmNhcmJvbi5wcGMiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIiLz4KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5ZDJjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUNyZWF0ZWQtQnk6IDEuNC4yIChJQk0gQ29ycG9yYXRpb24pCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotCi1OYW1lOiBmZWF0dXJlLnhtbAotU0hBMS1EaWdlc3Q6IG5YbEhXbGkwS1pKUlppemNZRkxIV3cvK2plQT0KLQotTmFtZTogZmVhdHVyZS5wcm9wZXJ0aWVzCi1TSEExLURpZ2VzdDogTWRNUkdoaHlhZFpJcElaa3hpbFhTcXpJOTh3PQotCi1OYW1lOiBsaWNlbnNlLmh0bWwKLVNIQTEtRGlnZXN0OiBZWGZhVkxheUU4Z2FFMFZXZkt6VUhzcDZJeU09Ci0KLU5hbWU6IE1FVEEtSU5GL2VjbGlwc2UuaW5mCi1TSEExLURpZ2VzdDogS3lUOUZGN0M3dDg2Tm9Cb2Eya1pUM1pKQmZ3PQotCi1OYW1lOiBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi1TSEExLURpZ2VzdDogeHN0QXFNZ3MvYTVBc1FYUVpTZERRNzl2ZU9BPQotCi1OYW1lOiBlcGwtdjEwLmh0bWwKLVNIQTEtRGlnZXN0OiBwVE95eWJjcEVlK1k4bGtTVlV0YXJNbGVYcUU9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUi9mZWF0dXJlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNi0wMDEwLTdvN2pDSEVGcFBvcVFZdm5YcWVqZVIvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1M2Y0MzY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUi9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIEphdmEgRGV2ZWxvcG1lbnQgVG9vbHMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFByb2plY3QgVXBkYXRlcwotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RWNsaXBzZSBKYXZhIGRldmVsb3BtZW50IHRvb2xzLiAoQmluYXJ5IHJ1bnRpbWUgYW5kIHVzZXIgZG9jdW1lbnRhdGlvbi4pCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSL2ZlYXR1cmUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLmpkdF8zLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDlkMjNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUi9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA2LTAwMTAtN283akNIRUZwUG9xUVl2blhxZWplUiIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiCi0gICAgICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjMiLz4KLSAgICAgIDxkaXNjb3ZlcnkgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy4zLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy0xMzAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuYW50LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAudjIwMDcwNTExIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmFwdC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy0xMjAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmFwdC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA0MzAtMTEzNSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmFwdC5wbHVnZ2FibGUuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA1MjktMjEwMCIgICAgICAgICAKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4gICAgICAgICAKLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb21waWxlci5hcHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNTEwLTIwMDAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb21waWxlci50b29sIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnZfNzcxIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+IAotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudl83NzEiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5tYW5pcHVsYXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4xLjAudjIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuZGVidWcudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC52MjAwNzA1MzEtMTgwMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5kZWJ1ZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA1MzBhIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQuanVuaXQucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5qdW5pdDQucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMTAwLnYyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA1MTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuanVuaXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy44LjIudjIwMDcwNjExMTczOCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmp1bml0NCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSI0LjMuMSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwOC0xMzAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5tYWNvc3giCi0gICAgICAgICBvcz0ibWFjb3N4IgotICAgICAgICAgd3M9ImNhcmJvbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMTAwLnYyMDA2MTIxMSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlXzMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYzUxNDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQ3JlYXRlZC1CeTogMS40LjIgKElCTSBDb3Jwb3JhdGlvbikKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi0KLU5hbWU6IGZlYXR1cmUueG1sCi1TSEExLURpZ2VzdDogM0tLQW9JTEIzNFFWRlA4L1ZmQzFOMU9tR0M4PQotCi1OYW1lOiBmZWF0dXJlLnByb3BlcnRpZXMKLVNIQTEtRGlnZXN0OiBIOUE2Q3RTYlU3YkZMbEZnSUY1NEQyMFlqMEk9Ci0KLU5hbWU6IGxpY2Vuc2UuaHRtbAotU0hBMS1EaWdlc3Q6IFlYZmFWTGF5RThnYUUwVldmS3pVSHNwNkl5TT0KLQotTmFtZTogTUVUQS1JTkYvZWNsaXBzZS5pbmYKLVNIQTEtRGlnZXN0OiBLeVQ5RkY3Qzd0ODZOb0JvYTJrWlQzWkpCZnc9Ci0KLU5hbWU6IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLVNIQTEtRGlnZXN0OiBJeWRMM2xuUVFRRjhPVm1PN0NaNnVlYThUMGs9Ci0KLU5hbWU6IGVwbC12MTAuaHRtbAotU0hBMS1EaWdlc3Q6IHBUT3l5YmNwRWUrWThsa1NWVXRhck1sZVhxRT0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZS5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQy9mZWF0dXJlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4MjZhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgUERFIFBsdWctaW4gRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgUHJvamVjdCBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1FY2xpcHNlIHBsdWctaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGluY2x1ZGluZyBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2UgY29kZSB6aXBzLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlXzMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MvZmVhdHVyZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGRlLnNvdXJjZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZkMzIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGUuc291cmNlXzMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUgcHJpbWFyeT0iZmFsc2UiICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIiAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIiAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciIGlkPSJvcmcuZWNsaXBzZS5wZGUuc291cmNlIiAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQyI+Ci0JPGRlc2NyaXB0aW9uID4KLQkJJWRlc2NyaXB0aW9uCi0JPC9kZXNjcmlwdGlvbj4KLQk8Y29weXJpZ2h0ID4KLQkJJWNvcHlyaWdodAotCTwvY29weXJpZ2h0PgotCTxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotCQklbGljZW5zZQotCTwvbGljZW5zZT4KLQk8dXJsPgotCQk8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotCQk8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotCTwvdXJsPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGRlLnNvdXJjZSIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQyIvPgotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzZkZThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGVfMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQ3JlYXRlZC1CeTogMS40LjIgKElCTSBDb3Jwb3JhdGlvbikKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi0KLU5hbWU6IGZlYXR1cmUueG1sCi1TSEExLURpZ2VzdDogZ2RTY0dSUDVYNmlPU2o1UjdUNGp5VzRxSU5jPQotCi1OYW1lOiBmZWF0dXJlLnByb3BlcnRpZXMKLVNIQTEtRGlnZXN0OiBXRHZhT29jMHZBVG0vbnRKZ20zcWRVVXp2bTA9Ci0KLU5hbWU6IGxpY2Vuc2UuaHRtbAotU0hBMS1EaWdlc3Q6IFlYZmFWTGF5RThnYUUwVldmS3pVSHNwNkl5TT0KLQotTmFtZTogTUVUQS1JTkYvZWNsaXBzZS5pbmYKLVNIQTEtRGlnZXN0OiBLeVQ5RkY3Qzd0ODZOb0JvYTJrWlQzWkpCZnc9Ci0KLU5hbWU6IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLVNIQTEtRGlnZXN0OiB4c3RBcU1ncy9hNUFzUVhRWlNkRFE3OXZlT0E9Ci0KLU5hbWU6IGVwbC12MTAuaHRtbAotU0hBMS1EaWdlc3Q6IHBUT3l5YmNwRWUrWThsa1NWVXRhck1sZVhxRT0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL2ZlYXR1cmUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGVfMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQy9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYjQ1NjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgUGx1Zy1pbiBEZXZlbG9wbWVudCBFbnZpcm9ubWVudAotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgUHJvamVjdCBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1FY2xpcHNlIHBsdWctaW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL2ZlYXR1cmUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBkZV8zLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjI5MDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wZGVfMy4zLjAudjIwMDcwNjA3LTdON00tRFVVRUY2RXowSDQ2SWNDQy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctN043TS1EVVVFRjZFejBINDZJY0NDIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuamR0IiB2ZXJzaW9uPSIzLjAuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0iIHZlcnNpb249IjMuMC4wIiBtYXRjaD0iY29tcGF0aWJsZSIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDgtMTMwMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS5idWlsZCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTIiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwOC0xMzAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLmp1bml0LnJ1bnRpbWUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA4LTEzMDAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wZGUucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDgtMTMwMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDgtMTMwMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTQtMDgwMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZS51aS50ZW1wbGF0ZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA4LTEzMDAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2VfMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZGMyZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUNyZWF0ZWQtQnk6IDEuNC4yIChJQk0gQ29ycG9yYXRpb24pCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotCi1OYW1lOiBmZWF0dXJlLnhtbAotU0hBMS1EaWdlc3Q6IEMzMSt2S2ptZkIzOUFuVFNlWHNCWEpyUTNlND0KLQotTmFtZTogZmVhdHVyZS5wcm9wZXJ0aWVzCi1TSEExLURpZ2VzdDogdS90ODVqb0lTbXkwcFdwV2NKcXVIcjlWc3lVPQotCi1OYW1lOiBsaWNlbnNlLmh0bWwKLVNIQTEtRGlnZXN0OiBZWGZhVkxheUU4Z2FFMFZXZkt6VUhzcDZJeU09Ci0KLU5hbWU6IE1FVEEtSU5GL2VjbGlwc2UuaW5mCi1TSEExLURpZ2VzdDogS3lUOUZGN0M3dDg2Tm9Cb2Eya1pUM1pKQmZ3PQotCi1OYW1lOiBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnCi1TSEExLURpZ2VzdDogeHN0QXFNZ3MvYTVBc1FYUVpTZERRNzl2ZU9BPQotCi1OYW1lOiBlcGwtdjEwLmh0bWwKLVNIQTEtRGlnZXN0OiBwVE95eWJjcEVlK1k4bGtTVlV0YXJNbGVYcUU9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2VfMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HL2ZlYXR1cmUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2VfMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwZWJlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlXzMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRy9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFBsYXRmb3JtIFBsdWctaW4gRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgUHJvamVjdCBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Db21tb24gT1MtaW5kZXBlbmRlbnQgQVBJIGRvY3VtZW50YXRpb24gYW5kIHNvdXJjZSBjb2RlIHppcHMgZm9yIHRoZSBFY2xpcHNlIFBsYXRmb3JtLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2VfMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HL2ZlYXR1cmUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5Y2I0ZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUgcHJpbWFyeT0iZmFsc2UiICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIiAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIiAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UiICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciPgotCTxkZXNjcmlwdGlvbiA+Ci0JCSVkZXNjcmlwdGlvbgotCTwvZGVzY3JpcHRpb24+Ci0JPGNvcHlyaWdodCA+Ci0JCSVjb3B5cmlnaHQKLQk8L2NvcHlyaWdodD4KLQk8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLQkJJWxpY2Vuc2UKLQk8L2xpY2Vuc2U+Ci0JPHVybD4KLQkJPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjMiLz4KLQkJPGRpc2NvdmVyeSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjMiLz4KLQkJPGRpc2NvdmVyeSBsYWJlbD0iJXNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9yZWxlYXNlcy9ldXJvcGEiLz4KLQk8L3VybD4KLQk8aW5jbHVkZXMgaWQ9Im9yZy5lY2xpcHNlLnJjcC5zb3VyY2UiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIvPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiB1bnBhY2s9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLmlzdiIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjIxIi8+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJqYXZheC5zZXJ2bGV0LnNvdXJjZSIgdmVyc2lvbj0iMi40LjAudjIwMDcwNjExMTczOCIvPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0iamF2YXguc2VydmxldC5qc3Auc291cmNlIiB2ZXJzaW9uPSIyLjAuMC52MjAwNzA2MTkxNjAzIi8+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuYXBhY2hlLmphc3Blci5zb3VyY2UiIHZlcnNpb249IjUuNS4xNy52MjAwNzA2MTExNzI0Ii8+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuZWwuc291cmNlIiB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MTExNzI0Ii8+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UiIHZlcnNpb249IjEuMC40LnYyMDA3MDYxMTE3MjQiLz4KLQk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5hcGFjaGUuYW50LnNvdXJjZSIgdmVyc2lvbj0iMS43LjAudjIwMDcwNjA4MDg0MiIvPgotCTxwbHVnaW4gICAgZnJhZ21lbnQ9ImZhbHNlIiAgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmFwYWNoZS5sdWNlbmUuc291cmNlIiB2ZXJzaW9uPSIxLjkuMS52MjAwNzA2MTExNzI0Ii8+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5zb3VyY2UiIHZlcnNpb249IjEuOS4xLnYyMDA3MDYxODE2MTAiLz4KLQk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5tb3J0YmF5LmpldHR5LnNvdXJjZSIgdmVyc2lvbj0iNS4xLjExLnYyMDA3MDYxMTE3MjQiLz4KLQk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZSIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIi8+Ci0JPHBsdWdpbiB3cz0ibW90aWYiICBvcz0iaHB1eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9ImlhNjRfMzIiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5ocHV4Lm1vdGlmLmlhNjRfMzIiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRyIvPgotCTxwbHVnaW4gd3M9Imd0ayIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9ImlhNjQiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5saW51eC5ndGsuaWE2NCIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIi8+Ci0JPHBsdWdpbiB3cz0icGhvdG9uIiAgb3M9InFueCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4NiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLnFueC5waG90b24ueDg2IiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQk8cGx1Z2luIHdzPSJndGsiICBvcz0ibGludXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJwcGMiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5saW51eC5ndGsucHBjIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQk8cGx1Z2luIHdzPSJtb3RpZiIgIG9zPSJocHV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0iUEFfUklTQyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmhwdXgubW90aWYuUEFfUklTQyIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIi8+Ci0JPHBsdWdpbiB3cz0id3BmIiAgb3M9IndpbjMyIiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ieDg2IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2Uud2luMzIud3BmLng4NiIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIi8+Ci0JPHBsdWdpbiB3cz0iZ3RrIiAgb3M9ImxpbnV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ieDg2XzY0IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2UubGludXguZ3RrLng4Nl82NCIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIi8+Ci0JPHBsdWdpbiB3cz0iZ3RrIiAgb3M9ImxpbnV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0icHBjNjQiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5saW51eC5ndGsucHBjNjQiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRyIvPgotCTxwbHVnaW4gd3M9Imd0ayIgIG9zPSJzb2xhcmlzIiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ic3BhcmMiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5zb2xhcmlzLmd0ay5zcGFyYyIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIi8+Ci0JPHBsdWdpbiB3cz0iY2FyYm9uIiAgb3M9Im1hY29zeCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9InBwYyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLm1hY29zeC5jYXJib24ucHBjIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQk8cGx1Z2luIHdzPSJndGsiICBvcz0ibGludXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJ4ODYiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnBsYXRmb3JtLnNvdXJjZS5saW51eC5ndGsueDg2IiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQk8cGx1Z2luIHdzPSJ3aW4zMiIgIG9zPSJ3aW4zMiIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4NiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLndpbjMyLndpbjMyLng4NiIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIi8+Ci0JPHBsdWdpbiB3cz0ibW90aWYiICBvcz0ic29sYXJpcyIgZnJhZ21lbnQ9InRydWUiIGFyY2g9InNwYXJjIiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5zb3VyY2Uuc29sYXJpcy5tb3RpZi5zcGFyYyIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIi8+Ci0JPHBsdWdpbiB3cz0id2luMzIiICBvcz0id2NlX3BwYyIgZnJhZ21lbnQ9InRydWUiIGFyY2g9ImFybSIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLndjZV9wcGMud2luMzIuYXJtIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQk8cGx1Z2luIHdzPSJtb3RpZiIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4NiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlLmxpbnV4Lm1vdGlmLng4NiIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIi8+Ci08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm1fMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnBsYXRmb3JtXzMuMy4wLnYyMDA3MDYxMi1fMTlVRWtMRXp3c2RGOWpTcVEtRy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ4OTVhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm1fMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DcmVhdGVkLUJ5OiAxLjQuMiAoSUJNIENvcnBvcmF0aW9uKQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLQotTmFtZTogZmVhdHVyZS54bWwKLVNIQTEtRGlnZXN0OiBiTE1heXRHMml0YmRLSnNUdFd0SytXR2hsMFk9Ci0KLU5hbWU6IGZlYXR1cmUucHJvcGVydGllcwotU0hBMS1EaWdlc3Q6IGtFV2k0RytkUlJIVVI4ZHFGYkdoOTNoemx4bz0KLQotTmFtZTogbGljZW5zZS5odG1sCi1TSEExLURpZ2VzdDogWVhmYVZMYXlFOGdhRTBWV2ZLelVIc3A2SXlNPQotCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZgotU0hBMS1EaWdlc3Q6IEt5VDlGRjdDN3Q4Nk5vQm9hMmtaVDNaSkJmdz0KLQotTmFtZTogZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotU0hBMS1EaWdlc3Q6IHhzdEFxTWdzL2E1QXNRWFFaU2REUTc5dmVPQT0KLQotTmFtZTogZXBsLXYxMC5odG1sCi1TSEExLURpZ2VzdDogcFRPeXliY3BFZStZOGxrU1ZVdGFyTWxlWHFFPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm1fMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HL2ZlYXR1cmUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWJmNDAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQbGF0Zm9ybQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgUHJvamVjdCBVcGRhdGVzCi0KLSMgInNlY29uZGFyeVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lPUV1cm9wYSBEaXNjb3ZlcnkgU2l0ZQotCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Db21tb24gT1MtaW5kZXBlbmRlbnQgYmFzZSBvZiB0aGUgRWNsaXBzZSBwbGF0Zm9ybS4gKEJpbmFyeSBydW50aW1lIGFuZCB1c2VyIGRvY3VtZW50YXRpb24uKQotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvZmVhdHVyZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucGxhdGZvcm1fMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDk3NGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5wbGF0Zm9ybV8zLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUcvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPgotICAgICAgPGRpc2NvdmVyeSBsYWJlbD0iJXNlY29uZGFyeVVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9yZWxlYXNlcy9ldXJvcGEiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iY29tLmpjcmFmdC5qc2NoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMS4zMSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucmNwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJqYXZheC5zZXJ2bGV0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjIuNC4wLnYyMDA3MDYxMTE3MzgiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJqYXZheC5zZXJ2bGV0LmpzcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIyLjAuMC52MjAwNzA2MTkxNjAzIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5qYXNwZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iNS41LjE3LnYyMDA3MDYxMTE3MjQiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmNvbW1vbnMuZWwiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjExMTcyNCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC40LnYyMDA3MDYxMTE3MjQiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmFudCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjcuMC52MjAwNzA2MDgwODQyIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuYXBhY2hlLmx1Y2VuZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjkuMS52MjAwNzA2MTExNzI0IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS45LjEudjIwMDcwNjE4MTYxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmFudC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4yMDAudjIwMDcwNTIyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29tcGFyZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5JMjAwNzA2MDYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmJvb3QiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4xLjEwMC52MjAwNjA2MDMiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMS4wLnYyMDA3MDYwNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUubmV0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLkkyMDA3MDUzMSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbXBhdGliaWxpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC52MjAwNzA1MDIiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMS4yMDAudjIwMDcwNTAyIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMjAwLnYyMDA3MDYwNSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLm9zZ2kudXRpbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMjAwLnYyMDA3MDYwNSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUudmFyaWFibGVzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA3MDQyNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmRlYnVnLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTE4MDAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5kZWJ1Zy51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctMTgwMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5yZWdpc3RyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDgiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuamV0dHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA3IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5qc3AuamFzcGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNyIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guanNwLmphc3Blci5yZWdpc3RyeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDciCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLndlYmFwcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDciCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLmJhc2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuaGVscC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA1MzAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5oZWxwLmFwcHNlcnZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMjAwLnYyMDA3MDUxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UubHRrLnVpLnJlZmFjdG9yaW5nIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEzIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybS5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5JMjAwNzA2MTUtMTMwMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnNlYXJjaCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5JMjAwNzA2MDciCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS50ZWFtLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYwNyIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnRvbWNhdCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSI0LjEuMjMwLnYyMDA3MDUzMSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudGV4dCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLnRleHQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qc2NoLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAuSTIwMDcwNDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanNjaC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC5JMjAwNzA1MjUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5jb25zb2xlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA3MDUzMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnByZXNlbnRhdGlvbnMucjIxIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAuSTIwMDcwNjA1LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pbnRybyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDUzMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmludHJvLnVuaXZlcnNhbCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDUzMEEiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmNoZWF0c2hlZXRzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDUwNyIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmJyb3dzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC52MjAwNzA1MjRBIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYwNS0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLnJlc291cmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5JMjAwNzA2MDUtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLm5ldCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC5JMjAwNzA1MTYiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAuSTIwMDcwMzE5LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNi0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZm9ybXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNTExIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjEuMjAwLnYyMDA3MDQxNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLmlkZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5JMjAwNzA2MjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS5pZGUuYXBwbGljYXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAuSTIwMDcwNTMwLTAxMDAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLkkyMDA3MDMxOS0wMDEwIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDYxNSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5zY2hlZHVsZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC52MjAwNzA2MTUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC52MjAwNzA2MTUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2guY29tcGF0aWJpbGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC5JMjAwNzAzMTktMDAxMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uaHB1eC5pYTY0XzMyIgotICAgICAgICAgb3M9ImhwdXgiCi0gICAgICAgICBhcmNoPSJpYTY0XzMyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA2MDYwMyIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLmhwdXguUEFfUklTQyIKLSAgICAgICAgIG9zPSJocHV4IgotICAgICAgICAgYXJjaD0iUEFfUklTQyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNjA2MDMiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5saW51eC5wcGMiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICBhcmNoPSJwcGMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjEwMC52MjAwNzA0MzAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5saW51eC54ODYiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4xLjAudjIwMDcwNDE2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0ubGludXgueDg2XzY0IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgYXJjaD0ieDg2XzY0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4xMDAudjIwMDcwNTEwIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVzeXN0ZW0uc29sYXJpcy5zcGFyYyIKLSAgICAgICAgIG9zPSJzb2xhcmlzIgotICAgICAgICAgYXJjaD0ic3BhcmMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjEwMC52MjAwNzA0MjUiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS5tYWNvc3giCi0gICAgICAgICBvcz0ibWFjb3N4IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA2MDYwMyIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5maWxlc3lzdGVtLnFueC54ODYiCi0gICAgICAgICBvcz0icW54IgotICAgICAgICAgd3M9InBob3RvbiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNjA2MDMiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZXN5c3RlbS53aW4zMi54ODYiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4xLjAudjIwMDcwNTEwIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy53aW4zMiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzAyMjYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVwZGF0ZS5jb3JlLmxpbnV4IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4wLnYyMDA3MDYxNSIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudXBkYXRlLmNvcmUud2luMzIiCi0gICAgICAgICBvcz0id2luMzIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC52MjAwNzA2MTUiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYwNS0wMDEwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkucmVnaXN0cnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC52MjAwNzAzMTYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLm1vcnRiYXkuamV0dHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iNS4xLjExLnYyMDA3MDYxMTE3MjQiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+ICAKLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcC5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcC5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmNmYzQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3Auc291cmNlXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQ3JlYXRlZC1CeTogMS40LjIgKElCTSBDb3Jwb3JhdGlvbikKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi0KLU5hbWU6IGZlYXR1cmUueG1sCi1TSEExLURpZ2VzdDogZE1uT2h2eHBoV0ljVFZ4TkxzRmRKNTRIamZ3PQotCi1OYW1lOiBmZWF0dXJlLnByb3BlcnRpZXMKLVNIQTEtRGlnZXN0OiBLUUc3THhBc2JTZkZSMExUclR1VTN4dDlqTjQ9Ci0KLU5hbWU6IGxpY2Vuc2UuaHRtbAotU0hBMS1EaWdlc3Q6IFlYZmFWTGF5RThnYUUwVldmS3pVSHNwNkl5TT0KLQotTmFtZTogTUVUQS1JTkYvZWNsaXBzZS5pbmYKLVNIQTEtRGlnZXN0OiBLeVQ5RkY3Qzd0ODZOb0JvYTJrWlQzWkpCZnc9Ci0KLU5hbWU6IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLVNIQTEtRGlnZXN0OiB4c3RBcU1ncy9hNUFzUVhRWlNkRFE3OXZlT0E9Ci0KLU5hbWU6IGVwbC12MTAuaHRtbAotU0hBMS1EaWdlc3Q6IHBUT3l5YmNwRWUrWThsa1NWVXRhck1sZVhxRT0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcC5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL2ZlYXR1cmUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3Auc291cmNlXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmZmJiMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcC5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgUkNQIFBsdWctaW4gRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgUHJvamVjdCBVcGRhdGVzCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciB0aGUgRWNsaXBzZSBSQ1AuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcC5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL2ZlYXR1cmUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcC5zb3VyY2VfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTY5ZDVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3Auc291cmNlXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZSBwcmltYXJ5PSJmYWxzZSIgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiICBpbWFnZT0iZWNsaXBzZV91cGRhdGVfMTIwLmpwZyIgaWQ9Im9yZy5lY2xpcHNlLnJjcC5zb3VyY2UiICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkciPgotCTxkZXNjcmlwdGlvbiA+Ci0JCSVkZXNjcmlwdGlvbgotCTwvZGVzY3JpcHRpb24+Ci0JPGNvcHlyaWdodCA+Ci0JCSVjb3B5cmlnaHQKLQk8L2NvcHlyaWdodD4KLQk8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLQkJJWxpY2Vuc2UKLQk8L2xpY2Vuc2U+Ci0JPHVybD4KLQkJPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjMiLz4KLQk8L3VybD4KLQk8cGx1Z2luICAgIGZyYWdtZW50PSJmYWxzZSIgIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9ImNvbS5pYm0uaWN1LnNvdXJjZSIgdmVyc2lvbj0iMy42LjEudjIwMDcwNDE3Ii8+Ci0JPHBsdWdpbiAgICBmcmFnbWVudD0iZmFsc2UiICBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5yY3Auc291cmNlIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkciLz4KLQk8cGx1Z2luIHdzPSJtb3RpZiIgIG9zPSJocHV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0iaWE2NF8zMiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZS5ocHV4Lm1vdGlmLmlhNjRfMzIiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIvPgotCTxwbHVnaW4gd3M9Imd0ayIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9ImlhNjQiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnJjcC5zb3VyY2UubGludXguZ3RrLmlhNjQiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIvPgotCTxwbHVnaW4gd3M9InBob3RvbiIgIG9zPSJxbngiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJ4ODYiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnJjcC5zb3VyY2UucW54LnBob3Rvbi54ODYiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIvPgotCTxwbHVnaW4gd3M9Imd0ayIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9InBwYyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZS5saW51eC5ndGsucHBjIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkciLz4KLQk8cGx1Z2luIHdzPSJtb3RpZiIgIG9zPSJocHV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0iUEFfUklTQyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZS5ocHV4Lm1vdGlmLlBBX1JJU0MiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIvPgotCTxwbHVnaW4gd3M9IndwZiIgIG9zPSJ3aW4zMiIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4NiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZS53aW4zMi53cGYueDg2IiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkciLz4KLQk8cGx1Z2luIHdzPSJndGsiICBvcz0ibGludXgiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJ4ODZfNjQiIGRvd25sb2FkLXNpemU9IjAiIGluc3RhbGwtc2l6ZT0iMCIgaWQ9Im9yZy5lY2xpcHNlLnJjcC5zb3VyY2UubGludXguZ3RrLng4Nl82NCIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIi8+Ci0JPHBsdWdpbiB3cz0iZ3RrIiAgb3M9InNvbGFyaXMiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJzcGFyYyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZS5zb2xhcmlzLmd0ay5zcGFyYyIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIi8+Ci0JPHBsdWdpbiB3cz0iY2FyYm9uIiAgb3M9Im1hY29zeCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9InBwYyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZS5tYWNvc3guY2FyYm9uLnBwYyIgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIi8+Ci0JPHBsdWdpbiB3cz0iZ3RrIiAgb3M9ImxpbnV4IiBmcmFnbWVudD0idHJ1ZSIgYXJjaD0ieDg2IiBkb3dubG9hZC1zaXplPSIwIiBpbnN0YWxsLXNpemU9IjAiIGlkPSJvcmcuZWNsaXBzZS5yY3Auc291cmNlLmxpbnV4Lmd0ay54ODYiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIvPgotCTxwbHVnaW4gd3M9Im1vdGlmIiAgb3M9ImFpeCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9InBwYyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZS5haXgubW90aWYucHBjIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkciLz4KLQk8cGx1Z2luIHdzPSJ3aW4zMiIgIG9zPSJ3aW4zMiIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4NiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZS53aW4zMi53aW4zMi54ODYiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIvPgotCTxwbHVnaW4gd3M9Im1vdGlmIiAgb3M9InNvbGFyaXMiIGZyYWdtZW50PSJ0cnVlIiBhcmNoPSJzcGFyYyIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZS5zb2xhcmlzLm1vdGlmLnNwYXJjIiB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkciLz4KLQk8cGx1Z2luIHdzPSJtb3RpZiIgIG9zPSJsaW51eCIgZnJhZ21lbnQ9InRydWUiIGFyY2g9Ing4NiIgZG93bmxvYWQtc2l6ZT0iMCIgaW5zdGFsbC1zaXplPSIwIiBpZD0ib3JnLmVjbGlwc2UucmNwLnNvdXJjZS5saW51eC5tb3RpZi54ODYiIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORyIvPgotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcF8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhMDQxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQ3JlYXRlZC1CeTogMS40LjIgKElCTSBDb3Jwb3JhdGlvbikKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNy4wCi0KLU5hbWU6IGZlYXR1cmUueG1sCi1TSEExLURpZ2VzdDogWVZwRzJ5VitmQ0tweGpnbmMyUDdzY3dyY05VPQotCi1OYW1lOiBmZWF0dXJlLnByb3BlcnRpZXMKLVNIQTEtRGlnZXN0OiBVek0xTVpuYVpCemI1SkhQUVpFN3dieWRKV0E9Ci0KLU5hbWU6IGxpY2Vuc2UuaHRtbAotU0hBMS1EaWdlc3Q6IFlYZmFWTGF5RThnYUUwVldmS3pVSHNwNkl5TT0KLQotTmFtZTogTUVUQS1JTkYvZWNsaXBzZS5pbmYKLVNIQTEtRGlnZXN0OiBLeVQ5RkY3Qzd0ODZOb0JvYTJrWlQzWkpCZnc9Ci0KLU5hbWU6IGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLVNIQTEtRGlnZXN0OiB4c3RBcU1ncy9hNUFzUVhRWlNkRFE3OXZlT0E9Ci0KLU5hbWU6IGVwbC12MTAuaHRtbAotU0hBMS1EaWdlc3Q6IHBUT3l5YmNwRWUrWThsa1NWVXRhck1sZVhxRT0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcF8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcF8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDNhNzIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5yY3BfMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPUVjbGlwc2UgUkNQCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBQcm9qZWN0IFVwZGF0ZXMKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVJpY2ggQ2xpZW50IFBsYXRmb3JtCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwMCwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnJjcF8zLjMuMC52MjAwNzA2MDctOHk4ZUU4TkVic04zWF9maldTOEhQTkcvZmVhdHVyZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFlZjE4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2UucmNwXzMuMy4wLnYyMDA3MDYwNy04eThlRThORWJzTjNYX2ZqV1M4SFBORy9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5yY3AiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjA3LTh5OGVFOE5FYnNOM1hfZmpXUzhIUE5HIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIHBsdWdpbj0ib3JnLmVjbGlwc2UucmNwIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly91cGRhdGUuZWNsaXBzZS5vcmcvdXBkYXRlcy8zLjMiLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0iY29tLmlibS5pY3UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy42LjEudjIwMDcwNDE3IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5JMjAwNzA2MDUtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmciCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAuSTIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUuZGF0YWJpbmRpbmcuYmVhbnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAuSTIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+ICAgICAgICAgCi0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNDIzIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMTAwLnYyMDA3MDUzMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb21wYXRpYmlsaXR5LmF1dGgiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC52MjAwNzA1MDIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5vc2dpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDUzMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmhlbHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNTI0IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuamZhY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAuSTIwMDcwNjA2LTAwMTAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZmFjZS5kYXRhYmluZGluZyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjEuMC5JMjAwNzA2MDYtMDAxMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYxNC0wODAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkkyMDA3MDYwOC0xMTAwIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkuY2FyYm9uIgotICAgICAgICAgb3M9Im1hY29zeCIKLSAgICAgICAgIHdzPSJjYXJib24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4yLjEwMC5JMjAwNzA2MDUtMDAxMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPiAgICAgCi0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAudjIwMDcwNjE1IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4NiIKLSAgICAgICAgIG9zPSJ3aW4zMiIKLSAgICAgICAgIHdzPSJ3aW4zMiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotICAgICAgICAgCi0gICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC53cGYud2luMzIueDg2IgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndwZiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5saW51eC54ODYiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsubGludXguczM5MCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJzMzkwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0gICAgICAgICAKLSAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsubGludXguczM5MHgiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0iczM5MHgiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4gICAgICAgICAKLSAgICAgICAgIAotCSA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5zb2xhcmlzLnNwYXJjIgotICAgICAgICAgb3M9InNvbGFyaXMiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ic3BhcmMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLSAgICAgICAgIAotICAgICAgICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsuc29sYXJpcy54ODYiCi0gICAgICAgICBvcz0ic29sYXJpcyIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODYiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5ndGsubGludXgucHBjIgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9InBwYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MzM0NiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uuc3d0Lmd0ay5saW51eC54ODZfNjQiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ieDg2XzY0IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuY2FyYm9uLm1hY29zeCIKLSAgICAgICAgIG9zPSJtYWNvc3giCi0gICAgICAgICB3cz0iY2FyYm9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYuYWl4LnBwYyIKLSAgICAgICAgIG9zPSJhaXgiCi0gICAgICAgICB3cz0ibW90aWYiCi0gICAgICAgICBhcmNoPSJwcGMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5tb3RpZi5ocHV4LlBBX1JJU0MiCi0gICAgICAgICBvcz0iaHB1eCIKLSAgICAgICAgIHdzPSJtb3RpZiIKLSAgICAgICAgIGFyY2g9IlBBX1JJU0MiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDVhIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYubGludXgueDg2IgotICAgICAgICAgb3M9ImxpbnV4IgotICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QuZ3RrLmxpbnV4LmlhNjQiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0iaWE2NCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC5IRUFEIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYuc29sYXJpcy5zcGFyYyIKLSAgICAgICAgIG9zPSJzb2xhcmlzIgotICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgYXJjaD0ic3BhcmMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjMzNDYiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnN3dC5waG90b24ucW54Lng4NiIKLSAgICAgICAgIG9zPSJxbngiCi0gICAgICAgICB3cz0icGhvdG9uIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYzMzQ2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5zd3QubW90aWYuaHB1eC5pYTY0XzMyIgotICAgICAgICAgb3M9ImhwdXgiCi0gICAgICAgICB3cz0ibW90aWYiCi0gICAgICAgICBhcmNoPSJpYTY0XzMyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLkhFQUQiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnJjcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMC52MjAwNzA2MTIiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMi4xMDAudjIwMDcwMzE5IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPiAgICAgICAgICAgCi0KLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5hcHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNDI2IgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wcmVmZXJlbmNlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjIuMTAwLnYyMDA3MDUyMiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4gICAgICAgIAotICAgICAgICAgCi0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDUyMiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNiIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsuc29sYXJpcy5zcGFyYyIKLSAgICAgICAgIG9zPSJzb2xhcmlzIgotICAgICAgICAgd3M9Imd0ayIKLSAgICAgICAgIGFyY2g9InNwYXJjIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuY2FyYm9uLm1hY29zeCIKLSAgICAgICAgIG9zPSJtYWNvc3giCi0gICAgICAgICB3cz0iY2FyYm9uIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4LnBwYyIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJwcGMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4gICAgICAgICAKLSAgICAgICAgIAotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC54ODYiCi0gICAgICAgICBvcz0ibGludXgiCi0gICAgICAgICB3cz0iZ3RrIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNiIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci0gICAgICAgICAKLSAgICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5ndGsubGludXguczM5MCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJzMzkwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4KLSAgICAgICAgIAotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLmd0ay5saW51eC5zMzkweCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJzMzkweCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci0gICAgICAgICAKLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmxpbnV4Lng4NiIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJtb3RpZiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA1MjQiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPiAKLSAgICAgICAgICAgCi0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIuZ3RrLmxpbnV4Lng4Nl82NCIKLSAgICAgICAgIG9zPSJsaW51eCIKLSAgICAgICAgIHdzPSJndGsiCi0gICAgICAgICBhcmNoPSJ4ODZfNjQiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMS4wLjAudjIwMDcwNjA2IgotICAgICAgICAgZnJhZ21lbnQ9InRydWUiCi0gICAgICAgICB1bnBhY2s9InRydWUiLz4KLQk8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci5tb3RpZi5haXgucHBjIgotICAgICAgICAgb3M9ImFpeCIKLSAgICAgICAgIHdzPSJtb3RpZiIKLSAgICAgICAgIGFyY2g9InBwYyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA1MjQiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPgotCTxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLm1vdGlmLmhwdXguUEFfUklTQyIKLSAgICAgICAgIG9zPSJocHV4IgotICAgICAgICAgd3M9Im1vdGlmIgotICAgICAgICAgYXJjaD0iUEFfUklTQyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzAyMTkiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPiAgICAgICAgIAotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53cGYud2luMzIueDg2IgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndwZiIKLSAgICAgICAgIGFyY2g9Ing4NiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA1MjMiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0idHJ1ZSIvPgotICAgICAgICAgCi0JPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIud2luMzIud2luMzIueDg2IgotICAgICAgICAgb3M9IndpbjMyIgotICAgICAgICAgd3M9IndpbjMyIgotICAgICAgICAgYXJjaD0ieDg2IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDUyMyIKLSAgICAgICAgIGZyYWdtZW50PSJ0cnVlIgotICAgICAgICAgdW5wYWNrPSJ0cnVlIi8+Ci08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrXzMuMy4wLnYyMDA3MDYwNy03TTdKLUJJb2x6LU9jeFd4dldBUFNmTFBxZXZPL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNka18zLjMuMC52MjAwNzA2MDctN003Si1CSW9sei1PY3hXeHZXQVBTZkxQcWV2Ty9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyOThkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrXzMuMy4wLnYyMDA3MDYwNy03TTdKLUJJb2x6LU9jeFd4dldBUFNmTFBxZXZPL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1DcmVhdGVkLUJ5OiAxLjQuMiAoSUJNIENvcnBvcmF0aW9uKQotQW50LVZlcnNpb246IEFwYWNoZSBBbnQgMS43LjAKLQotTmFtZTogZmVhdHVyZS54bWwKLVNIQTEtRGlnZXN0OiB5ZnBjbEF4eGJlb2tvWERlM3E0dDgwV2lOWmc9Ci0KLU5hbWU6IGZlYXR1cmUucHJvcGVydGllcwotU0hBMS1EaWdlc3Q6ICtUd2pjc1NCQUhaOWhTVDdYYWVNdFJXSW1HTT0KLQotTmFtZTogbGljZW5zZS5odG1sCi1TSEExLURpZ2VzdDogWVhmYVZMYXlFOGdhRTBWV2ZLelVIc3A2SXlNPQotCi1OYW1lOiBNRVRBLUlORi9lY2xpcHNlLmluZgotU0hBMS1EaWdlc3Q6IEt5VDlGRjdDN3Q4Nk5vQm9hMmtaVDNaSkJmdz0KLQotTmFtZTogZWNsaXBzZV91cGRhdGVfMTIwLmpwZwotU0hBMS1EaWdlc3Q6IHhzdEFxTWdzL2E1QXNRWFFaU2REUTc5dmVPQT0KLQotTmFtZTogZXBsLXYxMC5odG1sCi1TSEExLURpZ2VzdDogcFRPeXliY3BFZStZOGxrU1ZVdGFyTWxlWHFFPQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrXzMuMy4wLnYyMDA3MDYwNy03TTdKLUJJb2x6LU9jeFd4dldBUFNmTFBxZXZPL2ZlYXR1cmUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGtfMy4zLjAudjIwMDcwNjA3LTdNN0otQklvbHotT2N4V3h2V0FQU2ZMUHFldk8vZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDlhMTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9nZW5lcmF0b3IvZWNsaXBzZTMuMy9mZWF0dXJlcy9vcmcuZWNsaXBzZS5zZGtfMy4zLjAudjIwMDcwNjA3LTdNN0otQklvbHotT2N4V3h2V0FQU2ZMUHFldk8vZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RWNsaXBzZSBQcm9qZWN0IFNESwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgUHJvamVjdCBVcGRhdGVzCi0KLSMgInNlY29uZGFyeVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgc2Vjb25kYXJ5IHVwZGF0ZSBzaXRlCi1zZWNvbmRhcnlVcGRhdGVTaXRlTmFtZT1FdXJvcGEgRGlzY292ZXJ5IFNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNESyBmb3IgRWNsaXBzZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrXzMuMy4wLnYyMDA3MDYwNy03TTdKLUJJb2x6LU9jeFd4dldBUFNmTFBxZXZPL2ZlYXR1cmUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL2ZlYXR1cmVzL29yZy5lY2xpcHNlLnNka18zLjMuMC52MjAwNzA2MDctN003Si1CSW9sei1PY3hXeHZXQVBTZkxQcWV2Ty9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1OWFiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvZmVhdHVyZXMvb3JnLmVjbGlwc2Uuc2RrXzMuMy4wLnYyMDA3MDYwNy03TTdKLUJJb2x6LU9jeFd4dldBUFNmTFBxZXZPL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uuc2RrIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy03TTdKLUJJb2x6LU9jeFd4dldBUFNmTFBxZXZPIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSIKLSAgICAgIGltYWdlPSJlY2xpcHNlX3VwZGF0ZV8xMjAuanBnIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0gICAKLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vdXBkYXRlLmVjbGlwc2Uub3JnL3VwZGF0ZXMvMy4zIi8+Ci0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL3VwZGF0ZS5lY2xpcHNlLm9yZy91cGRhdGVzLzMuMyIvPiAgCi0gICAgICA8ZGlzY292ZXJ5IGxhYmVsPSIlc2Vjb25kYXJ5VXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3JlbGVhc2VzL2V1cm9wYSIvPiAgCi0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0iCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTItXzE5VUVrTEV6d3NkRjlqU3FRLUciLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGxhdGZvcm0uc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMy4zLjAudjIwMDcwNjEyLV8xOVVFa0xFendzZEY5alNxUS1HIi8+Ci0gICAgICAgICAKLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmN2cyIKLSAgICAgICAgIHZlcnNpb249IjEuMC4wLnYyMDA3MDYwNi03Qzc5Xzc5RUk5OWdfWTllIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmN2cy5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIxLjAuMC52MjAwNzA2MDYtN0M3OV83OUVJOTlnX1k5ZSIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZHQiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpkdC5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MDYtMDAxMC03bzdqQ0hFRnBQb3FRWXZuWHFlamVSIi8+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnBkZSIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UucGRlLnNvdXJjZSIKLSAgICAgICAgIHZlcnNpb249IjMuMy4wLnYyMDA3MDYwNy03TjdNLURVVUVGNkV6MEg0NkljQ0MiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnNkayIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIzLjMuMC52MjAwNzA2MTMiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2dlbmVyYXRvci9lY2xpcHNlMy4zL3JlYWRtZS50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvcmVhZG1lLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI5M2RjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvZ2VuZXJhdG9yL2VjbGlwc2UzLjMvcmVhZG1lLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgZGF0YSBmb3IgYXV0b21hdGVkIHRlc3Rpbmcgb2YgdGhlIGdlbmVyYXRvci4gU3BlY2lmaWNhbGx5LAotdGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGZlYXR1cmUgZGF0YSBmcm9tIHZlcnNpb24gMy4zLjAgb2YgdGhlIEVjbGlwc2UgU0RLLgotVGhlIGNvcnJlc3BvbmRpbmcgZ2VuZXJhdG9yIHRlc3QgZW5zdXJlcyB0aGF0IGNvcnJlY3QgbWV0YWRhdGEgaXMgZ2VuZXJhdGVkCi1mb3IgdGhlc2UgZmVhdHVyZXMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2phcnByb2Nlc3Nvci5qYXIucGFjay5neiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9qYXJwcm9jZXNzb3IuamFyLnBhY2suZ3oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZGY0ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL2phcnByb2Nlc3Nvci5qYXIucGFjay5negorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzLzFfNi9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIucGFjay5neiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzLzFfNi9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIucGFjay5negpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1MmFkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy8xXzYvb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBfMS4wLjEwMC52MjAwNzEwMTUuamFyLnBhY2suZ3oKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9lY2xpcHNlLTMuMi0zLjMuamJkaWZmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvZWNsaXBzZS0zLjItMy4zLmpiZGlmZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGVhYzc0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9lY2xpcHNlLTMuMi0zLjMuamJkaWZmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvZWNsaXBzZS0zLjIuZXhlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvZWNsaXBzZS0zLjIuZXhlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODI2ZDFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL2VjbGlwc2UtMy4yLmV4ZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL2VjbGlwc2UtMy4zLmV4ZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL2VjbGlwc2UtMy4zLmV4ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVjZDhmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9lY2xpcHNlLTMuMy5leGUKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjODA5ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBfMS4wLjEwMC52MjAwNzEwMTUuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBfMS4wLjEwMC52MjAwNzEwMTUuamFyLnBhY2suZ3ogYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIucGFjay5negpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU4NmQzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5lcXVpbm94LmFwcF8xLjAuMTAwLnYyMDA3MTAxNS5qYXIucGFjay5negorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmpkdF8zLjIuMC0zLjMuMC5qYmRpZmYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5qZHRfMy4yLjAtMy4zLjAuamJkaWZmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTIwZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmpkdF8zLjIuMC0zLjMuMC5qYmRpZmYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5qZHRfMy4yLjAudjIwMDYwNjA1LTE0MDAubmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5uamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWVlNDdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL29yZy5lY2xpcHNlLmpkdF8zLjIuMC52MjAwNjA2MDUtMTQwMC5uamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvb3JnLmVjbGlwc2UuamR0XzMuMy4wLnYyMDA3MDYwNy0xMzAwLm5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAubmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRlZWMyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy9vcmcuZWNsaXBzZS5qZHRfMy4zLjAudjIwMDcwNjA3LTEzMDAubmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL3Rlc3RkYXRhXzEuMC4wLjEtMi5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy90ZXN0ZGF0YV8xLjAuMC4xLTIuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWE1NDZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL3Rlc3RkYXRhXzEuMC4wLjEtMi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy90ZXN0ZGF0YV8xLjAuMC4xLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL3Rlc3RkYXRhXzEuMC4wLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWU3ZjkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcHRpbWl6ZXJzL3Rlc3RkYXRhXzEuMC4wLjEuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29wdGltaXplcnMvdGVzdGRhdGFfMS4wLjAuMi5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy90ZXN0ZGF0YV8xLjAuMC4yLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNWIwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3B0aW1pemVycy90ZXN0ZGF0YV8xLjAuMC4yLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcmJpdFJlcG8vY29udGVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3JiaXRSZXBvL2NvbnRlbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzIxNzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9vcmJpdFJlcG8vY29udGVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MTM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08P21ldGFkYXRhUmVwb3NpdG9yeSBjbGFzcz0nb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkxvY2FsTWV0YWRhdGFSZXBvc2l0b3J5JyB2ZXJzaW9uPScxLjAuMCc/PgotPHJlcG9zaXRvcnkgbmFtZT0nZmlsZTpDOi9lcXVpbm94LnAyL3NlcnZlcnMvIC0gbWV0YWRhdGEnIHR5cGU9J29yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5Mb2NhbE1ldGFkYXRhUmVwb3NpdG9yeScgdmVyc2lvbj0nMSc+Ci0gIDxwcm9wZXJ0aWVzIHNpemU9JzEnPgotICAgIDxwcm9wZXJ0eSBuYW1lPSdwMi50aW1lc3RhbXAnIHZhbHVlPScxMjA4NjI5Nzg5NzgyJy8+Ci0gIDwvcHJvcGVydGllcz4KLSAgPHVuaXRzIHNpemU9JzE4Mic+Ci0gICAgPHVuaXQgaWQ9J29yZy5lY2xpcHNlLm9zZ2knIHZlcnNpb249JzMuNC4wLnYyMDA4MDMyNic+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuZWNsaXBzZS5vc2dpJyByYW5nZT0nWzAuMC4wLDMuNC4wLnYyMDA4MDMyNiknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc1Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnN5c3RlbUJ1bmRsZScgdmFsdWU9J09TR2kgU3lzdGVtIEJ1bmRsZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuZWNsaXBzZS5vcmcnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXN5c3RlbUJ1bmRsZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kZXNjcmlwdGlvbicgdmFsdWU9JyVzeXN0ZW1CdW5kbGUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclZWNsaXBzZS5vcmcnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc1Mic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2knIHZlcnNpb249JzMuNC4wLnYyMDA4MDMyNicvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaScgdmVyc2lvbj0nMy40LjAudjIwMDgwMzI2Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaS5ldmVudCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5jb25zb2xlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmV2ZW50bWdyJyB2ZXJzaW9uPScxLjEuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmxvZycgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGF0YWxvY2F0aW9uJyB2ZXJzaW9uPScxLjEuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kZWJ1ZycgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQnIHZlcnNpb249JzEuMS4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmxvY2FsaXphdGlvbicgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucGx1Z2luY29udmVyc2lvbicgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXInIHZlcnNpb249JzEuMi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJ1bm5hYmxlJyB2ZXJzaW9uPScxLjEuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5zZWN1cml0eScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UudXJsY29udmVyc2lvbicgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLnNpZ25lZGNvbnRlbnQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaS5zdG9yYWdlbWFuYWdlcicgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLnV0aWwnIHZlcnNpb249JzEuMS4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9zZ2kuZnJhbWV3b3JrJyB2ZXJzaW9uPScxLjQuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbicgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbicgdmVyc2lvbj0nMS4yLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub3NnaS5zZXJ2aWNlLnBlcm1pc3Npb25hZG1pbicgdmVyc2lvbj0nMS4yLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub3NnaS5zZXJ2aWNlLnN0YXJ0bGV2ZWwnIHZlcnNpb249JzEuMS4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9zZ2kuc2VydmljZS51cmwnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9zZ2kudXRpbC50cmFja2VyJyB2ZXJzaW9uPScxLjMuMycvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5hZGFwdG9yJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5pbnRlcm5hbC5hZGFwdG9yJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5pbnRlcm5hbC5zdGF0cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLmJhc2VhZGFwdG9yJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2kuYmFzZWFkYXB0b3IuYnVuZGxlZmlsZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLmJhc2VhZGFwdG9yLmhvb2tzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2kuYmFzZWFkYXB0b3IubG9hZGVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmFkYXB0b3InIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuZGVidWcnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWwuY29yZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5wcm90b2NvbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5wcm90b2NvbC5idW5kbGVlbnRyeScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5wcm90b2NvbC5idW5kbGVyZXNvdXJjZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5wcm90b2NvbC5yZWZlcmVuY2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWwucmVsaWFibGVmaWxlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmxhdW5jaGVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLnV0aWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC5iYXNlYWRhcHRvcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLm1vZHVsZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnByb2ZpbGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC5yZXNvbHZlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnByb3Zpc2lvbmFsLnNlcnZpY2Uuc2VjdXJpdHknIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC5wcm92aXNpb25hbC52ZXJpZmllcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnNlcnZpY2Uuc2VjdXJpdHknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC5zaWduZWRjb250ZW50JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmVjbGlwc2Uub3NnaScgdmVyc2lvbj0nMy40LjAudjIwMDgwMzI2Jy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLVZlcnNpb246IDMuNC4wLnYyMDA4MDMyNgotQnVuZGxlLURvY1VybDogaHR0cDovL3d3dy5lY2xpcHNlLm9yZwotQnVuZGxlLUNvcHlyaWdodDogJWNvcHlyaWdodAotRWNsaXBzZS1FeHRlbnNpYmxlQVBJOiB0cnVlCi1FY2xpcHNlLVN5c3RlbUJ1bmRsZTogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLm9zZ2kuZXZlbnQ7dmVyc2lvbj0mcXVvdDsxLjAmcXVvdDssb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuY29uc29sZTt2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5ldmVudG1ncjt2ZXJzaW9uPSZxdW90OzEuMSZxdW90OyxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5sb2c7dmVyc2lvbj0mcXVvdDsxLjAmcXVvdDssb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbjt2ZXJzaW9uPSZxdW90OzEuMSZxdW90OyxvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWc7dmVyc2lvbj0mcXVvdDsxLjAmcXVvdDssb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50O3ZlcnNpb249JnF1b3Q7MS4xJnF1b3Q7LG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5sb2NhbGl6YXRpb247dmVyc2lvbj0mcXVvdDsxLjAmcXVvdDssb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnBsdWdpbmNvbnZlcnNpb247dmVyc2lvbj0mcXVvdDsxLjAmcXVvdDssb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249JnF1b3Q7MS4yJnF1b3Q7LG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5ydW5uYWJsZTt2ZXJzaW9uPSZxdW90OzEuMSZxdW90OyxvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2Uuc2VjdXJpdHk7IHZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7LG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS51cmxjb252ZXJzaW9uO3ZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7LG9yZy5lY2xpcHNlLm9zZ2kuc2lnbmVkY29udGVudDsgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDssb3JnLmVjbGlwc2Uub3NnaS5zdG9yYWdlbWFuYWdlcjt2ZXJzaW9uPSZxdW90OzEuMCZxdW90OyxvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj0mcXVvdDsxLjEmcXVvdDssb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249JnF1b3Q7MS40JnF1b3Q7LG9yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbjt2ZXJzaW9uPSZxdW90OzEuMCZxdW90Oyxvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbjt2ZXJzaW9uPSZxdW90OzEuMiZxdW90Oyxvcmcub3NnaS5zZXJ2aWNlLnBlcm1pc3Npb25hZG1pbjt2ZXJzaW9uPSZxdW90OzEuMiZxdW90Oyxvcmcub3NnaS5zZXJ2aWNlLnN0YXJ0bGV2ZWw7dmVyc2lvbj0mcXVvdDsxLjEmcXVvdDssb3JnLm9zZ2kuc2VydmljZS51cmw7dmVyc2lvbj0mcXVvdDsxLjAmcXVvdDssb3JnLm9zZ2kudXRpbC50cmFja2VyO3ZlcnNpb249JnF1b3Q7MS4zLjMmcXVvdDssb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmFkYXB0b3I7eC1mcmllbmRzOj0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUmcXVvdDssb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmludGVybmFsLmFkYXB0b3I7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuaW50ZXJuYWwuc3RhdHM7eC1mcmllbmRzOj0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUmcXVvdDssb3JnLmVjbGlwc2Uub3NnaS5iYXNlYWRhcHRvcjt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuYmFzZWFkYXB0b3IuYnVuZGxlZmlsZTt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuYmFzZWFkYXB0b3IuaG9va3M7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmJhc2VhZGFwdG9yLmxvYWRlcjt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmFkYXB0b3I7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5kZWJ1Zzt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmludGVybmFsLmNvcmU7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5wcm90b2NvbDt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmludGVybmFsLnByb3RvY29sLmJ1bmRsZWVudHJ5O3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuaW50ZXJuYWwucHJvdG9jb2wuYnVuZGxlcmVzb3VyY2U7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5wcm90b2NvbC5yZWZlcmVuY2U7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5yZWxpYWJsZWZpbGU7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5sYXVuY2hlcjt4LWludGVybmFsOj10cnVlLG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLmJhc2VhZGFwdG9yO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC5tb2R1bGU7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnByb2ZpbGU7eC1pbnRlcm5hbDo9dHJ1ZSxvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnJlc29sdmVyO3gtaW50ZXJuYWw6PXRydWUsb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC5wcm92aXNpb25hbC5zZXJ2aWNlLnNlY3VyaXR5OyB4LWZyaWVuZHM6PSZxdW90O29yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkudWkmcXVvdDs7dmVyc2lvbj0mcXVvdDsxLjAuMCZxdW90OyxvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnByb3Zpc2lvbmFsLnZlcmlmaWVyO3gtZnJpZW5kczo9JnF1b3Q7b3JnLmVjbGlwc2UudXBkYXRlLmNvcmUsb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSZxdW90OyxvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLnNlcnZpY2Uuc2VjdXJpdHk7eC1mcmllbmRzOj0mcXVvdDtvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5LnVpJnF1b3Q7LG9yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwuc2lnbmVkY29udGVudDsgeC1pbnRlcm5hbDo9dHJ1ZQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5pbnRlcm5hbC5jb3JlLlN5c3RlbUJ1bmRsZUFjdGl2YXRvcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LE9TR2kvTWluaW11bS0xLjEKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHN5c3RlbWJ1bmRsZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uub3NnaTsgc2luZ2xldG9uOj10cnVlCi1FeHBvcnQtU2VydmljZTogb3JnLm9zZ2kuc2VydmljZS5wYWNrYWdlYWRtaW4uUGFja2FnZUFkbWluLG9yZy5vc2dpLnNlcnZpY2UucGVybWlzc2lvbmFkbWluLlBlcm1pc3Npb25BZG1pbixvcmcub3NnaS5zZXJ2aWNlLnN0YXJ0bGV2ZWwuU3RhcnRMZXZlbCxvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZGVidWcuRGVidWdPcHRpb25zCi1NYWluLUNsYXNzOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYWRhcHRvci5FY2xpcHNlU3RhcnRlcgotQnVuZGxlLURlc2NyaXB0aW9uOiAlc3lzdGVtQnVuZGxlCi1CdW5kbGUtVmVuZG9yOiAlZWNsaXBzZS5vcmcKLUJ1bmRsZS1OYW1lOiAlc3lzdGVtQnVuZGxlCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5iYXRpay5icmlkZ2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5iYXRpay5icmlkZ2UnIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIEJyaWRnZS9HVlQvU2NyaXB0aW5nJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScxNyc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuYnJpZGdlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmJyaWRnZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuYnJpZGdlJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuYnJpZGdlLnN2ZzEyJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZ3Z0JyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZ3Z0LmV2ZW50JyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZ3Z0LmZpbHRlcicgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmd2dC5mbG93JyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZ3Z0LmZvbnQnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5ndnQucmVuZGVyZXInIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5ndnQuc3ZnMTInIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5ndnQudGV4dCcgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnNjcmlwdCcgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnNjcmlwdC5yaGlubycgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdNRVRBLUlORi5zZXJ2aWNlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYmF0aWsuYnJpZGdlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotUmVxdWlyZS1idW5kbGU6IG9yZy5hcGFjaGUuYmF0aWsuY3NzO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmRvbTt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5kb20uc3ZnO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3Q7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsucGFyc2VyO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnV0aWw7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsudXRpbC5ndWk7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsueG1sO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcudzNjLmRvbS5zdmc7dmVyc2lvbj0mcXVvdDtbMS4xLjAsMS4zLjApJnF1b3Q7Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjMKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVZlcnNpb246IDEuNi4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmJhdGlrLmJyaWRnZTt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuYnJpZGdlLnN2ZzEyO3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5ndnQ7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmd2dC5ldmVudDt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZ3Z0LmZpbHRlcjt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZ3Z0LmZsb3c7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmd2dC5mb250O3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5ndnQucmVuZGVyZXI7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmd2dC5zdmcxMjt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZ3Z0LnRleHQ7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnNjcmlwdDt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuc2NyaXB0LnJoaW5vO3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDssTUVUQS1JTkYuc2VydmljZXMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmF0aWsuYnJpZGdlCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLnVkZGk0aicgdmVyc2lvbj0nMi4wLjUudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcudWRkaTRqJyByYW5nZT0nWzAuMC4wLDIuMC41LnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtVmVuZG9yLjAnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLU5hbWUuMCcgdmFsdWU9J1VEREk0SicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJUJ1bmRsZS1OYW1lLjAnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclQnVuZGxlLVZlbmRvci4wJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTYnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcudWRkaTRqJyB2ZXJzaW9uPScyLjAuNS52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcudWRkaTRqJyB2ZXJzaW9uPScyLjAuNS52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnVkZGk0aicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudWRkaTRqLmNsaWVudCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudWRkaTRqLmRhdGF0eXBlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy51ZGRpNGouZGF0YXR5cGUuYXNzZXJ0aW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy51ZGRpNGouZGF0YXR5cGUuYmluZGluZycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudWRkaTRqLmRhdGF0eXBlLmJ1c2luZXNzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy51ZGRpNGouZGF0YXR5cGUuc2VydmljZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudWRkaTRqLmRhdGF0eXBlLnRtb2RlbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudWRkaTRqLnJlcXVlc3QnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnVkZGk0ai5yZXNwb25zZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudWRkaTRqLnRyYW5zcG9ydCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudWRkaTRqLnV0aWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMSc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMnIHJhbmdlPSdbMS4zLjAsMi4wLjApJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLnVkZGk0aicgdmVyc2lvbj0nMi4wLjUudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUV4cG9ydC1QYWNrYWdlOiBvcmcudWRkaTRqLG9yZy51ZGRpNGouY2xpZW50LG9yZy51ZGRpNGouZGF0YXR5cGUsb3JnLnVkZGk0ai5kYXRhdHlwZS5hc3NlcnRpb24sb3JnLnVkZGk0ai5kYXRhdHlwZS5iaW5kaW5nLG9yZy51ZGRpNGouZGF0YXR5cGUuYnVzaW5lc3Msb3JnLnVkZGk0ai5kYXRhdHlwZS5zZXJ2aWNlLG9yZy51ZGRpNGouZGF0YXR5cGUudG1vZGVsLG9yZy51ZGRpNGoucmVxdWVzdCxvcmcudWRkaTRqLnJlc3BvbnNlLG9yZy51ZGRpNGoudHJhbnNwb3J0LG9yZy51ZGRpNGoudXRpbAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLmF4aXM7YnVuZGxlLXZlcnNpb249JnF1b3Q7WzEuMy4wLDIuMC4wKSZxdW90OwotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtVmVyc2lvbjogMi4wLjUudjIwMDgwMzA2MTgxMQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotRWNsaXBzZS1CdWRkeVBvbGljeTogcmVnaXN0ZXJlZAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLnVkZGk0agotQnVuZGxlLUNsYXNzUGF0aDogLgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdjb20uaWJtLmljdScgdmVyc2lvbj0nMy42LjEudjIwMDgwMzA0Jz4KLSAgICAgIDx1cGRhdGUgaWQ9J2NvbS5pYm0uaWN1JyByYW5nZT0nWzAuMC4wLDMuNi4xLnYyMDA4MDMwNCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0lCTSBDb3Jwb3JhdGlvbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0ludGVybmF0aW9uYWwgQ29tcG9uZW50cyBmb3IgVW5pY29kZSBmb3IgSmF2YSAoSUNVNEopJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScxNSc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2NvbS5pYm0uaWN1JyB2ZXJzaW9uPSczLjYuMS52MjAwODAzMDQnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2NvbS5pYm0uaWN1JyB2ZXJzaW9uPSczLjYuMS52MjAwODAzMDQnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS5sYW5nJyB2ZXJzaW9uPSczLjYuMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1Lm1hdGgnIHZlcnNpb249JzMuNi4xJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS5pY3UudGV4dCcgdmVyc2lvbj0nMy42LjEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS51dGlsJyB2ZXJzaW9uPSczLjYuMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LmltcGwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS5pY3UuaW1wbC5kYXRhJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LmltcGwuZGF0YS5pY3VkdDM2YicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS5pbXBsLmRhdGEuaWN1ZHQzNmIuYnJraXRyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LmltcGwuZGF0YS5pY3VkdDM2Yi5jb2xsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LmltcGwuZGF0YS5pY3VkdDM2Yi5yYm5mJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LmltcGwuZGF0YS5pY3VkdDM2Yi50cmFuc2xpdCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2NvbS5pYm0uaWN1JyB2ZXJzaW9uPSczLjYuMS52MjAwODAzMDQnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCxKMlNFLTEuMwotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotQnVuZGxlLUNsYXNzUGF0aDogaWN1LWpzZTQuamFyLGljdS1kYXRhLmphciwuCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtQ29weXJpZ2h0OiBMaWNlbnNlZCBNYXRlcmlhbHMgLSBQcm9wZXJ0eSBvZiBJQk0gKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gSUJNIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgSUJNIENvcnAuCi1DcmVhdGVkLUJ5OiAxLjQuMl8xNS1iMDIgKFN1biBNaWNyb3N5c3RlbXMgSW5jLikKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVZlcnNpb246IDMuNi4xLnYyMDA4MDMwNAotRWNsaXBzZS1FeHRlbnNpYmxlQVBJOiB0cnVlCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS5sYW5nO3ZlcnNpb249JnF1b3Q7My42LjEmcXVvdDssY29tLmlibS5pY3UubWF0aDt2ZXJzaW9uPSZxdW90OzMuNi4xJnF1b3Q7LGNvbS5pYm0uaWN1LnRleHQ7dmVyc2lvbj0mcXVvdDszLjYuMSZxdW90Oyxjb20uaWJtLmljdS51dGlsO3ZlcnNpb249JnF1b3Q7My42LjEmcXVvdDssY29tLmlibS5pY3UuaW1wbDt4LWludGVybmFsOj10cnVlLGNvbS5pYm0uaWN1LmltcGwuZGF0YTt4LWludGVybmFsOj10cnVlLGNvbS5pYm0uaWN1LmltcGwuZGF0YS5pY3VkdDM2Yjt4LWludGVybmFsOj10cnVlLGNvbS5pYm0uaWN1LmltcGwuZGF0YS5pY3VkdDM2Yi5icmtpdHI7eC1pbnRlcm5hbDo9dHJ1ZSxjb20uaWJtLmljdS5pbXBsLmRhdGEuaWN1ZHQzNmIuY29sbDt4LWludGVybmFsOj10cnVlLGNvbS5pYm0uaWN1LmltcGwuZGF0YS5pY3VkdDM2Yi5yYm5mO3gtaW50ZXJuYWw6PXRydWUsY29tLmlibS5pY3UuaW1wbC5kYXRhLmljdWR0MzZiLnRyYW5zbGl0O3gtaW50ZXJuYWw6PXRydWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGNvbS5pYm0uaWN1OyBzaW5nbGV0b246PXRydWUKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdqYXZhX2N1cC5ydW50aW1lLnNvdXJjZScgdmVyc2lvbj0nMC4xMC4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0namF2YV9jdXAucnVudGltZS5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMC4xMC4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0phdmEgQ3VwIFNvdXJjZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmFfY3VwLnJ1bnRpbWUuc291cmNlJyB2ZXJzaW9uPScwLjEwLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YV9jdXAucnVudGltZS5zb3VyY2UnIHZlcnNpb249JzAuMTAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdqYXZhX2N1cC5ydW50aW1lLnNvdXJjZScgdmVyc2lvbj0nMC4xMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMC4xMC4wLnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogamF2YV9jdXAucnVudGltZS5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogamF2YV9jdXAucnVudGltZTt2ZXJzaW9uPSZxdW90OzAuMTAuMC52MjAwODAzMDYxODExJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudCcgdmVyc2lvbj0nMy4wLjEudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudCcgcmFuZ2U9J1swLjAuMCwzLjAuMS52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlTmFtZScgdmFsdWU9J0FwYWNoZSBDb21tb25zIEh0dHBjbGllbnQgUGx1Zy1pbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlUHJvdmlkZXInIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJWJ1bmRsZU5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclYnVuZGxlUHJvdmlkZXInLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScxMic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50JyB2ZXJzaW9uPSczLjAuMS52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudCcgdmVyc2lvbj0nMy4wLjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50JyB2ZXJzaW9uPSczLjAuMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LmF1dGgnIHZlcnNpb249JzMuMC4xJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuY29va2llJyB2ZXJzaW9uPSczLjAuMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMnIHZlcnNpb249JzMuMC4xJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kcy5tdWx0aXBhcnQnIHZlcnNpb249JzMuMC4xJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQucGFyYW1zJyB2ZXJzaW9uPSczLjAuMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnByb3RvY29sJyB2ZXJzaW9uPSczLjAuMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnV0aWwnIHZlcnNpb249JzMuMC4xJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nOCc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguY3J5cHRvJyByYW5nZT0nMC4wLjAnIG9wdGlvbmFsPSd0cnVlJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguY3J5cHRvLnNwZWMnIHJhbmdlPScwLjAuMCcgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5uZXQnIHJhbmdlPScwLjAuMCcgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5uZXQuc3NsJyByYW5nZT0nMC4wLjAnIG9wdGlvbmFsPSd0cnVlJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjJyByYW5nZT0nWzEuMi4wLDIuMC4wKScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnknIHJhbmdlPSdbMS4yLjAsMi4wLjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldCcgcmFuZ2U9J1sxLjIuMCwyLjAuMCknLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZycgcmFuZ2U9J1sxLjAuNCwyLjAuMCknLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudCcgdmVyc2lvbj0nMy4wLjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLEoyU0UtMS4yCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZXJzaW9uOiAzLjAuMS52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQ7dmVyc2lvbj0mcXVvdDszLjAuMSZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5hdXRoO3ZlcnNpb249JnF1b3Q7My4wLjEmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuY29va2llO3ZlcnNpb249JnF1b3Q7My4wLjEmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQubWV0aG9kczt2ZXJzaW9uPSZxdW90OzMuMC4xJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMubXVsdGlwYXJ0O3ZlcnNpb249JnF1b3Q7My4wLjEmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQucGFyYW1zO3ZlcnNpb249JnF1b3Q7My4wLjEmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQucHJvdG9jb2w7dmVyc2lvbj0mcXVvdDszLjAuMSZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC51dGlsO3ZlcnNpb249JnF1b3Q7My4wLjEmcXVvdDsKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Ci1JbXBvcnQtUGFja2FnZTogamF2YXguY3J5cHRvO3Jlc29sdXRpb246PW9wdGlvbmFsLGphdmF4LmNyeXB0by5zcGVjO3Jlc29sdXRpb246PW9wdGlvbmFsLGphdmF4Lm5ldDtyZXNvbHV0aW9uOj1vcHRpb25hbCxqYXZheC5uZXQuc3NsO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYzt2ZXJzaW9uPSZxdW90O1sxLjIuMCwyLjAuMCkmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeTt2ZXJzaW9uPSZxdW90O1sxLjIuMCwyLjAuMCkmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldDt2ZXJzaW9uPSZxdW90O1sxLjIuMCwyLjAuMCkmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmc7dmVyc2lvbj0mcXVvdDtbMS4wLjQsMi4wLjApJnF1b3Q7Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdjb20uaWJtLmljdS5iYXNlJyB2ZXJzaW9uPSczLjguMS52MjAwODAzMDQnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nY29tLmlibS5pY3UuYmFzZScgcmFuZ2U9J1swLjAuMCwzLjguMS52MjAwODAzMDQpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdJQk0gQ29ycG9yYXRpb24nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdJbnRlcm5hdGlvbmFsIENvbXBvbmVudHMgZm9yIFVuaWNvZGUgZm9yIEphdmEgKElDVTRKKSBSZXBsYWNlbWVudCBwbHVnLWluJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc2Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nY29tLmlibS5pY3UuYmFzZScgdmVyc2lvbj0nMy44LjEudjIwMDgwMzA0Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdjb20uaWJtLmljdS5iYXNlJyB2ZXJzaW9uPSczLjguMS52MjAwODAzMDQnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS50ZXh0JyB2ZXJzaW9uPSczLjguMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LnV0aWwnIHZlcnNpb249JzMuOC4xJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdjb20uaWJtLmljdS5iYXNlJyB2ZXJzaW9uPSczLjguMS52MjAwODAzMDQnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtQ29weXJpZ2h0OiBMaWNlbnNlZCBNYXRlcmlhbHMgLSBQcm9wZXJ0eSBvZiBJQk0gKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwOC4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gSUJNIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgSUJNIENvcnAuCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCxKMlNFLTEuMwotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmlibS5pY3UuYmFzZQotQnVuZGxlLVZlcnNpb246IDMuOC4xLnYyMDA4MDMwNAotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249JnF1b3Q7My44LjEmcXVvdDssY29tLmlibS5pY3UudXRpbDt2ZXJzaW9uPSZxdW90OzMuOC4xJnF1b3Q7Ci0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdqYXZheC5zZXJ2bGV0JyB2ZXJzaW9uPScyLjQuMC52MjAwODAzMDYxOTEwJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2phdmF4LnNlcnZsZXQnIHJhbmdlPSdbMC4wLjAsMi40LjAudjIwMDgwMzA2MTkxMCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZU5hbWUnIHZhbHVlPSdTZXJ2bGV0IEFQSSBCdW5kbGUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZVByb3ZpZGVyJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVidW5kbGVOYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJWJ1bmRsZVByb3ZpZGVyJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNyc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4LnNlcnZsZXQnIHZlcnNpb249JzIuNC4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2phdmF4LnNlcnZsZXQnIHZlcnNpb249JzIuNC4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZXJ2bGV0JyB2ZXJzaW9uPScyLjQuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuaHR0cCcgdmVyc2lvbj0nMi40LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZXJ2bGV0LnJlc291cmNlcycgdmVyc2lvbj0nMi40LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2phdmF4LnNlcnZsZXQnIHZlcnNpb249JzIuNC4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjQuMC52MjAwODAzMDYxOTEwCi1FeHBvcnQtUGFja2FnZTogamF2YXguc2VydmxldDt2ZXJzaW9uPSZxdW90OzIuNCZxdW90OyxqYXZheC5zZXJ2bGV0Lmh0dHA7dmVyc2lvbj0mcXVvdDsyLjQmcXVvdDssamF2YXguc2VydmxldC5yZXNvdXJjZXM7dmVyc2lvbj0mcXVvdDsyLjQmcXVvdDsKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLEoyU0UtMS4zCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBqYXZheC5zZXJ2bGV0Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UnIHZlcnNpb249JzEuMS4xLnYyMDA4MDMwNjE5MTAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlJyByYW5nZT0nWzAuMC4wLDEuMS4xLnYyMDA4MDMwNjE5MTApJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVOYW1lJyB2YWx1ZT0nQXBhY2hlIENvbW1vbnMgTG9nZ2luZyBQbHVnLWluIFNvdXJjZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlUHJvdmlkZXInIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJWJ1bmRsZU5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclYnVuZGxlUHJvdmlkZXInLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlJyB2ZXJzaW9uPScxLjEuMS52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UnIHZlcnNpb249JzEuMS4xLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZScgdmVyc2lvbj0nMS4xLjEudjIwMDgwMzA2MTkxMCcvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMS52MjAwODAzMDYxOTEwCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVidW5kbGVOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZzt2ZXJzaW9uPSZxdW90OzEuMS4xLnYyMDA4MDMwNjE5MTAmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVidW5kbGVQcm92aWRlcgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5iYXRpay51dGlsLmd1aS5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5iYXRpay51dGlsLmd1aS5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIEdVSSBVdGlsaXRpZXMgU291cmNlIEJ1bmRsZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsudXRpbC5ndWkuc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnV0aWwuZ3VpLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5iYXRpay51dGlsLmd1aS5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMS42LjAudjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmJhdGlrLnV0aWwuZ3VpLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmJhdGlrLnV0aWwuZ3VpO3ZlcnNpb249JnF1b3Q7MS42LjAudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nbmV0LnNvdXJjZWZvcmdlLmxwZy5scGdqYXZhcnVudGltZS5zb3VyY2UnIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nbmV0LnNvdXJjZWZvcmdlLmxwZy5scGdqYXZhcnVudGltZS5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS4wLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nU291cmNlRm9yZ2UgTFBHIFNvdXJjZSBCdW5kbGUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSduZXQuc291cmNlZm9yZ2UubHBnLmxwZ2phdmFydW50aW1lLnNvdXJjZScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nbmV0LnNvdXJjZWZvcmdlLmxwZy5scGdqYXZhcnVudGltZS5zb3VyY2UnIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J25ldC5zb3VyY2Vmb3JnZS5scGcubHBnamF2YXJ1bnRpbWUuc291cmNlJyB2ZXJzaW9uPScxLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuMC4wLnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogbmV0LnNvdXJjZWZvcmdlLmxwZy5scGdqYXZhcnVudGltZS5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogbmV0LnNvdXJjZWZvcmdlLmxwZy5scGdqYXZhcnVudGltZTt2ZXJzaW9uPSZxdW90OzEuMC4wLnYyMDA4MDMwNjE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5vYmplY3R3ZWIuYXNtLnNvdXJjZScgdmVyc2lvbj0nMy4wLjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcub2JqZWN0d2ViLmFzbS5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMy4wLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQVNNIFNvdXJjZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5vYmplY3R3ZWIuYXNtLnNvdXJjZScgdmVyc2lvbj0nMy4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLm9iamVjdHdlYi5hc20uc291cmNlJyB2ZXJzaW9uPSczLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcub2JqZWN0d2ViLmFzbS5zb3VyY2UnIHZlcnNpb249JzMuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMy4wLjAudjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcub2JqZWN0d2ViLmFzbS5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLm9iamVjdHdlYi5hc207dmVyc2lvbj0mcXVvdDszLjAuMC52MjAwODAzMDYxODExJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5zb3VyY2UnIHZlcnNpb249JzEuOS4xLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuc291cmNlJyByYW5nZT0nWzAuMC4wLDEuOS4xLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBMdWNlbmUgQW5hbHlzaXMgU291cmNlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuc291cmNlJyB2ZXJzaW9uPScxLjkuMS52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5zb3VyY2UnIHZlcnNpb249JzEuOS4xLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnNvdXJjZScgdmVyc2lvbj0nMS45LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjkuMS52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpczt2ZXJzaW9uPSZxdW90OzEuOS4xLnYyMDA4MDMwNjE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUub3JvJyB2ZXJzaW9uPScyLjAuOC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUub3JvJyByYW5nZT0nWzAuMC4wLDIuMC44LnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBKYWthcnRhIE9STycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTAnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLm9ybycgdmVyc2lvbj0nMi4wLjgudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5vcm8nIHZlcnNpb249JzIuMC44LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLm9yby5pbycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLm9yby50ZXh0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUub3JvLnRleHQuYXdrJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUub3JvLnRleHQucGVybCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLm9yby50ZXh0LnJlZ2V4JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUub3JvLnV0aWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLm9ybycgdmVyc2lvbj0nMi4wLjgudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDIuMC44LnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLm9yby5pbyxvcmcuYXBhY2hlLm9yby50ZXh0LG9yZy5hcGFjaGUub3JvLnRleHQuYXdrLG9yZy5hcGFjaGUub3JvLnRleHQucGVybCxvcmcuYXBhY2hlLm9yby50ZXh0LnJlZ2V4LG9yZy5hcGFjaGUub3JvLnV0aWwKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5vcm8KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmF4aXMnIHZlcnNpb249JzEuNC4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5heGlzJyByYW5nZT0nWzAuMC4wLDEuNC4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtVmVuZG9yLjAnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLU5hbWUuMCcgdmFsdWU9J0FwYWNoZSBXZWIgU2VydmljZXMnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVCdW5kbGUtTmFtZS4wJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJUJ1bmRsZS1WZW5kb3IuMCcvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzYzJz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5heGlzJyB2ZXJzaW9uPScxLjQuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMnIHZlcnNpb249JzEuNC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLmF0dGFjaG1lbnRzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy5jbGllbnQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLmNsaWVudC5hc3luYycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMuY29sbGVjdGlvbnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLmNvbXBvbmVudHMuY29tcGlsZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLmNvbXBvbmVudHMuZW5jb2RpbmcnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLmNvbXBvbmVudHMuaW1hZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLmNvbXBvbmVudHMuam1zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy5jb21wb25lbnRzLmxvZ2dlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMuY29tcG9uZW50cy5uZXQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLmNvbXBvbmVudHMuc2NyaXB0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy5jb21wb25lbnRzLnRocmVhZHBvb2wnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLmNvbXBvbmVudHMudXVpZCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMuY29uZmlndXJhdGlvbicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMuY29uc3RhbnRzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy5kZXBsb3ltZW50LndzZGQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLmRlcGxveW1lbnQud3NkZC5wcm92aWRlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLmRlc2NyaXB0aW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy5lbmNvZGluZycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMuZW5jb2Rpbmcuc2VyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy5lbmNvZGluZy5zZXIuY2FzdG9yJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy5lbnVtJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy5oYW5kbGVycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMuaGFuZGxlcnMuaHR0cCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMuaGFuZGxlcnMuc29hcCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMuaG9sZGVycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMuaTE4bicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMubWFuYWdlbWVudCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMubWFuYWdlbWVudC5qbXgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLm1lc3NhZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLm1vbml0b3InIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLnByb3ZpZGVycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMucHJvdmlkZXJzLmphdmEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLnNjaGVtYScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMuc2VjdXJpdHknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLnNlY3VyaXR5LnNlcnZsZXQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLnNlY3VyaXR5LnNpbXBsZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMuc2VydmVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy5zZXNzaW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy5zb2FwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy5zdHJhdGVnaWVzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy50b29scy5hbnQuYXhpcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMudG9vbHMuYW50LmZvcmVhY2gnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLnRvb2xzLmFudC53c2RsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy50cmFuc3BvcnQuaHR0cCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMudHJhbnNwb3J0LmphdmEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLnRyYW5zcG9ydC5qbXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLnRyYW5zcG9ydC5sb2NhbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMudHJhbnNwb3J0Lm1haWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLnR5cGVzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy51dGlscycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMudXRpbHMuYnl0ZWNvZGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5heGlzLnV0aWxzLmNhY2hlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy53c2RsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy53c2RsLmZyb21KYXZhJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXhpcy53c2RsLmdlbicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMud3NkbC5zeW1ib2xUYWJsZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMud3NkbC50b0phdmEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nNyc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdqYXZheC54bWwucnBjJyByYW5nZT0nWzEuMS4wLDIuMC4wKScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YXgueG1sLnNvYXAnIHJhbmdlPSdbMS4yLjAsMi4wLjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdqYXZheC53c2RsJyByYW5nZT0nWzEuNS4xLDIuMC4wKScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeScgcmFuZ2U9J1swLjIuMCwxLjAuMCknLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYW50JyByYW5nZT0nWzEuNi41LDIuMC4wKScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nJyByYW5nZT0nWzEuMC40LDIuMC4wKScgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsJyByYW5nZT0nWzEuMC40LDIuMC4wKScgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmF4aXMnIHZlcnNpb249JzEuNC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScyJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtQ2xhc3NQYXRoOiBsaWIvYXhpcy5qYXIsbGliL2F4aXMtYW50LmphcixsaWIvamF2YXh6b21iaWUuamFyLGxpYi8KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYXhpcwotSW1wb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nO3ZlcnNpb249JnF1b3Q7WzEuMC40LDIuMC4wKSZxdW90OztyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsO3ZlcnNpb249JnF1b3Q7WzEuMC40LDIuMC4wKSZxdW90OztyZXNvbHV0aW9uOj1vcHRpb25hbAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuNC4wLnYyMDA4MDMwNjE4MTEKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1CdWRkeVBvbGljeTogcmVnaXN0ZXJlZAotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuYXhpcyxvcmcuYXBhY2hlLmF4aXMuYXR0YWNobWVudHMsb3JnLmFwYWNoZS5heGlzLmNsaWVudCxvcmcuYXBhY2hlLmF4aXMuY2xpZW50LmFzeW5jLG9yZy5hcGFjaGUuYXhpcy5jb2xsZWN0aW9ucyxvcmcuYXBhY2hlLmF4aXMuY29tcG9uZW50cy5jb21waWxlcixvcmcuYXBhY2hlLmF4aXMuY29tcG9uZW50cy5lbmNvZGluZyxvcmcuYXBhY2hlLmF4aXMuY29tcG9uZW50cy5pbWFnZSxvcmcuYXBhY2hlLmF4aXMuY29tcG9uZW50cy5qbXMsb3JnLmFwYWNoZS5heGlzLmNvbXBvbmVudHMubG9nZ2VyLG9yZy5hcGFjaGUuYXhpcy5jb21wb25lbnRzLm5ldCxvcmcuYXBhY2hlLmF4aXMuY29tcG9uZW50cy5zY3JpcHQsb3JnLmFwYWNoZS5heGlzLmNvbXBvbmVudHMudGhyZWFkcG9vbCxvcmcuYXBhY2hlLmF4aXMuY29tcG9uZW50cy51dWlkLG9yZy5hcGFjaGUuYXhpcy5jb25maWd1cmF0aW9uLG9yZy5hcGFjaGUuYXhpcy5jb25zdGFudHMsb3JnLmFwYWNoZS5heGlzLmRlcGxveW1lbnQud3NkZCxvcmcuYXBhY2hlLmF4aXMuZGVwbG95bWVudC53c2RkLnByb3ZpZGVycyxvcmcuYXBhY2hlLmF4aXMuZGVzY3JpcHRpb24sb3JnLmFwYWNoZS5heGlzLmVuY29kaW5nLG9yZy5hcGFjaGUuYXhpcy5lbmNvZGluZy5zZXIsb3JnLmFwYWNoZS5heGlzLmVuY29kaW5nLnNlci5jYXN0b3Isb3JnLmFwYWNoZS5heGlzLmVudW0sb3JnLmFwYWNoZS5heGlzLmhhbmRsZXJzLG9yZy5hcGFjaGUuYXhpcy5oYW5kbGVycy5odHRwLG9yZy5hcGFjaGUuYXhpcy5oYW5kbGVycy5zb2FwLG9yZy5hcGFjaGUuYXhpcy5ob2xkZXJzLG9yZy5hcGFjaGUuYXhpcy5pMThuLG9yZy5hcGFjaGUuYXhpcy5tYW5hZ2VtZW50LG9yZy5hcGFjaGUuYXhpcy5tYW5hZ2VtZW50LmpteCxvcmcuYXBhY2hlLmF4aXMubWVzc2FnZSxvcmcuYXBhY2hlLmF4aXMubW9uaXRvcixvcmcuYXBhY2hlLmF4aXMucHJvdmlkZXJzLG9yZy5hcGFjaGUuYXhpcy5wcm92aWRlcnMuamF2YSxvcmcuYXBhY2hlLmF4aXMuc2NoZW1hLG9yZy5hcGFjaGUuYXhpcy5zZWN1cml0eSxvcmcuYXBhY2hlLmF4aXMuc2VjdXJpdHkuc2VydmxldCxvcmcuYXBhY2hlLmF4aXMuc2VjdXJpdHkuc2ltcGxlLG9yZy5hcGFjaGUuYXhpcy5zZXJ2ZXIsb3JnLmFwYWNoZS5heGlzLnNlc3Npb24sb3JnLmFwYWNoZS5heGlzLnNvYXAsb3JnLmFwYWNoZS5heGlzLnN0cmF0ZWdpZXMsb3JnLmFwYWNoZS5heGlzLnRvb2xzLmFudC5heGlzLG9yZy5hcGFjaGUuYXhpcy50b29scy5hbnQuZm9yZWFjaCxvcmcuYXBhY2hlLmF4aXMudG9vbHMuYW50LndzZGwsb3JnLmFwYWNoZS5heGlzLnRyYW5zcG9ydC5odHRwLG9yZy5hcGFjaGUuYXhpcy50cmFuc3BvcnQuamF2YSxvcmcuYXBhY2hlLmF4aXMudHJhbnNwb3J0LmptcyxvcmcuYXBhY2hlLmF4aXMudHJhbnNwb3J0LmxvY2FsLG9yZy5hcGFjaGUuYXhpcy50cmFuc3BvcnQubWFpbCxvcmcuYXBhY2hlLmF4aXMudHlwZXMsb3JnLmFwYWNoZS5heGlzLnV0aWxzLG9yZy5hcGFjaGUuYXhpcy51dGlscy5ieXRlY29kZSxvcmcuYXBhY2hlLmF4aXMudXRpbHMuY2FjaGUsb3JnLmFwYWNoZS5heGlzLndzZGwsb3JnLmFwYWNoZS5heGlzLndzZGwuZnJvbUphdmEsb3JnLmFwYWNoZS5heGlzLndzZGwuZ2VuLG9yZy5hcGFjaGUuYXhpcy53c2RsLnN5bWJvbFRhYmxlLG9yZy5hcGFjaGUuYXhpcy53c2RsLnRvSmF2YQotUmVxdWlyZS1CdW5kbGU6IGphdmF4LnhtbC5ycGM7YnVuZGxlLXZlcnNpb249JnF1b3Q7WzEuMS4wLDIuMC4wKSZxdW90OyxqYXZheC54bWwuc29hcDtidW5kbGUtdmVyc2lvbj0mcXVvdDtbMS4yLjAsMi4wLjApJnF1b3Q7LGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249JnF1b3Q7WzEuNS4xLDIuMC4wKSZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMuZGlzY292ZXJ5O2J1bmRsZS12ZXJzaW9uPSZxdW90O1swLjIuMCwxLjAuMCkmcXVvdDssb3JnLmFwYWNoZS5hbnQ7YnVuZGxlLXZlcnNpb249JnF1b3Q7WzEuNi41LDIuMC4wKSZxdW90OwotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSd6aXBwZWQnPgotICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnNvdXJjZScgdmVyc2lvbj0nMy4xLjAudjIwMDgwMzA2MTkxMCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMy4xLjAudjIwMDgwMzA2MTkxMCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZU5hbWUnIHZhbHVlPSdBcGFjaGUgQ29tbW9ucyBIdHRwY2xpZW50IFNvdXJjZSBQbHVnLWluJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVQcm92aWRlcicgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclYnVuZGxlTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVidW5kbGVQcm92aWRlcicvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5zb3VyY2UnIHZlcnNpb249JzMuMS4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnNvdXJjZScgdmVyc2lvbj0nMy4xLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuc291cmNlJyB2ZXJzaW9uPSczLjEuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDMuMS4wLnYyMDA4MDMwNjE5MTAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuc291cmNlCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50O3ZlcnNpb249JnF1b3Q7My4xLjAudjIwMDgwMzA2MTkxMCZxdW90OwotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdjb20uaWJtLmljdS5zb3VyY2UnIHZlcnNpb249JzMuNC41JyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2NvbS5pYm0uaWN1LnNvdXJjZScgcmFuZ2U9J1swLjAuMCwzLjQuNSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0lCTSBDb3Jwb3JhdGlvbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0ludGVybmF0aW9uYWwgQ29tcG9uZW50cyBmb3IgVW5pY29kZSBmb3IgSmF2YSAoSUNVNEopIHNvdXJjZSBwbHVnLWluJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nY29tLmlibS5pY3Uuc291cmNlJyB2ZXJzaW9uPSczLjQuNScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nY29tLmlibS5pY3Uuc291cmNlJyB2ZXJzaW9uPSczLjQuNScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nY29tLmlibS5pY3Uuc291cmNlJyB2ZXJzaW9uPSczLjQuNScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDMuNC41Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBjb20uaWJtLmljdS5zb3VyY2UKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IGNvbS5pYm0uaWN1O3ZlcnNpb249JnF1b3Q7My40LjUmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmlvJyB2ZXJzaW9uPScxLjMuMi52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5pbycgcmFuZ2U9J1swLjAuMCwxLjMuMi52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQ29tbW9ucyBJTycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nOCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5pbycgdmVyc2lvbj0nMS4zLjIudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmlvJyB2ZXJzaW9uPScxLjMuMi52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmlvJyB2ZXJzaW9uPScxLjMuMicvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlZmlsdGVyJyB2ZXJzaW9uPScxLjMuMicvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5pby5pbnB1dCcgdmVyc2lvbj0nMS4zLjInLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaW8ub3V0cHV0JyB2ZXJzaW9uPScxLjMuMicvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmlvJyB2ZXJzaW9uPScxLjMuMi52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuMy4yLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW87dmVyc2lvbj0mcXVvdDsxLjMuMiZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMuaW8uZmlsZWZpbHRlcjt2ZXJzaW9uPSZxdW90OzEuMy4yJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5pby5pbnB1dDt2ZXJzaW9uPSZxdW90OzEuMy4yJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5pby5vdXRwdXQ7dmVyc2lvbj0mcXVvdDsxLjMuMiZxdW90OwotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW8KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdjaC5ldGh6Lmlrcy5zbHAuc291cmNlJyB2ZXJzaW9uPScxLjAuMC5SQzJfdjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdjaC5ldGh6Lmlrcy5zbHAuc291cmNlJyByYW5nZT0nWzAuMC4wLDEuMC4wLlJDMl92MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdqU0xQIFNvdXJjZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2NoLmV0aHouaWtzLnNscC5zb3VyY2UnIHZlcnNpb249JzEuMC4wLlJDMl92MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdjaC5ldGh6Lmlrcy5zbHAuc291cmNlJyB2ZXJzaW9uPScxLjAuMC5SQzJfdjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nY2guZXRoei5pa3Muc2xwLnNvdXJjZScgdmVyc2lvbj0nMS4wLjAuUkMyX3YyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAuUkMyX3YyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogY2guZXRoei5pa3Muc2xwLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBjaC5ldGh6Lmlrcy5zbHA7dmVyc2lvbj0mcXVvdDsxLjAuMC5SQzJfdjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmp1bml0JyB2ZXJzaW9uPSczLjguMS52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5qdW5pdCcgcmFuZ2U9J1swLjAuMCwzLjguMS52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdKVW5pdCBUZXN0aW5nIEZyYW1ld29yaycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTEnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuanVuaXQnIHZlcnNpb249JzMuOC4xLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5qdW5pdCcgdmVyc2lvbj0nMy44LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2p1bml0LmF3dHVpJyB2ZXJzaW9uPSczLjguMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2p1bml0LmV4dGVuc2lvbnMnIHZlcnNpb249JzMuOC4xJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nanVuaXQuZnJhbWV3b3JrJyB2ZXJzaW9uPSczLjguMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2p1bml0LnJ1bm5lcicgdmVyc2lvbj0nMy44LjEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqdW5pdC5zd2luZ3VpJyB2ZXJzaW9uPSczLjguMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2p1bml0LnN3aW5ndWkuaWNvbnMnIHZlcnNpb249JzMuOC4xJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nanVuaXQudGV4dHVpJyB2ZXJzaW9uPSczLjguMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmp1bml0JyB2ZXJzaW9uPSczLjguMS52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMic+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1CdW5kbGUtQ2xhc3NQYXRoOiBqdW5pdC5qYXIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5qdW5pdAotQnVuZGxlLVZlcnNpb246IDMuOC4xLnYyMDA4MDMwNjE4MTEKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZToganVuaXQuYXd0dWk7dmVyc2lvbj0mcXVvdDszLjguMSZxdW90OyxqdW5pdC5leHRlbnNpb25zO3ZlcnNpb249JnF1b3Q7My44LjEmcXVvdDssanVuaXQuZnJhbWV3b3JrO3ZlcnNpb249JnF1b3Q7My44LjEmcXVvdDssanVuaXQucnVubmVyO3ZlcnNpb249JnF1b3Q7My44LjEmcXVvdDssanVuaXQuc3dpbmd1aTt2ZXJzaW9uPSZxdW90OzMuOC4xJnF1b3Q7LGp1bml0LnN3aW5ndWkuaWNvbnM7dmVyc2lvbj0mcXVvdDszLjguMSZxdW90OyxqdW5pdC50ZXh0dWk7dmVyc2lvbj0mcXVvdDszLjguMSZxdW90OwotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSd6aXBwZWQnPgotICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5uZXQnIHZlcnNpb249JzEuNC4xLnYyMDA4MDMwNzE5MzUnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5jb21tb25zLm5ldCcgcmFuZ2U9J1swLjAuMCwxLjQuMS52MjAwODAzMDcxOTM1KScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQ29tbW9ucyBOZXQnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzE2Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLm5ldCcgdmVyc2lvbj0nMS40LjEudjIwMDgwMzA3MTkzNScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLm5ldCcgdmVyc2lvbj0nMS40LjEudjIwMDgwMzA3MTkzNScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5uZXQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLm5ldC5ic2QnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLm5ldC5mdHAucGFyc2VyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5uZXQuaW8nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLm5ldC5ubnRwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5uZXQubnRwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5uZXQucG9wMycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubmV0LnNtdHAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLm5ldC50ZWxuZXQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLm5ldC50ZnRwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5uZXQudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScxJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUub3JvJyByYW5nZT0nWzIuMC44LDIuMS4wKScvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5uZXQnIHZlcnNpb249JzEuNC4xLnYyMDA4MDMwNzE5MzUnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLm9ybztidW5kbGUtdmVyc2lvbj0mcXVvdDtbMi4wLjgsMi4xLjApJnF1b3Q7Ci1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZXJzaW9uOiAxLjQuMS52MjAwODAzMDcxOTM1Ci1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5jb21tb25zLm5ldCxvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmJzZCxvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cCxvcmcuYXBhY2hlLmNvbW1vbnMubmV0LmZ0cC5wYXJzZXIsb3JnLmFwYWNoZS5jb21tb25zLm5ldC5pbyxvcmcuYXBhY2hlLmNvbW1vbnMubmV0Lm5udHAsb3JnLmFwYWNoZS5jb21tb25zLm5ldC5udHAsb3JnLmFwYWNoZS5jb21tb25zLm5ldC5wb3AzLG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuc210cCxvcmcuYXBhY2hlLmNvbW1vbnMubmV0LnRlbG5ldCxvcmcuYXBhY2hlLmNvbW1vbnMubmV0LnRmdHAsb3JnLmFwYWNoZS5jb21tb25zLm5ldC51dGlsCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMubmV0Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5iYXRpay5kb20uc3ZnJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuYmF0aWsuZG9tLnN2ZycgcmFuZ2U9J1swLjAuMCwxLjYuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQmF0aWsgU1ZHIERPTScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZG9tLnN2ZycgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5kb20uc3ZnJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5kb20uc3ZnJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZG9tLnN2ZzEyJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzgnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5jc3MnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5kb20nIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5wYXJzZXInIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay51dGlsJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy53M2MuY3NzLnNhYycgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcudzNjLmRvbS5zbWlsJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy53M2MuZG9tLnN2ZycgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5kb20nIHJhbmdlPScwLjAuMCcvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYmF0aWsuZG9tLnN2ZycgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNCxKMlNFLTEuMwotUmVxdWlyZS1CdW5kbGU6IG9yZy5hcGFjaGUuYmF0aWsuY3NzO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmRvbTt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5wYXJzZXI7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsudXRpbDt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLnczYy5jc3Muc2FjO3ZlcnNpb249JnF1b3Q7WzEuMy4wLDEuNC4wKSZxdW90OyxvcmcudzNjLmRvbS5zbWlsO3ZlcnNpb249JnF1b3Q7WzEuMC4wLDEuMS4wKSZxdW90OyxvcmcudzNjLmRvbS5zdmc7dmVyc2lvbj0mcXVvdDtbMS4xLjAsMS4zLjApJnF1b3Q7Ci1JbXBvcnQtUGFja2FnZTogb3JnLnczYy5kb20KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmF0aWsuZG9tLnN2ZwotQnVuZGxlLVZlcnNpb246IDEuNi4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmJhdGlrLmRvbS5zdmc7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmRvbS5zdmcxMjt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7Ci0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLnhlcmNlcycgdmVyc2lvbj0nMi44LjAudjIwMDgwMzA3MDMwOCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLnhlcmNlcycgcmFuZ2U9J1swLjAuMCwyLjguMC52MjAwODAzMDcwMzA4KScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLVZlbmRvci4wJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1OYW1lLjAnIHZhbHVlPSdBcGFjaGUgWGVyY2VzLUonLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVCdW5kbGUtTmFtZS4wJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJUJ1bmRsZS1WZW5kb3IuMCcvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzY3Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMnIHZlcnNpb249JzIuOC4wLnYyMDA4MDMwNzAzMDgnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzJyB2ZXJzaW9uPScyLjguMC52MjAwODAzMDcwMzA4Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nTUVUQS1JTkYuc2VydmljZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5kYXRhdHlwZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwubmFtZXNwYWNlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5wYXJzZXJzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC50cmFuc2Zvcm0nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnRyYW5zZm9ybS5kb20nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnRyYW5zZm9ybS5zYXgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnZhbGlkYXRpb24nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnhwYXRoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuaHRtbC5kb20nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS53bWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS53bWwuZG9tJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmRvbScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5kb20uZXZlbnRzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmRvbTMuYXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuaW1wbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLmR0ZCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLmR0ZC5tb2RlbHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5kdicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLmR2LmR0ZCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLmR2LnV0aWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5kdi54cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLmlvJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmltcGwubXNnJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmltcGwudmFsaWRhdGlvbicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnhwYXRoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmltcGwueHBhdGgucmVnZXgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnhzLmlkZW50aXR5JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmltcGwueHMubW9kZWxzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmltcGwueHMub3B0aScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnhzLnRyYXZlcnNlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cy51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmpheHAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuamF4cC5kYXRhdHlwZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5qYXhwLnZhbGlkYXRpb24nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMucGFyc2VycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLnhpbmNsdWRlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLnhuaScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy54bmkuZ3JhbW1hcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy54cG9pbnRlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy54cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy54cy5kYXRhdHlwZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sY29tbW9ucycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbS5ib290c3RyYXAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5kb20uY3NzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy53M2MuZG9tLmV2ZW50cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbS5odG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy53M2MuZG9tLmxzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy53M2MuZG9tLnJhbmdlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbS5zdHlsZXNoZWV0cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbS50cmF2ZXJzYWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5kb20udmlld3MnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5kb20ueHBhdGgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnhtbC5zYXgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnhtbC5zYXguZXh0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy54bWwuc2F4LmhlbHBlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMic+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUueG1sLnJlc29sdmVyJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLnhlcmNlcycgdmVyc2lvbj0nMi44LjAudjIwMDgwMzA3MDMwOCcvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMgotQnVuZGxlLUNsYXNzUGF0aDogLgotUmVxdWlyZS1CdW5kbGU6IHN5c3RlbS5idW5kbGUsb3JnLmFwYWNoZS54bWwucmVzb2x2ZXI7dmlzaWJpbGl0eTo9cmVleHBvcnQKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUueGVyY2VzCi1CdW5kbGUtVmVyc2lvbjogMi44LjAudjIwMDgwMzA3MDMwOAotRXhwb3J0LVBhY2thZ2U6IE1FVEEtSU5GLnNlcnZpY2VzLGphdmF4LnhtbCxqYXZheC54bWwuZGF0YXR5cGUsamF2YXgueG1sLm5hbWVzcGFjZSxqYXZheC54bWwucGFyc2VycyxqYXZheC54bWwudHJhbnNmb3JtLGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLGphdmF4LnhtbC52YWxpZGF0aW9uLGphdmF4LnhtbC54cGF0aCxvcmcuYXBhY2hlLmh0bWwuZG9tLG9yZy5hcGFjaGUud21sLG9yZy5hcGFjaGUud21sLmRvbSxvcmcuYXBhY2hlLnhlcmNlcy5kb20sb3JnLmFwYWNoZS54ZXJjZXMuZG9tLmV2ZW50cyxvcmcuYXBhY2hlLnhlcmNlcy5kb20zLmFzLG9yZy5hcGFjaGUueGVyY2VzLmltcGwsb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5kdGQsb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5kdGQubW9kZWxzLG9yZy5hcGFjaGUueGVyY2VzLmltcGwuZHYsb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5kdi5kdGQsb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5kdi51dGlsLG9yZy5hcGFjaGUueGVyY2VzLmltcGwuZHYueHMsb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5pbyxvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLm1zZyxvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnZhbGlkYXRpb24sb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cGF0aCxvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnhwYXRoLnJlZ2V4LG9yZy5hcGFjaGUueGVyY2VzLmltcGwueHMsb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cy5pZGVudGl0eSxvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnhzLm1vZGVscyxvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnhzLm9wdGksb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cy50cmF2ZXJzZXJzLG9yZy5hcGFjaGUueGVyY2VzLmltcGwueHMudXRpbCxvcmcuYXBhY2hlLnhlcmNlcy5qYXhwLG9yZy5hcGFjaGUueGVyY2VzLmpheHAuZGF0YXR5cGUsb3JnLmFwYWNoZS54ZXJjZXMuamF4cC52YWxpZGF0aW9uLG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMsb3JnLmFwYWNoZS54ZXJjZXMudXRpbCxvcmcuYXBhY2hlLnhlcmNlcy54aW5jbHVkZSxvcmcuYXBhY2hlLnhlcmNlcy54bmksb3JnLmFwYWNoZS54ZXJjZXMueG5pLmdyYW1tYXJzLG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIsb3JnLmFwYWNoZS54ZXJjZXMueHBvaW50ZXIsb3JnLmFwYWNoZS54ZXJjZXMueHMsb3JnLmFwYWNoZS54ZXJjZXMueHMuZGF0YXR5cGVzLG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZSxvcmcuYXBhY2hlLnhtbGNvbW1vbnMsb3JnLnczYy5kb20sb3JnLnczYy5kb20uYm9vdHN0cmFwLG9yZy53M2MuZG9tLmNzcyxvcmcudzNjLmRvbS5ldmVudHMsb3JnLnczYy5kb20uaHRtbCxvcmcudzNjLmRvbS5scyxvcmcudzNjLmRvbS5yYW5nZXMsb3JnLnczYy5kb20uc3R5bGVzaGVldHMsb3JnLnczYy5kb20udHJhdmVyc2FsLG9yZy53M2MuZG9tLnZpZXdzLG9yZy53M2MuZG9tLnhwYXRoLG9yZy54bWwuc2F4LG9yZy54bWwuc2F4LmV4dCxvcmcueG1sLnNheC5oZWxwZXJzCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSduZXQuc291cmNlZm9yZ2UubHBnLmxwZ2phdmFydW50aW1lJyB2ZXJzaW9uPScxLjAuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J25ldC5zb3VyY2Vmb3JnZS5scGcubHBnamF2YXJ1bnRpbWUnIHJhbmdlPSdbMC4wLjAsMS4wLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nU291cmNlRm9yZ2UgTFBHJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc1Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nbmV0LnNvdXJjZWZvcmdlLmxwZy5scGdqYXZhcnVudGltZScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nbmV0LnNvdXJjZWZvcmdlLmxwZy5scGdqYXZhcnVudGltZScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2xwZy5scGdqYXZhcnVudGltZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J25ldC5zb3VyY2Vmb3JnZS5scGcubHBnamF2YXJ1bnRpbWUnIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCxKMlNFLTEuMwotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IGxwZy5scGdqYXZhcnVudGltZTsgdmVyc2lvbj0mcXVvdDsxLjAmcXVvdDsKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG5ldC5zb3VyY2Vmb3JnZS5scGcubHBnamF2YXJ1bnRpbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdqYXZheC5zZXJ2bGV0LmpzcCcgdmVyc2lvbj0nMi4wLjAudjIwMDgwMzA2MTkxMCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdqYXZheC5zZXJ2bGV0LmpzcCcgcmFuZ2U9J1swLjAuMCwyLjAuMC52MjAwODAzMDYxOTEwKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlTmFtZScgdmFsdWU9J0phdmEgU2VydmVyIFBhZ2VzIEFQSSBCdW5kbGUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZVByb3ZpZGVyJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVidW5kbGVOYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJWJ1bmRsZVByb3ZpZGVyJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nOCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4LnNlcnZsZXQuanNwJyB2ZXJzaW9uPScyLjAuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdqYXZheC5zZXJ2bGV0LmpzcCcgdmVyc2lvbj0nMi4wLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuanNwJyB2ZXJzaW9uPScyLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuanNwLmVsJyB2ZXJzaW9uPScyLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuanNwLnJlc291cmNlcycgdmVyc2lvbj0nMi4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQnIHZlcnNpb249JzIuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMyc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldCcgcmFuZ2U9JzIuNC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldC5odHRwJyByYW5nZT0nMi40LjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZXJ2bGV0LnJlc291cmNlcycgcmFuZ2U9JzIuNC4wJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0namF2YXguc2VydmxldC5qc3AnIHZlcnNpb249JzIuMC4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCxKMlNFLTEuMwotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMi4wLjAudjIwMDgwMzA2MTkxMAotRXhwb3J0LVBhY2thZ2U6IGphdmF4LnNlcnZsZXQuanNwOyB2ZXJzaW9uPTIuMCxqYXZheC5zZXJ2bGV0LmpzcC5lbDsgdmVyc2lvbj0yLjAsamF2YXguc2VydmxldC5qc3AucmVzb3VyY2VzOyB2ZXJzaW9uPTIuMCxqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQ7IHZlcnNpb249Mi4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBqYXZheC5zZXJ2bGV0LmpzcAotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnNlcnZsZXQ7IHZlcnNpb249Mi40LGphdmF4LnNlcnZsZXQuaHR0cDsgdmVyc2lvbj0yLjQsamF2YXguc2VydmxldC5yZXNvdXJjZXM7IHZlcnNpb249Mi40Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdqYXZheC5zZXJ2bGV0JyB2ZXJzaW9uPScyLjUuMC52MjAwODAzMDYxOTIwJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2phdmF4LnNlcnZsZXQnIHJhbmdlPSdbMC4wLjAsMi41LjAudjIwMDgwMzA2MTkyMCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZU5hbWUnIHZhbHVlPSdTZXJ2bGV0IEFQSSBCdW5kbGUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZVByb3ZpZGVyJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVidW5kbGVOYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJWJ1bmRsZVByb3ZpZGVyJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNyc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4LnNlcnZsZXQnIHZlcnNpb249JzIuNS4wLnYyMDA4MDMwNjE5MjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2phdmF4LnNlcnZsZXQnIHZlcnNpb249JzIuNS4wLnYyMDA4MDMwNjE5MjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZXJ2bGV0JyB2ZXJzaW9uPScyLjUuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuaHR0cCcgdmVyc2lvbj0nMi41LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZXJ2bGV0LnJlc291cmNlcycgdmVyc2lvbj0nMi41LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2phdmF4LnNlcnZsZXQnIHZlcnNpb249JzIuNS4wLnYyMDA4MDMwNjE5MjAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjUuMC52MjAwODAzMDYxOTIwCi1FeHBvcnQtUGFja2FnZTogamF2YXguc2VydmxldDt2ZXJzaW9uPSZxdW90OzIuNSZxdW90OyxqYXZheC5zZXJ2bGV0Lmh0dHA7dmVyc2lvbj0mcXVvdDsyLjUmcXVvdDssamF2YXguc2VydmxldC5yZXNvdXJjZXM7dmVyc2lvbj0mcXVvdDsyLjUmcXVvdDsKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLVN5bWJvbGljTmFtZTogamF2YXguc2VydmxldAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVidW5kbGVQcm92aWRlcgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5iYXRpay5zd2luZy5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5iYXRpay5zd2luZy5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIFN3aW5nIFNvdXJjZSBCdW5kbGUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnN3aW5nLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5zd2luZy5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYmF0aWsuc3dpbmcuc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuNi4wLnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5iYXRpay5zd2luZy5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmFwYWNoZS5iYXRpay5zd2luZzt2ZXJzaW9uPSZxdW90OzEuNi4wLnYyMDA4MDMwNjE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5pby5zb3VyY2UnIHZlcnNpb249JzEuMy4yLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmlvLnNvdXJjZScgcmFuZ2U9J1swLjAuMCwxLjMuMi52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQ29tbW9ucyBJTyBTb3VyY2UnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaW8uc291cmNlJyB2ZXJzaW9uPScxLjMuMi52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaW8uc291cmNlJyB2ZXJzaW9uPScxLjMuMi52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuaW8uc291cmNlJyB2ZXJzaW9uPScxLjMuMi52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuMy4yLnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5jb21tb25zLmlvLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmNvbW1vbnMuaW87dmVyc2lvbj0mcXVvdDsxLjMuMi52MjAwODAzMDYxODExJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdjb20uaWJtLmljdScgdmVyc2lvbj0nMy44LjEudjIwMDgwMzA0Jz4KLSAgICAgIDx1cGRhdGUgaWQ9J2NvbS5pYm0uaWN1JyByYW5nZT0nWzAuMC4wLDMuOC4xLnYyMDA4MDMwNCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0lCTSBDb3Jwb3JhdGlvbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0ludGVybmF0aW9uYWwgQ29tcG9uZW50cyBmb3IgVW5pY29kZSBmb3IgSmF2YSAoSUNVNEopJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScxNSc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2NvbS5pYm0uaWN1JyB2ZXJzaW9uPSczLjguMS52MjAwODAzMDQnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2NvbS5pYm0uaWN1JyB2ZXJzaW9uPSczLjguMS52MjAwODAzMDQnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS5sYW5nJyB2ZXJzaW9uPSczLjguMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1Lm1hdGgnIHZlcnNpb249JzMuOC4xJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS5pY3UudGV4dCcgdmVyc2lvbj0nMy44LjEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS51dGlsJyB2ZXJzaW9uPSczLjguMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LmltcGwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS5pY3UuaW1wbC5kYXRhJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LmltcGwuZGF0YS5pY3VkdDM4YicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS5pbXBsLmRhdGEuaWN1ZHQzOGIuYnJraXRyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LmltcGwuZGF0YS5pY3VkdDM4Yi5jb2xsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LmltcGwuZGF0YS5pY3VkdDM4Yi5yYm5mJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LmltcGwuZGF0YS5pY3VkdDM4Yi50cmFuc2xpdCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2NvbS5pYm0uaWN1JyB2ZXJzaW9uPSczLjguMS52MjAwODAzMDQnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCxKMlNFLTEuMwotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1DbGFzc1BhdGg6IGljdS1qc2U0LmphcixpY3UtZGF0YS5qYXIsLgotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmlibS5pY3U7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjguMS52MjAwODAzMDQKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLUNvcHlyaWdodDogTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDguIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIElCTSBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIElCTSBDb3JwLgotRWNsaXBzZS1FeHRlbnNpYmxlQVBJOiB0cnVlCi1FeHBvcnQtUGFja2FnZTogY29tLmlibS5pY3UubGFuZzt2ZXJzaW9uPSZxdW90OzMuOC4xJnF1b3Q7LGNvbS5pYm0uaWN1Lm1hdGg7dmVyc2lvbj0mcXVvdDszLjguMSZxdW90Oyxjb20uaWJtLmljdS50ZXh0O3ZlcnNpb249JnF1b3Q7My44LjEmcXVvdDssY29tLmlibS5pY3UudXRpbDt2ZXJzaW9uPSZxdW90OzMuOC4xJnF1b3Q7LGNvbS5pYm0uaWN1LmltcGw7eC1pbnRlcm5hbDo9dHJ1ZSxjb20uaWJtLmljdS5pbXBsLmRhdGE7eC1pbnRlcm5hbDo9dHJ1ZSxjb20uaWJtLmljdS5pbXBsLmRhdGEuaWN1ZHQzOGI7eC1pbnRlcm5hbDo9dHJ1ZSxjb20uaWJtLmljdS5pbXBsLmRhdGEuaWN1ZHQzOGIuYnJraXRyO3gtaW50ZXJuYWw6PXRydWUsY29tLmlibS5pY3UuaW1wbC5kYXRhLmljdWR0MzhiLmNvbGw7eC1pbnRlcm5hbDo9dHJ1ZSxjb20uaWJtLmljdS5pbXBsLmRhdGEuaWN1ZHQzOGIucmJuZjt4LWludGVybmFsOj10cnVlLGNvbS5pYm0uaWN1LmltcGwuZGF0YS5pY3VkdDM4Yi50cmFuc2xpdDt4LWludGVybmFsOj10cnVlCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmJhdGlrLnV0aWwuc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuYmF0aWsudXRpbC5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIFV0aWxpdGllcyBTb3VyY2UgQnVuZGxlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay51dGlsLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay51dGlsLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5iYXRpay51dGlsLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjYuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmF0aWsudXRpbC5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmFwYWNoZS5iYXRpay51dGlsO3ZlcnNpb249JnF1b3Q7MS42LjAudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLm1vcnRiYXkuamV0dHkuc2VydmVyLnNvdXJjZScgdmVyc2lvbj0nNi4xLjcudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcubW9ydGJheS5qZXR0eS5zZXJ2ZXIuc291cmNlJyByYW5nZT0nWzAuMC4wLDYuMS43LnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVOYW1lJyB2YWx1ZT0nSmV0dHkgU2VydmVyIFNvdXJjZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlUHJvdmlkZXInIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJWJ1bmRsZU5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclYnVuZGxlUHJvdmlkZXInLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLm1vcnRiYXkuamV0dHkuc2VydmVyLnNvdXJjZScgdmVyc2lvbj0nNi4xLjcudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLm1vcnRiYXkuamV0dHkuc2VydmVyLnNvdXJjZScgdmVyc2lvbj0nNi4xLjcudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLm1vcnRiYXkuamV0dHkuc2VydmVyLnNvdXJjZScgdmVyc2lvbj0nNi4xLjcudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiA2LjEuNy52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5tb3J0YmF5LmpldHR5LnNlcnZlci5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLm1vcnRiYXkuamV0dHkuc2VydmVyO3ZlcnNpb249JnF1b3Q7Ni4xLjcudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdjb20uaWJtLmljdS5iYXNlJyB2ZXJzaW9uPSczLjQuNScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdjb20uaWJtLmljdS5iYXNlJyByYW5nZT0nWzAuMC4wLDMuNC41KScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nSUJNIENvcnBvcmF0aW9uJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nSW50ZXJuYXRpb25hbCBDb21wb25lbnRzIGZvciBVbmljb2RlIGZvciBKYXZhIChJQ1U0SikgUmVwbGFjZW1lbnQgcGx1Zy1pbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2NvbS5pYm0uaWN1LmJhc2UnIHZlcnNpb249JzMuNC41Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdjb20uaWJtLmljdS5iYXNlJyB2ZXJzaW9uPSczLjQuNScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LnRleHQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS5pY3UudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2NvbS5pYm0uaWN1LmJhc2UnIHZlcnNpb249JzMuNC41Jy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLUNvcHlyaWdodDogTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIElCTSBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIElCTSBDb3JwLgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjAvRm91bmRhdGlvbi0xLjAsSjJTRS0xLjMKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGNvbS5pYm0uaWN1LmJhc2UKLUJ1bmRsZS1WZXJzaW9uOiAzLjQuNQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBjb20uaWJtLmljdS50ZXh0LGNvbS5pYm0uaWN1LnV0aWwKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2NvbS5pYm0uaWN1LmJhc2UnIHZlcnNpb249JzMuNi4xLnYyMDA4MDMwNCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdjb20uaWJtLmljdS5iYXNlJyByYW5nZT0nWzAuMC4wLDMuNi4xLnYyMDA4MDMwNCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0lCTSBDb3Jwb3JhdGlvbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0ludGVybmF0aW9uYWwgQ29tcG9uZW50cyBmb3IgVW5pY29kZSBmb3IgSmF2YSAoSUNVNEopIFJlcGxhY2VtZW50IHBsdWctaW4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzYnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdjb20uaWJtLmljdS5iYXNlJyB2ZXJzaW9uPSczLjYuMS52MjAwODAzMDQnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2NvbS5pYm0uaWN1LmJhc2UnIHZlcnNpb249JzMuNi4xLnYyMDA4MDMwNCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LnRleHQnIHZlcnNpb249JzMuNi4xJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS5pY3UudXRpbCcgdmVyc2lvbj0nMy42LjEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2NvbS5pYm0uaWN1LmJhc2UnIHZlcnNpb249JzMuNi4xLnYyMDA4MDMwNCcvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLEoyU0UtMS4zCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMAotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1DcmVhdGVkLUJ5OiAxLjQuMiAoSUJNIENvcnBvcmF0aW9uKQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjb20uaWJtLmljdS5iYXNlCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuNi4xLnYyMDA4MDMwNAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtQ29weXJpZ2h0OiBMaWNlbnNlZCBNYXRlcmlhbHMgLSBQcm9wZXJ0eSBvZiBJQk0gKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwNy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gSUJNIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgSUJNIENvcnAuCi1FeHBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudGV4dDt2ZXJzaW9uPSZxdW90OzMuNi4xJnF1b3Q7LGNvbS5pYm0uaWN1LnV0aWw7dmVyc2lvbj0mcXVvdDszLjYuMSZxdW90OwotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5sdWNlbmUnIHZlcnNpb249JzEuNC4zLnYyMDA4MDMwNjE5MTAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5sdWNlbmUnIHJhbmdlPSdbMC4wLjAsMS40LjMudjIwMDgwMzA2MTkxMCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5sdWNlbmVfcGx1Z2luX25hbWUnIHZhbHVlPSdBcGFjaGUgTHVjZW5lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclbHVjZW5lX3BsdWdpbl9uYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzE1Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUnIHZlcnNpb249JzEuNC4zLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUubHVjZW5lJyB2ZXJzaW9uPScxLjQuMy52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuZGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMucnUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuc3RhbmRhcmQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUucXVlcnlQYXJzZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zcGFucycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5sdWNlbmUnIHZlcnNpb249JzEuNC4zLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjMsQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMAotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLU5hbWU6ICVsdWNlbmVfcGx1Z2luX25hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmx1Y2VuZQotQnVuZGxlLVZlcnNpb246IDEuNC4zLnYyMDA4MDMwNjE5MTAKLUVjbGlwc2UtTGF6eVN0YXJ0OiBmYWxzZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLmRlLG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnJ1LG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnN0YW5kYXJkLG9yZy5hcGFjaGUubHVjZW5lLmRvY3VtZW50LG9yZy5hcGFjaGUubHVjZW5lLmluZGV4LG9yZy5hcGFjaGUubHVjZW5lLnF1ZXJ5UGFyc2VyLG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaCxvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2guc3BhbnMsb3JnLmFwYWNoZS5sdWNlbmUuc3RvcmUsb3JnLmFwYWNoZS5sdWNlbmUudXRpbAotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLnNvdXJjZScgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuc291cmNlJyByYW5nZT0nWzAuMC4wLDEuMi4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVOYW1lJyB2YWx1ZT0nQXBhY2hlIENvbW1vbnMgQ29kZWMgU291cmNlIFBsdWctaW4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZVByb3ZpZGVyJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVidW5kbGVOYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJWJ1bmRsZVByb3ZpZGVyJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5zb3VyY2UnIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5zb3VyY2UnIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5zb3VyY2UnIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAudjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuc291cmNlCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYzt2ZXJzaW9uPSZxdW90OzEuMi4wLnYyMDA4MDMwNjE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVidW5kbGVQcm92aWRlcgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS53c2lsNGonIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS53c2lsNGonIHJhbmdlPSdbMC4wLjAsMS4wLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1WZW5kb3IuMCcgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtTmFtZS4wJyB2YWx1ZT0nV1NJTDRKJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclQnVuZGxlLU5hbWUuMCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVCdW5kbGUtVmVuZG9yLjAnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScxNSc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUud3NpbDRqJyB2ZXJzaW9uPScxLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLndzaWw0aicgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUud3NpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLndzaWwuY2xpZW50JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUud3NpbC5leHRlbnNpb24nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi51ZGRpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUud3NpbC5leHRlbnNpb24ud3NkbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLndzaWwuaW1wbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLndzaWwuaW1wbC5leHRlbnNpb24nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS53c2lsLmltcGwuZXh0ZW5zaW9uLnVkZGknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS53c2lsLmltcGwuZXh0ZW5zaW9uLndzZGwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS53c2lsLnV0aWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS53c2lsLnhtbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPSczJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy51ZGRpNGonIHJhbmdlPSdbMi4wLjQsMy4wLjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmF4aXMnIHJhbmdlPSdbMS4zLjAsMi4wLjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdqYXZheC53c2RsJyByYW5nZT0nWzEuNC4wLDEuNS4wKScvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUud3NpbDRqJyB2ZXJzaW9uPScxLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1SZXF1aXJlLUJ1bmRsZTogb3JnLnVkZGk0ajtidW5kbGUtdmVyc2lvbj0mcXVvdDtbMi4wLjQsMy4wLjApJnF1b3Q7LG9yZy5hcGFjaGUuYXhpcztidW5kbGUtdmVyc2lvbj0mcXVvdDtbMS4zLjAsMi4wLjApJnF1b3Q7LGphdmF4LndzZGw7YnVuZGxlLXZlcnNpb249JnF1b3Q7WzEuNC4wLDEuNS4wKSZxdW90OwotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtQnVkZHlQb2xpY3k6IHJlZ2lzdGVyZWQKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS53c2lsNGoKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS53c2lsLG9yZy5hcGFjaGUud3NpbC5jbGllbnQsb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbixvcmcuYXBhY2hlLndzaWwuZXh0ZW5zaW9uLnVkZGksb3JnLmFwYWNoZS53c2lsLmV4dGVuc2lvbi53c2RsLG9yZy5hcGFjaGUud3NpbC5pbXBsLG9yZy5hcGFjaGUud3NpbC5pbXBsLmV4dGVuc2lvbixvcmcuYXBhY2hlLndzaWwuaW1wbC5leHRlbnNpb24udWRkaSxvcmcuYXBhY2hlLndzaWwuaW1wbC5leHRlbnNpb24ud3NkbCxvcmcuYXBhY2hlLndzaWwudXRpbCxvcmcuYXBhY2hlLndzaWwueG1sCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdjb20uaWJtLmljdS5zb3VyY2UnIHZlcnNpb249JzMuNi4xLnYyMDA4MDMwNCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdjb20uaWJtLmljdS5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMy42LjEudjIwMDgwMzA0KScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nSUJNIENvcnBvcmF0aW9uJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nSW50ZXJuYXRpb25hbCBDb21wb25lbnRzIGZvciBVbmljb2RlIGZvciBKYXZhIChJQ1U0Sikgc291cmNlIHBsdWctaW4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdjb20uaWJtLmljdS5zb3VyY2UnIHZlcnNpb249JzMuNi4xLnYyMDA4MDMwNCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nY29tLmlibS5pY3Uuc291cmNlJyB2ZXJzaW9uPSczLjYuMS52MjAwODAzMDQnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2NvbS5pYm0uaWN1LnNvdXJjZScgdmVyc2lvbj0nMy42LjEudjIwMDgwMzA0Jy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVyc2lvbjogMy42LjEudjIwMDgwMzA0Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBjb20uaWJtLmljdS5zb3VyY2UKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IGNvbS5pYm0uaWN1O3ZlcnNpb249JnF1b3Q7My42LjEudjIwMDgwMzA0JnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGguc291cmNlJyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGguc291cmNlJyByYW5nZT0nWzAuMC4wLDEuMi4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBDb21tb25zIEpYUGF0aCBTb3VyY2UnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnNvdXJjZScgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5zb3VyY2UnIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGguc291cmNlJyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aDt2ZXJzaW9uPSZxdW90OzEuMi4wLnYyMDA4MDMwNjE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuYmF0aWsuZXh0ZW5zaW9uLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmJhdGlrLmV4dGVuc2lvbi5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIEV4dGVuc2lvbiBTb3VyY2UgQnVuZGxlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5leHRlbnNpb24uc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmV4dGVuc2lvbi5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYmF0aWsuZXh0ZW5zaW9uLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjYuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmF0aWsuZXh0ZW5zaW9uLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmJhdGlrLmV4dGVuc2lvbjt2ZXJzaW9uPSZxdW90OzEuNi4wLnYyMDA4MDMwNjE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuYmF0aWsuZG9tLnN2Zy5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5iYXRpay5kb20uc3ZnLnNvdXJjZScgcmFuZ2U9J1swLjAuMCwxLjYuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQmF0aWsgU1ZHIERPTSBTb3VyY2UgQnVuZGxlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5kb20uc3ZnLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5kb20uc3ZnLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5iYXRpay5kb20uc3ZnLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjYuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmF0aWsuZG9tLnN2Zy5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmFwYWNoZS5iYXRpay5kb20uc3ZnO3ZlcnNpb249JnF1b3Q7MS42LjAudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0namF2YXgubWFuYWdlbWVudC5yZW1vdGUnIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0namF2YXgubWFuYWdlbWVudC5yZW1vdGUnIHJhbmdlPSdbMC4wLjAsMS4wLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1WZW5kb3IuMCcgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtTmFtZS4wJyB2YWx1ZT0nSmF2YSBNYW5hZ2VtZW50IFJlbW90ZSBFeHRlbnNpb25zIEFQSScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJUJ1bmRsZS1OYW1lLjAnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclQnVuZGxlLVZlbmRvci4wJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4Lm1hbmFnZW1lbnQucmVtb3RlJyB2ZXJzaW9uPScxLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdqYXZheC5tYW5hZ2VtZW50LnJlbW90ZScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm1hbmFnZW1lbnQucmVtb3RlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm1hbmFnZW1lbnQucmVtb3RlLnJtaScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2phdmF4Lm1hbmFnZW1lbnQucmVtb3RlJyB2ZXJzaW9uPScxLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuMC4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZSxqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWkKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogamF2YXgubWFuYWdlbWVudC5yZW1vdGUKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuZWwnIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmVsJyByYW5nZT0nWzAuMC4wLDEuMC4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVOYW1lJyB2YWx1ZT0nQXBhY2hlIENvbW1vbnMgSlNQIDIuMCBFeHByZXNzaW9uIExhbmd1YWdlIEludGVycHJldGVyJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVQcm92aWRlcicgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclYnVuZGxlTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVidW5kbGVQcm92aWRlcicvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzYnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuZWwnIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5lbCcgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5lbCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuZWwucGFyc2VyJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzcnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQnIHJhbmdlPScyLjQuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuaHR0cCcgcmFuZ2U9JzIuNC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldC5qc3AnIHJhbmdlPScyLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuanNwLmVsJyByYW5nZT0nMi4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZXJ2bGV0LmpzcC5yZXNvdXJjZXMnIHJhbmdlPScyLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuanNwLnRhZ2V4dCcgcmFuZ2U9JzIuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldC5yZXNvdXJjZXMnIHJhbmdlPScyLjQuMCcvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5lbCcgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLEoyU0UtMS4zCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5jb21tb25zLmVsO3ZlcnNpb249JnF1b3Q7MS4wLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmVsLnBhcnNlcjt2ZXJzaW9uPSZxdW90OzEuMC4wJnF1b3Q7Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMuZWwKLUltcG9ydC1QYWNrYWdlOiBqYXZheC5zZXJ2bGV0O3ZlcnNpb249JnF1b3Q7Mi40JnF1b3Q7LGphdmF4LnNlcnZsZXQuaHR0cDt2ZXJzaW9uPSZxdW90OzIuNCZxdW90OyxqYXZheC5zZXJ2bGV0LmpzcDt2ZXJzaW9uPSZxdW90OzIuMCZxdW90OyxqYXZheC5zZXJ2bGV0LmpzcC5lbDt2ZXJzaW9uPSZxdW90OzIuMCZxdW90OyxqYXZheC5zZXJ2bGV0LmpzcC5yZXNvdXJjZXM7dmVyc2lvbj0mcXVvdDsyLjAmcXVvdDssamF2YXguc2VydmxldC5qc3AudGFnZXh0O3ZlcnNpb249JnF1b3Q7Mi4wJnF1b3Q7LGphdmF4LnNlcnZsZXQucmVzb3VyY2VzO3ZlcnNpb249JnF1b3Q7Mi40JnF1b3Q7Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmRlcmJ5JyB2ZXJzaW9uPScxMC4xLjIuMV92MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuZGVyYnknIHJhbmdlPSdbMC4wLjAsMTAuMS4yLjFfdjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1WZW5kb3IuMCcgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtTmFtZS4wJyB2YWx1ZT0nQXBhY2hlIERlcmJ5IFBsdWctaW4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVCdW5kbGUtTmFtZS4wJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJUJ1bmRsZS1WZW5kb3IuMCcvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzgyJz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieScgdmVyc2lvbj0nMTAuMS4yLjFfdjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieScgdmVyc2lvbj0nMTAuMS4yLjFfdjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuYXV0aGVudGljYXRpb24nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5jYXRhbG9nJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuY2F0YWxvZy50eXBlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmRhdGFiYXNlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuZGlhZycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmRyZGEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pYXBpLmRiJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaWFwaS5lcnJvcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuamRiYycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc2VydmljZXMuY2FjaGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pYXBpLnNlcnZpY2VzLmNsYXNzZmlsZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc2VydmljZXMuY29tcGlsZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pYXBpLnNlcnZpY2VzLmNvbnRleHQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pYXBpLnNlcnZpY2VzLmNyeXB0bycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc2VydmljZXMuZGFlbW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaWFwaS5zZXJ2aWNlcy5pMThuJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaWFwaS5zZXJ2aWNlcy5pbmZvJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaWFwaS5zZXJ2aWNlcy5pbycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc2VydmljZXMubG9hZGVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaWFwaS5zZXJ2aWNlcy5sb2NrcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc2VydmljZXMubW9uaXRvcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc2VydmljZXMucHJvcGVydHknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pYXBpLnNlcnZpY2VzLnN0cmVhbScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc2VydmljZXMudXVpZCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc3FsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaWFwaS5zcWwuY29tcGlsZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc3FsLmNvbm4nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pYXBpLnNxbC5kZXBlbmQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pYXBpLnNxbC5kaWN0aW9uYXJ5JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaWFwaS5zcWwuZXhlY3V0ZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc3RvcmUuYWNjZXNzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaWFwaS5zdG9yZS5hY2Nlc3MuY29uZ2xvbWVyYXRlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaWFwaS5zdG9yZS5hY2Nlc3MueGEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pYXBpLnN0b3JlLnJhdycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc3RvcmUucmF3LmRhdGEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pYXBpLnN0b3JlLnJhdy5sb2cnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pYXBpLnN0b3JlLnJhdy54YWN0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaWFwaS50b29scy5pMThuJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaWFwaS50eXBlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmlhcGkudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmltcGwuZGInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pbXBsLmRyZGEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pbXBsLmlvJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaW1wbC5qZGJjJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaW1wbC5qZGJjLmF1dGhlbnRpY2F0aW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaW1wbC5sb2FkJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaW1wbC5zZXJ2aWNlcy5ieXRlY29kZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc2VydmljZXMuY2FjaGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pbXBsLnNlcnZpY2VzLmRhZW1vbicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc2VydmljZXMuamNlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaW1wbC5zZXJ2aWNlcy5sb2NrcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc2VydmljZXMubW9uaXRvcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc2VydmljZXMucmVmbGVjdCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc2VydmljZXMuc3RyZWFtJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaW1wbC5zZXJ2aWNlcy51dWlkJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaW1wbC5zcWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pbXBsLnNxbC5jYXRhbG9nJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaW1wbC5zcWwuY29tcGlsZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc3FsLmNvbm4nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pbXBsLnNxbC5kZXBlbmQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pbXBsLnNxbC5leGVjdXRlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaW1wbC5zcWwuZXhlY3V0ZS5ydHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pbXBsLnN0b3JlLmFjY2VzcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc3RvcmUuYWNjZXNzLmJ0cmVlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaW1wbC5zdG9yZS5hY2Nlc3MuYnRyZWUuaW5kZXgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pbXBsLnN0b3JlLmFjY2Vzcy5jb25nbG9tZXJhdGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pbXBsLnN0b3JlLmFjY2Vzcy5oZWFwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaW1wbC5zdG9yZS5hY2Nlc3Muc29ydCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc3RvcmUucmF3JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuaW1wbC5zdG9yZS5yYXcuZGF0YScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc3RvcmUucmF3LmxvZycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc3RvcmUucmF3LnhhY3QnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pbXBsLnRvb2xzLnN5c2luZm8nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5pbycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LmpkYmMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS5vc2dpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkudG9vbHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5kZXJieS52dGknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMic+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldCcgcmFuZ2U9JzIuNC4wJyBvcHRpb25hbD0ndHJ1ZScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuaHR0cCcgcmFuZ2U9JzIuNC4wJyBvcHRpb25hbD0ndHJ1ZScvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuZGVyYnknIHZlcnNpb249JzEwLjEuMi4xX3YyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1WZXJzaW9uOiAxMC4xLjIuMV92MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5kZXJieS5hdXRoZW50aWNhdGlvbixvcmcuYXBhY2hlLmRlcmJ5LmNhdGFsb2csb3JnLmFwYWNoZS5kZXJieS5jYXRhbG9nLnR5cGVzLG9yZy5hcGFjaGUuZGVyYnkuZGF0YWJhc2Usb3JnLmFwYWNoZS5kZXJieS5kaWFnLG9yZy5hcGFjaGUuZGVyYnkuZHJkYSxvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuZGIsb3JnLmFwYWNoZS5kZXJieS5pYXBpLmVycm9yLG9yZy5hcGFjaGUuZGVyYnkuaWFwaS5qZGJjLG9yZy5hcGFjaGUuZGVyYnkuaWFwaS5zZXJ2aWNlcy5jYWNoZSxvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc2VydmljZXMuY2xhc3NmaWxlLG9yZy5hcGFjaGUuZGVyYnkuaWFwaS5zZXJ2aWNlcy5jb21waWxlcixvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc2VydmljZXMuY29udGV4dCxvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc2VydmljZXMuY3J5cHRvLG9yZy5hcGFjaGUuZGVyYnkuaWFwaS5zZXJ2aWNlcy5kYWVtb24sb3JnLmFwYWNoZS5kZXJieS5pYXBpLnNlcnZpY2VzLmkxOG4sb3JnLmFwYWNoZS5kZXJieS5pYXBpLnNlcnZpY2VzLmluZm8sb3JnLmFwYWNoZS5kZXJieS5pYXBpLnNlcnZpY2VzLmlvLG9yZy5hcGFjaGUuZGVyYnkuaWFwaS5zZXJ2aWNlcy5sb2FkZXIsb3JnLmFwYWNoZS5kZXJieS5pYXBpLnNlcnZpY2VzLmxvY2tzLG9yZy5hcGFjaGUuZGVyYnkuaWFwaS5zZXJ2aWNlcy5tb25pdG9yLG9yZy5hcGFjaGUuZGVyYnkuaWFwaS5zZXJ2aWNlcy5wcm9wZXJ0eSxvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc2VydmljZXMuc3RyZWFtLG9yZy5hcGFjaGUuZGVyYnkuaWFwaS5zZXJ2aWNlcy51dWlkLG9yZy5hcGFjaGUuZGVyYnkuaWFwaS5zcWwsb3JnLmFwYWNoZS5kZXJieS5pYXBpLnNxbC5jb21waWxlLG9yZy5hcGFjaGUuZGVyYnkuaWFwaS5zcWwuY29ubixvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc3FsLmRlcGVuZCxvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc3FsLmRpY3Rpb25hcnksb3JnLmFwYWNoZS5kZXJieS5pYXBpLnNxbC5leGVjdXRlLG9yZy5hcGFjaGUuZGVyYnkuaWFwaS5zdG9yZS5hY2Nlc3Msb3JnLmFwYWNoZS5kZXJieS5pYXBpLnN0b3JlLmFjY2Vzcy5jb25nbG9tZXJhdGUsb3JnLmFwYWNoZS5kZXJieS5pYXBpLnN0b3JlLmFjY2Vzcy54YSxvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc3RvcmUucmF3LG9yZy5hcGFjaGUuZGVyYnkuaWFwaS5zdG9yZS5yYXcuZGF0YSxvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc3RvcmUucmF3LmxvZyxvcmcuYXBhY2hlLmRlcmJ5LmlhcGkuc3RvcmUucmF3LnhhY3Qsb3JnLmFwYWNoZS5kZXJieS5pYXBpLnRvb2xzLmkxOG4sb3JnLmFwYWNoZS5kZXJieS5pYXBpLnR5cGVzLG9yZy5hcGFjaGUuZGVyYnkuaWFwaS51dGlsLG9yZy5hcGFjaGUuZGVyYnkuaW1wbC5kYixvcmcuYXBhY2hlLmRlcmJ5LmltcGwuZHJkYSxvcmcuYXBhY2hlLmRlcmJ5LmltcGwuaW8sb3JnLmFwYWNoZS5kZXJieS5pbXBsLmpkYmMsb3JnLmFwYWNoZS5kZXJieS5pbXBsLmpkYmMuYXV0aGVudGljYXRpb24sb3JnLmFwYWNoZS5kZXJieS5pbXBsLmxvYWQsb3JnLmFwYWNoZS5kZXJieS5pbXBsLnNlcnZpY2VzLmJ5dGVjb2RlLG9yZy5hcGFjaGUuZGVyYnkuaW1wbC5zZXJ2aWNlcy5jYWNoZSxvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc2VydmljZXMuZGFlbW9uLG9yZy5hcGFjaGUuZGVyYnkuaW1wbC5zZXJ2aWNlcy5qY2Usb3JnLmFwYWNoZS5kZXJieS5pbXBsLnNlcnZpY2VzLmxvY2tzLG9yZy5hcGFjaGUuZGVyYnkuaW1wbC5zZXJ2aWNlcy5tb25pdG9yLG9yZy5hcGFjaGUuZGVyYnkuaW1wbC5zZXJ2aWNlcy5yZWZsZWN0LG9yZy5hcGFjaGUuZGVyYnkuaW1wbC5zZXJ2aWNlcy5zdHJlYW0sb3JnLmFwYWNoZS5kZXJieS5pbXBsLnNlcnZpY2VzLnV1aWQsb3JnLmFwYWNoZS5kZXJieS5pbXBsLnNxbCxvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc3FsLmNhdGFsb2csb3JnLmFwYWNoZS5kZXJieS5pbXBsLnNxbC5jb21waWxlLG9yZy5hcGFjaGUuZGVyYnkuaW1wbC5zcWwuY29ubixvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc3FsLmRlcGVuZCxvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc3FsLmV4ZWN1dGUsb3JnLmFwYWNoZS5kZXJieS5pbXBsLnNxbC5leGVjdXRlLnJ0cyxvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc3RvcmUuYWNjZXNzLG9yZy5hcGFjaGUuZGVyYnkuaW1wbC5zdG9yZS5hY2Nlc3MuYnRyZWUsb3JnLmFwYWNoZS5kZXJieS5pbXBsLnN0b3JlLmFjY2Vzcy5idHJlZS5pbmRleCxvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc3RvcmUuYWNjZXNzLmNvbmdsb21lcmF0ZSxvcmcuYXBhY2hlLmRlcmJ5LmltcGwuc3RvcmUuYWNjZXNzLmhlYXAsb3JnLmFwYWNoZS5kZXJieS5pbXBsLnN0b3JlLmFjY2Vzcy5zb3J0LG9yZy5hcGFjaGUuZGVyYnkuaW1wbC5zdG9yZS5yYXcsb3JnLmFwYWNoZS5kZXJieS5pbXBsLnN0b3JlLnJhdy5kYXRhLG9yZy5hcGFjaGUuZGVyYnkuaW1wbC5zdG9yZS5yYXcubG9nLG9yZy5hcGFjaGUuZGVyYnkuaW1wbC5zdG9yZS5yYXcueGFjdCxvcmcuYXBhY2hlLmRlcmJ5LmltcGwudG9vbHMuc3lzaW5mbyxvcmcuYXBhY2hlLmRlcmJ5LmlvLG9yZy5hcGFjaGUuZGVyYnkuamRiYyxvcmcuYXBhY2hlLmRlcmJ5Lm9zZ2ksb3JnLmFwYWNoZS5kZXJieS50b29scyxvcmcuYXBhY2hlLmRlcmJ5LnZ0aQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5kZXJieQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUltcG9ydC1QYWNrYWdlOiBqYXZheC5zZXJ2bGV0O3ZlcnNpb249JnF1b3Q7Mi40LjAmcXVvdDs7cmVzb2x1dGlvbjo9b3B0aW9uYWwsamF2YXguc2VydmxldC5odHRwO3ZlcnNpb249JnF1b3Q7Mi40LjAmcXVvdDs7cmVzb2x1dGlvbjo9b3B0aW9uYWwKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUud3MuamF4bWUnIHZlcnNpb249JzAuNS4xLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS53cy5qYXhtZScgcmFuZ2U9J1swLjAuMCwwLjUuMS52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzInPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLU5hbWUnIHZhbHVlPSdBcGFjaGUgSkFYLU1FIFBsdWctaW4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVCdW5kbGUtTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzknPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLndzLmpheG1lJyB2ZXJzaW9uPScwLjUuMS52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLndzLmpheG1lJyB2ZXJzaW9uPScwLjUuMS52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5iaW5kJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5iaW5kLmhlbHBlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLmJpbmQudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwubmFtZXNwYWNlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS53cy5qYXhtZScgdmVyc2lvbj0nMC41LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAwLjUuMS52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogamF2YXgueG1sLGphdmF4LnhtbC5iaW5kLGphdmF4LnhtbC5iaW5kLmhlbHBlcnMsamF2YXgueG1sLmJpbmQudXRpbCxqYXZheC54bWwubmFtZXNwYWNlCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUud3MuamF4bWUKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLEoyU0UtMS4zCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgnIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aCcgcmFuZ2U9J1swLjAuMCwxLjIuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQ29tbW9ucyBKWFBhdGgnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzIwJz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aCcgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aCcgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5mdW5jdGlvbnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLmF4ZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5jb21waWxlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLm1vZGVsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkubW9kZWwuYmVhbnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5tb2RlbC5jb250YWluZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5tb2RlbC5kb20nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5tb2RlbC5keW5hYmVhbnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5tb2RlbC5keW5hbWljJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkubW9kZWwuamRvbScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLnBhcnNlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnNlcnZsZXQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgueG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aCcgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGguZnVuY3Rpb25zLG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmksb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5heGVzLG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkuY29tcGlsZXIsb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5tb2RlbCxvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLm1vZGVsLmJlYW5zLG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkubW9kZWwuY29udGFpbmVyLG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkubW9kZWwuZG9tLG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkubW9kZWwuZHluYWJlYW5zLG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgucmkubW9kZWwuZHluYW1pYyxvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnJpLm1vZGVsLmpkb20sb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5yaS5wYXJzZXIsb3JnLmFwYWNoZS5jb21tb25zLmp4cGF0aC5zZXJ2bGV0LG9yZy5hcGFjaGUuY29tbW9ucy5qeHBhdGgudXRpbCxvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoLnhtbAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMuanhwYXRoCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuYmF0aWsucGFyc2VyLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmJhdGlrLnBhcnNlci5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIFBhcnNlciBTb3VyY2UgQnVuZGxlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5wYXJzZXIuc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnBhcnNlci5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYmF0aWsucGFyc2VyLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjYuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmF0aWsucGFyc2VyLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmJhdGlrLnBhcnNlcjt2ZXJzaW9uPSZxdW90OzEuNi4wLnYyMDA4MDMwNjE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2NvbS5qY3JhZnQuanNjaCcgdmVyc2lvbj0nMC4xLjMxJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2NvbS5qY3JhZnQuanNjaCcgcmFuZ2U9J1swLjAuMCwwLjEuMzEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVOYW1lJyB2YWx1ZT0nSlNjaCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQudmVuZGVyTmFtZScgdmFsdWU9J0pDcmFmdCwgSW5jLicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJWJ1bmRsZU5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPScldmVuZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzcnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdjb20uamNyYWZ0LmpzY2gnIHZlcnNpb249JzAuMS4zMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nY29tLmpjcmFmdC5qc2NoJyB2ZXJzaW9uPScwLjEuMzEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uamNyYWZ0LmpzY2gnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmpjcmFmdC5qc2NoLmpjZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uamNyYWZ0LmpzY2guamNyYWZ0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nY29tLmpjcmFmdC5qc2NoJyB2ZXJzaW9uPScwLjEuMzEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtVmVuZG9yOiAldmVuZGVyTmFtZQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjb20uamNyYWZ0LmpzY2gKLUJ1bmRsZS1WZXJzaW9uOiAwLjEuMzEKLUNyZWF0ZWQtQnk6IDEuNC4wIChTdW4gTWljcm9zeXN0ZW1zIEluYy4pCi1FeHBvcnQtUGFja2FnZTogY29tLmpjcmFmdC5qc2NoLCBjb20uamNyYWZ0LmpzY2guamNlO3gtaW50ZXJuYWw6PXRydWUsIGNvbS5qY3JhZnQuanNjaC5qY3JhZnQ7eC1pbnRlcm5hbDo9dHJ1ZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmVsLnNvdXJjZScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuZWwuc291cmNlJyByYW5nZT0nWzAuMC4wLDEuMC4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVOYW1lJyB2YWx1ZT0nQXBhY2hlIENvbW1vbnMgSlNQIDIuMCBFeHByZXNzaW9uIExhbmd1YWdlIEludGVycHJldGVyIFNvdXJjZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlUHJvdmlkZXInIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJWJ1bmRsZU5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclYnVuZGxlUHJvdmlkZXInLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmVsLnNvdXJjZScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmVsLnNvdXJjZScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmVsLnNvdXJjZScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuY29tbW9ucy5lbC5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmFwYWNoZS5jb21tb25zLmVsO3ZlcnNpb249JnF1b3Q7MS4wLjAudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdqYXZheC5zZXJ2bGV0LmpzcC5zb3VyY2UnIHZlcnNpb249JzIuMC4wLnYyMDA4MDMwNjE5MTAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0namF2YXguc2VydmxldC5qc3Auc291cmNlJyByYW5nZT0nWzAuMC4wLDIuMC4wLnYyMDA4MDMwNjE5MTApJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVOYW1lJyB2YWx1ZT0nSmF2YSBTZXJ2ZXIgUGFnZXMgQVBJIFNvdXJjZSBCdW5kbGUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZVByb3ZpZGVyJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVidW5kbGVOYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJWJ1bmRsZVByb3ZpZGVyJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4LnNlcnZsZXQuanNwLnNvdXJjZScgdmVyc2lvbj0nMi4wLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YXguc2VydmxldC5qc3Auc291cmNlJyB2ZXJzaW9uPScyLjAuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdqYXZheC5zZXJ2bGV0LmpzcC5zb3VyY2UnIHZlcnNpb249JzIuMC4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMi4wLjAudjIwMDgwMzA2MTkxMAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBqYXZheC5zZXJ2bGV0LmpzcC5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogamF2YXguc2VydmxldC5qc3A7dmVyc2lvbj0mcXVvdDsyLjAuMC52MjAwODAzMDYxOTEwJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlYnVuZGxlUHJvdmlkZXIKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2NvbmZpZy5hLmpyZScgdmVyc2lvbj0nMS42LjAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPGhvc3RSZXF1aXJlbWVudHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2EuanJlJyByYW5nZT0nMS42LjAnLz4KLSAgICAgIDwvaG9zdFJlcXVpcmVtZW50cz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzEnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmZyYWdtZW50JyB2YWx1ZT0ndHJ1ZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzEnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdjb25maWcuYS5qcmUnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzEnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdhLmpyZScgcmFuZ2U9JzEuNi4wJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmF0aXZlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J2luc3RhbGwnPgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nY29tLmlibS5pY3UuYmFzZScgdmVyc2lvbj0nMy42LjAudjIwMDgwMzA0JyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2NvbS5pYm0uaWN1LmJhc2UnIHJhbmdlPSdbMC4wLjAsMy42LjAudjIwMDgwMzA0KScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nSUJNIENvcnBvcmF0aW9uJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nSW50ZXJuYXRpb25hbCBDb21wb25lbnRzIGZvciBVbmljb2RlIGZvciBKYXZhIChJQ1U0SikgUmVwbGFjZW1lbnQgcGx1Zy1pbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2NvbS5pYm0uaWN1LmJhc2UnIHZlcnNpb249JzMuNi4wLnYyMDA4MDMwNCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nY29tLmlibS5pY3UuYmFzZScgdmVyc2lvbj0nMy42LjAudjIwMDgwMzA0Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS5pY3UudGV4dCcgdmVyc2lvbj0nMy42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS51dGlsJyB2ZXJzaW9uPSczLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nY29tLmlibS5pY3UuYmFzZScgdmVyc2lvbj0nMy42LjAudjIwMDgwMzA0Jy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLUNvcHlyaWdodDogTGljZW5zZWQgTWF0ZXJpYWxzIC0gUHJvcGVydHkgb2YgSUJNIChDKSBDb3B5cmlnaHQgSUJNIENvcnAuIDIwMDAsIDIwMDYuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIElCTSBpcyBhIHJlZ2lzdGVyZWQgdHJhZGVtYXJrIG9mIElCTSBDb3JwLgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjAvRm91bmRhdGlvbi0xLjAsSjJTRS0xLjMKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGNvbS5pYm0uaWN1LmJhc2UKLUJ1bmRsZS1WZXJzaW9uOiAzLjYuMC52MjAwODAzMDQKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FeHBvcnQtUGFja2FnZTogY29tLmlibS5pY3UudGV4dDt2ZXJzaW9uPSZxdW90OzMuNi4wJnF1b3Q7LGNvbS5pYm0uaWN1LnV0aWw7dmVyc2lvbj0mcXVvdDszLjYuMCZxdW90OwotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nY29tLmlibS5pY3UnIHZlcnNpb249JzMuNi4wLnYyMDA4MDMwNCc+Ci0gICAgICA8dXBkYXRlIGlkPSdjb20uaWJtLmljdScgcmFuZ2U9J1swLjAuMCwzLjYuMC52MjAwODAzMDQpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdJQk0gQ29ycG9yYXRpb24nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdJbnRlcm5hdGlvbmFsIENvbXBvbmVudHMgZm9yIFVuaWNvZGUgZm9yIEphdmEgKElDVTRKKScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTUnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdjb20uaWJtLmljdScgdmVyc2lvbj0nMy42LjAudjIwMDgwMzA0Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdjb20uaWJtLmljdScgdmVyc2lvbj0nMy42LjAudjIwMDgwMzA0Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS5pY3UubGFuZycgdmVyc2lvbj0nMy42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS5tYXRoJyB2ZXJzaW9uPSczLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LnRleHQnIHZlcnNpb249JzMuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS5pY3UudXRpbCcgdmVyc2lvbj0nMy42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS5pbXBsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LmltcGwuZGF0YScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS5pbXBsLmRhdGEuaWN1ZHQzNmInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS5pY3UuaW1wbC5kYXRhLmljdWR0MzZiLmJya2l0cicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS5pbXBsLmRhdGEuaWN1ZHQzNmIuY29sbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS5pbXBsLmRhdGEuaWN1ZHQzNmIucmJuZicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS5pbXBsLmRhdGEuaWN1ZHQzNmIudHJhbnNsaXQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdjb20uaWJtLmljdScgdmVyc2lvbj0nMy42LjAudjIwMDgwMzA0Jy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjAvRm91bmRhdGlvbi0xLjAsSjJTRS0xLjMKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtQ2xhc3NQYXRoOiBpY3UtanNlNC5qYXIsaWN1LWRhdGEuamFyLC4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGNvbS5pYm0uaWN1OyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1CdW5kbGUtVmVyc2lvbjogMy42LjAudjIwMDgwMzA0Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1Db3B5cmlnaHQ6IExpY2Vuc2VkIE1hdGVyaWFscyAtIFByb3BlcnR5IG9mIElCTSAoQykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDAwLCAyMDA2LiBBbGwgUmlnaHRzIFJlc2VydmVkLiBJQk0gaXMgYSByZWdpc3RlcmVkIHRyYWRlbWFyayBvZiBJQk0gQ29ycC4KLUVjbGlwc2UtRXh0ZW5zaWJsZUFQSTogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1Lmxhbmc7dmVyc2lvbj0mcXVvdDszLjYuMCZxdW90Oyxjb20uaWJtLmljdS5tYXRoO3ZlcnNpb249JnF1b3Q7My42LjAmcXVvdDssY29tLmlibS5pY3UudGV4dDt2ZXJzaW9uPSZxdW90OzMuNi4wJnF1b3Q7LGNvbS5pYm0uaWN1LnV0aWw7dmVyc2lvbj0mcXVvdDszLjYuMCZxdW90Oyxjb20uaWJtLmljdS5pbXBsO3gtaW50ZXJuYWw6PXRydWUsY29tLmlibS5pY3UuaW1wbC5kYXRhO3gtaW50ZXJuYWw6PXRydWUsY29tLmlibS5pY3UuaW1wbC5kYXRhLmljdWR0MzZiO3gtaW50ZXJuYWw6PXRydWUsY29tLmlibS5pY3UuaW1wbC5kYXRhLmljdWR0MzZiLmJya2l0cjt4LWludGVybmFsOj10cnVlLGNvbS5pYm0uaWN1LmltcGwuZGF0YS5pY3VkdDM2Yi5jb2xsO3gtaW50ZXJuYWw6PXRydWUsY29tLmlibS5pY3UuaW1wbC5kYXRhLmljdWR0MzZiLnJibmY7eC1pbnRlcm5hbDo9dHJ1ZSxjb20uaWJtLmljdS5pbXBsLmRhdGEuaWN1ZHQzNmIudHJhbnNsaXQ7eC1pbnRlcm5hbDo9dHJ1ZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5iYXRpay5leHRlbnNpb24nIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5iYXRpay5leHRlbnNpb24nIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIEV4dGVuc2lvbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNyc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZXh0ZW5zaW9uJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmV4dGVuc2lvbicgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZXh0ZW5zaW9uJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZXh0ZW5zaW9uLnN2ZycgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdNRVRBLUlORi5zZXJ2aWNlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPSc4Jz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuYnJpZGdlJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuY3NzJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZG9tJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZG9tLnN2ZycgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5wYXJzZXInIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay51dGlsJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy53M2MuZG9tLnN2ZycgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5iYXRpay5leHRlbnNpb24nIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLmJhdGlrLmJyaWRnZTt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5jc3M7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZG9tO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmRvbS5zdmc7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dDt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5wYXJzZXI7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsudXRpbDt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLnczYy5kb20uc3ZnO3ZlcnNpb249JnF1b3Q7WzEuMS4wLDEuMy4wKSZxdW90OwotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMS42LjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuYmF0aWsuZXh0ZW5zaW9uO3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5leHRlbnNpb24uc3ZnO3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDssTUVUQS1JTkYuc2VydmljZXMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmF0aWsuZXh0ZW5zaW9uCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0namF2YXguc2VydmxldC5zb3VyY2UnIHZlcnNpb249JzIuNS4wLnYyMDA4MDMwNjE5MjAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0namF2YXguc2VydmxldC5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMi41LjAudjIwMDgwMzA2MTkyMCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZU5hbWUnIHZhbHVlPSdTZXJ2bGV0IEFQSSBTb3VyY2UgQnVuZGxlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVQcm92aWRlcicgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclYnVuZGxlTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVidW5kbGVQcm92aWRlcicvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdqYXZheC5zZXJ2bGV0LnNvdXJjZScgdmVyc2lvbj0nMi41LjAudjIwMDgwMzA2MTkyMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YXguc2VydmxldC5zb3VyY2UnIHZlcnNpb249JzIuNS4wLnYyMDA4MDMwNjE5MjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2phdmF4LnNlcnZsZXQuc291cmNlJyB2ZXJzaW9uPScyLjUuMC52MjAwODAzMDYxOTIwJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDIuNS4wLnYyMDA4MDMwNjE5MjAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogamF2YXguc2VydmxldC5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogamF2YXguc2VydmxldDt2ZXJzaW9uPSZxdW90OzIuNS4wLnYyMDA4MDMwNjE5MjAmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVidW5kbGVQcm92aWRlcgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nY29tLmlibS5pY3UnIHZlcnNpb249JzMuNC41Jz4KLSAgICAgIDx1cGRhdGUgaWQ9J2NvbS5pYm0uaWN1JyByYW5nZT0nWzAuMC4wLDMuNC41KScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nSUJNIENvcnBvcmF0aW9uJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nSW50ZXJuYXRpb25hbCBDb21wb25lbnRzIGZvciBVbmljb2RlIGZvciBKYXZhIChJQ1U0SiknLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzgnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdjb20uaWJtLmljdScgdmVyc2lvbj0nMy40LjUnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2NvbS5pYm0uaWN1JyB2ZXJzaW9uPSczLjQuNScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LmxhbmcnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS5pY3UubWF0aCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLmljdS50ZXh0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0uaWN1LnV0aWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdjb20uaWJtLmljdScgdmVyc2lvbj0nMy40LjUnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtQ29weXJpZ2h0OiBMaWNlbnNlZCBNYXRlcmlhbHMgLSBQcm9wZXJ0eSBvZiBJQk0gKEMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwMCwgMjAwNi4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gSUJNIGlzIGEgcmVnaXN0ZXJlZCB0cmFkZW1hcmsgb2YgSUJNIENvcnAuCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCxKMlNFLTEuMwotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmlibS5pY3U7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDMuNC41Ci1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotRXhwb3J0LVBhY2thZ2U6IGNvbS5pYm0uaWN1LmxhbmcsY29tLmlibS5pY3UubWF0aCxjb20uaWJtLmljdS50ZXh0LGNvbS5pYm0uaWN1LnV0aWwKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5tb3J0YmF5LmpldHR5LnV0aWwuc291cmNlJyB2ZXJzaW9uPSc2LjEuNy52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5tb3J0YmF5LmpldHR5LnV0aWwuc291cmNlJyByYW5nZT0nWzAuMC4wLDYuMS43LnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVOYW1lJyB2YWx1ZT0nSmV0dHkgVXRpbCBTb3VyY2UnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZVByb3ZpZGVyJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVidW5kbGVOYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJWJ1bmRsZVByb3ZpZGVyJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5tb3J0YmF5LmpldHR5LnV0aWwuc291cmNlJyB2ZXJzaW9uPSc2LjEuNy52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcubW9ydGJheS5qZXR0eS51dGlsLnNvdXJjZScgdmVyc2lvbj0nNi4xLjcudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLm1vcnRiYXkuamV0dHkudXRpbC5zb3VyY2UnIHZlcnNpb249JzYuMS43LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogNi4xLjcudjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcubW9ydGJheS5qZXR0eS51dGlsLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVidW5kbGVOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcubW9ydGJheS5qZXR0eS51dGlsO3ZlcnNpb249JnF1b3Q7Ni4xLjcudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmJhdGlrLmRvbScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmJhdGlrLmRvbScgcmFuZ2U9J1swLjAuMCwxLjYuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQmF0aWsgRE9NJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc4Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5kb20nIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZG9tJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5kb20nIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5kb20uZXZlbnRzJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZG9tLnRyYXZlcnNhbCcgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmRvbS51dGlsJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5iYXRpay5kb20nIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQsSjJTRS0xLjMKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1JbXBvcnQtcGFja2FnZTogb3JnLnczYy5kb20sb3JnLmFwYWNoZS54ZXJjZXMucGFyc2VycztyZXNvbHV0aW9uOj1vcHRpb25hbAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmJhdGlrLmRvbQotQnVuZGxlLVZlcnNpb246IDEuNi4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmJhdGlrLmRvbTt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZG9tLmV2ZW50czt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZG9tLnRyYXZlcnNhbDt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZG9tLnV0aWw7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OwotUmVxdWlyZS1idW5kbGU6IG9yZy5hcGFjaGUuYmF0aWsuY3NzO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnV0aWw7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsueG1sO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcudzNjLmNzcy5zYWM7dmVyc2lvbj0mcXVvdDtbMS4zLjAsMS40LjApJnF1b3Q7Ci0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcudzNjLmRvbS5zbWlsLnNvdXJjZScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA4MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcudzNjLmRvbS5zbWlsLnNvdXJjZScgcmFuZ2U9J1swLjAuMCwxLjAuMC52MjAwODAzMDgxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdXM0MgU01JTCBET00gU291cmNlIEJ1bmRsZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy53M2MuZG9tLnNtaWwuc291cmNlJyB2ZXJzaW9uPScxLjAuMC52MjAwODAzMDgxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcudzNjLmRvbS5zbWlsLnNvdXJjZScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA4MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLnczYy5kb20uc21pbC5zb3VyY2UnIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwODE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAudjIwMDgwMzA4MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcudzNjLmRvbS5zbWlsLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcudzNjLmRvbS5zbWlsO3ZlcnNpb249JnF1b3Q7MS4wLjAudjIwMDgwMzA4MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nY29tLmlibS5pY3Uuc291cmNlJyB2ZXJzaW9uPSczLjguMS52MjAwODAzMDQnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nY29tLmlibS5pY3Uuc291cmNlJyByYW5nZT0nWzAuMC4wLDMuOC4xLnYyMDA4MDMwNCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0lCTSBDb3Jwb3JhdGlvbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0ludGVybmF0aW9uYWwgQ29tcG9uZW50cyBmb3IgVW5pY29kZSBmb3IgSmF2YSAoSUNVNEopIHNvdXJjZSBwbHVnLWluJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nY29tLmlibS5pY3Uuc291cmNlJyB2ZXJzaW9uPSczLjguMS52MjAwODAzMDQnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2NvbS5pYm0uaWN1LnNvdXJjZScgdmVyc2lvbj0nMy44LjEudjIwMDgwMzA0Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdjb20uaWJtLmljdS5zb3VyY2UnIHZlcnNpb249JzMuOC4xLnYyMDA4MDMwNCcvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDMuOC4xLnYyMDA4MDMwNAotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmlibS5pY3Uuc291cmNlCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBjb20uaWJtLmljdTt2ZXJzaW9uPSZxdW90OzMuOC4xLnYyMDA4MDMwNCZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuamRvbScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA3MDUwNScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuamRvbScgcmFuZ2U9J1swLjAuMCwxLjAuMC52MjAwODAzMDcwNTA1KScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLVZlbmRvci4wJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1OYW1lLjAnIHZhbHVlPSdKRE9NJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclQnVuZGxlLU5hbWUuMCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVCdW5kbGUtVmVuZG9yLjAnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScxMSc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5qZG9tJyB2ZXJzaW9uPScxLjAuMC52MjAwODAzMDcwNTA1Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuamRvbScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA3MDUwNScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5qZG9tJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5qZG9tLmFkYXB0ZXJzJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5qZG9tLmZpbHRlcicgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuamRvbS5pbnB1dCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuamRvbS5vdXRwdXQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmpkb20udHJhbnNmb3JtJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5qZG9tLnhwYXRoJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzEnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMnIHJhbmdlPScwLjAuMCcgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuamRvbScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA3MDUwNScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotUmVxdWlyZS1CdW5kbGU6IG9yZy5hcGFjaGUueGVyY2VzO3Jlc29sdXRpb246PW9wdGlvbmFsCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC52MjAwODAzMDcwNTA1Ci1FeHBvcnQtUGFja2FnZTogb3JnLmpkb207dmVyc2lvbj0mcXVvdDsxLjAuMCZxdW90OyxvcmcuamRvbS5hZGFwdGVyczt2ZXJzaW9uPSZxdW90OzEuMC4wJnF1b3Q7LG9yZy5qZG9tLmZpbHRlcjt2ZXJzaW9uPSZxdW90OzEuMC4wJnF1b3Q7LG9yZy5qZG9tLmlucHV0O3ZlcnNpb249JnF1b3Q7MS4wLjAmcXVvdDssb3JnLmpkb20ub3V0cHV0O3ZlcnNpb249JnF1b3Q7MS4wLjAmcXVvdDssb3JnLmpkb20udHJhbnNmb3JtO3ZlcnNpb249JnF1b3Q7MS4wLjAmcXVvdDssb3JnLmpkb20ueHBhdGg7dmVyc2lvbj0mcXVvdDsxLjAuMCZxdW90OwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmpkb20KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdjaC5ldGh6Lmlrcy5zbHAnIHZlcnNpb249JzEuMC4wLlJDMl92MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2NoLmV0aHouaWtzLnNscCcgcmFuZ2U9J1swLjAuMCwxLjAuMC5SQzJfdjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nalNMUCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNyc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2NoLmV0aHouaWtzLnNscCcgdmVyc2lvbj0nMS4wLjAuUkMyX3YyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2NoLmV0aHouaWtzLnNscCcgdmVyc2lvbj0nMS4wLjAuUkMyX3YyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjaC5ldGh6Lmlrcy5zbHAnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY2guZXRoei5pa3Muc2xwLmltcGwnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY2guZXRoei5pa3Muc2xwLmltcGwuZmlsdGVyJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nY2guZXRoei5pa3Muc2xwJyB2ZXJzaW9uPScxLjAuMC5SQzJfdjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLlJDMl92MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogY2guZXRoei5pa3Muc2xwO3ZlcnNpb249JnF1b3Q7MS4wLjAmcXVvdDssY2guZXRoei5pa3Muc2xwLmltcGw7dmVyc2lvbj0mcXVvdDsxLjAuMCZxdW90OyxjaC5ldGh6Lmlrcy5zbHAuaW1wbC5maWx0ZXI7dmVyc2lvbj0mcXVvdDsxLjAuMCZxdW90OwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjaC5ldGh6Lmlrcy5zbHAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0JyB2ZXJzaW9uPScxLjYuMi52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQnIHJhbmdlPSdbMC4wLjAsMS42LjIudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1WZW5kb3IuMCcgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtTmFtZS4wJyB2YWx1ZT0nTW96aWxsYSBSaGlubycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJUJ1bmRsZS1OYW1lLjAnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclQnVuZGxlLVZlbmRvci4wJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMjEnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0JyB2ZXJzaW9uPScxLjYuMi52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0JyB2ZXJzaW9uPScxLjYuMi52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vemlsbGEuY2xhc3NmaWxlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vemlsbGEuamF2YXNjcmlwdC5jb250aW51YXRpb25zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQuZGVidWcnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vemlsbGEuamF2YXNjcmlwdC5qZGsxMScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0LmpkazEzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQub3B0aW1pemVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQucmVnZXhwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQucmVzb3VyY2VzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQuc2VyaWFsaXplJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQudG9vbHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vemlsbGEuamF2YXNjcmlwdC50b29scy5pZHN3aXRjaCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLmpzYycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLnJlc291cmNlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLnNoZWxsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQueG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQueG1saW1wbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPSc4Jz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zd2luZy50YWJsZScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcuZXZlbnQnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nLmJvcmRlcicgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLm5hbWVzcGFjZScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcudHJlZScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcudGV4dCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nLmZpbGVjaG9vc2VyJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0JyB2ZXJzaW9uPScxLjYuMi52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1NYWluLUNsYXNzOiBvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLnNoZWxsLk1haW4KLUltcG9ydC1QYWNrYWdlOiBqYXZheC5zd2luZy50YWJsZSxqYXZheC5zd2luZy5ldmVudCxqYXZheC5zd2luZy5ib3JkZXIsamF2YXgueG1sLm5hbWVzcGFjZSxqYXZheC5zd2luZy50cmVlLGphdmF4LnN3aW5nLnRleHQsamF2YXguc3dpbmcsamF2YXguc3dpbmcuZmlsZWNob29zZXIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5tb3ppbGxhLmphdmFzY3JpcHQKLUJ1bmRsZS1WZXJzaW9uOiAxLjYuMi52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogb3JnLm1vemlsbGEuY2xhc3NmaWxlLG9yZy5tb3ppbGxhLmphdmFzY3JpcHQsb3JnLm1vemlsbGEuamF2YXNjcmlwdC5jb250aW51YXRpb25zLG9yZy5tb3ppbGxhLmphdmFzY3JpcHQuZGVidWcsb3JnLm1vemlsbGEuamF2YXNjcmlwdC5qZGsxMSxvcmcubW96aWxsYS5qYXZhc2NyaXB0LmpkazEzLG9yZy5tb3ppbGxhLmphdmFzY3JpcHQub3B0aW1pemVyLG9yZy5tb3ppbGxhLmphdmFzY3JpcHQucmVnZXhwLG9yZy5tb3ppbGxhLmphdmFzY3JpcHQucmVzb3VyY2VzLG9yZy5tb3ppbGxhLmphdmFzY3JpcHQuc2VyaWFsaXplLG9yZy5tb3ppbGxhLmphdmFzY3JpcHQudG9vbHMsb3JnLm1vemlsbGEuamF2YXNjcmlwdC50b29scy5pZHN3aXRjaCxvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLmpzYyxvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLnJlc291cmNlcyxvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLnNoZWxsLG9yZy5tb3ppbGxhLmphdmFzY3JpcHQueG1sLG9yZy5tb3ppbGxhLmphdmFzY3JpcHQueG1saW1wbAotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNvdXJjZScgdmVyc2lvbj0nMy4yLjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuc291cmNlJyByYW5nZT0nWzAuMC4wLDMuMi4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBDb21tb25zIENvbGxlY3Rpb25zJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNvdXJjZScgdmVyc2lvbj0nMy4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNvdXJjZScgdmVyc2lvbj0nMy4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLnNvdXJjZScgdmVyc2lvbj0nMy4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAzLjIuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zO3ZlcnNpb249JnF1b3Q7My4yLjAudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0namF2YXguc2VydmxldC5zb3VyY2UnIHZlcnNpb249JzIuNC4wLnYyMDA4MDMwNjE5MTAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0namF2YXguc2VydmxldC5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMi40LjAudjIwMDgwMzA2MTkxMCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZU5hbWUnIHZhbHVlPSdTZXJ2bGV0IEFQSSBTb3VyY2UgQnVuZGxlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVQcm92aWRlcicgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclYnVuZGxlTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVidW5kbGVQcm92aWRlcicvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdqYXZheC5zZXJ2bGV0LnNvdXJjZScgdmVyc2lvbj0nMi40LjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YXguc2VydmxldC5zb3VyY2UnIHZlcnNpb249JzIuNC4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2phdmF4LnNlcnZsZXQuc291cmNlJyB2ZXJzaW9uPScyLjQuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDIuNC4wLnYyMDA4MDMwNjE5MTAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogamF2YXguc2VydmxldC5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogamF2YXguc2VydmxldDt2ZXJzaW9uPSZxdW90OzIuNC4wLnYyMDA4MDMwNjE5MTAmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVidW5kbGVQcm92aWRlcgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nY29tLmlibS5pY3Uuc291cmNlJyB2ZXJzaW9uPSczLjYuMC52MjAwODAzMDQnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nY29tLmlibS5pY3Uuc291cmNlJyByYW5nZT0nWzAuMC4wLDMuNi4wLnYyMDA4MDMwNCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0lCTSBDb3Jwb3JhdGlvbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0ludGVybmF0aW9uYWwgQ29tcG9uZW50cyBmb3IgVW5pY29kZSBmb3IgSmF2YSAoSUNVNEopIHNvdXJjZSBwbHVnLWluJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nY29tLmlibS5pY3Uuc291cmNlJyB2ZXJzaW9uPSczLjYuMC52MjAwODAzMDQnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2NvbS5pYm0uaWN1LnNvdXJjZScgdmVyc2lvbj0nMy42LjAudjIwMDgwMzA0Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdjb20uaWJtLmljdS5zb3VyY2UnIHZlcnNpb249JzMuNi4wLnYyMDA4MDMwNCcvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDMuNi4wLnYyMDA4MDMwNAotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmlibS5pY3Uuc291cmNlCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBjb20uaWJtLmljdTt2ZXJzaW9uPSZxdW90OzMuNi4wLnYyMDA4MDMwNCZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZycgdmVyc2lvbj0nMS4xLjEudjIwMDgwMzA2MTkxMCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZycgcmFuZ2U9J1swLjAuMCwxLjEuMS52MjAwODAzMDYxOTEwKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlTmFtZScgdmFsdWU9J0FwYWNoZSBDb21tb25zIExvZ2dpbmcgUGx1Zy1pbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlUHJvdmlkZXInIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJWJ1bmRsZU5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclYnVuZGxlUHJvdmlkZXInLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc2Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcnIHZlcnNpb249JzEuMS4xLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nJyB2ZXJzaW9uPScxLjEuMS52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcnIHZlcnNpb249JzEuMS4xJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbCcgdmVyc2lvbj0nMS4xLjEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nJyB2ZXJzaW9uPScxLjEuMS52MjAwODAzMDYxOTEwJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVidW5kbGVOYW1lCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEudjIwMDgwMzA2MTkxMAotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nO3ZlcnNpb249JnF1b3Q7MS4xLjEmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbDt2ZXJzaW9uPSZxdW90OzEuMS4xJnF1b3Q7Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCxKMlNFLTEuMwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlYnVuZGxlUHJvdmlkZXIKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J25ldC5zb3VyY2Vmb3JnZS5teDRqLnJlbW90ZScgdmVyc2lvbj0nMy4wLjEudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSduZXQuc291cmNlZm9yZ2UubXg0ai5yZW1vdGUnIHJhbmdlPSdbMC4wLjAsMy4wLjEudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1WZW5kb3IuMCcgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtTmFtZS4wJyB2YWx1ZT0nTVg0SiBSZW1vdGUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVCdW5kbGUtTmFtZS4wJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJUJ1bmRsZS1WZW5kb3IuMCcvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzEyJz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nbmV0LnNvdXJjZWZvcmdlLm14NGoucmVtb3RlJyB2ZXJzaW9uPSczLjAuMS52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSduZXQuc291cmNlZm9yZ2UubXg0ai5yZW1vdGUnIHZlcnNpb249JzMuMC4xLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdteDRqLmxvZycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdteDRqLnJlbW90ZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdteDRqLnJlbW90ZS5wcm92aWRlci5paW9wJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J214NGoucmVtb3RlLnByb3ZpZGVyLnJtaScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdteDRqLnJlbW90ZS5yZXNvbHZlci5paW9wJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J214NGoucmVtb3RlLnJlc29sdmVyLnJtaScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdteDRqLnJlbW90ZS5ybWknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nbXg0ai51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nbmV0LnNvdXJjZWZvcmdlLm14NGoucmVtb3RlJyB2ZXJzaW9uPSczLjAuMS52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDMuMC4xLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBteDRqLmxvZyxteDRqLnJlbW90ZSxteDRqLnJlbW90ZS5wcm92aWRlci5paW9wLG14NGoucmVtb3RlLnByb3ZpZGVyLnJtaSxteDRqLnJlbW90ZS5yZXNvbHZlci5paW9wLG14NGoucmVtb3RlLnJlc29sdmVyLnJtaSxteDRqLnJlbW90ZS5ybWksbXg0ai51dGlsCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG5ldC5zb3VyY2Vmb3JnZS5teDRqLnJlbW90ZQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5zYXQ0ai5wYicgdmVyc2lvbj0nMi4wLjAudjIwMDgwMzA3JyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5zYXQ0ai5wYicgcmFuZ2U9J1swLjAuMCwyLjAuMC52MjAwODAzMDcpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nMic+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclYnVuZGxlTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc5Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLnNhdDRqLnBiJyB2ZXJzaW9uPScyLjAuMC52MjAwODAzMDcnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5zYXQ0ai5wYicgdmVyc2lvbj0nMi4wLjAudjIwMDgwMzA3Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnNhdDRqLnBiJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5zYXQ0ai5wYi5jb25zdHJhaW50cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuc2F0NGoucGIuY29uc3RyYWludHMucGInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnNhdDRqLnBiLmNvcmUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnNhdDRqLnBiLm9yZGVycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuc2F0NGoucGIucmVhZGVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScxJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5zYXQ0ai5jb3JlJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuc2F0NGoucGInIHZlcnNpb249JzIuMC4wLnYyMDA4MDMwNycvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotSW1wbGVtZW50YXRpb24tVmVyc2lvbjogMi4wCi1FeHBvcnQtUGFja2FnZTogb3JnLnNhdDRqLnBiLG9yZy5zYXQ0ai5wYi5jb25zdHJhaW50cyxvcmcuc2F0NGoucGIuY29uc3RyYWludHMucGIsb3JnLnNhdDRqLnBiLmNvcmUsb3JnLnNhdDRqLnBiLm9yZGVycyxvcmcuc2F0NGoucGIucmVhZGVyCi1DcmVhdGVkLUJ5OiAxLjYuMF8wMi1iMDUgKFN1biBNaWNyb3N5c3RlbXMgSW5jLikKLUFudC1WZXJzaW9uOiBBcGFjaGUgQW50IDEuNi4xCi1TcGVjaWZpY2F0aW9uLVRpdGxlOiBTQVQ0SgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1NYWluLUNsYXNzOiBvcmcuc2F0NGoucGIuTGFuY2V1clBzZXVkbzIwMDcKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC52MjAwODAzMDcKLVJlcXVpcmUtQnVuZGxlOiBvcmcuc2F0NGouY29yZQotSW1wbGVtZW50YXRpb24tVmVuZG9yOiBDUklMIENOUlMgVU1SIDgxODggLSBVbml2ZXJzaXRlIGQmYXBvcztBcnRvaXMKLUltcGxlbWVudGF0aW9uLVRpdGxlOiBTQVQ0SgotQ2xhc3MtUGF0aDogb3JnLnNhdDRqLmNvcmUuamFyCi1CdWlsdC1CeTogRGFuaWVsIExlIEJlcnJlCi1TcGVjaWZpY2F0aW9uLVZlcnNpb246IE5BCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuc2F0NGoucGIKLVNwZWNpZmljYXRpb24tVmVuZG9yOiBEYW5pZWwgTGUgQmVycmUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5zb3VyY2UnIHZlcnNpb249JzEuMy4wLnYyMDA4MDMwNjE5MTAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLnNvdXJjZScgcmFuZ2U9J1swLjAuMCwxLjMuMC52MjAwODAzMDYxOTEwKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzInPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJWJ1bmRsZU5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclYnVuZGxlUHJvdmlkZXInLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSczJz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLnNvdXJjZScgdmVyc2lvbj0nMS4zLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLnNvdXJjZScgdmVyc2lvbj0nMS4zLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5zb3VyY2UnIHZlcnNpb249JzEuMy4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMS4zLjAudjIwMDgwMzA2MTkxMAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuc291cmNlCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYzt2ZXJzaW9uPSZxdW90OzEuMy4wLnYyMDA4MDMwNjE5MTAmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVidW5kbGVQcm92aWRlcgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0namF2YXgueG1sLndzJyB2ZXJzaW9uPScyLjAuMC52MjAwODAzMDcwNDAwJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2phdmF4LnhtbC53cycgcmFuZ2U9J1swLjAuMCwyLjAuMC52MjAwODAzMDcwNDAwKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLVZlbmRvci4wJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1OYW1lLjAnIHZhbHVlPSdKQVhXUycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJUJ1bmRsZS1OYW1lLjAnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclQnVuZGxlLVZlbmRvci4wJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTAnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdqYXZheC54bWwud3MnIHZlcnNpb249JzIuMC4wLnYyMDA4MDMwNzA0MDAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2phdmF4LnhtbC53cycgdmVyc2lvbj0nMi4wLjAudjIwMDgwMzA3MDQwMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC53cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwud3MuaGFuZGxlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwud3MuaGFuZGxlci5zb2FwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC53cy5odHRwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC53cy5zb2FwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC53cy5zcGknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdqYXZheC54bWwud3MnIHZlcnNpb249JzIuMC4wLnYyMDA4MDMwNzA0MDAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC52MjAwODAzMDcwNDAwCi1FeHBvcnQtUGFja2FnZTogamF2YXgueG1sLndzLGphdmF4LnhtbC53cy5oYW5kbGVyLGphdmF4LnhtbC53cy5oYW5kbGVyLnNvYXAsamF2YXgueG1sLndzLmh0dHAsamF2YXgueG1sLndzLnNvYXAsamF2YXgueG1sLndzLnNwaQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBqYXZheC54bWwud3MKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcubW9ydGJheS5qZXR0eScgdmVyc2lvbj0nNS4xLjExLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLm1vcnRiYXkuamV0dHknIHJhbmdlPSdbMC4wLjAsNS4xLjExLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVOYW1lJyB2YWx1ZT0nSmV0dHkgV2ViU2VydmVyJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVQcm92aWRlcicgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclYnVuZGxlTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVidW5kbGVQcm92aWRlcicvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzE2Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLm1vcnRiYXkuamV0dHknIHZlcnNpb249JzUuMS4xMS52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcubW9ydGJheS5qZXR0eScgdmVyc2lvbj0nNS4xLjExLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW9ydGJheS5odG1sJyB2ZXJzaW9uPSc1LjEuMTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW9ydGJheS5odHRwJyB2ZXJzaW9uPSc1LjEuMTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW9ydGJheS5odHRwLmFqcCcgdmVyc2lvbj0nNS4xLjExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vcnRiYXkuaHR0cC5oYW5kbGVyJyB2ZXJzaW9uPSc1LjEuMTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW9ydGJheS5odHRwLm5pbycgdmVyc2lvbj0nNS4xLjExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vcnRiYXkuamV0dHknIHZlcnNpb249JzUuMS4xMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LmpldHR5LnNlcnZsZXQnIHZlcnNpb249JzUuMS4xMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LmpldHR5LndpbjMyJyB2ZXJzaW9uPSc1LjEuMTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW9ydGJheS5sb2cnIHZlcnNpb249JzUuMS4xMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LnNlcnZsZXQnIHZlcnNpb249JzUuMS4xMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LnV0aWwnIHZlcnNpb249JzUuMS4xMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LnhtbCcgdmVyc2lvbj0nNS4xLjExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nOSc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubmV0LnNzbCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VjdXJpdHkuY2VydCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldCcgcmFuZ2U9J1syLjQuMCwyLjUuMCknLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZXJ2bGV0Lmh0dHAnIHJhbmdlPSdbMi40LjAsMi41LjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldC5yZXNvdXJjZXMnIHJhbmdlPSdbMi40LjAsMi41LjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnBhcnNlcnMnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nJyByYW5nZT0nWzEuMC4wLDIuMC4wKScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy54bWwuc2F4JyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcueG1sLnNheC5oZWxwZXJzJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcubW9ydGJheS5qZXR0eScgdmVyc2lvbj0nNS4xLjExLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQsQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCxKMlNFLTEuMwotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogNS4xLjExLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcubW9ydGJheS5odG1sO3ZlcnNpb249JnF1b3Q7NS4xLjExJnF1b3Q7LG9yZy5tb3J0YmF5Lmh0dHA7dmVyc2lvbj0mcXVvdDs1LjEuMTEmcXVvdDssb3JnLm1vcnRiYXkuaHR0cC5hanA7dmVyc2lvbj0mcXVvdDs1LjEuMTEmcXVvdDssb3JnLm1vcnRiYXkuaHR0cC5oYW5kbGVyO3ZlcnNpb249JnF1b3Q7NS4xLjExJnF1b3Q7LG9yZy5tb3J0YmF5Lmh0dHAubmlvO3ZlcnNpb249JnF1b3Q7NS4xLjExJnF1b3Q7LG9yZy5tb3J0YmF5LmpldHR5O3ZlcnNpb249JnF1b3Q7NS4xLjExJnF1b3Q7LG9yZy5tb3J0YmF5LmpldHR5LnNlcnZsZXQ7dmVyc2lvbj0mcXVvdDs1LjEuMTEmcXVvdDssb3JnLm1vcnRiYXkuamV0dHkud2luMzI7dmVyc2lvbj0mcXVvdDs1LjEuMTEmcXVvdDssb3JnLm1vcnRiYXkubG9nO3ZlcnNpb249JnF1b3Q7NS4xLjExJnF1b3Q7LG9yZy5tb3J0YmF5LnNlcnZsZXQ7dmVyc2lvbj0mcXVvdDs1LjEuMTEmcXVvdDssb3JnLm1vcnRiYXkudXRpbDt2ZXJzaW9uPSZxdW90OzUuMS4xMSZxdW90OyxvcmcubW9ydGJheS54bWw7dmVyc2lvbj0mcXVvdDs1LjEuMTEmcXVvdDsKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5tb3J0YmF5LmpldHR5Ci1JbXBvcnQtUGFja2FnZTogamF2YXgubmV0LnNzbCxqYXZheC5zZWN1cml0eS5jZXJ0LGphdmF4LnNlcnZsZXQ7dmVyc2lvbj0mcXVvdDtbMi40LjAsMi41LjApJnF1b3Q7LGphdmF4LnNlcnZsZXQuaHR0cDt2ZXJzaW9uPSZxdW90O1syLjQuMCwyLjUuMCkmcXVvdDssamF2YXguc2VydmxldC5yZXNvdXJjZXM7dmVyc2lvbj0mcXVvdDtbMi40LjAsMi41LjApJnF1b3Q7LGphdmF4LnhtbC5wYXJzZXJzLG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nO3ZlcnNpb249JnF1b3Q7WzEuMC4wLDIuMC4wKSZxdW90OyxvcmcueG1sLnNheCxvcmcueG1sLnNheC5oZWxwZXJzCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdqYXZheC53c2RsJyB2ZXJzaW9uPScxLjQuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2phdmF4LndzZGwnIHJhbmdlPSdbMC4wLjAsMS40LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1WZW5kb3IuMCcgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtTmFtZS4wJyB2YWx1ZT0nV1NETDRKJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclQnVuZGxlLU5hbWUuMCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVCdW5kbGUtVmVuZG9yLjAnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScyMCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4LndzZGwnIHZlcnNpb249JzEuNC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2phdmF4LndzZGwnIHZlcnNpb249JzEuNC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLmV4dGVuc2lvbnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLmV4dGVuc2lvbnMuaHR0cCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5taW1lJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC5leHRlbnNpb25zLnNvYXAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLmZhY3RvcnknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLnV0aWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLnV0aWwueG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC54bWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgud3NkbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC53c2RsLmV4dGVuc2lvbnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgud3NkbC5mYWN0b3J5JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwueG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzEnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMnIHJhbmdlPSdbMi44LjAsMy4wLjApJyBvcHRpb25hbD0ndHJ1ZScvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2phdmF4LndzZGwnIHZlcnNpb249JzEuNC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLnhlcmNlcztidW5kbGUtdmVyc2lvbj0mcXVvdDtbMi44LjAsMy4wLjApJnF1b3Q7O3Jlc29sdXRpb246PW9wdGlvbmFsCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZXJzaW9uOiAxLjQuMC52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogY29tLmlibS53c2RsLGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLmh0dHAsY29tLmlibS53c2RsLmV4dGVuc2lvbnMubWltZSxjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwLGNvbS5pYm0ud3NkbC5mYWN0b3J5LGNvbS5pYm0ud3NkbC51dGlsLGNvbS5pYm0ud3NkbC51dGlsLnhtbCxjb20uaWJtLndzZGwueG1sLGphdmF4LndzZGwsamF2YXgud3NkbC5leHRlbnNpb25zLGphdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwLGphdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lLGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLGphdmF4LndzZGwuZmFjdG9yeSxqYXZheC53c2RsLnhtbAotQnVuZGxlLVN5bWJvbGljTmFtZTogamF2YXgud3NkbAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2phdmF4LmFjdGl2YXRpb24nIHZlcnNpb249JzEuMS4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0namF2YXguYWN0aXZhdGlvbicgcmFuZ2U9J1swLjAuMCwxLjEuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLVZlbmRvci4wJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1OYW1lLjAnIHZhbHVlPSdKYXZhIEFjdGl2YXRpb24nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVCdW5kbGUtTmFtZS4wJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJUJ1bmRsZS1WZW5kb3IuMCcvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzcnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdqYXZheC5hY3RpdmF0aW9uJyB2ZXJzaW9uPScxLjEuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdqYXZheC5hY3RpdmF0aW9uJyB2ZXJzaW9uPScxLjEuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLnN1bi5hY3RpdmF0aW9uLnJlZ2lzdHJpZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLnN1bi5hY3RpdmF0aW9uLnZpZXdlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguYWN0aXZhdGlvbicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScxJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2knIHJhbmdlPScwLjAuMCcvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2phdmF4LmFjdGl2YXRpb24nIHZlcnNpb249JzEuMS4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLVJlcXVpcmUtQnVuZGxlOiBzeXN0ZW0uYnVuZGxlCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogY29tLnN1bi5hY3RpdmF0aW9uLnJlZ2lzdHJpZXMsY29tLnN1bi5hY3RpdmF0aW9uLnZpZXdlcnMsamF2YXguYWN0aXZhdGlvbgotQnVuZGxlLVN5bWJvbGljTmFtZTogamF2YXguYWN0aXZhdGlvbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuYmF0aWsudXRpbC5ndWknIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5iYXRpay51dGlsLmd1aScgcmFuZ2U9J1swLjAuMCwxLjYuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQmF0aWsgR1VJIFV0aWxpdGllcycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsudXRpbC5ndWknIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsudXRpbC5ndWknIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnV0aWwuZ3VpJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsudXRpbC5ndWkucmVzb3VyY2UnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmJhdGlrLnV0aWwuZ3VpJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVyc2lvbjogMS42LjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuYmF0aWsudXRpbC5ndWk7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnV0aWwuZ3VpLnJlc291cmNlO3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDsKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5iYXRpay51dGlsLmd1aQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuamFzcGVyLnNvdXJjZScgdmVyc2lvbj0nNS41LjE3LnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5qYXNwZXIuc291cmNlJyByYW5nZT0nWzAuMC4wLDUuNS4xNy52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlTmFtZScgdmFsdWU9J0FwYWNoZSBKYXNwZXIgMiBTb3VyY2UgUGx1Zy1pbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlUHJvdmlkZXInIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJWJ1bmRsZU5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclYnVuZGxlUHJvdmlkZXInLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5qYXNwZXIuc291cmNlJyB2ZXJzaW9uPSc1LjUuMTcudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5qYXNwZXIuc291cmNlJyB2ZXJzaW9uPSc1LjUuMTcudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5qYXNwZXIuc291cmNlJyB2ZXJzaW9uPSc1LjUuMTcudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiA1LjUuMTcudjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmphc3Blci5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmFwYWNoZS5qYXNwZXI7dmVyc2lvbj0mcXVvdDs1LjUuMTcudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdqYXZheC5tYW5hZ2VtZW50JyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2phdmF4Lm1hbmFnZW1lbnQnIHJhbmdlPSdbMC4wLjAsMS4yLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1WZW5kb3IuMCcgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtTmFtZS4wJyB2YWx1ZT0nSmF2YSBNYW5hZ2VtZW50IEV4dGVuc2lvbnMgQVBJJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclQnVuZGxlLU5hbWUuMCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVCdW5kbGUtVmVuZG9yLjAnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScxMSc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4Lm1hbmFnZW1lbnQnIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2phdmF4Lm1hbmFnZW1lbnQnIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5tYW5hZ2VtZW50JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm1hbmFnZW1lbnQubG9hZGluZycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5tYW5hZ2VtZW50Lm1vZGVsbWJlYW4nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubWFuYWdlbWVudC5tb25pdG9yJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm1hbmFnZW1lbnQub3Blbm1iZWFuJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm1hbmFnZW1lbnQucmVsYXRpb24nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubWFuYWdlbWVudC50aW1lcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2phdmF4Lm1hbmFnZW1lbnQnIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IGphdmF4Lm1hbmFnZW1lbnQsamF2YXgubWFuYWdlbWVudC5sb2FkaW5nLGphdmF4Lm1hbmFnZW1lbnQubW9kZWxtYmVhbixqYXZheC5tYW5hZ2VtZW50Lm1vbml0b3IsamF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4samF2YXgubWFuYWdlbWVudC5yZWxhdGlvbixqYXZheC5tYW5hZ2VtZW50LnRpbWVyCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGphdmF4Lm1hbmFnZW1lbnQKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLnhtbC5yZXNvbHZlcicgdmVyc2lvbj0nMS4xLjAudjIwMDgwMzA3MDMwOCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLnhtbC5yZXNvbHZlcicgcmFuZ2U9J1swLjAuMCwxLjEuMC52MjAwODAzMDcwMzA4KScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLVZlbmRvci4wJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1OYW1lLjAnIHZhbHVlPSdBcGFjaGUgWG1sUmVzb2x2ZXInLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVCdW5kbGUtTmFtZS4wJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJUJ1bmRsZS1WZW5kb3IuMCcvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzExJz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS54bWwucmVzb2x2ZXInIHZlcnNpb249JzEuMS4wLnYyMDA4MDMwNzAzMDgnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUueG1sLnJlc29sdmVyJyB2ZXJzaW9uPScxLjEuMC52MjAwODAzMDcwMzA4Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5lbnYnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWwucmVzb2x2ZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuYXBwcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhtbC5yZXNvbHZlci5ldGMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuaGVscGVycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhtbC5yZXNvbHZlci5yZWFkZXJzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLnJlc29sdmVyLnRvb2xzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzEnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS54bWwucmVzb2x2ZXInIHZlcnNpb249JzEuMS4wLnYyMDA4MDMwNzAzMDgnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5lbnYsb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIsb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuYXBwcyxvcmcuYXBhY2hlLnhtbC5yZXNvbHZlci5ldGMsb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuaGVscGVycyxvcmcuYXBhY2hlLnhtbC5yZXNvbHZlci5yZWFkZXJzLG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLnRvb2xzCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjIKLU1haW4tQ2xhc3M6IG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLmFwcHMucmVzb2x2ZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotUmVxdWlyZS1CdW5kbGU6IHN5c3RlbS5idW5kbGUKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVZlcnNpb246IDEuMS4wLnYyMDA4MDMwNzAzMDgKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUueG1sLnJlc29sdmVyCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuYmF0aWsucGRmJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuYmF0aWsucGRmJyByYW5nZT0nWzAuMC4wLDEuNi4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtVmVuZG9yJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIFBERicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJUJ1bmRsZS1OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJUJ1bmRsZS1WZW5kb3InLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScyNic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsucGRmJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnBkZicgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yaycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaW8nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmlvLm91dHB1dCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZm9wLmFwcHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5mb3AuZm8nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5mb3AuZm9udHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5mb3AuZm9udHMuYXBwcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmZvcC5mb250cy5iYXNlMTQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5mb3AuZm9udHMudHJ1ZXR5cGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5mb3AuZm9udHMudHlwZTEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5mb3AuaW1hZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5mb3AuaW1hZ2UuYW5hbHlzZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5mb3AucGRmJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZm9wLnJlbmRlci5wZGYnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5mb3AucmVuZGVyLnBzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZm9wLnN2ZycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmZvcC51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzEzJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmJyaWRnZScgcmFuZ2U9J1sxLjYuMCwxLjcuMCknLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmRvbS5zdmcnIHJhbmdlPSdbMS42LjAsMS43LjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5kb20udXRpbCcgcmFuZ2U9J1sxLjYuMCwxLjcuMCknLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QnIHJhbmdlPSdbMS42LjAsMS43LjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5leHQuYXd0LmcyZCcgcmFuZ2U9J1sxLjYuMCwxLjcuMCknLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmd2dCcgcmFuZ2U9J1sxLjYuMCwxLjcuMCknLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmd2dC5yZW5kZXJlcicgcmFuZ2U9J1sxLjYuMCwxLjcuMCknLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmd2dC50ZXh0JyByYW5nZT0nWzEuNi4wLDEuNy4wKScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsudHJhbnNjb2RlcicgcmFuZ2U9J1sxLjYuMCwxLjcuMCknLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXIuaW1hZ2UnIHJhbmdlPSdbMS42LjAsMS43LjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay50cmFuc2NvZGVyLmtleXMnIHJhbmdlPSdbMS42LjAsMS43LjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay51dGlsJyByYW5nZT0nWzEuNi4wLDEuNy4wKScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy53M2MuZG9tJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmJhdGlrLnBkZicgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMS42LjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuYXZhbG9uLmZyYW1ld29yayxvcmcuYXBhY2hlLmF2YWxvbi5mcmFtZXdvcmsuYWN0aXZpdHksb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbmZpZ3VyYXRpb24sb3JnLmFwYWNoZS5hdmFsb24uZnJhbWV3b3JrLmNvbnRhaW5lcixvcmcuYXBhY2hlLmNvbW1vbnMuaW8sb3JnLmFwYWNoZS5jb21tb25zLmlvLm91dHB1dCxvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZyxvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLG9yZy5hcGFjaGUuZm9wLmFwcHMsb3JnLmFwYWNoZS5mb3AuZm8sb3JnLmFwYWNoZS5mb3AuZm9udHMsb3JnLmFwYWNoZS5mb3AuZm9udHMuYXBwcyxvcmcuYXBhY2hlLmZvcC5mb250cy5iYXNlMTQsb3JnLmFwYWNoZS5mb3AuZm9udHMudHJ1ZXR5cGUsb3JnLmFwYWNoZS5mb3AuZm9udHMudHlwZTEsb3JnLmFwYWNoZS5mb3AuaW1hZ2Usb3JnLmFwYWNoZS5mb3AuaW1hZ2UuYW5hbHlzZXIsb3JnLmFwYWNoZS5mb3AucGRmLG9yZy5hcGFjaGUuZm9wLnJlbmRlci5wZGYsb3JnLmFwYWNoZS5mb3AucmVuZGVyLnBzLG9yZy5hcGFjaGUuZm9wLnN2ZyxvcmcuYXBhY2hlLmZvcC51dGlsCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmJhdGlrLnBkZgotSW1wb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuYmF0aWsuYnJpZGdlO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmRvbS5zdmc7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZG9tLnV0aWw7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dDt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5leHQuYXd0LmcyZDt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5ndnQ7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZ3Z0LnJlbmRlcmVyO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmd2dC50ZXh0O3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXI7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsudHJhbnNjb2Rlci5pbWFnZTt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay50cmFuc2NvZGVyLmtleXM7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsudXRpbDt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLnczYy5kb20KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuYmF0aWsucGFyc2VyJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuYmF0aWsucGFyc2VyJyByYW5nZT0nWzAuMC4wLDEuNi4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBCYXRpayBQYXJzZXInLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzUnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnBhcnNlcicgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5wYXJzZXInIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnBhcnNlcicgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPSc0Jz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnV0aWwnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay54bWwnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLnczYy5kb20uc3ZnJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmJhdGlrLnBhcnNlcicgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMwotUmVxdWlyZS1CdW5kbGU6IG9yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dDt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay51dGlsO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnhtbDt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLnczYy5kb20uc3ZnO3ZlcnNpb249JnF1b3Q7WzEuMS4wLDEuMy4wKSZxdW90OwotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMS42LjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuYmF0aWsucGFyc2VyO3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDsKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmF0aWsucGFyc2VyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zJyB2ZXJzaW9uPSczLjIuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucycgcmFuZ2U9J1swLjAuMCwzLjIuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQ29tbW9ucyBDb2xsZWN0aW9ucycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTYnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMnIHZlcnNpb249JzMuMi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucycgdmVyc2lvbj0nMy4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucycgdmVyc2lvbj0nMy4yLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuYmFnJyB2ZXJzaW9uPSczLjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iaWRpbWFwJyB2ZXJzaW9uPSczLjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5idWZmZXInIHZlcnNpb249JzMuMi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbGxlY3Rpb24nIHZlcnNpb249JzMuMi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbXBhcmF0b3JzJyB2ZXJzaW9uPSczLjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5mdW5jdG9ycycgdmVyc2lvbj0nMy4yLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMuaXRlcmF0b3JzJyB2ZXJzaW9uPSczLjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5rZXl2YWx1ZScgdmVyc2lvbj0nMy4yLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubGlzdCcgdmVyc2lvbj0nMy4yLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMubWFwJyB2ZXJzaW9uPSczLjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQnIHZlcnNpb249JzMuMi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMnIHZlcnNpb249JzMuMi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjIuMC52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zO3ZlcnNpb249JnF1b3Q7My4yLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJhZzt2ZXJzaW9uPSZxdW90OzMuMi4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5iaWRpbWFwO3ZlcnNpb249JnF1b3Q7My4yLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmJ1ZmZlcjt2ZXJzaW9uPSZxdW90OzMuMi4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5jb2xsZWN0aW9uO3ZlcnNpb249JnF1b3Q7My4yLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmNvbXBhcmF0b3JzO3ZlcnNpb249JnF1b3Q7My4yLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLmZ1bmN0b3JzO3ZlcnNpb249JnF1b3Q7My4yLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLml0ZXJhdG9yczt2ZXJzaW9uPSZxdW90OzMuMi4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5rZXl2YWx1ZTt2ZXJzaW9uPSZxdW90OzMuMi4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5saXN0O3ZlcnNpb249JnF1b3Q7My4yLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmNvbGxlY3Rpb25zLm1hcDt2ZXJzaW9uPSZxdW90OzMuMi4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucy5zZXQ7dmVyc2lvbj0mcXVvdDszLjIuMCZxdW90OwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLnhhbGFuJyB2ZXJzaW9uPScyLjcuMS52MjAwODAzMjYwODA0JyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUueGFsYW4nIHJhbmdlPSdbMC4wLjAsMi43LjEudjIwMDgwMzI2MDgwNCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nWGFsYW4tSmF2YScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNDUnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuJyB2ZXJzaW9uPScyLjcuMS52MjAwODAzMjYwODA0Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuJyB2ZXJzaW9uPScyLjcuMS52MjAwODAzMjYwODA0Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nTUVUQS1JTkYuc2VydmljZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5yZWdleHAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLmNsaWVudCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLmV4dGVuc2lvbnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbi5saWInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbi5saWIuc3FsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4ucHJvY2Vzc29yJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4ucmVzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4uc2VyaWFsaXplJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4udGVtcGxhdGVzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4udHJhY2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbi50cmFuc2Zvcm1lcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLnhzbHQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbi54c2x0YycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLmNtZGxpbmUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5jbWRsaW5lLmdldG9wdCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLmNvbXBpbGVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4ueHNsdGMuY29tcGlsZXIudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLmRvbScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnJ1bnRpbWUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5ydW50aW1lLm91dHB1dCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnRyYXgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbi54c2x0Yy51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLmR0bScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhtbC5kdG0ucmVmJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLmR0bS5yZWYuZG9tMmR0bScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhtbC5kdG0ucmVmLnNheDJkdG0nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWwucmVzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLnV0aWxzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLnV0aWxzLnJlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhwYXRoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueHBhdGguYXhlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhwYXRoLmNvbXBpbGVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueHBhdGguZG9tYXBpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueHBhdGguZnVuY3Rpb25zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueHBhdGguamF4cCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54cGF0aC5vcGVyYXRpb25zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueHBhdGgucGF0dGVybnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54cGF0aC5yZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2phdmFfY3VwLnJ1bnRpbWUnIHJhbmdlPScwLjEwLjAnIG9wdGlvbmFsPSd0cnVlJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJjZWwnIHJhbmdlPSc1LjIuMCcgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzJyByYW5nZT0nWzIuOS4wLDMuMC4wKScgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLnhhbGFuJyB2ZXJzaW9uPScyLjcuMS52MjAwODAzMjYwODA0Jy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1SZXF1aXJlLUJ1bmRsZTogc3lzdGVtLmJ1bmRsZSxqYXZhX2N1cC5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSZxdW90OzAuMTAuMCZxdW90OztyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmJjZWw7YnVuZGxlLXZlcnNpb249JnF1b3Q7NS4yLjAmcXVvdDs7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS54ZXJjZXM7YnVuZGxlLXZlcnNpb249JnF1b3Q7WzIuOS4wLDMuMC4wKSZxdW90OztyZXNvbHV0aW9uOj1vcHRpb25hbAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMi43LjEudjIwMDgwMzI2MDgwNAotRXhwb3J0LVBhY2thZ2U6IE1FVEEtSU5GLnNlcnZpY2VzLG9yZy5hcGFjaGUucmVnZXhwLG9yZy5hcGFjaGUueGFsYW4sb3JnLmFwYWNoZS54YWxhbi5jbGllbnQsb3JnLmFwYWNoZS54YWxhbi5leHRlbnNpb25zLG9yZy5hcGFjaGUueGFsYW4ubGliLG9yZy5hcGFjaGUueGFsYW4ubGliLnNxbCxvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3NvcixvcmcuYXBhY2hlLnhhbGFuLnJlcyxvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZSxvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcyxvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIsb3JnLmFwYWNoZS54YWxhbi54c2x0LG9yZy5hcGFjaGUueGFsYW4ueHNsdGMsb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5jbWRsaW5lLG9yZy5hcGFjaGUueGFsYW4ueHNsdGMuY21kbGluZS5nZXRvcHQsb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5jb21waWxlcixvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLmNvbXBpbGVyLnV0aWwsb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5kb20sb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5ydW50aW1lLG9yZy5hcGFjaGUueGFsYW4ueHNsdGMucnVudGltZS5vdXRwdXQsb3JnLmFwYWNoZS54YWxhbi54c2x0Yy50cmF4LG9yZy5hcGFjaGUueGFsYW4ueHNsdGMudXRpbCxvcmcuYXBhY2hlLnhtbC5kdG0sb3JnLmFwYWNoZS54bWwuZHRtLnJlZixvcmcuYXBhY2hlLnhtbC5kdG0ucmVmLmRvbTJkdG0sb3JnLmFwYWNoZS54bWwuZHRtLnJlZi5zYXgyZHRtLG9yZy5hcGFjaGUueG1sLnJlcyxvcmcuYXBhY2hlLnhtbC51dGlscyxvcmcuYXBhY2hlLnhtbC51dGlscy5yZXMsb3JnLmFwYWNoZS54cGF0aCxvcmcuYXBhY2hlLnhwYXRoLmF4ZXMsb3JnLmFwYWNoZS54cGF0aC5jb21waWxlcixvcmcuYXBhY2hlLnhwYXRoLmRvbWFwaSxvcmcuYXBhY2hlLnhwYXRoLmZ1bmN0aW9ucyxvcmcuYXBhY2hlLnhwYXRoLmpheHAsb3JnLmFwYWNoZS54cGF0aC5vYmplY3RzLG9yZy5hcGFjaGUueHBhdGgub3BlcmF0aW9ucyxvcmcuYXBhY2hlLnhwYXRoLnBhdHRlcm5zLG9yZy5hcGFjaGUueHBhdGgucmVzCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLnhhbGFuCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5jb21tb25zLnBvb2wuc291cmNlJyB2ZXJzaW9uPScxLjMuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5wb29sLnNvdXJjZScgcmFuZ2U9J1swLjAuMCwxLjMuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQ29tbW9ucyBQb29sJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLnBvb2wuc291cmNlJyB2ZXJzaW9uPScxLjMuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMucG9vbC5zb3VyY2UnIHZlcnNpb249JzEuMy4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5wb29sLnNvdXJjZScgdmVyc2lvbj0nMS4zLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjMuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuY29tbW9ucy5wb29sLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmNvbW1vbnMucG9vbDt2ZXJzaW9uPSZxdW90OzEuMy4wLnYyMDA4MDMwNjE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuYW50LnNvdXJjZScgdmVyc2lvbj0nMS43LjAudjIwMDgwMzA2MTkxMCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmFudC5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS43LjAudjIwMDgwMzA2MTkxMCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEFudCBTb3VyY2UnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmFudC5zb3VyY2UnIHZlcnNpb249JzEuNy4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYW50LnNvdXJjZScgdmVyc2lvbj0nMS43LjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5hbnQuc291cmNlJyB2ZXJzaW9uPScxLjcuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuNy4wLnYyMDA4MDMwNjE5MTAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5hbnQuc291cmNlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUuYW50O3ZlcnNpb249JnF1b3Q7MS43LjAudjIwMDgwMzA2MTkxMCZxdW90Oztyb290czo9JnF1b3Q7bGliL2FudCxsaWIvYW50LWFudGxyLGxpYi9hbnQtYXBhY2hlLWJjZWwsbGliL2FudC1hcGFjaGUtYnNmLGxpYi9hbnQtYXBhY2hlLWxvZzRqLGxpYi9hbnQtYXBhY2hlLW9ybyxsaWIvYW50LWFwYWNoZS1yZWdleHAsbGliL2FudC1hcGFjaGUtcmVzb2x2ZXIsbGliL2FudC1jb21tb25zLWxvZ2dpbmcsbGliL2FudC1jb21tb25zLW5ldCxsaWIvYW50LWphaSxsaWIvYW50LWphdmFtYWlsLGxpYi9hbnQtamRlcGVuZCxsaWIvYW50LWptZixsaWIvYW50LWpzY2gsbGliL2FudC1qdW5pdCxsaWIvYW50LWxhdW5jaGVyLGxpYi9hbnQtbmV0cmV4eCxsaWIvYW50LW5vZGVwcyxsaWIvYW50LXN0YXJ0ZWFtLGxpYi9hbnQtc3R5bGVib29rLGxpYi9hbnQtc3dpbmcsbGliL2FudC10cmF4LGxpYi9hbnQtd2VibG9naWMmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5qdW5pdC5zb3VyY2UnIHZlcnNpb249JzMuOC4xLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmp1bml0LnNvdXJjZScgcmFuZ2U9J1swLjAuMCwzLjguMS52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdKVW5pdCBUZXN0aW5nIEZyYW1ld29yayBTb3VyY2UgQnVuZGxlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmp1bml0LnNvdXJjZScgdmVyc2lvbj0nMy44LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmp1bml0LnNvdXJjZScgdmVyc2lvbj0nMy44LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmp1bml0LnNvdXJjZScgdmVyc2lvbj0nMy44LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDMuOC4xLnYyMDA4MDMwNjE4MTEKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmp1bml0O3ZlcnNpb249JnF1b3Q7My44LjEudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmp1bml0LnNvdXJjZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J25ldC5zb3VyY2Vmb3JnZS5scGcubHBnamF2YXJ1bnRpbWUnIHZlcnNpb249JzEuMS4wLnYyMDA4MDMwNjE5MTAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nbmV0LnNvdXJjZWZvcmdlLmxwZy5scGdqYXZhcnVudGltZScgcmFuZ2U9J1swLjAuMCwxLjEuMC52MjAwODAzMDYxOTEwKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdTb3VyY2VGb3JnZSBMUEcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzUnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSduZXQuc291cmNlZm9yZ2UubHBnLmxwZ2phdmFydW50aW1lJyB2ZXJzaW9uPScxLjEuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSduZXQuc291cmNlZm9yZ2UubHBnLmxwZ2phdmFydW50aW1lJyB2ZXJzaW9uPScxLjEuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nbHBnLmxwZ2phdmFydW50aW1lJyB2ZXJzaW9uPScxLjEuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nbmV0LnNvdXJjZWZvcmdlLmxwZy5scGdqYXZhcnVudGltZScgdmVyc2lvbj0nMS4xLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLEoyU0UtMS4zCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC52MjAwODAzMDYxOTEwCi1FeHBvcnQtUGFja2FnZTogbHBnLmxwZ2phdmFydW50aW1lOyB2ZXJzaW9uPSZxdW90OzEuMSZxdW90OwotQnVuZGxlLVN5bWJvbGljTmFtZTogbmV0LnNvdXJjZWZvcmdlLmxwZy5scGdqYXZhcnVudGltZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nJyB2ZXJzaW9uPScyLjMuMC52MjAwODAzMDYxOTEwJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nJyByYW5nZT0nWzAuMC4wLDIuMy4wLnYyMDA4MDMwNjE5MTApJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBKYWthcnRhIENvbW1vbnMgTGFuZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTMnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubGFuZycgdmVyc2lvbj0nMi4zLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxhbmcnIHZlcnNpb249JzIuMy4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubGFuZycgdmVyc2lvbj0nMi4zLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5idWlsZGVyJyB2ZXJzaW9uPScyLjMuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmVudW0nIHZlcnNpb249JzIuMy4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZW51bXMnIHZlcnNpb249JzIuMy4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZXhjZXB0aW9uJyB2ZXJzaW9uPScyLjMuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nLm1hdGgnIHZlcnNpb249JzIuMy4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxhbmcubXV0YWJsZScgdmVyc2lvbj0nMi4zLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy50ZXh0JyB2ZXJzaW9uPScyLjMuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nLnRpbWUnIHZlcnNpb249JzIuMy4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMubGFuZycgdmVyc2lvbj0nMi4zLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDIuMy4wLnYyMDA4MDMwNjE5MTAKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzt2ZXJzaW9uPSZxdW90OzIuMy4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmJ1aWxkZXI7dmVyc2lvbj0mcXVvdDsyLjMuMCZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5lbnVtO3ZlcnNpb249JnF1b3Q7Mi4zLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZW51bXM7dmVyc2lvbj0mcXVvdDsyLjMuMCZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5leGNlcHRpb247dmVyc2lvbj0mcXVvdDsyLjMuMCZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5tYXRoO3ZlcnNpb249JnF1b3Q7Mi4zLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmxhbmcubXV0YWJsZTt2ZXJzaW9uPSZxdW90OzIuMy4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLnRleHQ7dmVyc2lvbj0mcXVvdDsyLjMuMCZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy50aW1lO3ZlcnNpb249JnF1b3Q7Mi4zLjAmcXVvdDsKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKUkUtMS4xCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuYmF0aWsuc3ZnZ2VuLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmJhdGlrLnN2Z2dlbi5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIFNWRyBHZW5lcmF0aW9uIFNvdXJjZSBCdW5kbGUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnN2Z2dlbi5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuc3ZnZ2VuLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5iYXRpay5zdmdnZW4uc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuNi4wLnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5iYXRpay5zdmdnZW4uc291cmNlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUuYmF0aWsuc3ZnZ2VuO3ZlcnNpb249JnF1b3Q7MS42LjAudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjJyB2ZXJzaW9uPScxLjMuMC52MjAwODAzMDYxOTEwJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYycgcmFuZ2U9J1swLjAuMCwxLjMuMC52MjAwODAzMDYxOTEwKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlTmFtZScgdmFsdWU9J0FwYWNoZSBDb21tb25zIENvZGVjIFBsdWctaW4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZVByb3ZpZGVyJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVidW5kbGVOYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJWJ1bmRsZVByb3ZpZGVyJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nOSc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYycgdmVyc2lvbj0nMS4zLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjJyB2ZXJzaW9uPScxLjMuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjJyB2ZXJzaW9uPScxLjMuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnknIHZlcnNpb249JzEuMy4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmRpZ2VzdCcgdmVyc2lvbj0nMS4zLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubGFuZ3VhZ2UnIHZlcnNpb249JzEuMy4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldCcgdmVyc2lvbj0nMS4zLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYycgdmVyc2lvbj0nMS4zLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjMuMC52MjAwODAzMDYxOTEwCi1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjO3ZlcnNpb249JnF1b3Q7MS4zLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeTt2ZXJzaW9uPSZxdW90OzEuMy4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5kaWdlc3Q7dmVyc2lvbj0mcXVvdDsxLjMuMCZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubGFuZ3VhZ2U7dmVyc2lvbj0mcXVvdDsxLjMuMCZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubmV0O3ZlcnNpb249JnF1b3Q7MS4zLjAmcXVvdDsKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdjb20uaWJtLmljdS5iYXNlLnNvdXJjZScgdmVyc2lvbj0nMy40LjUnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nY29tLmlibS5pY3UuYmFzZS5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMy40LjUpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdJQk0gQ29ycG9yYXRpb24nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdJbnRlcm5hdGlvbmFsIENvbXBvbmVudHMgZm9yIFVuaWNvZGUgZm9yIEphdmEgKElDVTRKKSBSZXBsYWNlbWVudCBzb3VyY2UgcGx1Zy1pbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2NvbS5pYm0uaWN1LmJhc2Uuc291cmNlJyB2ZXJzaW9uPSczLjQuNScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nY29tLmlibS5pY3UuYmFzZS5zb3VyY2UnIHZlcnNpb249JzMuNC41Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdjb20uaWJtLmljdS5iYXNlLnNvdXJjZScgdmVyc2lvbj0nMy40LjUnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjQuNQotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmlibS5pY3UuYmFzZS5zb3VyY2UKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IGNvbS5pYm0uaWN1LmJhc2U7dmVyc2lvbj0mcXVvdDszLjQuNSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdhLmpyZScgdmVyc2lvbj0nMS42LjAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzExNyc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2EuanJlJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LmFjY2Vzc2liaWxpdHknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguYWN0aXZpdHknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguY3J5cHRvJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LmNyeXB0by5pbnRlcmZhY2VzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LmNyeXB0by5zcGVjJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LmltYWdlaW8nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguaW1hZ2Vpby5ldmVudCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5pbWFnZWlvLm1ldGFkYXRhJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LmltYWdlaW8ucGx1Z2lucy5ibXAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguaW1hZ2Vpby5wbHVnaW5zLmpwZWcnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguaW1hZ2Vpby5zcGknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguaW1hZ2Vpby5zdHJlYW0nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubWFuYWdlbWVudCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5tYW5hZ2VtZW50LmxvYWRpbmcnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubWFuYWdlbWVudC5tb2RlbG1iZWFuJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm1hbmFnZW1lbnQubW9uaXRvcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5tYW5hZ2VtZW50Lm9wZW5tYmVhbicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5tYW5hZ2VtZW50LnJlbGF0aW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm1hbmFnZW1lbnQucmVtb3RlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm1hbmFnZW1lbnQucmVtb3RlLnJtaScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5tYW5hZ2VtZW50LnRpbWVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm5hbWluZycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5uYW1pbmcuZGlyZWN0b3J5JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm5hbWluZy5ldmVudCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5uYW1pbmcubGRhcCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5uYW1pbmcuc3BpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm5ldCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5uZXQuc3NsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnByaW50JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnByaW50LmF0dHJpYnV0ZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5wcmludC5hdHRyaWJ1dGUuc3RhbmRhcmQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgucHJpbnQuZXZlbnQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgucm1pJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnJtaS5DT1JCQScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5ybWkuc3NsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlY3VyaXR5LmF1dGgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjaycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZWN1cml0eS5hdXRoLmtlcmJlcm9zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlY3VyaXR5LmF1dGgubG9naW4nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VjdXJpdHkuYXV0aC5zcGknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VjdXJpdHkuYXV0aC54NTAwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlY3VyaXR5LmNlcnQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VjdXJpdHkuc2FzbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zb3VuZC5taWRpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNvdW5kLm1pZGkuc3BpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNvdW5kLnNhbXBsZWQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc291bmQuc2FtcGxlZC5zcGknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3FsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNxbC5yb3dzZXQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3FsLnJvd3NldC5zZXJpYWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3FsLnJvd3NldC5zcGknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcuYm9yZGVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nLmNvbG9yY2hvb3NlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zd2luZy5ldmVudCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zd2luZy5maWxlY2hvb3NlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zd2luZy5wbGFmJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nLnBsYWYuYmFzaWMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcucGxhZi5tZXRhbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zd2luZy5wbGFmLm11bHRpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nLnBsYWYuc3ludGgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcudGFibGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcudGV4dCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zd2luZy50ZXh0Lmh0bWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcudGV4dC5odG1sLnBhcnNlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zd2luZy50ZXh0LnJ0ZicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zd2luZy50cmVlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nLnVuZG8nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgudHJhbnNhY3Rpb24nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgudHJhbnNhY3Rpb24ueGEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5kYXRhdHlwZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwubmFtZXNwYWNlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5wYXJzZXJzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC50cmFuc2Zvcm0nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnRyYW5zZm9ybS5kb20nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnRyYW5zZm9ybS5zYXgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnZhbGlkYXRpb24nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnhwYXRoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5pZXRmLmpnc3MnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5DT1JCQScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub21nLkNPUkJBXzJfMycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub21nLkNPUkJBXzJfMy5wb3J0YWJsZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub21nLkNPUkJBLkR5bkFueVBhY2thZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5DT1JCQS5PUkJQYWNrYWdlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuQ09SQkEucG9ydGFibGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5DT1JCQS5UeXBlQ29kZVBhY2thZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5Db3NOYW1pbmcnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dEV4dFBhY2thZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5Db3NOYW1pbmcuTmFtaW5nQ29udGV4dFBhY2thZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5EeW5hbWljJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuRHluYW1pY0FueScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub21nLkR5bmFtaWNBbnkuRHluQW55RmFjdG9yeVBhY2thZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5EeW5hbWljQW55LkR5bkFueVBhY2thZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5JT1AnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5JT1AuQ29kZWNGYWN0b3J5UGFja2FnZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub21nLklPUC5Db2RlY1BhY2thZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5NZXNzYWdpbmcnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5Qb3J0YWJsZUludGVyY2VwdG9yJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvci5PUkJJbml0SW5mb1BhY2thZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5Qb3J0YWJsZVNlcnZlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub21nLlBvcnRhYmxlU2VydmVyLkN1cnJlbnRQYWNrYWdlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BTWFuYWdlclBhY2thZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5QT0FQYWNrYWdlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuUG9ydGFibGVTZXJ2ZXIucG9ydGFibGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5TZXJ2YW50TG9jYXRvclBhY2thZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5TZW5kaW5nQ29udGV4dCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub21nLnN0dWIuamF2YS5ybWknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5kb20nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5kb20uYm9vdHN0cmFwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy53M2MuZG9tLmV2ZW50cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbS5scycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcueG1sLnNheCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcueG1sLnNheC5leHQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnhtbC5zYXguaGVscGVycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYXRpdmUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmJhdGlrLmNzcycgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmJhdGlrLmNzcycgcmFuZ2U9J1swLjAuMCwxLjYuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQmF0aWsgQ1NTJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScxMic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuY3NzJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmNzcycgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuY3NzLmRvbScgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmNzcy5lbmdpbmUnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5jc3MuZW5naW5lLnNhYycgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmNzcy5lbmdpbmUudmFsdWUnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5jc3MuZW5naW5lLnZhbHVlLmNzczInIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5jc3MuZW5naW5lLnZhbHVlLnN2ZycgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmNzcy5lbmdpbmUudmFsdWUuc3ZnMTInIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5jc3MucGFyc2VyJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5iYXRpay5jc3MnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1SZXF1aXJlLWJ1bmRsZTogb3JnLmFwYWNoZS5iYXRpay51dGlsO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcudzNjLmNzcy5zYWM7dmVyc2lvbj0mcXVvdDtbMS4zLjAsMS40LjApJnF1b3Q7LG9yZy53M2MuZG9tLnN2Zzt2ZXJzaW9uPSZxdW90O1sxLjEuMCwxLjMuMCkmcXVvdDsKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMwotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMS42LjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuYmF0aWsuY3NzLmRvbTt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuY3NzLmVuZ2luZTt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuY3NzLmVuZ2luZS5zYWM7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmNzcy5lbmdpbmUudmFsdWU7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmNzcy5lbmdpbmUudmFsdWUuY3NzMjt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuY3NzLmVuZ2luZS52YWx1ZS5zdmc7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmNzcy5lbmdpbmUudmFsdWUuc3ZnMTI7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmNzcy5wYXJzZXI7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5iYXRpay5jc3MKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuamRvbS5zb3VyY2UnIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmpkb20uc291cmNlJyByYW5nZT0nWzAuMC4wLDEuMC4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0pET00gU291cmNlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmpkb20uc291cmNlJyB2ZXJzaW9uPScxLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuamRvbS5zb3VyY2UnIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5qZG9tLnNvdXJjZScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5qZG9tLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuamRvbTt2ZXJzaW9uPSZxdW90OzEuMC4wLnYyMDA4MDMwNzA1MDUmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5tb3J0YmF5LmpldHR5LnNlcnZlcicgdmVyc2lvbj0nNi4xLjcudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcubW9ydGJheS5qZXR0eS5zZXJ2ZXInIHJhbmdlPSdbMC4wLjAsNi4xLjcudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9J0pldHR5IFNlcnZlcicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kZXNjcmlwdGlvbicgdmFsdWU9J0pldHR5IHNlcnZlciBjb3JlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nTW9ydCBCYXkgQ29uc3VsdGluZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kb2MudXJsJyB2YWx1ZT0naHR0cDovL2pldHR5Lm1vcnRiYXkub3JnJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTcnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcubW9ydGJheS5qZXR0eS5zZXJ2ZXInIHZlcnNpb249JzYuMS43LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5tb3J0YmF5LmpldHR5LnNlcnZlcicgdmVyc2lvbj0nNi4xLjcudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LmpldHR5LmJpbycgdmVyc2lvbj0nNi4xLjcnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW9ydGJheS5zZXJ2bGV0LmpldHR5JyB2ZXJzaW9uPSc2LjEuNycvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LmpldHR5Lm5pbycgdmVyc2lvbj0nNi4xLjcnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW9ydGJheS5yZXNvdXJjZScgdmVyc2lvbj0nNi4xLjcnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW9ydGJheS5pby5uaW8nIHZlcnNpb249JzYuMS43Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vcnRiYXkuamV0dHkuc2VjdXJpdHknIHZlcnNpb249JzYuMS43Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vcnRiYXkuamV0dHkuZGVwbG95ZXInIHZlcnNpb249JzYuMS43Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vcnRiYXkueG1sJyB2ZXJzaW9uPSc2LjEuNycvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LmlvLmJpbycgdmVyc2lvbj0nNi4xLjcnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW9ydGJheS5qZXR0eS5zZXJ2bGV0JyB2ZXJzaW9uPSc2LjEuNycvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LmlvJyB2ZXJzaW9uPSc2LjEuNycvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LmpldHR5LmhhbmRsZXInIHZlcnNpb249JzYuMS43Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vcnRiYXkuamV0dHknIHZlcnNpb249JzYuMS43Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vcnRiYXkuamV0dHkud2ViYXBwJyB2ZXJzaW9uPSc2LjEuNycvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScxMyc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubmV0LnNzbCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VjdXJpdHkuY2VydCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldCcgcmFuZ2U9JzIuNS4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldC5odHRwJyByYW5nZT0nMi41LjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwucGFyc2VycycgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vcnRiYXkuY29tcG9uZW50JyByYW5nZT0nNi4xLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW9ydGJheS5sb2cnIHJhbmdlPSc2LjEuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LnNlcnZsZXQnIHJhbmdlPSc2LjEuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LnRocmVhZCcgcmFuZ2U9JzYuMS4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vcnRiYXkudXRpbCcgcmFuZ2U9JzYuMS4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vcnRiYXkudXRpbC5hamF4JyByYW5nZT0nNi4xLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcueG1sLnNheCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnhtbC5zYXguaGVscGVycycgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLm1vcnRiYXkuamV0dHkuc2VydmVyJyB2ZXJzaW9uPSc2LjEuNy52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtRG9jVVJMOiBodHRwOi8vamV0dHkubW9ydGJheS5vcmcKLWltcGxlbWVudGF0aW9uLXZlcnNpb246IDYuMS43Ci1JZ25vcmUtUGFja2FnZTogb3JnLm1vcnRiYXkuamV0dHkuYmlvLG9yZy5tb3J0YmF5LnNlcnZsZXQuamV0dHksb3JnLm1vcnRiYXkuamV0dHkubmlvLG9yZy5tb3J0YmF5LnJlc291cmNlLG9yZy5tb3J0YmF5LmlvLm5pbyxvcmcubW9ydGJheS5qZXR0eS5zZWN1cml0eSxvcmcubW9ydGJheS5qZXR0eS5kZXBsb3llcixvcmcubW9ydGJheS54bWwsb3JnLm1vcnRiYXkuaW8uYmlvLG9yZy5tb3J0YmF5LmpldHR5LnNlcnZsZXQsb3JnLm1vcnRiYXkuamV0dHkuaGFuZGxlcixvcmcubW9ydGJheS5pbyxvcmcubW9ydGJheS5qZXR0eSxvcmcubW9ydGJheS5qZXR0eS53ZWJhcHAKLUNyZWF0ZWQtQnk6IDEuNS4wXzEzIChTdW4gTWljcm9zeXN0ZW1zIEluYy4pCi1CdWlsdC1CeTogZ3JlZ3cKLUJ1bmRsZS1WZW5kb3I6IE1vcnQgQmF5IENvbnN1bHRpbmcKLXVybDogaHR0cDovL2pldHR5Lm1vcnRiYXkub3JnCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLUJ1bmRsZS1EZXNjcmlwdGlvbjogSmV0dHkgc2VydmVyIGNvcmUKLUltcG9ydC1QYWNrYWdlOiBqYXZheC5uZXQuc3NsLGphdmF4LnNlY3VyaXR5LmNlcnQsamF2YXguc2VydmxldDt2ZXJzaW9uPTIuNSxqYXZheC5zZXJ2bGV0Lmh0dHA7dmVyc2lvbj0yLjUsamF2YXgueG1sLnBhcnNlcnMsb3JnLm1vcnRiYXkuY29tcG9uZW50O3ZlcnNpb249Ni4xLG9yZy5tb3J0YmF5LmxvZzt2ZXJzaW9uPTYuMSxvcmcubW9ydGJheS5zZXJ2bGV0O3ZlcnNpb249Ni4xLG9yZy5tb3J0YmF5LnRocmVhZDt2ZXJzaW9uPTYuMSxvcmcubW9ydGJheS51dGlsO3ZlcnNpb249Ni4xLG9yZy5tb3J0YmF5LnV0aWwuYWpheDt2ZXJzaW9uPTYuMSxvcmcueG1sLnNheCxvcmcueG1sLnNheC5oZWxwZXJzCi1BcmNoaXZlci1WZXJzaW9uOiBQbGV4dXMgQXJjaGl2ZXIKLUJ1bmRsZS1OYW1lOiBKZXR0eSBTZXJ2ZXIKLUJ1bmRsZS1MaWNlbnNlOiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLW1vZGU6IGRldmVsb3BtZW50Ci1FeHBvcnQtUGFja2FnZTogb3JnLm1vcnRiYXkuamV0dHkuYmlvO3VzZXM6PSZxdW90O29yZy5tb3J0YmF5LmxvZyxvcmcubW9ydGJheS50aHJlYWQsb3JnLm1vcnRiYXkuaW8uYmlvLG9yZy5tb3J0YmF5LmlvLG9yZy5tb3J0YmF5LmpldHR5JnF1b3Q7O3ZlcnNpb249Ni4xLjcsb3JnLm1vcnRiYXkuc2VydmxldC5qZXR0eTt1c2VzOj0mcXVvdDtqYXZheC5zZXJ2bGV0Lmh0dHAsb3JnLm1vcnRiYXkuc2VydmxldCxvcmcubW9ydGJheS5qZXR0eSZxdW90Ozt2ZXJzaW9uPTYuMS43LG9yZy5tb3J0YmF5LmpldHR5Lm5pbzt1c2VzOj0mcXVvdDtvcmcubW9ydGJheS5sb2csb3JnLm1vcnRiYXkudGhyZWFkLG9yZy5tb3J0YmF5LmlvLG9yZy5tb3J0YmF5LmpldHR5LG9yZy5tb3J0YmF5LnV0aWwuYWpheCxvcmcubW9ydGJheS5pby5uaW8mcXVvdDs7dmVyc2lvbj02LjEuNyxvcmcubW9ydGJheS5yZXNvdXJjZTt1c2VzOj0mcXVvdDtvcmcubW9ydGJheS5sb2csb3JnLm1vcnRiYXkudXRpbCZxdW90Ozt2ZXJzaW9uPTYuMS43LG9yZy5tb3J0YmF5LmlvLm5pbzt1c2VzOj0mcXVvdDtvcmcubW9ydGJheS5sb2csb3JnLm1vcnRiYXkuY29tcG9uZW50LG9yZy5tb3J0YmF5LnRocmVhZCxvcmcubW9ydGJheS5pbyxvcmcubW9ydGJheS5qZXR0eSZxdW90Ozt2ZXJzaW9uPTYuMS43LG9yZy5tb3J0YmF5LmpldHR5LnNlY3VyaXR5O3VzZXM6PSZxdW90O29yZy5tb3J0YmF5LnV0aWwsb3JnLm1vcnRiYXkuY29tcG9uZW50LGphdmF4LnNlcnZsZXQuaHR0cCxvcmcubW9ydGJheS5qZXR0eS5iaW8samF2YXguc2VjdXJpdHkuY2VydCxvcmcubW9ydGJheS5yZXNvdXJjZSxvcmcubW9ydGJheS5sb2csamF2YXguc2VydmxldCxvcmcubW9ydGJheS5pby5iaW8sb3JnLm1vcnRiYXkuamV0dHkuc2VydmxldCxvcmcubW9ydGJheS5pbyxvcmcubW9ydGJheS5qZXR0eS5oYW5kbGVyLG9yZy5tb3J0YmF5LmpldHR5LndlYmFwcCxvcmcubW9ydGJheS5qZXR0eSxqYXZheC5uZXQuc3NsJnF1b3Q7O3ZlcnNpb249Ni4xLjcsb3JnLm1vcnRiYXkuamV0dHkuZGVwbG95ZXI7dXNlczo9JnF1b3Q7b3JnLm1vcnRiYXkudXRpbCxvcmcubW9ydGJheS5jb21wb25lbnQsb3JnLm1vcnRiYXkucmVzb3VyY2Usb3JnLm1vcnRiYXkubG9nLG9yZy5tb3J0YmF5LnhtbCxvcmcubW9ydGJheS5qZXR0eS5oYW5kbGVyLG9yZy5tb3J0YmF5LmpldHR5LG9yZy5tb3J0YmF5LmpldHR5LndlYmFwcCZxdW90Ozt2ZXJzaW9uPTYuMS43LG9yZy5tb3J0YmF5LnhtbDt1c2VzOj0mcXVvdDtvcmcubW9ydGJheS51dGlsLG9yZy5tb3J0YmF5LmNvbXBvbmVudCxvcmcueG1sLnNheCxvcmcubW9ydGJheS5yZXNvdXJjZSxvcmcubW9ydGJheS5sb2csamF2YXgueG1sLnBhcnNlcnMsb3JnLnhtbC5zYXguaGVscGVycyZxdW90Ozt2ZXJzaW9uPTYuMS43LG9yZy5tb3J0YmF5LmlvLmJpbzt1c2VzOj1vcmcubW9ydGJheS5pbzt2ZXJzaW9uPTYuMS43LG9yZy5tb3J0YmF5LmpldHR5LnNlcnZsZXQ7dXNlczo9JnF1b3Q7b3JnLm1vcnRiYXkudXRpbCxqYXZheC5zZXJ2bGV0Lmh0dHAsb3JnLm1vcnRiYXkuY29tcG9uZW50LG9yZy5tb3J0YmF5LmpldHR5Lm5pbyxvcmcubW9ydGJheS5yZXNvdXJjZSxvcmcubW9ydGJheS5pby5uaW8sb3JnLm1vcnRiYXkuamV0dHkuc2VjdXJpdHksb3JnLm1vcnRiYXkubG9nLGphdmF4LnNlcnZsZXQsb3JnLm1vcnRiYXkuaW8sb3JnLm1vcnRiYXkuamV0dHkuaGFuZGxlcixvcmcubW9ydGJheS5qZXR0eSZxdW90Ozt2ZXJzaW9uPTYuMS43LG9yZy5tb3J0YmF5LmlvO3VzZXM6PW9yZy5tb3J0YmF5LnV0aWw7dmVyc2lvbj02LjEuNyxvcmcubW9ydGJheS5qZXR0eS5oYW5kbGVyO3VzZXM6PSZxdW90O29yZy5tb3J0YmF5LnV0aWwsb3JnLm1vcnRiYXkuY29tcG9uZW50LGphdmF4LnNlcnZsZXQuaHR0cCxvcmcubW9ydGJheS5yZXNvdXJjZSxvcmcubW9ydGJheS5sb2csamF2YXguc2VydmxldCxvcmcubW9ydGJheS5qZXR0eS5zZXJ2bGV0LG9yZy5tb3J0YmF5LmlvLG9yZy5tb3J0YmF5LmpldHR5LndlYmFwcCxvcmcubW9ydGJheS5qZXR0eSZxdW90Ozt2ZXJzaW9uPTYuMS43LG9yZy5tb3J0YmF5LmpldHR5O3VzZXM6PSZxdW90O29yZy5tb3J0YmF5LnV0aWwsamF2YXguc2VydmxldC5odHRwLG9yZy5tb3J0YmF5LmNvbXBvbmVudCxvcmcubW9ydGJheS5qZXR0eS5iaW8sb3JnLm1vcnRiYXkudGhyZWFkLG9yZy5tb3J0YmF5LnJlc291cmNlLG9yZy5tb3J0YmF5LmlvLm5pbyxvcmcubW9ydGJheS5qZXR0eS5zZWN1cml0eSxvcmcubW9ydGJheS5sb2csamF2YXguc2VydmxldCxvcmcubW9ydGJheS5qZXR0eS5zZXJ2bGV0LG9yZy5tb3J0YmF5LmpldHR5LmhhbmRsZXIsb3JnLm1vcnRiYXkuaW8sb3JnLm1vcnRiYXkuamV0dHkud2ViYXBwLG9yZy5tb3J0YmF5LnV0aWwuYWpheCZxdW90Ozt2ZXJzaW9uPTYuMS43LG9yZy5tb3J0YmF5LmpldHR5LndlYmFwcDt1c2VzOj0mcXVvdDtvcmcubW9ydGJheS51dGlsLGphdmF4LnNlcnZsZXQuaHR0cCxvcmcubW9ydGJheS5yZXNvdXJjZSxvcmcubW9ydGJheS5qZXR0eS5zZWN1cml0eSxvcmcubW9ydGJheS5qZXR0eS5kZXBsb3llcixvcmcubW9ydGJheS5sb2csamF2YXguc2VydmxldCxvcmcubW9ydGJheS54bWwsb3JnLm1vcnRiYXkuamV0dHkuc2VydmxldCxvcmcubW9ydGJheS5qZXR0eS5oYW5kbGVyLG9yZy5tb3J0YmF5LmpldHR5JnF1b3Q7O3ZlcnNpb249Ni4xLjcKLUJ1bmRsZS1WZXJzaW9uOiA2LjEuNy52MjAwODAzMDYxODExCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CbmQtTGFzdE1vZGlmaWVkOiAxMTk4NDYzOTExOTY1Ci1wYWNrYWdlOiBvcmcubW9ydGJheQotQnVpbGQtSmRrOiAxLjUuMF8xMwotVG9vbDogQm5kLTAuMC4xNjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5tb3J0YmF5LmpldHR5LnNlcnZlcgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5sb2c0aicgdmVyc2lvbj0nMS4yLjgudjIwMDgwMzA2MTkxMCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmxvZzRqJyByYW5nZT0nWzAuMC4wLDEuMi44LnYyMDA4MDMwNjE5MTApJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5QTFVHSU5fTkFNRScgdmFsdWU9J0FwYWNoZSBKYWthcnRhIGxvZzRqIFBsdWctaW4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULlBMVUdJTl9QUk9WSURFUicgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclUExVR0lOX05BTUUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclUExVR0lOX1BST1ZJREVSJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMjUnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqJyB2ZXJzaW9uPScxLjIuOC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqJyB2ZXJzaW9uPScxLjIuOC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0aicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqLmNoYWluc2F3JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGouY29uZmlnJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGouaGVscGVycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqLmpkYmMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai5qbXgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai5sZjUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai5sZjUuY29uZmlnJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGoubGY1LnV0aWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai5sZjUudmlld2VyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGoubGY1LnZpZXdlci5jYXRlZ29yeWV4cGxvcmVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGoubGY1LnZpZXdlci5jb25maWd1cmUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai5sZjUudmlld2VyLmltYWdlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqLm5ldCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqLm50JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGoub3InIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai5vci5qbXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai5vci5zYXgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai5zcGknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai52YXJpYScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqLnhtbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUubG9nNGonIHZlcnNpb249JzEuMi44LnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLUJ1bmRsZS1DbGFzc1BhdGg6IC4KLUJ1bmRsZS1OYW1lOiAlUExVR0lOX05BTUUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1CdWRkeVBvbGljeTogcmVnaXN0ZXJlZAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmxvZzRqCi1CdW5kbGUtVmVyc2lvbjogMS4yLjgudjIwMDgwMzA2MTkxMAotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUubG9nNGosb3JnLmFwYWNoZS5sb2c0ai5jaGFpbnNhdyxvcmcuYXBhY2hlLmxvZzRqLmNvbmZpZyxvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMsb3JnLmFwYWNoZS5sb2c0ai5qZGJjLG9yZy5hcGFjaGUubG9nNGouam14LG9yZy5hcGFjaGUubG9nNGoubGY1LG9yZy5hcGFjaGUubG9nNGoubGY1LmNvbmZpZyxvcmcuYXBhY2hlLmxvZzRqLmxmNS51dGlsLG9yZy5hcGFjaGUubG9nNGoubGY1LnZpZXdlcixvcmcuYXBhY2hlLmxvZzRqLmxmNS52aWV3ZXIuY2F0ZWdvcnlleHBsb3JlcixvcmcuYXBhY2hlLmxvZzRqLmxmNS52aWV3ZXIuY29uZmlndXJlLG9yZy5hcGFjaGUubG9nNGoubGY1LnZpZXdlci5pbWFnZXMsb3JnLmFwYWNoZS5sb2c0ai5uZXQsb3JnLmFwYWNoZS5sb2c0ai5udCxvcmcuYXBhY2hlLmxvZzRqLm9yLG9yZy5hcGFjaGUubG9nNGoub3Iuam1zLG9yZy5hcGFjaGUubG9nNGoub3Iuc2F4LG9yZy5hcGFjaGUubG9nNGouc3BpLG9yZy5hcGFjaGUubG9nNGoudmFyaWEsb3JnLmFwYWNoZS5sb2c0ai54bWwKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5uZXQuc291cmNlJyB2ZXJzaW9uPScxLjQuMS52MjAwODAzMDcxOTM1JyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5uZXQuc291cmNlJyByYW5nZT0nWzAuMC4wLDEuNC4xLnYyMDA4MDMwNzE5MzUpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBDb21tb25zIE5ldCBTb3VyY2UgQnVuZGxlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLm5ldC5zb3VyY2UnIHZlcnNpb249JzEuNC4xLnYyMDA4MDMwNzE5MzUnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5uZXQuc291cmNlJyB2ZXJzaW9uPScxLjQuMS52MjAwODAzMDcxOTM1Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMubmV0LnNvdXJjZScgdmVyc2lvbj0nMS40LjEudjIwMDgwMzA3MTkzNScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjQuMS52MjAwODAzMDcxOTM1Ci1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuY29tbW9ucy5uZXQuc291cmNlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUuY29tbW9ucy5uZXQ7dmVyc2lvbj0mcXVvdDsxLjQuMS52MjAwODAzMDcxOTM1JnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdqYXZhX2N1cC5ydW50aW1lJyB2ZXJzaW9uPScwLjEwLjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdqYXZhX2N1cC5ydW50aW1lJyByYW5nZT0nWzAuMC4wLDAuMTAuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdKYXZhIEN1cCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNSc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmFfY3VwLnJ1bnRpbWUnIHZlcnNpb249JzAuMTAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdqYXZhX2N1cC5ydW50aW1lJyB2ZXJzaW9uPScwLjEwLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmFfY3VwLnJ1bnRpbWUnIHZlcnNpb249JzAuMTAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0namF2YV9jdXAucnVudGltZScgdmVyc2lvbj0nMC4xMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZXJzaW9uOiAwLjEwLjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IGphdmFfY3VwLnJ1bnRpbWU7dmVyc2lvbj0mcXVvdDswLjEwLjAmcXVvdDsKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLVN5bWJvbGljTmFtZTogamF2YV9jdXAucnVudGltZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuYmF0aWsueG1sLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmJhdGlrLnhtbC5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIFhNTCBTb3VyY2UgQnVuZGxlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay54bWwuc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnhtbC5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYmF0aWsueG1sLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjYuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmF0aWsueG1sLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmJhdGlrLnhtbDt2ZXJzaW9uPSZxdW90OzEuNi4wLnYyMDA4MDMwNjE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5jbGknIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmNsaScgcmFuZ2U9J1swLjAuMCwxLjAuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgSmFrYXJ0YSBDb21tb25zIENMSScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNSc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jbGknIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jbGknIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuY2xpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzInPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxhbmcnIHJhbmdlPSdbMi4wLjAsMy4wLjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZycgcmFuZ2U9J1sxLjAuMCwyLjAuMCknLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuY2xpJyB2ZXJzaW9uPScxLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuMC4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpO3ZlcnNpb249JnF1b3Q7MS4wLjAmcXVvdDsKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZztidW5kbGUtdmVyc2lvbj0mcXVvdDtbMi4wLjAsMy4wLjApJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nO2J1bmRsZS12ZXJzaW9uPSZxdW90O1sxLjAuMCwyLjAuMCkmcXVvdDsKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5jb21tb25zLmNsaQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLnNvdXJjZScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLnNvdXJjZScgcmFuZ2U9J1swLjAuMCwxLjAuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgSmFrYXJ0YSBDb21tb25zIENMSScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jbGkuc291cmNlJyB2ZXJzaW9uPScxLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLnNvdXJjZScgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmNsaS5zb3VyY2UnIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAudjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmNvbW1vbnMuY2xpO3ZlcnNpb249JnF1b3Q7MS4wLjAudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5hbnQnIHZlcnNpb249JzEuNi41LnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5hbnQnIHJhbmdlPSdbMC4wLjAsMS42LjUudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEFudCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNzUnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmFudCcgdmVyc2lvbj0nMS42LjUudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5hbnQnIHZlcnNpb249JzEuNi41LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LmxvYWRlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmN2c2xpYicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY20nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5yZXNvbHZlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaTE4bicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pZGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaW1hZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuajJlZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhY2MnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuamF2YWgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuamRlcGVuZCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qbGluaycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanNwLmNvbXBpbGVycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qdW5pdC54c2wnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubWV0YW1hdGEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmF0aXZlMmFzY2lpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5ldCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wZXJmb3JjZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5wdmNzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNjbScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zY3JpcHQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLmJ5dGVjb2RlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2EuYnl0ZWNvZGUuYXR0cmlidXRlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3MnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc291bmQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3BsYXNoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNzaCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zdGFydGVhbScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC51bml4JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC53aW5kb3dzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMubWFwcGVycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5kZXBlbmQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuaW1hZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb2x2ZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5kZXBlbmQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5kZXBlbmQuYmNlbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLmZhY2FkZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLm9wdGlvbmFsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwucmVnZXhwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYnppcDInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5tYWlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMudGFyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuemlwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzEnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5hbnQnIHZlcnNpb249JzEuNi41LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScyJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS50b29scy5hbnQsb3JnLmFwYWNoZS50b29scy5hbnQuZmlsdGVycyxvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLnV0aWwsb3JnLmFwYWNoZS50b29scy5hbnQuaGVscGVyLG9yZy5hcGFjaGUudG9vbHMuYW50LmlucHV0LG9yZy5hcGFjaGUudG9vbHMuYW50LmxhdW5jaCxvcmcuYXBhY2hlLnRvb2xzLmFudC5saXN0ZW5lcixvcmcuYXBhY2hlLnRvb2xzLmFudC5sb2FkZXIsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29tcGlsZXJzLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmNvbmRpdGlvbixvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jdnNsaWIsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuZW1haWwsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2NtLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmNsZWFyY2FzZSxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZGVwZW5kLmNvbnN0YW50cG9vbCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kb3RuZXQsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZWpiLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbixvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5leHRlbnNpb24ucmVzb2x2ZXJzLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmkxOG4sb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaWRlLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmltYWdlLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmoyZWUsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuamF2YWNjLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmphdmFoLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpkZXBlbmQsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuamxpbmssb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanNwLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcC5jb21waWxlcnMsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuanVuaXQueHNsLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm1ldGFtYXRhLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLm5hdGl2ZTJhc2NpaSxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uZXQsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucGVyZm9yY2Usb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwucHZjcyxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zY20sb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2NyaXB0LG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNpdHJha2Esb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2l0cmFrYS5ieXRlY29kZSxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zaXRyYWthLmJ5dGVjb2RlLmF0dHJpYnV0ZXMsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc29zLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNvdW5kLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNwbGFzaCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zc2gsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3RhcnRlYW0sb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwudW5peCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC52c3Msb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwud2luZG93cyxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5ybWljLG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm1hcHBlcnMsb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwsb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMub3B0aW9uYWwuZGVwZW5kLG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmltYWdlLG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc29sdmVyLG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycyxvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5zZWxlY3RvcnMubW9kaWZpZWRzZWxlY3RvcixvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLmJjZWwsb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5mYWNhZGUsb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5vcHRpb25hbCxvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cCxvcmcuYXBhY2hlLnRvb2xzLmJ6aXAyLG9yZy5hcGFjaGUudG9vbHMubWFpbCxvcmcuYXBhY2hlLnRvb2xzLnRhcixvcmcuYXBhY2hlLnRvb2xzLnppcAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4yCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5vc2dpCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjYuNS52MjAwODAzMDYxODExCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmFudAotQnVuZGxlLUNsYXNzUGF0aDogbGliL2FudC5qYXIsbGliL2FudC1hbnRsci5qYXIsbGliL2FudC1hcGFjaGUtYmNlbC5qYXIsbGliL2FudC1hcGFjaGUtYnNmLmphcixsaWIvYW50LWFwYWNoZS1sb2c0ai5qYXIsbGliL2FudC1hcGFjaGUtb3JvLmphcixsaWIvYW50LWFwYWNoZS1yZWdleHAuamFyLGxpYi9hbnQtYXBhY2hlLXJlc29sdmVyLmphcixsaWIvYW50LWNvbW1vbnMtbG9nZ2luZy5qYXIsbGliL2FudC1jb21tb25zLW5ldC5qYXIsbGliL2FudC1pY29udHJhY3QuamFyLGxpYi9hbnQtamFpLmphcixsaWIvYW50LWphdmFtYWlsLmphcixsaWIvYW50LWpkZXBlbmQuamFyLGxpYi9hbnQtam1mLmphcixsaWIvYW50LWpzY2guamFyLGxpYi9hbnQtanVuaXQuamFyLGxpYi9hbnQtbGF1bmNoZXIuamFyLGxpYi9hbnQtbmV0cmV4eC5qYXIsbGliL2FudC1ub2RlcHMuamFyLGxpYi9hbnQtc3RhcnRlYW0uamFyLGxpYi9hbnQtc3R5bGVib29rLmphcixsaWIvYW50LXN3aW5nLmphcixsaWIvYW50LXRyYXguamFyLGxpYi9hbnQtdmFqLmphcixsaWIvYW50LXdlYmxvZ2ljLmphcixsaWIvYW50LXhhbGFuMS5qYXIsbGliL2FudC14c2xwLmphcgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSd6aXBwZWQnPgotICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2NvbS5zdW4uc3luZGljYXRpb24nIHZlcnNpb249JzAuOS4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nY29tLnN1bi5zeW5kaWNhdGlvbicgcmFuZ2U9J1swLjAuMCwwLjkuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdSc3MgYW5kIGF0T00gdXRpbGl0aUVzIChST01FKScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdjb20uc3VuLnN5bmRpY2F0aW9uJyB2ZXJzaW9uPScwLjkuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdjb20uc3VuLnN5bmRpY2F0aW9uJyB2ZXJzaW9uPScwLjkuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLnN1bi5zeW5kaWNhdGlvbi5mZWVkJyB2ZXJzaW9uPScwLjkuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5zdW4uc3luZGljYXRpb24uZmVlZC5hdG9tJyB2ZXJzaW9uPScwLjkuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5zdW4uc3luZGljYXRpb24uZmVlZC5pbXBsJyB2ZXJzaW9uPScwLjkuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5zdW4uc3luZGljYXRpb24uZmVlZC5tb2R1bGUnIHZlcnNpb249JzAuOS4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLnN1bi5zeW5kaWNhdGlvbi5mZWVkLm1vZHVsZS5pbXBsJyB2ZXJzaW9uPScwLjkuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5zdW4uc3luZGljYXRpb24uZmVlZC5yc3MnIHZlcnNpb249JzAuOS4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLnN1bi5zeW5kaWNhdGlvbi5mZWVkLnN5bmQnIHZlcnNpb249JzAuOS4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLnN1bi5zeW5kaWNhdGlvbi5mZWVkLnN5bmQuaW1wbCcgdmVyc2lvbj0nMC45LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uc3VuLnN5bmRpY2F0aW9uLmlvJyB2ZXJzaW9uPScwLjkuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5zdW4uc3luZGljYXRpb24uaW8uaW1wbCcgdmVyc2lvbj0nMC45LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPSc3Jz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuamRvbScgcmFuZ2U9JzEuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmpkb20uYWRhcHRlcnMnIHJhbmdlPScxLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5qZG9tLmZpbHRlcicgcmFuZ2U9JzEuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmpkb20uaW5wdXQnIHJhbmdlPScxLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5qZG9tLm91dHB1dCcgcmFuZ2U9JzEuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmpkb20udHJhbnNmb3JtJyByYW5nZT0nMS4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuamRvbS54cGF0aCcgcmFuZ2U9JzEuMC4wJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nY29tLnN1bi5zeW5kaWNhdGlvbicgdmVyc2lvbj0nMC45LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMC45LjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IGNvbS5zdW4uc3luZGljYXRpb24uZmVlZDt2ZXJzaW9uPSZxdW90OzAuOS4wJnF1b3Q7LGNvbS5zdW4uc3luZGljYXRpb24uZmVlZC5hdG9tO3ZlcnNpb249JnF1b3Q7MC45LjAmcXVvdDssY29tLnN1bi5zeW5kaWNhdGlvbi5mZWVkLmltcGw7dmVyc2lvbj0mcXVvdDswLjkuMCZxdW90Oyxjb20uc3VuLnN5bmRpY2F0aW9uLmZlZWQubW9kdWxlO3ZlcnNpb249JnF1b3Q7MC45LjAmcXVvdDssY29tLnN1bi5zeW5kaWNhdGlvbi5mZWVkLm1vZHVsZS5pbXBsO3ZlcnNpb249JnF1b3Q7MC45LjAmcXVvdDssY29tLnN1bi5zeW5kaWNhdGlvbi5mZWVkLnJzczt2ZXJzaW9uPSZxdW90OzAuOS4wJnF1b3Q7LGNvbS5zdW4uc3luZGljYXRpb24uZmVlZC5zeW5kO3ZlcnNpb249JnF1b3Q7MC45LjAmcXVvdDssY29tLnN1bi5zeW5kaWNhdGlvbi5mZWVkLnN5bmQuaW1wbDt2ZXJzaW9uPSZxdW90OzAuOS4wJnF1b3Q7LGNvbS5zdW4uc3luZGljYXRpb24uaW87dmVyc2lvbj0mcXVvdDswLjkuMCZxdW90Oyxjb20uc3VuLnN5bmRpY2F0aW9uLmlvLmltcGw7dmVyc2lvbj0mcXVvdDswLjkuMCZxdW90OwotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLnN1bi5zeW5kaWNhdGlvbgotSW1wb3J0LVBhY2thZ2U6IG9yZy5qZG9tO3ZlcnNpb249JnF1b3Q7MS4wLjAmcXVvdDssb3JnLmpkb20uYWRhcHRlcnM7dmVyc2lvbj0mcXVvdDsxLjAuMCZxdW90OyxvcmcuamRvbS5maWx0ZXI7dmVyc2lvbj0mcXVvdDsxLjAuMCZxdW90OyxvcmcuamRvbS5pbnB1dDt2ZXJzaW9uPSZxdW90OzEuMC4wJnF1b3Q7LG9yZy5qZG9tLm91dHB1dDt2ZXJzaW9uPSZxdW90OzEuMC4wJnF1b3Q7LG9yZy5qZG9tLnRyYW5zZm9ybTt2ZXJzaW9uPSZxdW90OzEuMC4wJnF1b3Q7LG9yZy5qZG9tLnhwYXRoO3ZlcnNpb249JnF1b3Q7MS4wLjAmcXVvdDsKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmx1Y2VuZS5zb3VyY2UnIHZlcnNpb249JzEuNC4zLnYyMDA4MDMwNjE5MTAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5sdWNlbmUuc291cmNlJyByYW5nZT0nWzAuMC4wLDEuNC4zLnYyMDA4MDMwNjE5MTApJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQubHVjZW5lX3BsdWdpbl9uYW1lJyB2YWx1ZT0nQXBhY2hlIEx1Y2VuZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJWx1Y2VuZV9wbHVnaW5fbmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuc291cmNlJyB2ZXJzaW9uPScxLjQuMy52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5zb3VyY2UnIHZlcnNpb249JzEuNC4zLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUubHVjZW5lLnNvdXJjZScgdmVyc2lvbj0nMS40LjMudjIwMDgwMzA2MTkxMCcvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlbHVjZW5lX3BsdWdpbl9uYW1lCi1CdW5kbGUtVmVyc2lvbjogMS40LjMudjIwMDgwMzA2MTkxMAotRWNsaXBzZS1MYXp5U3RhcnQ6IGZhbHNlCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmFwYWNoZS5sdWNlbmU7dmVyc2lvbj0mcXVvdDsxLjQuMy52MjAwODAzMDYxOTEwJnF1b3Q7Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmx1Y2VuZS5zb3VyY2UKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0JyB2ZXJzaW9uPScxLjYuNi52MjAwODAzMDYxOTEwJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQnIHJhbmdlPSdbMC4wLjAsMS42LjYudjIwMDgwMzA2MTkxMCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1WZW5kb3IuMCcgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtTmFtZS4wJyB2YWx1ZT0nTW96aWxsYSBSaGlubycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJUJ1bmRsZS1OYW1lLjAnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclQnVuZGxlLVZlbmRvci4wJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMjEnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0JyB2ZXJzaW9uPScxLjYuNi52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0JyB2ZXJzaW9uPScxLjYuNi52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vemlsbGEuY2xhc3NmaWxlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vemlsbGEuamF2YXNjcmlwdC5jb250aW51YXRpb25zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQuZGVidWcnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vemlsbGEuamF2YXNjcmlwdC5qZGsxMScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0LmpkazEzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQub3B0aW1pemVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQucmVnZXhwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQucmVzb3VyY2VzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQuc2VyaWFsaXplJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQudG9vbHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vemlsbGEuamF2YXNjcmlwdC50b29scy5pZHN3aXRjaCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLmpzYycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLnJlc291cmNlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLnNoZWxsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQueG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3ppbGxhLmphdmFzY3JpcHQueG1saW1wbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScxNCc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnRyYW5zZm9ybS5kb20nIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nLmV2ZW50JyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcuYm9yZGVyJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcudGV4dCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcuZmlsZWNob29zZXInIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nLnRhYmxlJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwubmFtZXNwYWNlJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwudHJhbnNmb3JtJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcueG1sLnNheCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcudHJlZScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5wYXJzZXJzJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcubW96aWxsYS5qYXZhc2NyaXB0JyB2ZXJzaW9uPScxLjYuNi52MjAwODAzMDYxOTEwJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1NYWluLUNsYXNzOiBvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLnNoZWxsLk1haW4KLUltcG9ydC1QYWNrYWdlOiBqYXZheC54bWwudHJhbnNmb3JtLmRvbSxqYXZheC5zd2luZy5ldmVudCxvcmcudzNjLmRvbSxqYXZheC5zd2luZy5ib3JkZXIsamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0samF2YXguc3dpbmcudGV4dCxqYXZheC5zd2luZy5maWxlY2hvb3NlcixqYXZheC5zd2luZy50YWJsZSxqYXZheC54bWwubmFtZXNwYWNlLGphdmF4LnhtbC50cmFuc2Zvcm0sb3JnLnhtbC5zYXgsamF2YXguc3dpbmcudHJlZSxqYXZheC5zd2luZyxqYXZheC54bWwucGFyc2VycwotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLm1vemlsbGEuamF2YXNjcmlwdAotQnVuZGxlLVZlcnNpb246IDEuNi42LnYyMDA4MDMwNjE5MTAKLUV4cG9ydC1QYWNrYWdlOiBvcmcubW96aWxsYS5jbGFzc2ZpbGUsb3JnLm1vemlsbGEuamF2YXNjcmlwdCxvcmcubW96aWxsYS5qYXZhc2NyaXB0LmNvbnRpbnVhdGlvbnMsb3JnLm1vemlsbGEuamF2YXNjcmlwdC5kZWJ1ZyxvcmcubW96aWxsYS5qYXZhc2NyaXB0LmpkazExLG9yZy5tb3ppbGxhLmphdmFzY3JpcHQuamRrMTMsb3JnLm1vemlsbGEuamF2YXNjcmlwdC5vcHRpbWl6ZXIsb3JnLm1vemlsbGEuamF2YXNjcmlwdC5yZWdleHAsb3JnLm1vemlsbGEuamF2YXNjcmlwdC5yZXNvdXJjZXMsb3JnLm1vemlsbGEuamF2YXNjcmlwdC5zZXJpYWxpemUsb3JnLm1vemlsbGEuamF2YXNjcmlwdC50b29scyxvcmcubW96aWxsYS5qYXZhc2NyaXB0LnRvb2xzLmlkc3dpdGNoLG9yZy5tb3ppbGxhLmphdmFzY3JpcHQudG9vbHMuanNjLG9yZy5tb3ppbGxhLmphdmFzY3JpcHQudG9vbHMucmVzb3VyY2VzLG9yZy5tb3ppbGxhLmphdmFzY3JpcHQudG9vbHMuc2hlbGwsb3JnLm1vemlsbGEuamF2YXNjcmlwdC54bWwsb3JnLm1vemlsbGEuamF2YXNjcmlwdC54bWxpbXBsCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcub2JqZWN0d2ViLmFzbScgdmVyc2lvbj0nMy4wLjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcub2JqZWN0d2ViLmFzbScgcmFuZ2U9J1swLjAuMCwzLjAuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBU00nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzExJz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLm9iamVjdHdlYi5hc20nIHZlcnNpb249JzMuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5vYmplY3R3ZWIuYXNtJyB2ZXJzaW9uPSczLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9iamVjdHdlYi5hc20nIHZlcnNpb249JzMuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9iamVjdHdlYi5hc20uY29tbW9ucycgdmVyc2lvbj0nMy4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub2JqZWN0d2ViLmFzbS5zaWduYXR1cmUnIHZlcnNpb249JzMuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9iamVjdHdlYi5hc20udHJlZScgdmVyc2lvbj0nMy4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub2JqZWN0d2ViLmFzbS50cmVlLmFuYWx5c2lzJyB2ZXJzaW9uPSczLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vYmplY3R3ZWIuYXNtLnV0aWwnIHZlcnNpb249JzMuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9iamVjdHdlYi5hc20ueG1sJyB2ZXJzaW9uPSczLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLm9iamVjdHdlYi5hc20nIHZlcnNpb249JzMuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjAuMC52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogb3JnLm9iamVjdHdlYi5hc207dmVyc2lvbj0mcXVvdDszLjAuMCZxdW90Oyxvcmcub2JqZWN0d2ViLmFzbS5jb21tb25zO3ZlcnNpb249JnF1b3Q7My4wLjAmcXVvdDssb3JnLm9iamVjdHdlYi5hc20uc2lnbmF0dXJlO3ZlcnNpb249JnF1b3Q7My4wLjAmcXVvdDssb3JnLm9iamVjdHdlYi5hc20udHJlZTt2ZXJzaW9uPSZxdW90OzMuMC4wJnF1b3Q7LG9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuYW5hbHlzaXM7dmVyc2lvbj0mcXVvdDszLjAuMCZxdW90Oyxvcmcub2JqZWN0d2ViLmFzbS51dGlsO3ZlcnNpb249JnF1b3Q7My4wLjAmcXVvdDssb3JnLm9iamVjdHdlYi5hc20ueG1sO3ZlcnNpb249JnF1b3Q7My4wLjAmcXVvdDsKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLm9iamVjdHdlYi5hc20KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3Quc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dC5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIEFXVCBVdGlsaXRpZXMgU291cmNlIEJ1bmRsZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dC5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dC5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dC5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMS42LjAudjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3Quc291cmNlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dDt2ZXJzaW9uPSZxdW90OzEuNi4wLnYyMDA4MDMwNjE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUueGFsYW4nIHZlcnNpb249JzIuNy4wLnYyMDA4MDMwNjIwMjYnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS54YWxhbicgcmFuZ2U9J1swLjAuMCwyLjcuMC52MjAwODAzMDYyMDI2KScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdYYWxhbi1KYXZhJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Nic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4nIHZlcnNpb249JzIuNy4wLnYyMDA4MDMwNjIwMjYnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4nIHZlcnNpb249JzIuNy4wLnYyMDA4MDMwNjIwMjYnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdNRVRBLUlORi5zZXJ2aWNlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4uY2xpZW50JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4uZXh0ZW5zaW9ucycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLmxpYicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLmxpYi5zcWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3InIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbi5yZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbi5zZXJpYWxpemUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbi50ZW1wbGF0ZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbi50cmFjZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLnRyYW5zZm9ybWVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4ueHNsdCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLnhzbHRjJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4ueHNsdGMuY21kbGluZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLmNtZGxpbmUuZ2V0b3B0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4ueHNsdGMuY29tcGlsZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5jb21waWxlci51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4ueHNsdGMuZG9tJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4ueHNsdGMucnVudGltZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnJ1bnRpbWUub3V0cHV0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGFsYW4ueHNsdGMudHJheCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnV0aWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWwuZHRtJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLmR0bS5yZWYnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWwuZHRtLnJlZi5kb20yZHRtJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLmR0bS5yZWYuc2F4MmR0bScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhtbC5yZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemVyLnV0aWxzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLnV0aWxzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLnV0aWxzLnJlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhwYXRoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueHBhdGguYXhlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhwYXRoLmNvbXBpbGVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueHBhdGguZG9tYXBpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueHBhdGguZnVuY3Rpb25zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueHBhdGguamF4cCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhwYXRoLm9iamVjdHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54cGF0aC5vcGVyYXRpb25zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueHBhdGgucGF0dGVybnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54cGF0aC5yZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2phdmFfY3VwLnJ1bnRpbWUnIHJhbmdlPScwLjEwLjAnIG9wdGlvbmFsPSd0cnVlJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJjZWwnIHJhbmdlPSc1LjIuMCcgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzJyByYW5nZT0nWzIuOC4wLDMuMC4wKScgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLnhhbGFuJyB2ZXJzaW9uPScyLjcuMC52MjAwODAzMDYyMDI2Jy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1SZXF1aXJlLUJ1bmRsZTogc3lzdGVtLmJ1bmRsZSxqYXZhX2N1cC5ydW50aW1lO2J1bmRsZS12ZXJzaW9uPSZxdW90OzAuMTAuMCZxdW90OztyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmJjZWw7YnVuZGxlLXZlcnNpb249JnF1b3Q7NS4yLjAmcXVvdDs7cmVzb2x1dGlvbjo9b3B0aW9uYWwsb3JnLmFwYWNoZS54ZXJjZXM7YnVuZGxlLXZlcnNpb249JnF1b3Q7WzIuOC4wLDMuMC4wKSZxdW90OztyZXNvbHV0aW9uOj1vcHRpb25hbAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMi43LjAudjIwMDgwMzA2MjAyNgotRXhwb3J0LVBhY2thZ2U6IE1FVEEtSU5GLnNlcnZpY2VzLG9yZy5hcGFjaGUueGFsYW4sb3JnLmFwYWNoZS54YWxhbi5jbGllbnQsb3JnLmFwYWNoZS54YWxhbi5leHRlbnNpb25zLG9yZy5hcGFjaGUueGFsYW4ubGliLG9yZy5hcGFjaGUueGFsYW4ubGliLnNxbCxvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3NvcixvcmcuYXBhY2hlLnhhbGFuLnJlcyxvcmcuYXBhY2hlLnhhbGFuLnNlcmlhbGl6ZSxvcmcuYXBhY2hlLnhhbGFuLnRlbXBsYXRlcyxvcmcuYXBhY2hlLnhhbGFuLnRyYWNlLG9yZy5hcGFjaGUueGFsYW4udHJhbnNmb3JtZXIsb3JnLmFwYWNoZS54YWxhbi54c2x0LG9yZy5hcGFjaGUueGFsYW4ueHNsdGMsb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5jbWRsaW5lLG9yZy5hcGFjaGUueGFsYW4ueHNsdGMuY21kbGluZS5nZXRvcHQsb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5jb21waWxlcixvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLmNvbXBpbGVyLnV0aWwsb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5kb20sb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5ydW50aW1lLG9yZy5hcGFjaGUueGFsYW4ueHNsdGMucnVudGltZS5vdXRwdXQsb3JnLmFwYWNoZS54YWxhbi54c2x0Yy50cmF4LG9yZy5hcGFjaGUueGFsYW4ueHNsdGMudXRpbCxvcmcuYXBhY2hlLnhtbC5kdG0sb3JnLmFwYWNoZS54bWwuZHRtLnJlZixvcmcuYXBhY2hlLnhtbC5kdG0ucmVmLmRvbTJkdG0sb3JnLmFwYWNoZS54bWwuZHRtLnJlZi5zYXgyZHRtLG9yZy5hcGFjaGUueG1sLnJlcyxvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemVyLG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZXIudXRpbHMsb3JnLmFwYWNoZS54bWwudXRpbHMsb3JnLmFwYWNoZS54bWwudXRpbHMucmVzLG9yZy5hcGFjaGUueHBhdGgsb3JnLmFwYWNoZS54cGF0aC5heGVzLG9yZy5hcGFjaGUueHBhdGguY29tcGlsZXIsb3JnLmFwYWNoZS54cGF0aC5kb21hcGksb3JnLmFwYWNoZS54cGF0aC5mdW5jdGlvbnMsb3JnLmFwYWNoZS54cGF0aC5qYXhwLG9yZy5hcGFjaGUueHBhdGgub2JqZWN0cyxvcmcuYXBhY2hlLnhwYXRoLm9wZXJhdGlvbnMsb3JnLmFwYWNoZS54cGF0aC5wYXR0ZXJucyxvcmcuYXBhY2hlLnhwYXRoLnJlcwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS54YWxhbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2phdmF4LnhtbC5zb2FwJyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDcwNTExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2phdmF4LnhtbC5zb2FwJyByYW5nZT0nWzAuMC4wLDEuMi4wLnYyMDA4MDMwNzA1MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtVmVuZG9yLjAnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLU5hbWUuMCcgdmFsdWU9J1NBQUonLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVCdW5kbGUtTmFtZS4wJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJUJ1bmRsZS1WZW5kb3IuMCcvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzUnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdqYXZheC54bWwuc29hcCcgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA3MDUxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YXgueG1sLnNvYXAnIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNzA1MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwuc29hcCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScxJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2knIHJhbmdlPScwLjAuMCcvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2phdmF4LnhtbC5zb2FwJyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDcwNTExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMic+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1CdW5kbGUtQ2xhc3NQYXRoOiBsaWIvc2Fhai5qYXIKLVJlcXVpcmUtQnVuZGxlOiBzeXN0ZW0uYnVuZGxlCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBqYXZheC54bWwuc29hcAotQnVuZGxlLVZlcnNpb246IDEuMi4wLnYyMDA4MDMwNzA1MTEKLUV4cG9ydC1QYWNrYWdlOiBqYXZheC54bWwuc29hcAotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSd6aXBwZWQnPgotICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuYmF0aWsuc3ZnZ2VuJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuYmF0aWsuc3ZnZ2VuJyByYW5nZT0nWzAuMC4wLDEuNi4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBCYXRpayBTVkcgR2VuZXJhdGlvbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNyc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuc3ZnZ2VuJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnN2Z2dlbicgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuc3ZnZ2VuJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuc3ZnZ2VuLmZvbnQnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5zdmdnZW4uZm9udC50YWJsZScgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScyJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnV0aWwnIHJhbmdlPScwLjAuMCcvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYmF0aWsuc3ZnZ2VuJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS5iYXRpay5leHQuYXd0O3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnV0aWw7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7Ci1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZXJzaW9uOiAxLjYuMC52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5iYXRpay5zdmdnZW47dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnN2Z2dlbi5mb250O3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5zdmdnZW4uZm9udC50YWJsZTt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmJhdGlrLnN2Z2dlbgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuYmF0aWsuZG9tLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmJhdGlrLmRvbS5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIERPTSBTb3VyY2UgQnVuZGxlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5kb20uc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmRvbS5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYmF0aWsuZG9tLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjYuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmF0aWsuZG9tLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmJhdGlrLmRvbTt2ZXJzaW9uPSZxdW90OzEuNi4wLnYyMDA4MDMwNjE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2NvbS5pYm0uaWN1LmJhc2Uuc291cmNlJyB2ZXJzaW9uPSczLjguMS52MjAwODAzMDQnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nY29tLmlibS5pY3UuYmFzZS5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMy44LjEudjIwMDgwMzA0KScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nSUJNIENvcnBvcmF0aW9uJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nSW50ZXJuYXRpb25hbCBDb21wb25lbnRzIGZvciBVbmljb2RlIGZvciBKYXZhIChJQ1U0SikgUmVwbGFjZW1lbnQgc291cmNlIHBsdWctaW4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdjb20uaWJtLmljdS5iYXNlLnNvdXJjZScgdmVyc2lvbj0nMy44LjEudjIwMDgwMzA0Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdjb20uaWJtLmljdS5iYXNlLnNvdXJjZScgdmVyc2lvbj0nMy44LjEudjIwMDgwMzA0Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdjb20uaWJtLmljdS5iYXNlLnNvdXJjZScgdmVyc2lvbj0nMy44LjEudjIwMDgwMzA0Jy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVyc2lvbjogMy44LjEudjIwMDgwMzA0Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBjb20uaWJtLmljdS5iYXNlLnNvdXJjZQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogY29tLmlibS5pY3UuYmFzZTt2ZXJzaW9uPSZxdW90OzMuOC4xLnYyMDA4MDMwNCZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5zb3VyY2UnIHZlcnNpb249JzIuMy4wLnYyMDA4MDMwNjE5MTAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuc291cmNlJyByYW5nZT0nWzAuMC4wLDIuMy4wLnYyMDA4MDMwNjE5MTApJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBKYWthcnRhIENvbW1vbnMgTGFuZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nLnNvdXJjZScgdmVyc2lvbj0nMi4zLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuc291cmNlJyB2ZXJzaW9uPScyLjMuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5zb3VyY2UnIHZlcnNpb249JzIuMy4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMi4zLjAudjIwMDgwMzA2MTkxMAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmFwYWNoZS5jb21tb25zLmxhbmc7dmVyc2lvbj0mcXVvdDsyLjMuMC52MjAwODAzMDYxOTEwJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcub2JqZWN0d2ViLmFzbScgdmVyc2lvbj0nMy4xLjAudjIwMDgwMzA2MTkxMCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcub2JqZWN0d2ViLmFzbScgcmFuZ2U9J1swLjAuMCwzLjEuMC52MjAwODAzMDYxOTEwKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBU00nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzExJz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLm9iamVjdHdlYi5hc20nIHZlcnNpb249JzMuMS4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5vYmplY3R3ZWIuYXNtJyB2ZXJzaW9uPSczLjEuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9iamVjdHdlYi5hc20nIHZlcnNpb249JzMuMS4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9iamVjdHdlYi5hc20uY29tbW9ucycgdmVyc2lvbj0nMy4xLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub2JqZWN0d2ViLmFzbS5zaWduYXR1cmUnIHZlcnNpb249JzMuMS4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9iamVjdHdlYi5hc20udHJlZScgdmVyc2lvbj0nMy4xLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub2JqZWN0d2ViLmFzbS50cmVlLmFuYWx5c2lzJyB2ZXJzaW9uPSczLjEuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vYmplY3R3ZWIuYXNtLnV0aWwnIHZlcnNpb249JzMuMS4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9iamVjdHdlYi5hc20ueG1sJyB2ZXJzaW9uPSczLjEuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLm9iamVjdHdlYi5hc20nIHZlcnNpb249JzMuMS4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZXJzaW9uOiAzLjEuMC52MjAwODAzMDYxOTEwCi1FeHBvcnQtUGFja2FnZTogb3JnLm9iamVjdHdlYi5hc207dmVyc2lvbj0mcXVvdDszLjEuMCZxdW90Oyxvcmcub2JqZWN0d2ViLmFzbS5jb21tb25zO3ZlcnNpb249JnF1b3Q7My4xLjAmcXVvdDssb3JnLm9iamVjdHdlYi5hc20uc2lnbmF0dXJlO3ZlcnNpb249JnF1b3Q7My4xLjAmcXVvdDssb3JnLm9iamVjdHdlYi5hc20udHJlZTt2ZXJzaW9uPSZxdW90OzMuMS4wJnF1b3Q7LG9yZy5vYmplY3R3ZWIuYXNtLnRyZWUuYW5hbHlzaXM7dmVyc2lvbj0mcXVvdDszLjEuMCZxdW90Oyxvcmcub2JqZWN0d2ViLmFzbS51dGlsO3ZlcnNpb249JnF1b3Q7My4xLjAmcXVvdDssb3JnLm9iamVjdHdlYi5hc20ueG1sO3ZlcnNpb249JnF1b3Q7My4xLjAmcXVvdDsKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLm9iamVjdHdlYi5hc20KLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcudzNjLmRvbS5zbWlsJyB2ZXJzaW9uPScxLjAuMC52MjAwODAzMDgxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy53M2MuZG9tLnNtaWwnIHJhbmdlPSdbMC4wLjAsMS4wLjAudjIwMDgwMzA4MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nVzNDIFNNSUwgRE9NJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc1Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLnczYy5kb20uc21pbCcgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA4MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLnczYy5kb20uc21pbCcgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA4MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy53M2MuZG9tLnNtaWwnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMSc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5kb20nIHJhbmdlPScwLjAuMCcvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy53M2MuZG9tLnNtaWwnIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwODE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQsSjJTRS0xLjMsQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAudjIwMDgwMzA4MTgxMQotRXhwb3J0LVBhY2thZ2U6IG9yZy53M2MuZG9tLnNtaWw7dmVyc2lvbj0mcXVvdDsxLjAuMCZxdW90OwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLnczYy5kb20uc21pbAotSW1wb3J0LVBhY2thZ2U6IG9yZy53M2MuZG9tCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS54bWxycGMnIHZlcnNpb249JzMuMC4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS54bWxycGMnIHJhbmdlPSdbMC4wLjAsMy4wLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1WZW5kb3IuMCcgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtTmFtZS4wJyB2YWx1ZT0nQXBhY2hlIFhNTC1SUEMgUGx1Zy1pbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJUJ1bmRsZS1OYW1lLjAnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclQnVuZGxlLVZlbmRvci4wJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTUnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLnhtbHJwYycgdmVyc2lvbj0nMy4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS54bWxycGMnIHZlcnNpb249JzMuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhtbHJwYycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhtbHJwYy5jbGllbnQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWxycGMuY2xpZW50LnV0aWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWxycGMuY29tbW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1scnBjLmpheGInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWxycGMubWV0YWRhdGEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWxycGMucGFyc2VyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1scnBjLnNlcmlhbGl6ZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWxycGMuc2VydmVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1scnBjLnV0aWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWxycGMud2Vic2VydmVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzEzJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwuYmluZCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLm5hbWVzcGFjZScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnBhcnNlcnMnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50JyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5hdXRoJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5wYXJhbXMnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2VyaWFsaXplJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLndzLmNvbW1vbnMudXRpbCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5kb20nIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy54bWwuc2F4JyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcueG1sLnNheC5oZWxwZXJzJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLnhtbHJwYycgdmVyc2lvbj0nMy4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNCxDREMtMS4wL0ZvdW5kYXRpb24tMS4wLEoyU0UtMS4zCi1JbXBvcnQtUGFja2FnZTogamF2YXgueG1sLmJpbmQsamF2YXgueG1sLm5hbWVzcGFjZSxqYXZheC54bWwucGFyc2VycyxvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudCxvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5hdXRoLG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMsb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQucGFyYW1zLG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLG9yZy5hcGFjaGUud3MuY29tbW9ucy5zZXJpYWxpemUsb3JnLmFwYWNoZS53cy5jb21tb25zLnV0aWwsb3JnLnczYy5kb20sb3JnLnhtbC5zYXgsb3JnLnhtbC5zYXguaGVscGVycwotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtQnVkZHlQb2xpY3k6IGRlcGVuZGVudAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLnhtbHJwYwotQnVuZGxlLVZlcnNpb246IDMuMC4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnhtbHJwYyxvcmcuYXBhY2hlLnhtbHJwYy5jbGllbnQsb3JnLmFwYWNoZS54bWxycGMuY2xpZW50LnV0aWwsb3JnLmFwYWNoZS54bWxycGMuY29tbW9uLG9yZy5hcGFjaGUueG1scnBjLmpheGIsb3JnLmFwYWNoZS54bWxycGMubWV0YWRhdGEsb3JnLmFwYWNoZS54bWxycGMucGFyc2VyLG9yZy5hcGFjaGUueG1scnBjLnNlcmlhbGl6ZXIsb3JnLmFwYWNoZS54bWxycGMuc2VydmVyLG9yZy5hcGFjaGUueG1scnBjLnV0aWwsb3JnLmFwYWNoZS54bWxycGMud2Vic2VydmVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdjb20uamNyYWZ0LmpzY2gnIHZlcnNpb249JzAuMS4zNy52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2NvbS5qY3JhZnQuanNjaCcgcmFuZ2U9J1swLjAuMCwwLjEuMzcudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZU5hbWUnIHZhbHVlPSdKU2NoJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC52ZW5kZXJOYW1lJyB2YWx1ZT0nSkNyYWZ0LCBJbmMuJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclYnVuZGxlTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyV2ZW5kZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nOCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2NvbS5qY3JhZnQuanNjaCcgdmVyc2lvbj0nMC4xLjM3LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2NvbS5qY3JhZnQuanNjaCcgdmVyc2lvbj0nMC4xLjM3LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uamNyYWZ0LmpzY2gnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmpjcmFmdC5qc2NoLmpjZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uamNyYWZ0LmpzY2guamNyYWZ0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5qY3JhZnQuanNjaC5qZ3NzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nY29tLmpjcmFmdC5qc2NoJyB2ZXJzaW9uPScwLjEuMzcudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMC4xLjM3LnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBjb20uamNyYWZ0LmpzY2gsY29tLmpjcmFmdC5qc2NoLmpjZTt4LWludGVybmFsOj10cnVlLGNvbS5qY3JhZnQuanNjaC5qY3JhZnQ7eC1pbnRlcm5hbDo9dHJ1ZSxjb20uamNyYWZ0LmpzY2guamdzczt4LWludGVybmFsOj10cnVlCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjb20uamNyYWZ0LmpzY2gKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLU5hbWU6ICVidW5kbGVOYW1lCi1CdW5kbGUtVmVuZG9yOiAldmVuZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5vcm8uc291cmNlJyB2ZXJzaW9uPScyLjAuOC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUub3JvLnNvdXJjZScgcmFuZ2U9J1swLjAuMCwyLjAuOC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgSmFrYXJ0YSBPUk8gU291cmNlIEJ1bmRsZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUub3JvLnNvdXJjZScgdmVyc2lvbj0nMi4wLjgudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5vcm8uc291cmNlJyB2ZXJzaW9uPScyLjAuOC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLm9yby5zb3VyY2UnIHZlcnNpb249JzIuMC44LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMi4wLjgudjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLm9yby5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmFwYWNoZS5vcm87dmVyc2lvbj0mcXVvdDsyLjAuOC52MjAwODAzMDYxODExJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcudzNjLmNzcy5zYWMuc291cmNlJyB2ZXJzaW9uPScxLjMuMC52MjAwODAzMDgxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy53M2MuY3NzLnNhYy5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS4zLjAudjIwMDgwMzA4MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nVzNDIENTUyBTQUMgU291cmNlIEJ1bmRsZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy53M2MuY3NzLnNhYy5zb3VyY2UnIHZlcnNpb249JzEuMy4wLnYyMDA4MDMwODE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy53M2MuY3NzLnNhYy5zb3VyY2UnIHZlcnNpb249JzEuMy4wLnYyMDA4MDMwODE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy53M2MuY3NzLnNhYy5zb3VyY2UnIHZlcnNpb249JzEuMy4wLnYyMDA4MDMwODE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMS4zLjAudjIwMDgwMzA4MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcudzNjLmNzcy5zYWMuc291cmNlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy53M2MuY3NzLnNhYzt2ZXJzaW9uPSZxdW90OzEuMy4wLnYyMDA4MDMwODE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2NvbS5zdW4uc3luZGljYXRpb24uc291cmNlJyB2ZXJzaW9uPScwLjkuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2NvbS5zdW4uc3luZGljYXRpb24uc291cmNlJyByYW5nZT0nWzAuMC4wLDAuOS4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J1JzcyBhbmQgYXRPTSB1dGlsaXRpRXMgKFJPTUUpIFNvdXJjZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2NvbS5zdW4uc3luZGljYXRpb24uc291cmNlJyB2ZXJzaW9uPScwLjkuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdjb20uc3VuLnN5bmRpY2F0aW9uLnNvdXJjZScgdmVyc2lvbj0nMC45LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nY29tLnN1bi5zeW5kaWNhdGlvbi5zb3VyY2UnIHZlcnNpb249JzAuOS4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMC45LjAudjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjb20uc3VuLnN5bmRpY2F0aW9uLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBjb20uc3VuLnN5bmRpY2F0aW9uO3ZlcnNpb249JnF1b3Q7MC45LjAudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjJyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYycgcmFuZ2U9J1swLjAuMCwxLjIuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlTmFtZScgdmFsdWU9J0FwYWNoZSBDb21tb25zIENvZGVjIFBsdWctaW4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZVByb3ZpZGVyJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVidW5kbGVOYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJWJ1bmRsZVByb3ZpZGVyJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nOSc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYycgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjJyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjJyB2ZXJzaW9uPScxLjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnknIHZlcnNpb249JzEuMi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmRpZ2VzdCcgdmVyc2lvbj0nMS4yLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMubGFuZ3VhZ2UnIHZlcnNpb249JzEuMi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLm5ldCcgdmVyc2lvbj0nMS4yLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYycgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWM7dmVyc2lvbj0mcXVvdDsxLjIuMCZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5O3ZlcnNpb249JnF1b3Q7MS4yLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmRpZ2VzdDt2ZXJzaW9uPSZxdW90OzEuMi4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5sYW5ndWFnZTt2ZXJzaW9uPSZxdW90OzEuMi4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5uZXQ7dmVyc2lvbj0mcXVvdDsxLjIuMCZxdW90OwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjAvRm91bmRhdGlvbi0xLjAsSjJTRS0xLjMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVidW5kbGVQcm92aWRlcgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMnIHZlcnNpb249JzEuOS4xLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMnIHJhbmdlPSdbMC4wLjAsMS45LjEudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEx1Y2VuZSBBbmFseXNpcycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTMnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcycgdmVyc2lvbj0nMS45LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMnIHZlcnNpb249JzEuOS4xLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5icicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5jamsnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuY24nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuY3onIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuZGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuZWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuZnInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMubmwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMucnUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMSc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZScgcmFuZ2U9J1sxLjkuMSwyLjAuMCknLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcycgdmVyc2lvbj0nMS45LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDEuOS4xLnYyMDA4MDMwNjE4MTEKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLmx1Y2VuZTtidW5kbGUtdmVyc2lvbj0mcXVvdDtbMS45LjEsMi4wLjApJnF1b3Q7O3Zpc2liaWxpdHk6PXJlZXhwb3J0Ci1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuYnIsb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuY2prLG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLmNuLG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLmN6LG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLmRlLG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLmVsLG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLmZyLG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLm5sLG9yZy5hcGFjaGUubHVjZW5lLmFuYWx5c2lzLnJ1Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZScgdmVyc2lvbj0nMS4wLjQudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS4wLjQudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZU5hbWUnIHZhbHVlPSdBcGFjaGUgQ29tbW9ucyBMb2dnaW5nIFBsdWctaW4gU291cmNlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVQcm92aWRlcicgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclYnVuZGxlTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVidW5kbGVQcm92aWRlcicvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5zb3VyY2UnIHZlcnNpb249JzEuMC40LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLnNvdXJjZScgdmVyc2lvbj0nMS4wLjQudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlJyB2ZXJzaW9uPScxLjAuNC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuMC40LnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuc291cmNlCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nO3ZlcnNpb249JnF1b3Q7MS4wLjQudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuc2F0NGouY29yZScgdmVyc2lvbj0nMi4wLjAudjIwMDgwMzA3JyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5zYXQ0ai5jb3JlJyByYW5nZT0nWzAuMC4wLDIuMC4wLnYyMDA4MDMwNyknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPScyJz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVidW5kbGVOYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzE4Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLnNhdDRqLmNvcmUnIHZlcnNpb249JzIuMC4wLnYyMDA4MDMwNycvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLnNhdDRqLmNvcmUnIHZlcnNpb249JzIuMC4wLnYyMDA4MDMwNycvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5zYXQ0aicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuc2F0NGouY29yZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuc2F0NGoubWluaXNhdCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuc2F0NGoubWluaXNhdC5jb25zdHJhaW50cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuc2F0NGoubWluaXNhdC5jb25zdHJhaW50cy5jYXJkJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5zYXQ0ai5taW5pc2F0LmNvbnN0cmFpbnRzLmNuZicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuc2F0NGoubWluaXNhdC5jb3JlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5zYXQ0ai5taW5pc2F0LmxlYXJuaW5nJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5zYXQ0ai5taW5pc2F0Lm9yZGVycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuc2F0NGoubWluaXNhdC5yZXN0YXJ0cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuc2F0NGoubWluaXNhdC51aXAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnNhdDRqLm9wdCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuc2F0NGoucmVhZGVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5zYXQ0ai5zcGVjcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuc2F0NGoudG9vbHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLnNhdDRqLmNvcmUnIHZlcnNpb249JzIuMC4wLnYyMDA4MDMwNycvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEltcGxlbWVudGF0aW9uLVZlbmRvcjogQ1JJTCBDTlJTIFVNUiA4MTg4IC0gVW5pdmVyc2l0ZSBkJmFwb3M7QXJ0b2lzCi1CdW5kbGUtVmVyc2lvbjogMi4wLjAudjIwMDgwMzA3Ci1TcGVjaWZpY2F0aW9uLVRpdGxlOiBTQVQ0SgotSW1wbGVtZW50YXRpb24tVGl0bGU6IFNBVDRKCi1FeHBvcnQtUGFja2FnZTogb3JnLnNhdDRqLG9yZy5zYXQ0ai5jb3JlLG9yZy5zYXQ0ai5taW5pc2F0LG9yZy5zYXQ0ai5taW5pc2F0LmNvbnN0cmFpbnRzLG9yZy5zYXQ0ai5taW5pc2F0LmNvbnN0cmFpbnRzLmNhcmQsb3JnLnNhdDRqLm1pbmlzYXQuY29uc3RyYWludHMuY25mLG9yZy5zYXQ0ai5taW5pc2F0LmNvcmUsb3JnLnNhdDRqLm1pbmlzYXQubGVhcm5pbmcsb3JnLnNhdDRqLm1pbmlzYXQub3JkZXJzLG9yZy5zYXQ0ai5taW5pc2F0LnJlc3RhcnRzLG9yZy5zYXQ0ai5taW5pc2F0LnVpcCxvcmcuc2F0NGoub3B0LG9yZy5zYXQ0ai5yZWFkZXIsb3JnLnNhdDRqLnNwZWNzLG9yZy5zYXQ0ai50b29scwotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1BbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjYuMQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLnNhdDRqLmNvcmUKLUNyZWF0ZWQtQnk6IDEuNi4wXzAyLWIwNSAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotU3BlY2lmaWNhdGlvbi1WZXJzaW9uOiBOQQotQnVpbHQtQnk6IERhbmllbCBMZSBCZXJyZQotTWFpbi1DbGFzczogb3JnLnNhdDRqLkJhc2ljTGF1bmNoZXIKLUltcGxlbWVudGF0aW9uLVZlcnNpb246IDIuMAotU3BlY2lmaWNhdGlvbi1WZW5kb3I6IERhbmllbCBMZSBCZXJyZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLU5hbWU6ICVidW5kbGVOYW1lCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzJyB2ZXJzaW9uPScxLjcuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMnIHJhbmdlPSdbMC4wLjAsMS43LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIENvbW1vbnMgQmVhblV0aWxzJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc4Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscycgdmVyc2lvbj0nMS43LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscycgdmVyc2lvbj0nMS43LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMnIHZlcnNpb249JzEuNy4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5jb252ZXJ0ZXJzJyB2ZXJzaW9uPScxLjcuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMubG9jYWxlJyB2ZXJzaW9uPScxLjcuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMubG9jYWxlLmNvbnZlcnRlcnMnIHZlcnNpb249JzEuNy4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMic+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuY29sbGVjdGlvbnMnIHJhbmdlPSczLjIuMCcgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nJyByYW5nZT0nMS4wLjQnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzJyB2ZXJzaW9uPScxLjcuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVyc2lvbjogMS43LjAudjIwMDgwMzA2MTgxMQotUmVxdWlyZS1CdW5kbGU6IG9yZy5hcGFjaGUuY29tbW9ucy5jb2xsZWN0aW9ucztidW5kbGUtdmVyc2lvbj0mcXVvdDszLjIuMCZxdW90OztyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZztidW5kbGUtdmVyc2lvbj0mcXVvdDsxLjAuNCZxdW90OwotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHM7dmVyc2lvbj0mcXVvdDsxLjcuMCZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLmNvbnZlcnRlcnM7dmVyc2lvbj0mcXVvdDsxLjcuMCZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLmxvY2FsZTt2ZXJzaW9uPSZxdW90OzEuNy4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMubG9jYWxlLmNvbnZlcnRlcnM7dmVyc2lvbj0mcXVvdDsxLjcuMCZxdW90OwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2phdmF4LnNlcnZsZXQnIHZlcnNpb249JzIuMy4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0namF2YXguc2VydmxldCcgcmFuZ2U9J1swLjAuMCwyLjMuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdTZXJ2bGV0IEFQSScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNyc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4LnNlcnZsZXQnIHZlcnNpb249JzIuMy4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2phdmF4LnNlcnZsZXQnIHZlcnNpb249JzIuMy4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZXJ2bGV0JyB2ZXJzaW9uPScyLjMuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuaHR0cCcgdmVyc2lvbj0nMi4zLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZXJ2bGV0LnJlc291cmNlcycgdmVyc2lvbj0nMi4zLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2phdmF4LnNlcnZsZXQnIHZlcnNpb249JzIuMy4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZXJzaW9uOiAyLjMuMC52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogamF2YXguc2VydmxldDsgdmVyc2lvbj0yLjMsamF2YXguc2VydmxldC5odHRwOyB2ZXJzaW9uPTIuMyxqYXZheC5zZXJ2bGV0LnJlc291cmNlczsgdmVyc2lvbj0yLjMKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLEoyU0UtMS4zCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBqYXZheC5zZXJ2bGV0Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5sb2c0aicgdmVyc2lvbj0nMS4yLjEzLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5sb2c0aicgcmFuZ2U9J1swLjAuMCwxLjIuMTMudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULlBMVUdJTl9OQU1FJyB2YWx1ZT0nQXBhY2hlIEpha2FydGEgbG9nNGogUGx1Zy1pbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuUExVR0lOX1BST1ZJREVSJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVQTFVHSU5fTkFNRScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVQTFVHSU5fUFJPVklERVInLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScyNSc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUubG9nNGonIHZlcnNpb249JzEuMi4xMy52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqJyB2ZXJzaW9uPScxLjIuMTMudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGonIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai5jaGFpbnNhdycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqLmNvbmZpZycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai5qZGJjJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGouam14JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGoubGY1JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGoubGY1LmNvbmZpZycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqLmxmNS51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGoubGY1LnZpZXdlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqLmxmNS52aWV3ZXIuY2F0ZWdvcnlleHBsb3JlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqLmxmNS52aWV3ZXIuY29uZmlndXJlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGoubGY1LnZpZXdlci5pbWFnZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai5uZXQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai5udCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmxvZzRqLm9yJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGoub3Iuam1zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGoub3Iuc2F4JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGouc3BpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubG9nNGoudmFyaWEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sb2c0ai54bWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmxvZzRqJyB2ZXJzaW9uPScxLjIuMTMudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUJ1ZGR5UG9saWN5OiByZWdpc3RlcmVkCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUubG9nNGoKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMTMudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUubG9nNGosb3JnLmFwYWNoZS5sb2c0ai5jaGFpbnNhdyxvcmcuYXBhY2hlLmxvZzRqLmNvbmZpZyxvcmcuYXBhY2hlLmxvZzRqLmhlbHBlcnMsb3JnLmFwYWNoZS5sb2c0ai5qZGJjLG9yZy5hcGFjaGUubG9nNGouam14LG9yZy5hcGFjaGUubG9nNGoubGY1LG9yZy5hcGFjaGUubG9nNGoubGY1LmNvbmZpZyxvcmcuYXBhY2hlLmxvZzRqLmxmNS51dGlsLG9yZy5hcGFjaGUubG9nNGoubGY1LnZpZXdlcixvcmcuYXBhY2hlLmxvZzRqLmxmNS52aWV3ZXIuY2F0ZWdvcnlleHBsb3JlcixvcmcuYXBhY2hlLmxvZzRqLmxmNS52aWV3ZXIuY29uZmlndXJlLG9yZy5hcGFjaGUubG9nNGoubGY1LnZpZXdlci5pbWFnZXMsb3JnLmFwYWNoZS5sb2c0ai5uZXQsb3JnLmFwYWNoZS5sb2c0ai5udCxvcmcuYXBhY2hlLmxvZzRqLm9yLG9yZy5hcGFjaGUubG9nNGoub3Iuam1zLG9yZy5hcGFjaGUubG9nNGoub3Iuc2F4LG9yZy5hcGFjaGUubG9nNGouc3BpLG9yZy5hcGFjaGUubG9nNGoudmFyaWEsb3JnLmFwYWNoZS5sb2c0ai54bWwKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hbnRsci5ydW50aW1lJyB2ZXJzaW9uPSczLjAuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hbnRsci5ydW50aW1lJyByYW5nZT0nWzAuMC4wLDMuMC4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FOVExSIFJ1bnRpbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzgnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYW50bHIucnVudGltZScgdmVyc2lvbj0nMy4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFudGxyLnJ1bnRpbWUnIHZlcnNpb249JzMuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYW50bHIucnVudGltZScgdmVyc2lvbj0nMy4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYW50bHIucnVudGltZS5kZWJ1ZycgdmVyc2lvbj0nMy4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYW50bHIucnVudGltZS5taXNjJyB2ZXJzaW9uPSczLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hbnRsci5ydW50aW1lLnRyZWUnIHZlcnNpb249JzMuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYW50bHIucnVudGltZScgdmVyc2lvbj0nMy4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDMuMC4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYW50bHIucnVudGltZTt2ZXJzaW9uPSZxdW90OzMuMC4wJnF1b3Q7LG9yZy5hbnRsci5ydW50aW1lLmRlYnVnO3ZlcnNpb249JnF1b3Q7My4wLjAmcXVvdDssb3JnLmFudGxyLnJ1bnRpbWUubWlzYzt2ZXJzaW9uPSZxdW90OzMuMC4wJnF1b3Q7LG9yZy5hbnRsci5ydW50aW1lLnRyZWU7dmVyc2lvbj0mcXVvdDszLjAuMCZxdW90OwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYW50bHIucnVudGltZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5kaXNjb3ZlcnknIHZlcnNpb249JzAuMi4wLnYyMDA3MDYxMTEzMjknIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeScgcmFuZ2U9J1swLjAuMCwwLjIuMC52MjAwNzA2MTExMzI5KScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLVZlbmRvci4wJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1OYW1lLjAnIHZhbHVlPSdKYWthcnRhLUNvbW1vbnMgRGlzY292ZXJ5Jy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclQnVuZGxlLU5hbWUuMCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVCdW5kbGUtVmVuZG9yLjAnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScxMic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5kaXNjb3ZlcnknIHZlcnNpb249JzAuMi4wLnYyMDA3MDYxMTEzMjknLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5kaXNjb3ZlcnknIHZlcnNpb249JzAuMi4wLnYyMDA3MDYxMTEzMjknLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuZGlzY292ZXJ5JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5kaXNjb3ZlcnkuYW50JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5kaXNjb3ZlcnkuamRrJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5kaXNjb3ZlcnkubG9nJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5kaXNjb3ZlcnkucmVzb3VyY2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeS5yZXNvdXJjZS5jbGFzc2VzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5kaXNjb3ZlcnkucmVzb3VyY2UubmFtZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeS50b29scycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScyJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nJyByYW5nZT0nWzEuMC40LDIuMC4wKScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmp1bml0JyByYW5nZT0nWzMuOC4wLDQuMC4wKScgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuZGlzY292ZXJ5JyB2ZXJzaW9uPScwLjIuMC52MjAwNzA2MTExMzI5Jy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMic+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotSW1wbGVtZW50YXRpb24tVmVyc2lvbjogMC4yCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUV4dGVuc2lvbi1OYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMuZGlzY292ZXJ5Ci1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1DbGFzc1BhdGg6IGxpYi9jb21tb25zLWRpc2NvdmVyeS0wLjIuamFyCi1TcGVjaWZpY2F0aW9uLVZlbmRvcjogQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLVNwZWNpZmljYXRpb24tVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMC4yLjAudjIwMDcwNjExMTMyOQotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuY29tbW9ucy5kaXNjb3Zlcnksb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeS5hbnQsb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeS5qZGssb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeS5sb2csb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeS5yZXNvdXJjZSxvcmcuYXBhY2hlLmNvbW1vbnMuZGlzY292ZXJ5LnJlc291cmNlLmNsYXNzZXMsb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeS5yZXNvdXJjZS5uYW1lcyxvcmcuYXBhY2hlLmNvbW1vbnMuZGlzY292ZXJ5LnRvb2xzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmc7YnVuZGxlLXZlcnNpb249JnF1b3Q7WzEuMC40LDIuMC4wKSZxdW90OyxvcmcuanVuaXQ7YnVuZGxlLXZlcnNpb249JnF1b3Q7WzMuOC4wLDQuMC4wKSZxdW90OztyZXNvbHV0aW9uOj1vcHRpb25hbAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5jb21tb25zLmRpc2NvdmVyeQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUltcGxlbWVudGF0aW9uLVZlbmRvcjogQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24KLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nemlwcGVkJz4KLSAgICAgICAgICAgIHRydWUKLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcudzNjLmRvbS5zdmcnIHZlcnNpb249JzEuMS4wLnYyMDA4MDMwODE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLnczYy5kb20uc3ZnJyByYW5nZT0nWzAuMC4wLDEuMS4wLnYyMDA4MDMwODE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J1czQyBTVkcgRE9NJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc1Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLnczYy5kb20uc3ZnJyB2ZXJzaW9uPScxLjEuMC52MjAwODAzMDgxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcudzNjLmRvbS5zdmcnIHZlcnNpb249JzEuMS4wLnYyMDA4MDMwODE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbS5zdmcnIHZlcnNpb249JzEuMS4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMic+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcudzNjLmRvbS5zbWlsJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLnczYy5kb20uc3ZnJyB2ZXJzaW9uPScxLjEuMC52MjAwODAzMDgxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LEoyU0UtMS4zLENEQy0xLjAvRm91bmRhdGlvbi0xLjAKLVJlcXVpcmUtQnVuZGxlOiBvcmcudzNjLmRvbS5zbWlsO3ZlcnNpb249JnF1b3Q7WzEuMC4wLDEuMS4wKSZxdW90OwotSW1wb3J0LVBhY2thZ2U6IG9yZy53M2MuZG9tCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcudzNjLmRvbS5zdmcKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC52MjAwODAzMDgxODExCi1FeHBvcnQtUGFja2FnZTogb3JnLnczYy5kb20uc3ZnO3ZlcnNpb249JnF1b3Q7MS4xLjAmcXVvdDsKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuYmF0aWsudHJhbnNjb2RlcicgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXInIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIFRyYW5zY29kZXInLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzEyJz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay50cmFuc2NvZGVyJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXInIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXInIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay50cmFuc2NvZGVyLmltYWdlJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsudHJhbnNjb2Rlci5pbWFnZS5yZXNvdXJjZXMnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay50cmFuc2NvZGVyLmtleXMnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay50cmFuc2NvZGVyLnByaW50JyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsudHJhbnNjb2Rlci5zdmcyc3ZnJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsudHJhbnNjb2Rlci53bWYnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay50cmFuc2NvZGVyLndtZi50b3N2ZycgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPSc4Jz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuYnJpZGdlJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZG9tJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZG9tLnN2ZycgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5zdmdnZW4nIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay51dGlsJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsueG1sJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy53M2MuZG9tLnN2ZycgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5iYXRpay50cmFuc2NvZGVyJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS5iYXRpay5icmlkZ2U7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZG9tO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmRvbS5zdmc7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dDt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5zdmdnZW47dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsudXRpbDt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay54bWw7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy53M2MuZG9tLnN2Zzt2ZXJzaW9uPSZxdW90O1sxLjEuMCwxLjMuMCkmcXVvdDsKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVZlcnNpb246IDEuNi4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXI7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXIuaW1hZ2U7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXIuaW1hZ2UucmVzb3VyY2VzO3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDssb3JnLmFwYWNoZS5iYXRpay50cmFuc2NvZGVyLmtleXM7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXIucHJpbnQ7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXIuc3ZnMnN2Zzt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsudHJhbnNjb2Rlci53bWY7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXIud21mLnRvc3ZnO3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDsKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmF0aWsudHJhbnNjb2RlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuYmF0aWsuYnJpZGdlLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmJhdGlrLmJyaWRnZS5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIEJyaWRnZS9HVlQvU2NyaXB0aW5nIFNvdXJjZSBCdW5kbGUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmJyaWRnZS5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuYnJpZGdlLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5iYXRpay5icmlkZ2Uuc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuNi4wLnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5iYXRpay5icmlkZ2Uuc291cmNlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUuYmF0aWsuYnJpZGdlO3ZlcnNpb249JnF1b3Q7MS42LjAudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0namF2YXgueG1sLnJwYycgdmVyc2lvbj0nMS4xLjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdqYXZheC54bWwucnBjJyByYW5nZT0nWzAuMC4wLDEuMS4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtVmVuZG9yLjAnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLU5hbWUuMCcgdmFsdWU9J0pBWC1SUEMnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVCdW5kbGUtTmFtZS4wJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJUJ1bmRsZS1WZW5kb3IuMCcvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzEyJz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0namF2YXgueG1sLnJwYycgdmVyc2lvbj0nMS4xLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YXgueG1sLnJwYycgdmVyc2lvbj0nMS4xLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5tZXNzYWdpbmcnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnJwYycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwucnBjLmVuY29kaW5nJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5ycGMuaGFuZGxlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwucnBjLmhhbmRsZXIuc29hcCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwucnBjLmhvbGRlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnJwYy5zZXJ2ZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnJwYy5zb2FwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzMnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YXgueG1sLnNvYXAnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YXguc2VydmxldCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcycgcmFuZ2U9J1syLjguMCwzLjAuMCknIG9wdGlvbmFsPSd0cnVlJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0namF2YXgueG1sLnJwYycgdmVyc2lvbj0nMS4xLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzInPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtQ2xhc3NQYXRoOiBsaWIvamF4cnBjLmphcgotU3BlY2lmaWNhdGlvbi1UaXRsZTogSkFYLVJQQwotUmVxdWlyZS1CdW5kbGU6IGphdmF4LnhtbC5zb2FwLGphdmF4LnNlcnZsZXQsb3JnLmFwYWNoZS54ZXJjZXM7YnVuZGxlLXZlcnNpb249JnF1b3Q7WzIuOC4wLDMuMC4wKSZxdW90OztyZXNvbHV0aW9uOj1vcHRpb25hbAotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQ3JlYXRlZC1CeTogMS40LjJfMDgtYjAzIChTdW4gTWljcm9zeXN0ZW1zIEluYy4pTmFtZTogamF2YXgveG1sL3JwYwotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAudjIwMDgwMzA2MTgxMQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1TcGVjaWZpY2F0aW9uLVZlcnNpb246IDEuMQotRXhwb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5tZXNzYWdpbmcsamF2YXgueG1sLnJwYyxqYXZheC54bWwucnBjLmVuY29kaW5nLGphdmF4LnhtbC5ycGMuaGFuZGxlcixqYXZheC54bWwucnBjLmhhbmRsZXIuc29hcCxqYXZheC54bWwucnBjLmhvbGRlcnMsamF2YXgueG1sLnJwYy5zZXJ2ZXIsamF2YXgueG1sLnJwYy5zb2FwCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBqYXZheC54bWwucnBjCi1TcGVjaWZpY2F0aW9uLVZlbmRvcjogSkNQCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J3ppcHBlZCc+Ci0gICAgICAgICAgICB0cnVlCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0namF2YXgueG1sLmJpbmQuc291cmNlJyB2ZXJzaW9uPScyLjAuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2phdmF4LnhtbC5iaW5kLnNvdXJjZScgcmFuZ2U9J1swLjAuMCwyLjAuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdKQVhCJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0namF2YXgueG1sLmJpbmQuc291cmNlJyB2ZXJzaW9uPScyLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdqYXZheC54bWwuYmluZC5zb3VyY2UnIHZlcnNpb249JzIuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2phdmF4LnhtbC5iaW5kLnNvdXJjZScgdmVyc2lvbj0nMi4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAyLjAuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGphdmF4LnhtbC5iaW5kLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBqYXZheC54bWwuYmluZDt2ZXJzaW9uPSZxdW90OzIuMC4wLnYyMDA4MDMwNjE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuZGVyYnkuc291cmNlJyB2ZXJzaW9uPScxMC4xLjIuMV92MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuZGVyYnkuc291cmNlJyByYW5nZT0nWzAuMC4wLDEwLjEuMi4xX3YyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtVmVuZG9yLjAnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLU5hbWUuMCcgdmFsdWU9J0FwYWNoZSBEZXJieSBTb3VyY2UgUGx1Zy1pbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJUJ1bmRsZS1OYW1lLjAnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclQnVuZGxlLVZlbmRvci4wJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuZGVyYnkuc291cmNlJyB2ZXJzaW9uPScxMC4xLjIuMV92MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmRlcmJ5LnNvdXJjZScgdmVyc2lvbj0nMTAuMS4yLjFfdjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5kZXJieS5zb3VyY2UnIHZlcnNpb249JzEwLjEuMi4xX3YyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMTAuMS4yLjFfdjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmRlcmJ5LnNvdXJjZQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmRlcmJ5O3ZlcnNpb249JnF1b3Q7MTAuMS4yLjFfdjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLm1vcnRiYXkuamV0dHkuc291cmNlJyB2ZXJzaW9uPSc1LjEuMTEudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcubW9ydGJheS5qZXR0eS5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsNS4xLjExLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVOYW1lJyB2YWx1ZT0nSmV0dHkgV2ViU2VydmVyIFNvdXJjZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlUHJvdmlkZXInIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJWJ1bmRsZU5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclYnVuZGxlUHJvdmlkZXInLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLm1vcnRiYXkuamV0dHkuc291cmNlJyB2ZXJzaW9uPSc1LjEuMTEudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLm1vcnRiYXkuamV0dHkuc291cmNlJyB2ZXJzaW9uPSc1LjEuMTEudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLm1vcnRiYXkuamV0dHkuc291cmNlJyB2ZXJzaW9uPSc1LjEuMTEudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiA1LjEuMTEudjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcubW9ydGJheS5qZXR0eS5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLm1vcnRiYXkuamV0dHk7dmVyc2lvbj0mcXVvdDs1LjEuMTEudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdjb20uaWJtLmljdS5iYXNlLnNvdXJjZScgdmVyc2lvbj0nMy42LjEudjIwMDgwMzA0JyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2NvbS5pYm0uaWN1LmJhc2Uuc291cmNlJyByYW5nZT0nWzAuMC4wLDMuNi4xLnYyMDA4MDMwNCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0lCTSBDb3Jwb3JhdGlvbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0ludGVybmF0aW9uYWwgQ29tcG9uZW50cyBmb3IgVW5pY29kZSBmb3IgSmF2YSAoSUNVNEopIFJlcGxhY2VtZW50IHNvdXJjZSBwbHVnLWluJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nY29tLmlibS5pY3UuYmFzZS5zb3VyY2UnIHZlcnNpb249JzMuNi4xLnYyMDA4MDMwNCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nY29tLmlibS5pY3UuYmFzZS5zb3VyY2UnIHZlcnNpb249JzMuNi4xLnYyMDA4MDMwNCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nY29tLmlibS5pY3UuYmFzZS5zb3VyY2UnIHZlcnNpb249JzMuNi4xLnYyMDA4MDMwNCcvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDMuNi4xLnYyMDA4MDMwNAotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmlibS5pY3UuYmFzZS5zb3VyY2UKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IGNvbS5pYm0uaWN1LmJhc2U7dmVyc2lvbj0mcXVvdDszLjYuMS52MjAwODAzMDQmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplcicgdmVyc2lvbj0nMi43LjEudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemVyJyByYW5nZT0nWzAuMC4wLDIuNy4xLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtVmVuZG9yLjAnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLU5hbWUuMCcgdmFsdWU9J0FwYWNoZSBYTUwgQ29tbW9ucyBTZXJpYWxpemVyJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclQnVuZGxlLU5hbWUuMCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVCdW5kbGUtVmVuZG9yLjAnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc2Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplcicgdmVyc2lvbj0nMi43LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplcicgdmVyc2lvbj0nMi43LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplci5kb20zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzEnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplcicgdmVyc2lvbj0nMi43LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMgotUmVxdWlyZS1CdW5kbGU6IHN5c3RlbS5idW5kbGUKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVZlcnNpb246IDIuNy4xLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemVyLG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZXIuZG9tMwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nLnNvdXJjZScgdmVyc2lvbj0nMi4xLjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMi4xLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEpha2FydGEgQ29tbW9ucyBMYW5nJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuc291cmNlJyB2ZXJzaW9uPScyLjEuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5zb3VyY2UnIHZlcnNpb249JzIuMS4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nLnNvdXJjZScgdmVyc2lvbj0nMi4xLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAyLjEuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZzt2ZXJzaW9uPSZxdW90OzIuMS4wLnYyMDA4MDMwNjE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUueGVyY2VzJyB2ZXJzaW9uPScyLjkuMC52MjAwODAzMDYxOTEwJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUueGVyY2VzJyByYW5nZT0nWzAuMC4wLDIuOS4wLnYyMDA4MDMwNjE5MTApJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtVmVuZG9yLjAnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLU5hbWUuMCcgdmFsdWU9J0FwYWNoZSBYZXJjZXMtSicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJUJ1bmRsZS1OYW1lLjAnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclQnVuZGxlLVZlbmRvci4wJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNDMnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcycgdmVyc2lvbj0nMi45LjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMnIHZlcnNpb249JzIuOS4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdNRVRBLUlORi5zZXJ2aWNlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmh0bWwuZG9tJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUud21sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUud21sLmRvbScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5kb20nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuZG9tLmV2ZW50cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5kb20zLmFzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmltcGwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5kdGQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5kdGQubW9kZWxzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmltcGwuZHYnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5kdi5kdGQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5kdi51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmltcGwuZHYueHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5pbycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLm1zZycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnZhbGlkYXRpb24nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cGF0aCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnhwYXRoLnJlZ2V4JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmltcGwueHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cy5pZGVudGl0eScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnhzLm1vZGVscycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnhzLm9wdGknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cy50cmF2ZXJzZXJzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmltcGwueHMudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy5qYXhwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLmpheHAuZGF0YXR5cGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMuamF4cC52YWxpZGF0aW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy54aW5jbHVkZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhlcmNlcy54bmknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMueG5pLmdyYW1tYXJzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMueHBvaW50ZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMueHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMueHMuZGF0YXR5cGVzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbS5odG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzQnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmVjbGlwc2Uub3NnaScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdqYXZheC54bWwnIHJhbmdlPSdbMS4zLjQsMi4wLjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLnhtbC5yZXNvbHZlcicgcmFuZ2U9J1sxLjIuMCwyLjAuMCknLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZXInIHJhbmdlPSdbMi43LjEsMy4wLjApJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS54ZXJjZXMnIHZlcnNpb249JzIuOS4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjIKLVJlcXVpcmUtQnVuZGxlOiBzeXN0ZW0uYnVuZGxlLGphdmF4LnhtbDtidW5kbGUtdmVyc2lvbj0mcXVvdDtbMS4zLjQsMi4wLjApJnF1b3Q7O3Zpc2liaWxpdHk6PXJlZXhwb3J0LG9yZy5hcGFjaGUueG1sLnJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSZxdW90O1sxLjIuMCwyLjAuMCkmcXVvdDs7dmlzaWJpbGl0eTo9cmVleHBvcnQsb3JnLmFwYWNoZS54bWwuc2VyaWFsaXplcjtidW5kbGUtdmVyc2lvbj0mcXVvdDtbMi43LjEsMy4wLjApJnF1b3Q7Ci1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZXJzaW9uOiAyLjkuMC52MjAwODAzMDYxOTEwCi1FeHBvcnQtUGFja2FnZTogTUVUQS1JTkYuc2VydmljZXMsb3JnLmFwYWNoZS5odG1sLmRvbSxvcmcuYXBhY2hlLndtbCxvcmcuYXBhY2hlLndtbC5kb20sb3JnLmFwYWNoZS54ZXJjZXMuZG9tLG9yZy5hcGFjaGUueGVyY2VzLmRvbS5ldmVudHMsb3JnLmFwYWNoZS54ZXJjZXMuZG9tMy5hcyxvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLG9yZy5hcGFjaGUueGVyY2VzLmltcGwuZHRkLG9yZy5hcGFjaGUueGVyY2VzLmltcGwuZHRkLm1vZGVscyxvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLmR2LG9yZy5hcGFjaGUueGVyY2VzLmltcGwuZHYuZHRkLG9yZy5hcGFjaGUueGVyY2VzLmltcGwuZHYudXRpbCxvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLmR2LnhzLG9yZy5hcGFjaGUueGVyY2VzLmltcGwuaW8sb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC5tc2csb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC52YWxpZGF0aW9uLG9yZy5hcGFjaGUueGVyY2VzLmltcGwueHBhdGgsb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cGF0aC5yZWdleCxvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnhzLG9yZy5hcGFjaGUueGVyY2VzLmltcGwueHMuaWRlbnRpdHksb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cy5tb2RlbHMsb3JnLmFwYWNoZS54ZXJjZXMuaW1wbC54cy5vcHRpLG9yZy5hcGFjaGUueGVyY2VzLmltcGwueHMudHJhdmVyc2VycyxvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLnhzLnV0aWwsb3JnLmFwYWNoZS54ZXJjZXMuamF4cCxvcmcuYXBhY2hlLnhlcmNlcy5qYXhwLmRhdGF0eXBlLG9yZy5hcGFjaGUueGVyY2VzLmpheHAudmFsaWRhdGlvbixvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLG9yZy5hcGFjaGUueGVyY2VzLnV0aWwsb3JnLmFwYWNoZS54ZXJjZXMueGluY2x1ZGUsb3JnLmFwYWNoZS54ZXJjZXMueG5pLG9yZy5hcGFjaGUueGVyY2VzLnhuaS5ncmFtbWFycyxvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLG9yZy5hcGFjaGUueGVyY2VzLnhwb2ludGVyLG9yZy5hcGFjaGUueGVyY2VzLnhzLG9yZy5hcGFjaGUueGVyY2VzLnhzLmRhdGF0eXBlcyxvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUsb3JnLnczYy5kb20uaHRtbAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS54ZXJjZXMKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmJhdGlrLmNzcy5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5iYXRpay5jc3Muc291cmNlJyByYW5nZT0nWzAuMC4wLDEuNi4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBCYXRpayBDU1MgU291cmNlIEJ1bmRsZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuY3NzLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5jc3Muc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmJhdGlrLmNzcy5zb3VyY2UnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMS42LjAudjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmJhdGlrLmNzcy5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmFwYWNoZS5iYXRpay5jc3M7dmVyc2lvbj0mcXVvdDsxLjYuMC52MjAwODAzMDYxODExJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZycgdmVyc2lvbj0nMS4wLjQudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZycgcmFuZ2U9J1swLjAuMCwxLjAuNC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlTmFtZScgdmFsdWU9J0FwYWNoZSBDb21tb25zIExvZ2dpbmcgUGx1Zy1pbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlUHJvdmlkZXInIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJWJ1bmRsZU5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclYnVuZGxlUHJvdmlkZXInLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc2Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcnIHZlcnNpb249JzEuMC40LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nJyB2ZXJzaW9uPScxLjAuNC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcnIHZlcnNpb249JzEuMC40Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbCcgdmVyc2lvbj0nMS4wLjQnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nJyB2ZXJzaW9uPScxLjAuNC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVidW5kbGVOYW1lCi1CdW5kbGUtVmVyc2lvbjogMS4wLjQudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nO3ZlcnNpb249JnF1b3Q7MS4wLjQmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbDt2ZXJzaW9uPSZxdW90OzEuMC40JnF1b3Q7Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCxKMlNFLTEuMwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlYnVuZGxlUHJvdmlkZXIKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5vYmplY3R3ZWIuYXNtLnNvdXJjZScgdmVyc2lvbj0nMy4xLjAudjIwMDgwMzA2MTkxMCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcub2JqZWN0d2ViLmFzbS5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMy4xLjAudjIwMDgwMzA2MTkxMCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQVNNIFNvdXJjZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5vYmplY3R3ZWIuYXNtLnNvdXJjZScgdmVyc2lvbj0nMy4xLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLm9iamVjdHdlYi5hc20uc291cmNlJyB2ZXJzaW9uPSczLjEuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcub2JqZWN0d2ViLmFzbS5zb3VyY2UnIHZlcnNpb249JzMuMS4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMy4xLjAudjIwMDgwMzA2MTkxMAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcub2JqZWN0d2ViLmFzbS5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLm9iamVjdHdlYi5hc207dmVyc2lvbj0mcXVvdDszLjEuMC52MjAwODAzMDYxOTEwJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmJhdGlrLnhtbCcgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmJhdGlrLnhtbCcgcmFuZ2U9J1swLjAuMCwxLjYuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQmF0aWsgWE1MJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc1Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay54bWwnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsueG1sJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay54bWwnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMSc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnV0aWwnIHJhbmdlPScwLjAuMCcvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYmF0aWsueG1sJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS5iYXRpay51dGlsO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OwotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMS42LjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuYmF0aWsueG1sO3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDsKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmF0aWsueG1sCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0namF2YXguc2VydmxldC5zb3VyY2UnIHZlcnNpb249JzIuMy4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0namF2YXguc2VydmxldC5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMi4zLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nU2VydmxldCBBUEkgU291cmNlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0namF2YXguc2VydmxldC5zb3VyY2UnIHZlcnNpb249JzIuMy4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2phdmF4LnNlcnZsZXQuc291cmNlJyB2ZXJzaW9uPScyLjMuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdqYXZheC5zZXJ2bGV0LnNvdXJjZScgdmVyc2lvbj0nMi4zLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAyLjMuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGphdmF4LnNlcnZsZXQuc291cmNlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IGphdmF4LnNlcnZsZXQ7dmVyc2lvbj0mcXVvdDsyLjMuMC52MjAwODAzMDYxODExJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmFudCcgdmVyc2lvbj0nMS43LjAudjIwMDgwMzA2MTkxMCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmFudCcgcmFuZ2U9J1swLjAuMCwxLjcuMC52MjAwODAzMDYxOTEwKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQW50Jy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc3OCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuYW50JyB2ZXJzaW9uPScxLjcuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmFudCcgdmVyc2lvbj0nMS43LjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2ltYWdlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC5kaXNwYXRjaCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LmxvYWRlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmN2c2xpYicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY20nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5yZXNvbHZlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaTE4bicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pbWFnZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmphdmFjYycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhaCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qZGVwZW5kJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpsaW5rJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuY29tcGlsZXJzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LnhzbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uYXRpdmUyYXNjaWknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnB2Y3MnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2NtJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNjcmlwdCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3MnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc291bmQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3BsYXNoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNzaCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zdGFydGVhbScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC51bml4JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC53aW5kb3dzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuY29uZGl0aW9ucycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5tYXBwZXJzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmRlcGVuZCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvbHZlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNwaScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLmJjZWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5mYWNhZGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5qYXZhMTUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5vcHRpb25hbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmJ6aXAyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMubWFpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLnRhcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLnppcCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScxJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2knIHJhbmdlPScwLjAuMCcvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYW50JyB2ZXJzaW9uPScxLjcuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMic+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4yCi1CdW5kbGUtQ2xhc3NQYXRoOiBsaWIvYW50LmphcixsaWIvYW50LWFudGxyLmphcixsaWIvYW50LWFwYWNoZS1iY2VsLmphcixsaWIvYW50LWFwYWNoZS1ic2YuamFyLGxpYi9hbnQtYXBhY2hlLWxvZzRqLmphcixsaWIvYW50LWFwYWNoZS1vcm8uamFyLGxpYi9hbnQtYXBhY2hlLXJlZ2V4cC5qYXIsbGliL2FudC1hcGFjaGUtcmVzb2x2ZXIuamFyLGxpYi9hbnQtY29tbW9ucy1sb2dnaW5nLmphcixsaWIvYW50LWNvbW1vbnMtbmV0LmphcixsaWIvYW50LWphaS5qYXIsbGliL2FudC1qYXZhbWFpbC5qYXIsbGliL2FudC1qZGVwZW5kLmphcixsaWIvYW50LWptZi5qYXIsbGliL2FudC1qc2NoLmphcixsaWIvYW50LWp1bml0LmphcixsaWIvYW50LWxhdW5jaGVyLmphcixsaWIvYW50LW5ldHJleHguamFyLGxpYi9hbnQtbm9kZXBzLmphcixsaWIvYW50LXN0YXJ0ZWFtLmphcixsaWIvYW50LXN0eWxlYm9vay5qYXIsbGliL2FudC1zd2luZy5qYXIsbGliL2FudC10cmF4LmphcixsaWIvYW50LXdlYmxvZ2ljLmphcgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLm9zZ2kKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYW50Ci1CdW5kbGUtVmVyc2lvbjogMS43LjAudjIwMDgwMzA2MTkxMAotRXhwb3J0LVBhY2thZ2U6IGltYWdlcyxvcmcuYXBhY2hlLnRvb2xzLmFudCxvcmcuYXBhY2hlLnRvb2xzLmFudC5kaXNwYXRjaCxvcmcuYXBhY2hlLnRvb2xzLmFudC5maWx0ZXJzLG9yZy5hcGFjaGUudG9vbHMuYW50LmZpbHRlcnMudXRpbCxvcmcuYXBhY2hlLnRvb2xzLmFudC5oZWxwZXIsb3JnLmFwYWNoZS50b29scy5hbnQuaW5wdXQsb3JnLmFwYWNoZS50b29scy5hbnQubGF1bmNoLG9yZy5hcGFjaGUudG9vbHMuYW50Lmxpc3RlbmVyLG9yZy5hcGFjaGUudG9vbHMuYW50LmxvYWRlcixvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcyxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5jb21waWxlcnMsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMuY29uZGl0aW9uLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLmN2c2xpYixvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5lbWFpbCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5jY20sb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuY2xlYXJjYXNlLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRlcGVuZCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5kZXBlbmQuY29uc3RhbnRwb29sLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmRvdG5ldCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5lamIsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuZXh0ZW5zaW9uLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmV4dGVuc2lvbi5yZXNvbHZlcnMsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuaTE4bixvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5pbWFnZSxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qMmVlLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmphdmFjYyxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qYXZhaCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qZGVwZW5kLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpsaW5rLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmpzcCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5qc3AuY29tcGlsZXJzLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLmp1bml0LnhzbCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5uYXRpdmUyYXNjaWksb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwubmV0LG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnBlcmZvcmNlLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnB2Y3Msb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc2NtLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNjcmlwdCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zb3Msb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc291bmQsb3JnLmFwYWNoZS50b29scy5hbnQudGFza2RlZnMub3B0aW9uYWwuc3BsYXNoLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnNzaCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC5zdGFydGVhbSxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC51bml4LG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLm9wdGlvbmFsLnZzcyxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcy5vcHRpb25hbC53aW5kb3dzLG9yZy5hcGFjaGUudG9vbHMuYW50LnRhc2tkZWZzLnJtaWMsb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMsb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuY29uZGl0aW9ucyxvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5tYXBwZXJzLG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLm9wdGlvbmFsLmRlcGVuZCxvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5vcHRpb25hbC5pbWFnZSxvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvbHZlcixvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcy5yZXNvdXJjZXMsb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMucmVzb3VyY2VzLmNvbXBhcmF0b3JzLG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnJlc291cmNlcy5zZWxlY3RvcnMsb3JnLmFwYWNoZS50b29scy5hbnQudHlwZXMuc2VsZWN0b3JzLG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNlbGVjdG9ycy5tb2RpZmllZHNlbGVjdG9yLG9yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzLnNwaSxvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLG9yZy5hcGFjaGUudG9vbHMuYW50LnV0aWwuZGVwZW5kLmJjZWwsb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5mYWNhZGUsb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5qYXZhMTUsb3JnLmFwYWNoZS50b29scy5hbnQudXRpbC5vcHRpb25hbCxvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsLnJlZ2V4cCxvcmcuYXBhY2hlLnRvb2xzLmJ6aXAyLG9yZy5hcGFjaGUudG9vbHMubWFpbCxvcmcuYXBhY2hlLnRvb2xzLnRhcixvcmcuYXBhY2hlLnRvb2xzLnppcAotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSd6aXBwZWQnPgotICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5wb29sJyB2ZXJzaW9uPScxLjMuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5wb29sJyByYW5nZT0nWzAuMC4wLDEuMy4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBDb21tb25zIFBvb2wnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzYnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMucG9vbCcgdmVyc2lvbj0nMS4zLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLnBvb2wnIHZlcnNpb249JzEuMy4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMucG9vbCcgdmVyc2lvbj0nMS4zLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMucG9vbC5pbXBsJyB2ZXJzaW9uPScxLjMuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzInPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxhbmcnIHJhbmdlPSdbMi4wLjAsMy4wLjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZycgcmFuZ2U9J1sxLjAuMCwyLjAuMCknLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMucG9vbCcgdmVyc2lvbj0nMS4zLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDEuMy4wLnYyMDA4MDMwNjE4MTEKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZztidW5kbGUtdmVyc2lvbj0mcXVvdDtbMi4wLjAsMy4wLjApJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nO2J1bmRsZS12ZXJzaW9uPSZxdW90O1sxLjAuMCwyLjAuMCkmcXVvdDsKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmNvbW1vbnMucG9vbDt2ZXJzaW9uPSZxdW90OzEuMy4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5wb29sLmltcGw7dmVyc2lvbj0mcXVvdDsxLjMuMCZxdW90OwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4zCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMucG9vbAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdjb20uaWJtLmljdS5iYXNlLnNvdXJjZScgdmVyc2lvbj0nMy42LjAudjIwMDgwMzA0JyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2NvbS5pYm0uaWN1LmJhc2Uuc291cmNlJyByYW5nZT0nWzAuMC4wLDMuNi4wLnYyMDA4MDMwNCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0lCTSBDb3Jwb3JhdGlvbicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0ludGVybmF0aW9uYWwgQ29tcG9uZW50cyBmb3IgVW5pY29kZSBmb3IgSmF2YSAoSUNVNEopIFJlcGxhY2VtZW50IHNvdXJjZSBwbHVnLWluJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nY29tLmlibS5pY3UuYmFzZS5zb3VyY2UnIHZlcnNpb249JzMuNi4wLnYyMDA4MDMwNCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nY29tLmlibS5pY3UuYmFzZS5zb3VyY2UnIHZlcnNpb249JzMuNi4wLnYyMDA4MDMwNCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nY29tLmlibS5pY3UuYmFzZS5zb3VyY2UnIHZlcnNpb249JzMuNi4wLnYyMDA4MDMwNCcvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDMuNi4wLnYyMDA4MDMwNAotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmlibS5pY3UuYmFzZS5zb3VyY2UKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IGNvbS5pYm0uaWN1LmJhc2U7dmVyc2lvbj0mcXVvdDszLjYuMC52MjAwODAzMDQmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5iY2VsJyB2ZXJzaW9uPSc1LjIuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuYmNlbCcgcmFuZ2U9J1swLjAuMCw1LjIuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQkNFTCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTInPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmJjZWwnIHZlcnNpb249JzUuMi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmNlbCcgdmVyc2lvbj0nNS4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmNlbCcgdmVyc2lvbj0nNS4yLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJjZWwuY2xhc3NmaWxlJyB2ZXJzaW9uPSc1LjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmNlbC5nZW5lcmljJyB2ZXJzaW9uPSc1LjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmNlbC51dGlsJyB2ZXJzaW9uPSc1LjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmNlbC52ZXJpZmllcicgdmVyc2lvbj0nNS4yLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJjZWwudmVyaWZpZXIuZXhjJyB2ZXJzaW9uPSc1LjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmNlbC52ZXJpZmllci5zdGF0aWNzJyB2ZXJzaW9uPSc1LjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmNlbC52ZXJpZmllci5zdHJ1Y3R1cmFscycgdmVyc2lvbj0nNS4yLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYmNlbCcgdmVyc2lvbj0nNS4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlcnNpb246IDUuMi4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmJjZWw7dmVyc2lvbj0mcXVvdDs1LjIuMCZxdW90OyxvcmcuYXBhY2hlLmJjZWwuY2xhc3NmaWxlO3ZlcnNpb249JnF1b3Q7NS4yLjAmcXVvdDssb3JnLmFwYWNoZS5iY2VsLmdlbmVyaWM7dmVyc2lvbj0mcXVvdDs1LjIuMCZxdW90OyxvcmcuYXBhY2hlLmJjZWwudXRpbDt2ZXJzaW9uPSZxdW90OzUuMi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmNlbC52ZXJpZmllcjt2ZXJzaW9uPSZxdW90OzUuMi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmNlbC52ZXJpZmllci5leGM7dmVyc2lvbj0mcXVvdDs1LjIuMCZxdW90OyxvcmcuYXBhY2hlLmJjZWwudmVyaWZpZXIuc3RhdGljczt2ZXJzaW9uPSZxdW90OzUuMi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmNlbC52ZXJpZmllci5zdHJ1Y3R1cmFsczt2ZXJzaW9uPSZxdW90OzUuMi4wJnF1b3Q7Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmNlbAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnNvdXJjZScgdmVyc2lvbj0nMy4wLjEudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMy4wLjEudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZU5hbWUnIHZhbHVlPSdBcGFjaGUgQ29tbW9ucyBIdHRwY2xpZW50IFNvdXJjZSBQbHVnLWluJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVQcm92aWRlcicgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclYnVuZGxlTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVidW5kbGVQcm92aWRlcicvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5zb3VyY2UnIHZlcnNpb249JzMuMC4xLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnNvdXJjZScgdmVyc2lvbj0nMy4wLjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuc291cmNlJyB2ZXJzaW9uPSczLjAuMS52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDMuMC4xLnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuc291cmNlCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50O3ZlcnNpb249JnF1b3Q7My4wLjEudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJWJ1bmRsZVByb3ZpZGVyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLnNvdXJjZScgdmVyc2lvbj0nMS43LjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLnNvdXJjZScgcmFuZ2U9J1swLjAuMCwxLjcuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQ29tbW9ucyBCZWFuVXRpbHMgU291cmNlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5zb3VyY2UnIHZlcnNpb249JzEuNy4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuc291cmNlJyB2ZXJzaW9uPScxLjcuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLnNvdXJjZScgdmVyc2lvbj0nMS43LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjcuMC52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuc291cmNlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHM7dmVyc2lvbj0mcXVvdDsxLjcuMC52MjAwODAzMDYxODExJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmFudC5zb3VyY2UnIHZlcnNpb249JzEuNi41LnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5hbnQuc291cmNlJyByYW5nZT0nWzAuMC4wLDEuNi41LnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBBbnQgU291cmNlJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5hbnQuc291cmNlJyB2ZXJzaW9uPScxLjYuNS52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmFudC5zb3VyY2UnIHZlcnNpb249JzEuNi41LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYW50LnNvdXJjZScgdmVyc2lvbj0nMS42LjUudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjYuNS52MjAwODAzMDYxODExCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYW50LnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmFudDt2ZXJzaW9uPSZxdW90OzEuNi41LnYyMDA4MDMwNjE4MTEmcXVvdDs7cm9vdHM6PSZxdW90O2xpYi9hbnQsbGliL2FudC1hbnRscixsaWIvYW50LWFwYWNoZS1iY2VsLGxpYi9hbnQtYXBhY2hlLWJzZixsaWIvYW50LWFwYWNoZS1sb2c0aixsaWIvYW50LWFwYWNoZS1vcm8sbGliL2FudC1hcGFjaGUtcmVnZXhwLGxpYi9hbnQtYXBhY2hlLXJlc29sdmVyLGxpYi9hbnQtY29tbW9ucy1sb2dnaW5nLGxpYi9hbnQtY29tbW9ucy1uZXQsbGliL2FudC1pY29udHJhY3QsbGliL2FudC1qYWksbGliL2FudC1qYXZhbWFpbCxsaWIvYW50LWpkZXBlbmQsbGliL2FudC1qbWYsbGliL2FudC1qc2NoLGxpYi9hbnQtanVuaXQsbGliL2FudC1sYXVuY2hlcixsaWIvYW50LW5ldHJleHgsbGliL2FudC1ub2RlcHMsbGliL2FudC1zdGFydGVhbSxsaWIvYW50LXN0eWxlYm9vayxsaWIvYW50LXN3aW5nLGxpYi9hbnQtdHJheCxsaWIvYW50LXZhaixsaWIvYW50LXdlYmxvZ2ljLGxpYi9hbnQteGFsYW4xLGxpYi9hbnQteHNscCZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0namF2YXguc2VydmxldC5qc3AnIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0namF2YXguc2VydmxldC5qc3AnIHJhbmdlPSdbMC4wLjAsMS4yLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nSlNQIEFQSScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNyc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4LnNlcnZsZXQuanNwJyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdqYXZheC5zZXJ2bGV0LmpzcCcgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuanNwJyB2ZXJzaW9uPScxLjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuanNwLnJlc291cmNlcycgdmVyc2lvbj0nMS4yLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQnIHZlcnNpb249JzEuMi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMic+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldCcgcmFuZ2U9JzIuMy4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldC5odHRwJyByYW5nZT0nMi4zLjAnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdqYXZheC5zZXJ2bGV0LmpzcCcgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLEoyU0UtMS4zCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogamF2YXguc2VydmxldC5qc3A7IHZlcnNpb249MS4yLGphdmF4LnNlcnZsZXQuanNwLnJlc291cmNlczsgdmVyc2lvbj0xLjIsamF2YXguc2VydmxldC5qc3AudGFnZXh0OyB2ZXJzaW9uPTEuMgotQnVuZGxlLVN5bWJvbGljTmFtZTogamF2YXguc2VydmxldC5qc3AKLUltcG9ydC1QYWNrYWdlOiBqYXZheC5zZXJ2bGV0O3ZlcnNpb249JnF1b3Q7Mi4zLjAmcXVvdDssamF2YXguc2VydmxldC5odHRwO3ZlcnNpb249JnF1b3Q7Mi4zLjAmcXVvdDsKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdqYXZheC54bWwnIHZlcnNpb249JzEuMy40LnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0namF2YXgueG1sJyByYW5nZT0nWzAuMC4wLDEuMy40LnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtVmVuZG9yLjAnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLU5hbWUuMCcgdmFsdWU9J0pBWFAgWE1MJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclQnVuZGxlLU5hbWUuMCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVCdW5kbGUtVmVuZG9yLjAnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScyOSc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4LnhtbCcgdmVyc2lvbj0nMS4zLjQudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YXgueG1sJyB2ZXJzaW9uPScxLjMuNC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5kYXRhdHlwZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwubmFtZXNwYWNlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5wYXJzZXJzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC50cmFuc2Zvcm0nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnRyYW5zZm9ybS5kb20nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnRyYW5zZm9ybS5zYXgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnZhbGlkYXRpb24nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLnhwYXRoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sY29tbW9ucycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbS5ib290c3RyYXAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5kb20uY3NzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy53M2MuZG9tLmV2ZW50cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbS5odG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy53M2MuZG9tLmxzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy53M2MuZG9tLnJhbmdlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbS5zdHlsZXNoZWV0cycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbS50cmF2ZXJzYWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5kb20udmlld3MnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5kb20ueHBhdGgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnhtbC5zYXgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnhtbC5zYXguZXh0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy54bWwuc2F4LmhlbHBlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMSc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuZWNsaXBzZS5vc2dpJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdqYXZheC54bWwnIHZlcnNpb249JzEuMy40LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjIKLVJlcXVpcmUtQnVuZGxlOiBzeXN0ZW0uYnVuZGxlCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZXJzaW9uOiAxLjMuNC52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogamF2YXgueG1sLGphdmF4LnhtbC5kYXRhdHlwZSxqYXZheC54bWwubmFtZXNwYWNlLGphdmF4LnhtbC5wYXJzZXJzLGphdmF4LnhtbC50cmFuc2Zvcm0samF2YXgueG1sLnRyYW5zZm9ybS5kb20samF2YXgueG1sLnRyYW5zZm9ybS5zYXgsamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0samF2YXgueG1sLnZhbGlkYXRpb24samF2YXgueG1sLnhwYXRoLG9yZy5hcGFjaGUueG1sY29tbW9ucyxvcmcudzNjLmRvbSxvcmcudzNjLmRvbS5ib290c3RyYXAsb3JnLnczYy5kb20uY3NzLG9yZy53M2MuZG9tLmV2ZW50cyxvcmcudzNjLmRvbS5odG1sLG9yZy53M2MuZG9tLmxzLG9yZy53M2MuZG9tLnJhbmdlcyxvcmcudzNjLmRvbS5zdHlsZXNoZWV0cyxvcmcudzNjLmRvbS50cmF2ZXJzYWwsb3JnLnczYy5kb20udmlld3Msb3JnLnczYy5kb20ueHBhdGgsb3JnLnhtbC5zYXgsb3JnLnhtbC5zYXguZXh0LG9yZy54bWwuc2F4LmhlbHBlcnMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGphdmF4LnhtbAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5tb3J0YmF5LmpldHR5LnV0aWwnIHZlcnNpb249JzYuMS43LnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLm1vcnRiYXkuamV0dHkudXRpbCcgcmFuZ2U9J1swLjAuMCw2LjEuNy52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nSmV0dHkgVXRpbGl0aWVzJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRlc2NyaXB0aW9uJyB2YWx1ZT0nVXRpbGl0eSBjbGFzc2VzIGZvciBKZXR0eScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9J01vcnQgQmF5IENvbnN1bHRpbmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZG9jLnVybCcgdmFsdWU9J2h0dHA6Ly9qZXR0eS5tb3J0YmF5Lm9yZycvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzknPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcubW9ydGJheS5qZXR0eS51dGlsJyB2ZXJzaW9uPSc2LjEuNy52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcubW9ydGJheS5qZXR0eS51dGlsJyB2ZXJzaW9uPSc2LjEuNy52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vcnRiYXkudXRpbCcgdmVyc2lvbj0nNi4xLjcnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW9ydGJheS5sb2cnIHZlcnNpb249JzYuMS43Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm1vcnRiYXkuY29tcG9uZW50JyB2ZXJzaW9uPSc2LjEuNycvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LnRocmVhZCcgdmVyc2lvbj0nNi4xLjcnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcubW9ydGJheS5zZXJ2bGV0JyB2ZXJzaW9uPSc2LjEuNycvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5tb3J0YmF5LnV0aWwuYWpheCcgdmVyc2lvbj0nNi4xLjcnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMic+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldCcgcmFuZ2U9JzIuNS4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldC5odHRwJyByYW5nZT0nMi41LjAnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcubW9ydGJheS5qZXR0eS51dGlsJyB2ZXJzaW9uPSc2LjEuNy52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtRG9jVVJMOiBodHRwOi8vamV0dHkubW9ydGJheS5vcmcKLWltcGxlbWVudGF0aW9uLXZlcnNpb246IDYuMS43Ci1JZ25vcmUtUGFja2FnZTogb3JnLm1vcnRiYXkubG9nLG9yZy5tb3J0YmF5LnV0aWwsb3JnLm1vcnRiYXkuY29tcG9uZW50LG9yZy5tb3J0YmF5LnRocmVhZCxvcmcubW9ydGJheS5zZXJ2bGV0LG9yZy5tb3J0YmF5LnV0aWwuYWpheAotQ3JlYXRlZC1CeTogMS41LjBfMTMgKFN1biBNaWNyb3N5c3RlbXMgSW5jLikKLUJ1aWx0LUJ5OiBncmVndwotQnVuZGxlLVZlbmRvcjogTW9ydCBCYXkgQ29uc3VsdGluZwotdXJsOiBodHRwOi8vamV0dHkubW9ydGJheS5vcmcKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLURlc2NyaXB0aW9uOiBVdGlsaXR5IGNsYXNzZXMgZm9yIEpldHR5Ci1JbXBvcnQtUGFja2FnZTogamF2YXguc2VydmxldDt2ZXJzaW9uPTIuNSxqYXZheC5zZXJ2bGV0Lmh0dHA7dmVyc2lvbj0yLjUKLUFyY2hpdmVyLVZlcnNpb246IFBsZXh1cyBBcmNoaXZlcgotQnVuZGxlLU5hbWU6IEpldHR5IFV0aWxpdGllcwotQnVuZGxlLUxpY2Vuc2U6IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotbW9kZTogZGV2ZWxvcG1lbnQKLUV4cG9ydC1QYWNrYWdlOiBvcmcubW9ydGJheS51dGlsO3VzZXM6PSZxdW90O29yZy5tb3J0YmF5LmxvZyxvcmcubW9ydGJheS50aHJlYWQmcXVvdDs7dmVyc2lvbj02LjEuNyxvcmcubW9ydGJheS5sb2c7dXNlczo9b3JnLm1vcnRiYXkudXRpbDt2ZXJzaW9uPTYuMS43LG9yZy5tb3J0YmF5LmNvbXBvbmVudDt1c2VzOj0mcXVvdDtvcmcubW9ydGJheS51dGlsLG9yZy5tb3J0YmF5LmxvZyZxdW90Ozt2ZXJzaW9uPTYuMS43LG9yZy5tb3J0YmF5LnRocmVhZDt1c2VzOj0mcXVvdDtvcmcubW9ydGJheS5sb2csb3JnLm1vcnRiYXkuY29tcG9uZW50JnF1b3Q7O3ZlcnNpb249Ni4xLjcsb3JnLm1vcnRiYXkuc2VydmxldDt1c2VzOj0mcXVvdDtvcmcubW9ydGJheS5sb2csb3JnLm1vcnRiYXkudXRpbCxqYXZheC5zZXJ2bGV0Lmh0dHAsamF2YXguc2VydmxldCxvcmcubW9ydGJheS51dGlsLmFqYXgmcXVvdDs7dmVyc2lvbj02LjEuNyxvcmcubW9ydGJheS51dGlsLmFqYXg7dXNlczo9JnF1b3Q7b3JnLm1vcnRiYXkubG9nLG9yZy5tb3J0YmF5LnV0aWwsamF2YXguc2VydmxldC5odHRwLGphdmF4LnNlcnZsZXQmcXVvdDs7dmVyc2lvbj02LjEuNwotQnVuZGxlLVZlcnNpb246IDYuMS43LnYyMDA4MDMwNjE4MTEKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJuZC1MYXN0TW9kaWZpZWQ6IDExOTg0NjM4OTk5NjAKLXBhY2thZ2U6IG9yZy5tb3J0YmF5Ci1CdWlsZC1KZGs6IDEuNS4wXzEzCi1Ub29sOiBCbmQtMC4wLjE2MAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLm1vcnRiYXkuamV0dHkudXRpbAotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5sdWNlbmUnIHZlcnNpb249JzEuOS4xLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5sdWNlbmUnIHJhbmdlPSdbMC4wLjAsMS45LjEudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEx1Y2VuZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTUnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZScgdmVyc2lvbj0nMS45LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUnIHZlcnNpb249JzEuOS4xLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5kZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5hbmFseXNpcy5zdGFuZGFyZCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5kb2N1bWVudCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5pbmRleCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5xdWVyeVBhcnNlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5zZWFyY2gnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLnNwYW5zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubHVjZW5lLnN0b3JlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUubHVjZW5lLnV0aWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmx1Y2VuZScgdmVyc2lvbj0nMS45LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAxLjkuMS52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5sdWNlbmUsb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMsb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuZGUsb3JnLmFwYWNoZS5sdWNlbmUuYW5hbHlzaXMuc3RhbmRhcmQsb3JnLmFwYWNoZS5sdWNlbmUuZG9jdW1lbnQsb3JnLmFwYWNoZS5sdWNlbmUuaW5kZXgsb3JnLmFwYWNoZS5sdWNlbmUucXVlcnlQYXJzZXIsb3JnLmFwYWNoZS5sdWNlbmUuc2VhcmNoLG9yZy5hcGFjaGUubHVjZW5lLnNlYXJjaC5zcGFucyxvcmcuYXBhY2hlLmx1Y2VuZS5zdG9yZSxvcmcuYXBhY2hlLmx1Y2VuZS51dGlsCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUubHVjZW5lCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS53cy5jb21tb25zLnV0aWwnIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS53cy5jb21tb25zLnV0aWwnIHJhbmdlPSdbMC4wLjAsMS4wLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPScyJz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1OYW1lJyB2YWx1ZT0nV1MgQ29tbW9ucyBVdGlsIFBsdWctaW4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVCdW5kbGUtTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzYnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLndzLmNvbW1vbnMudXRpbCcgdmVyc2lvbj0nMS4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS53cy5jb21tb25zLnV0aWwnIHZlcnNpb249JzEuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2VyaWFsaXplJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUud3MuY29tbW9ucy51dGlsJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzYnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLm5hbWVzcGFjZScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5kb20nIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy54bWwuc2F4JyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcueG1sLnNheC5leHQnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy54bWwuc2F4LmhlbHBlcnMnIHJhbmdlPScwLjAuMCcvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUud3MuY29tbW9ucy51dGlsJyB2ZXJzaW9uPScxLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLndzLmNvbW1vbnMuc2VyaWFsaXplO3ZlcnNpb249JnF1b3Q7MS4wLjAmcXVvdDssb3JnLmFwYWNoZS53cy5jb21tb25zLnV0aWw7dmVyc2lvbj0mcXVvdDsxLjAuMCZxdW90OwotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LENEQy0xLjAvRm91bmRhdGlvbi0xLjAsSjJTRS0xLjMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUud3MuY29tbW9ucy51dGlsCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLU1hbmlmZXN0LVZlcnNpb246IDEuMAotSW1wb3J0LVBhY2thZ2U6IGphdmF4LnhtbCxqYXZheC54bWwubmFtZXNwYWNlLG9yZy53M2MuZG9tLG9yZy54bWwuc2F4LG9yZy54bWwuc2F4LmV4dCxvcmcueG1sLnNheC5oZWxwZXJzCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmJhdGlrLnN3aW5nJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuYmF0aWsuc3dpbmcnIHJhbmdlPSdbMC4wLjAsMS42LjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJhdGlrIFN3aW5nJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc3Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5zd2luZycgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5zd2luZycgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuc3dpbmcnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5zd2luZy5ndnQnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5zd2luZy5zdmcnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nOCc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmJyaWRnZScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmRvbScgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmRvbS5zdmcnIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5leHQuYXd0JyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsudXRpbCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnV0aWwuZ3VpJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsueG1sJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy53M2MuZG9tLnN2ZycgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5iYXRpay5zd2luZycgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMwotUmVxdWlyZS1CdW5kbGU6IG9yZy5hcGFjaGUuYmF0aWsuYnJpZGdlO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmRvbTt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5kb20uc3ZnO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3Q7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsudXRpbDt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay51dGlsLmd1aTt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay54bWw7dmVyc2lvbj0mcXVvdDtbMS42LjAsMS43LjApJnF1b3Q7LG9yZy53M2MuZG9tLnN2Zzt2ZXJzaW9uPSZxdW90O1sxLjEuMCwxLjMuMCkmcXVvdDsKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVZlcnNpb246IDEuNi4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmJhdGlrLnN3aW5nO3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5zd2luZy5ndnQ7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnN3aW5nLnN2Zzt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmJhdGlrLnN3aW5nCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5iYXRpay5leHQuYXd0JyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dCcgcmFuZ2U9J1swLjAuMCwxLjYuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQmF0aWsgQVdUIFV0aWxpdGllcycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTYnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dCcgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dCcgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QuY29sb3InIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5leHQuYXd0LmZvbnQnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5leHQuYXd0LmcyZCcgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QuZ2VvbScgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QuaW1hZ2UnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay5leHQuYXd0LmltYWdlLmNvZGVjJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dC5pbWFnZS5jb2RlYy50aWZmJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dC5pbWFnZS5yZW5kZXJhYmxlJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dC5pbWFnZS5yZW5kZXJlZCcgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QuaW1hZ2Uuc3BpJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuZXh0LnN3aW5nJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzInPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay51dGlsJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsudXRpbC5ndWknIHJhbmdlPScwLjAuMCcvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dCcgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMwotUmVxdWlyZS1CdW5kbGU6IG9yZy5hcGFjaGUuYmF0aWsudXRpbDt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDssb3JnLmFwYWNoZS5iYXRpay51dGlsLmd1aTt2ZXJzaW9uPSZxdW90O1sxLjYuMCwxLjcuMCkmcXVvdDsKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVZlcnNpb246IDEuNi4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3Q7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QuY29sb3I7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QuZm9udDt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dC5nMmQ7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QuZ2VvbTt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dC5pbWFnZTt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dC5pbWFnZS5jb2RlYzt2ZXJzaW9uPSZxdW90OzEuNi4wJnF1b3Q7LG9yZy5hcGFjaGUuYmF0aWsuZXh0LmF3dC5pbWFnZS5jb2RlYy50aWZmO3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5leHQuYXd0LmltYWdlLnJlbmRlcmFibGU7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QuaW1hZ2UucmVuZGVyZWQ7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmV4dC5hd3QuaW1hZ2Uuc3BpO3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDssb3JnLmFwYWNoZS5iYXRpay5leHQuc3dpbmc7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OwotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5iYXRpay5leHQuYXd0Ci1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFudGxyLnJ1bnRpbWUuc291cmNlJyB2ZXJzaW9uPSczLjAuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hbnRsci5ydW50aW1lLnNvdXJjZScgcmFuZ2U9J1swLjAuMCwzLjAuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBTlRMUiBSdW50aW1lIFNvdXJjZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hbnRsci5ydW50aW1lLnNvdXJjZScgdmVyc2lvbj0nMy4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFudGxyLnJ1bnRpbWUuc291cmNlJyB2ZXJzaW9uPSczLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYW50bHIucnVudGltZS5zb3VyY2UnIHZlcnNpb249JzMuMC4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMy4wLjAudjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYW50bHIucnVudGltZS5zb3VyY2UKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmFudGxyLnJ1bnRpbWU7dmVyc2lvbj0mcXVvdDszLjAuMC52MjAwODAzMDYxODExJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcuYXBhY2hlLmJjZWwuc291cmNlJyB2ZXJzaW9uPSc1LjIuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuYmNlbC5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsNS4yLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEJDRUwnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmJjZWwuc291cmNlJyB2ZXJzaW9uPSc1LjIuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJjZWwuc291cmNlJyB2ZXJzaW9uPSc1LjIuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmJjZWwuc291cmNlJyB2ZXJzaW9uPSc1LjIuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDUuMi4wLnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5iY2VsLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmJjZWw7dmVyc2lvbj0mcXVvdDs1LjIuMC52MjAwODAzMDYxODExJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdqYXZheC54bWwuYmluZCcgdmVyc2lvbj0nMi4wLjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdqYXZheC54bWwuYmluZCcgcmFuZ2U9J1swLjAuMCwyLjAuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdKQVhCJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScxMCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4LnhtbC5iaW5kJyB2ZXJzaW9uPScyLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdqYXZheC54bWwuYmluZCcgdmVyc2lvbj0nMi4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5iaW5kJyB2ZXJzaW9uPScyLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5iaW5kLmFubm90YXRpb24nIHZlcnNpb249JzIuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycycgdmVyc2lvbj0nMi4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwuYmluZC5hdHRhY2htZW50JyB2ZXJzaW9uPScyLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5iaW5kLmhlbHBlcnMnIHZlcnNpb249JzIuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLmJpbmQudXRpbCcgdmVyc2lvbj0nMi4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2phdmF4LnhtbC5iaW5kJyB2ZXJzaW9uPScyLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgRXhwb3J0LVBhY2thZ2U6IGphdmF4LnhtbC5iaW5kO3ZlcnNpb249JnF1b3Q7Mi4wLjAmcXVvdDssamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbjt2ZXJzaW9uPSZxdW90OzIuMC4wJnF1b3Q7LGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnM7dmVyc2lvbj0mcXVvdDsyLjAuMCZxdW90OyxqYXZheC54bWwuYmluZC5hdHRhY2htZW50O3ZlcnNpb249JnF1b3Q7Mi4wLjAmcXVvdDssamF2YXgueG1sLmJpbmQuaGVscGVyczt2ZXJzaW9uPSZxdW90OzIuMC4wJnF1b3Q7LGphdmF4LnhtbC5iaW5kLnV0aWw7dmVyc2lvbj0mcXVvdDsyLjAuMCZxdW90OwotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVyc2lvbjogMi4wLjAudjIwMDgwMzA2MTgxMQotQnVuZGxlLVN5bWJvbGljTmFtZTogamF2YXgueG1sLmJpbmQKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmp1bml0LnNvdXJjZScgdmVyc2lvbj0nMy44LjIudjIwMDgwMzA2MTkxMCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuanVuaXQuc291cmNlJyByYW5nZT0nWzAuMC4wLDMuOC4yLnYyMDA4MDMwNjE5MTApJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0pVbml0IFRlc3RpbmcgRnJhbWV3b3JrIFNvdXJjZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5qdW5pdC5zb3VyY2UnIHZlcnNpb249JzMuOC4yLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5qdW5pdC5zb3VyY2UnIHZlcnNpb249JzMuOC4yLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5qdW5pdC5zb3VyY2UnIHZlcnNpb249JzMuOC4yLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMy44LjIudjIwMDgwMzA2MTkxMAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuanVuaXQuc291cmNlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5qdW5pdDt2ZXJzaW9uPSZxdW90OzMuOC4yLnYyMDA4MDMwNjE5MTAmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLnNvdXJjZScgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS4yLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIENvbW1vbnMgRmlsZVVwbG9hZCBTb3VyY2UnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5zb3VyY2UnIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLnNvdXJjZScgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQuc291cmNlJyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQuc291cmNlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkO3ZlcnNpb249JnF1b3Q7MS4yLjAudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQnIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQnIHJhbmdlPSdbMC4wLjAsMS4yLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIENvbW1vbnMgRmlsZVVwbG9hZCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nOSc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkJyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZCcgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkJyB2ZXJzaW9uPScxLjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLmRpc2snIHZlcnNpb249JzEuMi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQucG9ydGxldCcgdmVyc2lvbj0nMS4yLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5zZXJ2bGV0JyB2ZXJzaW9uPScxLjIuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLnV0aWwnIHZlcnNpb249JzEuMi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldCcgcmFuZ2U9JzIuMy4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldC5odHRwJyByYW5nZT0nMi4zLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaW8nIHJhbmdlPScxLjMuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5pby5vdXRwdXQnIHJhbmdlPScxLjMuMCcvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkJyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVyc2lvbjogMS4yLjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkO3ZlcnNpb249JnF1b3Q7MS4yLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQuZGlzazt2ZXJzaW9uPSZxdW90OzEuMi4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkLnBvcnRsZXQ7dmVyc2lvbj0mcXVvdDsxLjIuMCZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZC5zZXJ2bGV0O3ZlcnNpb249JnF1b3Q7MS4yLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQudXRpbDt2ZXJzaW9uPSZxdW90OzEuMi4wJnF1b3Q7Ci1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjMKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuY29tbW9ucy5maWxldXBsb2FkCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUltcG9ydC1QYWNrYWdlOiBqYXZheC5zZXJ2bGV0O3ZlcnNpb249JnF1b3Q7Mi4zLjAmcXVvdDssamF2YXguc2VydmxldC5odHRwO3ZlcnNpb249JnF1b3Q7Mi4zLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmlvO3ZlcnNpb249JnF1b3Q7MS4zLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmlvLm91dHB1dDt2ZXJzaW9uPSZxdW90OzEuMy4wJnF1b3Q7Ci0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdqYXZheC5qd3MnIHZlcnNpb249JzIuMC4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0namF2YXguandzJyByYW5nZT0nWzAuMC4wLDIuMC4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtVmVuZG9yLjAnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLU5hbWUuMCcgdmFsdWU9J1dlYiBTZXJ2aWNlcyBNZXRhZGF0YScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJUJ1bmRsZS1OYW1lLjAnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclQnVuZGxlLVZlbmRvci4wJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4Lmp3cycgdmVyc2lvbj0nMi4wLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YXguandzJyB2ZXJzaW9uPScyLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguandzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lmp3cy5zb2FwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0namF2YXguandzJyB2ZXJzaW9uPScyLjAuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgRXhwb3J0LVBhY2thZ2U6IGphdmF4Lmp3cyxqYXZheC5qd3Muc29hcAotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtVmVyc2lvbjogMi4wLjAudjIwMDgwMzA2MTgxMQotQnVuZGxlLVN5bWJvbGljTmFtZTogamF2YXguandzCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J25ldC5zb3VyY2Vmb3JnZS5teDRqJyB2ZXJzaW9uPSczLjAuMS52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J25ldC5zb3VyY2Vmb3JnZS5teDRqJyByYW5nZT0nWzAuMC4wLDMuMC4xLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtVmVuZG9yLjAnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLU5hbWUuMCcgdmFsdWU9J01YNEonLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVCdW5kbGUtTmFtZS4wJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJUJ1bmRsZS1WZW5kb3IuMCcvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzEzJz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nbmV0LnNvdXJjZWZvcmdlLm14NGonIHZlcnNpb249JzMuMC4xLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J25ldC5zb3VyY2Vmb3JnZS5teDRqJyB2ZXJzaW9uPSczLjAuMS52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nbXg0aicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdteDRqLmxvYWRpbmcnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nbXg0ai5sb2cnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nbXg0ai5tb25pdG9yJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J214NGoucGVyc2lzdCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdteDRqLnNlcnZlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdteDRqLnNlcnZlci5pbnRlcmNlcHRvcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdteDRqLnRpbWVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J214NGoudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J25ldC5zb3VyY2Vmb3JnZS5teDRqJyB2ZXJzaW9uPSczLjAuMS52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDMuMC4xLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBteDRqLG14NGoubG9hZGluZyxteDRqLmxvZyxteDRqLm1vbml0b3IsbXg0ai5wZXJzaXN0LG14NGouc2VydmVyLG14NGouc2VydmVyLmludGVyY2VwdG9yLG14NGoudGltZXIsbXg0ai51dGlsCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG5ldC5zb3VyY2Vmb3JnZS5teDRqCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLnczYy5jc3Muc2FjJyB2ZXJzaW9uPScxLjMuMC52MjAwODAzMDgxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy53M2MuY3NzLnNhYycgcmFuZ2U9J1swLjAuMCwxLjMuMC52MjAwODAzMDgxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdXM0MgQ1NTIFNBQycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy53M2MuY3NzLnNhYycgdmVyc2lvbj0nMS4zLjAudjIwMDgwMzA4MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLnczYy5jc3Muc2FjJyB2ZXJzaW9uPScxLjMuMC52MjAwODAzMDgxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5jc3Muc2FjJyB2ZXJzaW9uPScxLjMuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy53M2MuY3NzLnNhYy5oZWxwZXJzJyB2ZXJzaW9uPScxLjMuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLnczYy5jc3Muc2FjJyB2ZXJzaW9uPScxLjMuMC52MjAwODAzMDgxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVyc2lvbjogMS4zLjAudjIwMDgwMzA4MTgxMQotRXhwb3J0LVBhY2thZ2U6IG9yZy53M2MuY3NzLnNhYzt2ZXJzaW9uPSZxdW90OzEuMy4wJnF1b3Q7LG9yZy53M2MuY3NzLnNhYy5oZWxwZXJzO3ZlcnNpb249JnF1b3Q7MS4zLjAmcXVvdDsKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMyxDREMtMS4wL0ZvdW5kYXRpb24tMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcudzNjLmNzcy5zYWMKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdqYXZheC53c2RsJyB2ZXJzaW9uPScxLjUuMS52MjAwODAzMDYxOTEwJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2phdmF4LndzZGwnIHJhbmdlPSdbMC4wLjAsMS41LjEudjIwMDgwMzA2MTkxMCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1WZW5kb3IuMCcgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtTmFtZS4wJyB2YWx1ZT0nV1NETDRKJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclQnVuZGxlLU5hbWUuMCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVCdW5kbGUtVmVuZG9yLjAnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScyMic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4LndzZGwnIHZlcnNpb249JzEuNS4xLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2phdmF4LndzZGwnIHZlcnNpb249JzEuNS4xLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLmV4dGVuc2lvbnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLmV4dGVuc2lvbnMuaHR0cCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5taW1lJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC5leHRlbnNpb25zLnNjaGVtYScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC5mYWN0b3J5JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC51dGlsLnhtbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwueG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgud3NkbC5leHRlbnNpb25zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwuZXh0ZW5zaW9ucy5zY2hlbWEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgud3NkbC5leHRlbnNpb25zLnNvYXAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgud3NkbC5mYWN0b3J5JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwueG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzEnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS54ZXJjZXMnIHJhbmdlPSdbMi44LjAsMy4wLjApJyBvcHRpb25hbD0ndHJ1ZScvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2phdmF4LndzZGwnIHZlcnNpb249JzEuNS4xLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBJbXBsZW1lbnRhdGlvbi1WZW5kb3I6IElCTQotQnVuZGxlLVZlcnNpb246IDEuNS4xLnYyMDA4MDMwNjE5MTAKLVNwZWNpZmljYXRpb24tVGl0bGU6IEpXU0RMCi1JbXBsZW1lbnRhdGlvbi1UaXRsZTogV1NETDRKCi1FeHBvcnQtUGFja2FnZTogY29tLmlibS53c2RsLGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLmh0dHAsY29tLmlibS53c2RsLmV4dGVuc2lvbnMubWltZSxjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zY2hlbWEsY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcCxjb20uaWJtLndzZGwuZmFjdG9yeSxjb20uaWJtLndzZGwudXRpbCxjb20uaWJtLndzZGwudXRpbC54bWwsY29tLmlibS53c2RsLnhtbCxqYXZheC53c2RsLGphdmF4LndzZGwuZXh0ZW5zaW9ucyxqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cCxqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZSxqYXZheC53c2RsLmV4dGVuc2lvbnMuc2NoZW1hLGphdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwLGphdmF4LndzZGwuZmFjdG9yeSxqYXZheC53c2RsLnhtbAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLnhlcmNlcztidW5kbGUtdmVyc2lvbj0mcXVvdDtbMi44LjAsMy4wLjApJnF1b3Q7O3Jlc29sdXRpb246PW9wdGlvbmFsCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGphdmF4LndzZGwKLUNyZWF0ZWQtQnk6IDEuNC4yIChJQk0gQ29ycG9yYXRpb24pCi1TcGVjaWZpY2F0aW9uLVZlcnNpb246IDEuMQotSW1wbGVtZW50YXRpb24tVmVyc2lvbjogMS41LjEKLVNwZWNpZmljYXRpb24tVmVuZG9yOiBJQk0gKEphdmEgQ29tbXVuaXR5IFByb2Nlc3MpCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2phdmF4LnNlcnZsZXQuanNwLnNvdXJjZScgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdqYXZheC5zZXJ2bGV0LmpzcC5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS4yLjAudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nSlNQIEFQSSBTb3VyY2UnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdqYXZheC5zZXJ2bGV0LmpzcC5zb3VyY2UnIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2phdmF4LnNlcnZsZXQuanNwLnNvdXJjZScgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0namF2YXguc2VydmxldC5qc3Auc291cmNlJyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuMi4wLnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogamF2YXguc2VydmxldC5qc3Auc291cmNlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IGphdmF4LnNlcnZsZXQuanNwO3ZlcnNpb249JnF1b3Q7MS4yLjAudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5iYXRpay51dGlsJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuYmF0aWsudXRpbCcgcmFuZ2U9J1swLjAuMCwxLjYuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdBcGFjaGUgQmF0aWsgVXRpbGl0aWVzJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclcGx1Z2luTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVwcm92aWRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc5Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay51dGlsJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnV0aWwnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsuaTE4bicgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnV0aWwnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5iYXRpay51dGlsLmlvJyB2ZXJzaW9uPScxLjYuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuYmF0aWsudXRpbC5yZXNvdXJjZXMnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMSc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnV0aWwuZ3VpJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmJhdGlrLnV0aWwnIHZlcnNpb249JzEuNi4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjMKLVJlcXVpcmUtQnVuZGxlOiBvcmcuYXBhY2hlLmJhdGlrLnV0aWwuZ3VpO3ZlcnNpb249JnF1b3Q7WzEuNi4wLDEuNy4wKSZxdW90OwotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMS42LjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuYmF0aWs7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLmkxOG47dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnV0aWw7dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnV0aWwuaW87dmVyc2lvbj0mcXVvdDsxLjYuMCZxdW90OyxvcmcuYXBhY2hlLmJhdGlrLnV0aWwucmVzb3VyY2VzO3ZlcnNpb249JnF1b3Q7MS42LjAmcXVvdDsKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5hcGFjaGUuYmF0aWsudXRpbAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2phdmF4Lm1haWwnIHZlcnNpb249JzEuNC4wLnYyMDA4MDMwNjE4MTEnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0namF2YXgubWFpbCcgcmFuZ2U9J1swLjAuMCwxLjQuMC52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLVZlbmRvci4wJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1OYW1lLjAnIHZhbHVlPSdUZW1wIFBsdWctaW4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVCdW5kbGUtTmFtZS4wJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJUJ1bmRsZS1WZW5kb3IuMCcvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzE2Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0namF2YXgubWFpbCcgdmVyc2lvbj0nMS40LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YXgubWFpbCcgdmVyc2lvbj0nMS40LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5zdW4ubWFpbC5oYW5kbGVycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uc3VuLm1haWwuaWFwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5zdW4ubWFpbC5pbWFwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5zdW4ubWFpbC5pbWFwLnByb3RvY29sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5zdW4ubWFpbC5wb3AzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5zdW4ubWFpbC5zbXRwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5zdW4ubWFpbC51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm1haWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubWFpbC5ldmVudCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5tYWlsLmludGVybmV0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm1haWwuc2VhcmNoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm1haWwudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScyJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2knIHJhbmdlPScwLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YXguYWN0aXZhdGlvbicgcmFuZ2U9JzEuMS4wJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0namF2YXgubWFpbCcgdmVyc2lvbj0nMS40LjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotUmVxdWlyZS1CdW5kbGU6IHN5c3RlbS5idW5kbGUsIGphdmF4LmFjdGl2YXRpb247YnVuZGxlLXZlcnNpb249JnF1b3Q7MS4xLjAmcXVvdDsKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVZlcnNpb246IDEuNC4wLnYyMDA4MDMwNjE4MTEKLUV4cG9ydC1QYWNrYWdlOiBjb20uc3VuLm1haWwuaGFuZGxlcnMsY29tLnN1bi5tYWlsLmlhcCxjb20uc3VuLm1haWwuaW1hcCxjb20uc3VuLm1haWwuaW1hcC5wcm90b2NvbCxjb20uc3VuLm1haWwucG9wMyxjb20uc3VuLm1haWwuc210cCxjb20uc3VuLm1haWwudXRpbCxqYXZheC5tYWlsLGphdmF4Lm1haWwuZXZlbnQsamF2YXgubWFpbC5pbnRlcm5ldCxqYXZheC5tYWlsLnNlYXJjaCxqYXZheC5tYWlsLnV0aWwKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGphdmF4Lm1haWwKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdjb20uamNyYWZ0LmpzY2gnIHZlcnNpb249JzAuMS4yOCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdjb20uamNyYWZ0LmpzY2gnIHJhbmdlPSdbMC4wLjAsMC4xLjI4KScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlTmFtZScgdmFsdWU9J0pTY2gnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnZlbmRlck5hbWUnIHZhbHVlPSdKQ3JhZnQsIEluYy4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVidW5kbGVOYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXZlbmRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc3Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nY29tLmpjcmFmdC5qc2NoJyB2ZXJzaW9uPScwLjEuMjgnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2NvbS5qY3JhZnQuanNjaCcgdmVyc2lvbj0nMC4xLjI4Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmpjcmFmdC5qc2NoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5qY3JhZnQuanNjaC5qY2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmpjcmFmdC5qc2NoLmpjcmFmdCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J2NvbS5qY3JhZnQuanNjaCcgdmVyc2lvbj0nMC4xLjI4Jy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLVZlbmRvcjogJXZlbmRlck5hbWUKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNAotQnVuZGxlLUNsYXNzUGF0aDogLgotQnVuZGxlLU5hbWU6ICVidW5kbGVOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogY29tLmpjcmFmdC5qc2NoCi1CdW5kbGUtVmVyc2lvbjogMC4xLjI4Ci1DcmVhdGVkLUJ5OiAxLjQuMCAoU3VuIE1pY3Jvc3lzdGVtcyBJbmMuKQotRXhwb3J0LVBhY2thZ2U6IGNvbS5qY3JhZnQuanNjaCwgY29tLmpjcmFmdC5qc2NoLmpjZTt4LWludGVybmFsOj10cnVlLCBjb20uamNyYWZ0LmpzY2guamNyYWZ0O3gtaW50ZXJuYWw6PXRydWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2NvbS5qY3JhZnQuanNjaC5zb3VyY2UnIHZlcnNpb249JzAuMS4zNy52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J2NvbS5qY3JhZnQuanNjaC5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMC4xLjM3LnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVOYW1lJyB2YWx1ZT0nSlNjaCBTb3VyY2UnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnZlbmRlck5hbWUnIHZhbHVlPSdKQ3JhZnQsIEluYy4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVidW5kbGVOYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXZlbmRlck5hbWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nY29tLmpjcmFmdC5qc2NoLnNvdXJjZScgdmVyc2lvbj0nMC4xLjM3LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J2NvbS5qY3JhZnQuanNjaC5zb3VyY2UnIHZlcnNpb249JzAuMS4zNy52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdjb20uamNyYWZ0LmpzY2guc291cmNlJyB2ZXJzaW9uPScwLjEuMzcudjIwMDgwMzA2MTgxMScvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1WZXJzaW9uOiAwLjEuMzcudjIwMDgwMzA2MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBjb20uamNyYWZ0LmpzY2guc291cmNlCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IGNvbS5qY3JhZnQuanNjaDt2ZXJzaW9uPSZxdW90OzAuMS4zNy52MjAwODAzMDYxODExJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAldmVuZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5qYXNwZXInIHZlcnNpb249JzUuNS4xNy52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuamFzcGVyJyByYW5nZT0nWzAuMC4wLDUuNS4xNy52MjAwODAzMDYxODExKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuYnVuZGxlTmFtZScgdmFsdWU9J0FwYWNoZSBKYXNwZXIgMiBQbHVnLWluJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5idW5kbGVQcm92aWRlcicgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclYnVuZGxlTmFtZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVidW5kbGVQcm92aWRlcicvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzE1Jz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmFwYWNoZS5qYXNwZXInIHZlcnNpb249JzUuNS4xNy52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmphc3BlcicgdmVyc2lvbj0nNS41LjE3LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmphc3BlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmphc3Blci5jb21waWxlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmphc3Blci5jb21waWxlci50YWdwbHVnaW4nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5qYXNwZXIucmVzb3VyY2VzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuamFzcGVyLnJ1bnRpbWUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5qYXNwZXIuc2VjdXJpdHknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5qYXNwZXIuc2VydmxldCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmphc3Blci50YWdwbHVnaW5zLmpzdGwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLmNvcmUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5qYXNwZXIudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmphc3Blci54bWxwYXJzZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMTgnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQnIHJhbmdlPScyLjQuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuaHR0cCcgcmFuZ2U9JzIuNC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldC5qc3AnIHJhbmdlPScyLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuanNwLmVsJyByYW5nZT0nMi4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZXJ2bGV0LmpzcC5yZXNvdXJjZXMnIHJhbmdlPScyLjAuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlcnZsZXQuanNwLnRhZ2V4dCcgcmFuZ2U9JzIuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VydmxldC5yZXNvdXJjZXMnIHJhbmdlPScyLjQuMCcvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC5wYXJzZXJzJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuZWwnIHJhbmdlPSdbMS4wLjAsMi4wLjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcnIHJhbmdlPSdbMS4wLjAsMi4wLjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQnIHJhbmdlPScwLjAuMCcgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcycgcmFuZ2U9JzAuMC4wJyBvcHRpb25hbD0ndHJ1ZScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUudG9vbHMuYW50LnR5cGVzJyByYW5nZT0nMC4wLjAnIG9wdGlvbmFsPSd0cnVlJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS50b29scy5hbnQudXRpbCcgcmFuZ2U9JzAuMC4wJyBvcHRpb25hbD0ndHJ1ZScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy53M2MuZG9tJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcueG1sLnNheCcgcmFuZ2U9JzAuMC4wJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnhtbC5zYXguZXh0JyByYW5nZT0nMC4wLjAnLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcueG1sLnNheC5oZWxwZXJzJyByYW5nZT0nMC4wLjAnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmphc3BlcicgdmVyc2lvbj0nNS41LjE3LnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtVmVuZG9yOiAlYnVuZGxlUHJvdmlkZXIKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNCxDREMtMS4wL0ZvdW5kYXRpb24tMS4wLEoyU0UtMS4zCi1CdW5kbGUtQ2xhc3NQYXRoOiAuCi1JbXBvcnQtUGFja2FnZTogamF2YXguc2VydmxldDt2ZXJzaW9uPSZxdW90OzIuNCZxdW90OyxqYXZheC5zZXJ2bGV0Lmh0dHA7dmVyc2lvbj0mcXVvdDsyLjQmcXVvdDssamF2YXguc2VydmxldC5qc3A7dmVyc2lvbj0mcXVvdDsyLjAmcXVvdDssamF2YXguc2VydmxldC5qc3AuZWw7dmVyc2lvbj0mcXVvdDsyLjAmcXVvdDssamF2YXguc2VydmxldC5qc3AucmVzb3VyY2VzO3ZlcnNpb249JnF1b3Q7Mi4wJnF1b3Q7LGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dDt2ZXJzaW9uPSZxdW90OzIuMCZxdW90OyxqYXZheC5zZXJ2bGV0LnJlc291cmNlczt2ZXJzaW9uPSZxdW90OzIuNCZxdW90OyxqYXZheC54bWwucGFyc2VycyxvcmcuYXBhY2hlLmNvbW1vbnMuZWw7dmVyc2lvbj0mcXVvdDtbMS4wLjAsMi4wLjApJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nO3ZlcnNpb249JnF1b3Q7WzEuMC4wLDIuMC4wKSZxdW90OyxvcmcuYXBhY2hlLnRvb2xzLmFudDtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLnRvb2xzLmFudC50YXNrZGVmcztyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcztyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLnRvb2xzLmFudC51dGlsO3Jlc29sdXRpb246PW9wdGlvbmFsLG9yZy53M2MuZG9tLG9yZy54bWwuc2F4LG9yZy54bWwuc2F4LmV4dCxvcmcueG1sLnNheC5oZWxwZXJzCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmphc3BlcgotQnVuZGxlLVZlcnNpb246IDUuNS4xNy52MjAwODAzMDYxODExCi1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5qYXNwZXIsb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIsb3JnLmFwYWNoZS5qYXNwZXIuY29tcGlsZXIudGFncGx1Z2luLG9yZy5hcGFjaGUuamFzcGVyLnJlc291cmNlcyxvcmcuYXBhY2hlLmphc3Blci5ydW50aW1lLG9yZy5hcGFjaGUuamFzcGVyLnNlY3VyaXR5LG9yZy5hcGFjaGUuamFzcGVyLnNlcnZsZXQsb3JnLmFwYWNoZS5qYXNwZXIudGFncGx1Z2lucy5qc3RsLG9yZy5hcGFjaGUuamFzcGVyLnRhZ3BsdWdpbnMuanN0bC5jb3JlLG9yZy5hcGFjaGUuamFzcGVyLnV0aWwsb3JnLmFwYWNoZS5qYXNwZXIueG1scGFyc2VyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSdvcmcudzNjLmRvbS5zdmcuc291cmNlJyB2ZXJzaW9uPScxLjEuMC52MjAwODAzMDgxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy53M2MuZG9tLnN2Zy5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS4xLjAudjIwMDgwMzA4MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nVzNDIFNWRyBET00gU291cmNlIEJ1bmRsZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy53M2MuZG9tLnN2Zy5zb3VyY2UnIHZlcnNpb249JzEuMS4wLnYyMDA4MDMwODE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy53M2MuZG9tLnN2Zy5zb3VyY2UnIHZlcnNpb249JzEuMS4wLnYyMDA4MDMwODE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy53M2MuZG9tLnN2Zy5zb3VyY2UnIHZlcnNpb249JzEuMS4wLnYyMDA4MDMwODE4MTEnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAudjIwMDgwMzA4MTgxMQotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcudzNjLmRvbS5zdmcuc291cmNlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy53M2MuZG9tLnN2Zzt2ZXJzaW9uPSZxdW90OzEuMS4wLnYyMDA4MDMwODE4MTEmcXVvdDsKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nJyB2ZXJzaW9uPScyLjEuMC52MjAwODAzMDYxODExJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDx1cGRhdGUgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nJyByYW5nZT0nWzAuMC4wLDIuMS4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBKYWthcnRhIENvbW1vbnMgTGFuZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTEnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubGFuZycgdmVyc2lvbj0nMi4xLjAudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxhbmcnIHZlcnNpb249JzIuMS4wLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubGFuZycgdmVyc2lvbj0nMi4xLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5idWlsZGVyJyB2ZXJzaW9uPScyLjEuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmVudW1zJyB2ZXJzaW9uPScyLjEuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmV4Y2VwdGlvbicgdmVyc2lvbj0nMi4xLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5tYXRoJyB2ZXJzaW9uPScyLjEuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nLm11dGFibGUnIHZlcnNpb249JzIuMS4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxhbmcudGltZScgdmVyc2lvbj0nMi4xLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUuY29tbW9ucy5sYW5nJyB2ZXJzaW9uPScyLjEuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVyc2lvbjogMi4xLjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nO3ZlcnNpb249JnF1b3Q7Mi4xLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuYnVpbGRlcjt2ZXJzaW9uPSZxdW90OzIuMS4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLmVudW1zO3ZlcnNpb249JnF1b3Q7Mi4xLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuZXhjZXB0aW9uO3ZlcnNpb249JnF1b3Q7Mi4xLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmxhbmcubWF0aDt2ZXJzaW9uPSZxdW90OzIuMS4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLm11dGFibGU7dmVyc2lvbj0mcXVvdDsyLjEuMCZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy50aW1lO3ZlcnNpb249JnF1b3Q7Mi4xLjAmcXVvdDsKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKUkUtMS4xCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5qdW5pdCcgdmVyc2lvbj0nMy44LjIudjIwMDgwMzA2MTkxMCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuanVuaXQnIHJhbmdlPSdbMC4wLjAsMy44LjIudjIwMDgwMzA2MTkxMCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nSlVuaXQgVGVzdGluZyBGcmFtZXdvcmsnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzExJz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0nb3JnLmp1bml0JyB2ZXJzaW9uPSczLjguMi52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuanVuaXQnIHZlcnNpb249JzMuOC4yLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqdW5pdC5hd3R1aScgdmVyc2lvbj0nMy44LjInLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqdW5pdC5leHRlbnNpb25zJyB2ZXJzaW9uPSczLjguMicvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2p1bml0LmZyYW1ld29yaycgdmVyc2lvbj0nMy44LjInLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqdW5pdC5ydW5uZXInIHZlcnNpb249JzMuOC4yJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nanVuaXQuc3dpbmd1aScgdmVyc2lvbj0nMy44LjInLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqdW5pdC5zd2luZ3VpLmljb25zJyB2ZXJzaW9uPSczLjguMicvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2p1bml0LnRleHR1aScgdmVyc2lvbj0nMy44LjInLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5qdW5pdCcgdmVyc2lvbj0nMy44LjIudjIwMDgwMzA2MTkxMCcvPgotICAgICAgPC9hcnRpZmFjdHM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5vc2dpJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzInPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J21hbmlmZXN0Jz4KLSAgICAgICAgICAgIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMwotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMy44LjIudjIwMDgwMzA2MTkxMAotRXhwb3J0LVBhY2thZ2U6IGp1bml0LmF3dHVpO3ZlcnNpb249JnF1b3Q7My44LjImcXVvdDssanVuaXQuZXh0ZW5zaW9uczt2ZXJzaW9uPSZxdW90OzMuOC4yJnF1b3Q7LGp1bml0LmZyYW1ld29yazt2ZXJzaW9uPSZxdW90OzMuOC4yJnF1b3Q7LGp1bml0LnJ1bm5lcjt2ZXJzaW9uPSZxdW90OzMuOC4yJnF1b3Q7LGp1bml0LnN3aW5ndWk7dmVyc2lvbj0mcXVvdDszLjguMiZxdW90OyxqdW5pdC5zd2luZ3VpLmljb25zO3ZlcnNpb249JnF1b3Q7My44LjImcXVvdDssanVuaXQudGV4dHVpO3ZlcnNpb249JnF1b3Q7My44LjImcXVvdDsKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5qdW5pdAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtQ2xhc3NQYXRoOiBqdW5pdC5qYXIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSd6aXBwZWQnPgotICAgICAgICAgICAgdHJ1ZQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2phdmF4LndzZGwxNScgdmVyc2lvbj0nMS41LjEudjIwMDcwNTI5MDYxNCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdqYXZheC53c2RsMTUnIHJhbmdlPSdbMC4wLjAsMS41LjEudjIwMDcwNTI5MDYxNCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1WZW5kb3IuMCcgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtTmFtZS4wJyB2YWx1ZT0nV1NETDRKJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclQnVuZGxlLU5hbWUuMCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVCdW5kbGUtVmVuZG9yLjAnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScyMic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2phdmF4LndzZGwxNScgdmVyc2lvbj0nMS41LjEudjIwMDcwNTI5MDYxNCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0namF2YXgud3NkbDE1JyB2ZXJzaW9uPScxLjUuMS52MjAwNzA1MjkwNjE0Jy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC5leHRlbnNpb25zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC5leHRlbnNpb25zLmh0dHAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLmV4dGVuc2lvbnMubWltZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zY2hlbWEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwuZmFjdG9yeScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwudXRpbC54bWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLnhtbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC53c2RsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwuZXh0ZW5zaW9ucycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC53c2RsLmV4dGVuc2lvbnMuc2NoZW1hJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwuZmFjdG9yeScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC53c2RsLnhtbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScxJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzJyByYW5nZT0nWzIuOC4wLDMuMC4wKScgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdqYXZheC53c2RsMTUnIHZlcnNpb249JzEuNS4xLnYyMDA3MDUyOTA2MTQnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS54ZXJjZXM7YnVuZGxlLXZlcnNpb249JnF1b3Q7WzIuOC4wLDMuMC4wKSZxdW90OztyZXNvbHV0aW9uOj1vcHRpb25hbAotQ3JlYXRlZC1CeTogMS40LjIgKElCTSBDb3Jwb3JhdGlvbikKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLUNsYXNzUGF0aDogbGliL3dzZGw0ai0xLjUuMS5qYXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUltcGxlbWVudGF0aW9uLVRpdGxlOiBXU0RMNEoKLUltcGxlbWVudGF0aW9uLVZlbmRvcjogSUJNCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLVNwZWNpZmljYXRpb24tVmVuZG9yOiBJQk0gKEphdmEgQ29tbXVuaXR5IFByb2Nlc3MpCi1CdW5kbGUtVmVyc2lvbjogMS41LjEudjIwMDcwNTI5MDYxNAotU3BlY2lmaWNhdGlvbi1WZXJzaW9uOiAxLjEKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuMgotRXhwb3J0LVBhY2thZ2U6IGNvbS5pYm0ud3NkbCxjb20uaWJtLndzZGwuZXh0ZW5zaW9ucyxjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5odHRwLGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLm1pbWUsY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc2NoZW1hLGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLnNvYXAsY29tLmlibS53c2RsLmZhY3RvcnksY29tLmlibS53c2RsLnV0aWwsY29tLmlibS53c2RsLnV0aWwueG1sLGNvbS5pYm0ud3NkbC54bWwsamF2YXgud3NkbCxqYXZheC53c2RsLmV4dGVuc2lvbnMsamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAsamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUsamF2YXgud3NkbC5leHRlbnNpb25zLnNjaGVtYSxqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcCxqYXZheC53c2RsLmZhY3RvcnksamF2YXgud3NkbC54bWwKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGphdmF4LndzZGwxNQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1TcGVjaWZpY2F0aW9uLVRpdGxlOiBKV1NETAotSW1wbGVtZW50YXRpb24tVmVyc2lvbjogMS41LjEKLQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J29yZy5hcGFjaGUubHVjZW5lLnNvdXJjZScgdmVyc2lvbj0nMS45LjEudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmx1Y2VuZS5zb3VyY2UnIHJhbmdlPSdbMC4wLjAsMS45LjEudjIwMDgwMzA2MTgxMSknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnByb3ZpZGVyTmFtZScgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wbHVnaW5OYW1lJyB2YWx1ZT0nQXBhY2hlIEx1Y2VuZSBTb3VyY2UnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmx1Y2VuZS5zb3VyY2UnIHZlcnNpb249JzEuOS4xLnYyMDA4MDMwNjE4MTEnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUubHVjZW5lLnNvdXJjZScgdmVyc2lvbj0nMS45LjEudjIwMDgwMzA2MTgxMScvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5sdWNlbmUuc291cmNlJyB2ZXJzaW9uPScxLjkuMS52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuOS4xLnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5sdWNlbmUuc291cmNlCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5hcGFjaGUubHVjZW5lO3ZlcnNpb249JnF1b3Q7MS45LjEudjIwMDgwMzA2MTgxMSZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5iYXRpay50cmFuc2NvZGVyLnNvdXJjZScgdmVyc2lvbj0nMS42LjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXIuc291cmNlJyByYW5nZT0nWzAuMC4wLDEuNi4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5wcm92aWRlck5hbWUnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucGx1Z2luTmFtZScgdmFsdWU9J0FwYWNoZSBCYXRpayBUcmFuc2NvZGVyIFNvdXJjZSBCdW5kbGUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVwbHVnaW5OYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJXByb3ZpZGVyTmFtZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzQnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXIuc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXIuc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdzb3VyY2UnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubG9jYWxpemF0aW9uJyBuYW1lPSdkZl9MVCcgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXIuc291cmNlJyB2ZXJzaW9uPScxLjYuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVZlcnNpb246IDEuNi4wLnYyMDA4MDMwNjE4MTEKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS5iYXRpay50cmFuc2NvZGVyLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuYXBhY2hlLmJhdGlrLnRyYW5zY29kZXI7dmVyc2lvbj0mcXVvdDsxLjYuMC52MjAwODAzMDYxODExJnF1b3Q7Ci1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSduZXQuc291cmNlZm9yZ2UubHBnLmxwZ2phdmFydW50aW1lLnNvdXJjZScgdmVyc2lvbj0nMS4xLjAudjIwMDgwMzA2MTkxMCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSduZXQuc291cmNlZm9yZ2UubHBnLmxwZ2phdmFydW50aW1lLnNvdXJjZScgcmFuZ2U9J1swLjAuMCwxLjEuMC52MjAwODAzMDYxOTEwKScgc2V2ZXJpdHk9JzAnLz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzQnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQucHJvdmlkZXJOYW1lJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULnBsdWdpbk5hbWUnIHZhbHVlPSdTb3VyY2VGb3JnZSBMUEcgU291cmNlIEJ1bmRsZScvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJXBsdWdpbk5hbWUnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclcHJvdmlkZXJOYW1lJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J25ldC5zb3VyY2Vmb3JnZS5scGcubHBnamF2YXJ1bnRpbWUuc291cmNlJyB2ZXJzaW9uPScxLjEuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSduZXQuc291cmNlZm9yZ2UubHBnLmxwZ2phdmFydW50aW1lLnNvdXJjZScgdmVyc2lvbj0nMS4xLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nbmV0LnNvdXJjZWZvcmdlLmxwZy5scGdqYXZhcnVudGltZS5zb3VyY2UnIHZlcnNpb249JzEuMS4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtVmVyc2lvbjogMS4xLjAudjIwMDgwMzA2MTkxMAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBuZXQuc291cmNlZm9yZ2UubHBnLmxwZ2phdmFydW50aW1lLnNvdXJjZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtU291cmNlQnVuZGxlOiBuZXQuc291cmNlZm9yZ2UubHBnLmxwZ2phdmFydW50aW1lO3ZlcnNpb249JnF1b3Q7MS4xLjAudjIwMDgwMzA2MTkxMCZxdW90OwotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQnIHZlcnNpb249JzMuMS4wLnYyMDA4MDMwNjE5MTAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQnIHJhbmdlPSdbMC4wLjAsMy4xLjAudjIwMDgwMzA2MTkxMCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZU5hbWUnIHZhbHVlPSdBcGFjaGUgQ29tbW9ucyBIdHRwY2xpZW50IFBsdWctaW4nLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULmJ1bmRsZVByb3ZpZGVyJyB2YWx1ZT0nRWNsaXBzZS5vcmcnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmFtZScgdmFsdWU9JyVidW5kbGVOYW1lJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnByb3ZpZGVyJyB2YWx1ZT0nJWJ1bmRsZVByb3ZpZGVyJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMTInPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudCcgdmVyc2lvbj0nMy4xLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvc2dpLmJ1bmRsZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQnIHZlcnNpb249JzMuMS4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudCcgdmVyc2lvbj0nMy4xLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5hdXRoJyB2ZXJzaW9uPSczLjEuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LmNvb2tpZScgdmVyc2lvbj0nMy4xLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzJyB2ZXJzaW9uPSczLjEuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHMubXVsdGlwYXJ0JyB2ZXJzaW9uPSczLjEuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnBhcmFtcycgdmVyc2lvbj0nMy4xLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5wcm90b2NvbCcgdmVyc2lvbj0nMy4xLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC51dGlsJyB2ZXJzaW9uPSczLjEuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmxvY2FsaXphdGlvbicgbmFtZT0nZGZfTFQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzgnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LmNyeXB0bycgcmFuZ2U9JzAuMC4wJyBvcHRpb25hbD0ndHJ1ZScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LmNyeXB0by5zcGVjJyByYW5nZT0nMC4wLjAnIG9wdGlvbmFsPSd0cnVlJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubmV0JyByYW5nZT0nMC4wLjAnIG9wdGlvbmFsPSd0cnVlJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubmV0LnNzbCcgcmFuZ2U9JzAuMC4wJyBvcHRpb25hbD0ndHJ1ZScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYycgcmFuZ2U9J1sxLjIuMCwyLjAuMCknLz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5JyByYW5nZT0nWzEuMi4wLDIuMC4wKScvPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5uZXQnIHJhbmdlPSdbMS4yLjAsMi4wLjApJy8+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcnIHJhbmdlPSdbMS4wLjQsMi4wLjApJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGFydGlmYWN0cyBzaXplPScxJz4KLSAgICAgICAgPGFydGlmYWN0IGNsYXNzaWZpZXI9J29zZ2kuYnVuZGxlJyBpZD0nb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQnIHZlcnNpb249JzMuMS4wLnYyMDA4MDMwNjE5MTAnLz4KLSAgICAgIDwvYXJ0aWZhY3RzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScxJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdtYW5pZmVzdCc+Ci0gICAgICAgICAgICBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCxKMlNFLTEuMgotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMy4xLjAudjIwMDgwMzA2MTkxMAotRXhwb3J0LVBhY2thZ2U6IG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50O3ZlcnNpb249JnF1b3Q7My4xLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQuYXV0aDt2ZXJzaW9uPSZxdW90OzMuMS4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LmNvb2tpZTt2ZXJzaW9uPSZxdW90OzMuMS4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50Lm1ldGhvZHM7dmVyc2lvbj0mcXVvdDszLjEuMCZxdW90OyxvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudC5tZXRob2RzLm11bHRpcGFydDt2ZXJzaW9uPSZxdW90OzMuMS4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnBhcmFtczt2ZXJzaW9uPSZxdW90OzMuMS4wJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5odHRwY2xpZW50LnByb3RvY29sO3ZlcnNpb249JnF1b3Q7My4xLjAmcXVvdDssb3JnLmFwYWNoZS5jb21tb25zLmh0dHBjbGllbnQudXRpbDt2ZXJzaW9uPSZxdW90OzMuMS4wJnF1b3Q7Ci1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuYXBhY2hlLmNvbW1vbnMuaHR0cGNsaWVudAotSW1wb3J0LVBhY2thZ2U6IGphdmF4LmNyeXB0bztyZXNvbHV0aW9uOj1vcHRpb25hbCxqYXZheC5jcnlwdG8uc3BlYztyZXNvbHV0aW9uOj1vcHRpb25hbCxqYXZheC5uZXQ7cmVzb2x1dGlvbjo9b3B0aW9uYWwsamF2YXgubmV0LnNzbDtyZXNvbHV0aW9uOj1vcHRpb25hbCxvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWM7dmVyc2lvbj0mcXVvdDtbMS4yLjAsMi4wLjApJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnk7dmVyc2lvbj0mcXVvdDtbMS4yLjAsMi4wLjApJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5uZXQ7dmVyc2lvbj0mcXVvdDtbMS4yLjAsMi4wLjApJnF1b3Q7LG9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nO3ZlcnNpb249JnF1b3Q7WzEuMC40LDIuMC4wKSZxdW90OwotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVidW5kbGVQcm92aWRlcgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nb3JnLmFwYWNoZS54bWwucmVzb2x2ZXInIHZlcnNpb249JzEuMi4wLnYyMDA4MDMwNjE5MTAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPHVwZGF0ZSBpZD0nb3JnLmFwYWNoZS54bWwucmVzb2x2ZXInIHJhbmdlPSdbMC4wLjAsMS4yLjAudjIwMDgwMzA2MTkxMCknIHNldmVyaXR5PScwJy8+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPSc0Jz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J2RmX0xULkJ1bmRsZS1WZW5kb3IuMCcgdmFsdWU9J0VjbGlwc2Uub3JnJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtTmFtZS4wJyB2YWx1ZT0nQXBhY2hlIFhtbFJlc29sdmVyJy8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm5hbWUnIHZhbHVlPSclQnVuZGxlLU5hbWUuMCcvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5wcm92aWRlcicgdmFsdWU9JyVCdW5kbGUtVmVuZG9yLjAnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScxMSc+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J29yZy5hcGFjaGUueG1sLnJlc29sdmVyJyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdvcmcuYXBhY2hlLnhtbC5yZXNvbHZlcicgdmVyc2lvbj0nMS4yLjAudjIwMDgwMzA2MTkxMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUuZW52JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLnJlc29sdmVyJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLnJlc29sdmVyLmFwcHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuZXRjJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5hcGFjaGUueG1sLnJlc29sdmVyLmhlbHBlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIucmVhZGVycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuYXBhY2hlLnhtbC5yZXNvbHZlci50b29scycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScxJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5lY2xpcHNlLm9zZ2knIHJhbmdlPScwLjAuMCcvPgotICAgICAgPC9yZXF1aXJlcz4KLSAgICAgIDxhcnRpZmFjdHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxhcnRpZmFjdCBjbGFzc2lmaWVyPSdvc2dpLmJ1bmRsZScgaWQ9J29yZy5hcGFjaGUueG1sLnJlc29sdmVyJyB2ZXJzaW9uPScxLjIuMC52MjAwODAzMDYxOTEwJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4yCi1NYWluLUNsYXNzOiBvcmcuYXBhY2hlLnhtbC5yZXNvbHZlci5hcHBzLnJlc29sdmVyCi1SZXF1aXJlLUJ1bmRsZTogc3lzdGVtLmJ1bmRsZQotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIKLUJ1bmRsZS1WZXJzaW9uOiAxLjIuMC52MjAwODAzMDYxOTEwCi1FeHBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS5lbnYsb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIsb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuYXBwcyxvcmcuYXBhY2hlLnhtbC5yZXNvbHZlci5ldGMsb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIuaGVscGVycyxvcmcuYXBhY2hlLnhtbC5yZXNvbHZlci5yZWFkZXJzLG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLnRvb2xzCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICA8L3VuaXRzPgotPC9yZXBvc2l0b3J5PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL29yZy5lY2xpcHNlLmpkdC4zLjIuMS5wYXRjaF8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3JnLmVjbGlwc2UuamR0LjMuMi4xLnBhdGNoXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IxMzRiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvb3JnLmVjbGlwc2UuamR0LjMuMi4xLnBhdGNoXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9wcm9maWxlU3luY2hyb25pemVyL2FhYV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci9hYWFfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmZjNGE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9wcm9maWxlU3luY2hyb25pemVyL2FhYV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci9iYmIubGludXhfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvYmJiLmxpbnV4XzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1NzFlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci9iYmIubGludXhfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvYmJiLndpbjMyXzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9wcm9maWxlU3luY2hyb25pemVyL2JiYi53aW4zMl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMTNjZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvYmJiLndpbjMyXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9wcm9maWxlU3luY2hyb25pemVyL2JiYl8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci9iYmJfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2NmYmM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9wcm9maWxlU3luY2hyb25pemVyL2JiYl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci9jY2NfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvY2NjXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI4ZDlhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcHJvZmlsZVN5bmNocm9uaXplci9jY2NfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvY2NjXzIuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9wcm9maWxlU3luY2hyb25pemVyL2NjY18yLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMTNjYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3Byb2ZpbGVTeW5jaHJvbml6ZXIvY2NjXzIuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlRGlyZWN0b3J5L3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZURpcmVjdG9yeS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWY4ZmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlRGlyZWN0b3J5L3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbiBpZD0ib2xkQnVuZGxlRGlyZWN0b3J5IiBuYW1lPSJ0ZXN0IHBsdWctaW4iIHZlcnNpb249IjEuMC4wIj4KLQotICAgPHJ1bnRpbWU+Ci0gICAgICA8bGlicmFyeSBuYW1lPSIuIj4KLSAgICAgICAgIDxleHBvcnQgbmFtZT0iKiIvPgotICAgICAgPC9saWJyYXJ5PgotICAgPC9ydW50aW1lPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3JlcG9zaXRvcnlMaXN0ZW5lci9vbGRCdW5kbGVEaXJlY3RvcnlUd28vTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZURpcmVjdG9yeVR3by9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkNGM0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZURpcmVjdG9yeVR3by9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZURpcmVjdG9yeVR3by9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3JlcG9zaXRvcnlMaXN0ZW5lci9vbGRCdW5kbGVEaXJlY3RvcnlUd28vcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRhN2ZhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZURpcmVjdG9yeVR3by9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4gaWQ9Im9sZEJ1bmRsZURpcmVjdG9yeVR3byIgbmFtZT0idGVzdCBwbHVnLWluIiB2ZXJzaW9uPSIxLjAuMCI+Ci0KLSAgIDxydW50aW1lPgotICAgICAgPGxpYnJhcnkgbmFtZT0iLiI+Ci0gICAgICAgICA8ZXhwb3J0IG5hbWU9IioiLz4KLSAgICAgIDwvbGlicmFyeT4KLSAgIDwvcnVudGltZT4KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlSkFSLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS9yZXBvc2l0b3J5TGlzdGVuZXIvb2xkQnVuZGxlSkFSLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZmMDFlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZUpBUi5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZUpBUlR3by5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvcmVwb3NpdG9yeUxpc3RlbmVyL29sZEJ1bmRsZUpBUlR3by5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYjJkNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3JlcG9zaXRvcnlMaXN0ZW5lci9vbGRCdW5kbGVKQVJUd28uamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkU2l0ZVhNTC9zaXRlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZFNpdGVYTUwvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMmVjMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkU2l0ZVhNTC9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlCi08L3NpdGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRkaWdlc3RiYWRzaXRlL2RpZ2VzdC9kaWdlc3QuemlwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZGlnZXN0YmFkc2l0ZS9kaWdlc3QvZGlnZXN0LnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhNGMyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRkaWdlc3RiYWRzaXRlL2RpZ2VzdC9kaWdlc3QuemlwCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi08aHRtbD4NCi08Ym9keT5maWxlIG5vdCBmb3VuZCAtIGJhZCBkaWdlc3QgdGVzdDwvYm9keT4NCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZGlnZXN0YmFkc2l0ZS9mZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZGlnZXN0YmFkc2l0ZS9mZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGJiYzY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGRpZ2VzdGJhZHNpdGUvZmVhdHVyZXMvdGVzdC5mZWF0dXJlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGRpZ2VzdGJhZHNpdGUvcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRkaWdlc3RiYWRzaXRlL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGRkODI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGRpZ2VzdGJhZHNpdGUvcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRkaWdlc3RiYWRzaXRlL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRkaWdlc3RiYWRzaXRlL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMzNlMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZGlnZXN0YmFkc2l0ZS9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZGlnZXN0YmFkc2l0ZS9zaXRlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGRpZ2VzdGJhZHNpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzOWUyYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZGlnZXN0YmFkc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlIC0tIEJBREJBRAotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyIiBpZD0idGVzdC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMCIvPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZGlnZXN0Z29vZHNpdGUvZGlnZXN0L2RpZ2VzdC56aXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRkaWdlc3Rnb29kc2l0ZS9kaWdlc3QvZGlnZXN0LnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhNGMyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRkaWdlc3Rnb29kc2l0ZS9kaWdlc3QvZGlnZXN0LnppcAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotPGh0bWw+DQotPGJvZHk+ZmlsZSBub3QgZm91bmQgLSBiYWQgZGlnZXN0IHRlc3Q8L2JvZHk+DQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGRpZ2VzdGdvb2RzaXRlL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRkaWdlc3Rnb29kc2l0ZS9mZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGJiYzY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGRpZ2VzdGdvb2RzaXRlL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRkaWdlc3Rnb29kc2l0ZS9wbHVnaW5zL3Rlc3QuYnVuZGxlXzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGRpZ2VzdGdvb2RzaXRlL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGRkODI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGRpZ2VzdGdvb2RzaXRlL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZGlnZXN0Z29vZHNpdGUvcGx1Z2lucy90ZXN0LmZyYWdtZW50XzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGRpZ2VzdGdvb2RzaXRlL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMzNlMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZGlnZXN0Z29vZHNpdGUvcGx1Z2lucy90ZXN0LmZyYWdtZW50XzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGRpZ2VzdGdvb2RzaXRlL3NpdGUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZGlnZXN0Z29vZHNpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNjE5NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZGlnZXN0Z29vZHNpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdGVzdC5mZWF0dXJlXzEuMC4wLmphciIgaWQ9InRlc3QuZmVhdHVyZSIgdmVyc2lvbj0iMS4wLjAiLz4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGZlYXR1cmV1cmwvZmVhdHVyZXMvdGVzdC5mZWF0dXJlXzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGZlYXR1cmV1cmwvZmVhdHVyZXMvdGVzdC5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiYmM2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRmZWF0dXJldXJsL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRmZWF0dXJldXJsL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZmVhdHVyZXVybC9wbHVnaW5zL3Rlc3QuYnVuZGxlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkZDgyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRmZWF0dXJldXJsL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZmVhdHVyZXVybC9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkZmVhdHVyZXVybC9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDMzZTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGZlYXR1cmV1cmwvcGx1Z2lucy90ZXN0LmZyYWdtZW50XzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGZlYXR1cmV1cmwvc2l0ZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRmZWF0dXJldXJsL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDA3YmFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGZlYXR1cmV1cmwvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXN4L3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIiIGlkPSJ0ZXN0LmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIi8+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRpbmNsdWRlZGZlYXR1cmVhcmNoaXZlL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRpbmNsdWRlZGZlYXR1cmVhcmNoaXZlL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZWYyYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkaW5jbHVkZWRmZWF0dXJlYXJjaGl2ZS9mZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkaW5jbHVkZWRmZWF0dXJlYXJjaGl2ZS9mZWF0dXJlcy90ZXN0LmZlYXR1cmVpbmNsdWRlcl8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRpbmNsdWRlZGZlYXR1cmVhcmNoaXZlL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZWluY2x1ZGVyXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4NmFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRpbmNsdWRlZGZlYXR1cmVhcmNoaXZlL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZWluY2x1ZGVyXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGluY2x1ZGVkZmVhdHVyZWFyY2hpdmUvcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRpbmNsdWRlZGZlYXR1cmVhcmNoaXZlL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDU3ZDkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGluY2x1ZGVkZmVhdHVyZWFyY2hpdmUvcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRpbmNsdWRlZGZlYXR1cmVhcmNoaXZlL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9iYWRpbmNsdWRlZGZlYXR1cmVhcmNoaXZlL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNzg1MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkaW5jbHVkZWRmZWF0dXJlYXJjaGl2ZS9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkaW5jbHVkZWRmZWF0dXJlYXJjaGl2ZS9zaXRlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2JhZGluY2x1ZGVkZmVhdHVyZWFyY2hpdmUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZGQwNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvYmFkaW5jbHVkZWRmZWF0dXJlYXJjaGl2ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy90ZXN0LmZlYXR1cmVpbmNsdWRlcl8xLjAuMC5qYXIiIGlkPSJ0ZXN0LmZlYXR1cmVpbmNsdWRlciIgdmVyc2lvbj0iMS4wLjAiLz4KLSAgIDxhcmNoaXZlIHBhdGg9ImZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIiIHVybD0iZmVhdHVyZXN4L3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIiLz4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2RpZ2VzdC9kaWdlc3QuemlwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0L2RpZ2VzdC56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZmFiNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0L2RpZ2VzdC56aXAKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3QvZmVhdHVyZXMtdXNlZGlnZXN0aW5zdGVhZC90ZXN0LmZlYXR1cmVfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0L2ZlYXR1cmVzLXVzZWRpZ2VzdGluc3RlYWQvdGVzdC5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiYmM2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3QvZmVhdHVyZXMtdXNlZGlnZXN0aW5zdGVhZC90ZXN0LmZlYXR1cmVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0L3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0L3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGRkODI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2RpZ2VzdC9wbHVnaW5zL3Rlc3QuYnVuZGxlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2RpZ2VzdC9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0L3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMzNlMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0L3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3Qvc2l0ZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3Qvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNjE5NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0L3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIiIGlkPSJ0ZXN0LmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIi8+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3R1cmwvZGlnZXN0dXJsL2RpZ2VzdC56aXAgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3R1cmwvZGlnZXN0dXJsL2RpZ2VzdC56aXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZmFiNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0dXJsL2RpZ2VzdHVybC9kaWdlc3QuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0dXJsL2ZlYXR1cmVzLXVzZWRpZ2VzdGluc3RlYWQvdGVzdC5mZWF0dXJlXzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2RpZ2VzdHVybC9mZWF0dXJlcy11c2VkaWdlc3RpbnN0ZWFkL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYmJjNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0dXJsL2ZlYXR1cmVzLXVzZWRpZ2VzdGluc3RlYWQvdGVzdC5mZWF0dXJlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2RpZ2VzdHVybC9wbHVnaW5zL3Rlc3QuYnVuZGxlXzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2RpZ2VzdHVybC9wbHVnaW5zL3Rlc3QuYnVuZGxlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkZDgyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3R1cmwvcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3R1cmwvcGx1Z2lucy90ZXN0LmZyYWdtZW50XzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2RpZ2VzdHVybC9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDMzZTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2RpZ2VzdHVybC9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0dXJsL3NpdGUueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0dXJsL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTEyNzAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2RpZ2VzdHVybC9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlIGRpZ2VzdFVSTD0iZGlnZXN0dXJsLyI+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIiIGlkPSJ0ZXN0LmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIi8+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3R1cmwyL2RpZ2VzdHVybC9kaWdlc3QuemlwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0dXJsMi9kaWdlc3R1cmwvZGlnZXN0LnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFmYWI3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3R1cmwyL2RpZ2VzdHVybC9kaWdlc3QuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0dXJsMi9mZWF0dXJlcy11c2VkaWdlc3RpbnN0ZWFkL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3R1cmwyL2ZlYXR1cmVzLXVzZWRpZ2VzdGluc3RlYWQvdGVzdC5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiYmM2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3R1cmwyL2ZlYXR1cmVzLXVzZWRpZ2VzdGluc3RlYWQvdGVzdC5mZWF0dXJlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2RpZ2VzdHVybDIvcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3R1cmwyL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGRkODI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2RpZ2VzdHVybDIvcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3R1cmwyL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9kaWdlc3R1cmwyL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMzNlMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0dXJsMi9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0dXJsMi9zaXRlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2RpZ2VzdHVybDIvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNjE5NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZGlnZXN0dXJsMi9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyIiBpZD0idGVzdC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMCIvPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZ29vZGZlYXR1cmV1cmwvZmVhdHVyZXN4L3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9nb29kZmVhdHVyZXVybC9mZWF0dXJlc3gvdGVzdC5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiYmM2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9nb29kZmVhdHVyZXVybC9mZWF0dXJlc3gvdGVzdC5mZWF0dXJlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2dvb2RmZWF0dXJldXJsL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZ29vZGZlYXR1cmV1cmwvcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZGQ4MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZ29vZGZlYXR1cmV1cmwvcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9nb29kZmVhdHVyZXVybC9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZ29vZGZlYXR1cmV1cmwvcGx1Z2lucy90ZXN0LmZyYWdtZW50XzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzM2UyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9nb29kZmVhdHVyZXVybC9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvZ29vZGZlYXR1cmV1cmwvc2l0ZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9nb29kZmVhdHVyZXVybC9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAwN2JhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9nb29kZmVhdHVyZXVybC9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlc3gvdGVzdC5mZWF0dXJlXzEuMC4wLmphciIgaWQ9InRlc3QuZmVhdHVyZSIgdmVyc2lvbj0iMS4wLjAiLz4KLTwvc2l0ZT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2luY2x1ZGVkZmVhdHVyZS9mZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvaW5jbHVkZWRmZWF0dXJlL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZWYyYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvaW5jbHVkZWRmZWF0dXJlL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9pbmNsdWRlZGZlYXR1cmUvZmVhdHVyZXMvdGVzdC5mZWF0dXJlaW5jbHVkZXJfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvaW5jbHVkZWRmZWF0dXJlL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZWluY2x1ZGVyXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4NmFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9pbmNsdWRlZGZlYXR1cmUvZmVhdHVyZXMvdGVzdC5mZWF0dXJlaW5jbHVkZXJfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvaW5jbHVkZWRmZWF0dXJlL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvaW5jbHVkZWRmZWF0dXJlL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDU3ZDkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2luY2x1ZGVkZmVhdHVyZS9wbHVnaW5zL3Rlc3QuYnVuZGxlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2luY2x1ZGVkZmVhdHVyZS9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvaW5jbHVkZWRmZWF0dXJlL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNzg1MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvaW5jbHVkZWRmZWF0dXJlL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9pbmNsdWRlZGZlYXR1cmUvc2l0ZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9pbmNsdWRlZGZlYXR1cmUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzk1OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvaW5jbHVkZWRmZWF0dXJlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Rlc3QuZmVhdHVyZWluY2x1ZGVyXzEuMC4wLmphciIgaWQ9InRlc3QuZmVhdHVyZWluY2x1ZGVyIiB2ZXJzaW9uPSIxLjAuMCIvPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvaW5jbHVkZWRmZWF0dXJlYXJjaGl2ZS9mZWF0dXJlcy90ZXN0LmZlYXR1cmVpbmNsdWRlcl8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9pbmNsdWRlZGZlYXR1cmVhcmNoaXZlL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZWluY2x1ZGVyXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4NmFiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9pbmNsdWRlZGZlYXR1cmVhcmNoaXZlL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZWluY2x1ZGVyXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2luY2x1ZGVkZmVhdHVyZWFyY2hpdmUvZmVhdHVyZXN4L3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9pbmNsdWRlZGZlYXR1cmVhcmNoaXZlL2ZlYXR1cmVzeC90ZXN0LmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmVmMmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2luY2x1ZGVkZmVhdHVyZWFyY2hpdmUvZmVhdHVyZXN4L3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9pbmNsdWRlZGZlYXR1cmVhcmNoaXZlL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvaW5jbHVkZWRmZWF0dXJlYXJjaGl2ZS9wbHVnaW5zL3Rlc3QuYnVuZGxlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1N2Q5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9pbmNsdWRlZGZlYXR1cmVhcmNoaXZlL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvaW5jbHVkZWRmZWF0dXJlYXJjaGl2ZS9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvaW5jbHVkZWRmZWF0dXJlYXJjaGl2ZS9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTc4NTAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2luY2x1ZGVkZmVhdHVyZWFyY2hpdmUvcGx1Z2lucy90ZXN0LmZyYWdtZW50XzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2luY2x1ZGVkZmVhdHVyZWFyY2hpdmUvc2l0ZS54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9pbmNsdWRlZGZlYXR1cmVhcmNoaXZlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRkMDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL2luY2x1ZGVkZmVhdHVyZWFyY2hpdmUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdGVzdC5mZWF0dXJlaW5jbHVkZXJfMS4wLjAuamFyIiBpZD0idGVzdC5mZWF0dXJlaW5jbHVkZXIiIHZlcnNpb249IjEuMC4wIi8+Ci0gICA8YXJjaGl2ZSBwYXRoPSJmZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyIiB1cmw9ImZlYXR1cmVzeC90ZXN0LmZlYXR1cmVfMS4wLjAuamFyIi8+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9ub2ZlYXR1cmVpZGFuZHZlcnNpb24vZmVhdHVyZXMvdGVzdC5mZWF0dXJlMl8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9ub2ZlYXR1cmVpZGFuZHZlcnNpb24vZmVhdHVyZXMvdGVzdC5mZWF0dXJlMl8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MTcwOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvbm9mZWF0dXJlaWRhbmR2ZXJzaW9uL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZTJfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvbm9mZWF0dXJlaWRhbmR2ZXJzaW9uL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9ub2ZlYXR1cmVpZGFuZHZlcnNpb24vZmVhdHVyZXMvdGVzdC5mZWF0dXJlXzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhYjg4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9ub2ZlYXR1cmVpZGFuZHZlcnNpb24vZmVhdHVyZXMvdGVzdC5mZWF0dXJlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL25vZmVhdHVyZWlkYW5kdmVyc2lvbi9mZWF0dXJlcy90ZXN0LmZlYXR1cmVpbmNsdWRlcl8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9ub2ZlYXR1cmVpZGFuZHZlcnNpb24vZmVhdHVyZXMvdGVzdC5mZWF0dXJlaW5jbHVkZXJfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDJmOWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL25vZmVhdHVyZWlkYW5kdmVyc2lvbi9mZWF0dXJlcy90ZXN0LmZlYXR1cmVpbmNsdWRlcl8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9ub2ZlYXR1cmVpZGFuZHZlcnNpb24vcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9ub2ZlYXR1cmVpZGFuZHZlcnNpb24vcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZjU1YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvbm9mZWF0dXJlaWRhbmR2ZXJzaW9uL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvbm9mZWF0dXJlaWRhbmR2ZXJzaW9uL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9ub2ZlYXR1cmVpZGFuZHZlcnNpb24vcGx1Z2lucy90ZXN0LmZyYWdtZW50XzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5OWI4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9ub2ZlYXR1cmVpZGFuZHZlcnNpb24vcGx1Z2lucy90ZXN0LmZyYWdtZW50XzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL25vZmVhdHVyZWlkYW5kdmVyc2lvbi9zaXRlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL25vZmVhdHVyZWlkYW5kdmVyc2lvbi9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJkMTQzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9ub2ZlYXR1cmVpZGFuZHZlcnNpb24vc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08c2l0ZT4KLSAgIDxmZWF0dXJlIHVybD0iZmVhdHVyZXMvdGVzdC5mZWF0dXJlXzEuMC4wLmphciIvPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy90ZXN0LmZlYXR1cmUyXzEuMC4wLmphciIvPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZS9mZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZS9mZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGJiYzY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGUvZmVhdHVyZXMvdGVzdC5mZWF0dXJlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGUvcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRlL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGRkODI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGUvcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRlL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRlL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMzNlMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZS9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZS9zaXRlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGUvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNjE5NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlPgotICAgPGZlYXR1cmUgdXJsPSJmZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyIiBpZD0idGVzdC5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMCIvPgotPC9zaXRlPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZXVybC9zaXRlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGV1cmwvc2l0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTZjYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZXVybC9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxzaXRlIHVybD0ic2l0ZXVybCI+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIiIGlkPSJ0ZXN0LmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIi8+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRldXJsL3NpdGV1cmwvZmVhdHVyZXMvdGVzdC5mZWF0dXJlXzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGV1cmwvc2l0ZXVybC9mZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGJiYzY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGV1cmwvc2l0ZXVybC9mZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZXVybC9zaXRldXJsL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZXVybC9zaXRldXJsL3BsdWdpbnMvdGVzdC5idW5kbGVfMS4wLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGRkODI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGV1cmwvc2l0ZXVybC9wbHVnaW5zL3Rlc3QuYnVuZGxlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGV1cmwvc2l0ZXVybC9wbHVnaW5zL3Rlc3QuZnJhZ21lbnRfMS4wLjAuamFyIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZXVybC9zaXRldXJsL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMzNlMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZXVybC9zaXRldXJsL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRldXJsMi9zaXRlLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGV1cmwyL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTYxOTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGV1cmwyL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIiIGlkPSJ0ZXN0LmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIi8+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRldXJsMi9zaXRldXJsL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRldXJsMi9zaXRldXJsL2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYmJjNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZXVybDIvc2l0ZXVybC9mZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZXVybDIvc2l0ZXVybC9wbHVnaW5zL3Rlc3QuYnVuZGxlXzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGV1cmwyL3NpdGV1cmwvcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZGQ4MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUvc2l0ZXVybDIvc2l0ZXVybC9wbHVnaW5zL3Rlc3QuYnVuZGxlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGV1cmwyL3NpdGV1cmwvcGx1Z2lucy90ZXN0LmZyYWdtZW50XzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3NpdGV1cmwyL3NpdGV1cmwvcGx1Z2lucy90ZXN0LmZyYWdtZW50XzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzM2UyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS9zaXRldXJsMi9zaXRldXJsL3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS94eHhzaXRleHh4L2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS94eHhzaXRleHh4L2ZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwYmJjNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUveHh4c2l0ZXh4eC9mZWF0dXJlcy90ZXN0LmZlYXR1cmVfMS4wLjAuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUveHh4c2l0ZXh4eC9wbHVnaW5zL3Rlc3QuYnVuZGxlXzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3h4eHNpdGV4eHgvcGx1Z2lucy90ZXN0LmJ1bmRsZV8xLjAuMC5qYXIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwZGQ4MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUveHh4c2l0ZXh4eC9wbHVnaW5zL3Rlc3QuYnVuZGxlXzEuMC4wLmphcgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3h4eHNpdGV4eHgvcGx1Z2lucy90ZXN0LmZyYWdtZW50XzEuMC4wLmphciBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy90ZXN0RGF0YS91cGRhdGVzaXRlL3h4eHNpdGV4eHgvcGx1Z2lucy90ZXN0LmZyYWdtZW50XzEuMC4wLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzM2UyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS94eHhzaXRleHh4L3BsdWdpbnMvdGVzdC5mcmFnbWVudF8xLjAuMC5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS94eHhzaXRleHh4L3h4eHNpdGV4eHgueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3VwZGF0ZXNpdGUveHh4c2l0ZXh4eC94eHhzaXRleHh4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU2MTk3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvdXBkYXRlc2l0ZS94eHhzaXRleHh4L3h4eHNpdGV4eHgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHNpdGU+Ci0gICA8ZmVhdHVyZSB1cmw9ImZlYXR1cmVzL3Rlc3QuZmVhdHVyZV8xLjAuMC5qYXIiIGlkPSJ0ZXN0LmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIi8+Ci08L3NpdGU+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvd3NkbFRlc3RSZXBvL2NvbnRlbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzL3Rlc3REYXRhL3dzZGxUZXN0UmVwby9jb250ZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxMDdhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMvdGVzdERhdGEvd3NkbFRlc3RSZXBvL2NvbnRlbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08P21ldGFkYXRhUmVwb3NpdG9yeSBjbGFzcz0nb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkxvY2FsTWV0YWRhdGFSZXBvc2l0b3J5JyB2ZXJzaW9uPScxLjAuMCc/PgotPHJlcG9zaXRvcnkgbmFtZT0nV1NETCBSRVBPJyB0eXBlPSdvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuTG9jYWxNZXRhZGF0YVJlcG9zaXRvcnknIHZlcnNpb249JzEuMC4wJz4KLSAgPHByb3BlcnRpZXMgc2l6ZT0nMSc+Ci0gICAgPHByb3BlcnR5IG5hbWU9J3AyLnRpbWVzdGFtcCcgdmFsdWU9JzEyMDg2MjY3OTczNjAnLz4KLSAgPC9wcm9wZXJ0aWVzPgotICA8dW5pdHMgc2l6ZT0nNyc+Ci0gICAgPHVuaXQgaWQ9J3Rvb2xpbmcuc291cmNlLmRlZmF1bHQnIHZlcnNpb249JzEuMC4wJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDxob3N0UmVxdWlyZW1lbnRzIHNpemU9JzEnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nc291cmNlJyByYW5nZT0nMC4wLjAnIG9wdGlvbmFsPSd0cnVlJyBtdWx0aXBsZT0ndHJ1ZScgZ3JlZWR5PSdmYWxzZScvPgotICAgICAgPC9ob3N0UmVxdWlyZW1lbnRzPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nMSc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnR5cGUuZnJhZ21lbnQnIHZhbHVlPSd0cnVlJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMic+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J3Rvb2xpbmcuc291cmNlLmRlZmF1bHQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZmxhdm9yJyBuYW1lPSd0b29saW5nJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScxJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J3NvdXJjZScgcmFuZ2U9JzAuMC4wJyBvcHRpb25hbD0ndHJ1ZScgbXVsdGlwbGU9J3RydWUnIGdyZWVkeT0nZmFsc2UnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nbnVsbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPScyJz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdpbnN0YWxsJz4KLSAgICAgICAgICAgIGFkZFNvdXJjZUJ1bmRsZShidW5kbGU6JHthcnRpZmFjdH0pCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSd1bmluc3RhbGwnPgotICAgICAgICAgICAgcmVtb3ZlU291cmNlQnVuZGxlKGJ1bmRsZToke2FydGlmYWN0fSkKLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSd0b29saW5nLm9zZ2kuYnVuZGxlLmRlZmF1bHQnIHZlcnNpb249JzEuMC4wJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDxob3N0UmVxdWlyZW1lbnRzIHNpemU9JzEnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nYnVuZGxlJyByYW5nZT0nMC4wLjAnIG11bHRpcGxlPSd0cnVlJyBncmVlZHk9J2ZhbHNlJy8+Ci0gICAgICA8L2hvc3RSZXF1aXJlbWVudHM+Ci0gICAgICA8cHJvcGVydGllcyBzaXplPScxJz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIudHlwZS5mcmFnbWVudCcgdmFsdWU9J3RydWUnLz4KLSAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScyJz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5pdScgbmFtZT0ndG9vbGluZy5vc2dpLmJ1bmRsZS5kZWZhdWx0JyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmZsYXZvcicgbmFtZT0ndG9vbGluZycgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgIDwvcHJvdmlkZXM+Ci0gICAgICA8cmVxdWlyZXMgc2l6ZT0nMSc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZWNsaXBzZS50eXBlJyBuYW1lPSdidW5kbGUnIHJhbmdlPScwLjAuMCcgbXVsdGlwbGU9J3RydWUnIGdyZWVkeT0nZmFsc2UnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8dG91Y2hwb2ludCBpZD0nbnVsbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgIDx0b3VjaHBvaW50RGF0YSBzaXplPScxJz4KLSAgICAgICAgPGluc3RydWN0aW9ucyBzaXplPSc0Jz4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSdpbnN0YWxsJz4KLSAgICAgICAgICAgIGluc3RhbGxCdW5kbGUoYnVuZGxlOiR7YXJ0aWZhY3R9KQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0ndW5pbnN0YWxsJz4KLSAgICAgICAgICAgIHVuaW5zdGFsbEJ1bmRsZShidW5kbGU6JHthcnRpZmFjdH0pCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb24ga2V5PSd1bmNvbmZpZ3VyZSc+Ci0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J2NvbmZpZ3VyZSc+Ci0gICAgICAgICAgICBzZXRTdGFydExldmVsKHN0YXJ0TGV2ZWw6NCk7Ci0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0namF2YXgud3NkbCcgdmVyc2lvbj0nMS40LjAudjIwMDgwMzA2MTgxMScgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdqYXZheC53c2RsJyByYW5nZT0nWzAuMC4wLDEuNC4wLnYyMDA4MDMwNjE4MTEpJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtVmVuZG9yLjAnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLU5hbWUuMCcgdmFsdWU9J1dTREw0SicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJUJ1bmRsZS1OYW1lLjAnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclQnVuZGxlLVZlbmRvci4wJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMjAnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdqYXZheC53c2RsJyB2ZXJzaW9uPScxLjQuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdqYXZheC53c2RsJyB2ZXJzaW9uPScxLjQuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC5leHRlbnNpb25zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC5leHRlbnNpb25zLmh0dHAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLmV4dGVuc2lvbnMubWltZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zb2FwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC5mYWN0b3J5JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC51dGlsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC51dGlsLnhtbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwueG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgud3NkbC5leHRlbnNpb25zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwuZXh0ZW5zaW9ucy5odHRwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwuZXh0ZW5zaW9ucy5taW1lJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwuZmFjdG9yeScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC53c2RsLnhtbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScxJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzJyByYW5nZT0nWzIuOC4wLDMuMC4wKScgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdqYXZheC53c2RsJyB2ZXJzaW9uPScxLjQuMC52MjAwODAzMDYxODExJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4yCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS54ZXJjZXM7YnVuZGxlLXZlcnNpb249JnF1b3Q7WzIuOC4wLDMuMC4wKSZxdW90OztyZXNvbHV0aW9uOj1vcHRpb25hbAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtVmVyc2lvbjogMS40LjAudjIwMDgwMzA2MTgxMQotRXhwb3J0LVBhY2thZ2U6IGNvbS5pYm0ud3NkbCxjb20uaWJtLndzZGwuZXh0ZW5zaW9ucyxjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5odHRwLGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLm1pbWUsY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcCxjb20uaWJtLndzZGwuZmFjdG9yeSxjb20uaWJtLndzZGwudXRpbCxjb20uaWJtLndzZGwudXRpbC54bWwsY29tLmlibS53c2RsLnhtbCxqYXZheC53c2RsLGphdmF4LndzZGwuZXh0ZW5zaW9ucyxqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cCxqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZSxqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcCxqYXZheC53c2RsLmZhY3RvcnksamF2YXgud3NkbC54bWwKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IGphdmF4LndzZGwKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICAgIDx1bml0IGlkPSd0b29saW5nLm9yZy5lY2xpcHNlLnVwZGF0ZS5mZWF0dXJlLmRlZmF1bHQnIHZlcnNpb249JzEuMC4wJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDxob3N0UmVxdWlyZW1lbnRzIHNpemU9JzEnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVjbGlwc2UudHlwZScgbmFtZT0nZmVhdHVyZScgcmFuZ2U9JzAuMC4wJyBvcHRpb25hbD0ndHJ1ZScgbXVsdGlwbGU9J3RydWUnIGdyZWVkeT0nZmFsc2UnLz4KLSAgICAgIDwvaG9zdFJlcXVpcmVtZW50cz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzEnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmZyYWdtZW50JyB2YWx1ZT0ndHJ1ZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzInPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSd0b29saW5nLm9yZy5lY2xpcHNlLnVwZGF0ZS5mZWF0dXJlLmRlZmF1bHQnIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuZmxhdm9yJyBuYW1lPSd0b29saW5nJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScxJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2ZlYXR1cmUnIHJhbmdlPScwLjAuMCcgb3B0aW9uYWw9J3RydWUnIG11bHRpcGxlPSd0cnVlJyBncmVlZHk9J2ZhbHNlJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPGZpbHRlcj4KLSAgICAgICAgKG9yZy5lY2xpcHNlLnVwZGF0ZS5pbnN0YWxsLmZlYXR1cmVzPXRydWUpCi0gICAgICA8L2ZpbHRlcj4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdudWxsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzInPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J2luc3RhbGwnPgotICAgICAgICAgICAgaW5zdGFsbEZlYXR1cmUoZmVhdHVyZToke2FydGlmYWN0fSxmZWF0dXJlSWQ6ZGVmYXVsdCxmZWF0dXJlVmVyc2lvbjpkZWZhdWx0KQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0ndW5pbnN0YWxsJz4KLSAgICAgICAgICAgIHVuaW5zdGFsbEZlYXR1cmUoZmVhdHVyZToke2FydGlmYWN0fSxmZWF0dXJlSWQ6ZGVmYXVsdCxmZWF0dXJlVmVyc2lvbjpkZWZhdWx0KQotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb24+Ci0gICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgPC90b3VjaHBvaW50RGF0YT4KLSAgICA8L3VuaXQ+Ci0gICAgPHVuaXQgaWQ9J2NvbmZpZy5hLmpyZScgdmVyc2lvbj0nMS42LjAnIHNpbmdsZXRvbj0nZmFsc2UnPgotICAgICAgPGhvc3RSZXF1aXJlbWVudHMgc2l6ZT0nMSc+Ci0gICAgICAgIDxyZXF1aXJlZCBuYW1lc3BhY2U9J29yZy5lY2xpcHNlLmVxdWlub3gucDIuaXUnIG5hbWU9J2EuanJlJyByYW5nZT0nMS42LjAnLz4KLSAgICAgIDwvaG9zdFJlcXVpcmVtZW50cz4KLSAgICAgIDxwcm9wZXJ0aWVzIHNpemU9JzEnPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50eXBlLmZyYWdtZW50JyB2YWx1ZT0ndHJ1ZScvPgotICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgPHByb3ZpZGVzIHNpemU9JzEnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdjb25maWcuYS5qcmUnIHZlcnNpb249JzEuNi4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHJlcXVpcmVzIHNpemU9JzEnPgotICAgICAgICA8cmVxdWlyZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdhLmpyZScgcmFuZ2U9JzEuNi4wJy8+Ci0gICAgICA8L3JlcXVpcmVzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmF0aXZlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPHRvdWNocG9pbnREYXRhIHNpemU9JzEnPgotICAgICAgICA8aW5zdHJ1Y3Rpb25zIHNpemU9JzEnPgotICAgICAgICAgIDxpbnN0cnVjdGlvbiBrZXk9J2luc3RhbGwnPgotCi0gICAgICAgICAgPC9pbnN0cnVjdGlvbj4KLSAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICA8L3RvdWNocG9pbnREYXRhPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0nYS5qcmUnIHZlcnNpb249JzEuNi4wJyBzaW5nbGV0b249J2ZhbHNlJz4KLSAgICAgIDxwcm92aWRlcyBzaXplPScxMTcnPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdhLmpyZScgdmVyc2lvbj0nMS42LjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5hY2Nlc3NpYmlsaXR5JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LmFjdGl2aXR5JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LmNyeXB0bycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5jcnlwdG8uaW50ZXJmYWNlcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5jcnlwdG8uc3BlYycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5pbWFnZWlvJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LmltYWdlaW8uZXZlbnQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguaW1hZ2Vpby5tZXRhZGF0YScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5pbWFnZWlvLnBsdWdpbnMuYm1wJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LmltYWdlaW8ucGx1Z2lucy5qcGVnJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LmltYWdlaW8uc3BpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LmltYWdlaW8uc3RyZWFtJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm1hbmFnZW1lbnQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubWFuYWdlbWVudC5sb2FkaW5nJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4Lm1hbmFnZW1lbnQubW9kZWxtYmVhbicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5tYW5hZ2VtZW50Lm1vbml0b3InIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubWFuYWdlbWVudC5vcGVubWJlYW4nIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubWFuYWdlbWVudC5yZWxhdGlvbicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5tYW5hZ2VtZW50LnJlbW90ZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5ybWknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubWFuYWdlbWVudC50aW1lcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5uYW1pbmcnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubmFtaW5nLmRpcmVjdG9yeScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5uYW1pbmcuZXZlbnQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubmFtaW5nLmxkYXAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubmFtaW5nLnNwaScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5uZXQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgubmV0LnNzbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5wcmludCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5wcmludC5hdHRyaWJ1dGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgucHJpbnQuYXR0cmlidXRlLnN0YW5kYXJkJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnByaW50LmV2ZW50JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnJtaScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5ybWkuQ09SQkEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgucm1pLnNzbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZWN1cml0eS5hdXRoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2snIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc2VjdXJpdHkuYXV0aC5rZXJiZXJvcycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlY3VyaXR5LmF1dGguc3BpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlY3VyaXR5LmF1dGgueDUwMCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zZWN1cml0eS5jZXJ0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNlY3VyaXR5LnNhc2wnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc291bmQubWlkaScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zb3VuZC5taWRpLnNwaScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zb3VuZC5zYW1wbGVkJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNvdW5kLnNhbXBsZWQuc3BpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNxbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zcWwucm93c2V0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNxbC5yb3dzZXQuc2VyaWFsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnNxbC5yb3dzZXQuc3BpJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nLmJvcmRlcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zd2luZy5jb2xvcmNob29zZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcuZXZlbnQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcuZmlsZWNob29zZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcucGxhZicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zd2luZy5wbGFmLmJhc2ljJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nLnBsYWYubWV0YWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcucGxhZi5tdWx0aScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zd2luZy5wbGFmLnN5bnRoJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nLnRhYmxlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nLnRleHQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcudGV4dC5odG1sJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnN3aW5nLnRleHQuaHRtbC5wYXJzZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcudGV4dC5ydGYnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXguc3dpbmcudHJlZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC5zd2luZy51bmRvJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnRyYW5zYWN0aW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnRyYW5zYWN0aW9uLnhhJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwuZGF0YXR5cGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0namF2YXgueG1sLm5hbWVzcGFjZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwucGFyc2VycycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC54bWwudHJhbnNmb3JtJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC50cmFuc2Zvcm0uZG9tJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC50cmFuc2Zvcm0uc2F4JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC52YWxpZGF0aW9uJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LnhtbC54cGF0aCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcuaWV0Zi5qZ3NzJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuQ09SQkEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5DT1JCQV8yXzMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5DT1JCQV8yXzMucG9ydGFibGUnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5DT1JCQS5EeW5BbnlQYWNrYWdlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuQ09SQkEuT1JCUGFja2FnZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub21nLkNPUkJBLnBvcnRhYmxlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuQ09SQkEuVHlwZUNvZGVQYWNrYWdlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuQ29zTmFtaW5nJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRFeHRQYWNrYWdlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuQ29zTmFtaW5nLk5hbWluZ0NvbnRleHRQYWNrYWdlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuRHluYW1pYycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub21nLkR5bmFtaWNBbnknIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5EeW5hbWljQW55LkR5bkFueUZhY3RvcnlQYWNrYWdlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuRHluYW1pY0FueS5EeW5BbnlQYWNrYWdlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuSU9QJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuSU9QLkNvZGVjRmFjdG9yeVBhY2thZ2UnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5JT1AuQ29kZWNQYWNrYWdlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuTWVzc2FnaW5nJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuUG9ydGFibGVJbnRlcmNlcHRvcicgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub21nLlBvcnRhYmxlSW50ZXJjZXB0b3IuT1JCSW5pdEluZm9QYWNrYWdlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuUG9ydGFibGVTZXJ2ZXInIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5Qb3J0YWJsZVNlcnZlci5DdXJyZW50UGFja2FnZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub21nLlBvcnRhYmxlU2VydmVyLlBPQU1hbmFnZXJQYWNrYWdlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuUE9BUGFja2FnZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcub21nLlBvcnRhYmxlU2VydmVyLnBvcnRhYmxlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuUG9ydGFibGVTZXJ2ZXIuU2VydmFudExvY2F0b3JQYWNrYWdlJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy5vbWcuU2VuZGluZ0NvbnRleHQnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLm9tZy5zdHViLmphdmEucm1pJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy53M2MuZG9tJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy53M2MuZG9tLmJvb3RzdHJhcCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdvcmcudzNjLmRvbS5ldmVudHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnczYy5kb20ubHMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnhtbC5zYXgnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nb3JnLnhtbC5zYXguZXh0JyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J29yZy54bWwuc2F4LmhlbHBlcnMnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICA8L3Byb3ZpZGVzPgotICAgICAgPHRvdWNocG9pbnQgaWQ9J29yZy5lY2xpcHNlLmVxdWlub3gucDIubmF0aXZlJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgIDwvdW5pdD4KLSAgICA8dW5pdCBpZD0namF2YXgud3NkbCcgdmVyc2lvbj0nMS41LjEudjIwMDgwMzA2MTkxMCcgc2luZ2xldG9uPSdmYWxzZSc+Ci0gICAgICA8dXBkYXRlIGlkPSdqYXZheC53c2RsJyByYW5nZT0nWzAuMC4wLDEuNS4xLnYyMDA4MDMwNjE5MTApJyBzZXZlcml0eT0nMCcvPgotICAgICAgPHByb3BlcnRpZXMgc2l6ZT0nNCc+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSdkZl9MVC5CdW5kbGUtVmVuZG9yLjAnIHZhbHVlPSdFY2xpcHNlLm9yZycvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nZGZfTFQuQnVuZGxlLU5hbWUuMCcgdmFsdWU9J1dTREw0SicvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYW1lJyB2YWx1ZT0nJUJ1bmRsZS1OYW1lLjAnLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9J29yZy5lY2xpcHNlLmVxdWlub3gucDIucHJvdmlkZXInIHZhbHVlPSclQnVuZGxlLVZlbmRvci4wJy8+Ci0gICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICA8cHJvdmlkZXMgc2l6ZT0nMjInPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLml1JyBuYW1lPSdqYXZheC53c2RsJyB2ZXJzaW9uPScxLjUuMS52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J29zZ2kuYnVuZGxlJyBuYW1lPSdqYXZheC53c2RsJyB2ZXJzaW9uPScxLjUuMS52MjAwODAzMDYxOTEwJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC5leHRlbnNpb25zJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2NvbS5pYm0ud3NkbC5leHRlbnNpb25zLmh0dHAnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLmV4dGVuc2lvbnMubWltZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5zY2hlbWEnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc29hcCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwuZmFjdG9yeScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwudXRpbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdjb20uaWJtLndzZGwudXRpbC54bWwnIHZlcnNpb249JzAuMC4wJy8+Ci0gICAgICAgIDxwcm92aWRlZCBuYW1lc3BhY2U9J2phdmEucGFja2FnZScgbmFtZT0nY29tLmlibS53c2RsLnhtbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC53c2RsJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwuZXh0ZW5zaW9ucycgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC53c2RsLmV4dGVuc2lvbnMuaHR0cCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC53c2RsLmV4dGVuc2lvbnMubWltZScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC53c2RsLmV4dGVuc2lvbnMuc2NoZW1hJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwuZXh0ZW5zaW9ucy5zb2FwJyB2ZXJzaW9uPScwLjAuMCcvPgotICAgICAgICA8cHJvdmlkZWQgbmFtZXNwYWNlPSdqYXZhLnBhY2thZ2UnIG5hbWU9J2phdmF4LndzZGwuZmFjdG9yeScgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0namF2YS5wYWNrYWdlJyBuYW1lPSdqYXZheC53c2RsLnhtbCcgdmVyc2lvbj0nMC4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lY2xpcHNlLnR5cGUnIG5hbWU9J2J1bmRsZScgdmVyc2lvbj0nMS4wLjAnLz4KLSAgICAgICAgPHByb3ZpZGVkIG5hbWVzcGFjZT0nb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5sb2NhbGl6YXRpb24nIG5hbWU9J2RmX0xUJyB2ZXJzaW9uPScxLjAuMCcvPgotICAgICAgPC9wcm92aWRlcz4KLSAgICAgIDxyZXF1aXJlcyBzaXplPScxJz4KLSAgICAgICAgPHJlcXVpcmVkIG5hbWVzcGFjZT0nb3NnaS5idW5kbGUnIG5hbWU9J29yZy5hcGFjaGUueGVyY2VzJyByYW5nZT0nWzIuOC4wLDMuMC4wKScgb3B0aW9uYWw9J3RydWUnLz4KLSAgICAgIDwvcmVxdWlyZXM+Ci0gICAgICA8YXJ0aWZhY3RzIHNpemU9JzEnPgotICAgICAgICA8YXJ0aWZhY3QgY2xhc3NpZmllcj0nb3NnaS5idW5kbGUnIGlkPSdqYXZheC53c2RsJyB2ZXJzaW9uPScxLjUuMS52MjAwODAzMDYxOTEwJy8+Ci0gICAgICA8L2FydGlmYWN0cz4KLSAgICAgIDx0b3VjaHBvaW50IGlkPSdvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2knIHZlcnNpb249JzEuMC4wJy8+Ci0gICAgICA8dG91Y2hwb2ludERhdGEgc2l6ZT0nMSc+Ci0gICAgICAgIDxpbnN0cnVjdGlvbnMgc2l6ZT0nMSc+Ci0gICAgICAgICAgPGluc3RydWN0aW9uIGtleT0nbWFuaWZlc3QnPgotICAgICAgICAgICAgSW1wbGVtZW50YXRpb24tVmVuZG9yOiBJQk0KLUJ1bmRsZS1WZXJzaW9uOiAxLjUuMS52MjAwODAzMDYxOTEwCi1TcGVjaWZpY2F0aW9uLVRpdGxlOiBKV1NETAotSW1wbGVtZW50YXRpb24tVGl0bGU6IFdTREw0SgotRXhwb3J0LVBhY2thZ2U6IGNvbS5pYm0ud3NkbCxjb20uaWJtLndzZGwuZXh0ZW5zaW9ucyxjb20uaWJtLndzZGwuZXh0ZW5zaW9ucy5odHRwLGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLm1pbWUsY29tLmlibS53c2RsLmV4dGVuc2lvbnMuc2NoZW1hLGNvbS5pYm0ud3NkbC5leHRlbnNpb25zLnNvYXAsY29tLmlibS53c2RsLmZhY3RvcnksY29tLmlibS53c2RsLnV0aWwsY29tLmlibS53c2RsLnV0aWwueG1sLGNvbS5pYm0ud3NkbC54bWwsamF2YXgud3NkbCxqYXZheC53c2RsLmV4dGVuc2lvbnMsamF2YXgud3NkbC5leHRlbnNpb25zLmh0dHAsamF2YXgud3NkbC5leHRlbnNpb25zLm1pbWUsamF2YXgud3NkbC5leHRlbnNpb25zLnNjaGVtYSxqYXZheC53c2RsLmV4dGVuc2lvbnMuc29hcCxqYXZheC53c2RsLmZhY3RvcnksamF2YXgud3NkbC54bWwKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS4yCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmFwYWNoZS54ZXJjZXM7YnVuZGxlLXZlcnNpb249JnF1b3Q7WzIuOC4wLDMuMC4wKSZxdW90OztyZXNvbHV0aW9uOj1vcHRpb25hbAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBqYXZheC53c2RsCi1DcmVhdGVkLUJ5OiAxLjQuMiAoSUJNIENvcnBvcmF0aW9uKQotU3BlY2lmaWNhdGlvbi1WZXJzaW9uOiAxLjEKLUltcGxlbWVudGF0aW9uLVZlcnNpb246IDEuNS4xCi1TcGVjaWZpY2F0aW9uLVZlbmRvcjogSUJNIChKYXZhIENvbW11bml0eSBQcm9jZXNzKQotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi0KLSAgICAgICAgICA8L2luc3RydWN0aW9uPgotICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgIDwvdG91Y2hwb2ludERhdGE+Ci0gICAgPC91bml0PgotICA8L3VuaXRzPgotPC9yZXBvc2l0b3J5PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzYjQ4MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9DREMtMS4xJUZvdW5kYXRpb24tMS4xIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYmY2MDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29sczwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZhYTgxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLSNGcmkgRmViIDIyIDExOjExOjE3IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnRGVzY3JpcHRpb249cmV0dXJuX3RhZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wYXJhbWV0ZXJBc3NpZ25tZW50PWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvdGVudGlhbE51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnJhd1R5cGVSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yZWR1bmRhbnROdWxsQ2hlY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25JbmNsdWRlRG9jQ29tbWVudFJlZmVyZW5jZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVySW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDI5OWQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1N1biBTZXAgMjMgMTE6NTg6NTcgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9ZmFsc2UKLXNwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjMDQ3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEp1bCAzMCAxNDo1MjoyOSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhODRlY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUltcG9ydC1QYWNrYWdlOiBqYXZheC5zZXJ2bGV0O3ZlcnNpb249IjIuNC4wIiwKLSBqYXZheC5zZXJ2bGV0Lmh0dHA7dmVyc2lvbj0iMi40LjAiLAotIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZWNoZWNrZXIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudXBkYXRlY2hlY2tlciwKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS40LjAiLAotIG9yZy5vc2dpLnNlcnZpY2UuaHR0cDt2ZXJzaW9uPSIxLjIuMCIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4xL0ZvdW5kYXRpb24tMS4xLAotIEoyU0UtMS40Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b29sczt4LWludGVybmFsOj10cnVlCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvb2xzLkFjdGl2YXRvcgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiZDliZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9wMiB0b29scyAtIGZpbGUgc2VydmVyLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9wMiB0b29scyAtIGZpbGUgc2VydmVyLmxhdW5jaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdlY2JmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvcDIgdG9vbHMgLSBmaWxlIHNlcnZlci5sYXVuY2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGxhdW5jaENvbmZpZ3VyYXRpb24gdHlwZT0ib3JnLmVjbGlwc2UucGRlLnVpLkVxdWlub3hMYXVuY2hlciI+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImFwcGVuZC5hcmdzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNBZGQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhdXRvbWF0aWNWYWxpZGF0ZSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iYm9vdHN0cmFwIiB2YWx1ZT0iIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY2hlY2tlZCIgdmFsdWU9IltOT05FXSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJjbGVhckNvbmZpZyIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSJjOlxwcm92XHAyXFByb3ZBZG1pblVJIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfYXV0b19zdGFydCIgdmFsdWU9ImZhbHNlIi8+Ci08aW50QXR0cmlidXRlIGtleT0iZGVmYXVsdF9zdGFydF9sZXZlbCIgdmFsdWU9IjQiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJleGVjRW52aXJvbm1lbnQiIHZhbHVlPSJKMlNFLTEuNSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItY29uc29sZSAtY29uc29sZWxvZyAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy5maWxlc2VydmVyQXBwbGljYXRpb24mIzEzOyYjMTA7LXJlc291cmNlIC9hcnRpZmFjdCBmaWxlOmM6L3Byb3YvcDIvc2VydmVycyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuU09VUkNFX1BBVEhfUFJPVklERVIiIHZhbHVlPSJvcmcuZWNsaXBzZS5wZGUudWkud29ya2JlbmNoQ2xhc3NwYXRoUHJvdmlkZXIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlZNX0FSR1VNRU5UUyIgdmFsdWU9Ii1EZWNsaXBzZS5wMi5kYXRhLmFyZWE9YzovcHJvdi9wMi9hZ2VudERhdGEvJiMxMzsmIzEwOy1Eb3NnaS5ub1NodXRkb3duPXRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJwZGUudmVyc2lvbiIgdmFsdWU9IjMuMyIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0iamF2YXguc2VydmxldEBkZWZhdWx0OmRlZmF1bHQsb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmdAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuam9ic0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94Lmh0dHAuamV0dHlAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3guaHR0cC5yZWdpc3RyeUBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5odHRwLnNlcnZsZXRAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLm9zZ2lAOixvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcubW9ydGJheS5qZXR0eUBkZWZhdWx0OmRlZmF1bHQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idXNlTmFtZWRKUkUiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9IndvcmtzcGFjZV9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZWNmQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW5AZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGVAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kb3dubG9hZEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXBAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHNAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlc0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3JAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yQGRlZmF1bHQ6ZGVmYXVsdCIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGZiYmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBwMiBUb29scyAoSW5jdWJhdGlvbikKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWM3NGY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPHBsdWdpbj4KLSAgIDxleHRlbnNpb24gaWQ9ImZpbGVzZXJ2ZXJBcHBsaWNhdGlvbiIgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbiBjYXJkaW5hbGl0eT0iMSIgdGhyZWFkPSJtYWluIiB2aXNpYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxydW4gY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG9vbHMuRmlsZVNlcnZlckFwcGxpY2F0aW9uIi8+Ci0gICAgICA8L2FwcGxpY2F0aW9uPgotICAgPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBpZD0iYXBwbGljYXRpb24iIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4gCi0gICAgICA8YXBwbGljYXRpb24+IAotICAgICAgICAgPHJ1biBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b29scy5VcGRhdGVDaGVja2VyQXBwbGljYXRpb24iLz4gCi0gICAgICA8L2FwcGxpY2F0aW9uPiAKLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b29scy9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b29scy9BY3RpdmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQyM2U2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG9vbHMvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b29sczsKLQotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0OwotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBidW5kbGVDb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWJ1bmRsZUNvbnRleHQgPSBjb250ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnVuZGxlQ29udGV4dCA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Rvb2xzL0ZpbGVTZXJ2ZXJBcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Rvb2xzL0ZpbGVTZXJ2ZXJBcHBsaWNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjk4ZThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b29scy9GaWxlU2VydmVyQXBwbGljYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7Ci1pbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmh0dHAuKjsKLQotcHVibGljIGNsYXNzIEZpbGVTZXJ2ZXJBcHBsaWNhdGlvbiBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbiB7Ci0JcHJpdmF0ZSBNYXAgcmVzb3VyY2VzID0gbmV3IEhhc2hNYXAoMTApOwotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmlsZVN5c3RlbUNvbnRleHQgaW1wbGVtZW50cyBIdHRwQ29udGV4dCB7Ci0JCXByaXZhdGUgU3RyaW5nIGJhc2U7Ci0KLQkJcHVibGljIEZpbGVTeXN0ZW1Db250ZXh0KFN0cmluZyBiYXNlKSB7Ci0JCQl0aGlzLmJhc2UgPSBiYXNlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRNaW1lVHlwZShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgVVJMIGdldFJlc291cmNlKFN0cmluZyBuYW1lKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgVVJMKGJhc2UgKyBuYW1lKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVTZWN1cml0eShIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBzdGFydChJQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlNYXAgYXJncyA9IGNvbnRleHQuZ2V0QXJndW1lbnRzKCk7Ci0JCWluaXRpYWxpemVGcm9tQXJndW1lbnRzKChTdHJpbmdbXSkgYXJncy5nZXQoImFwcGxpY2F0aW9uLmFyZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmVnaXN0ZXJSZXNvdXJjZXMocmVzb3VyY2VzKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyUmVzb3VyY2VzKE1hcCBsaXN0KSB7Ci0JCUh0dHBTZXJ2aWNlIGh0dHAgPSAoSHR0cFNlcnZpY2UpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBIdHRwU2VydmljZS5jbGFzcy5nZXROYW1lKCkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSByZXNvdXJjZXMuZ2V0KGtleSk7Ci0JCQl0cnkgewotCQkJCWh0dHAucmVnaXN0ZXJSZXNvdXJjZXMoa2V5LCAiLyIsIG5ldyBGaWxlU3lzdGVtQ29udGV4dCh2YWx1ZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9IGNhdGNoIChOYW1lc3BhY2VFeGNlcHRpb24gZSkgewotCQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbUFyZ3VtZW50cyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGFyZ3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBjaGVjayBmb3IgYXJncyB3aXRob3V0IHBhcmFtZXRlcnMgKGkuZS4sIGEgZmxhZyBhcmcpCi0JCQkvLwkJCWlmIChhcmdzW2ldLmVxdWFscygiLXJhdyIpKQotCQkJLy8JCQkJcmF3ID0gdHJ1ZTsKLQotCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aCBwYXJhbWV0ZXJzLiBJZiB3ZSBhcmUgYXQgdGhlIGxhc3QgYXJndW1lbnQgb3IgCi0JCQkvLyBpZiB0aGUgbmV4dCBvbmUgaGFzIGEgJy0nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIsIHRoZW4gd2UgY2FuJ3QgaGF2ZSAKLQkJCS8vIGFuIGFyZyB3aXRoIGEgcGFyYW0gc28gY29udGludWUuCi0JCQlpZiAoaSA9PSBhcmdzLmxlbmd0aCAtIDEgfHwgYXJnc1tpICsgMV0uc3RhcnRzV2l0aCgiLSIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgYXJnID0gYXJnc1srK2ldOwotCi0JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLXJlc291cmNlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXNvdXJjZXMucHV0KGFyZywgYXJnc1srK2ldKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b29scy9NZXRhZGF0YUNvbXBhcmVBcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Rvb2xzL01ldGFkYXRhQ29tcGFyZUFwcGxpY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NmQyNTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3Rvb2xzL01ldGFkYXRhQ29tcGFyZUFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG9vbHM7Ci0KLS8vaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLS8vaW1wb3J0IGphdmEubmV0LlVSTDsKLS8vaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgTWV0YWRhdGFDb21wYXJlQXBwbGljYXRpb24gaW1wbGVtZW50cyBJQXBwbGljYXRpb24gewotCi0JLy8JcHJpdmF0ZSBTdHJpbmcgc291cmNlOwotCS8vCXByaXZhdGUgU3RyaW5nIHRhcmdldDsKLQkvLwlwcml2YXRlIGJvb2xlYW4gY29tcGFyZSA9IGZhbHNlOwotCS8vCXByaXZhdGUgYm9vbGVhbiBsaXN0ID0gZmFsc2U7Ci0JLy8JcHJpdmF0ZSBTdHJpbmcgdHlwZSA9ICJtZXRhIjsKLQotCXB1YmxpYyBPYmplY3Qgc3RhcnQoSUFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8JCWluaXRpYWxpemVGcm9tQXJndW1lbnRzKChTdHJpbmdbXSkgY29udGV4dC5nZXRBcmd1bWVudHMoKS5nZXQoImFwcGxpY2F0aW9uLmFyZ3MiKSk7Ci0JCS8vCi0JCS8vCQlpZiAoY29tcGFyZSkKLQkJLy8JCQljb21wYXJlTWV0YWRhdGFSZXBvc2l0b3JpZXMobmV3IFVSTChzb3VyY2UpLCBuZXcgVVJMKHRhcmdldCkpOwotCQkvLwkJaWYgKGxpc3QpIHsKLQkJLy8JCQlsaXN0KHNvdXJjZSk7Ci0JCS8vCQkJbGlzdCh0YXJnZXQpOwotCQkvLwkJfQotCQlyZXR1cm4gSUFwcGxpY2F0aW9uLkVYSVRfT0s7Ci0JfQotCi0JLy8JcHJpdmF0ZSB2b2lkIGxpc3QoU3RyaW5nIHNvdXJjZUxvY2F0aW9uKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkvLwkJaWYgKHNvdXJjZUxvY2F0aW9uID09IG51bGwpCi0JLy8JCQlyZXR1cm47Ci0JLy8JCUlRdWVyeWFibGUgc291cmNlID0gbnVsbDsKLQkvLwkJaWYgKHR5cGUuZXF1YWxzKCJtZXRhIikpIHsKLQkvLwkJCVVSTCBsb2NhdGlvbjsKLQkvLwkJCXRyeSB7Ci0JLy8JCQkJbG9jYXRpb24gPSBuZXcgVVJMKHNvdXJjZUxvY2F0aW9uKTsKLQkvLwkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JLy8JCQkJcmV0dXJuOwotCS8vCQkJfQotCS8vCQkJUHJvdmlzaW9uaW5nSGVscGVyLmFkZE1ldGFkYXRhUmVwb3NpdG9yeShsb2NhdGlvbik7Ci0JLy8JCQlzb3VyY2UgPSBQcm92aXNpb25pbmdIZWxwZXIuZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KGxvY2F0aW9uKTsKLQkvLwkJCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkvLwkJCQlyZXR1cm47Ci0JLy8JCX0gZWxzZSBpZiAodHlwZS5lcXVhbHMoInByb2ZpbGUiKSkgewotCS8vCQkJc291cmNlID0gUHJvdmlzaW9uaW5nSGVscGVyLmdldFByb2ZpbGUoc291cmNlTG9jYXRpb24pOwotCS8vCQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCS8vCQkJCXJldHVybjsKLQkvLwkJfQotCS8vCQlJSW5zdGFsbGFibGVVbml0W10gc291cmNlSVVzID0gc291cmNlLnF1ZXJ5KG51bGwsIG51bGwsIG51bGwsIGZhbHNlLCBudWxsKTsKLQkvLwkJc291cmNlSVVzID0gc29ydChzb3VyY2VJVXMsIHRydWUpOwotCS8vCQlmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUlVcy5sZW5ndGg7IGkrKykgewotCS8vCQkJU3lzdGVtLm91dC5wcmludChzb3VyY2VJVXNbaV0pOwotCS8vCQkJU3lzdGVtLm91dC5wcmludGxuKHNvdXJjZUlVc1tpXS5pc0ZyYWdtZW50KCkgPyAiIChmcmFnbWVudCkiIDogIiIpOwotCS8vCQl9Ci0JLy8JCVN5c3RlbS5vdXQucHJpbnRsbigiVG90YWw6ICIgKyBzb3VyY2VJVXMubGVuZ3RoKTsKLQkvLwl9Ci0JLy8KLQkvLwlwcml2YXRlIHZvaWQgY29tcGFyZU1ldGFkYXRhUmVwb3NpdG9yaWVzKFVSTCBzb3VyY2UsIFVSTCB0YXJnZXQpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCS8vCQlQcm92aXNpb25pbmdIZWxwZXIuYWRkTWV0YWRhdGFSZXBvc2l0b3J5KHNvdXJjZSk7Ci0JLy8JCUlNZXRhZGF0YVJlcG9zaXRvcnkgc291cmNlUmVwbyA9IFByb3Zpc2lvbmluZ0hlbHBlci5nZXRNZXRhZGF0YVJlcG9zaXRvcnkoc291cmNlKTsKLQkvLwkJaWYgKHNvdXJjZVJlcG8gPT0gbnVsbCkKLQkvLwkJCXJldHVybjsKLQkvLwkJUHJvdmlzaW9uaW5nSGVscGVyLmFkZE1ldGFkYXRhUmVwb3NpdG9yeSh0YXJnZXQpOwotCS8vCQlJTWV0YWRhdGFSZXBvc2l0b3J5IHRhcmdldFJlcG8gPSBQcm92aXNpb25pbmdIZWxwZXIuZ2V0TWV0YWRhdGFSZXBvc2l0b3J5KHRhcmdldCk7Ci0JLy8JCWlmICh0YXJnZXRSZXBvID09IG51bGwpCi0JLy8JCQlyZXR1cm47Ci0JLy8KLQkvLwkJU3lzdGVtLm91dC5wcmludGxuKCJcbiIgKyBzb3VyY2UudG9FeHRlcm5hbEZvcm0oKSArICIgLT4gIiArIHRhcmdldC50b0V4dGVybmFsRm9ybSgpKTsKLQkvLwkJY29tcGFyZShzb3VyY2VSZXBvLCB0YXJnZXRSZXBvKTsKLQkvLwotCS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuIiArIHRhcmdldC50b0V4dGVybmFsRm9ybSgpICsgIiAtPiAiICsgc291cmNlLnRvRXh0ZXJuYWxGb3JtKCkpOwotCS8vCQljb21wYXJlKHRhcmdldFJlcG8sIHNvdXJjZVJlcG8pOwotCS8vCX0KLQkvLwotCS8vCXByaXZhdGUgdm9pZCBjb21wYXJlKElRdWVyeWFibGUgc291cmNlUmVwbywgSVF1ZXJ5YWJsZSB0YXJnZXRSZXBvKSB7Ci0JLy8JCUlRdWVyeWFibGVbXSB0YXJnZXQgPSBuZXcgSVF1ZXJ5YWJsZVtdIHt0YXJnZXRSZXBvfTsKLQkvLwkJSUluc3RhbGxhYmxlVW5pdFtdIGl1cyA9IHNvdXJjZVJlcG8ucXVlcnkobnVsbCwgbnVsbCwgbnVsbCwgZmFsc2UsIG51bGwpOwotCS8vCQlpdXMgPSBzb3J0KGl1cywgdHJ1ZSk7Ci0JLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgaXVzLmxlbmd0aDsgaSsrKSB7Ci0JLy8JCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gaXVzW2ldOwotCS8vCQkJSXRlcmF0b3IgcmVzdWx0ID0gUXVlcnkuZ2V0SXRlcmF0b3IodGFyZ2V0LCBpdS5nZXRJZCgpLCBuZXcgVmVyc2lvblJhbmdlKGl1LmdldFZlcnNpb24oKSwgdHJ1ZSwgaXUuZ2V0VmVyc2lvbigpLCB0cnVlKSwgbnVsbCwgZmFsc2UpOwotCS8vCQkJaWYgKCFyZXN1bHQuaGFzTmV4dCgpKQotCS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbihpdSk7Ci0JLy8JCQllbHNlIHsKLQkvLwkJCQlTdHJpbmcgY29tcGFyaXNvbiA9IGNvbXBhcmUoaXUsIChJSW5zdGFsbGFibGVVbml0KSByZXN1bHQubmV4dCgpKTsKLQkvLwkJCQlpZiAoY29tcGFyaXNvbi5sZW5ndGgoKSA+IDApCi0JLy8JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihpdSArIGNvbXBhcmlzb24pOwotCS8vCQkJfQotCS8vCQl9Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSBib29sZWFuIGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0JLy8JCWlmIChhID09IG51bGwpCi0JLy8JCQlyZXR1cm4gYiA9PSBudWxsOwotCS8vCQlyZXR1cm4gYS5lcXVhbHMoYik7Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSBib29sZWFuIGNvbXBhcmUoT2JqZWN0W10gYSwgT2JqZWN0IGJbXSkgewotCS8vCQlpZiAoYSA9PSBudWxsKQotCS8vCQkJcmV0dXJuIGIgPT0gbnVsbDsKLQkvLwkJcmV0dXJuIEFycmF5cy5lcXVhbHMoYSwgYik7Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSBTdHJpbmcgY29tcGFyZShJSW5zdGFsbGFibGVVbml0IGl1LCBJSW5zdGFsbGFibGVVbml0IG5leHQpIHsKLQkvLwkJU3RyaW5nIHJlc3VsdCA9ICIiOwotCS8vCQlpZiAoIWl1LmVxdWFscyhuZXh0KSkKLQkvLwkJCXJlc3VsdCArPSAiIGl1IjsKLQkvLwkJaWYgKCFjb21wYXJlKGl1LmdldEFwcGxpY2FiaWxpdHlGaWx0ZXIoKSwgbmV4dC5nZXRBcHBsaWNhYmlsaXR5RmlsdGVyKCkpKQotCS8vCQkJcmVzdWx0ICs9ICIgYXBwbGljYWJpbGl0eUZpbHRlciI7Ci0JLy8JCWlmICghY29tcGFyZShpdS5nZXRBcnRpZmFjdHMoKSwgbmV4dC5nZXRBcnRpZmFjdHMoKSkpCi0JLy8JCQlyZXN1bHQgKz0gIiBhcnRpZmFjdExvY2F0b3JzIjsKLQkvLwkJaWYgKCFjb21wYXJlKGl1LmdldFByb3ZpZGVkQ2FwYWJpbGl0aWVzKCksIG5leHQuZ2V0UHJvdmlkZWRDYXBhYmlsaXRpZXMoKSkpCi0JLy8JCQlyZXN1bHQgKz0gIiBwcm92aWRlZENhcGFiaWxpdGllcyI7Ci0JLy8JCWlmICghY29tcGFyZVJlcXVpcmVzKGl1LmdldFJlcXVpcmVkQ2FwYWJpbGl0aWVzKCksIG5leHQuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKSkpCi0JLy8JCQlyZXN1bHQgKz0gIiByZXF1aXJlZENhcGFiaWxpdGllcyI7Ci0JLy8JCWlmICghY29tcGFyZShpdS5nZXRUb3VjaHBvaW50VHlwZSgpLCBuZXh0LmdldFRvdWNocG9pbnRUeXBlKCkpKQotCS8vCQkJcmVzdWx0ICs9ICIgdG91Y2hwb2ludFR5cGUiOwotCS8vCi0JLy8JCWlmIChpdS5pc0ZyYWdtZW50KCkpIHsKLQkvLwkJCWlmICgoKEluc3RhbGxhYmxlVW5pdEZyYWdtZW50KSBpdSkuZ2V0SG9zdElkKCkgPT0gbnVsbCB8fCAoKEluc3RhbGxhYmxlVW5pdEZyYWdtZW50KSBpdSkuZ2V0SG9zdFZlcnNpb25SYW5nZSgpID09IG51bGwpCi0JLy8JCQkJcmV0dXJuIHJlc3VsdDsKLQkvLwkJCWlmICghKChJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCkgaXUpLmdldEhvc3RJZCgpLmVxdWFscygoKEluc3RhbGxhYmxlVW5pdEZyYWdtZW50KSBuZXh0KS5nZXRIb3N0SWQoKSkpCi0JLy8JCQkJcmVzdWx0ICs9ICIgaG9zdGlkIjsKLQkvLwkJCWlmICghKChJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCkgaXUpLmdldEhvc3RWZXJzaW9uUmFuZ2UoKS5lcXVhbHMoKChJbnN0YWxsYWJsZVVuaXRGcmFnbWVudCkgbmV4dCkuZ2V0SG9zdFZlcnNpb25SYW5nZSgpKSkKLQkvLwkJCQlyZXN1bHQgKz0gIiBob3N0dmVyc2lvblJhbmdlIjsKLQkvLwkJfQotCS8vCQlyZXR1cm4gcmVzdWx0OwotCS8vCX0KLQkvLwotCS8vCXByaXZhdGUgYm9vbGVhbiBjb21wYXJlUmVxdWlyZXMoUmVxdWlyZWRDYXBhYmlsaXR5W10gYSwgUmVxdWlyZWRDYXBhYmlsaXR5W10gYikgewotCS8vCQlpZiAoYSA9PSBudWxsKQotCS8vCQkJcmV0dXJuIGIgPT0gbnVsbDsKLQkvLwkJaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKQotCS8vCQkJcmV0dXJuIGZhbHNlOwotCS8vCQlpZiAoYSA9PSBiKQotCS8vCQkJcmV0dXJuIHRydWU7Ci0JLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykKLQkvLwkJCWlmIChmaW5kQ2FwYWJpbGl0eShhW2ldLCBiKSA9PSBudWxsKQotCS8vCQkJCXJldHVybiBmYWxzZTsKLQkvLwkJcmV0dXJuIHRydWU7Ci0JLy8JfQotCS8vCi0JLy8JcHJpdmF0ZSBSZXF1aXJlZENhcGFiaWxpdHkgZmluZENhcGFiaWxpdHkoUmVxdWlyZWRDYXBhYmlsaXR5IHRhcmdldCwgUmVxdWlyZWRDYXBhYmlsaXR5W10gYikgewotCS8vCQlmb3IgKGludCBpID0gMDsgaSA8IGIubGVuZ3RoOyBpKyspIHsKLQkvLwkJCVJlcXVpcmVkQ2FwYWJpbGl0eSBjYXBhYmlsaXR5ID0gYltpXTsKLQkvLwkJCWlmICh0YXJnZXQuZXF1YWxzKGNhcGFiaWxpdHkpKQotCS8vCQkJCXJldHVybiBjYXBhYmlsaXR5OwotCS8vCQl9Ci0JLy8JCXJldHVybiBudWxsOwotCS8vCX0KLQkvLwotCS8vCXByaXZhdGUgSUluc3RhbGxhYmxlVW5pdFtdIHNvcnQoSUluc3RhbGxhYmxlVW5pdFtdIGl1cywgYm9vbGVhbiBjbG9uZSkgewotCS8vCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkvLwkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3Qgc291cmNlLCBPYmplY3QgdGFyZ2V0KSB7Ci0JLy8JCQkJSUluc3RhbGxhYmxlVW5pdCBzb3VyY2VJVSA9IChJSW5zdGFsbGFibGVVbml0KSBzb3VyY2U7Ci0JLy8JCQkJSUluc3RhbGxhYmxlVW5pdCB0YXJnZXRJVSA9IChJSW5zdGFsbGFibGVVbml0KSB0YXJnZXQ7Ci0JLy8JCQkJaW50IGlkID0gc291cmNlSVUuZ2V0SWQoKS5jb21wYXJlVG8odGFyZ2V0SVUuZ2V0SWQoKSk7Ci0JLy8JCQkJaWYgKGlkICE9IDApCi0JLy8JCQkJCXJldHVybiBpZDsKLQkvLwkJCQlpbnQgdmVyc2lvbiA9IHNvdXJjZUlVLmdldFZlcnNpb24oKS5jb21wYXJlVG8odGFyZ2V0SVUuZ2V0VmVyc2lvbigpKTsKLQkvLwkJCQlpZiAodmVyc2lvbiAhPSAwKQotCS8vCQkJCQlyZXR1cm4gdmVyc2lvbjsKLQkvLwkJCQlyZXR1cm4gMDsKLQkvLwkJCX0KLQkvLwkJfTsKLQkvLwkJSUluc3RhbGxhYmxlVW5pdFtdIHJlc3VsdCA9IGl1czsKLQkvLwkJaWYgKGNsb25lKSB7Ci0JLy8JCQlyZXN1bHQgPSBuZXcgSW5zdGFsbGFibGVVbml0W2l1cy5sZW5ndGhdOwotCS8vCQkJU3lzdGVtLmFycmF5Y29weShpdXMsIDAsIHJlc3VsdCwgMCwgaXVzLmxlbmd0aCk7Ci0JLy8JCX0KLQkvLwkJQXJyYXlzLnNvcnQocmVzdWx0LCBjb21wYXJhdG9yKTsKLQkvLwkJcmV0dXJuIHJlc3VsdDsKLQkvLwl9Ci0JLy8KLQkvLwlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbUFyZ3VtZW50cyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkvLwkJaWYgKGFyZ3MgPT0gbnVsbCkKLQkvLwkJCXJldHVybjsKLQkvLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JLy8JCQkvLyBjaGVjayBmb3IgYXJncyB3aXRob3V0IHBhcmFtZXRlcnMgKGkuZS4sIGEgZmxhZyBhcmcpCi0JLy8KLQkvLwkJCS8vCQkJaWYgKGFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZSgiLXNvcnQiKSkKLQkvLwkJCS8vCQkJCXNvcnQgPSB0cnVlOwotCS8vCi0JLy8JCQlpZiAoYXJnc1tpXS5lcXVhbHNJZ25vcmVDYXNlKCItbWV0YSIpKQotCS8vCQkJCXR5cGUgPSAibWV0YSI7Ci0JLy8KLQkvLwkJCWlmIChhcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1jb21wYXJlIikpCi0JLy8JCQkJY29tcGFyZSA9IHRydWU7Ci0JLy8KLQkvLwkJCWlmIChhcmdzW2ldLmVxdWFsc0lnbm9yZUNhc2UoIi1wcm9maWxlIikpCi0JLy8JCQkJdHlwZSA9ICJwcm9maWxlIjsKLQkvLwotCS8vCQkJaWYgKGFyZ3NbaV0uZXF1YWxzSWdub3JlQ2FzZSgiLWxpc3QiKSkKLQkvLwkJCQlsaXN0ID0gdHJ1ZTsKLQkvLwotCS8vCQkJLy8gY2hlY2sgZm9yIGFyZ3Mgd2l0aCBwYXJhbWV0ZXJzLiBJZiB3ZSBhcmUgYXQgdGhlIGxhc3QgYXJndW1lbnQgb3IKLQkvLwkJCS8vIGlmIHRoZSBuZXh0IG9uZQotCS8vCQkJLy8gaGFzIGEgJy0nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXIsIHRoZW4gd2UgY2FuJ3QgaGF2ZSBhbiBhcmcgd2l0aAotCS8vCQkJLy8gYSBwYXJtIHNvIGNvbnRpbnVlLgotCS8vCQkJaWYgKGkgPT0gYXJncy5sZW5ndGggLSAxIHx8IGFyZ3NbaSArIDFdLnN0YXJ0c1dpdGgoIi0iKSkgLy8kTk9OLU5MUy0xJAotCS8vCQkJCWNvbnRpbnVlOwotCS8vCi0JLy8JCQlTdHJpbmcgYXJnID0gYXJnc1srK2ldOwotCS8vCi0JLy8JCQlpZiAoYXJnc1tpIC0gMV0uZXF1YWxzSWdub3JlQ2FzZSgiLXNvdXJjZSIpKQotCS8vCQkJCXNvdXJjZSA9IGFyZzsKLQkvLwkJCWlmIChhcmdzW2kgLSAxXS5lcXVhbHNJZ25vcmVDYXNlKCItdGFyZ2V0IikpCi0JLy8JCQkJdGFyZ2V0ID0gYXJnOwotCS8vCQl9Ci0JLy8JfQotCS8vCi0JcHVibGljIHZvaWQgc3RvcCgpIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b29scy9VcGRhdGVDaGVja2VyQXBwbGljYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b29scy9VcGRhdGVDaGVja2VyQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmYTg4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG9vbHMvVXBkYXRlQ2hlY2tlckFwcGxpY2F0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG9vbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVjaGVja2VyLlVwZGF0ZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51cGRhdGVjaGVja2VyLio7Ci0KLS8qKgotICogQSBsaXR0bGUgYXBwIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byByZWdpc3RlciBmb3IgYXV0b21hdGljIHVwZGF0ZSBjaGVja3Mgb24KLSAqIGEgcHJvZmlsZS4KLSAqIAotICogIC1wcm9maWxlIHByb2ZpbGVJRCAoc3BlY2lmaWVzIHRoZSBwcm9maWxlIGlkIHRvIGNoZWNrIGZvciB1cGRhdGVzKQotICogIC1kZWxheSBsb25nIChzcGVjaWZpZXMgYSBsb25nIHdoaWNoIGlzIHRoZSBpbml0aWFsIGRlbGF5IGJlZm9yZSBiZWdpbm5pbmcgcG9sbGluZykKLSAqICAtcG9sbCBsb25nIChzcGVjaWZpZXMgYSBsb25nIHdoaWNoIGlzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHVwZGF0ZSBwb2xsKQotICogIC1kZWJ1ZywgLXRyYWNlIGNhbiBiZSB1c2VkIHRvIHNob3cgeW91IHdoYXQncyBnb2luZyBvbi4KLSAqICAKLSAqICAgVGhpcyBjaGVja2VyIHNpbXBseSB3cml0ZXMgdG8gc3lzdGVtLm91dCB3aGVuIHVwZGF0ZXMgYXJlIGF2YWlsYWJsZSBhbmQgbGlzdHMgdGhlCi0gKiAgIElVJ3MgdGhhdCBoYXZlIHVwZGF0ZXMgYXZhaWxhYmxlLgotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlQ2hlY2tlckFwcGxpY2F0aW9uIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBBUkdfUFJPRklMRSA9ICItcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgQVJHX1BPTEwgPSAiLXBvbGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEFSR19ERUxBWSA9ICItZGVsYXkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEFSR19ERUJVRyA9ICItZGVidWciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEFSR19UUkFDRSA9ICItdHJhY2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIHByb2ZpbGVJZDsKLQlsb25nIGRlbGF5ID0gSVVwZGF0ZUNoZWNrZXIuT05FX1RJTUVfQ0hFQ0s7Ci0JbG9uZyBwb2xsID0gSVVwZGF0ZUNoZWNrZXIuT05FX1RJTUVfQ0hFQ0s7Ci0JSVVwZGF0ZUNoZWNrZXIgY2hlY2tlcjsKLQlJVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVVwZGF0ZUxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZXNBdmFpbGFibGUoVXBkYXRlRXZlbnQgZXZlbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXBkYXRlcyBhdmFpbGFibGUgZm9yICIgKyBwcm9maWxlSWQpOyAvLyROT04tTkxTLTEkCi0JCQlJSW5zdGFsbGFibGVVbml0W10gaXVzID0gZXZlbnQuZ2V0SVVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl1cy5sZW5ndGg7IGkrKykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oaXVzW2ldLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQl9OwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb24jc3RhcnQob3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHN0YXJ0KElBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWNoZWNrZXIgPSAoSVVwZGF0ZUNoZWNrZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJVXBkYXRlQ2hlY2tlci5TRVJWSUNFX05BTUUpOwotCQlpZiAoY2hlY2tlciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVwZGF0ZSBjaGVja2VyIGNvdWxkIG5vdCBiZSBsb2FkZWQuIik7IC8vJE5PTi1OTFMtMSQKLQotCQlNYXAgYXJncyA9IGNvbnRleHQuZ2V0QXJndW1lbnRzKCk7Ci0JCWluaXRpYWxpemVGcm9tQXJndW1lbnRzKChTdHJpbmdbXSkgYXJncy5nZXQoImFwcGxpY2F0aW9uLmFyZ3MiKSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHByb2ZpbGVJZCA9PSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk11c3Qgc3BlY2lmeSBhIHByb2ZpbGUgaWQgdXNpbmcgLXByb2ZpbGUgYXJnIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCWNoZWNrZXIuYWRkVXBkYXRlQ2hlY2socHJvZmlsZUlkLCBJbnN0YWxsYWJsZVVuaXRRdWVyeS5BTlksIGRlbGF5LCBwb2xsLCBsaXN0ZW5lcik7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQljaGVja2VyLnJlbW92ZVVwZGF0ZUNoZWNrKGxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRnJvbUFyZ3VtZW50cyhTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGFyZ3MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJnc1tpXS5lcXVhbHMoQVJHX0RFQlVHKSkKLQkJCQlVcGRhdGVDaGVja2VyLkRFQlVHID0gdHJ1ZTsKLQkJCWVsc2UgaWYgKGFyZ3NbaV0uZXF1YWxzKEFSR19UUkFDRSkpCi0JCQkJVXBkYXRlQ2hlY2tlci5UUkFDRSA9IHRydWU7Ci0KLQkJCS8vIFRoZSByZW1haW5pbmcgYXJncyBoYXZlIHBhcmFtZXRlcnMuICBJZiB3ZSBhcmUgYXQgdGhlCi0JCQkvLyBsYXN0IGFyZ3VtZW50LCBvciBpZiB0aGUgbmV4dCBvbmUgc3RhcnRzIHdpdGggYSAnLScsCi0JCQkvLyB0aGVuIHRoZXJlIHdvbid0IGJlIGEgcGFybSwgc28gc2tpcCB0aGlzIG9uZS4KLQkJCWlmIChpID09IGFyZ3MubGVuZ3RoIC0gMSB8fCBhcmdzW2kgKyAxXS5zdGFydHNXaXRoKCItIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQotCQkJU3RyaW5nIGFyZyA9IGFyZ3NbKytpXTsKLQotCQkJaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoQVJHX1BST0ZJTEUpKQotCQkJCXByb2ZpbGVJZCA9IGFyZzsKLQkJCWVsc2UgaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoQVJHX1BPTEwpKQotCQkJCXBvbGwgPSBnZXRMb25nKEFSR19QT0xMLCBhcmcsIElVcGRhdGVDaGVja2VyLk9ORV9USU1FX0NIRUNLKTsKLQkJCWVsc2UgaWYgKGFyZ3NbaSAtIDFdLmVxdWFsc0lnbm9yZUNhc2UoQVJHX0RFTEFZKSkKLQkJCQlkZWxheSA9IGdldExvbmcoQVJHX0RFTEFZLCBhcmcsIElVcGRhdGVDaGVja2VyLk9ORV9USU1FX0NIRUNLKTsKLQotCQl9Ci0JfQotCi0JbG9uZyBnZXRMb25nKFN0cmluZyBhcmdOYW1lLCBTdHJpbmcgdmFsdWUsIGxvbmcgZGVmYXVsdFZhbHVlKSB7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gTG9uZy5wYXJzZUxvbmcodmFsdWUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSB2YWx1ZSBmb3IgIiArIGFyZ05hbWUgKyAiKCIgKyB2YWx1ZSArICIpIGlzIG5vdCBhIGxvbmcuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCXJldHVybiBkZWZhdWx0VmFsdWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3VwZGF0ZWNoZWNrZXIgYXBwLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scy91cGRhdGVjaGVja2VyIGFwcC5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNThmZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzL3VwZGF0ZWNoZWNrZXIgYXBwLmxhdW5jaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08bGF1bmNoQ29uZmlndXJhdGlvbiB0eXBlPSJvcmcuZWNsaXBzZS5wZGUudWkuRXF1aW5veExhdW5jaGVyIj4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXBwZW5kLmFyZ3MiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY0FkZCIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImF1dG9tYXRpY1ZhbGlkYXRlIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJib290c3RyYXAiIHZhbHVlPSIiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJjaGVja2VkIiB2YWx1ZT0iW05PTkVdIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9ImNsZWFyQ29uZmlnIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNvbmZpZ0xvY2F0aW9uIiB2YWx1ZT0iJHt3b3Jrc3BhY2VfbG9jfS8ubWV0YWRhdGEvLnBsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmNvcmUvdXBkYXRlY2hlY2tlciBhcHAiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iZGVmYXVsdF9hdXRvX3N0YXJ0IiB2YWx1ZT0iZmFsc2UiLz4KLTxpbnRBdHRyaWJ1dGUga2V5PSJkZWZhdWx0X3N0YXJ0X2xldmVsIiB2YWx1ZT0iNCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItY29uc29sZSAtY29uc29sZWxvZyAtYXBwbGljYXRpb24gb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLmFwcC5hcHBsaWNhdGlvbiYjMTM7JiMxMDstbWV0YWRhdGFSZXBvc2l0b3J5IGZpbGU6YzovcHJvdi9wMi9zZXJ2ZXJzL21ldGFkYXRhUmVwb3NpdG9yeS8gJiMxMzsmIzEwOy1hcnRpZmFjdFJlcG9zaXRvcnkgZmlsZTpjOi9wcm92L3AyL3NlcnZlcnMvYXJ0aWZhY3RSZXBvc2l0b3J5LyAmIzEzOyYjMTA7LXByb2ZpbGUgVGVzdCYjMTM7JiMxMDstZGVsYXkgNTAwMCYjMTM7JiMxMDstcG9sbCAxMDAwMCYjMTM7JiMxMDstdHJhY2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLlNPVVJDRV9QQVRIX1BST1ZJREVSIiB2YWx1ZT0ib3JnLmVjbGlwc2UucGRlLnVpLndvcmtiZW5jaENsYXNzcGF0aFByb3ZpZGVyIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5WTV9BUkdVTUVOVFMiIHZhbHVlPSItRGVjbGlwc2UucDIuZGF0YS5hcmVhPWM6L3Byb3YvcDIvYWdlbnREYXRhIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0icGRlLnZlcnNpb24iIHZhbHVlPSIzLjMiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ0YXJnZXRfYnVuZGxlcyIgdmFsdWU9Im9yZy5lY2xpcHNlLmNvcmUuY29udGVudHR5cGVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmNvcmUuam9ic0BkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29tcGF0aWJpbGl0eS5yZWdpc3RyeUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5hcHBAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnJlZ2lzdHJ5QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpQDosb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlc0BkZWZhdWx0OmRlZmF1bHQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VOYW1lZEpSRSIgdmFsdWU9InRydWUiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJ2bWluc3RhbGwiIHZhbHVlPSJqcmUxLjUuMF8xMSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9IndvcmtzcGFjZV9idW5kbGVzIiB2YWx1ZT0iY29tLnRob3VnaHR3b3Jrcy54c3RyZWFtQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2ZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbkBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94QGRlZmF1bHQ6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnlAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kb3dubG9hZEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmVAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXBAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2VAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXJANTp0cnVlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci5hcHBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvckBkZWZhdWx0OnRydWUiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiYjdhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2NzU4ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYWE1ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzAgKzAsMCBAQAotI0ZyaSBGZWIgMjIgMTE6MjQ6MjEgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnN0YW5jZS9vcmcuZWNsaXBzZS5jb3JlLm5ldC9vcmcuZWNsaXBzZS5jb3JlLm5ldC5oYXNNaWdyYXRlZD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmMwMTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNTdW4gU2VwIDIzIDExOjU5OjAzIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcy8+Ci1zcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLXNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ5YmE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUltcG9ydC1QYWNrYWdlOiBqYXZheC54bWwucGFyc2VycywKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7Y29tbW9uPXNwbGl0LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZ2FyYmFnZWNvbGxlY3RvciwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3I7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbjt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50O3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXI7dmVyc2lvbj0iMS4yLjAiO3Jlc29sdXRpb246PW9wdGlvbmFsLAotIG9yZy5lY2xpcHNlLm9zZ2kudXRpbDt2ZXJzaW9uPSIxLjEuMCIsCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIiwKLSBvcmcub3NnaS51dGlsLnRyYWNrZXI7dmVyc2lvbj0iMS4zLjIiLAotIG9yZy53M2MuZG9tLAotIG9yZy54bWwuc2F4Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2U7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbiIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVjb25jaWxlci5kcm9waW5zLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24iCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQsCi0gQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMQotQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLkFjdGl2YXRvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYmQ5YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNjZkMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBQcm92aXNpb25pbmcgRWNsaXBzZSBUb3VjaHBvaW50Ci1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzE5Njk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTxwbHVnaW4+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUudG91Y2hwb2ludHMiIGlkPSJlY2xpcHNlIiBuYW1lPSJFY2xpcHNlIFRvdWNocG9pbnQiPgotCQk8dG91Y2hwb2ludCAKLQkJCXR5cGU9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIub3NnaSIgCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuRWNsaXBzZVRvdWNocG9pbnQiCi0JCQl2ZXJzaW9uPSIxLjAuMCIvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJCXBvaW50PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IubWFya3NldHByb3ZpZGVycyIKLQkJCWlkPSJFY2xpcHNlVG91Y2hwb2ludCI+Ci0JCQk8cnVuIAotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5NYXJrU2V0UHJvdmlkZXIiLz4KLQk8L2V4dGVuc2lvbj4KLQk8L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZjU1MjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2U7Ci0KLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBudWxsOwotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjdHgpIHRocm93cyBFeGNlcHRpb24gewotCQlBY3RpdmF0b3IuY29udGV4dCA9IGN0eDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY3R4KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gQWN0aXZhdG9yLmNvbnRleHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9BZ2dyZWdhdGVkQnVuZGxlUmVwb3NpdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvQWdncmVnYXRlZEJ1bmRsZVJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UzMDlmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9BZ2dyZWdhdGVkQnVuZGxlUmVwb3NpdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuQWJzdHJhY3RBcnRpZmFjdFJlcG9zaXRvcnk7Ci0KLXB1YmxpYyBjbGFzcyBBZ2dyZWdhdGVkQnVuZGxlUmVwb3NpdG9yeSBleHRlbmRzIEFic3RyYWN0QXJ0aWZhY3RSZXBvc2l0b3J5IGltcGxlbWVudHMgSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUE9TSVRPUllfVFlQRSA9IEFnZ3JlZ2F0ZWRCdW5kbGVSZXBvc2l0b3J5LmNsYXNzLmdldE5hbWUoKTsKLQlwcml2YXRlIGZpbmFsIENvbGxlY3Rpb24gYnVuZGxlUmVwb3NpdG9yaWVzOwotCi0JcHVibGljIEFnZ3JlZ2F0ZWRCdW5kbGVSZXBvc2l0b3J5KENvbGxlY3Rpb24gYnVuZGxlUmVwb3NpdG9yaWVzKSB7Ci0JCXN1cGVyKFJFUE9TSVRPUllfVFlQRSwgUkVQT1NJVE9SWV9UWVBFLCAiMS4wIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5idW5kbGVSZXBvc2l0b3JpZXMgPSBidW5kbGVSZXBvc2l0b3JpZXM7Ci0JfQotCi0JcHVibGljIEZpbGUgZ2V0QXJ0aWZhY3RGaWxlKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGJ1bmRsZVJlcG9zaXRvcmllcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gKElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KSBpdC5uZXh0KCk7Ci0JCQlGaWxlIGFydGlmYWN0RmlsZSA9IHJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3RGaWxlKGtleSk7Ci0JCQlpZiAoYXJ0aWZhY3RGaWxlICE9IG51bGwpCi0JCQkJcmV0dXJuIGFydGlmYWN0RmlsZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRmlsZSBnZXRBcnRpZmFjdEZpbGUoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBidW5kbGVSZXBvc2l0b3JpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IChJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSkgaXQubmV4dCgpOwotCQkJRmlsZSBhcnRpZmFjdEZpbGUgPSByZXBvc2l0b3J5LmdldEFydGlmYWN0RmlsZShkZXNjcmlwdG9yKTsKLQkJCWlmIChhcnRpZmFjdEZpbGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYXJ0aWZhY3RGaWxlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYnVuZGxlUmVwb3NpdG9yaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSAoSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkpIGl0Lm5leHQoKTsKLQkJCWlmIChyZXBvc2l0b3J5LmNvbnRhaW5zKGRlc2NyaXB0b3IpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhJQXJ0aWZhY3RLZXkga2V5KSB7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBidW5kbGVSZXBvc2l0b3JpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IChJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSkgaXQubmV4dCgpOwotCQkJaWYgKHJlcG9zaXRvcnkuY29udGFpbnMoa2V5KSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdERlc2NyaXB0b3JbXSBnZXRBcnRpZmFjdERlc2NyaXB0b3JzKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJU2V0IGFydGlmYWN0RGVzY3JpcHRvcnMgPSBuZXcgSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gYnVuZGxlUmVwb3NpdG9yaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSAoSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkpIGl0Lm5leHQoKTsKLQkJCUlBcnRpZmFjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHJlcG9zaXRvcnkuZ2V0QXJ0aWZhY3REZXNjcmlwdG9ycyhrZXkpOwotCQkJaWYgKGRlc2NyaXB0b3JzICE9IG51bGwpCi0JCQkJYXJ0aWZhY3REZXNjcmlwdG9ycy5hZGRBbGwoQXJyYXlzLmFzTGlzdChkZXNjcmlwdG9ycykpOwotCQl9Ci0JCXJldHVybiAoSUFydGlmYWN0RGVzY3JpcHRvcltdKSBhcnRpZmFjdERlc2NyaXB0b3JzLnRvQXJyYXkobmV3IElBcnRpZmFjdERlc2NyaXB0b3JbYXJ0aWZhY3REZXNjcmlwdG9ycy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgSUFydGlmYWN0S2V5W10gZ2V0QXJ0aWZhY3RLZXlzKCkgewotCQlTZXQgYXJ0aWZhY3RLZXlzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGJ1bmRsZVJlcG9zaXRvcmllcy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gKElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KSBpdC5uZXh0KCk7Ci0JCQlJQXJ0aWZhY3RLZXlbXSBrZXlzID0gcmVwb3NpdG9yeS5nZXRBcnRpZmFjdEtleXMoKTsKLQkJCWlmIChrZXlzICE9IG51bGwpCi0JCQkJYXJ0aWZhY3RLZXlzLmFkZEFsbChBcnJheXMuYXNMaXN0KGtleXMpKTsKLQkJfQotCQlyZXR1cm4gKElBcnRpZmFjdEtleVtdKSBhcnRpZmFjdEtleXMudG9BcnJheShuZXcgSUFydGlmYWN0S2V5W2FydGlmYWN0S2V5cy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRBcnRpZmFjdChJQXJ0aWZhY3REZXNjcmlwdG9yIGRlc2NyaXB0b3IsIE91dHB1dFN0cmVhbSBkZXN0aW5hdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihNZXNzYWdlcy5hcnRpZmFjdF9yZXRyaWV2YWxfdW5zdXBwb3J0ZWQpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldEFydGlmYWN0cyhJQXJ0aWZhY3RSZXF1ZXN0W10gcmVxdWVzdHMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTWVzc2FnZXMuYXJ0aWZhY3RfcmV0cmlldmFsX3Vuc3VwcG9ydGVkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9FY2xpcHNlVG91Y2hwb2ludC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvRWNsaXBzZVRvdWNocG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRhMmM0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9FY2xpcHNlVG91Y2hwb2ludC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5hY3Rpb25zLkFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5GcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLXB1YmxpYyBjbGFzcyBFY2xpcHNlVG91Y2hwb2ludCBleHRlbmRzIFRvdWNocG9pbnQgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgVG91Y2hwb2ludFR5cGUgVE9VQ0hQT0lOVF9UWVBFID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnRUeXBlKCJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm9zZ2kiLCBuZXcgVmVyc2lvbigiMS4wIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8vIFRPRE86IHBoYXNlIGlkIGNvbnN0YW50cyBzaG91bGQgYmUgZGVmaW5lZCBlbHNld2hlcmUuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TVEFMTF9QSEFTRV9JRCA9ICJpbnN0YWxsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOSU5TVEFMTF9QSEFTRV9JRCA9ICJ1bmluc3RhbGwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9GSUxFX1BST1BfTEFVTkNIRVJfTkFNRSA9ICJlY2xpcHNlLnRvdWNocG9pbnQubGF1bmNoZXJOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fTUFOSVBVTEFUT1IgPSAibWFuaXB1bGF0b3IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9QTEFURk9STV9DT05GSUdVUkFUSU9OID0gInBsYXRmb3JtQ29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1NPVVJDRV9CVU5ETEVTID0gInNvdXJjZUJ1bmRsZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9JVSA9ICJpdSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX0lOU1RBTExfRk9MREVSID0gImluc3RhbGxGb2xkZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVN0YXR1cyBjb21wbGV0ZVBoYXNlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgSVByb2ZpbGUgcHJvZmlsZSwgU3RyaW5nIHBoYXNlSWQsIE1hcCB0b3VjaHBvaW50UGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgdG91Y2hwb2ludFBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fTUFOSVBVTEFUT1IpOwotCQl0cnkgewotCQkJbWFuaXB1bGF0b3Iuc2F2ZShmYWxzZSk7Ci0JCX0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTWVzc2FnZXMuZXJyb3Jfc2F2aW5nX21hbmlwdWxhdG9yLCBlKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTWVzc2FnZXMuZXJyb3Jfc2F2aW5nX21hbmlwdWxhdG9yLCBlKTsKLQkJfQotCi0JCWlmIChJTlNUQUxMX1BIQVNFX0lELmVxdWFscyhwaGFzZUlkKSB8fCBVTklOU1RBTExfUEhBU0VfSUQuZXF1YWxzKHBoYXNlSWQpKSB7Ci0JCQlQbGF0Zm9ybUNvbmZpZ3VyYXRpb25XcmFwcGVyIGNvbmZpZ3VyYXRpb24gPSAoUGxhdGZvcm1Db25maWd1cmF0aW9uV3JhcHBlcikgdG91Y2hwb2ludFBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fUExBVEZPUk1fQ09ORklHVVJBVElPTik7Ci0JCQl0cnkgewotCQkJCWNvbmZpZ3VyYXRpb24uc2F2ZSgpOwotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIHBlKSB7Ci0JCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTWVzc2FnZXMuZXJyb3Jfc2F2aW5nX3BsYXRmb3JtX2NvbmZpZ3VyYXRpb24sIHBlKTsKLQkJCX0KLQkJfQotCi0JCVNvdXJjZU1hbmlwdWxhdG9yIG0gPSAoU291cmNlTWFuaXB1bGF0b3IpIHRvdWNocG9pbnRQYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX1NPVVJDRV9CVU5ETEVTKTsKLQkJdHJ5IHsKLQkJCW0uc2F2ZSgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihNZXNzYWdlcy5lcnJvcl9zYXZpbmdfc291cmNlX2J1bmRsZXNfbGlzdCwgZSk7Ci0JCX0KLQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgUHJvdmlzaW9uaW5nQWN0aW9uIGdldEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsKLQkJcmV0dXJuIEFjdGlvbkZhY3RvcnkuY3JlYXRlKGFjdGlvbklkKTsKLQl9Ci0KLQlwdWJsaWMgVG91Y2hwb2ludFR5cGUgZ2V0VG91Y2hwb2ludFR5cGUoKSB7Ci0JCS8vVE9ETyB0aGlzIGRhdGEgcHJvYmFibHkgbmVlZHMgdG8gY29tZSBmcm9tIHRoZSBYTUwKLQkJcmV0dXJuIFRPVUNIUE9JTlRfVFlQRTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBpbml0aWFsaXplUGhhc2UoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcgcGhhc2VJZCwgTWFwIHRvdWNocG9pbnRQYXJhbWV0ZXJzKSB7Ci0JCXRvdWNocG9pbnRQYXJhbWV0ZXJzLnB1dChQQVJNX0lOU1RBTExfRk9MREVSLCBVdGlsLmdldEluc3RhbGxGb2xkZXIocHJvZmlsZSkpOwotCQlMYXp5TWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSBuZXcgTGF6eU1hbmlwdWxhdG9yKHByb2ZpbGUpOwotCQl0b3VjaHBvaW50UGFyYW1ldGVycy5wdXQoUEFSTV9NQU5JUFVMQVRPUiwgbWFuaXB1bGF0b3IpOwotCQl0b3VjaHBvaW50UGFyYW1ldGVycy5wdXQoUEFSTV9TT1VSQ0VfQlVORExFUywgbmV3IFNvdXJjZU1hbmlwdWxhdG9yKHByb2ZpbGUpKTsKLQkJRmlsZSBjb25maWdMb2NhdGlvbiA9IFV0aWwuZ2V0Q29uZmlndXJhdGlvbkZvbGRlcihwcm9maWxlKTsKLQkJVVJMIHBvb2xVUkwgPSBVdGlsLmdldEJ1bmRsZVBvb2xMb2NhdGlvbihwcm9maWxlKTsKLQkJdG91Y2hwb2ludFBhcmFtZXRlcnMucHV0KFBBUk1fUExBVEZPUk1fQ09ORklHVVJBVElPTiwgbmV3IFBsYXRmb3JtQ29uZmlndXJhdGlvbldyYXBwZXIoY29uZmlnTG9jYXRpb24sIHBvb2xVUkwsIG1hbmlwdWxhdG9yKSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGluaXRpYWxpemVPcGVyYW5kKElQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBwaGFzZUlkLCBJbnN0YWxsYWJsZVVuaXRPcGVyYW5kIG9wZXJhbmQsIE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoUEFSTV9JVSk7Ci0JCWlmIChpdSAhPSBudWxsICYmIEJvb2xlYW4udmFsdWVPZihpdS5nZXRQcm9wZXJ0eShJSW5zdGFsbGFibGVVbml0LlBST1BfUEFSVElBTF9JVSkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQlJSW5zdGFsbGFibGVVbml0IHByZXBhcmVkSVUgPSBwcmVwYXJlSVUoaXUsIHByb2ZpbGUpOwotCQkJaWYgKHByZXBhcmVkSVUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5mYWlsZWRfcHJlcGFyZUlVLCBpdSkpOwotCi0JCQlwYXJhbWV0ZXJzLnB1dChQQVJNX0lVLCBwcmVwYXJlZElVKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwcml2YXRlIElJbnN0YWxsYWJsZVVuaXQgcHJlcGFyZUlVKElJbnN0YWxsYWJsZVVuaXQgaXUsIElQcm9maWxlIHByb2ZpbGUpIHsKLQotCQlDbGFzcyBjID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWMgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5NZXRhZGF0YUdlbmVyYXRvckhlbHBlciIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoYyAhPSBudWxsKQotCQkJCWMgPSBDbGFzcy5mb3JOYW1lKCJvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuUGxhdGZvcm1BZG1pbiIpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5nZW5lcmF0b3Jfbm90X2F2YWlsYWJsZSwgZS5nZXRNZXNzYWdlKCkpKTsKLQkJfQotCi0JCWlmIChjICE9IG51bGwpIHsKLQkJCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IGl1LmdldEFydGlmYWN0cygpOwotCQkJaWYgKGFydGlmYWN0cyA9PSBudWxsIHx8IGFydGlmYWN0cy5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gaXU7Ci0KLQkJCUlBcnRpZmFjdEtleSBhcnRpZmFjdEtleSA9IGFydGlmYWN0c1swXTsKLQkJCWlmIChhcnRpZmFjdEtleSA9PSBudWxsKQotCQkJCXJldHVybiBpdTsKLQotCQkJRmlsZSBidW5kbGVGaWxlID0gVXRpbC5nZXRBcnRpZmFjdEZpbGUoYXJ0aWZhY3RLZXksIHByb2ZpbGUpOwotCQkJaWYgKGJ1bmRsZUZpbGUgPT0gbnVsbCkgewotCQkJCUxvZ0hlbHBlci5sb2coVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5hcnRpZmFjdF9maWxlX25vdF9mb3VuZCwgYXJ0aWZhY3RLZXkudG9TdHJpbmcoKSkpKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBNZXRhZGF0YUdlbmVyYXRvclV0aWxzLmNyZWF0ZUJ1bmRsZUlVKGFydGlmYWN0S2V5LCBidW5kbGVGaWxlKTsKLQkJfQotCi0JCS8vIHNob3VsZCBub3Qgb2NjdXIKLQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy51bmV4cGVjdGVkX3ByZXBhcmVpdV9lcnJvcik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGxvYWRNYW5pcHVsYXRvcihNYW5pcHVsYXRvciBtYW5pcHVsYXRvcikgewotCQl0cnkgewotCQkJbWFuaXB1bGF0b3IubG9hZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTWVzc2FnZXMuZXJyb3JfbG9hZGluZ19tYW5pcHVsYXRvcik7Ci0JCX0gY2F0Y2ggKEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihNZXNzYWdlcy5lcnJvcl9sb2FkaW5nX21hbmlwdWxhdG9yKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTWVzc2FnZXMuZXJyb3JfbG9hZGluZ19tYW5pcHVsYXRvcik7Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvTGF6eU1hbmlwdWxhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9MYXp5TWFuaXB1bGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2MmE0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9MYXp5TWFuaXB1bGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi1wdWJsaWMgY2xhc3MgTGF6eU1hbmlwdWxhdG9yIGltcGxlbWVudHMgTWFuaXB1bGF0b3IgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEZJTFRFUl9PQkpFQ1RDTEFTUyA9ICIoIiArIENvbnN0YW50cy5PQkpFQ1RDTEFTUyArICc9JyArIEZyYW1ld29ya0FkbWluLmNsYXNzLmdldE5hbWUoKSArICcpJzsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBmaWx0ZXJGd05hbWUgPSAiKCIgKyBGcmFtZXdvcmtBZG1pbi5TRVJWSUNFX1BST1BfS0VZX0ZXX05BTUUgKyAiPUVxdWlub3gpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGZpbHRlckxhdW5jaGVyTmFtZSA9ICIoIiArIEZyYW1ld29ya0FkbWluLlNFUlZJQ0VfUFJPUF9LRVlfTEFVTkNIRVJfTkFNRSArICI9RWNsaXBzZS5leGUpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGZpbHRlckZ3QWRtaW4gPSAiKCYiICsgRklMVEVSX09CSkVDVENMQVNTICsgZmlsdGVyRndOYW1lICsgZmlsdGVyTGF1bmNoZXJOYW1lICsgJyknOyAvLyROT04tTkxTLTEkOwotCi0JcHJpdmF0ZSBNYW5pcHVsYXRvciBtYW5pcHVsYXRvcjsKLQlwcml2YXRlIGZpbmFsIElQcm9maWxlIHByb2ZpbGU7Ci0KLQlwdWJsaWMgTGF6eU1hbmlwdWxhdG9yKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJdGhpcy5wcm9maWxlID0gcHJvZmlsZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9hZERlbGVnYXRlKCkgewotCQlpZiAobWFuaXB1bGF0b3IgIT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQltYW5pcHVsYXRvciA9IGdldEZyYW1ld29ya01hbmlwdWxhdG9yKCk7Ci0JCWlmIChtYW5pcHVsYXRvciA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5mYWlsZWRfYWNxdWlyZV9mcmFtZXdvcmtfbWFuaXB1bGF0b3IpOwotCi0JCUxhdW5jaGVyRGF0YSBsYXVuY2hlckRhdGEgPSBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKTsKLQkJbGF1bmNoZXJEYXRhLnNldEZ3Q29uZmlnTG9jYXRpb24oVXRpbC5nZXRDb25maWd1cmF0aW9uRm9sZGVyKHByb2ZpbGUpKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyKFV0aWwuZ2V0TGF1bmNoZXJQYXRoKHByb2ZpbGUpKTsKLQkJbGF1bmNoZXJEYXRhLnNldExhdW5jaGVyQ29uZmlnTG9jYXRpb24oVXRpbC5nZXRMYXVuY2hlckNvbmZpZ0xvY2F0aW9uKHByb2ZpbGUpKTsKLQotCQl0cnkgewotCQkJbWFuaXB1bGF0b3IubG9hZCgpOwotCQl9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotCQkJLy9pZiBmd0phciBpcyBub3QgaW5jbHVkZWQsIHRoaXMgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLiBCdXQgaWdub3JlIGl0LiAKLQkJCUxvZ0hlbHBlci5sb2coVXRpbC5jcmVhdGVFcnJvcihNZXNzYWdlcy5lcnJvcl9sb2FkaW5nX21hbmlwdWxhdG9yLCBlKSk7Ci0JCX0gY2F0Y2ggKEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPOiBjb25zaWRlciB0aHJvd2luZyBhbiBleGNlcHRpb24KLQkJCUxvZ0hlbHBlci5sb2coVXRpbC5jcmVhdGVFcnJvcihNZXNzYWdlcy5lcnJvcl9sb2FkaW5nX21hbmlwdWxhdG9yLCBlKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRPRE86IGNvbnNpZGVyIHRocm93aW5nIGFuIGV4Y2VwdGlvbgotCQkJTG9nSGVscGVyLmxvZyhVdGlsLmNyZWF0ZUVycm9yKE1lc3NhZ2VzLmVycm9yX2xvYWRpbmdfbWFuaXB1bGF0b3IsIGUpKTsKLQkJfQotCQkvL1RPRE8gVGhlc2UgdmFsdWVzIHNob3VsZCBiZSBpbnNlcnRlZCBieSBhIGNvbmZpZ3VyYXRpb24gdW5pdCAoYnVnIDIwNDEyNCkKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnNldEZ3RGVwZW5kZW50UHJvcCgiZWNsaXBzZS5wMi5wcm9maWxlIiwgcHJvZmlsZS5nZXRQcm9maWxlSWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnNldEZ3RGVwZW5kZW50UHJvcCgiZWNsaXBzZS5wMi5kYXRhLmFyZWEiLCBVdGlsLmNvbXB1dGVSZWxhdGl2ZUFnZW50TG9jYXRpb24ocHJvZmlsZSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBGcmFtZXdvcmtBZG1pbiBnZXRGcmFtZXdvcmtBZG1pbigpIHsKLQkJU2VydmljZVRyYWNrZXIgZndBZG1pblRyYWNrZXIgPSBudWxsOwotCQl0cnkgewotCQkJRmlsdGVyIGZpbHRlciA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuY3JlYXRlRmlsdGVyKGZpbHRlckZ3QWRtaW4pOwotCQkJZndBZG1pblRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgZmlsdGVyLCBudWxsKTsKLQkJCWZ3QWRtaW5UcmFja2VyLm9wZW4oKTsKLQkJCUZyYW1ld29ya0FkbWluIGZ3QWRtaW4gPSAoRnJhbWV3b3JrQWRtaW4pIGZ3QWRtaW5UcmFja2VyLmdldFNlcnZpY2UoKTsKLQkJCXJldHVybiBmd0FkbWluOwotCQl9IGNhdGNoIChJbnZhbGlkU3ludGF4RXhjZXB0aW9uIGUpIHsKLQkJCS8vQ2FuJ3QgaGFwcGVuIHdlIGFyZSB3cml0aW5nIHRoZSBmaWx0ZXIgb3Vyc2VsdmVzCi0JCQlyZXR1cm4gbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChmd0FkbWluVHJhY2tlciAhPSBudWxsKQotCQkJCWZ3QWRtaW5UcmFja2VyLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1hbmlwdWxhdG9yIGdldEZyYW1ld29ya01hbmlwdWxhdG9yKCkgewotCQlGcmFtZXdvcmtBZG1pbiBmd0FkbWluID0gZ2V0RnJhbWV3b3JrQWRtaW4oKTsKLQkJaWYgKGZ3QWRtaW4gIT0gbnVsbCkKLQkJCXJldHVybiBmd0FkbWluLmdldE1hbmlwdWxhdG9yKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoYm9vbGVhbiBiYWNrdXApIHRocm93cyBJT0V4Y2VwdGlvbiwgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJaWYgKG1hbmlwdWxhdG9yICE9IG51bGwpCi0JCQltYW5pcHVsYXRvci5zYXZlKGJhY2t1cCk7Ci0JfQotCi0JLy8gREVMRUdBVEUgTUVUSE9EUwotCi0JcHVibGljIEJ1bmRsZXNTdGF0ZSBnZXRCdW5kbGVzU3RhdGUoKSB0aHJvd3MgRnJhbWV3b3JrQWRtaW5SdW50aW1lRXhjZXB0aW9uIHsKLQkJbG9hZERlbGVnYXRlKCk7Ci0JCXJldHVybiBtYW5pcHVsYXRvci5nZXRCdW5kbGVzU3RhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ29uZmlnRGF0YSBnZXRDb25maWdEYXRhKCkgdGhyb3dzIEZyYW1ld29ya0FkbWluUnVudGltZUV4Y2VwdGlvbiB7Ci0JCWxvYWREZWxlZ2F0ZSgpOwotCQlyZXR1cm4gbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpOwotCX0KLQotCXB1YmxpYyBCdW5kbGVJbmZvW10gZ2V0RXhwZWN0ZWRTdGF0ZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQlsb2FkRGVsZWdhdGUoKTsKLQkJcmV0dXJuIG1hbmlwdWxhdG9yLmdldEV4cGVjdGVkU3RhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgTGF1bmNoZXJEYXRhIGdldExhdW5jaGVyRGF0YSgpIHRocm93cyBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQlsb2FkRGVsZWdhdGUoKTsKLQkJcmV0dXJuIG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpOwotCX0KLQotCXB1YmxpYyBsb25nIGdldFRpbWVTdGFtcCgpIHsKLQkJbG9hZERlbGVnYXRlKCk7Ci0JCXJldHVybiBtYW5pcHVsYXRvci5nZXRUaW1lU3RhbXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlsb2FkRGVsZWdhdGUoKTsKLQkJbWFuaXB1bGF0b3IuaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uLCBGcmFtZXdvcmtBZG1pblJ1bnRpbWVFeGNlcHRpb24gewotCQlsb2FkRGVsZWdhdGUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb25maWdEYXRhKENvbmZpZ0RhdGEgY29uZmlnRGF0YSkgewotCQlsb2FkRGVsZWdhdGUoKTsKLQkJbWFuaXB1bGF0b3Iuc2V0Q29uZmlnRGF0YShjb25maWdEYXRhKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXVuY2hlckRhdGEoTGF1bmNoZXJEYXRhIGxhdW5jaGVyRGF0YSkgewotCQlsb2FkRGVsZWdhdGUoKTsKLQkJbWFuaXB1bGF0b3Iuc2V0TGF1bmNoZXJEYXRhKGxhdW5jaGVyRGF0YSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvTWFya1NldFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9NYXJrU2V0UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyMDg3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9NYXJrU2V0UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5nYXJiYWdlY29sbGVjdG9yLklNYXJrU2V0UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5nYXJiYWdlY29sbGVjdG9yLk1hcmtTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5Lkluc3RhbGxhYmxlVW5pdFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIElNYXJrU2V0UHJvdmlkZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBFY2xpcHNlVG91Y2hQb2ludC4KLSAqLwotcHVibGljIGNsYXNzIE1hcmtTZXRQcm92aWRlciBpbXBsZW1lbnRzIElNYXJrU2V0UHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9DTEFTU0lGSUVSX09TR0lfQlVORExFID0gIm9zZ2kuYnVuZGxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9DTEFTU0lGSUVSX0ZFQVRVUkUgPSAib3JnLmVjbGlwc2UudXBkYXRlLmZlYXR1cmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIENvbGxlY3Rpb24gYXJ0aWZhY3RLZXlMaXN0ID0gbnVsbDsKLQotCXB1YmxpYyBNYXJrU2V0W10gZ2V0TWFya1NldHMoSVByb2ZpbGUgaW5Qcm9maWxlKSB7Ci0JCWFydGlmYWN0S2V5TGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeVRvR0MgPSBVdGlsLmdldEJ1bmRsZVBvb2xSZXBvc2l0b3J5KGluUHJvZmlsZSk7Ci0JCWlmIChyZXBvc2l0b3J5VG9HQyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBNYXJrU2V0WzBdOwotCQlhZGRBcnRpZmFjdEtleXMoaW5Qcm9maWxlKTsKLQkJSVByb2ZpbGUgY3VycmVudFByb2ZpbGUgPSBnZXRDdXJyZW50UHJvZmlsZSgpOwotCQlpZiAoY3VycmVudFByb2ZpbGUgIT0gbnVsbCAmJiBpblByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkuZXF1YWxzKGN1cnJlbnRQcm9maWxlLmdldFByb2ZpbGVJZCgpKSkgewotCQkJYWRkUnVubmluZ0J1bmRsZXMocmVwb3NpdG9yeVRvR0MpOwotCQkJYWRkUnVubmluZ0ZlYXR1cmVzKGluUHJvZmlsZSwgcmVwb3NpdG9yeVRvR0MpOwotCQl9Ci0JCXJldHVybiBuZXcgTWFya1NldFtdIHtuZXcgTWFya1NldCgoSUFydGlmYWN0S2V5W10pIGFydGlmYWN0S2V5TGlzdC50b0FycmF5KG5ldyBJQXJ0aWZhY3RLZXlbMF0pLCByZXBvc2l0b3J5VG9HQyl9OwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRSdW5uaW5nRmVhdHVyZXMoSVByb2ZpbGUgcHJvZmlsZSwgSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5VG9HQykgewotCQl0cnkgewotCQkJTGlzdCBhbGxGZWF0dXJlcyA9IGdldEFsbEZlYXR1cmVzKENvbmZpZ3VyYXRpb24ubG9hZChuZXcgRmlsZShVdGlsLmdldENvbmZpZ3VyYXRpb25Gb2xkZXIocHJvZmlsZSksICJvcmcuZWNsaXBzZS51cGRhdGUvcGxhdGZvcm0ueG1sIiksIG51bGwpKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGFsbEZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlGZWF0dXJlIGYgPSAoRmVhdHVyZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCUlBcnRpZmFjdEtleSBtYXRjaCA9IHNlYXJjaEFydGlmYWN0KGYuZ2V0SWQoKSwgbmV3IFZlcnNpb24oZi5nZXRWZXJzaW9uKCkpLCBBUlRJRkFDVF9DTEFTU0lGSUVSX0ZFQVRVUkUsIHJlcG9zaXRvcnlUb0dDKTsKLQkJCQlpZiAobWF0Y2ggIT0gbnVsbCkKLQkJCQkJYXJ0aWZhY3RLZXlMaXN0LmFkZChtYXRjaCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvL0lnbm9yZSB0aGUgZXhjZXB0aW9uCi0JCX0KLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0QWxsRmVhdHVyZXMoQ29uZmlndXJhdGlvbiBjZmcpIHsKLQkJaWYgKGNmZyA9PSBudWxsKQotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCUxpc3Qgc2l0ZXMgPSBjZmcuZ2V0U2l0ZXMoKTsKLQkJQXJyYXlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNpdGVzLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCVNpdGUgb2JqZWN0ID0gKFNpdGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCUZlYXR1cmVbXSBmZWF0dXJlcyA9IG9iamVjdC5nZXRGZWF0dXJlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJCXJlc3VsdC5hZGQoZmVhdHVyZXNbaV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvZmlsZSBnZXRDdXJyZW50UHJvZmlsZSgpIHsKLQkJU2VydmljZVJlZmVyZW5jZSBzciA9IEFjdGl2YXRvci5nZXRDb250ZXh0KCkuZ2V0U2VydmljZVJlZmVyZW5jZShJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChzciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlQcm9maWxlUmVnaXN0cnkgcHIgPSAoSVByb2ZpbGVSZWdpc3RyeSkgQWN0aXZhdG9yLmdldENvbnRleHQoKS5nZXRTZXJ2aWNlKHNyKTsKLQkJaWYgKHByID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQWN0aXZhdG9yLmdldENvbnRleHQoKS51bmdldFNlcnZpY2Uoc3IpOwotCQlyZXR1cm4gcHIuZ2V0UHJvZmlsZShJUHJvZmlsZVJlZ2lzdHJ5LlNFTEYpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBcnRpZmFjdEtleXMoSVByb2ZpbGUgYVByb2ZpbGUpIHsKLQkJSXRlcmF0b3IgaW5zdGFsbGFibGVVbml0cyA9IGFQcm9maWxlLnF1ZXJ5KEluc3RhbGxhYmxlVW5pdFF1ZXJ5LkFOWSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaW5zdGFsbGFibGVVbml0cy5oYXNOZXh0KCkpIHsKLQkJCUlBcnRpZmFjdEtleVtdIGtleXMgPSAoKElJbnN0YWxsYWJsZVVuaXQpIGluc3RhbGxhYmxlVW5pdHMubmV4dCgpKS5nZXRBcnRpZmFjdHMoKTsKLQkJCWlmIChrZXlzID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcnRpZmFjdEtleUxpc3QuYWRkKGtleXNbaV0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeShJUHJvZmlsZSBhUHJvZmlsZSkgewotCQlyZXR1cm4gVXRpbC5nZXRCdW5kbGVQb29sUmVwb3NpdG9yeShhUHJvZmlsZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFJ1bm5pbmdCdW5kbGVzKElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbykgewotCQlhcnRpZmFjdEtleUxpc3QuYWRkQWxsKGZpbmRDb3JyZXNwb25kaW5BcnRpZmFjdHMobmV3IFdoYXRJc1J1bm5pbmcoKS5nZXRCdW5kbGVzQmVpbmdSdW4oKSwgcmVwbykpOwotCX0KLQotCXByaXZhdGUgSUFydGlmYWN0S2V5IHNlYXJjaEFydGlmYWN0KFN0cmluZyBzZWFyY2hlZElkLCBWZXJzaW9uIHNlYXJjaGVkVmVyc2lvbiwgU3RyaW5nIGNsYXNzaWZpZXIsIElBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbykgewotCQkvL1RoaXMgaXMgc29tZXdoYXQgY2hlYXRpbmcgc2luY2Ugbm9ybWFsbHkgd2Ugc2hvdWxkIGdldCB0aGUgYXJ0aWZhY3Qga2V5IGZyb20gdGhlIElVcyB0aGF0IHdlcmUgcmVwcmVzZW50aW5nIHRoZSBydW5uaW5nIHN5c3RlbSAoZS5nLiB3ZSBjb3VsZCBnZXQgdGhhdCBpbmZvIGZyb20gdGhlIHJvbGxiYWNrIHJlcG8pCi0JCUlBcnRpZmFjdEtleVtdIGtleXMgPSByZXBvLmdldEFydGlmYWN0S2V5cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChrZXlzW2ldLmdldENsYXNzaWZpZXIoKS5lcXVhbHMoY2xhc3NpZmllcikpIHsKLQkJCQlTdHJpbmcgaWQgPSBrZXlzW2ldLmdldElkKCk7Ci0JCQkJVmVyc2lvbiB2ID0ga2V5c1tpXS5nZXRWZXJzaW9uKCk7Ci0JCQkJaWYgKGlkICE9IG51bGwgJiYgaWQuZXF1YWxzKHNlYXJjaGVkSWQpICYmIHYgIT0gbnVsbCAmJiB2LmVxdWFscyhzZWFyY2hlZFZlcnNpb24pKQotCQkJCQlyZXR1cm4ga2V5c1tpXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvL0ZpbmQgZm9yIGVhY2ggYnVuZGxlIGluZm8gYSBjb3JyZXNwb25kaW5nIGFydGlmYWN0IGluIHJlcG8gCi0JcHJpdmF0ZSBBcnJheUxpc3QgZmluZENvcnJlc3BvbmRpbkFydGlmYWN0cyhCdW5kbGVJbmZvW10gYmlzLCBJQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG8pIHsKLQkJQXJyYXlMaXN0IHRvUmV0YWluID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJpcy5sZW5ndGg7IGkrKykgewotCQkJSUFydGlmYWN0S2V5IG1hdGNoID0gc2VhcmNoQXJ0aWZhY3QoYmlzW2ldLmdldFN5bWJvbGljTmFtZSgpLCBuZXcgVmVyc2lvbihiaXNbaV0uZ2V0VmVyc2lvbigpKSwgQVJUSUZBQ1RfQ0xBU1NJRklFUl9PU0dJX0JVTkRMRSwgcmVwbyk7Ci0JCQlpZiAobWF0Y2ggIT0gbnVsbCkKLQkJCQl0b1JldGFpbi5hZGQobWF0Y2gpOwotCQl9Ci0JCXJldHVybiB0b1JldGFpbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9NZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdjYWYzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfbG9hZGluZ19tYW5pcHVsYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCdW5kbGVQb29sOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZhaWxlZF9hY3F1aXJlX2ZyYW1ld29ya19tYW5pcHVsYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmYWlsZWRfcHJlcGFyZUlVOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGZlYXR1cmVfbm90X2ZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX3NhdmluZ19tYW5pcHVsYXRvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9zYXZpbmdfcGxhdGZvcm1fY29uZmlndXJhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9zYXZpbmdfc291cmNlX2J1bmRsZXNfbGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9jb25zdHJ1Y3RpbmdfcGxhdGZvcm1fY29uZmlndXJhdGlvbl91cmw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfcGFyc2luZ19jb25maWd1cmF0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdlbmVyYXRvcl9ub3RfYXZhaWxhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X2ZpbGVfbm90X2ZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGl1X2NvbnRhaW5zX25vX2FyaWZhY3RzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X3JldHJpZXZhbF91bnN1cHBvcnRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBidW5kbGVfcG9vbF9ub3Rfd3JpdGVhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm5vdF9jYWxjdWxhdGVfZXh0ZW5zaW9uX2xvY2F0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhbm5vdF9jcmVhdGVfdXJsX2Zyb21fZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb25maWdfZGlyX25vdF9hYnNvbHV0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJlbnRfZGlyX2ZlYXR1cmVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBsYXRmb3JtX2NvbmZpZ191bmF2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwbGF0Zm9ybWFkbWluX25vdF9yZWdpc3RlcmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb3RvY29sX2hhbmRsZXJfZXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5leHBlY3RlZF9wcmVwYXJlaXVfZXJyb3I7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUgYW5kIGFzc2lnbiB0byBmaWVsZHMgYmVsb3cKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL01ldGFkYXRhR2VuZXJhdG9yVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL01ldGFkYXRhR2VuZXJhdG9yVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVmZTYwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9NZXRhZGF0YUdlbmVyYXRvclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLk1ldGFkYXRhR2VuZXJhdG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgTWV0YWRhdGFHZW5lcmF0b3JVdGlscyB7Ci0KLQlwdWJsaWMgc3RhdGljIElJbnN0YWxsYWJsZVVuaXQgY3JlYXRlQnVuZGxlSVUoSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5LCBGaWxlIGJ1bmRsZUZpbGUpIHsKLQkJQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5IGZhY3RvcnkgPSBpbml0aWFsaXplQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5KEFjdGl2YXRvci5nZXRDb250ZXh0KCkpOwotCQlCdW5kbGVEZXNjcmlwdGlvbiBidW5kbGVEZXNjcmlwdGlvbiA9IGZhY3RvcnkuZ2V0QnVuZGxlRGVzY3JpcHRpb24oYnVuZGxlRmlsZSk7Ci0JCWlmIChidW5kbGVEZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVCdW5kbGVJVShidW5kbGVEZXNjcmlwdGlvbiwgKE1hcCkgYnVuZGxlRGVzY3JpcHRpb24uZ2V0VXNlck9iamVjdCgpLCBidW5kbGVGaWxlLmlzRGlyZWN0b3J5KCksIGFydGlmYWN0S2V5KTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkgaW5pdGlhbGl6ZUJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeShCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLQotCQlTZXJ2aWNlUmVmZXJlbmNlIHJlZmVyZW5jZSA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShQbGF0Zm9ybUFkbWluLmNsYXNzLmdldE5hbWUoKSk7Ci0JCWlmIChyZWZlcmVuY2UgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMucGxhdGZvcm1hZG1pbl9ub3RfcmVnaXN0ZXJlZCk7Ci0JCVBsYXRmb3JtQWRtaW4gcGxhdGZvcm1BZG1pbiA9IChQbGF0Zm9ybUFkbWluKSBjb250ZXh0LmdldFNlcnZpY2UocmVmZXJlbmNlKTsKLQkJaWYgKHBsYXRmb3JtQWRtaW4gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMucGxhdGZvcm1hZG1pbl9ub3RfcmVnaXN0ZXJlZCk7Ci0KLQkJdHJ5IHsKLQkJCVN0YXRlT2JqZWN0RmFjdG9yeSBzdGF0ZU9iamVjdEZhY3RvcnkgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQkJCXJldHVybiBuZXcgQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5KHN0YXRlT2JqZWN0RmFjdG9yeSwgbnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9QbGF0Zm9ybUNvbmZpZ3VyYXRpb25XcmFwcGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9QbGF0Zm9ybUNvbmZpZ3VyYXRpb25XcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NWM3ZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvUGxhdGZvcm1Db25maWd1cmF0aW9uV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uQnVuZGxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLk1hbmlwdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCQotICogCVRoaXMgY2xhc3MgcHJvdmlkZXMgYSB3cmFwcGVyIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHBsYXRmb3JtLnhtbC4KLSAqIAotICogCU9ubHkgYSBtaW5pbWFsIHNldCBvZiBvcGVyYXRpb25zIGlzIGV4cG9zZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybUNvbmZpZ3VyYXRpb25XcmFwcGVyIHsKLQotCXByaXZhdGUgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbnVsbDsKLQlwcml2YXRlIFNpdGUgcG9vbFNpdGUgPSBudWxsOwotCXByaXZhdGUgRmlsZSBjb25maWdGaWxlOwotCXByaXZhdGUgVVJMIHBvb2xVUkw7Ci0JcHJpdmF0ZSBNYW5pcHVsYXRvciBtYW5pcHVsYXRvcjsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBGRUFUVVJFUyA9ICJmZWF0dXJlcy8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBVUkwgZ2V0T1NHaUluc3RhbGxBcmVhKE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yKSB7Ci0JCWZpbmFsIFN0cmluZyBPU0dJID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0JCUJ1bmRsZUluZm9bXSBiaXMgPSBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0QnVuZGxlcygpOwotCQlTdHJpbmcgc2VhcmNoRm9yID0gIm9yZy5lY2xpcHNlLmVxdWlub3gubGF1bmNoZXIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYmlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYmlzW2ldLmdldFN5bWJvbGljTmFtZSgpLmVxdWFscyhzZWFyY2hGb3IpKSB7Ci0JCQkJaWYgKGJpc1tpXS5nZXRMb2NhdGlvbigpICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChiaXNbaV0uZ2V0TG9jYXRpb24oKS5zdGFydHNXaXRoKCJmaWxlOiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuIGZyb21PU0dpSmFyVG9PU0dpSW5zdGFsbEFyZWEoYmlzW2ldLmdldExvY2F0aW9uKCkuc3Vic3RyaW5nKDUpKS50b1VSTCgpOwotCQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkJLy9kbyBub3RoaW5nCi0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHNlYXJjaEZvci5lcXVhbHMoT1NHSSkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXNlYXJjaEZvciA9IE9TR0k7Ci0JCQkJaSA9IC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEZpbGUgZnJvbU9TR2lKYXJUb09TR2lJbnN0YWxsQXJlYShTdHJpbmcgcGF0aCkgewotCQlJUGF0aCBwYXJlbnRGb2xkZXIgPSBuZXcgUGF0aChwYXRoKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCWlmIChwYXJlbnRGb2xkZXIubGFzdFNlZ21lbnQoKS5lcXVhbHMoInBsdWdpbnMiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHBhcmVudEZvbGRlci5yZW1vdmVMYXN0U2VnbWVudHMoMSkudG9GaWxlKCk7Ci0JCXJldHVybiBwYXJlbnRGb2xkZXIudG9GaWxlKCk7Ci0JfQotCi0JcHVibGljIFBsYXRmb3JtQ29uZmlndXJhdGlvbldyYXBwZXIoRmlsZSBjb25maWdEaXIsIFVSTCBmZWF0dXJlUG9vbCwgTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IpIHsKLQkJdGhpcy5jb25maWd1cmF0aW9uID0gbnVsbDsKLQkJdGhpcy5jb25maWdGaWxlID0gbmV3IEZpbGUoY29uZmlnRGlyLCAiL29yZy5lY2xpcHNlLnVwZGF0ZS9wbGF0Zm9ybS54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLnBvb2xVUkwgPSBmZWF0dXJlUG9vbDsKLQkJdGhpcy5tYW5pcHVsYXRvciA9IG1hbmlwdWxhdG9yOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkRGVsZWdhdGUoKSB7Ci0JCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdHJ5IHsKLQkJCWlmIChjb25maWdGaWxlLmV4aXN0cygpKSB7Ci0JCQkJY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb24ubG9hZChjb25maWdGaWxlLCBnZXRPU0dpSW5zdGFsbEFyZWEobWFuaXB1bGF0b3IpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJY29uZmlndXJhdGlvbiA9IG5ldyBDb25maWd1cmF0aW9uKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBwZSkgewotCQkJLy8gVE9ETzogTWFrZSB0aGlzIGEgcmVhbCBtZXNzYWdlCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmVycm9yX3BhcnNpbmdfY29uZmlndXJhdGlvbik7Ci0JCX0KLQkJaWYgKHBvb2xVUkwgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uIE5vIGJ1bmRsZSBwb29sIGRlZmluZWQuIik7IC8vJE5PTi1OTFMtMSQKLQotCQlwb29sU2l0ZSA9IGdldFNpdGUocG9vbFVSTCk7Ci0JCWlmIChwb29sU2l0ZSA9PSBudWxsKSB7Ci0JCQlwb29sU2l0ZSA9IGNyZWF0ZVNpdGUocG9vbFVSTCwgZ2V0RGVmYXVsdFBvbGljeSgpKTsKLQkJCWNvbmZpZ3VyYXRpb24uYWRkKHBvb2xTaXRlKTsKLQkJfQotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBkZWZhdWx0IHBvbGljeSB0byB1c2Ugd2hlbiBjcmVhdGluZyBhIG5ldyBzaXRlLiBJZiB0aGVyZSBhcmUKLQkgKiBhbnkgc2l0ZXMgd2l0aCB0aGUgTUFOQUdFRC1PTkxZIHBvbGljeSwgdGhlbiB0aGF0IGlzIHRoZSBkZWZhdWx0LgotCSAqIE90aGVyd2lzZSB0aGUgZGVmYXVsdCBpcyBVU0VSLUVYQ0xVREUuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdFBvbGljeSgpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29uZmlndXJhdGlvbi5nZXRTaXRlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJU2l0ZSBzaXRlID0gKFNpdGUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKFNpdGUuUE9MSUNZX01BTkFHRURfT05MWS5lcXVhbHMoc2l0ZS5nZXRQb2xpY3koKSkpCi0JCQkJcmV0dXJuIFNpdGUuUE9MSUNZX01BTkFHRURfT05MWTsKLQkJfQotCQlyZXR1cm4gU2l0ZS5QT0xJQ1lfVVNFUl9FWENMVURFOwotCX0KLQotCS8qCi0JICogQ3JlYXRlIGFuZCByZXR1cm4gYSBzaXRlIG9iamVjdCBiYXNlZCBvbiB0aGUgZ2l2ZW4gbG9jYXRpb24uCi0JICovCi0JcHJpdmF0ZSBTaXRlIGNyZWF0ZVNpdGUoVVJMIGxvY2F0aW9uLCBTdHJpbmcgcG9saWN5KSB7Ci0JCVNpdGUgcmVzdWx0ID0gbmV3IFNpdGUoKTsKLQkJcmVzdWx0LnNldFVybChsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpKTsKLQkJcmVzdWx0LnNldFBvbGljeShwb2xpY3kpOwotCQlyZXN1bHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIExvb2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHJldHVybiB0aGUgc2l0ZSBvYmplY3Qgd2hvc2UgbG9jYXRpb24gbWF0Y2hlcwotCSAqIHRoZSBnaXZlbiBVUkwuIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vIG1hdGNoLgotCSAqLwotCXByaXZhdGUgU2l0ZSBnZXRTaXRlKFVSTCB1cmwpIHsKLQkJTGlzdCBzaXRlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0U2l0ZXMoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gc2l0ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlTaXRlIG5leHRTaXRlID0gKFNpdGUpIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIG5leHRVUkwgPSBuZXh0U2l0ZS5nZXRVcmwoKTsKLQkJCWlmIChuZXcgUGF0aChuZXh0VVJMKS5lcXVhbHMobmV3IFBhdGgodXJsLnRvRXh0ZXJuYWxGb3JtKCkpKSkgewotCQkJCXJldHVybiBuZXh0U2l0ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIExvb2sgaW4gdGhlIGNvbmZpZ3VyYXRpb24gYW5kIHJldHVybiB0aGUgc2l0ZSB3aGljaCBjb250YWlucyB0aGUgZmVhdHVyZQotCSAqIHdpdGggdGhlIGdpdmVuIGlkZW50aWZpZXIgYW5kIHZlcnNpb24uIFJldHVybiBudWxsIGlmIHRoZXJlIGlzIG5vbmUuCi0JICovCi0JcHJpdmF0ZSBTaXRlIGdldFNpdGUoU3RyaW5nIGlkLCBTdHJpbmcgdmVyc2lvbikgewotCQlMaXN0IHNpdGVzID0gY29uZmlndXJhdGlvbi5nZXRTaXRlcygpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBzaXRlcy5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCVNpdGUgc2l0ZSA9IChTaXRlKSBpdGVyLm5leHQoKTsKLQkJCUZlYXR1cmVbXSBmZWF0dXJlcyA9IHNpdGUuZ2V0RmVhdHVyZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaWQuZXF1YWxzKGZlYXR1cmVzW2ldLmdldElkKCkpICYmIHZlcnNpb24uZXF1YWxzKGZlYXR1cmVzW2ldLmdldFZlcnNpb24oKSkpCi0JCQkJCXJldHVybiBzaXRlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb24jY3JlYXRlRmVhdHVyZUVudHJ5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmcsIGphdmEubmV0LlVSTFtdKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGFkZEZlYXR1cmVFbnRyeShGaWxlIGZpbGUsIFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBwbHVnaW5JZGVudGlmaWVyLCBTdHJpbmcgcGx1Z2luVmVyc2lvbiwgYm9vbGVhbiBwcmltYXJ5LCBTdHJpbmcgYXBwbGljYXRpb24sIFVSTFtdIHJvb3QpIHsKLQkJbG9hZERlbGVnYXRlKCk7Ci0JCWlmIChjb25maWd1cmF0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEFjdGl2YXRvci5JRCwgTWVzc2FnZXMucGxhdGZvcm1fY29uZmlnX3VuYXZhaWxhYmxlLCBudWxsKTsKLQotCQlVUkwgZmlsZVVSTCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlGaWxlIGZlYXR1cmVEaXIgPSBmaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmIChmZWF0dXJlRGlyID09IG51bGwgfHwgIWZlYXR1cmVEaXIuZ2V0TmFtZSgpLmVxdWFscygiZmVhdHVyZXMiKSkgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMucGFyZW50X2Rpcl9mZWF0dXJlcywgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpOwotCQkJRmlsZSBsb2NhdGlvbkRpciA9IGZlYXR1cmVEaXIuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKGxvY2F0aW9uRGlyID09IG51bGwpCi0JCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5jYW5ub3RfY2FsY3VsYXRlX2V4dGVuc2lvbl9sb2NhdGlvbiwgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSksIG51bGwpOwotCi0JCQlmaWxlVVJMID0gbG9jYXRpb25EaXIudG9VUkwoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTkxTLmJpbmQoTWVzc2FnZXMuY2Fubm90X2NyZWF0ZV91cmxfZnJvbV9maWxlLCBmaWxlLmdldEFic29sdXRlUGF0aCgpKSwgZSk7Ci0JCX0KLQkJU2l0ZSBzaXRlID0gZ2V0U2l0ZShmaWxlVVJMKTsKLQkJaWYgKHNpdGUgPT0gbnVsbCkgewotCQkJc2l0ZSA9IGNyZWF0ZVNpdGUoZmlsZVVSTCwgZ2V0RGVmYXVsdFBvbGljeSgpKTsKLQkJCWNvbmZpZ3VyYXRpb24uYWRkKHNpdGUpOwotCQl9IGVsc2UgewotCQkJLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBmZWF0dXJlIGFscmVhZHkgZXhpc3RzIGluIHRoaXMgc2l0ZQotCQkJaWYgKHNpdGUuZ2V0RmVhdHVyZShpZCwgdmVyc2lvbikgIT0gbnVsbCkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCQlGZWF0dXJlIGFkZGVkRmVhdHVyZSA9IG5ldyBGZWF0dXJlKHNpdGUpOwotCQlhZGRlZEZlYXR1cmUuc2V0SWQoaWQpOwotCQlhZGRlZEZlYXR1cmUuc2V0VmVyc2lvbih2ZXJzaW9uKTsKLQkJYWRkZWRGZWF0dXJlLnNldFVybChtYWtlRmVhdHVyZVVSTChpZCwgdmVyc2lvbikpOwotCQlzaXRlLmFkZEZlYXR1cmUoYWRkZWRGZWF0dXJlKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuSVBsYXRmb3JtQ29uZmlndXJhdGlvbiNmaW5kQ29uZmlndXJlZEZlYXR1cmVFbnRyeShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJlbW92ZUZlYXR1cmVFbnRyeShTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCWxvYWREZWxlZ2F0ZSgpOwotCQlpZiAoY29uZmlndXJhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBBY3RpdmF0b3IuSUQsIE1lc3NhZ2VzLnBsYXRmb3JtX2NvbmZpZ191bmF2YWlsYWJsZSwgbnVsbCk7Ci0KLQkJU2l0ZSBzaXRlID0gZ2V0U2l0ZShpZCwgdmVyc2lvbik7Ci0JCWlmIChzaXRlID09IG51bGwpCi0JCQlzaXRlID0gcG9vbFNpdGU7Ci0JCXNpdGUucmVtb3ZlRmVhdHVyZShtYWtlRmVhdHVyZVVSTChpZCwgdmVyc2lvbikpOwotCQkvLyBpZiB3ZSB3ZXJlbid0IGFibGUgdG8gcmVtb3ZlIHRoZSBmZWF0dXJlIGZyb20gdGhlIHNpdGUgYmVjYXVzZSBpdAotCQkvLyBkaWRuJ3QgZXhpc3QsIHRoZW4gc29tZW9uZSBhbHJlYWR5IGRpZCBvdXIgam9iIGZvciB1cyBhbmQgaXQgaXMgb2suCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51cGRhdGUuY29uZmlndXJhdG9yLklQbGF0Zm9ybUNvbmZpZ3VyYXRpb24jc2F2ZSgpCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlpZiAoY29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQljb25maWdGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQkJCWNvbmZpZ3VyYXRpb24uc2F2ZShjb25maWdGaWxlLCBnZXRPU0dpSW5zdGFsbEFyZWEobWFuaXB1bGF0b3IpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlRmVhdHVyZVVSTChTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiBGRUFUVVJFUyArIGlkICsgIl8iICsgdmVyc2lvbiArICIvIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkOwotCX0KLQotCS8vCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvU291cmNlTWFuaXB1bGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL1NvdXJjZU1hbmlwdWxhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZGQ3M2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvU291cmNlTWFuaXB1bGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uQnVuZGxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci5TaW1wbGVDb25maWd1cmF0b3JNYW5pcHVsYXRvckltcGw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLlZlcnNpb247Ci0KLS8vVGhpcyBjbGFzcyBkZWFscyB3aXRoIHNvdXJjZSBidW5kbGVzIGFuZCBob3cgdGhlaXIgYWRkaXRpb24gdG8gdGhlIHNvdXJjZXJjZS5pbmZvCi1wdWJsaWMgY2xhc3MgU291cmNlTWFuaXB1bGF0b3IgewotCXByaXZhdGUgTGlzdCBzb3VyY2VCdW5kbGVzOwotCXByaXZhdGUgSVByb2ZpbGUgcHJvZmlsZTsKLQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBTb3VyY2VNYW5pcHVsYXRvcihJUHJvZmlsZSBwcm9maWxlKSB7Ci0JCXRoaXMucHJvZmlsZSA9IHByb2ZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQnVuZGxlKEZpbGUgYnVuZGxlRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHNvdXJjZUJ1bmRsZXMgPT0gbnVsbCkKLQkJCWxvYWQoKTsKLQkJc291cmNlQnVuZGxlcy5hZGQobmV3IEJ1bmRsZUluZm8oYnVuZGxlRmlsZS50b1VSTCgpLnRvU3RyaW5nKCkpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRCdW5kbGUoRmlsZSBidW5kbGVGaWxlLCBTdHJpbmcgYnVuZGxlSWQsIFZlcnNpb24gYnVuZGxlVmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHNvdXJjZUJ1bmRsZXMgPT0gbnVsbCkKLQkJCWxvYWQoKTsKLQkJQnVuZGxlSW5mbyBzb3VyY2VJbmZvID0gbmV3IEJ1bmRsZUluZm8oYnVuZGxlRmlsZS50b1VSTCgpLnRvU3RyaW5nKCkpOwotCQlzb3VyY2VJbmZvLnNldFN5bWJvbGljTmFtZShidW5kbGVJZCk7Ci0JCXNvdXJjZUluZm8uc2V0VmVyc2lvbihidW5kbGVWZXJzaW9uLnRvU3RyaW5nKCkpOwotCQlzb3VyY2VCdW5kbGVzLmFkZChzb3VyY2VJbmZvKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVCdW5kbGUoRmlsZSBidW5kbGVGaWxlLCBTdHJpbmcgYnVuZGxlSWQsIFZlcnNpb24gYnVuZGxlVmVyc2lvbikgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoc291cmNlQnVuZGxlcyA9PSBudWxsKQotCQkJbG9hZCgpOwotCi0JCUJ1bmRsZUluZm8gc291cmNlSW5mbyA9IG5ldyBCdW5kbGVJbmZvKCk7Ci0JCWlmIChidW5kbGVGaWxlICE9IG51bGwpCi0JCQlzb3VyY2VJbmZvLnNldExvY2F0aW9uKGJ1bmRsZUZpbGUudG9VUkwoKS50b1N0cmluZygpKTsKLQkJc291cmNlSW5mby5zZXRTeW1ib2xpY05hbWUoYnVuZGxlSWQpOwotCQlzb3VyY2VJbmZvLnNldFZlcnNpb24oYnVuZGxlVmVyc2lvbi50b1N0cmluZygpKTsKLQkJc291cmNlQnVuZGxlcy5yZW1vdmUoc291cmNlSW5mbyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2F2ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChzb3VyY2VCdW5kbGVzICE9IG51bGwpCi0JCQlTaW1wbGVDb25maWd1cmF0b3JNYW5pcHVsYXRvckltcGwuc2F2ZUNvbmZpZ3VyYXRpb24oc291cmNlQnVuZGxlcywgZ2V0RmlsZUxvY2F0aW9uKCksIGdldExhdW5jaGVyTG9jYXRpb24oKSwgZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkKCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoZ2V0RmlsZUxvY2F0aW9uKCkuZXhpc3RzKCkpCi0JCQlzb3VyY2VCdW5kbGVzID0gU2ltcGxlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JJbXBsLnJlYWRDb25maWd1cmF0aW9uKGdldEZpbGVMb2NhdGlvbigpLnRvVVJMKCksIGdldExhdW5jaGVyTG9jYXRpb24oKSk7Ci0JCWVsc2UKLQkJCXNvdXJjZUJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGdldEZpbGVMb2NhdGlvbigpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKFV0aWwuZ2V0Q29uZmlndXJhdGlvbkZvbGRlcihwcm9maWxlKSwgIm9yZy5lY2xpcHNlLmVxdWlub3guc291cmNlL3NvdXJjZS5pbmZvIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIEZpbGUgZ2V0TGF1bmNoZXJMb2NhdGlvbigpIHsKLQkJcmV0dXJuIFV0aWwuZ2V0SW5zdGFsbEZvbGRlcihwcm9maWxlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODkwMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBSZWQgSGF0IEluY29ycG9yYXRlZCAtIGZpeCBmb3IgYnVnIDIyNTE0NQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnMuQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uQnVuZGxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5sb2NhdGlvbi5BZ2VudExvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UuZW52aXJvbm1lbnQuRW52aXJvbm1lbnRJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5NYW5pZmVzdEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5Db25zdGFudHM7Ci0KLXB1YmxpYyBjbGFzcyBVdGlsIHsKLQotCS8qKgotCSAqIFRPRE8gImNhY2hlIiBpcyBwcm9iYWJseSBub3QgdGhlIHJpZ2h0IHRlcm0gZm9yIHRoaXMgbG9jYXRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVQT1NJVE9SWV9UWVBFID0gSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuVFlQRV9TSU1QTEVfUkVQT1NJVE9SWTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfRVhURU5TSU9OUyA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNhY2hlLmV4dGVuc2lvbnMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBJUEUgPSAifCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgQWdlbnRMb2NhdGlvbiBnZXRBZ2VudExvY2F0aW9uKCkgewotCQlyZXR1cm4gKEFnZW50TG9jYXRpb24pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBBZ2VudExvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlciBnZXRBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCkgewotCQlyZXR1cm4gKElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRCdW5kbGVQb29sTG9jYXRpb24oSVByb2ZpbGUgcHJvZmlsZSkgewotCQlTdHJpbmcgcGF0aCA9IHByb2ZpbGUuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9DQUNIRSk7Ci0JCWlmIChwYXRoICE9IG51bGwpCi0JCQl0cnkgewotCQkJCS8vIGNyZWF0ZSBhIGZpbGUgdXJsCi0JCQkJcmV0dXJuIG5ldyBGaWxlKHBhdGgpLnRvVVJMKCk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vIHVuZXhwZWN0ZWQsIFVSTHMgc2hvdWxkIGJlIHByZS1jaGVja2VkCi0JCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgZS5nZXRNZXNzYWdlKCksIGUpKTsKLQkJCX0KLQkJQWdlbnRMb2NhdGlvbiBsb2NhdGlvbiA9IGdldEFnZW50TG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGxvY2F0aW9uLmdldERhdGFBcmVhKEFjdGl2YXRvci5JRCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkgZ2V0QnVuZGxlUG9vbFJlcG9zaXRvcnkoSVByb2ZpbGUgcHJvZmlsZSkgewotCQlVUkwgbG9jYXRpb24gPSBnZXRCdW5kbGVQb29sTG9jYXRpb24ocHJvZmlsZSk7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gKElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KSBtYW5hZ2VyLmxvYWRSZXBvc2l0b3J5KGxvY2F0aW9uLCBudWxsKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vdGhlIHJlcG9zaXRvcnkgZG9lc24ndCBleGlzdCwgc28gZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBuZXcgb25lCi0JCX0KLQkJdHJ5IHsKLQkJCVN0cmluZyByZXBvc2l0b3J5TmFtZSA9IE1lc3NhZ2VzLkJ1bmRsZVBvb2w7Ci0JCQlNYXAgcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwKDEpOwotCQkJcHJvcGVydGllcy5wdXQoSVJlcG9zaXRvcnkuUFJPUF9TWVNURU0sIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJCXJldHVybiAoSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkpIG1hbmFnZXIuY3JlYXRlUmVwb3NpdG9yeShsb2NhdGlvbiwgcmVwb3NpdG9yeU5hbWUsIFJFUE9TSVRPUllfVFlQRSwgcHJvcGVydGllcyk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dIZWxwZXIubG9nKGUpOwotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5idW5kbGVfcG9vbF9ub3Rfd3JpdGVhYmxlLCBsb2NhdGlvbikpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSBnZXRBZ2dyZWdhdGVkQnVuZGxlUmVwb3NpdG9yeShJUHJvZmlsZSBwcm9maWxlKSB7Ci0JCVNldCBidW5kbGVSZXBvc2l0b3JpZXMgPSBuZXcgSGFzaFNldCgpOwotCQlidW5kbGVSZXBvc2l0b3JpZXMuYWRkKFV0aWwuZ2V0QnVuZGxlUG9vbFJlcG9zaXRvcnkocHJvZmlsZSkpOwotCi0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCk7Ci0JCUxpc3QgZXh0ZW5zaW9ucyA9IGdldExpc3RQcm9maWxlUHJvcGVydHkocHJvZmlsZSwgQ0FDSEVfRVhURU5TSU9OUyk7Ci0JCVN0cmluZyBzaGFyZWRDYWNoZSA9IHByb2ZpbGUuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9TSEFSRURfQ0FDSEUpOwotCQlpZiAoc2hhcmVkQ2FjaGUgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlleHRlbnNpb25zLmFkZChuZXcgRmlsZShzaGFyZWRDYWNoZSkudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gdW5leHBlY3RlZCwgVVJMcyBzaG91bGQgYmUgcHJlLWNoZWNrZWQKLQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGV4dGVuc2lvbnMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgZXh0ZW5zaW9uID0gKFN0cmluZykgaXRlcmF0b3IubmV4dCgpOwotCQkJCVVSTCBleHRlbnNpb25VUkwgPSBuZXcgVVJMKGV4dGVuc2lvbik7Ci0JCQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gbWFuYWdlci5sb2FkUmVwb3NpdG9yeShleHRlbnNpb25VUkwsIG51bGwpOwotCQkJCWlmIChyZXBvc2l0b3J5ICE9IG51bGwpCi0JCQkJCWJ1bmRsZVJlcG9zaXRvcmllcy5hZGQocmVwb3NpdG9yeSk7Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCS8vc2tpcCByZXBvc2l0b3JpZXMgdGhhdCBjb3VsZCBub3QgYmUgcmVhZAotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB1bmV4cGVjdGVkLCBVUkxzIHNob3VsZCBiZSBwcmUtY2hlY2tlZAotCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIGUuZ2V0TWVzc2FnZSgpLCBlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBBZ2dyZWdhdGVkQnVuZGxlUmVwb3NpdG9yeShidW5kbGVSZXBvc2l0b3JpZXMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIExpc3QgZ2V0TGlzdFByb2ZpbGVQcm9wZXJ0eShJUHJvZmlsZSBwcm9maWxlLCBTdHJpbmcga2V5KSB7Ci0JCUxpc3QgbGlzdFByb3BlcnR5ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmcgZHJvcGluUmVwb3NpdG9yaWVzID0gcHJvZmlsZS5nZXRQcm9wZXJ0eShrZXkpOwotCQlpZiAoZHJvcGluUmVwb3NpdG9yaWVzICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGRyb3BpblJlcG9zaXRvcmllcywgUElQRSk7Ci0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCWxpc3RQcm9wZXJ0eS5hZGQodG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbGlzdFByb3BlcnR5OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlSW5mbyBjcmVhdGVCdW5kbGVJbmZvKEZpbGUgYnVuZGxlRmlsZSwgU3RyaW5nIG1hbmlmZXN0KSB7Ci0JCUJ1bmRsZUluZm8gYnVuZGxlSW5mbyA9IG5ldyBCdW5kbGVJbmZvKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoYnVuZGxlRmlsZSAhPSBudWxsKQotCQkJCWJ1bmRsZUluZm8uc2V0TG9jYXRpb24oYnVuZGxlRmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy9JZ25vcmUgc2luY2Ugd2UgYXJlIGNyZWF0aW5nIHRoZSBVUkwgZnJvbSB0aGUgZmlsZQotCQl9Ci0KLQkJYnVuZGxlSW5mby5zZXRNYW5pZmVzdChtYW5pZmVzdCk7Ci0JCXRyeSB7Ci0JCQlIZWFkZXJzIGhlYWRlcnMgPSBIZWFkZXJzLnBhcnNlTWFuaWZlc3QobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1hbmlmZXN0LmdldEJ5dGVzKCkpKTsKLQkJCU1hbmlmZXN0RWxlbWVudFtdIGVsZW1lbnQgPSBNYW5pZmVzdEVsZW1lbnQucGFyc2VIZWFkZXIoImJzbiIsIChTdHJpbmcpIGhlYWRlcnMuZ2V0KENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWJ1bmRsZUluZm8uc2V0U3ltYm9saWNOYW1lKGVsZW1lbnRbMF0uZ2V0VmFsdWUoKSk7Ci0KLQkJCVN0cmluZyB2ZXJzaW9uID0gKFN0cmluZykgaGVhZGVycy5nZXQoQ29uc3RhbnRzLkJVTkRMRV9WRVJTSU9OKTsKLQkJCWlmICh2ZXJzaW9uID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlidW5kbGVJbmZvLnNldFZlcnNpb24odmVyc2lvbik7Ci0JCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB1bmV4cGVjdGVkCi0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBlLmdldE1lc3NhZ2UoKSwgZSkpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZUluZm87Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldEFydGlmYWN0RmlsZShJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXksIElQcm9maWxlIHByb2ZpbGUpIHsKLQkJSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkgYWdncmVnYXRlZFZpZXcgPSBnZXRBZ2dyZWdhdGVkQnVuZGxlUmVwb3NpdG9yeShwcm9maWxlKTsKLQkJRmlsZSBidW5kbGVKYXIgPSBhZ2dyZWdhdGVkVmlldy5nZXRBcnRpZmFjdEZpbGUoYXJ0aWZhY3RLZXkpOwotCQlyZXR1cm4gYnVuZGxlSmFyOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRDb25maWd1cmF0aW9uRm9sZGVyKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJU3RyaW5nIGNvbmZpZyA9IHByb2ZpbGUuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9DT05GSUdVUkFUSU9OX0ZPTERFUik7Ci0JCWlmIChjb25maWcgIT0gbnVsbCkKLQkJCXJldHVybiBuZXcgRmlsZShjb25maWcpOwotCQlyZXR1cm4gbmV3IEZpbGUoZ2V0SW5zdGFsbEZvbGRlcihwcm9maWxlKSwgImNvbmZpZ3VyYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluc3RhbGwgZm9sZGVyIGZvciB0aGUgcHJvZmlsZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiBubyBpbnN0YWxsIGZvbGRlciBpcyBkZWZpbmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRJbnN0YWxsRm9sZGVyKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJU3RyaW5nIGZvbGRlciA9IHByb2ZpbGUuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9JTlNUQUxMX0ZPTERFUik7Ci0JCXJldHVybiBmb2xkZXIgPT0gbnVsbCA/IG51bGwgOiBuZXcgRmlsZShmb2xkZXIpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRMYXVuY2hlclBhdGgoSVByb2ZpbGUgcHJvZmlsZSkgewotCQlyZXR1cm4gbmV3IEZpbGUoZ2V0SW5zdGFsbEZvbGRlcihwcm9maWxlKSwgZ2V0TGF1bmNoZXJOYW1lKHByb2ZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIGFwcGxpY2F0aW9uIGxhdW5jaGVyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMYXVuY2hlck5hbWUoSVByb2ZpbGUgcHJvZmlsZSkgewotCQlTdHJpbmcgbmFtZSA9IHByb2ZpbGUuZ2V0UHJvcGVydHkoRWNsaXBzZVRvdWNocG9pbnQuUFJPRklMRV9QUk9QX0xBVU5DSEVSX05BTUUpOwotCi0JCVN0cmluZyBvcyA9IGdldE9TRnJvbVByb2ZpbGUocHJvZmlsZSk7Ci0JCWlmIChvcyA9PSBudWxsKSB7Ci0JCQlFbnZpcm9ubWVudEluZm8gaW5mbyA9IChFbnZpcm9ubWVudEluZm8pIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBFbnZpcm9ubWVudEluZm8uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCWlmIChpbmZvICE9IG51bGwpCi0JCQkJb3MgPSBpbmZvLmdldE9TKCk7Ci0JCX0KLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSAiZWNsaXBzZSI7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAob3MuZXF1YWxzKG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5lbnZpcm9ubWVudC5Db25zdGFudHMuT1NfTUFDT1NYKSkgewotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG5hbWUpOwotCQkJaWYgKHBhdGguc2VnbWVudCgwKS5lbmRzV2l0aCgiLmFwcCIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG5hbWU7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYnVmZmVyLmFwcGVuZChuYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZS5zdWJzdHJpbmcoMSkpOwotCQkJYnVmZmVyLmFwcGVuZCgiLmFwcC9Db250ZW50cy9NYWNPUy8iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChuYW1lLnRvTG93ZXJDYXNlKCkpOwotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRPU0Zyb21Qcm9maWxlKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJU3RyaW5nIGVudmlyb25tZW50cyA9IHByb2ZpbGUuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMpOwotCQlpZiAoZW52aXJvbm1lbnRzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihlbnZpcm9ubWVudHMsICIsIik7IHRva2VuaXplci5oYXNNb3JlRWxlbWVudHMoKTspIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGVudHJ5ID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaW50IGkgPSBlbnRyeS5pbmRleE9mKCc9Jyk7Ci0JCQlTdHJpbmcga2V5ID0gZW50cnkuc3Vic3RyaW5nKDAsIGkpLnRyaW0oKTsKLQkJCWlmICgha2V5LmVxdWFscygib3NnaS5vcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0JCQlyZXR1cm4gZW50cnkuc3Vic3RyaW5nKGkgKyAxKS50cmltKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWFuaWZlc3QoVG91Y2hwb2ludERhdGFbXSBkYXRhKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG1hbmlmZXN0ID0gZGF0YVtpXS5nZXRJbnN0cnVjdGlvbnMoIm1hbmlmZXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChtYW5pZmVzdCAhPSBudWxsICYmIG1hbmlmZXN0Lmxlbmd0aCgpID4gMCkKLQkJCQlyZXR1cm4gbWFuaWZlc3Q7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYWdlbnQgbG9jYXRpb24sIGlmIHBvc3NpYmxlIGFzIGEgcGF0aCByZWxhdGl2ZSB0byB0aGUgY29uZmlndXJhdGlvbgotCSAqIGRpcmVjdG9yeSB1c2luZyB0aGUgQGNvbmZpZy5kaXIgc3Vic3RpdHV0aW9uIHZhcmlhYmxlLiBBZ2VudExvY2F0aW9uIHdpbGwKLQkgKiBzdWJzdGl0dXRlIHRoaXMgdmFyaWFibGUgd2l0aCB0aGUgY29uZmlndXJhdGlvbiBmb2xkZXIgbG9jYXRpb24gb24gc3RhcnR1cC4KLQkgKiBJZiB0aGUgYWdlbnQgbG9jYXRpb24gaXMgbm90IGEgc3ViLWRpcmVjdG9yeSBvZiB0aGUgY29uZmlndXJhdGlvbiBmb2xkZXIsIHRoaXMKLQkgKiBtZXRob2Qgc2ltcGx5IHJldHVybnMgdGhlIGFic29sdXRlIGFnZW50IGxvY2F0aW9uIGV4cHJlc3NlZCBhcyBhIFVSTC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlUmVsYXRpdmVBZ2VudExvY2F0aW9uKElQcm9maWxlIHByb2ZpbGUpIHsKLQkJVVJMIGFnZW50VVJMID0gVXRpbC5nZXRBZ2VudExvY2F0aW9uKCkuZ2V0VVJMKCk7Ci0JCS8vVE9ETyBoYW5kbGUgcHJvcGVyIHBhdGgvdXJsIGNvbnZlcnNpb24KLQkJSVBhdGggYWdlbnRQYXRoID0gbmV3IFBhdGgoYWdlbnRVUkwuZ2V0UGF0aCgpKTsKLQkJSVBhdGggY29uZmlnUGF0aCA9IG5ldyBQYXRoKFV0aWwuZ2V0Q29uZmlndXJhdGlvbkZvbGRlcihwcm9maWxlKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWlmIChjb25maWdQYXRoLmlzUHJlZml4T2YoYWdlbnRQYXRoKSkKLQkJCXJldHVybiAiQGNvbmZpZy5kaXIvIiArIGFnZW50UGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKGNvbmZpZ1BhdGguc2VnbWVudENvdW50KCkpLm1ha2VSZWxhdGl2ZSgpLnNldERldmljZShudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoYWdlbnRQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS5lcXVhbHMoY29uZmlnUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkpKQotCQkJcmV0dXJuICJAY29uZmlnLmRpci8uLi8iICsgYWdlbnRQYXRoLmxhc3RTZWdtZW50KCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGFnZW50VVJMLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBjcmVhdGVFcnJvcihtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgY3JlYXRlRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIEV4Y2VwdGlvbiBlKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgbWVzc2FnZSwgZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZUFydGlmYWN0UGFyYW0oTWFwIHBhcmFtZXRlcnMpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPRklMRSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9JVSk7Ci0JCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IGl1LmdldEFydGlmYWN0cygpOwotCQlpZiAoYXJ0aWZhY3RzID09IG51bGwgfHwgYXJ0aWZhY3RzLmxlbmd0aCA9PSAwKQotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuaXVfY29udGFpbnNfbm9fYXJpZmFjdHMsIGl1KSkpOwotCi0JCUlBcnRpZmFjdEtleSBhcnRpZmFjdEtleSA9IGFydGlmYWN0c1swXTsKLQotCQlGaWxlIGZpbGVMb2NhdGlvbiA9IFV0aWwuZ2V0QXJ0aWZhY3RGaWxlKGFydGlmYWN0S2V5LCBwcm9maWxlKTsKLQkJaWYgKGZpbGVMb2NhdGlvbiA9PSBudWxsIHx8ICFmaWxlTG9jYXRpb24uZXhpc3RzKCkpCi0JCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihjcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5hcnRpZmFjdF9maWxlX25vdF9mb3VuZCwgYXJ0aWZhY3RLZXkpKSk7Ci0JCXJldHVybiBmaWxlTG9jYXRpb24uZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBGaWxlIGdldExhdW5jaGVyQ29uZmlnTG9jYXRpb24oSVByb2ZpbGUgcHJvZmlsZSkgewotCQlTdHJpbmcgbGF1bmNoZXJDb25maWcgPSBwcm9maWxlLmdldFByb3BlcnR5KElQcm9maWxlLlBST1BfTEFVTkNIRVJfQ09ORklHVVJBVElPTik7Ci0JCXJldHVybiBsYXVuY2hlckNvbmZpZyA9PSBudWxsID8gbnVsbCA6IG5ldyBGaWxlKGxhdW5jaGVyQ29uZmlnKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9XaGF0SXNSdW5uaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9XaGF0SXNSdW5uaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOWFhOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvV2hhdElzUnVubmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotCi1wdWJsaWMgY2xhc3MgV2hhdElzUnVubmluZyB7Ci0JcHVibGljIEJ1bmRsZUluZm9bXSBnZXRCdW5kbGVzQmVpbmdSdW4oKSB7Ci0JCXJldHVybiBnZXRGcmFtZXdvcmtNYW5pcHVsYXRvcigpLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBNYW5pcHVsYXRvciBnZXRGcmFtZXdvcmtNYW5pcHVsYXRvcigpIHsKLQkJRnJhbWV3b3JrQWRtaW4gZndBZG1pbiA9IExhenlNYW5pcHVsYXRvci5nZXRGcmFtZXdvcmtBZG1pbigpOwotCQlpZiAoZndBZG1pbiAhPSBudWxsKQotCQkJcmV0dXJuIGZ3QWRtaW4uZ2V0UnVubmluZ01hbmlwdWxhdG9yKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQWN0aW9uQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0FjdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzkyN2ZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQWN0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotcHVibGljIGNsYXNzIEFjdGlvbkNvbnN0YW50cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX0FSVElGQUNUID0gIkBhcnRpZmFjdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX0FSVElGQUNUX1JFUVVFU1RTID0gImFydGlmYWN0UmVxdWVzdHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9CVU5ETEUgPSAiYnVuZGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fRkVBVFVSRSA9ICJmZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fRkVBVFVSRV9JRCA9ICJmZWF0dXJlSWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9GRUFUVVJFX1ZFUlNJT04gPSAiZmVhdHVyZVZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9KVk1fQVJHID0gImp2bUFyZyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX09QRVJBTkQgPSAib3BlcmFuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1BSRVZJT1VTX1NUQVJUX0xFVkVMID0gInByZXZpb3VzU3RhcnRMZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1BSRVZJT1VTX1NUQVJURUQgPSAicHJldmlvdXNTdGFydGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fUFJFVklPVVNfVkFMVUUgPSAicHJldmlvdXNWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1BST0ZJTEUgPSAicHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1BST0dSQU1fQVJHID0gInByb2dyYW1BcmciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9QUk9QX05BTUUgPSAicHJvcE5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9QUk9QX1ZBTFVFID0gInByb3BWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1NUQVJUX0xFVkVMID0gInN0YXJ0TGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9TVEFSVEVEID0gInN0YXJ0ZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9ERUZBVUxUX1ZBTFVFID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9MQVVOQ0hFUk5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1BBVEggPSAicGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1RBUkdFVF9ESVIgPSAidGFyZ2V0RGlyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fTElOS19OQU1FID0gImxpbmtOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fTElOS19GT1JDRSA9ICJmb3JjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX0xJTktfVEFSR0VUID0gImxpbmtUYXJnZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9UQVJHRVRfRklMRSA9ICJ0YXJnZXRGaWxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fUEVSTUlTU0lPTlMgPSAicGVybWlzc2lvbnMiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQWN0aW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9BY3Rpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZTlkZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9BY3Rpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBBY3Rpb25GYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIE1hcCBhY3Rpb25zOwotCi0Jc3RhdGljIHsKLQkJYWN0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWFjdGlvbnMucHV0KENvbGxlY3RBY3Rpb24uSUQsIENvbGxlY3RBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChJbnN0YWxsQnVuZGxlQWN0aW9uLklELCBJbnN0YWxsQnVuZGxlQWN0aW9uLmNsYXNzKTsKLQkJYWN0aW9ucy5wdXQoVW5pbnN0YWxsQnVuZGxlQWN0aW9uLklELCBVbmluc3RhbGxCdW5kbGVBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChBZGRTb3VyY2VCdW5kbGVBY3Rpb24uSUQsIEFkZFNvdXJjZUJ1bmRsZUFjdGlvbi5jbGFzcyk7Ci0JCWFjdGlvbnMucHV0KFJlbW92ZVNvdXJjZUJ1bmRsZUFjdGlvbi5JRCwgUmVtb3ZlU291cmNlQnVuZGxlQWN0aW9uLmNsYXNzKTsKLQkJYWN0aW9ucy5wdXQoSW5zdGFsbEZlYXR1cmVBY3Rpb24uSUQsIEluc3RhbGxGZWF0dXJlQWN0aW9uLmNsYXNzKTsKLQkJYWN0aW9ucy5wdXQoVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5JRCwgVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5jbGFzcyk7Ci0JCWFjdGlvbnMucHV0KFNldExhdW5jaGVyTmFtZUFjdGlvbi5JRCwgU2V0TGF1bmNoZXJOYW1lQWN0aW9uLmNsYXNzKTsKLQkJYWN0aW9ucy5wdXQoQWRkUHJvZ3JhbUFyZ3VtZW50QWN0aW9uLklELCBBZGRQcm9ncmFtQXJndW1lbnRBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChSZW1vdmVQcm9ncmFtQXJndW1lbnRBY3Rpb24uSUQsIFJlbW92ZVByb2dyYW1Bcmd1bWVudEFjdGlvbi5jbGFzcyk7Ci0JCWFjdGlvbnMucHV0KFNldFN0YXJ0TGV2ZWxBY3Rpb24uSUQsIFNldFN0YXJ0TGV2ZWxBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChNYXJrU3RhcnRlZEFjdGlvbi5JRCwgTWFya1N0YXJ0ZWRBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChTZXRGcmFtZXdvcmtEZXBlbmRlbnRQcm9wZXJ0eUFjdGlvbi5JRCwgU2V0RnJhbWV3b3JrRGVwZW5kZW50UHJvcGVydHlBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChTZXRGcmFtZXdvcmtJbmRlcGVuZGVudFByb3BlcnR5QWN0aW9uLklELCBTZXRGcmFtZXdvcmtJbmRlcGVuZGVudFByb3BlcnR5QWN0aW9uLmNsYXNzKTsKLQkJYWN0aW9ucy5wdXQoU2V0UHJvZ3JhbVByb3BlcnR5QWN0aW9uLklELCBTZXRQcm9ncmFtUHJvcGVydHlBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChBZGRKVk1Bcmd1bWVudEFjdGlvbi5JRCwgQWRkSlZNQXJndW1lbnRBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChSZW1vdmVKVk1Bcmd1bWVudEFjdGlvbi5JRCwgUmVtb3ZlSlZNQXJndW1lbnRBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChNa2RpckFjdGlvbi5JRCwgTWtkaXJBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChSbWRpckFjdGlvbi5JRCwgUm1kaXJBY3Rpb24uY2xhc3MpOwotCQlhY3Rpb25zLnB1dChMaW5rQWN0aW9uLklELCBMaW5rQWN0aW9uLmNsYXNzKTsKLQkJYWN0aW9ucy5wdXQoQ2htb2RBY3Rpb24uSUQsIENobW9kQWN0aW9uLmNsYXNzKTsKLQkJYWN0aW9ucy5wdXQoQ2hlY2tUcnVzdEFjdGlvbi5JRCwgQ2hlY2tUcnVzdEFjdGlvbi5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm92aXNpb25pbmdBY3Rpb24gY3JlYXRlKFN0cmluZyBhY3Rpb25JZCkgewotCQlDbGFzcyBjbGF6eiA9IChDbGFzcykgYWN0aW9ucy5nZXQoYWN0aW9uSWQpOwotCQlpZiAoY2xhenogIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gKFByb3Zpc2lvbmluZ0FjdGlvbikgY2xhenoubmV3SW5zdGFuY2UoKTsKLQkJCX0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ0hlbHBlci5sb2coVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5hY3Rpb25fbm90X2luc3RhbnRpYXRlZCwgYWN0aW9uSWQpLCBlKSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dIZWxwZXIubG9nKFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuYWN0aW9uX25vdF9pbnN0YW50aWF0ZWQsIGFjdGlvbklkKSwgZSkpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQWRkSlZNQXJndW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQWRkSlZNQXJndW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1YzIyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0FkZEpWTUFyZ3VtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5FY2xpcHNlVG91Y2hwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBBZGRKVk1Bcmd1bWVudEFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiYWRkSnZtQXJnIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVN0cmluZyBqdm1BcmcgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9KVk1fQVJHKTsKLQkJaWYgKGp2bUFyZyA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX0pWTV9BUkcsIElEKSk7Ci0JCW1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLmFkZEp2bUFyZyhqdm1BcmcpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJU3RyaW5nIGp2bUFyZyA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX0pWTV9BUkcpOwotCQlpZiAoanZtQXJnID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fSlZNX0FSRywgSUQpKTsKLQkJbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkucmVtb3ZlSnZtQXJnKGp2bUFyZyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0FkZFByb2dyYW1Bcmd1bWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9BZGRQcm9ncmFtQXJndW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIzYjAzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0FkZFByb2dyYW1Bcmd1bWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLkVjbGlwc2VUb3VjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEFkZFByb2dyYW1Bcmd1bWVudEFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiYWRkUHJvZ3JhbUFyZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSAoTWFuaXB1bGF0b3IpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fTUFOSVBVTEFUT1IpOwotCQlTdHJpbmcgcHJvZ3JhbUFyZyA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0dSQU1fQVJHKTsKLQkJaWYgKHByb2dyYW1BcmcgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9HUkFNX0FSRywgSUQpKTsKLQotCQlpZiAocHJvZ3JhbUFyZy5lcXVhbHMoQWN0aW9uQ29uc3RhbnRzLlBBUk1fQVJUSUZBQ1QpKSB7Ci0JCQl0cnkgewotCQkJCXByb2dyYW1BcmcgPSBVdGlsLnJlc29sdmVBcnRpZmFjdFBhcmFtKHBhcmFtZXRlcnMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCQl9Ci0JCX0KLQotCQltYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKS5hZGRQcm9ncmFtQXJnKHByb2dyYW1BcmcpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJU3RyaW5nIHByb2dyYW1BcmcgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9HUkFNX0FSRyk7Ci0JCWlmIChwcm9ncmFtQXJnID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPR1JBTV9BUkcsIElEKSk7Ci0KLQkJaWYgKHByb2dyYW1BcmcuZXF1YWxzKEFjdGlvbkNvbnN0YW50cy5QQVJNX0FSVElGQUNUKSkgewotCQkJdHJ5IHsKLQkJCQlwcm9ncmFtQXJnID0gVXRpbC5yZXNvbHZlQXJ0aWZhY3RQYXJhbShwYXJhbWV0ZXJzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBlLmdldFN0YXR1cygpOwotCQkJfQotCQl9Ci0KLQkJbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkucmVtb3ZlUHJvZ3JhbUFyZyhwcm9ncmFtQXJnKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQWRkU291cmNlQnVuZGxlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0FkZFNvdXJjZUJ1bmRsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjkwYzZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQWRkU291cmNlQnVuZGxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEFkZFNvdXJjZUJ1bmRsZUFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiYWRkU291cmNlQnVuZGxlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlyZXR1cm4gQWRkU291cmNlQnVuZGxlQWN0aW9uLmFkZFNvdXJjZUJ1bmRsZShwYXJhbWV0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBSZW1vdmVTb3VyY2VCdW5kbGVBY3Rpb24ucmVtb3ZlU291cmNlQnVuZGxlKHBhcmFtZXRlcnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBhZGRTb3VyY2VCdW5kbGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPRklMRSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9JVSk7Ci0JCVNvdXJjZU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKFNvdXJjZU1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX1NPVVJDRV9CVU5ETEVTKTsKLQkJU3RyaW5nIGJ1bmRsZUlkID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fQlVORExFKTsKLQkJaWYgKGJ1bmRsZUlkID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fQlVORExFLCBJRCkpOwotCi0JCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IGl1LmdldEFydGlmYWN0cygpOwotCQlpZiAoYXJ0aWZhY3RzID09IG51bGwgfHwgYXJ0aWZhY3RzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuaXVfY29udGFpbnNfbm9fYXJpZmFjdHMsIGl1KSk7Ci0KLQkJSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnRpZmFjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhcnRpZmFjdHNbaV0udG9TdHJpbmcoKS5lcXVhbHMoYnVuZGxlSWQpKSB7Ci0JCQkJYXJ0aWZhY3RLZXkgPSBhcnRpZmFjdHNbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFydGlmYWN0S2V5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLm5vX21hdGNoaW5nX2FydGlmYWN0LCBidW5kbGVJZCkpOwotCi0JCUZpbGUgYnVuZGxlRmlsZSA9IFV0aWwuZ2V0QXJ0aWZhY3RGaWxlKGFydGlmYWN0S2V5LCBwcm9maWxlKTsKLQkJaWYgKGJ1bmRsZUZpbGUgPT0gbnVsbCB8fCAhYnVuZGxlRmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLmFydGlmYWN0X2ZpbGVfbm90X2ZvdW5kLCBhcnRpZmFjdEtleSkpOwotCi0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5hZGRCdW5kbGUoYnVuZGxlRmlsZSwgYXJ0aWZhY3RLZXkuZ2V0SWQoKSwgYXJ0aWZhY3RLZXkuZ2V0VmVyc2lvbigpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuY2Fubm90X2NvbmZpZ3VyZV9zb3VyY2VfYnVuZGxlLCBhcnRpZmFjdEtleSkpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0NoZWNrVHJ1c3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQ2hlY2tUcnVzdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTY1OWU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQ2hlY2tUcnVzdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLkVjbGlwc2VUb3VjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLQotLyoqCi0gKiBUaGlzIGFjdGlvbiBjb2xsZWN0cyB0aGUgc2V0IG9mIGJ1bmRsZSBmaWxlcyBvbiB3aGljaCB0aGUgc2lnbmF0dXJlIHRydXN0IGNoZWNrCi0gKiBzaG91bGQgYmUgcGVyZm9ybWVkLiBUaGUgYWN0dWFsIHRydXN0IGNoZWNraW5nIGlzIGRvbmUgYnkgdGhlIENoZWNrVHJ1c3QgcGhhc2UuCi0gKi8KLXB1YmxpYyBjbGFzcyBDaGVja1RydXN0QWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImNoZWNrVHJ1c3QiOyAvLyROT04tTkxTLTEkCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb24jZXhlY3V0ZShqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX0lVKTsKLQkJaWYgKGl1ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ29sbGVjdGlvbiBidW5kbGVGaWxlcyA9IChDb2xsZWN0aW9uKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9BUlRJRkFDVF9SRVFVRVNUUyk7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0ZJTEUpOwotCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBpdS5nZXRBcnRpZmFjdHMoKTsKLQkJaWYgKGFydGlmYWN0cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJ0aWZhY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGaWxlIGJ1bmRsZUZpbGUgPSBVdGlsLmdldEFydGlmYWN0RmlsZShhcnRpZmFjdHNbaV0sIHByb2ZpbGUpOwotCQkJaWYgKCFidW5kbGVGaWxlcy5jb250YWlucyhidW5kbGVGaWxlKSkKLQkJCQlidW5kbGVGaWxlcy5hZGQoYnVuZGxlRmlsZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uI3VuZG8oamF2YS51dGlsLk1hcCkKLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQ2htb2RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQ2htb2RBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4Njg1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0NobW9kQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIENobW9kQWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJjaG1vZCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJU3RyaW5nIHRhcmdldERpciA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1RBUkdFVF9ESVIpOwotCQlpZiAodGFyZ2V0RGlyID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fVEFSR0VUX0RJUiwgSUQpKTsKLQkJaWYgKHRhcmdldERpci5lcXVhbHMoQWN0aW9uQ29uc3RhbnRzLlBBUk1fQVJUSUZBQ1QpKSB7Ci0JCQl0cnkgewotCQkJCXRhcmdldERpciA9IFV0aWwucmVzb2x2ZUFydGlmYWN0UGFyYW0ocGFyYW1ldGVycyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJCX0KLQkJCUZpbGUgZGlyID0gbmV3IEZpbGUodGFyZ2V0RGlyKTsKLQkJCWlmICghZGlyLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5hcnRpZmFjdF9ub3RfZGlyZWN0b3J5LCBkaXIpKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgdGFyZ2V0RmlsZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1RBUkdFVF9GSUxFKTsKLQkJaWYgKHRhcmdldEZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9UQVJHRVRfRklMRSwgSUQpKTsKLQotCQlTdHJpbmcgcGVybWlzc2lvbnMgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QRVJNSVNTSU9OUyk7Ci0JCWlmIChwZXJtaXNzaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1BFUk1JU1NJT05TLCBJRCkpOwotCi0JCWNobW9kKHRhcmdldERpciwgdGFyZ2V0RmlsZSwgcGVybWlzc2lvbnMpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCS8vVE9ETzogaW1wbGVtZW50IHVuZG8gPz8KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNobW9kKFN0cmluZyB0YXJnZXREaXIsIFN0cmluZyB0YXJnZXRGaWxlLCBTdHJpbmcgcGVybXMpIHsKLQkJUnVudGltZSByID0gUnVudGltZS5nZXRSdW50aW1lKCk7Ci0JCXRyeSB7Ci0JCQlyLmV4ZWMobmV3IFN0cmluZ1tdIHsiY2htb2QiLCBwZXJtcywgdGFyZ2V0RGlyICsgSVBhdGguU0VQQVJBVE9SICsgdGFyZ2V0RmlsZX0pOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIEZJWE1FOiAgd2Ugc2hvdWxkIHByb2JhYmx5IHRocm93IHNvbWUgc29ydCBvZiBlcnJvciBoZXJlCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0NvbGxlY3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQ29sbGVjdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWRjMjZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvQ29sbGVjdEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ29sbGVjdEFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiY29sbGVjdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUlRJRkFDVF9GT0xERVIgPSAiYXJ0aWZhY3QuZm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlJUHJvZmlsZSBwcm9maWxlID0gKElQcm9maWxlKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9GSUxFKTsKLQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcGVyYW5kID0gKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX09QRVJBTkQpOwotCQlJQXJ0aWZhY3RSZXF1ZXN0W10gcmVxdWVzdHM7Ci0JCXRyeSB7Ci0JCQlyZXF1ZXN0cyA9IENvbGxlY3RBY3Rpb24uY29sbGVjdChvcGVyYW5kLnNlY29uZCgpLCBwcm9maWxlKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBlLmdldFN0YXR1cygpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBhcnRpZmFjdFJlcXVlc3RzID0gKENvbGxlY3Rpb24pIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX0FSVElGQUNUX1JFUVVFU1RTKTsKLQkJYXJ0aWZhY3RSZXF1ZXN0cy5hZGQocmVxdWVzdHMpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gZm9yIG5vdwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNaaXBwZWQoVG91Y2hwb2ludERhdGFbXSBkYXRhKSB7Ci0JCWlmIChkYXRhID09IG51bGwgfHwgZGF0YS5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZGF0YVtpXS5nZXRJbnN0cnVjdGlvbnMoInppcHBlZCIpICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBQcm9wZXJ0aWVzIGNyZWF0ZUFydGlmYWN0RGVzY3JpcHRvclByb3BlcnRpZXMoSUluc3RhbGxhYmxlVW5pdCBpbnN0YWxsYWJsZVVuaXQpIHsKLQkJUHJvcGVydGllcyBkZXNjcmlwdG9yUHJvcGVydGllcyA9IG51bGw7Ci0JCWlmIChDb2xsZWN0QWN0aW9uLmlzWmlwcGVkKGluc3RhbGxhYmxlVW5pdC5nZXRUb3VjaHBvaW50RGF0YSgpKSkgewotCQkJZGVzY3JpcHRvclByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQkJZGVzY3JpcHRvclByb3BlcnRpZXMuc2V0UHJvcGVydHkoQ29sbGVjdEFjdGlvbi5BUlRJRkFDVF9GT0xERVIsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvclByb3BlcnRpZXM7Ci0JfQotCi0JLy8gVE9ETzogSGVyZSB3ZSBtYXkgd2FudCB0byBjb25zdWx0IG11bHRpcGxlIGNhY2hlcwotCXB1YmxpYyBzdGF0aWMgSUFydGlmYWN0UmVxdWVzdFtdIGNvbGxlY3QoSUluc3RhbGxhYmxlVW5pdCBpbnN0YWxsYWJsZVVuaXQsIElQcm9maWxlIHByb2ZpbGUpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlJQXJ0aWZhY3RLZXlbXSB0b0Rvd25sb2FkID0gaW5zdGFsbGFibGVVbml0LmdldEFydGlmYWN0cygpOwotCQlpZiAodG9Eb3dubG9hZCA9PSBudWxsIHx8IHRvRG93bmxvYWQubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuTk9fQVJUSUZBQ1RfUkVRVUVTVDsKLQotCQlJQXJ0aWZhY3RSZXBvc2l0b3J5IGFnZ3JlZ2F0ZWRSZXBvc2l0b3J5VmlldyA9IFV0aWwuZ2V0QWdncmVnYXRlZEJ1bmRsZVJlcG9zaXRvcnkocHJvZmlsZSk7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgYnVuZGxlUG9vbCA9IFV0aWwuZ2V0QnVuZGxlUG9vbFJlcG9zaXRvcnkocHJvZmlsZSk7Ci0JCWlmIChidW5kbGVQb29sID09IG51bGwpCi0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMubm9fYnVuZGxlX3Bvb2wsIHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCkpKSk7Ci0KLQkJTGlzdCByZXF1ZXN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b0Rvd25sb2FkLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQXJ0aWZhY3RLZXkga2V5ID0gdG9Eb3dubG9hZFtpXTsKLQkJCWlmICghYWdncmVnYXRlZFJlcG9zaXRvcnlWaWV3LmNvbnRhaW5zKGtleSkpIHsKLQkJCQlQcm9wZXJ0aWVzIHJlcG9zaXRvcnlQcm9wZXJ0aWVzID0gQ29sbGVjdEFjdGlvbi5jcmVhdGVBcnRpZmFjdERlc2NyaXB0b3JQcm9wZXJ0aWVzKGluc3RhbGxhYmxlVW5pdCk7Ci0JCQkJcmVxdWVzdHMuYWRkKFV0aWwuZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmNyZWF0ZU1pcnJvclJlcXVlc3Qoa2V5LCBidW5kbGVQb29sLCBudWxsLCByZXBvc2l0b3J5UHJvcGVydGllcykpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlcXVlc3RzLmlzRW1wdHkoKSkKLQkJCXJldHVybiBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5OT19BUlRJRkFDVF9SRVFVRVNUOwotCi0JCUlBcnRpZmFjdFJlcXVlc3RbXSByZXN1bHQgPSAoSUFydGlmYWN0UmVxdWVzdFtdKSByZXF1ZXN0cy50b0FycmF5KG5ldyBJQXJ0aWZhY3RSZXF1ZXN0W3JlcXVlc3RzLnNpemUoKV0pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0luc3RhbGxCdW5kbGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvSW5zdGFsbEJ1bmRsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmZjMTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvSW5zdGFsbEJ1bmRsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLkVjbGlwc2VUb3VjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5CdW5kbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbEJ1bmRsZUFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiaW5zdGFsbEJ1bmRsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIEluc3RhbGxCdW5kbGVBY3Rpb24uaW5zdGFsbEJ1bmRsZShwYXJhbWV0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBVbmluc3RhbGxCdW5kbGVBY3Rpb24udW5pbnN0YWxsQnVuZGxlKHBhcmFtZXRlcnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBpbnN0YWxsQnVuZGxlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0ZJTEUpOwotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fSVUpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVN0cmluZyBidW5kbGVJZCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX0JVTkRMRSk7Ci0JCWlmIChidW5kbGVJZCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX0JVTkRMRSwgSUQpKTsKLQotCQkvL1RPRE86IGV2ZW50dWFsbHkgcmVtb3ZlIHRoaXMuIFdoYXQgaXMgYSBmcmFnbWVudCBkb2luZyBoZXJlPz8KLQkJaWYgKGl1LmlzRnJhZ21lbnQoKSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJXaGF0IGlzIGEgZnJhZ21lbnQgZG9pbmcgaGVyZSEhISAtLSAiICsgaXUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IGl1LmdldEFydGlmYWN0cygpOwotCQlpZiAoYXJ0aWZhY3RzID09IG51bGwgfHwgYXJ0aWZhY3RzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuaXVfY29udGFpbnNfbm9fYXJpZmFjdHMsIGl1KSk7Ci0KLQkJSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnRpZmFjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhcnRpZmFjdHNbaV0udG9TdHJpbmcoKS5lcXVhbHMoYnVuZGxlSWQpKSB7Ci0JCQkJYXJ0aWZhY3RLZXkgPSBhcnRpZmFjdHNbaV07Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGFydGlmYWN0S2V5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLm5vX21hdGNoaW5nX2FydGlmYWN0LCBidW5kbGVJZCkpOwotCi0JCUZpbGUgYnVuZGxlRmlsZSA9IFV0aWwuZ2V0QXJ0aWZhY3RGaWxlKGFydGlmYWN0S2V5LCBwcm9maWxlKTsKLQkJaWYgKGJ1bmRsZUZpbGUgPT0gbnVsbCB8fCAhYnVuZGxlRmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLmFydGlmYWN0X2ZpbGVfbm90X2ZvdW5kLCBhcnRpZmFjdEtleSkpOwotCi0JCS8vQnkgbm93IHdlIGFsd2F5cyBoYXZlIHRoZSBtYW5pZmVzdCBpbiB0aGUgdG91Y2hwb2ludCBkYXRhCi0JCVN0cmluZyBtYW5pZmVzdCA9IFV0aWwuZ2V0TWFuaWZlc3QoaXUuZ2V0VG91Y2hwb2ludERhdGEoKSk7Ci0JCWlmIChtYW5pZmVzdCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMubWlzc2luZ19tYW5pZmVzdCwgaXUpKTsKLQotCQlCdW5kbGVJbmZvIGJ1bmRsZUluZm8gPSBVdGlsLmNyZWF0ZUJ1bmRsZUluZm8oYnVuZGxlRmlsZSwgbWFuaWZlc3QpOwotCQlpZiAoYnVuZGxlSW5mbyA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuZmFpbGVkX2J1bmRsZWluZm8sIGl1KSk7Ci0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5hZGRCdW5kbGUoYnVuZGxlSW5mbyk7Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvSW5zdGFsbEZlYXR1cmVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvSW5zdGFsbEZlYXR1cmVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiNzhlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL0luc3RhbGxGZWF0dXJlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgSW5zdGFsbEZlYXR1cmVBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImluc3RhbGxGZWF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlyZXR1cm4gSW5zdGFsbEZlYXR1cmVBY3Rpb24uaW5zdGFsbEZlYXR1cmUocGFyYW1ldGVycyk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlyZXR1cm4gVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi51bmluc3RhbGxGZWF0dXJlKHBhcmFtZXRlcnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyBpbnN0YWxsRmVhdHVyZShNYXAgcGFyYW1ldGVycykgewotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fSVUpOwotCQlQbGF0Zm9ybUNvbmZpZ3VyYXRpb25XcmFwcGVyIGNvbmZpZ3VyYXRpb24gPSAoUGxhdGZvcm1Db25maWd1cmF0aW9uV3JhcHBlcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9QTEFURk9STV9DT05GSUdVUkFUSU9OKTsKLQkJU3RyaW5nIGZlYXR1cmUgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9GRUFUVVJFKTsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX0ZFQVRVUkVfSUQpOwotCQlTdHJpbmcgZmVhdHVyZVZlcnNpb24gPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9GRUFUVVJFX1ZFUlNJT04pOwotCi0JCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IGl1LmdldEFydGlmYWN0cygpOwotCQlpZiAoYXJ0aWZhY3RzID09IG51bGwgfHwgYXJ0aWZhY3RzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuaXVfY29udGFpbnNfbm9fYXJpZmFjdHMsIGl1KSk7Ci0KLQkJSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnRpZmFjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhcnRpZmFjdHNbaV0udG9TdHJpbmcoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCQlhcnRpZmFjdEtleSA9IGFydGlmYWN0c1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChmZWF0dXJlSWQgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9GRUFUVVJFX0lELCBJRCkpOwotCQllbHNlIGlmIChBY3Rpb25Db25zdGFudHMuUEFSTV9ERUZBVUxUX1ZBTFVFLmVxdWFscyhmZWF0dXJlSWQpKSB7Ci0JCQlmZWF0dXJlSWQgPSBhcnRpZmFjdEtleS5nZXRJZCgpOwotCQl9Ci0KLQkJaWYgKGZlYXR1cmVWZXJzaW9uID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fRkVBVFVSRV9WRVJTSU9OLCBJRCkpOwotCQllbHNlIGlmIChBY3Rpb25Db25zdGFudHMuUEFSTV9ERUZBVUxUX1ZBTFVFLmVxdWFscyhmZWF0dXJlVmVyc2lvbikpIHsKLQkJCWZlYXR1cmVWZXJzaW9uID0gYXJ0aWZhY3RLZXkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlJUHJvZmlsZSBwcm9maWxlID0gKElQcm9maWxlKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9GSUxFKTsKLQkJRmlsZSBmaWxlID0gVXRpbC5nZXRBcnRpZmFjdEZpbGUoYXJ0aWZhY3RLZXksIHByb2ZpbGUpOwotCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5hcnRpZmFjdF9maWxlX25vdF9mb3VuZCwgYXJ0aWZhY3RLZXkpKTsKLQkJfQotCQlyZXR1cm4gY29uZmlndXJhdGlvbi5hZGRGZWF0dXJlRW50cnkoZmlsZSwgZmVhdHVyZUlkLCBmZWF0dXJlVmVyc2lvbiwgYXJ0aWZhY3RLZXkuZ2V0SWQoKSwgYXJ0aWZhY3RLZXkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCksIC8qcHJpbWFyeSovZmFsc2UsIC8qYXBwbGljYXRpb24qL251bGwsIC8qcm9vdCovbnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvTGlua0FjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9MaW5rQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YTQ5ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9MaW5rQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIExpbmtBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImxuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlTdHJpbmcgdGFyZ2V0RGlyID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fVEFSR0VUX0RJUik7Ci0JCWlmICh0YXJnZXREaXIgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9UQVJHRVRfRElSLCBJRCkpOwotCi0JCWlmICh0YXJnZXREaXIuZXF1YWxzKEFjdGlvbkNvbnN0YW50cy5QQVJNX0FSVElGQUNUKSkgewotCQkJdHJ5IHsKLQkJCQl0YXJnZXREaXIgPSBVdGlsLnJlc29sdmVBcnRpZmFjdFBhcmFtKHBhcmFtZXRlcnMpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCQl9Ci0JCQlGaWxlIGRpciA9IG5ldyBGaWxlKHRhcmdldERpcik7Ci0JCQlpZiAoIWRpci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3Rfbm90X2RpcmVjdG9yeSwgZGlyKSk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgbGlua1RhcmdldCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX0xJTktfVEFSR0VUKTsKLQkJaWYgKGxpbmtUYXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9MSU5LX1RBUkdFVCwgSUQpKTsKLQotCQlTdHJpbmcgbGlua05hbWUgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9MSU5LX05BTUUpOwotCQlpZiAobGlua05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9MSU5LX05BTUUsIElEKSk7Ci0KLQkJU3RyaW5nIGZvcmNlID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fTElOS19GT1JDRSk7Ci0KLQkJbG4odGFyZ2V0RGlyLCBsaW5rVGFyZ2V0LCBsaW5rTmFtZSwgQm9vbGVhbi52YWx1ZU9mKGZvcmNlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG4oU3RyaW5nIHRhcmdldERpciwgU3RyaW5nIGxpbmtUYXJnZXQsIFN0cmluZyBsaW5rTmFtZSwgYm9vbGVhbiBmb3JjZSkgewotCQlSdW50aW1lIHIgPSBSdW50aW1lLmdldFJ1bnRpbWUoKTsKLQkJdHJ5IHsKLQkJCXIuZXhlYyhuZXcgU3RyaW5nW10geyJsbiIsICItcyIgKyAoZm9yY2UgPyAiZiIgOiAiIiksIGxpbmtUYXJnZXQsIHRhcmdldERpciArIElQYXRoLlNFUEFSQVRPUiArIGxpbmtOYW1lfSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvTWFya1N0YXJ0ZWRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvTWFya1N0YXJ0ZWRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk0NjA4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL01hcmtTdGFydGVkQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuRWNsaXBzZVRvdWNocG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNYXJrU3RhcnRlZEFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAibWFya1N0YXJ0ZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0ZJTEUpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9JVSk7Ci0JCVN0cmluZyBzdGFydGVkID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fU1RBUlRFRCk7Ci0JCWlmIChzdGFydGVkID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fU1RBUlRFRCwgSUQpKTsKLQotCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBpdS5nZXRBcnRpZmFjdHMoKTsKLQkJaWYgKGFydGlmYWN0cyA9PSBudWxsIHx8IGFydGlmYWN0cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLml1X2NvbnRhaW5zX25vX2FyaWZhY3RzLCBpdSkpOwotCi0JCUlBcnRpZmFjdEtleSBhcnRpZmFjdEtleSA9IGFydGlmYWN0c1swXTsKLQkJRmlsZSBidW5kbGVGaWxlID0gVXRpbC5nZXRBcnRpZmFjdEZpbGUoYXJ0aWZhY3RLZXksIHByb2ZpbGUpOwotCQlpZiAoYnVuZGxlRmlsZSA9PSBudWxsIHx8ICFidW5kbGVGaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3RfZmlsZV9ub3RfZm91bmQsIGFydGlmYWN0S2V5KSk7Ci0KLQkJU3RyaW5nIG1hbmlmZXN0ID0gVXRpbC5nZXRNYW5pZmVzdChpdS5nZXRUb3VjaHBvaW50RGF0YSgpKTsKLQkJaWYgKG1hbmlmZXN0ID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5taXNzaW5nX21hbmlmZXN0LCBpdSkpOwotCi0JCUJ1bmRsZUluZm8gYnVuZGxlSW5mbyA9IFV0aWwuY3JlYXRlQnVuZGxlSW5mbyhidW5kbGVGaWxlLCBtYW5pZmVzdCk7Ci0JCWlmIChidW5kbGVJbmZvID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5mYWlsZWRfYnVuZGxlaW5mbywgaXUpKTsKLQotCQlCdW5kbGVJbmZvW10gYnVuZGxlcyA9IG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGJ1bmRsZXNbaV0uZXF1YWxzKGJ1bmRsZUluZm8pKSB7Ci0JCQkJZ2V0TWVtZW50bygpLnB1dChBY3Rpb25Db25zdGFudHMuUEFSTV9QUkVWSU9VU19TVEFSVEVELCBuZXcgQm9vbGVhbihidW5kbGVzW2ldLmlzTWFya2VkQXNTdGFydGVkKCkpKTsKLQkJCQlidW5kbGVzW2ldLnNldE1hcmtlZEFzU3RhcnRlZChCb29sZWFuLnZhbHVlT2Yoc3RhcnRlZCkuYm9vbGVhblZhbHVlKCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPRklMRSk7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX0lVKTsKLQotCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBpdS5nZXRBcnRpZmFjdHMoKTsKLQkJaWYgKGFydGlmYWN0cyA9PSBudWxsIHx8IGFydGlmYWN0cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLml1X2NvbnRhaW5zX25vX2FyaWZhY3RzLCBpdSkpOwotCi0JCUlBcnRpZmFjdEtleSBhcnRpZmFjdEtleSA9IGFydGlmYWN0c1swXTsKLQkJRmlsZSBidW5kbGVGaWxlID0gVXRpbC5nZXRBcnRpZmFjdEZpbGUoYXJ0aWZhY3RLZXksIHByb2ZpbGUpOwotCQlpZiAoYnVuZGxlRmlsZSA9PSBudWxsIHx8ICFidW5kbGVGaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3RfZmlsZV9ub3RfZm91bmQsIGFydGlmYWN0S2V5KSk7Ci0KLQkJU3RyaW5nIG1hbmlmZXN0ID0gVXRpbC5nZXRNYW5pZmVzdChpdS5nZXRUb3VjaHBvaW50RGF0YSgpKTsKLQkJaWYgKG1hbmlmZXN0ID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5taXNzaW5nX21hbmlmZXN0LCBpdSkpOwotCi0JCUJ1bmRsZUluZm8gYnVuZGxlSW5mbyA9IFV0aWwuY3JlYXRlQnVuZGxlSW5mbyhidW5kbGVGaWxlLCBtYW5pZmVzdCk7Ci0JCWlmIChidW5kbGVJbmZvID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5mYWlsZWRfYnVuZGxlaW5mbywgaXUpKTsKLQotCQlCdW5kbGVJbmZvW10gYnVuZGxlcyA9IG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGJ1bmRsZXNbaV0uZXF1YWxzKGJ1bmRsZUluZm8pKSB7Ci0JCQkJQm9vbGVhbiBwcmV2aW91c1N0YXJ0ZWQgPSAoQm9vbGVhbikgZ2V0TWVtZW50bygpLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUkVWSU9VU19TVEFSVEVEKTsKLQkJCQlpZiAocHJldmlvdXNTdGFydGVkICE9IG51bGwpCi0JCQkJCWJ1bmRsZXNbaV0uc2V0TWFya2VkQXNTdGFydGVkKHByZXZpb3VzU3RhcnRlZC5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIyZmNhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnMubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXJ0aWZhY3RfZmlsZV9ub3RfZm91bmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWN0aW9uX25vdF9pbnN0YW50aWF0ZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcGFyYW1ldGVyX25vdF9zZXQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgaXVfY29udGFpbnNfbm9fYXJpZmFjdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9fbWF0Y2hpbmdfYXJ0aWZhY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWlzc2luZ19tYW5pZmVzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBmYWlsZWRfYnVuZGxlaW5mbzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYW5ub3RfY29uZmlndXJlX3NvdXJjZV9idW5kbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3JfcGFyc2luZ19zdGFydGxldmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X25vdF9kaXJlY3Rvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgbm9fYnVuZGxlX3Bvb2w7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUgYW5kIGFzc2lnbiB0byBmaWVsZHMgYmVsb3cKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvTWtkaXJBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvTWtkaXJBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRmMmUwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL01rZGlyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1rZGlyQWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJta2RpciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QQVRIKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QQVRILCBJRCkpOwotCQluZXcgRmlsZShwYXRoKS5ta2RpcigpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCVN0cmluZyBwYXRoID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUEFUSCk7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUEFUSCwgSUQpKTsKLQkJbmV3IEZpbGUocGF0aCkuZGVsZXRlKCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1JlbW92ZUpWTUFyZ3VtZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1JlbW92ZUpWTUFyZ3VtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMjgxNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9SZW1vdmVKVk1Bcmd1bWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuRWNsaXBzZVRvdWNocG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLk1hbmlwdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlSlZNQXJndW1lbnRBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInJlbW92ZUp2bUFyZyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSAoTWFuaXB1bGF0b3IpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fTUFOSVBVTEFUT1IpOwotCQlTdHJpbmcganZtQXJnID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fSlZNX0FSRyk7Ci0JCWlmIChqdm1BcmcgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9KVk1fQVJHLCBJRCkpOwotCQltYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKS5yZW1vdmVKdm1BcmcoanZtQXJnKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVN0cmluZyBqdm1BcmcgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9KVk1fQVJHKTsKLQkJaWYgKGp2bUFyZyA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX0pWTV9BUkcsIElEKSk7Ci0JCW1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLmFkZEp2bUFyZyhqdm1BcmcpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9SZW1vdmVQcm9ncmFtQXJndW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvUmVtb3ZlUHJvZ3JhbUFyZ3VtZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmMTIzNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9SZW1vdmVQcm9ncmFtQXJndW1lbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5FY2xpcHNlVG91Y2hwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVQcm9ncmFtQXJndW1lbnRBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInJlbW92ZVByb2dyYW1BcmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJU3RyaW5nIHByb2dyYW1BcmcgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9HUkFNX0FSRyk7Ci0JCWlmIChwcm9ncmFtQXJnID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPR1JBTV9BUkcsIElEKSk7Ci0KLQkJaWYgKHByb2dyYW1BcmcuZXF1YWxzKEFjdGlvbkNvbnN0YW50cy5QQVJNX0FSVElGQUNUKSkgewotCQkJdHJ5IHsKLQkJCQlwcm9ncmFtQXJnID0gVXRpbC5yZXNvbHZlQXJ0aWZhY3RQYXJhbShwYXJhbWV0ZXJzKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBlLmdldFN0YXR1cygpOwotCQkJfQotCQl9Ci0KLQkJbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkucmVtb3ZlUHJvZ3JhbUFyZyhwcm9ncmFtQXJnKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVN0cmluZyBwcm9ncmFtQXJnID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPR1JBTV9BUkcpOwotCQlpZiAocHJvZ3JhbUFyZyA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0dSQU1fQVJHLCBJRCkpOwotCi0JCWlmIChwcm9ncmFtQXJnLmVxdWFscyhBY3Rpb25Db25zdGFudHMuUEFSTV9BUlRJRkFDVCkpIHsKLQkJCXRyeSB7Ci0JCQkJcHJvZ3JhbUFyZyA9IFV0aWwucmVzb2x2ZUFydGlmYWN0UGFyYW0ocGFyYW1ldGVycyk7Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJCX0KLQkJfQotCi0JCW1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLmFkZFByb2dyYW1BcmcocHJvZ3JhbUFyZyk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1JlbW92ZVNvdXJjZUJ1bmRsZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9SZW1vdmVTb3VyY2VCdW5kbGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFiMWExNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1JlbW92ZVNvdXJjZUJ1bmRsZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBSZW1vdmVTb3VyY2VCdW5kbGVBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInJlbW92ZVNvdXJjZUJ1bmRsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIFJlbW92ZVNvdXJjZUJ1bmRsZUFjdGlvbi5yZW1vdmVTb3VyY2VCdW5kbGUocGFyYW1ldGVycyk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlyZXR1cm4gQWRkU291cmNlQnVuZGxlQWN0aW9uLmFkZFNvdXJjZUJ1bmRsZShwYXJhbWV0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgcmVtb3ZlU291cmNlQnVuZGxlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0ZJTEUpOwotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fSVUpOwotCQlTb3VyY2VNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChTb3VyY2VNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9TT1VSQ0VfQlVORExFUyk7Ci0JCVN0cmluZyBidW5kbGVJZCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX0JVTkRMRSk7Ci0JCWlmIChidW5kbGVJZCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX0JVTkRMRSwgSUQpKTsKLQotCQlJQXJ0aWZhY3RLZXlbXSBhcnRpZmFjdHMgPSBpdS5nZXRBcnRpZmFjdHMoKTsKLQkJaWYgKGFydGlmYWN0cyA9PSBudWxsIHx8IGFydGlmYWN0cy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLml1X2NvbnRhaW5zX25vX2FyaWZhY3RzLCBpdSkpOwotCi0JCUlBcnRpZmFjdEtleSBhcnRpZmFjdEtleSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXJ0aWZhY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYXJ0aWZhY3RzW2ldLnRvU3RyaW5nKCkuZXF1YWxzKGJ1bmRsZUlkKSkgewotCQkJCWFydGlmYWN0S2V5ID0gYXJ0aWZhY3RzW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChhcnRpZmFjdEtleSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5ub19tYXRjaGluZ19hcnRpZmFjdCwgYnVuZGxlSWQpKTsKLQotCQkvLyB0aGUgYnVuZGxlRmlsZSBtaWdodCBiZSBudWxsIGhlcmUsIHRoYXQncyBPSy4KLQkJRmlsZSBidW5kbGVGaWxlID0gVXRpbC5nZXRBcnRpZmFjdEZpbGUoYXJ0aWZhY3RLZXksIHByb2ZpbGUpOwotCi0JCXRyeSB7Ci0JCQltYW5pcHVsYXRvci5yZW1vdmVCdW5kbGUoYnVuZGxlRmlsZSwgYXJ0aWZhY3RLZXkuZ2V0SWQoKSwgYXJ0aWZhY3RLZXkuZ2V0VmVyc2lvbigpKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuY2Fubm90X2NvbmZpZ3VyZV9zb3VyY2VfYnVuZGxlLCBhcnRpZmFjdEtleSkpOwotCQl9Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1JtZGlyQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1JtZGlyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxZGMzN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9SbWRpckFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBSbWRpckFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAicm1kaXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCVN0cmluZyBwYXRoID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUEFUSCk7Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUEFUSCwgSUQpKTsKLQkJbmV3IEZpbGUocGF0aCkuZGVsZXRlKCk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJU3RyaW5nIHBhdGggPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QQVRIKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QQVRILCBJRCkpOwotCQluZXcgRmlsZShwYXRoKS5ta2RpcigpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9TZXRGcmFtZXdvcmtEZXBlbmRlbnRQcm9wZXJ0eUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9TZXRGcmFtZXdvcmtEZXBlbmRlbnRQcm9wZXJ0eUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmQ5ODBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvU2V0RnJhbWV3b3JrRGVwZW5kZW50UHJvcGVydHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLkVjbGlwc2VUb3VjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFNldEZyYW1ld29ya0RlcGVuZGVudFByb3BlcnR5QWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJzZXRGd0RlcGVuZGVudFByb3AiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJU3RyaW5nIHByb3BOYW1lID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPUF9OQU1FKTsKLQkJaWYgKHByb3BOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPUF9OQU1FLCBJRCkpOwotCQlTdHJpbmcgcHJvcFZhbHVlID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPUF9WQUxVRSk7Ci0JCWlmIChwcm9wVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9QX1ZBTFVFLCBJRCkpOwotCQlnZXRNZW1lbnRvKCkucHV0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BSRVZJT1VTX1ZBTFVFLCBtYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuZ2V0RndEZXBlbmRlbnRQcm9wKHByb3BOYW1lKSk7Ci0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5zZXRGd0RlcGVuZGVudFByb3AocHJvcE5hbWUsIHByb3BWYWx1ZSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSAoTWFuaXB1bGF0b3IpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fTUFOSVBVTEFUT1IpOwotCQlTdHJpbmcgcHJvcE5hbWUgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9QX05BTUUpOwotCQlpZiAocHJvcE5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9QX05BTUUsIElEKSk7Ci0JCVN0cmluZyBwcmV2aW91c1ZhbHVlID0gKFN0cmluZykgZ2V0TWVtZW50bygpLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUkVWSU9VU19WQUxVRSk7Ci0JCWlmIChwcmV2aW91c1ZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJFVklPVVNfVkFMVUUsIElEKSk7Ci0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5zZXRGd0RlcGVuZGVudFByb3AocHJvcE5hbWUsIHByZXZpb3VzVmFsdWUpOwotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9TZXRGcmFtZXdvcmtJbmRlcGVuZGVudFByb3BlcnR5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1NldEZyYW1ld29ya0luZGVwZW5kZW50UHJvcGVydHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkzZmY1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1NldEZyYW1ld29ya0luZGVwZW5kZW50UHJvcGVydHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLkVjbGlwc2VUb3VjaHBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLlV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFNldEZyYW1ld29ya0luZGVwZW5kZW50UHJvcGVydHlBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInNldEZ3SW5kZXBlbmRlbnRQcm9wIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVN0cmluZyBwcm9wTmFtZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfTkFNRSk7Ci0JCWlmIChwcm9wTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfTkFNRSwgSUQpKTsKLQkJU3RyaW5nIHByb3BWYWx1ZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfVkFMVUUpOwotCQlpZiAocHJvcFZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPUF9WQUxVRSwgSUQpKTsKLQkJZ2V0TWVtZW50bygpLnB1dChBY3Rpb25Db25zdGFudHMuUEFSTV9QUkVWSU9VU19WQUxVRSwgbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmdldEZ3RGVwZW5kZW50UHJvcChwcm9wTmFtZSkpOwotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkuc2V0RndJbmRlcGVuZGVudFByb3AocHJvcE5hbWUsIHByb3BWYWx1ZSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSAoTWFuaXB1bGF0b3IpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fTUFOSVBVTEFUT1IpOwotCQlTdHJpbmcgcHJvcE5hbWUgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9QX05BTUUpOwotCQlpZiAocHJvcE5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9QX05BTUUsIElEKSk7Ci0JCVN0cmluZyBwcmV2aW91c1ZhbHVlID0gKFN0cmluZykgZ2V0TWVtZW50bygpLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUkVWSU9VU19WQUxVRSk7Ci0JCWlmIChwcmV2aW91c1ZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJFVklPVVNfVkFMVUUsIElEKSk7Ci0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5zZXRGd0luZGVwZW5kZW50UHJvcChwcm9wTmFtZSwgcHJldmlvdXNWYWx1ZSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1NldExhdW5jaGVyTmFtZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvYWN0aW9ucy9TZXRMYXVuY2hlck5hbWVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJlODY5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1NldExhdW5jaGVyTmFtZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5lbmdpbmUuUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5FY2xpcHNlVG91Y2hwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgU2V0TGF1bmNoZXJOYW1lQWN0aW9uIGV4dGVuZHMgUHJvdmlzaW9uaW5nQWN0aW9uIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJzZXRMYXVuY2hlck5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElTdGF0dXMgY2hhbmdlTmFtZShTdHJpbmcgbmV3TmFtZSwgTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IsIFByb2ZpbGUgcHJvZmlsZSkgewotCQkvL2ZvcmNlIHRoZSBsb2FkIHRvIG1ha2Ugc3VyZSB3ZSByZWFkIHRoZSB2YWx1ZXMgaW4gdGhlIG9sZCBmaWxlbmFtZQotCQlJU3RhdHVzIHN0YXR1cyA9IEVjbGlwc2VUb3VjaHBvaW50LmxvYWRNYW5pcHVsYXRvcihtYW5pcHVsYXRvcik7Ci0JCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkKLQkJCXJldHVybiBzdGF0dXM7Ci0JCWdldE1lbWVudG8oKS5wdXQoRWNsaXBzZVRvdWNocG9pbnQuUFJPRklMRV9QUk9QX0xBVU5DSEVSX05BTUUsIHByb2ZpbGUuZ2V0UHJvcGVydHkoRWNsaXBzZVRvdWNocG9pbnQuUFJPRklMRV9QUk9QX0xBVU5DSEVSX05BTUUpKTsKLQkJcHJvZmlsZS5zZXRQcm9wZXJ0eShFY2xpcHNlVG91Y2hwb2ludC5QUk9GSUxFX1BST1BfTEFVTkNIRVJfTkFNRSwgbmV3TmFtZSk7Ci0JCW1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLnNldExhdW5jaGVyKFV0aWwuZ2V0TGF1bmNoZXJQYXRoKHByb2ZpbGUpKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVByb2ZpbGUgcHJvZmlsZSA9IChQcm9maWxlKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9GSUxFKTsKLQkJcmV0dXJuIGNoYW5nZU5hbWUoKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fTEFVTkNIRVJOQU1FKSwgbWFuaXB1bGF0b3IsIHByb2ZpbGUpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSAoTWFuaXB1bGF0b3IpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fTUFOSVBVTEFUT1IpOwotCQlQcm9maWxlIHByb2ZpbGUgPSAoUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPRklMRSk7Ci0JCXJldHVybiBjaGFuZ2VOYW1lKChTdHJpbmcpIGdldE1lbWVudG8oKS5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUFJPRklMRV9QUk9QX0xBVU5DSEVSX05BTUUpLCBtYW5pcHVsYXRvciwgcHJvZmlsZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvU2V0UHJvZ3JhbVByb3BlcnR5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1NldFByb2dyYW1Qcm9wZXJ0eUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTY1MjkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvU2V0UHJvZ3JhbVByb3BlcnR5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5FY2xpcHNlVG91Y2hwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBTZXRQcm9ncmFtUHJvcGVydHlBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInNldFByb2dyYW1Qcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSAoTWFuaXB1bGF0b3IpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fTUFOSVBVTEFUT1IpOwotCQlTdHJpbmcgcHJvcE5hbWUgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9QX05BTUUpOwotCQlpZiAocHJvcE5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9QX05BTUUsIElEKSk7Ci0JCVN0cmluZyBwcm9wVmFsdWUgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9QX1ZBTFVFKTsKLQkJaWYgKHByb3BWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfVkFMVUUsIElEKSk7Ci0JCWdldE1lbWVudG8oKS5wdXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJFVklPVVNfVkFMVUUsIG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRGd0RlcGVuZGVudFByb3AocHJvcE5hbWUpKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnNldEZ3RGVwZW5kZW50UHJvcChwcm9wTmFtZSwgcHJvcFZhbHVlKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCVN0cmluZyBwcm9wTmFtZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfTkFNRSk7Ci0JCWlmIChwcm9wTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST1BfTkFNRSwgSUQpKTsKLQkJU3RyaW5nIHByZXZpb3VzVmFsdWUgPSAoU3RyaW5nKSBnZXRNZW1lbnRvKCkuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BSRVZJT1VTX1ZBTFVFKTsKLQkJaWYgKHByZXZpb3VzVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9QUkVWSU9VU19WQUxVRSwgSUQpKTsKLQkJbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLnNldEZ3RGVwZW5kZW50UHJvcChwcm9wTmFtZSwgcHJldmlvdXNWYWx1ZSk7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1NldFN0YXJ0TGV2ZWxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvU2V0U3RhcnRMZXZlbEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmVkMTMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvU2V0U3RhcnRMZXZlbEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5FY2xpcHNlVG91Y2hwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4uQnVuZGxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLk1hbmlwdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIFNldFN0YXJ0TGV2ZWxBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInNldFN0YXJ0TGV2ZWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BST0ZJTEUpOwotCQlNYW5pcHVsYXRvciBtYW5pcHVsYXRvciA9IChNYW5pcHVsYXRvcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9NQU5JUFVMQVRPUik7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9JVSk7Ci0JCVN0cmluZyBzdGFydExldmVsID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fU1RBUlRfTEVWRUwpOwotCQlpZiAoc3RhcnRMZXZlbCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1ldGVyX25vdF9zZXQsIEFjdGlvbkNvbnN0YW50cy5QQVJNX1NUQVJUX0xFVkVMLCBJRCkpOwotCi0JCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IGl1LmdldEFydGlmYWN0cygpOwotCQlpZiAoYXJ0aWZhY3RzID09IG51bGwgfHwgYXJ0aWZhY3RzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuaXVfY29udGFpbnNfbm9fYXJpZmFjdHMsIGl1KSk7Ci0KLQkJSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5ID0gYXJ0aWZhY3RzWzBdOwotCQlGaWxlIGJ1bmRsZUZpbGUgPSBVdGlsLmdldEFydGlmYWN0RmlsZShhcnRpZmFjdEtleSwgcHJvZmlsZSk7Ci0JCWlmIChidW5kbGVGaWxlID09IG51bGwgfHwgIWJ1bmRsZUZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5hcnRpZmFjdF9maWxlX25vdF9mb3VuZCwgYXJ0aWZhY3RLZXkpKTsKLQotCQlTdHJpbmcgbWFuaWZlc3QgPSBVdGlsLmdldE1hbmlmZXN0KGl1LmdldFRvdWNocG9pbnREYXRhKCkpOwotCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLm1pc3NpbmdfbWFuaWZlc3QsIGl1KSk7Ci0KLQkJQnVuZGxlSW5mbyBidW5kbGVJbmZvID0gVXRpbC5jcmVhdGVCdW5kbGVJbmZvKGJ1bmRsZUZpbGUsIG1hbmlmZXN0KTsKLQkJaWYgKGJ1bmRsZUluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLmZhaWxlZF9idW5kbGVpbmZvLCBpdSkpOwotCi0JCUJ1bmRsZUluZm9bXSBidW5kbGVzID0gbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYnVuZGxlc1tpXS5lcXVhbHMoYnVuZGxlSW5mbykpIHsKLQkJCQlnZXRNZW1lbnRvKCkucHV0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BSRVZJT1VTX1NUQVJUX0xFVkVMLCBuZXcgSW50ZWdlcihidW5kbGVzW2ldLmdldFN0YXJ0TGV2ZWwoKSkpOwotCQkJCXRyeSB7Ci0JCQkJCWJ1bmRsZXNbaV0uc2V0U3RhcnRMZXZlbChJbnRlZ2VyLnBhcnNlSW50KHN0YXJ0TGV2ZWwpKTsKLQkJCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5lcnJvcl9wYXJzaW5nX3N0YXJ0bGV2ZWwsIHN0YXJ0TGV2ZWwsIGJ1bmRsZXNbaV0uZ2V0U3ltYm9saWNOYW1lKCkpLCBlKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlJUHJvZmlsZSBwcm9maWxlID0gKElQcm9maWxlKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9QUk9GSUxFKTsKLQkJTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IgPSAoTWFuaXB1bGF0b3IpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fTUFOSVBVTEFUT1IpOwotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fSVUpOwotCi0JCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IGl1LmdldEFydGlmYWN0cygpOwotCQlpZiAoYXJ0aWZhY3RzID09IG51bGwgfHwgYXJ0aWZhY3RzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuaXVfY29udGFpbnNfbm9fYXJpZmFjdHMsIGl1KSk7Ci0KLQkJSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5ID0gYXJ0aWZhY3RzWzBdOwotCQlGaWxlIGJ1bmRsZUZpbGUgPSBVdGlsLmdldEFydGlmYWN0RmlsZShhcnRpZmFjdEtleSwgcHJvZmlsZSk7Ci0JCWlmIChidW5kbGVGaWxlID09IG51bGwgfHwgIWJ1bmRsZUZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5hcnRpZmFjdF9maWxlX25vdF9mb3VuZCwgYXJ0aWZhY3RLZXkpKTsKLQotCQlTdHJpbmcgbWFuaWZlc3QgPSBVdGlsLmdldE1hbmlmZXN0KGl1LmdldFRvdWNocG9pbnREYXRhKCkpOwotCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLm1pc3NpbmdfbWFuaWZlc3QsIGl1KSk7Ci0KLQkJQnVuZGxlSW5mbyBidW5kbGVJbmZvID0gVXRpbC5jcmVhdGVCdW5kbGVJbmZvKGJ1bmRsZUZpbGUsIG1hbmlmZXN0KTsKLQkJaWYgKGJ1bmRsZUluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLmZhaWxlZF9idW5kbGVpbmZvLCBpdSkpOwotCi0JCUJ1bmRsZUluZm9bXSBidW5kbGVzID0gbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpLmdldEJ1bmRsZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBidW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYnVuZGxlc1tpXS5lcXVhbHMoYnVuZGxlSW5mbykpIHsKLQkJCQlJbnRlZ2VyIHByZXZpb3VzU3RhcnRMZXZlbCA9IChJbnRlZ2VyKSBnZXRNZW1lbnRvKCkuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX1BSRVZJT1VTX1NUQVJUX0xFVkVMKTsKLQkJCQlpZiAocHJldmlvdXNTdGFydExldmVsICE9IG51bGwpCi0JCQkJCWJ1bmRsZXNbaV0uc2V0U3RhcnRMZXZlbChwcmV2aW91c1N0YXJ0TGV2ZWwuaW50VmFsdWUoKSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvVW5pbnN0YWxsQnVuZGxlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1VuaW5zdGFsbEJ1bmRsZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWYxZWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvVW5pbnN0YWxsQnVuZGxlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuYWN0aW9uczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuRWNsaXBzZVRvdWNocG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50LmVjbGlwc2UuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmZyYW1ld29ya2FkbWluLkJ1bmRsZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi5NYW5pcHVsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBVbmluc3RhbGxCdW5kbGVBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInVuaW5zdGFsbEJ1bmRsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIFVuaW5zdGFsbEJ1bmRsZUFjdGlvbi51bmluc3RhbGxCdW5kbGUocGFyYW1ldGVycyk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQlyZXR1cm4gSW5zdGFsbEJ1bmRsZUFjdGlvbi5pbnN0YWxsQnVuZGxlKHBhcmFtZXRlcnMpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSVN0YXR1cyB1bmluc3RhbGxCdW5kbGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fUFJPRklMRSk7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9JVSk7Ci0JCU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yID0gKE1hbmlwdWxhdG9yKSBwYXJhbWV0ZXJzLmdldChFY2xpcHNlVG91Y2hwb2ludC5QQVJNX01BTklQVUxBVE9SKTsKLQkJU3RyaW5nIGJ1bmRsZUlkID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoQWN0aW9uQ29uc3RhbnRzLlBBUk1fQlVORExFKTsKLQkJaWYgKGJ1bmRsZUlkID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fQlVORExFLCBJRCkpOwotCi0JCS8vVE9ETzogZXZlbnR1YWxseSByZW1vdmUgdGhpcy4gV2hhdCBpcyBhIGZyYWdtZW50IGRvaW5nIGhlcmU/PwotCQlpZiAoaXUuaXNGcmFnbWVudCgpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIldoYXQgaXMgYSBmcmFnbWVudCBkb2luZyBoZXJlISEhIC0tICIgKyBpdSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0KLQkJSUFydGlmYWN0S2V5W10gYXJ0aWZhY3RzID0gaXUuZ2V0QXJ0aWZhY3RzKCk7Ci0JCWlmIChhcnRpZmFjdHMgPT0gbnVsbCB8fCBhcnRpZmFjdHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5pdV9jb250YWluc19ub19hcmlmYWN0cywgaXUpKTsKLQotCQlJQXJ0aWZhY3RLZXkgYXJ0aWZhY3RLZXkgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFydGlmYWN0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGFydGlmYWN0c1tpXS50b1N0cmluZygpLmVxdWFscyhidW5kbGVJZCkpIHsKLQkJCQlhcnRpZmFjdEtleSA9IGFydGlmYWN0c1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpZiAoYXJ0aWZhY3RLZXkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMubm9fbWF0Y2hpbmdfYXJ0aWZhY3QsIGJ1bmRsZUlkKSk7Ci0KLQkJLy8gdGhlIGJ1bmRsZUZpbGUgbWlnaHQgYmUgbnVsbCBoZXJlLCB0aGF0J3MgT0suCi0JCUZpbGUgYnVuZGxlRmlsZSA9IFV0aWwuZ2V0QXJ0aWZhY3RGaWxlKGFydGlmYWN0S2V5LCBwcm9maWxlKTsKLQotCQlTdHJpbmcgbWFuaWZlc3QgPSBVdGlsLmdldE1hbmlmZXN0KGl1LmdldFRvdWNocG9pbnREYXRhKCkpOwotCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLm1pc3NpbmdfbWFuaWZlc3QsIGl1KSk7Ci0KLQkJQnVuZGxlSW5mbyBidW5kbGVJbmZvID0gVXRpbC5jcmVhdGVCdW5kbGVJbmZvKGJ1bmRsZUZpbGUsIG1hbmlmZXN0KTsKLQkJaWYgKGJ1bmRsZUluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLmZhaWxlZF9idW5kbGVpbmZvLCBpdSkpOwotCQltYW5pcHVsYXRvci5nZXRDb25maWdEYXRhKCkucmVtb3ZlQnVuZGxlKGJ1bmRsZUluZm8pOwotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL1VuaW5zdGFsbEZlYXR1cmVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWVhMzBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvVW5pbnN0YWxsRmVhdHVyZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5lY2xpcHNlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUFydGlmYWN0S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgVW5pbnN0YWxsRmVhdHVyZUFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAidW5pbnN0YWxsRmVhdHVyZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJcmV0dXJuIFVuaW5zdGFsbEZlYXR1cmVBY3Rpb24udW5pbnN0YWxsRmVhdHVyZShwYXJhbWV0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyB1bmRvKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCXJldHVybiBJbnN0YWxsRmVhdHVyZUFjdGlvbi5pbnN0YWxsRmVhdHVyZShwYXJhbWV0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgdW5pbnN0YWxsRmVhdHVyZShNYXAgcGFyYW1ldGVycykgewotCQlJSW5zdGFsbGFibGVVbml0IGl1ID0gKElJbnN0YWxsYWJsZVVuaXQpIHBhcmFtZXRlcnMuZ2V0KEVjbGlwc2VUb3VjaHBvaW50LlBBUk1fSVUpOwotCQlQbGF0Zm9ybUNvbmZpZ3VyYXRpb25XcmFwcGVyIGNvbmZpZ3VyYXRpb24gPSAoUGxhdGZvcm1Db25maWd1cmF0aW9uV3JhcHBlcikgcGFyYW1ldGVycy5nZXQoRWNsaXBzZVRvdWNocG9pbnQuUEFSTV9QTEFURk9STV9DT05GSUdVUkFUSU9OKTsKLQkJU3RyaW5nIGZlYXR1cmUgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9GRUFUVVJFKTsKLQkJU3RyaW5nIGZlYXR1cmVJZCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KEFjdGlvbkNvbnN0YW50cy5QQVJNX0ZFQVRVUkVfSUQpOwotCQlTdHJpbmcgZmVhdHVyZVZlcnNpb24gPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChBY3Rpb25Db25zdGFudHMuUEFSTV9GRUFUVVJFX1ZFUlNJT04pOwotCi0JCUlBcnRpZmFjdEtleVtdIGFydGlmYWN0cyA9IGl1LmdldEFydGlmYWN0cygpOwotCQlpZiAoYXJ0aWZhY3RzID09IG51bGwgfHwgYXJ0aWZhY3RzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIFV0aWwuY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuaXVfY29udGFpbnNfbm9fYXJpZmFjdHMsIGl1KSk7Ci0KLQkJSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5ID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnRpZmFjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChhcnRpZmFjdHNbaV0udG9TdHJpbmcoKS5lcXVhbHMoZmVhdHVyZSkpIHsKLQkJCQlhcnRpZmFjdEtleSA9IGFydGlmYWN0c1tpXTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCWlmIChmZWF0dXJlSWQgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtZXRlcl9ub3Rfc2V0LCBBY3Rpb25Db25zdGFudHMuUEFSTV9GRUFUVVJFX0lELCBJRCkpOwotCQllbHNlIGlmIChBY3Rpb25Db25zdGFudHMuUEFSTV9ERUZBVUxUX1ZBTFVFLmVxdWFscyhmZWF0dXJlSWQpKSB7Ci0JCQlmZWF0dXJlSWQgPSBhcnRpZmFjdEtleS5nZXRJZCgpOwotCQl9Ci0KLQkJaWYgKGZlYXR1cmVWZXJzaW9uID09IG51bGwpCi0JCQlyZXR1cm4gVXRpbC5jcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbWV0ZXJfbm90X3NldCwgQWN0aW9uQ29uc3RhbnRzLlBBUk1fRkVBVFVSRV9WRVJTSU9OLCBJRCkpOwotCQllbHNlIGlmIChBY3Rpb25Db25zdGFudHMuUEFSTV9ERUZBVUxUX1ZBTFVFLmVxdWFscyhmZWF0dXJlVmVyc2lvbikpIHsKLQkJCWZlYXR1cmVWZXJzaW9uID0gYXJ0aWZhY3RLZXkuZ2V0VmVyc2lvbigpLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlyZXR1cm4gY29uZmlndXJhdGlvbi5yZW1vdmVGZWF0dXJlRW50cnkoZmVhdHVyZUlkLCBmZWF0dXJlVmVyc2lvbik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9lY2xpcHNlL2FjdGlvbnMvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUyN2E2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9hY3Rpb25zL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWFydGlmYWN0X2ZpbGVfbm90X2ZvdW5kPVRoZSBhcnRpZmFjdCBmaWxlIGZvciB7MH0gd2FzIG5vdCBmb3VuZC4KLWFydGlmYWN0X25vdF9kaXJlY3Rvcnk9VGhlIGFydGlmYWN0IHswfSBpcyBub3QgYSBkaXJlY3RvcnkuCi1hY3Rpb25fbm90X2luc3RhbnRpYXRlZD1BY3Rpb24gY291bGQgbm90IGJlIGluc3RhbnRpYXRlZCBmb3IgYWN0aW9uIGlkOiB7MH0uCi1wYXJhbWV0ZXJfbm90X3NldD1UaGUgXCJ7MH1cIiBwYXJhbWV0ZXIgd2FzIG5vdCBzZXQgaW4gdGhlIFwiezF9XCIgYWN0aW9uLgotaXVfY29udGFpbnNfbm9fYXJpZmFjdHM9SW5zdGFsbGFibGUgdW5pdCBjb250YWlucyBubyBhcnRpZmFjdHM6IHswfS4KLW5vX21hdGNoaW5nX2FydGlmYWN0PU5vIG1hdGNoaW5nIGFydGlmYWN0IGZvdW5kIGZvcjogezB9LgotbWlzc2luZ19tYW5pZmVzdD1UaGUgbWFuaWZlc3QgaXMgbWlzc2luZyBmb3I6IHswfS4KLWZhaWxlZF9idW5kbGVpbmZvPUZhaWxlZCB0byBjcmVhdGUgYnVuZGxlSW5mbyBmb3I6IHswfS4KLWNhbm5vdF9jb25maWd1cmVfc291cmNlX2J1bmRsZT1DYW5ub3QgY29uZmlndXJlIHswfSBhcyBhIHNvdXJjZSBidW5kbGUuCi1lcnJvcl9wYXJzaW5nX3N0YXJ0bGV2ZWw9RXJyb3IgcGFyc2luZyBzdGFydCBsZXZlbDogezB9IGZvciBidW5kbGU6IHsxfS4KLW5vX2J1bmRsZV9wb29sPU5vIGJ1bmRsZSBwb29sIGRlZmluZWQgZm9yIHByb2ZpbGU6IHswfS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L2VjbGlwc2UvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjNzIxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvZWNsaXBzZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1lcnJvcl9sb2FkaW5nX21hbmlwdWxhdG9yPUVycm9yIHdoaWxlIGxvYWRpbmcgbWFuaXB1bGF0b3IuCi1mYWlsZWRfYWNxdWlyZV9mcmFtZXdvcmtfbWFuaXB1bGF0b3I9Q291bGQgbm90IGFjcXVpcmUgdGhlIGZyYW1ld29yayBtYW5pcHVsYXRvciBzZXJ2aWNlLgotZmFpbGVkX3ByZXBhcmVJVT1GYWlsZWQgdG8gcHJlcGFyZSBwYXJ0aWFsIElVOiB7MH0uCi1mZWF0dXJlX25vdF9mb3VuZD1BIGZlYXR1cmUgd2l0aCB0aGUgc3BlY2lmaWVkIGlkIHdhcyBub3QgZm91bmQuCi1lcnJvcl9zYXZpbmdfbWFuaXB1bGF0b3I9RXJyb3Igc2F2aW5nIG1hbmlwdWxhdG9yLgotZXJyb3Jfc2F2aW5nX3BsYXRmb3JtX2NvbmZpZ3VyYXRpb249RXJyb3Igc2F2aW5nIHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uCi1lcnJvcl9zYXZpbmdfc291cmNlX2J1bmRsZXNfbGlzdD1FcnJvciBzYXZpbmcgc291cmNlIGJ1bmRsZXMgbGlzdC4KLWVycm9yX2NvbnN0cnVjdGluZ19wbGF0Zm9ybV9jb25maWd1cmF0aW9uX3VybD1FcnJvciBjb25zdHJ1Y3RpbmcgcGxhdGZvcm0gY29uZmlndXJhdGlvbiB1cmwuCi1lcnJvcl9wYXJzaW5nX2NvbmZpZ3VyYXRpb249RXJyb3IgcGFyc2luZyBwbGF0Zm9ybSBjb25maWd1cmF0aW9uLgotZ2VuZXJhdG9yX25vdF9hdmFpbGFibGU9VGhlIHBhcnRpYWwgSVUgY291bGQgbm90IGJlIHVwZGF0ZWQuIEdlbmVyYXRvciBub3QgYXZhaWxhYmxlOiB7MH0uCi1hcnRpZmFjdF9maWxlX25vdF9mb3VuZD1UaGUgYXJ0aWZhY3QgZmlsZSBmb3IgezB9IHdhcyBub3QgZm91bmQuCi1pdV9jb250YWluc19ub19hcmlmYWN0cz1JbnN0YWxsYWJsZSB1bml0IGNvbnRhaW5zIG5vIGFydGlmYWN0czogezB9LgotYXJ0aWZhY3RfcmV0cmlldmFsX3Vuc3VwcG9ydGVkPVJlcG9zaXRvcnkgZG9lcyBub3Qgc3VwcG9ydCBhcnRpZmFjdCByZXRyaWV2YWwKLWJ1bmRsZV9wb29sX25vdF93cml0ZWFibGU9QnVuZGxlIHBvb2wgcmVwb3NpdG9yeSBub3Qgd3JpdGVhYmxlOiB7MH0KLUJ1bmRsZVBvb2w9QnVuZGxlIHBvb2wKLWNhbm5vdF9jYWxjdWxhdGVfZXh0ZW5zaW9uX2xvY2F0aW9uPVVuYWJsZSB0byBjYWxjdWxhdGUgZXh0ZW5zaW9uIGxvY2F0aW9uIGZvcjogezB9LgotY2Fubm90X2NyZWF0ZV91cmxfZnJvbV9maWxlPVVuYWJsZSB0byBjcmVhdGUgVVJMIGZyb20gZmlsZTogezB9LgotY29uZmlnX2Rpcl9ub3RfYWJzb2x1dGU9Q29uZmlndXJhdGlvbiBkaXJlY3RvcnkgaXMgbm90IGFic29sdXRlLgotcGFyZW50X2Rpcl9mZWF0dXJlcz1QYXJlbnQgZGlyZWN0b3J5IHNob3VsZCBiZSAiZmVhdHVyZXMiOiB7MH0uCi1wbGF0Zm9ybV9jb25maWdfdW5hdmFpbGFibGU9UGxhdGZvcm0gY29uZmlndXJhdGlvbiBub3QgYXZhaWxhYmxlLgotcGxhdGZvcm1hZG1pbl9ub3RfcmVnaXN0ZXJlZD1QbGF0Zm9ybUFkbWluIG5vdCByZWdpc3RlcmVkLgotcHJvdG9jb2xfaGFuZGxlcl9lcnJvcj1ObyBVUkwgcHJvdG9jb2wgaGFuZGxlci4KLXVuZXhwZWN0ZWRfcHJlcGFyZWl1X2Vycm9yPVVuZXhwZWN0ZWQgc3RhdGU6IHByZXBhcmVJVQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2MzZGY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL0NvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci0KLS8qKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdGlvbiB7Ci0KLQlwcml2YXRlIExpc3Qgc2l0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JU3RyaW5nIGRhdGU7Ci0JYm9vbGVhbiB0cmFuc2llbnRQcm9wZXJ0eTsKLQlTdHJpbmcgdmVyc2lvbjsKLQlTdHJpbmcgc2hhcmVkX3VyOwotCi0JcHVibGljIHN0YXRpYyBDb25maWd1cmF0aW9uIGxvYWQoRmlsZSBsb2NhdGlvbiwgVVJMIG9zZ2lJbnN0YWxsQXJlYSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBDb25maWd1cmF0aW9uUGFyc2VyLnBhcnNlKGxvY2F0aW9uLCBvc2dpSW5zdGFsbEFyZWEpOwotCX0KLQotCXB1YmxpYyBDb25maWd1cmF0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoRmlsZSBsb2NhdGlvbiwgVVJMIG9zZ2lJbnN0YWxsQXJlYSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUNvbmZpZ3VyYXRpb25Xcml0ZXIuc2F2ZSh0aGlzLCBsb2NhdGlvbiwgb3NnaUluc3RhbGxBcmVhKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNoYXJlZFVSKCkgewotCQlyZXR1cm4gc2hhcmVkX3VyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNoYXJlZFVSKFN0cmluZyB2YWx1ZSkgewotCQlzaGFyZWRfdXIgPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRTaXRlcygpIHsKLQkJcmV0dXJuIHNpdGVzOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZChTaXRlIHNpdGUpIHsKLQkJc2l0ZXMuYWRkKHNpdGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0ZSgpIHsKLQkJcmV0dXJuIGRhdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGF0ZShTdHJpbmcgZGF0ZSkgewotCQl0aGlzLmRhdGUgPSBkYXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZhbHVlKSB7Ci0JCXZlcnNpb24gPSB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRyYW5zaWVudChib29sZWFuIHZhbHVlKSB7Ci0JCXRyYW5zaWVudFByb3BlcnR5ID0gdmFsdWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnQoKSB7Ci0JCXJldHVybiB0cmFuc2llbnRQcm9wZXJ0eTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9Db25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9Db25maWd1cmF0aW9uQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZmEyYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvQ29uZmlndXJhdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGU7Ci0KLS8qKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENvbmZpZ3VyYXRpb25Db25zdGFudHMgewotCi0JZmluYWwgU3RyaW5nIEVMRU1FTlRfQ09ORklHID0gImNvbmZpZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgRUxFTUVOVF9GRUFUVVJFID0gImZlYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIEVMRU1FTlRfU0lURSA9ICJzaXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JZmluYWwgU3RyaW5nIEFUVFJJQlVURV9BUFBMSUNBVElPTiA9ICJhcHBsaWNhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0RBVEUgPSAiZGF0ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0VOQUJMRUQgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgQVRUUklCVVRFX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTElOS0ZJTEUgPSAibGlua2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIEFUVFJJQlVURV9MSVNUID0gImxpc3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIEFUVFJJQlVURV9QTFVHSU5fSURFTlRJRklFUiA9ICJwbHVnaW4taWRlbnRpZmllciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1BMVUdJTl9WRVJTSU9OID0gInBsdWdpbi12ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBBVFRSSUJVVEVfUFJJTUFSWSA9ICJwcmltYXJ5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBBVFRSSUJVVEVfUE9MSUNZID0gInBvbGljeSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1JPT1QgPSAicm9vdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1NIQVJFRF9VUiA9ICJzaGFyZWRfdXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIEFUVFJJQlVURV9UUkFOU0lFTlQgPSAidHJhbnNpZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVVBEQVRFQUJMRSA9ICJ1cGRhdGVhYmxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBBVFRSSUJVVEVfVVJMID0gInVybCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZFUlNJT04gPSAidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvQ29uZmlndXJhdGlvblBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvQ29uZmlndXJhdGlvblBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjI4YjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL0NvbmZpZ3VyYXRpb25QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcudzNjLmRvbS4qOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBQYXJzZXIgZm9yIHBsYXRmb3JtLnhtbCBmaWxlcy4gCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25QYXJzZXIgaW1wbGVtZW50cyBDb25maWd1cmF0aW9uQ29uc3RhbnRzIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFBMQVRGT1JNX0JBU0UgPSAicGxhdGZvcm06L2Jhc2UvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgVVJMIG9zZ2lJbnN0YWxsQXJlYTsKLQotCS8qCi0JICogUGFyc2UgdGhlIGdpdmVuIGZpbGUgaGFuZGxlIHdoaWNoIHBvaW50cyB0byBhIHBsYXRmb3JtLnhtbCBmaWxlIGFuZCBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29uZmlndXJhdGlvbiBwYXJzZShGaWxlIGZpbGUsIFVSTCBvc2dpSW5zdGFsbEFyZWEpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IENvbmZpZ3VyYXRpb25QYXJzZXIob3NnaUluc3RhbGxBcmVhKS5pbnRlcm5hbFBhcnNlKGZpbGUpOwotCX0KLQotCXByaXZhdGUgQ29uZmlndXJhdGlvblBhcnNlcihVUkwgb3NnaUluc3RhbGxBcmVhKSB7Ci0JCXRoaXMub3NnaUluc3RhbGxBcmVhID0gb3NnaUluc3RhbGxBcmVhOwotCX0KLQotCS8qCi0JICogQ3JlYXRlIGEgZmVhdHVyZSBvYmplY3QgYmFzZWQgb24gdGhlIGdpdmVuIERPTSBub2RlLiAKLQkgKiBSZXR1cm4gdGhlIG5ldyBmZWF0dXJlLgotCSAqLwotCXByaXZhdGUgRmVhdHVyZSBjcmVhdGVGZWF0dXJlKE5vZGUgbm9kZSwgU2l0ZSBzaXRlKSB7Ci0JCUZlYXR1cmUgcmVzdWx0ID0gbmV3IEZlYXR1cmUoc2l0ZSk7Ci0JCVN0cmluZyBpZCA9IGdldEF0dHJpYnV0ZShub2RlLCBBVFRSSUJVVEVfSUQpOwotCQlpZiAoaWQgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRJZChpZCk7Ci0JCVN0cmluZyB1cmwgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1VSTCk7Ci0JCWlmICh1cmwgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRVcmwodXJsKTsKLQkJU3RyaW5nIHZlcnNpb24gPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1ZFUlNJT04pOwotCQlpZiAodmVyc2lvbiAhPSBudWxsKQotCQkJcmVzdWx0LnNldFZlcnNpb24odmVyc2lvbik7Ci0JCVN0cmluZyBwbHVnaW5JZGVudGlmaWVyID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVFJJQlVURV9QTFVHSU5fSURFTlRJRklFUik7Ci0JCWlmIChwbHVnaW5JZGVudGlmaWVyICE9IG51bGwpCi0JCQlyZXN1bHQuc2V0UGx1Z2luSWRlbnRpZmllcihwbHVnaW5JZGVudGlmaWVyKTsKLQkJU3RyaW5nIHBsdWdpblZlcnNpb24gPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1BMVUdJTl9WRVJTSU9OKTsKLQkJLy8gcGx1Zy1pbiB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBmZWF0dXJlIHZlcnNpb24gaWYgaXQgaXMgbWlzc2luZwotCQlpZiAocGx1Z2luVmVyc2lvbiA9PSBudWxsKQotCQkJcGx1Z2luVmVyc2lvbiA9IHZlcnNpb247Ci0JCWlmIChwbHVnaW5WZXJzaW9uICE9IG51bGwpCi0JCQlyZXN1bHQuc2V0UGx1Z2luVmVyc2lvbihwbHVnaW5WZXJzaW9uKTsKLQkJU3RyaW5nIGFwcGxpY2F0aW9uID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVFJJQlVURV9BUFBMSUNBVElPTik7Ci0JCWlmIChhcHBsaWNhdGlvbiAhPSBudWxsKQotCQkJcmVzdWx0LnNldEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uKTsKLQotCQkvLyBnZXQgcHJpbWFyeSBmbGFnCi0JCVN0cmluZyBmbGFnID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVFJJQlVURV9QUklNQVJZKTsKLQkJaWYgKGZsYWcgIT0gbnVsbCAmJiBCb29sZWFuLnZhbHVlT2YoZmxhZykuYm9vbGVhblZhbHVlKCkpCi0JCQlyZXN1bHQuc2V0UHJpbWFyeSh0cnVlKTsKLQotCQkvLyBnZXQgaW5zdGFsbCBsb2NhdGlvbnMKLQkJU3RyaW5nIGxvY2F0aW9ucyA9IGdldEF0dHJpYnV0ZShub2RlLCBBVFRSSUJVVEVfUk9PVCk7Ci0JCWlmIChsb2NhdGlvbnMgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobG9jYXRpb25zLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQlBcnJheUxpc3Qgcm9vdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCXRyeSB7Ci0JCQkJCVVSTCByb290RW50cnkgPSBuZXcgVVJMKHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCkpOwotCQkJCQlyb290TGlzdC5hZGQocm9vdEVudHJ5KTsKLQkJCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkvLyBza2lwIGJhZCBlbnRyaWVzIC4uLgotCQkJCX0KLQkJCX0KLQkJCVVSTFtdIHJvb3RzID0gKFVSTFtdKSByb290TGlzdC50b0FycmF5KG5ldyBVUkxbcm9vdExpc3Quc2l6ZSgpXSk7Ci0JCQlyZXN1bHQuc2V0Um9vdHMocm9vdHMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSB0aGUgZmVhdHVyZXMgZnJvbSB0aGUgZ2l2ZW4gRE9NIG5vZGUuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUZlYXR1cmVzKE5vZGUgbm9kZSwgU2l0ZSBzaXRlKSB7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFFTEVNRU5UX0ZFQVRVUkUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZC5nZXROb2RlTmFtZSgpKSkKLQkJCQljb250aW51ZTsKLQkJCUZlYXR1cmUgZmVhdHVyZSA9IGNyZWF0ZUZlYXR1cmUoY2hpbGQsIHNpdGUpOwotCQkJaWYgKGZlYXR1cmUgIT0gbnVsbCkKLQkJCQlzaXRlLmFkZEZlYXR1cmUoZmVhdHVyZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIENyZWF0ZSBhIHNpdGUgYmFzZWQgb24gdGhlIGdpdmVuIERPTSBub2RlLgotCSAqLwotCXByaXZhdGUgU2l0ZSBjcmVhdGVTaXRlKE5vZGUgbm9kZSkgewotCQlTaXRlIHJlc3VsdCA9IG5ldyBTaXRlKCk7Ci0JCVN0cmluZyBwb2xpY3kgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1BPTElDWSk7Ci0JCWlmIChwb2xpY3kgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRQb2xpY3kocG9saWN5KTsKLQkJU3RyaW5nIGVuYWJsZWQgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX0VOQUJMRUQpOwotCQlpZiAoZW5hYmxlZCAhPSBudWxsKQotCQkJcmVzdWx0LnNldEVuYWJsZWQoQm9vbGVhbi52YWx1ZU9mKGVuYWJsZWQpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJU3RyaW5nIHVwZGF0ZWFibGUgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1VQREFURUFCTEUpOwotCQlpZiAodXBkYXRlYWJsZSAhPSBudWxsKQotCQkJcmVzdWx0LnNldFVwZGF0ZWFibGUoQm9vbGVhbi52YWx1ZU9mKHVwZGF0ZWFibGUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJU3RyaW5nIHVybCA9IGdldEF0dHJpYnV0ZShub2RlLCBBVFRSSUJVVEVfVVJMKTsKLQkJaWYgKHVybCAhPSBudWxsKQotCQkJcmVzdWx0LnNldFVybChnZXRMb2NhdGlvbih1cmwpKTsKLQkJU3RyaW5nIGxpbmtGaWxlID0gZ2V0QXR0cmlidXRlKG5vZGUsIEFUVFJJQlVURV9MSU5LRklMRSk7Ci0JCWlmIChsaW5rRmlsZSAhPSBudWxsKQotCQkJcmVzdWx0LnNldExpbmtGaWxlKGxpbmtGaWxlKTsKLQkJU3RyaW5nIGxpc3QgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX0xJU1QpOwotCQlpZiAobGlzdCAhPSBudWxsKQotCQkJZm9yIChTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaXN0LCAiLCIpOyB0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpOykgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdC5hZGRQbHVnaW4odG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJY3JlYXRlRmVhdHVyZXMobm9kZSwgcmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIENvbnZlcnQgdGhlIGdpdmVuIHVybCBzdHJpbmcgdG8gYW4gYWJzb2x1dGUgdXJsLiBJZiB0aGUgc3RyaW5nIGlzIAotCSAqIHBsYXRmb3JtOi9iYXNlLyB0aGVuIHJldHVybiBhIHN0cmluZyB3aGljaCByZXByZXNlbnRzIHRoZSBvc2dpCi0JICogaW5zdGFsbCBhcmVhLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uKFN0cmluZyB1cmxTdHJpbmcpIHsKLQkJaWYgKG9zZ2lJbnN0YWxsQXJlYSA9PSBudWxsKQotCQkJcmV0dXJuIHVybFN0cmluZzsKLQkJaWYgKFBMQVRGT1JNX0JBU0UuZXF1YWxzKHVybFN0cmluZykpCi0JCQlyZXR1cm4gb3NnaUluc3RhbGxBcmVhLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCXJldHVybiBVdGlscy5tYWtlQWJzb2x1dGUodXJsU3RyaW5nLCBvc2dpSW5zdGFsbEFyZWEpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBhdHRyaWJ1dGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgb3IgbnVsbCBpZiBpdCBkb2VzCi0JICogbm90IGV4aXN0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEF0dHJpYnV0ZShOb2RlIG5vZGUsIFN0cmluZyBuYW1lKSB7Ci0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCU5vZGUgdGVtcCA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQlyZXR1cm4gdGVtcCA9PSBudWxsID8gbnVsbCA6IHRlbXAuZ2V0Tm9kZVZhbHVlKCk7Ci0JfQotCi0JLyoKLQkgKiBMb2FkIHRoZSBnaXZlbiBmaWxlIGludG8gYSBET00gZG9jdW1lbnQuCi0JICovCi0JcHJpdmF0ZSBEb2N1bWVudCBsb2FkKElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiB7Ci0JCS8vIGxvYWQgdGhlIGZlYXR1cmUgeG1sCi0JCURvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBmYWN0b3J5Lm5ld0RvY3VtZW50QnVpbGRlcigpOwotCQlpbnB1dCA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0KTsKLQkJdHJ5IHsKLQkJCXJldHVybiBidWlsZGVyLnBhcnNlKGlucHV0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChpbnB1dCAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFBhcnNlIHRoZSBnaXZlbiBmaWxlIGhhbmRsZSB3aGljaCBwb2ludHMgdG8gYSBwbGF0Zm9ybS54bWwgZmlsZSBhbmQgYSBjb25maWd1cmF0aW9uIG9iamVjdC4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGZpbGUgZG9lc24ndCBleGlzdC4KLQkgKi8KLQlwcml2YXRlIENvbmZpZ3VyYXRpb24gaW50ZXJuYWxQYXJzZShGaWxlIGZpbGUpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKSk7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IGxvYWQoaW5wdXQpOwotCQkJcmV0dXJuIHByb2Nlc3MoZG9jdW1lbnQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKE5MUy5iaW5kKE1lc3NhZ2VzLmVycm9yX3JlYWRpbmdfY29uZmlnLCBmaWxlKSwgZSk7Ci0JCX0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihNZXNzYWdlcy5lcnJvcl9wYXJzaW5nX2NvbmZpZywgZSk7Ci0JCX0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKE1lc3NhZ2VzLmVycm9yX3BhcnNpbmdfY29uZmlnLCBlKTsKLQkJfQotCX0KLQotCS8qCi0JICogUHJvY2VzcyB0aGUgZ2l2ZW4gRE9NIGRvY3VtZW50IGFuZCBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlCi0JICogc2l0ZSBvYmplY3RzLgotCSAqLwotCXByaXZhdGUgQ29uZmlndXJhdGlvbiBwcm9jZXNzKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCU5vZGUgbm9kZSA9IGdldENvbmZpZ0VsZW1lbnQoZG9jdW1lbnQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGNyZWF0ZUNvbmZpZ3VyYXRpb24obm9kZSk7Ci0JCU5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBzaXplID0gY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKCFFTEVNRU5UX1NJVEUuZXF1YWxzSWdub3JlQ2FzZShjaGlsZC5nZXROb2RlTmFtZSgpKSkKLQkJCQljb250aW51ZTsKLQkJCVNpdGUgc2l0ZSA9IGNyZWF0ZVNpdGUoY2hpbGQpOwotCQkJaWYgKHNpdGUgIT0gbnVsbCkKLQkJCQljb25maWd1cmF0aW9uLmFkZChzaXRlKTsKLQkJfQotCQlyZXR1cm4gY29uZmlndXJhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIENvbmZpZ3VyYXRpb24gY3JlYXRlQ29uZmlndXJhdGlvbihOb2RlIG5vZGUpIHsKLQkJQ29uZmlndXJhdGlvbiByZXN1bHQgPSBuZXcgQ29uZmlndXJhdGlvbigpOwotCQlTdHJpbmcgdmFsdWUgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX0RBVEUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXREYXRlKHZhbHVlKTsKLQkJdmFsdWUgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1RSQU5TSUVOVCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJcmVzdWx0LnNldFRyYW5zaWVudChCb29sZWFuLnZhbHVlT2YodmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJdmFsdWUgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1NIQVJFRF9VUik7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJcmVzdWx0LnNldFNoYXJlZFVSKHZhbHVlKTsKLQkJdmFsdWUgPSBnZXRBdHRyaWJ1dGUobm9kZSwgQVRUUklCVVRFX1ZFUlNJT04pOwotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRWZXJzaW9uKHZhbHVlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIE5vZGUgZ2V0Q29uZmlnRWxlbWVudChEb2N1bWVudCBkb2MpIHsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBkb2MuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChFTEVNRU5UX0NPTkZJRy5lcXVhbHNJZ25vcmVDYXNlKGNoaWxkLmdldE5vZGVOYW1lKCkpKQotCQkJCXJldHVybiBjaGlsZDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9Db25maWd1cmF0aW9uV3JpdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9Db25maWd1cmF0aW9uV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNDY2MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvQ29uZmlndXJhdGlvbldyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5Mb2dIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuVVJMVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQuZWNsaXBzZS5BY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbmZpZ3VyYXRpb25Xcml0ZXIgaW1wbGVtZW50cyBDb25maWd1cmF0aW9uQ29uc3RhbnRzIHsKLQotCS8qCi0JICogU2F2ZSB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwgRmlsZSBsb2NhdGlvbiwgVVJMIG9zZ2lJbnN0YWxsQXJlYSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCVhNTFdyaXRlciB3cml0ZXIgPSBudWxsOwotCQl0cnkgewotCQkJT3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShsb2NhdGlvbikpOwotCQkJd3JpdGVyID0gbmV3IFhNTFdyaXRlcihvdXRwdXQpOwotCQkJTWFwIGFyZ3MgPSBuZXcgSGFzaE1hcCgpOwotCi0JCQlTdHJpbmcgdmFsdWUgPSBjb25maWd1cmF0aW9uLmdldERhdGUoKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCWFyZ3MucHV0KEFUVFJJQlVURV9EQVRFLCB2YWx1ZSk7Ci0KLQkJCXZhbHVlID0gY29uZmlndXJhdGlvbi5nZXRTaGFyZWRVUigpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJYXJncy5wdXQoQVRUUklCVVRFX1NIQVJFRF9VUiwgdmFsdWUpOwotCi0JCQl2YWx1ZSA9IGNvbmZpZ3VyYXRpb24uZ2V0VmVyc2lvbigpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJYXJncy5wdXQoQVRUUklCVVRFX1ZFUlNJT04sIHZhbHVlKTsKLQotCQkJYXJncy5wdXQoQVRUUklCVVRFX1RSQU5TSUVOVCwgQm9vbGVhbi50b1N0cmluZyhjb25maWd1cmF0aW9uLmlzVHJhbnNpZW50KCkpKTsKLQotCQkJd3JpdGVyLnN0YXJ0VGFnKEVMRU1FTlRfQ09ORklHLCBhcmdzKTsKLQotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gY29uZmlndXJhdGlvbi5nZXRTaXRlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVNpdGUgc2l0ZSA9IChTaXRlKSBpdGVyLm5leHQoKTsKLQkJCQl3cml0ZSh3cml0ZXIsIHNpdGUsIG9zZ2lJbnN0YWxsQXJlYSk7Ci0JCQl9Ci0KLQkJCXdyaXRlci5lbmRUYWcoRUxFTUVOVF9DT05GSUcpOwotCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3Jfc2F2aW5nX2NvbmZpZywgbG9jYXRpb24pLCBlKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24oTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3Jfc2F2aW5nX2NvbmZpZywgbG9jYXRpb24pLCBlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh3cml0ZXIgIT0gbnVsbCkgewotCQkJCXdyaXRlci5mbHVzaCgpOwotCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBXcml0ZSBvdXQgdGhlIGdpdmVuIHNpdGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZShYTUxXcml0ZXIgd3JpdGVyLCBTaXRlIHNpdGUsIFVSTCBvc2dpSW5zdGFsbEFyZWEpIHsKLQkJTWFwIGFyZ3MgPSBuZXcgSGFzaE1hcCgpOwotCi0JCVN0cmluZyB2YWx1ZSA9IHNpdGUuZ2V0TGlua0ZpbGUoKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQlhcmdzLnB1dChBVFRSSUJVVEVfTElOS0ZJTEUsIHZhbHVlKTsKLQotCQl2YWx1ZSA9IHNpdGUuZ2V0UG9saWN5KCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJYXJncy5wdXQoQVRUUklCVVRFX1BPTElDWSwgdmFsdWUpOwotCi0JCXZhbHVlID0gc2l0ZS5nZXRVcmwoKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQlhcmdzLnB1dChBVFRSSUJVVEVfVVJMLCBnZXRMb2NhdGlvbih2YWx1ZSwgb3NnaUluc3RhbGxBcmVhKSk7Ci0KLQkJdmFsdWUgPSB0b1N0cmluZyhzaXRlLmdldExpc3QoKSk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJYXJncy5wdXQoQVRUUklCVVRFX0xJU1QsIHZhbHVlKTsKLQotCQlhcmdzLnB1dChBVFRSSUJVVEVfVVBEQVRFQUJMRSwgQm9vbGVhbi50b1N0cmluZyhzaXRlLmlzVXBkYXRlYWJsZSgpKSk7Ci0JCWFyZ3MucHV0KEFUVFJJQlVURV9FTkFCTEVELCBCb29sZWFuLnRvU3RyaW5nKHNpdGUuaXNFbmFibGVkKCkpKTsKLQotCQl3cml0ZXIuc3RhcnRUYWcoRUxFTUVOVF9TSVRFLCBhcmdzKTsKLQkJd3JpdGUod3JpdGVyLCBzaXRlLmdldEZlYXR1cmVzKCkpOwotCQl3cml0ZXIuZW5kVGFnKEVMRU1FTlRfU0lURSk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGxvY2F0aW9uIGZvciB0aGUgZ2l2ZW4gbG9jYXRpb24gd2hpY2ggaXMgYSB1cmwgc3RyaW5nLiBUYWtlIGludG8gYWNjb3VudCAKLQkgKiB0aGUgc3BlY2lmaWVkIG9zZ2kgaW5zdGFsbCBhcmVhLiBUaGlzIG1ldGhvZCBzaG91bGQgbWFrZSB0aGUgcGF0aCByZWxhdGl2ZSBpZiAKLQkgKiBwb3NzaWJsZSBhbmQgY291bGQgcG90ZW50aWFsbHkgcmV0dXJuIHBsYXRmb3JtOi9iYXNlLy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TG9jYXRpb24oU3RyaW5nIHZhbHVlLCBVUkwgb3NnaUluc3RhbGxBcmVhKSB7Ci0JCWlmIChvc2dpSW5zdGFsbEFyZWEgPT0gbnVsbCB8fCAhdmFsdWUuc3RhcnRzV2l0aCgiZmlsZToiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHZhbHVlOwotCQl0cnkgewotCQkJLy8gaWYgb3VyIHNpdGUgcmVwcmVzZW50cyB0aGUgb3NnaSBpbnN0YWxsIGFyZWEsIHRoZW4gd3JpdGUgb3V0IHBsYXRmb3JtOi9iYXNlLwotCQkJRmlsZSBpbnN0YWxsQXJlYSA9IFVSTFV0aWwudG9GaWxlKG9zZ2lJbnN0YWxsQXJlYSk7Ci0JCQlGaWxlIHBhdGggPSBVUkxVdGlsLnRvRmlsZShuZXcgVVJMKHZhbHVlKSk7Ci0JCQlpZiAoaW5zdGFsbEFyZWEuZ2V0QWJzb2x1dGVGaWxlKCkuZXF1YWxzKHBhdGguZ2V0QWJzb2x1dGVGaWxlKCkpKQotCQkJCXJldHVybiBDb25maWd1cmF0aW9uUGFyc2VyLlBMQVRGT1JNX0JBU0U7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCAiRXJyb3Igb2NjdXJyZWQgd2hpbGUgd3JpdGluZyBjb25maWd1cmF0aW9uLiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBVdGlscy5tYWtlUmVsYXRpdmUodmFsdWUsIG9zZ2lJbnN0YWxsQXJlYSk7Ci0JfQotCi0JLyoKLQkgKiBDb252ZXJ0IHRoZSBnaXZlbiBsaXN0IHRvIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0W10gbGlzdCkgewotCQlpZiAobGlzdCA9PSBudWxsIHx8IGxpc3QubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKGxpc3RbaV0udG9TdHJpbmcoKSk7Ci0JCQlpZiAoaSArIDEgPCBsaXN0Lmxlbmd0aCkKLQkJCQlidWZmZXIuYXBwZW5kKCcsJyk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qCi0JICogV3JpdGUgb3V0IHRoZSBnaXZlbiBsaXN0IG9mIGZlYXR1cmVzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGUoWE1MV3JpdGVyIHdyaXRlciwgRmVhdHVyZVtdIGZlYXR1cmVzKSB7Ci0JCWlmIChmZWF0dXJlcyA9PSBudWxsIHx8IGZlYXR1cmVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlGZWF0dXJlIGZlYXR1cmUgPSBmZWF0dXJlc1tpXTsKLQkJCU1hcCBhcmdzID0gbmV3IEhhc2hNYXAoKTsKLQkJCVN0cmluZyB2YWx1ZSA9IGZlYXR1cmUuZ2V0SWQoKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCWFyZ3MucHV0KEFUVFJJQlVURV9JRCwgdmFsdWUpOwotCQkJdmFsdWUgPSBmZWF0dXJlLmdldFVybCgpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJYXJncy5wdXQoQVRUUklCVVRFX1VSTCwgdmFsdWUpOwotCQkJdmFsdWUgPSBmZWF0dXJlLmdldFZlcnNpb24oKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJCWFyZ3MucHV0KEFUVFJJQlVURV9WRVJTSU9OLCB2YWx1ZSk7Ci0JCQl2YWx1ZSA9IGZlYXR1cmUuZ2V0UGx1Z2luSWRlbnRpZmllcigpOwotCQkJLy8gb25seSB3cml0ZSBvdXQgdGhlIHBsdWctaW4gaWRlbnRpZmllciBpZiBpdCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgZmVhdHVyZSBpZAotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmVxdWFscyhmZWF0dXJlLmdldElkKCkpKQotCQkJCWFyZ3MucHV0KEFUVFJJQlVURV9QTFVHSU5fSURFTlRJRklFUiwgdmFsdWUpOwotCQkJdmFsdWUgPSBmZWF0dXJlLmdldFBsdWdpblZlcnNpb24oKTsKLQkJCS8vIG9ubHkgd3JpdGUgb3V0IHRoZSBwbHVnLWluIHZlcnNpb24gaWYgaXQgaXMgZGlmZmVyZW50IGZyb20gdGhlIGZlYXR1cmUgdmVyc2lvbgotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmVxdWFscyhmZWF0dXJlLmdldFZlcnNpb24oKSkpCi0JCQkJYXJncy5wdXQoQVRUUklCVVRFX1BMVUdJTl9WRVJTSU9OLCB2YWx1ZSk7Ci0JCQlpZiAoZmVhdHVyZS5pc1ByaW1hcnkoKSkKLQkJCQlhcmdzLnB1dChBVFRSSUJVVEVfUFJJTUFSWSwgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWUgPSBmZWF0dXJlLmdldEFwcGxpY2F0aW9uKCk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQlhcmdzLnB1dChBVFRSSUJVVEVfQVBQTElDQVRJT04sIHZhbHVlKTsKLQotCQkJLy8gY29sbGVjdCB0aGUgcm9vdHMKLQkJCVVSTFtdIHJvb3RzID0gZmVhdHVyZS5nZXRSb290cygpOwotCQkJaWYgKHJvb3RzICE9IG51bGwgJiYgcm9vdHMubGVuZ3RoID4gMCkKLQkJCQlhcmdzLnB1dChBVFRSSUJVVEVfUk9PVCwgdG9TdHJpbmcocm9vdHMpKTsKLQotCQkJd3JpdGVyLnN0YXJ0VGFnKEVMRU1FTlRfRkVBVFVSRSwgYXJncyk7Ci0JCQl3cml0ZXIuZW5kVGFnKEVMRU1FTlRfRkVBVFVSRSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9GZWF0dXJlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9GZWF0dXJlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMzM4ZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvRmVhdHVyZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGU7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qCi0gKiBSZXByZXNlbnRzIGEgZmVhdHVyZSBlbnRyeSBpbiBhIHBsYXRmb3JtLnhtbCBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgRmVhdHVyZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBpZDsKLQlwcml2YXRlIFN0cmluZyB1cmw7Ci0JcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLQlwcml2YXRlIFNpdGUgc2l0ZTsKLQlwcml2YXRlIFN0cmluZyBwbHVnaW5JZGVudGlmaWVyOwotCXByaXZhdGUgU3RyaW5nIHBsdWdpblZlcnNpb247Ci0JcHJpdmF0ZSBTdHJpbmcgYXBwbGljYXRpb247Ci0JcHJpdmF0ZSBVUkxbXSByb290czsKLQlwcml2YXRlIGJvb2xlYW4gcHJpbWFyeSA9IGZhbHNlOwotCi0JcHVibGljIEZlYXR1cmUoU2l0ZSBzaXRlKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChzaXRlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VzLmVtcHR5X2ZlYXR1cmVfc2l0ZSk7Ci0JCXRoaXMuc2l0ZSA9IHNpdGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbigpIHsKLQkJcmV0dXJuIGFwcGxpY2F0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbklkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBwbHVnaW5JZGVudGlmaWVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGx1Z2luVmVyc2lvbigpIHsKLQkJcmV0dXJuIHBsdWdpblZlcnNpb247Ci0JfQotCi0JcHVibGljIFVSTFtdIGdldFJvb3RzKCkgewotCQlyZXR1cm4gcm9vdHM7Ci0JfQotCi0JcHVibGljIFNpdGUgZ2V0U2l0ZSgpIHsKLQkJcmV0dXJuIHNpdGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWZXJzaW9uKCkgewotCQlyZXR1cm4gdmVyc2lvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ByaW1hcnkoKSB7Ci0JCXJldHVybiBwcmltYXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uKFN0cmluZyBhcHBsaWNhdGlvbikgewotCQl0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQbHVnaW5JZGVudGlmaWVyKFN0cmluZyBwbHVnaW5JZGVudGlmaWVyKSB7Ci0JCXRoaXMucGx1Z2luSWRlbnRpZmllciA9IHBsdWdpbklkZW50aWZpZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGx1Z2luVmVyc2lvbihTdHJpbmcgcGx1Z2luVmVyc2lvbikgewotCQl0aGlzLnBsdWdpblZlcnNpb24gPSBwbHVnaW5WZXJzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByaW1hcnkoYm9vbGVhbiBwcmltYXJ5KSB7Ci0JCXRoaXMucHJpbWFyeSA9IHByaW1hcnk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdHMoVVJMW10gcm9vdHMpIHsKLQkJdGhpcy5yb290cyA9IHJvb3RzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKLQkJdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICghKG9iaiBpbnN0YW5jZW9mIEZlYXR1cmUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlGZWF0dXJlIG90aGVyID0gKEZlYXR1cmUpIG9iajsKLQkJaWYgKCFlcXVhbHMoZ2V0SWQoKSwgb3RoZXIuZ2V0SWQoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIHNoYWxsb3cgZXF1YWxzIGhlcmUuIHNpdGVzIHNob3VsZCBuZXZlciBiZSBudWxsCi0JCWlmICghZXF1YWxzKGdldFNpdGUoKS5nZXRVcmwoKSwgb3RoZXIuZ2V0U2l0ZSgpLmdldFVybCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFlcXVhbHMoZ2V0VXJsKCksIG90aGVyLmdldFVybCgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFlcXVhbHMoZ2V0VmVyc2lvbigpLCBvdGhlci5nZXRWZXJzaW9uKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvbmUsIE9iamVjdCB0d28pIHsKLQkJcmV0dXJuIG9uZSA9PSBudWxsID8gdHdvID09IG51bGwgOiBvbmUuZXF1YWxzKHR3byk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGlkLmhhc2hDb2RlKCkgKyB2ZXJzaW9uLmhhc2hDb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YTkxMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZS5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlbXB0eV9mZWF0dXJlX3NpdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXJyb3Jfc2F2aW5nX2NvbmZpZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9yZWFkaW5nX2NvbmZpZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBlcnJvcl9wYXJzaW5nX2NvbmZpZzsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZSBhbmQgYXNzaWduIHRvIGZpZWxkcyBiZWxvdwotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvU2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvU2l0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTYyY2M3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL1NpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIAotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qCi0gKiBSZXByZXNlbnRzIGEgc2l0ZSBpbiBhIHBsYXRmb3JtLnhtbCBmaWxlLgotICovCi1wdWJsaWMgY2xhc3MgU2l0ZSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQT0xJQ1lfTUFOQUdFRF9PTkxZID0gIk1BTkFHRUQtT05MWSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQT0xJQ1lfVVNFUl9FWENMVURFID0gIlVTRVItRVhDTFVERSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQT0xJQ1lfVVNFUl9JTkNMVURFID0gIlVTRVItSU5DTFVERSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIHBvbGljeTsKLQlwcml2YXRlIGJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JcHJpdmF0ZSBib29sZWFuIHVwZGF0ZWFibGUgPSB0cnVlOwotCXByaXZhdGUgU3RyaW5nIHVybDsKLQlwcml2YXRlIFN0cmluZyBsaW5rRmlsZTsKLQlwcml2YXRlIENvbGxlY3Rpb24gZmVhdHVyZXMgPSBuZXcgSGFzaFNldCgpOwotCXByaXZhdGUgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIHZvaWQgYWRkRmVhdHVyZShGZWF0dXJlIGZlYXR1cmUpIHsKLQkJdGhpcy5mZWF0dXJlcy5hZGQoZmVhdHVyZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUGx1Z2luKFN0cmluZyBwbHVnaW4pIHsKLQkJdGhpcy5saXN0LmFkZChwbHVnaW4pOwotCX0KLQotCXB1YmxpYyBGZWF0dXJlW10gZ2V0RmVhdHVyZXMoKSB7Ci0JCXJldHVybiAoRmVhdHVyZVtdKSBmZWF0dXJlcy50b0FycmF5KG5ldyBGZWF0dXJlW2ZlYXR1cmVzLnNpemUoKV0pOwotCX0KLQotCS8qCi0JICogUmV0dXJuIHRoZSBmZWF0dXJlIG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpYyBpZCBhbmQgdmVyc2lvbi4gUmV0dXJuIG51bGwgCi0JICogaWYgdGhlcmUgaXMgbm8gbWF0Y2ggb3IgdGhlIGlkIGlzIG51bGwuIElmIHRoZSB2ZXJzaW9uIGlzIG51bGwgdGhlbiByZXR1cm4gdGhlCi0JICogZmlyc3QgZmVhdHVyZSB3aXRoIGEgbWF0Y2hpbmcgaWQuCi0JICovCi0JcHVibGljIEZlYXR1cmUgZ2V0RmVhdHVyZShTdHJpbmcgaWQsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaXRlciA9IGZlYXR1cmVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJRmVhdHVyZSBmZWF0dXJlID0gKEZlYXR1cmUpIGl0ZXIubmV4dCgpOwotCQkJaWYgKGlkLmVxdWFscyhmZWF0dXJlLmdldElkKCkpKSB7Ci0JCQkJaWYgKHZlcnNpb24gPT0gbnVsbCB8fCB2ZXJzaW9uLmVxdWFscyhmZWF0dXJlLmdldFZlcnNpb24oKSkpCi0JCQkJCXJldHVybiBmZWF0dXJlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBGZWF0dXJlIHJlbW92ZUZlYXR1cmUoU3RyaW5nIGZlYXR1cmVVUkwpIHsKLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZmVhdHVyZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlGZWF0dXJlIGZlYXR1cmUgPSAoRmVhdHVyZSkgaXRlci5uZXh0KCk7Ci0JCQlTdHJpbmcgbmV4dFVSTCA9IGZlYXR1cmUuZ2V0VXJsKCk7Ci0JCQlpZiAobmV4dFVSTCAhPSBudWxsICYmIG5leHRVUkwuZXF1YWxzKGZlYXR1cmVVUkwpKQotCQkJCXJldHVybiBmZWF0dXJlcy5yZW1vdmUoZmVhdHVyZSkgPyBmZWF0dXJlIDogbnVsbDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExpbmtGaWxlKCkgewotCQlyZXR1cm4gbGlua0ZpbGU7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldExpc3QoKSB7Ci0JCXJldHVybiAoU3RyaW5nW10pIGxpc3QudG9BcnJheShuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQb2xpY3koKSB7Ci0JCXJldHVybiBwb2xpY3k7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVcmwoKSB7Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1VwZGF0ZWFibGUoKSB7Ci0JCXJldHVybiB1cGRhdGVhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXRoaXMuZW5hYmxlZCA9IGVuYWJsZWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGlua0ZpbGUoU3RyaW5nIGxpbmtGaWxlKSB7Ci0JCXRoaXMubGlua0ZpbGUgPSBsaW5rRmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQb2xpY3koU3RyaW5nIHBvbGljeSkgewotCQl0aGlzLnBvbGljeSA9IHBvbGljeTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVcGRhdGVhYmxlKGJvb2xlYW4gdXBkYXRlYWJsZSkgewotCQl0aGlzLnVwZGF0ZWFibGUgPSB1cGRhdGVhYmxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVybChTdHJpbmcgdXJsKSB7Ci0JCXRoaXMudXJsID0gdXJsOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBnZXRVcmwoKS5oYXNoQ29kZSgpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjZXF1YWxzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgU2l0ZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVNpdGUgb3RoZXIgPSAoU2l0ZSkgb2JqOwotCQlpZiAoaXNFbmFibGVkKCkgIT0gb3RoZXIuaXNFbmFibGVkKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpc1VwZGF0ZWFibGUoKSAhPSBvdGhlci5pc1VwZGF0ZWFibGUoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFnZXRVcmwoKS5lcXVhbHMob3RoZXIuZ2V0VXJsKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIVV0aWxzLmVxdWFscyhnZXRMaW5rRmlsZSgpLCBvdGhlci5nZXRMaW5rRmlsZSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFVdGlscy5lcXVhbHMoZ2V0UG9saWN5KCksIG90aGVyLmdldFBvbGljeSgpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFVdGlscy5lcXVhbHMoZ2V0TGlzdCgpLCBvdGhlci5nZXRMaXN0KCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIVV0aWxzLmVxdWFscyhnZXRGZWF0dXJlcygpLCBvdGhlci5nZXRGZWF0dXJlcygpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2Uvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlL1V0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMDliNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci0KLS8qKgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlscyB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2luZG93cyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgib3MubmFtZSIpLnN0YXJ0c1dpdGgoIldpbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbml0ID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1c2VFbmMgPSB0cnVlOwotCi0JLyoKLQkgKiBDb3BpZWQgZnJvbSBVcGRhdGVVUkxEZWNvZGVyIHYxLjQgaW4gb3JnLmVjbGlwc2UudXBkYXRlLmNvbmZpZ3VyYXRvci4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoU3RyaW5nIHMsIFN0cmluZyBlbmMpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJaWYgKCFpbml0KSB7Ci0JCQlpbml0ID0gdHJ1ZTsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIFVSTERlY29kZXIuZGVjb2RlKHMsIGVuYyk7Ci0JCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFcnJvciBlKSB7Ci0JCQkJdXNlRW5jID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHVzZUVuYyA/IFVSTERlY29kZXIuZGVjb2RlKHMsIGVuYykgOiBVUkxEZWNvZGVyLmRlY29kZShzKTsKLQl9Ci0KLQkvKgotCSAqIENvcGllZCBmcm9tIFV0aWxzIHYxLjMyIGluIG9yZy5lY2xpcHNlLnVwZGF0ZS5jb25maWd1cmF0b3IuCi0JICogCi0JICogRW5zdXJlcyBmaWxlOiBVUkxzIG9uIFdpbmRvd3MgaGF2ZSB0aGUgcmlnaHQgZm9ybSAoaS5lLiAnLycgYXMgc2VnbWVudCBzZXBhcmF0b3IsIGRyaXZlIGxldHRlciBpbiBsb3dlciBjYXNlLCBldGMpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2Fub25pY2FsaXplVVJMKFN0cmluZyB1cmwpIHsKLQkJaWYgKCEoaXNXaW5kb3dzICYmIHVybC5zdGFydHNXaXRoKCJmaWxlOiIpKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHVybDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBwYXRoID0gbmV3IFVSTCh1cmwpLmdldFBhdGgoKTsKLQkJCS8vIG5vcm1hbGl6ZSB0byBub3QgaGF2ZSBsZWFkaW5nIC8gc28gd2UgY2FuIGNoZWNrIHRoZSBmb3JtCi0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShwYXRoKTsKLQkJCXBhdGggPSBmaWxlLnRvU3RyaW5nKCkucmVwbGFjZSgnXFwnLCAnLycpOwotCQkJLy8gaGFuZGxlIFVSTHMgdGhhdCBkb24ndCBoYXZlIGEgcGF0aAotCQkJaWYgKHBhdGgubGVuZ3RoKCkgPT0gMCkKLQkJCQlyZXR1cm4gdXJsOwotCQkJaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShwYXRoLmNoYXJBdCgwKSkpIHsKLQkJCQljaGFyW10gY2hhcnMgPSBwYXRoLnRvQ2hhckFycmF5KCk7Ci0JCQkJY2hhcnNbMF0gPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2hhcnNbMF0pOwotCQkJCXBhdGggPSBuZXcgU3RyaW5nKGNoYXJzKTsKLQkJCQlyZXR1cm4gbmV3IEZpbGUocGF0aCkudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpOwotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJLy8gZGVmYXVsdCB0byBvcmlnaW5hbCB1cmwKLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbgotCSAqIG9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZXF1YWwuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb25lLCBPYmplY3QgdHdvKSB7Ci0JCXJldHVybiBvbmUgPT0gbnVsbCA/IHR3byA9PSBudWxsIDogb25lLmVxdWFscyh0d28pOwotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IHRoZSBnaXZlbgotCSAqIGxpc3RzIGFyZSBjb25zaWRlcmVkIGVxdWFsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0W10gb25lLCBPYmplY3RbXSB0d28pIHsKLQkJaWYgKG9uZSA9PSBudWxsICYmIHR3byA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChvbmUgPT0gbnVsbCB8fCB0d28gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG9uZS5sZW5ndGggIT0gdHdvLmxlbmd0aCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbmUubGVuZ3RoOyBpKyspIHsKLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCWZvciAoaW50IGogPSAwOyAhZm91bmQgJiYgaiA8IHR3by5sZW5ndGg7IGorKykKLQkJCQlmb3VuZCA9IG9uZVtpXS5lcXVhbHModHdvW2pdKTsKLQkJCWlmICghZm91bmQpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGU6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVJlbGF0aXZlKFN0cmluZyB1cmxTdHJpbmcsIFVSTCByb290VVJMKSB7Ci0JCS8vIHdlIG9ubHkgdHJhZmZpYyBpbiBmaWxlOiBVUkxzCi0JCWludCBpbmRleCA9IHVybFN0cmluZy5pbmRleE9mKEZJTEVfUFJPVE9DT0wpOwotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gdXJsU3RyaW5nOwotCQlpbmRleCA9IGluZGV4ICsgNTsKLQotCQkvLyBlbnN1cmUgd2UgaGF2ZSBhbiBhYnNvbHV0ZSBwYXRoIHRvIHN0YXJ0IHdpdGgKLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQlTdHJpbmcgZmlsZSA9IHVybFN0cmluZzsKLQkJd2hpbGUgKCFkb25lKSB7Ci0JCQl0cnkgewotCQkJCXVybCA9IG5ldyBVUkwoZmlsZSk7Ci0JCQkJZmlsZSA9IHVybC5nZXRGaWxlKCk7Ci0JCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCWRvbmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmICh1cmwgPT0gbnVsbCB8fCAhbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuaXNBYnNvbHV0ZSgpKQotCQkJcmV0dXJuIHVybFN0cmluZzsKLQotCQlTdHJpbmcgcm9vdFN0cmluZyA9IHJvb3RVUkwudG9FeHRlcm5hbEZvcm0oKTsKLQkJcmV0dXJuIHVybFN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXgpICsgbWFrZVJlbGF0aXZlKHVybFN0cmluZy5zdWJzdHJpbmcoaW5kZXgpLCByb290U3RyaW5nLnN1YnN0cmluZyhyb290U3RyaW5nLmluZGV4T2YoRklMRV9QUk9UT0NPTCkgKyA1KSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZVJlbGF0aXZlKFN0cmluZyBvcmlnaW5hbCwgU3RyaW5nIHJvb3RQYXRoKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChvcmlnaW5hbCk7Ci0JCS8vIGVuc3VyZSB3ZSBoYXZlIGFuIGFic29sdXRlIHBhdGggdG8gc3RhcnQgd2l0aAotCQlpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKQotCQkJcmV0dXJuIG9yaWdpbmFsOwotCi0JCS8vUmV0dXJucyB0aGUgb3JpZ2luYWwgc3RyaW5nIGlmIG5vIHJlbGF0aXZpemF0aW9uIGhhcyBiZWVuIGRvbmUKLQkJU3RyaW5nIHJlc3VsdCA9IG1ha2VSZWxhdGl2ZShwYXRoLCBuZXcgUGF0aChyb290UGF0aCkpOwotCQlyZXR1cm4gcGF0aC50b09TU3RyaW5nKCkuZXF1YWxzKHJlc3VsdCkgPyBvcmlnaW5hbCA6IHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIE1ha2UgdGhlIGdpdmVuIHBhdGggcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCByb290LCBpZiBhcHBsaWNhYmxlLiBJZiBub3QsIHRoZW4KLQkgKiByZXR1cm4gdGhlIHBhdGggYXMtaXMuCi0JICogCi0JICogTWV0aG9kIHNpbWlsYXIgdG8gb25lIGZyb20gU2ltcGxlQ29uZmlndXJhdGlvbk1hbmlwdWxhdG9ySW1wbC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbWFrZVJlbGF0aXZlKElQYXRoIHRvUmVsLCBJUGF0aCBiYXNlKSB7Ci0JCWludCBpID0gYmFzZS5tYXRjaGluZ0ZpcnN0U2VnbWVudHModG9SZWwpOwotCQlpZiAoaSA9PSAwKSB7Ci0JCQlyZXR1cm4gdG9SZWwudG9PU1N0cmluZygpOwotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBqID0gMDsgaiA8IChiYXNlLnNlZ21lbnRDb3VudCgpIC0gaSk7IGorKykgewotCQkJcmVzdWx0ICs9ICIuLiIgKyBJUGF0aC5TRVBBUkFUT1I7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoaSA9PSB0b1JlbC5zZWdtZW50Q291bnQoKSkKLQkJCXJldHVybiAiLiI7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0ICs9IHRvUmVsLnNldERldmljZShudWxsKS5yZW1vdmVGaXJzdFNlZ21lbnRzKGkpLnRvT1NTdHJpbmcoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIE1ha2UgdGhlIGdpdmVuIHBhdGggYWJzb2x1dGUgdG8gdGhlIHNwZWNpZmllZCByb290LCBpZiBhcHBsaWNhYmxlLiBJZiBub3QsIHRoZW4KLQkgKiByZXR1cm4gdGhlIHBhdGggYXMtaXMuCi0JICogCi0JICogTWV0aG9kIHNpbWlsYXIgdG8gb25lIGZyb20gU2ltcGxlQ29uZmlndXJhdGlvbk1hbmlwdWxhdG9ySW1wbC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlQWJzb2x1dGUoU3RyaW5nIG9yaWdpbmFsLCBTdHJpbmcgcm9vdFBhdGgpIHsKLQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKG9yaWdpbmFsKTsKLQkJLy8gZW5zdXJlIHdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoIHRvIHN0YXJ0IHdpdGgKLQkJaWYgKHBhdGguaXNBYnNvbHV0ZSgpKQotCQkJcmV0dXJuIG9yaWdpbmFsOwotCQlJUGF0aCByb290ID0gbmV3IFBhdGgocm9vdFBhdGgpOwotCQlyZXR1cm4gcm9vdC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpLmFwcGVuZChvcmlnaW5hbC5yZXBsYWNlKCc6JywgJ30nKSkudG9PU1N0cmluZygpLnJlcGxhY2UoJ30nLCAnOicpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VBYnNvbHV0ZShTdHJpbmcgdXJsU3RyaW5nLCBVUkwgcm9vdFVSTCkgewotCQkvLyB3ZSBvbmx5IHRyYWZmaWMgaW4gZmlsZTogVVJMcwotCQlpbnQgaW5kZXggPSB1cmxTdHJpbmcuaW5kZXhPZihGSUxFX1BST1RPQ09MKTsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIHVybFN0cmluZzsKLQkJaW5kZXggPSBpbmRleCArIDU7Ci0KLQkJLy8gZW5zdXJlIHdlIGhhdmUgYSByZWxhdGl2ZSBwYXRoIHRvIHN0YXJ0IHdpdGgKLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQlTdHJpbmcgZmlsZSA9IHVybFN0cmluZzsKLQkJd2hpbGUgKCFkb25lKSB7Ci0JCQl0cnkgewotCQkJCXVybCA9IG5ldyBVUkwoZmlsZSk7Ci0JCQkJZmlsZSA9IHVybC5nZXRGaWxlKCk7Ci0JCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCWRvbmUgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWlmICh1cmwgPT0gbnVsbCB8fCBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKS5pc0Fic29sdXRlKCkpCi0JCQlyZXR1cm4gdXJsU3RyaW5nOwotCi0JCXJldHVybiB1cmxTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4IC0gNSkgKyBtYWtlQWJzb2x1dGUodXJsU3RyaW5nLnN1YnN0cmluZyhpbmRleCksIHJvb3RVUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvWE1MV3JpdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9YTUxXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4NjY0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9YTUxXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZTsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBIHNpbXBsZSBYTUwgd3JpdGVyLgotICogCi0gKiBDb3BpZWQgZnJvbSB0aGUgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMgYnVuZGxlLgotICovCi1wdWJsaWMgY2xhc3MgWE1MV3JpdGVyIGV4dGVuZHMgUHJpbnRXcml0ZXIgewotCXByb3RlY3RlZCBpbnQgdGFiOwotCi0JLyogY29uc3RhbnRzICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1ZFUlNJT04gPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFhNTFdyaXRlcihPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCXN1cGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0LCAiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQl0YWIgPSAwOwotCQlwcmludGxuKFhNTF9WRVJTSU9OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRUYWcoU3RyaW5nIG5hbWUpIHsKLQkJdGFiLS07Ci0JCXByaW50VGFnKCcvJyArIG5hbWUsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByaW50U2ltcGxlVGFnKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCXByaW50VGFnKG5hbWUsIG51bGwsIHRydWUsIGZhbHNlKTsKLQkJCXByaW50KGdldEVzY2FwZWQoU3RyaW5nLnZhbHVlT2YodmFsdWUpKSk7Ci0JCQlwcmludFRhZygnLycgKyBuYW1lLCBudWxsLCBmYWxzZSwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFRhYnVsYXRpb24oKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFiOyBpKyspCi0JCQlzdXBlci5wcmludCgnXHQnKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmludFRhZyhTdHJpbmcgbmFtZSwgTWFwIHBhcmFtZXRlcnMpIHsKLQkJcHJpbnRUYWcobmFtZSwgcGFyYW1ldGVycywgdHJ1ZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRUYWcoU3RyaW5nIG5hbWUsIE1hcCBwYXJhbWV0ZXJzLCBib29sZWFuIHNob3VsZFRhYiwgYm9vbGVhbiBuZXdMaW5lKSB7Ci0JCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc2IuYXBwZW5kKCI8Iik7IC8vJE5PTi1OTFMtMSQKLQkJc2IuYXBwZW5kKG5hbWUpOwotCQlpZiAocGFyYW1ldGVycyAhPSBudWxsKQotCQkJZm9yIChJdGVyYXRvciBpdCA9IHBhcmFtZXRlcnMua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLQkJCQlzYi5hcHBlbmQoa2V5KTsKLQkJCQlzYi5hcHBlbmQoIj1cIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJc2IuYXBwZW5kKGdldEVzY2FwZWQoU3RyaW5nLnZhbHVlT2YocGFyYW1ldGVycy5nZXQoa2V5KSkpKTsKLQkJCQlzYi5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJc2IuYXBwZW5kKCI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNob3VsZFRhYikKLQkJCXByaW50VGFidWxhdGlvbigpOwotCQlpZiAobmV3TGluZSkKLQkJCXByaW50bG4oc2IudG9TdHJpbmcoKSk7Ci0JCWVsc2UKLQkJCXByaW50KHNiLnRvU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0VGFnKFN0cmluZyBuYW1lLCBNYXAgcGFyYW1ldGVycykgewotCQlzdGFydFRhZyhuYW1lLCBwYXJhbWV0ZXJzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydFRhZyhTdHJpbmcgbmFtZSwgTWFwIHBhcmFtZXRlcnMsIGJvb2xlYW4gbmV3TGluZSkgewotCQlwcmludFRhZyhuYW1lLCBwYXJhbWV0ZXJzLCB0cnVlLCBuZXdMaW5lKTsKLQkJdGFiKys7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRFc2NhcGVkQ2hhcihTdHJpbmdCdWZmZXIgYnVmZmVyLCBjaGFyIGMpIHsKLQkJU3RyaW5nIHJlcGxhY2VtZW50ID0gZ2V0UmVwbGFjZW1lbnQoYyk7Ci0JCWlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCcmJyk7Ci0JCQlidWZmZXIuYXBwZW5kKHJlcGxhY2VtZW50KTsKLQkJCWJ1ZmZlci5hcHBlbmQoJzsnKTsKLQkJfSBlbHNlIHsKLQkJCWJ1ZmZlci5hcHBlbmQoYyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFc2NhcGVkKFN0cmluZyBzKSB7Ci0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkgKyAxMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgKytpKQotCQkJYXBwZW5kRXNjYXBlZENoYXIocmVzdWx0LCBzLmNoYXJBdChpKSk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UmVwbGFjZW1lbnQoY2hhciBjKSB7Ci0JCS8vIEVuY29kZSBzcGVjaWFsIFhNTCBjaGFyYWN0ZXJzIGludG8gdGhlIGVxdWl2YWxlbnQgY2hhcmFjdGVyIHJlZmVyZW5jZXMuCi0JCS8vIFRoZXNlIGZpdmUgYXJlIGRlZmluZWQgYnkgZGVmYXVsdCBmb3IgYWxsIFhNTCBkb2N1bWVudHMuCi0JCXN3aXRjaCAoYykgewotCQkJY2FzZSAnPCcgOgotCQkJCXJldHVybiAibHQiOyAvLyROT04tTkxTLTEkCi0JCQljYXNlICc+JyA6Ci0JCQkJcmV0dXJuICJndCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJyInIDoKLQkJCQlyZXR1cm4gInF1b3QiOyAvLyROT04tTkxTLTEkCi0JCQljYXNlICdcJycgOgotCQkJCXJldHVybiAiYXBvcyI7IC8vJE5PTi1OTFMtMSQKLQkJCWNhc2UgJyYnIDoKLQkJCQlyZXR1cm4gImFtcCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGUvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M2NmVjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1lbXB0eV9mZWF0dXJlX3NpdGU9RmVhdHVyZXMgc2hvdWxkIG5vdCBoYXZlIGFuIGVtcHR5IHNpdGUuCi1lcnJvcl9wYXJzaW5nX2NvbmZpZz1BbiBlcnJvciBvY2N1cnJlZCBwYXJzaW5nIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uCi1lcnJvcl9yZWFkaW5nX2NvbmZpZz1BbiBlcnJvciBvY2N1cnJlZCByZWFkaW5nIHRoZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIGZpbGU6IHswfS4KLWVycm9yX3NhdmluZ19jb25maWc9RXhjZXB0aW9uIHdoZW4gc2F2aW5nIGNvbmZpZ3VyYXRpb24gdG86IHswfS4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkZWI3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvQ0RDLTEuMSVGb3VuZGF0aW9uLTEuMSIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FmYTgwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXM8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg1MjNjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMzMSArMCwwIEBACi0jVGh1IEF1ZyAxNiAxMTowMDo1OSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWFjZDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNTdW4gU2VwIDIzIDExOjU5OjA3IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcy8+Ci1zcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLXNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcGx1Z2luUHJvamVjdC5leHRlbnNpb25zPWZhbHNlCi1yZXNvbHZlLnJlcXVpcmVidW5kbGU9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDExMzJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5uYXRpdmVzLkFjdGl2YXRvcgotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbjt2ZXJzaW9uPSIxLjAuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiLAotIG9yZy5vc2dpLnV0aWwudHJhY2tlcjt2ZXJzaW9uPSIxLjMuMyIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24KLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4xL0ZvdW5kYXRpb24tMS4xLAotIEoyU0UtMS40Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50Lm5hdGl2ZXM7eC1pbnRlcm5hbDo9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYmQ5YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OGExNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lID0gRXF1aW5veCBQcm92aXNpb25pbmcgTmF0aXZlIFRvdWNocG9pbnQKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhYThlM2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi08cGx1Z2luPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLnRvdWNocG9pbnRzIiBpZD0ibmF0aXZlIiBuYW1lPSJOYXRpdmUgVG91Y2hwb2ludCI+Ci0JCTx0b3VjaHBvaW50IAotCQkJdHlwZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYXRpdmUiIAotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5uYXRpdmVzLk5hdGl2ZVRvdWNocG9pbnQiCi0JCQl2ZXJzaW9uPSIxLjAuMCIvPgotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvbmF0aXZlcy9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDU0NjE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5uYXRpdmVzOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGFDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBhQ29udGV4dDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQljb250ZXh0ID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL0JhY2t1cEZpbGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvbmF0aXZlcy9CYWNrdXBGaWxlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjMzMzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL0JhY2t1cEZpbGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5uYXRpdmVzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN1YlByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIEJhY2t1cEZpbGVzIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaSVBfU1VGRklYID0gIi56aXAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRJRVNfU1VGRklYID0gIi5wcm9wZXJ0aWVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBGaWxlIGJhY2t1cERpcjsKLQlwcml2YXRlIGJvb2xlYW4gZG9CYWNrdXA7Ci0KLQkvKioKLQkgKiBTYXZlIG9yIHJlc3RvcmUgYmFja3VwcyBvZiBmaWxlcyBpbiBiYWNrdXBEaXIKLQkgKi8KLQlwdWJsaWMgQmFja3VwRmlsZXMoRmlsZSBiYWNrdXBEaXIpIHsKLQkJdGhpcy5kb0JhY2t1cCA9IHRydWU7Ci0JCXRoaXMuYmFja3VwRGlyID0gYmFja3VwRGlyOwotCQl0aGlzLmJhY2t1cERpci5ta2RpcnMoKTsKLQl9Ci0KLQkvLyAgICAvKioKLQkvLyAgICAgKiBJZiBkb0JhY2t1cCBpcyBzZXQgdG8gZmFsc2UsIGZpbGVzIGFyZSBkZWxldGVkIG9uIHVuaW5zdGFsbCwgaW5zdGVhZCBvZiByZXN0b3JlZC4KLQkvLyAgICAgKi8KLQkvLyAgICBwdWJsaWMgdm9pZCBzZXREb0JhY2t1cChib29sZWFuIGRvQmFja3VwKSB7Ci0JLy8gICAgICAgIHRoaXMuZG9CYWNrdXAgPSBkb0JhY2t1cDsKLQkvLyAgICB9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIGFsbCBiYWNrdXBzIG1hZGUgaW4gdGhpcyBkaXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVzdG9yZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZpbmQgYmFja3VwIHByb3BlcnRpZXMgZmlsZXMsIGRvIGluIHJldmVyc2Ugb3JkZXIKLQkJTGlzdCBwcm9wc0ZpbGVzID0gbmV3IExpbmtlZExpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7OyBpICs9IDEpIHsKLQkJCUZpbGUgcHJvcHNGaWxlID0gZ2V0QmFja3VwUHJvcGVydGllcyhpKTsKLQkJCWlmICghcHJvcHNGaWxlLmV4aXN0cygpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlwcm9wc0ZpbGVzLmFkZCgwLCBwcm9wc0ZpbGUpOwotCQl9Ci0JCUlQcm9ncmVzc01vbml0b3JbXSBwbSA9IFV0aWwuc3BsaXRQcm9ncmVzc01vbml0b3IobW9uaXRvciwgcHJvcHNGaWxlcy5zaXplKCkpOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IHByb3BzRmlsZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlGaWxlIHByb3BzRmlsZSA9IChGaWxlKSBpLm5leHQoKTsKLQkJCXJlc3RvcmVGaWxlc0Zyb21CYWNrdXAocHJvcHNGaWxlLCBwbVtqKytdKTsKLQkJfQotCQlpZiAoIXRoaXMuYmFja3VwRGlyLmRlbGV0ZSgpKSB7Ci0JCQkvL25vdCBlbXB0eT8gIGxvZyBhIHdhcm5pbmc/Ci0JCX0gZWxzZSB7Ci0JCQkvLyBkZWxldGUgdGhlIHBhcmVudCBpZiBlbXB0eQotCQkJdGhpcy5iYWNrdXBEaXIuZ2V0UGFyZW50RmlsZSgpLmRlbGV0ZSgpOwotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCX0KLQotCS8qKgotCSAqIEZpbmQgZmlsZXMgdW5kZXIgb3V0cHV0RGlyIHRoYXQgd2lsbCBiZSBvdmVyd3JpdHRlbiBpbiB1bnppcFVSTAotCSAqIGFuZCBzYXZlIHVuZGVyIGJhY2t1cERpciwgYW5kIGRlbGV0ZS4KLQkgKiBJbmNsdWRlIHByb3BlcnRpZXMgZmlsZSB0byBpbmRpY2F0ZSBmaWxlcyB0byBkZWxldGUgb3IgcmVzdG9yZSBvbiByb2xsZWQgYmFjay4KLQkgKiBUaGUgcHJvZ3Jlc3MgbW9uaXRvciBpcyB1c2VkIG9ubHkgdG8gZGlzcGxheSBzdWItdGFza3M7IHdlIGRvbid0IHVwZGF0ZSBpdCBvdGhlcndpc2UuCi0JICovCi0JcHVibGljIHZvaWQgYmFja3VwRmlsZXNJblppcChTdHJpbmcgaWRlbnRpZmllciwgVVJMIHppcFVSTCwgRmlsZSBvdXRwdXREaXIsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQmFja3VwUHJvcGVydGllcyBiYWNrdXBQcm9wcyA9IG5ldyBCYWNrdXBQcm9wZXJ0aWVzKGlkZW50aWZpZXIsIG91dHB1dERpcik7Ci0JCVppcE91dHB1dFN0cmVhbSB6b3MgPSBudWxsOwotCQlTdHJpbmcgcHJldkRpciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlaaXBJbnB1dFN0cmVhbSBpbiA9IG5ldyBaaXBJbnB1dFN0cmVhbSh6aXBVUkwub3BlblN0cmVhbSgpKTsKLQkJCVppcEVudHJ5IHplOwotCQkJd2hpbGUgKCh6ZSA9IGluLmdldE5leHRFbnRyeSgpKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSB6ZS5nZXROYW1lKCk7Ci0JCQkJaW50IGkgPSBuYW1lLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQkJaWYgKGkgIT0gLTEpIHsKLQkJCQkJU3RyaW5nIGRpciA9IG5hbWUuc3Vic3RyaW5nKDAsIGkpOwotCQkJCQlpZiAodGhpcy5kb0JhY2t1cCAmJiAhZGlyLmVxdWFscyhwcmV2RGlyKSkgewotCQkJCQkJbW9uaXRvci5zdWJUYXNrKG5hbWUuc3Vic3RyaW5nKDAsIGkpKTsKLQkJCQkJCXByZXZEaXIgPSBkaXI7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCF6ZS5pc0RpcmVjdG9yeSgpKSB7Ci0JCQkJCUZpbGUgb3JpZ0ZpbGUgPSBuZXcgRmlsZShvdXRwdXREaXIsIG5hbWUpOwotCQkJCQlpZiAodGhpcy5kb0JhY2t1cCAmJiBvcmlnRmlsZS5leGlzdHMoKSkgewotCQkJCQkJaWYgKHpvcyA9PSBudWxsKSB7Ci0JCQkJCQkJRmlsZSB6aXBGaWxlID0gYmFja3VwUHJvcHMuZ2V0QXJjaGl2ZSgpOwotCQkJCQkJCXpvcyA9IG5ldyBaaXBPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oemlwRmlsZSkpOwotCQkJCQkJfQotCQkJCQkJWmlwRW50cnkgemlwRW50cnkgPSBuZXcgWmlwRW50cnkobmFtZSk7Ci0JCQkJCQl6aXBFbnRyeS5zZXRUaW1lKG9yaWdGaWxlLmxhc3RNb2RpZmllZCgpKTsKLQkJCQkJCXpvcy5wdXROZXh0RW50cnkoemlwRW50cnkpOwotCQkJCQkJRmlsZVV0aWxzLmNvcHlTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShvcmlnRmlsZSksIHRydWUsIHpvcywgZmFsc2UpOwotCQkJCQkJem9zLmNsb3NlRW50cnkoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCWJhY2t1cFByb3BzLmFkZEZpbGVUb0RlbGV0ZShuYW1lKTsKLQkJCQkJfQotCQkJCQlvcmlnRmlsZS5kZWxldGUoKTsKLQkJCQl9Ci0JCQkJaW4uY2xvc2VFbnRyeSgpOwotCQkJfQotCQkJaW4uY2xvc2UoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWJhY2t1cFByb3BzLnN0b3JlKCk7Ci0JCQlpZiAoem9zICE9IG51bGwpIHsKLQkJCQl6b3MuY2xvc2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXN0b3JlRmlsZXNGcm9tQmFja3VwKEZpbGUgcHJvcHNGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUJhY2t1cFByb3BlcnRpZXMgYmFja3VwUHJvcHMgPSBuZXcgQmFja3VwUHJvcGVydGllcyhwcm9wc0ZpbGUpOwotCQltb25pdG9yLmJlZ2luVGFzayhOTFMuYmluZChNZXNzYWdlcy5yZXN0b3JpbmcsIHByb3BzRmlsZS50b1N0cmluZygpKSwgMyk7Ci0JCW1vbml0b3Iuc3ViVGFzaygiIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChJdGVyYXRvciBpID0gYmFja3VwUHJvcHMuZ2V0RmlsZXNUb0RlbGV0ZSgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpLm5leHQoKTsKLQkJCUZpbGUgZnVsbCA9IG5ldyBGaWxlKGJhY2t1cFByb3BzLmdldFJvb3REaXIoKSwgbmFtZSk7Ci0JCQlmdWxsLmRlbGV0ZSgpOwotCQl9Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCQlGaWxlIHppcEZpbGUgPSBiYWNrdXBQcm9wcy5nZXRBcmNoaXZlKCk7Ci0JCWlmICh6aXBGaWxlLmV4aXN0cygpKSB7IC8vIG9ubHkgZXhpc3RzIGlmIGZpbGVzIHdlcmUgc2F2ZWQKLQkJCVN1YlByb2dyZXNzTW9uaXRvciBzdWIgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSyk7Ci0JCQlGaWxlVXRpbHMudW56aXBGaWxlKHppcEZpbGUsIGJhY2t1cFByb3BzLmdldFJvb3REaXIoKSwgIiIsIHN1Yik7IC8vJE5PTi1OTFMtMSQKLQkJCXppcEZpbGUuZGVsZXRlKCk7Ci0JCX0gZWxzZSB7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJfQotCQlmb3IgKEl0ZXJhdG9yIGkgPSBiYWNrdXBQcm9wcy5nZXREaXJzVG9EZWxldGUoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlGaWxlIGZ1bGwgPSBuZXcgRmlsZShiYWNrdXBQcm9wcy5nZXRSb290RGlyKCksIG5hbWUpOwotCQkJRmlsZVV0aWxzLmRlbGV0ZUVtcHR5RGlycyhmdWxsKTsKLQkJfQotCQlwcm9wc0ZpbGUuZGVsZXRlKCk7Ci0JCW1vbml0b3Iud29ya2VkKDEpOwotCQltb25pdG9yLmRvbmUoKTsKLQl9Ci0KLQkvLyBCYWNrdXAgZmlsZXMgYXJlIGp1c3QgMC5wcm9wZXJ0aWVzLCAxLnByb3BlcnRpZXMsIGV0Yy4KLQkvLyBHZXQgdGhlIG5leHQgdW51c2VkIG9uZS4KLQlGaWxlIGdldEJhY2t1cFByb3BlcnRpZXMoKSB7Ci0JCWZvciAoaW50IGkgPSAwOzsgaSArPSAxKSB7Ci0JCQlGaWxlIHJlc3VsdCA9IGdldEJhY2t1cFByb3BlcnRpZXMoaSk7Ci0JCQlpZiAoIXJlc3VsdC5leGlzdHMoKSkKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGdldEJhY2t1cFByb3BlcnRpZXMoaW50IGkpIHsKLQkJcmV0dXJuIG5ldyBGaWxlKEJhY2t1cEZpbGVzLnRoaXMuYmFja3VwRGlyLCBJbnRlZ2VyLnRvU3RyaW5nKGkpICsgUFJPUEVSVElFU19TVUZGSVgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgQmFja3VwUHJvcGVydGllcyBleHRlbmRzIFByb3BlcnRpZXMgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMjY4MzEzNDkyMzQ4NTMzMDI5TDsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBGSUxFX0tJTkQgPSAnZic7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRElSX0tJTkQgPSAnZCc7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX0RJUiA9ICJyb290RGlyIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJUSUZBQ1RfS0VZID0gImFydGlmYWN0S2V5IjsgLy8kTk9OLU5MUy0xJAotCQkvLwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX1VTRVIgPSAiYXJ0aWZhY3RVc2VyIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgaW50IG4gPSAwOyAvLyBudW1iZXIgb2YgcHJvcGVydGllcwotCQlwcml2YXRlIEZpbGUgZmlsZTsgLy8gZmlsZSB0byBzdG9yZSBwcm9wZXJ0aWVzIGluCi0JCXByaXZhdGUgTGlzdCBrZXlzID0gbmV3IExpbmtlZExpc3QoKTsgLy8ga2V5cywgaW4gb3JkZXIgdGhleSB3ZXJlIGFkZGVkIG9yIHJlYWQKLQkJcHJpdmF0ZSBmaW5hbCBGaWxlIHJvb3REaXI7IC8vIHJvb3Qgb2Ygd2hlcmUgZmlsZXMgYXJlIGdvaW5nCi0JCXByaXZhdGUgU2V0IGRpcnNUb0NyZWF0ZSA9IG5ldyBUcmVlU2V0KCk7IC8vIHNldCBvZiBkaXJzIHdlIHdpbGwgY3JlYXRlCi0KLQkJLy8gY3JlYXRlIHByb3BlcnRpZXMgYmFzZWQgb24gZmlsZSB3ZSBhcmUgYmFja2luZyB1cCB0bwotCQlwdWJsaWMgQmFja3VwUHJvcGVydGllcyhTdHJpbmcgaWRlbnRpZmllciwgRmlsZSByb290RGlyKSB7Ci0JCQl0aGlzLmZpbGUgPSBCYWNrdXBGaWxlcy50aGlzLmdldEJhY2t1cFByb3BlcnRpZXMoKTsKLQkJCXRoaXMucm9vdERpciA9IHJvb3REaXI7Ci0JCQlzZXRQcm9wZXJ0eShST09UX0RJUiwgcm9vdERpci5nZXRQYXRoKCkucmVwbGFjZSgnXFwnLCAnLycpKTsKLQkJCXNldFByb3BlcnR5KEFSVElGQUNUX0tFWSwgKGlkZW50aWZpZXIgIT0gbnVsbCA/IGlkZW50aWZpZXIgOiByb290RGlyLmdldEFic29sdXRlUGF0aCgpKSk7Ci0JCQkvLwkJCXNldFByb3BlcnR5KEFSVElGQUNUX1VTRVIsIGFydGlmYWN0LnRvVXNlclN0cmluZygpKTsKLQkJCS8vIG1ha2Ugc3VyZSByb290RGlyIGlzIGRlbGV0ZWQgaWYgYXBwcm9wcmlhdGUKLQkJCWFkZERpcigiLi8iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gY3JlYXRlIGJhY2t1cCBwcm9wZXJ0aWVzIGZyb20gYSBwcmV2aW91c2x5IHNhdmVkIEJhY2t1cFByb3BlcnRpZXMKLQkJcHVibGljIEJhY2t1cFByb3BlcnRpZXMoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJdGhpcy5maWxlID0gZmlsZTsKLQkJCUZpbGVJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJdHJ5IHsKLQkJCQlsb2FkKHN0cmVhbSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQkJdGhpcy5yb290RGlyID0gbmV3IEZpbGUoZ2V0UHJvcGVydHkoUk9PVF9ESVIpKTsKLQkJfQotCi0JCS8vCQlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0S2V5KCkgewotCQkvLwkJCXJldHVybiBnZXRQcm9wZXJ0eShBUlRJRkFDVF9LRVkpOwotCQkvLwkJfQotCi0JCS8vCQlwdWJsaWMgU3RyaW5nIGdldEFydGlmYWN0VXNlclN0cmluZygpIHsKLQkJLy8JCQlTdHJpbmcgcmVzdWx0ID0gZ2V0UHJvcGVydHkoQVJUSUZBQ1RfVVNFUik7Ci0JCS8vCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCS8vCQkJCXJldHVybiByZXN1bHQ7Ci0JCS8vCQkJfSBlbHNlIHsKLQkJLy8JCQkJLy8gcmV0dXJuIHNvbWV0aGluZyBpZiB0aGUga2V5IHdhc24ndCBzYXZlZAotCQkvLwkJCQlyZXN1bHQgPSBnZXRBcnRpZmFjdEtleSgpOwotCQkvLwkJCQlyZXN1bHQgPSByZXN1bHQucmVwbGFjZUZpcnN0KCIsbmF0aXZlLCIsICIsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkvLwkJCQlyZXR1cm4gcmVzdWx0LnJlcGxhY2UoJywnLCAnICcpLnRyaW0oKTsKLQkJLy8JCQl9Ci0JCS8vCQl9Ci0KLQkJcHVibGljIEZpbGUgZ2V0Um9vdERpcigpIHsKLQkJCXJldHVybiB0aGlzLnJvb3REaXI7Ci0JCX0KLQotCQkvLyBXZSBhcmUgYmFja2luZyB1cCBmaWxlcyBmb3IgdGhpcyBhcnRpZmFjdC4KLQkJLy8gQ3JlYXRlIGEgYmFja3VwIHppcCBiYXNlZCBvbiB0aGUgYXJ0aWZhY3Qga2V5IChhcyBhIGhpbnQpLgotCQlwdWJsaWMgRmlsZSBnZXRBcmNoaXZlKCkgewotCQkJU3RyaW5nIHBhdGggPSB0aGlzLmZpbGUuZ2V0UGF0aCgpOwotCQkJaWYgKHBhdGguZW5kc1dpdGgoUFJPUEVSVElFU19TVUZGSVgpKSB7Ci0JCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSBQUk9QRVJUSUVTX1NVRkZJWC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gbmV3IEZpbGUocGF0aCArIFpJUF9TVUZGSVgpOwotCQl9Ci0KLQkJcHVibGljIExpc3QgZ2V0RmlsZXNUb0RlbGV0ZSgpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ1Byb3BlcnRpZXMoRklMRV9LSU5EKTsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldERpcnNUb0RlbGV0ZSgpIHsKLQkJCXJldHVybiBnZXRNYXRjaGluZ1Byb3BlcnRpZXMoRElSX0tJTkQpOwotCQl9Ci0KLQkJcHJpdmF0ZSBMaXN0IGdldE1hdGNoaW5nUHJvcGVydGllcyhjaGFyIGMpIHsKLQkJCUxpc3QgcmVzdWx0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJCWZvciAoRW51bWVyYXRpb24gZSA9IHByb3BlcnR5TmFtZXMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChrZXkuZXF1YWxzKEJhY2t1cFByb3BlcnRpZXMuUk9PVF9ESVIpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQlpZiAoa2V5LmNoYXJBdCgwKSA9PSBjKSB7Ci0JCQkJCXJlc3VsdC5hZGQoZ2V0UHJvcGVydHkoa2V5KSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEZpbGVUb0RlbGV0ZShTdHJpbmcgbmFtZSkgewotCQkJYWRkKEZJTEVfS0lORCwgbmFtZSk7Ci0JCQlhZGREaXIobmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdG9yZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCQkvLyBhZGQgdGhlIGRpcmVjdG9yaWVzIC0tIGF0IGVuZCBiZWNhdXNlIHdlIHdhbnQgdGhlbSBhbGwgaW4gb3JkZXIKLQkJCWZvciAoSXRlcmF0b3IgaSA9IHRoaXMuZGlyc1RvQ3JlYXRlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQkJYWRkKERJUl9LSU5ELCBuYW1lKTsKLQkJCX0KLQkJCUZpbGVPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGhpcy5maWxlKTsKLQkJCXRyeSB7Ci0JCQkJc3RvcmUoc3RyZWFtLCAvKmhlYWRlciovbnVsbCk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBwdXQoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7Ci0JCQlpZiAoIShrZXkgaW5zdGFuY2VvZiBTdHJpbmcpKQotCQkJCXRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiZXhwZWN0ZWQgU3RyaW5nOiAiICsga2V5KTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpKQotCQkJCXRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiZXhwZWN0ZWQgU3RyaW5nOiAiICsgdmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLmtleXMuYWRkKGtleSk7Ci0JCQlyZXR1cm4gc3VwZXIucHV0KGtleSwgdmFsdWUpOwotCQl9Ci0KLQkJLy8gcmV0dXJuIGtleXMgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZAotCQlwdWJsaWMgc3luY2hyb25pemVkIEVudW1lcmF0aW9uIGtleXMoKSB7Ci0JCQlmaW5hbCBJdGVyYXRvciBpdGVyYXRvciA9IHRoaXMua2V5cy5pdGVyYXRvcigpOwotCQkJcmV0dXJuIG5ldyBFbnVtZXJhdGlvbigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCQkJCXJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKLQkJCQkJcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZChjaGFyIGtpbmQsIFN0cmluZyBuYW1lKSB7Ci0JCQlTdHJpbmdCdWZmZXIga2V5ID0gbmV3IFN0cmluZ0J1ZmZlcig0KTsKLQkJCWtleS5hcHBlbmQoa2luZCkuYXBwZW5kKG4rKyk7Ci0JCQlzZXRQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSwgbmFtZS5yZXBsYWNlKCdcXCcsICcvJykpOwotCQl9Ci0KLQkJLy8gaWYgd2UncmUgZ29pbmcgdG8gY3JlYXRlIHRoaXMgZGlyLCByZW1lbWJlciB0aGF0IHNvIHdlIGRlbGV0ZSBpdAotCQlwcml2YXRlIHZvaWQgYWRkRGlyKFN0cmluZyBuYW1lKSB7Ci0JCQlpbnQgc2xhc2ggPSBuYW1lLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAoc2xhc2ggPT0gLTEpCi0JCQkJcmV0dXJuOyAvLyBubyBkaXIKLQkJCVN0cmluZyBkaXJOYW1lID0gbmFtZS5zdWJzdHJpbmcoMCwgc2xhc2gpOwotCQkJaWYgKHRoaXMuZGlyc1RvQ3JlYXRlLmNvbnRhaW5zKGRpck5hbWUpKQotCQkJCXJldHVybjsgLy8gYWxyZWFkeSBoYXZlIGl0Ci0JCQlpZiAobmV3IEZpbGUodGhpcy5yb290RGlyLCBkaXJOYW1lKS5leGlzdHMoKSkKLQkJCQlyZXR1cm47IC8vIGFscmVhZHkgZXhpc3RzCi0JCQl0aGlzLmRpcnNUb0NyZWF0ZS5hZGQoZGlyTmFtZSk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL01lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZWJmY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnRvdWNocG9pbnQubmF0aXZlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLXB1YmxpYyBjbGFzcyBNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5uYXRpdmVzLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlIGFuZCBhc3NpZ24gdG8gZmllbGRzIGJlbG93Ci0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIE1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcnRpZmFjdF9ub3RfYXZhaWxhYmxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFydGlmYWN0X3JlcG9fbm90X2ZvdW5kOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvdWxkX25vdF9vYnRhaW5fZG93bmxvYWRfY2FjaGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG93bmxvYWRfY2FjaGVfbm90X3dyaXRlYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyB1bnppcHBpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzdG9yaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcmFtX25vdF9zZXQ7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL05hdGl2ZVRvdWNocG9pbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL05hdGl2ZVRvdWNocG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ4ZTA3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvbmF0aXZlcy9OYXRpdmVUb3VjaHBvaW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5uYXRpdmVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuZW5naW5lLlByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMuYWN0aW9ucy5MaW5rQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmxvY2F0aW9uLkFnZW50TG9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuVmVyc2lvbjsKLQotcHVibGljIGNsYXNzIE5hdGl2ZVRvdWNocG9pbnQgZXh0ZW5kcyBUb3VjaHBvaW50IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9UQVJHRVRfRklMRSA9ICJ0YXJnZXRGaWxlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1BFUk1JU1NJT05TID0gInBlcm1pc3Npb25zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1RBUkdFVF9ESVIgPSAidGFyZ2V0RGlyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1RBUkdFVCA9ICJ0YXJnZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DSE1PRCA9ICJjaG1vZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9JVSA9ICJpdSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElQRSA9ICJ8IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX1NPVVJDRSA9ICJzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fQVJUSUZBQ1QgPSAiQGFydGlmYWN0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX0lOU1RBTExfRk9MREVSID0gImluc3RhbGxGb2xkZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BVElWRV9UT1VDSFBPSU5UX1RZUEUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5uYXRpdmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DTEVBTlVQWklQID0gImNsZWFudXB6aXAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9VTlpJUCA9ICJ1bnppcCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9BUlRJRkFDVF9SRVFVRVNUUyA9ICJhcnRpZmFjdFJlcXVlc3RzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX09QRVJBTkQgPSAib3BlcmFuZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9QUk9GSUxFID0gInByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9DT0xMRUNUID0gImNvbGxlY3QiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBJU3RhdHVzIGNyZWF0ZUVycm9yKFN0cmluZyBtZXNzYWdlKSB7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIElELCBtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgUHJvdmlzaW9uaW5nQWN0aW9uIGdldEFjdGlvbihTdHJpbmcgYWN0aW9uSWQpIHsKLQkJaWYgKGFjdGlvbklkLmVxdWFscyhBQ1RJT05fQ09MTEVDVCkpIHsKLQkJCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nQWN0aW9uKCkgewotCQkJCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJCQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoUEFSTV9QUk9GSUxFKTsKLQkJCQkJSW5zdGFsbGFibGVVbml0T3BlcmFuZCBvcGVyYW5kID0gKEluc3RhbGxhYmxlVW5pdE9wZXJhbmQpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fT1BFUkFORCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJQXJ0aWZhY3RSZXF1ZXN0W10gcmVxdWVzdHMgPSBjb2xsZWN0KG9wZXJhbmQuc2Vjb25kKCksIHByb2ZpbGUpOwotCQkJCQkJQ29sbGVjdGlvbiBhcnRpZmFjdFJlcXVlc3RzID0gKENvbGxlY3Rpb24pIHBhcmFtZXRlcnMuZ2V0KFBBUk1fQVJUSUZBQ1RfUkVRVUVTVFMpOwotCQkJCQkJYXJ0aWZhY3RSZXF1ZXN0cy5hZGQocmVxdWVzdHMpOwotCQkJCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuIGUuZ2V0U3RhdHVzKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCi0JCQkJcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQkJCQkvLyBub3RoaW5nIHRvIGRvIGZvciBub3cKLQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJfQotCQkJfTsKLQkJfQotCi0JCWlmIChhY3Rpb25JZC5lcXVhbHMoQUNUSU9OX1VOWklQKSkgewotCQkJcmV0dXJuIG5ldyBQcm92aXNpb25pbmdBY3Rpb24oKSB7Ci0JCQkJcHVibGljIElTdGF0dXMgZXhlY3V0ZShNYXAgcGFyYW1ldGVycykgewotCQkJCQlyZXR1cm4gdW56aXAocGFyYW1ldGVycyk7Ci0JCQkJfQotCi0JCQkJcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQkJCQlyZXR1cm4gY2xlYW51cHppcChwYXJhbWV0ZXJzKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWlmIChhY3Rpb25JZC5lcXVhbHMoQUNUSU9OX0NMRUFOVVBaSVApKSB7Ci0JCQlyZXR1cm4gbmV3IFByb3Zpc2lvbmluZ0FjdGlvbigpIHsKLQkJCQlwdWJsaWMgSVN0YXR1cyBleGVjdXRlKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCQkJCXJldHVybiBjbGVhbnVwemlwKHBhcmFtZXRlcnMpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJCQkJcmV0dXJuIHVuemlwKHBhcmFtZXRlcnMpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQotCQlpZiAoYWN0aW9uSWQuZXF1YWxzKEFDVElPTl9DSE1PRCkpIHsKLQkJCXJldHVybiBuZXcgUHJvdmlzaW9uaW5nQWN0aW9uKCkgewotCQkJCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJCQkJU3RyaW5nIHRhcmdldERpciA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fVEFSR0VUX0RJUik7Ci0JCQkJCWlmICh0YXJnZXREaXIgPT0gbnVsbCkKLQkJCQkJCXJldHVybiBjcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbV9ub3Rfc2V0LCBQQVJNX1RBUkdFVF9ESVIsIEFDVElPTl9DSE1PRCkpOwotCQkJCQlTdHJpbmcgdGFyZ2V0RmlsZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fVEFSR0VUX0ZJTEUpOwotCQkJCQlpZiAodGFyZ2V0RmlsZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIGNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtX25vdF9zZXQsIFBBUk1fVEFSR0VUX0ZJTEUsIEFDVElPTl9DSE1PRCkpOwotCQkJCQlTdHJpbmcgcGVybWlzc2lvbnMgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChQQVJNX1BFUk1JU1NJT05TKTsKLQkJCQkJaWYgKHBlcm1pc3Npb25zID09IG51bGwpCi0JCQkJCQlyZXR1cm4gY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1fbm90X3NldCwgUEFSTV9QRVJNSVNTSU9OUywgQUNUSU9OX0NITU9EKSk7Ci0KLQkJCQkJbmV3IFBlcm1pc3Npb25zKCkuY2htb2QodGFyZ2V0RGlyLCB0YXJnZXRGaWxlLCBwZXJtaXNzaW9ucyk7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQotCQkJCXB1YmxpYyBJU3RhdHVzIHVuZG8oTWFwIHBhcmFtZXRlcnMpIHsKLQkJCQkJLy9UT0RPOiBpbXBsZW1lbnQgdW5kbyA/PwotCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0KLQkJaWYgKGFjdGlvbklkLmVxdWFscyhMaW5rQWN0aW9uLklEKSkgewotCQkJcmV0dXJuIG5ldyBMaW5rQWN0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFRvdWNocG9pbnRUeXBlIGdldFRvdWNocG9pbnRUeXBlKCkgewotCQlyZXR1cm4gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZVRvdWNocG9pbnRUeXBlKE5BVElWRV9UT1VDSFBPSU5UX1RZUEUsIG5ldyBWZXJzaW9uKDEsIDAsIDApKTsKLQl9Ci0KLQlJQXJ0aWZhY3RSZXF1ZXN0W10gY29sbGVjdChJSW5zdGFsbGFibGVVbml0IGluc3RhbGxhYmxlVW5pdCwgSVByb2ZpbGUgcHJvZmlsZSkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUlBcnRpZmFjdEtleVtdIHRvRG93bmxvYWQgPSBpbnN0YWxsYWJsZVVuaXQuZ2V0QXJ0aWZhY3RzKCk7Ci0JCWlmICh0b0Rvd25sb2FkID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElBcnRpZmFjdFJlcXVlc3RbMF07Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnkgZGVzdGluYXRpb24gPSBnZXREb3dubG9hZENhY2hlUmVwbygpOwotCQlJQXJ0aWZhY3RSZXF1ZXN0W10gcmVxdWVzdHMgPSBuZXcgSUFydGlmYWN0UmVxdWVzdFt0b0Rvd25sb2FkLmxlbmd0aF07Ci0JCWludCBjb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9Eb3dubG9hZC5sZW5ndGg7IGkrKykgewotCQkJLy9UT0RPIEhlcmUgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIHRoZSBkb3dubG9hZCBpcyBub3QgbmVjZXNzYXJ5IGFnYWluIGJlY2F1c2Ugd2hhdCBuZWVkcyB0byBiZSBkb25lIGlzIGp1c3QgYSBjb25maWd1cmF0aW9uIHN0ZXAKLQkJCXJlcXVlc3RzW2NvdW50KytdID0gZ2V0QXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlcigpLmNyZWF0ZU1pcnJvclJlcXVlc3QodG9Eb3dubG9hZFtpXSwgZGVzdGluYXRpb24pOwotCQl9Ci0KLQkJaWYgKHJlcXVlc3RzLmxlbmd0aCA9PSBjb3VudCkKLQkJCXJldHVybiByZXF1ZXN0czsKLQkJSUFydGlmYWN0UmVxdWVzdFtdIHJlc3VsdCA9IG5ldyBJQXJ0aWZhY3RSZXF1ZXN0W2NvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weShyZXF1ZXN0cywgMCwgcmVzdWx0LCAwLCBjb3VudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5zdGFsbEZvbGRlcihJUHJvZmlsZSBwcm9maWxlKSB7Ci0JCXJldHVybiBwcm9maWxlLmdldFByb3BlcnR5KElQcm9maWxlLlBST1BfSU5TVEFMTF9GT0xERVIpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEFnZW50TG9jYXRpb24gZ2V0QWdlbnRMb2NhdGlvbigpIHsKLQkJcmV0dXJuIChBZ2VudExvY2F0aW9uKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgQWdlbnRMb2NhdGlvbi5jbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIGdldEFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIoKSB7Ci0JCXJldHVybiAoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5jbGFzcy5nZXROYW1lKCkpOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IGdldERvd25sb2FkQ2FjaGVSZXBvKCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCVVSTCBsb2NhdGlvbiA9IGdldERvd25sb2FkQ2FjaGVMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZXMuY291bGRfbm90X29idGFpbl9kb3dubG9hZF9jYWNoZSk7Ci0JCUlBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyIG1hbmFnZXIgPSBnZXRBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLmFydGlmYWN0X3JlcG9fbm90X2ZvdW5kKTsKLQkJSUFydGlmYWN0UmVwb3NpdG9yeSByZXBvc2l0b3J5OwotCQl0cnkgewotCQkJcmVwb3NpdG9yeSA9IG1hbmFnZXIubG9hZFJlcG9zaXRvcnkobG9jYXRpb24sIG51bGwpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJLy8gdGhlIGRvd25sb2FkIGNhY2hlIGRvZXNuJ3QgZXhpc3Qgb3IgY291bGRuJ3QgYmUgcmVhZC4gQ3JlYXRlIG5ldyBjYWNoZS4KLQkJCVN0cmluZyByZXBvc2l0b3J5TmFtZSA9IGxvY2F0aW9uICsgIiAtIEFnZW50IGRvd25sb2FkIGNhY2hlIjsgLy8kTk9OLU5MUy0xJAotCQkJTWFwIHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCgxKTsKLQkJCXByb3BlcnRpZXMucHV0KElSZXBvc2l0b3J5LlBST1BfU1lTVEVNLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCQlyZXBvc2l0b3J5ID0gbWFuYWdlci5jcmVhdGVSZXBvc2l0b3J5KGxvY2F0aW9uLCByZXBvc2l0b3J5TmFtZSwgSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuVFlQRV9TSU1QTEVfUkVQT1NJVE9SWSwgcHJvcGVydGllcyk7Ci0JCX0KLQotCQlJRmlsZUFydGlmYWN0UmVwb3NpdG9yeSBkb3dubG9hZENhY2hlID0gKElGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5KSByZXBvc2l0b3J5LmdldEFkYXB0ZXIoSUZpbGVBcnRpZmFjdFJlcG9zaXRvcnkuY2xhc3MpOwotCQlpZiAoZG93bmxvYWRDYWNoZSA9PSBudWxsKQotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihOTFMuYmluZChNZXNzYWdlcy5kb3dubG9hZF9jYWNoZV9ub3Rfd3JpdGVhYmxlLCBsb2NhdGlvbikpOwotCQlyZXR1cm4gZG93bmxvYWRDYWNoZTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBVUkwgZ2V0RG93bmxvYWRDYWNoZUxvY2F0aW9uKCkgewotCQlBZ2VudExvY2F0aW9uIGxvY2F0aW9uID0gZ2V0QWdlbnRMb2NhdGlvbigpOwotCQlyZXR1cm4gKGxvY2F0aW9uICE9IG51bGwgPyBsb2NhdGlvbi5nZXRBcnRpZmFjdFJlcG9zaXRvcnlVUkwoKSA6IG51bGwpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGluaXRpYWxpemVQaGFzZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElQcm9maWxlIHByb2ZpbGUsIFN0cmluZyBwaGFzZUlkLCBNYXAgdG91Y2hwb2ludFBhcmFtZXRlcnMpIHsKLQkJdG91Y2hwb2ludFBhcmFtZXRlcnMucHV0KFBBUk1fSU5TVEFMTF9GT0xERVIsIGdldEluc3RhbGxGb2xkZXIocHJvZmlsZSkpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlJU3RhdHVzIHVuemlwKE1hcCBwYXJhbWV0ZXJzKSB7Ci0JCVN0cmluZyBzb3VyY2UgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChQQVJNX1NPVVJDRSk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBjcmVhdGVFcnJvcihOTFMuYmluZChNZXNzYWdlcy5wYXJhbV9ub3Rfc2V0LCBQQVJNX1NPVVJDRSwgQUNUSU9OX1VOWklQKSk7Ci0KLQkJU3RyaW5nIG9yaWdpbmFsU291cmNlID0gc291cmNlOwotCQlTdHJpbmcgdGFyZ2V0ID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoUEFSTV9UQVJHRVQpOwotCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm4gY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1fbm90X3NldCwgUEFSTV9UQVJHRVQsIEFDVElPTl9VTlpJUCkpOwotCi0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgcGFyYW1ldGVycy5nZXQoUEFSTV9JVSk7Ci0JCVByb2ZpbGUgcHJvZmlsZSA9IChQcm9maWxlKSBwYXJhbWV0ZXJzLmdldChQQVJNX1BST0ZJTEUpOwotCi0JCWlmIChzb3VyY2UuZXF1YWxzKFBBUk1fQVJUSUZBQ1QpKSB7Ci0JCQkvL1RPRE86IGZpeCB3aGVyZXZlciB0aGlzIG9jY3VycyAtLSBpbnZlc3RpZ2F0ZSBhcyB0aGlzIGlzIHByb2JhYmx5IG5vdCBkZXNpcmVkCi0JCQlpZiAoaXUuZ2V0QXJ0aWZhY3RzKCkgPT0gbnVsbCB8fCBpdS5nZXRBcnRpZmFjdHMoKS5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQkJSUFydGlmYWN0S2V5IGFydGlmYWN0S2V5ID0gaXUuZ2V0QXJ0aWZhY3RzKClbMF07Ci0KLQkJCUlGaWxlQXJ0aWZhY3RSZXBvc2l0b3J5IGRvd25sb2FkQ2FjaGU7Ci0JCQl0cnkgewotCQkJCWRvd25sb2FkQ2FjaGUgPSBnZXREb3dubG9hZENhY2hlUmVwbygpOwotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJCX0KLQkJCUZpbGUgZmlsZUxvY2F0aW9uID0gZG93bmxvYWRDYWNoZS5nZXRBcnRpZmFjdEZpbGUoYXJ0aWZhY3RLZXkpOwotCQkJaWYgKChmaWxlTG9jYXRpb24gPT0gbnVsbCkgfHwgIWZpbGVMb2NhdGlvbi5leGlzdHMoKSkKLQkJCQlyZXR1cm4gY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMuYXJ0aWZhY3Rfbm90X2F2YWlsYWJsZSwgYXJ0aWZhY3RLZXkpKTsKLQkJCXNvdXJjZSA9IGZpbGVMb2NhdGlvbi5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJfQotCi0JCUZpbGVbXSB1bnppcHBlZEZpbGVzID0gbmV3IFppcCgpLnVuemlwKHNvdXJjZSwgdGFyZ2V0LCBudWxsKTsKLQkJU3RyaW5nQnVmZmVyIHVuemlwcGVkRmlsZU5hbWVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdW56aXBwZWRGaWxlcy5sZW5ndGg7IGkrKykKLQkJCXVuemlwcGVkRmlsZU5hbWVCdWZmZXIuYXBwZW5kKHVuemlwcGVkRmlsZXNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpLmFwcGVuZChQSVBFKTsKLQotCQlwcm9maWxlLnNldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGl1LCAidW56aXBwZWQiICsgUElQRSArIG9yaWdpbmFsU291cmNlICsgUElQRSArIHRhcmdldCwgdW56aXBwZWRGaWxlTmFtZUJ1ZmZlci50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIGNsZWFudXB6aXAoTWFwIHBhcmFtZXRlcnMpIHsKLQkJU3RyaW5nIHNvdXJjZSA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fU09VUkNFKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIGNyZWF0ZUVycm9yKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtX25vdF9zZXQsIFBBUk1fU09VUkNFLCBBQ1RJT05fQ0xFQU5VUFpJUCkpOwotCQlTdHJpbmcgdGFyZ2V0ID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoUEFSTV9UQVJHRVQpOwotCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQlyZXR1cm4gY3JlYXRlRXJyb3IoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1fbm90X3NldCwgUEFSTV9UQVJHRVQsIEFDVElPTl9DTEVBTlVQWklQKSk7Ci0KLQkJSUluc3RhbGxhYmxlVW5pdCBpdSA9IChJSW5zdGFsbGFibGVVbml0KSBwYXJhbWV0ZXJzLmdldChQQVJNX0lVKTsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgcGFyYW1ldGVycy5nZXQoUEFSTV9QUk9GSUxFKTsKLQotCQlTdHJpbmcgdW56aXBwZWQgPSBwcm9maWxlLmdldEluc3RhbGxhYmxlVW5pdFByb3BlcnR5KGl1LCAidW56aXBwZWQiICsgUElQRSArIHNvdXJjZSArIFBJUEUgKyB0YXJnZXQpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKHVuemlwcGVkID09IG51bGwpCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih1bnppcHBlZCwgUElQRSk7Ci0JCUxpc3QgZGlyZWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgZmlsZU5hbWUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlTmFtZSk7Ci0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpCi0JCQkJZGlyZWN0b3JpZXMuYWRkKGZpbGUpOwotCQkJZWxzZQotCQkJCWZpbGUuZGVsZXRlKCk7Ci0JCX0KLQotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZGlyZWN0b3JpZXMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJRmlsZSBkaXJlY3RvcnkgPSAoRmlsZSkgaXQubmV4dCgpOwotCQkJZGlyZWN0b3J5LmRlbGV0ZSgpOwotCQl9Ci0KLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvUGVybWlzc2lvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL1Blcm1pc3Npb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyN2MzN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvUGVybWlzc2lvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgUmVkIEhhdCBJbmNvcnBvcmF0ZWQKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIFJlZCBIYXQgSW5jb3Jwb3JhdGVkIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50Lm5hdGl2ZXM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLQotcHVibGljIGNsYXNzIFBlcm1pc3Npb25zIHsKLQlwdWJsaWMgdm9pZCBjaG1vZChTdHJpbmcgdGFyZ2V0RGlyLCBTdHJpbmcgdGFyZ2V0RmlsZSwgU3RyaW5nIHBlcm1zKSB7Ci0JCVJ1bnRpbWUgciA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOwotCQl0cnkgewotCQkJci5leGVjKG5ldyBTdHJpbmdbXSB7ImNobW9kIiwgcGVybXMsIHRhcmdldERpciArIElQYXRoLlNFUEFSQVRPUiArIHRhcmdldEZpbGV9KTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBGSVhNRTogIHdlIHNob3VsZCBwcm9iYWJseSB0aHJvdyBzb21lIHNvcnQgb2YgZXJyb3IgaGVyZQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2htb2QoU3RyaW5nIHRhcmdldCwgU3RyaW5nIHRhcmdldEZpbGUsIGludCBwZXJtcykgewotCQljaG1vZCh0YXJnZXQsIHRhcmdldEZpbGUsIEludGVnZXIudG9TdHJpbmcocGVybXMpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvbmF0aXZlcy9VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvbmF0aXZlcy9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MGZhZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5uYXRpdmVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci0KLXB1YmxpYyBjbGFzcyBVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coU3RyaW5nIG1zZykgewotCQlsb2cobmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBBY3RpdmF0b3IuSUQsIElTdGF0dXMuT0ssIG1zZywgbnVsbCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coSVN0YXR1cyBzdGF0dXMpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKFV0aWwuY2xhc3MuZ2V0TmFtZSgpICsgIiAiICsgc3RhdHVzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXhjZXB0aW9uKFN0cmluZyBtc2cpIHsKLQkJcmV0dXJuIG5ldyBDb3JlRXhjZXB0aW9uKGVycm9yU3RhdHVzKG1zZywgbnVsbCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ29yZUV4Y2VwdGlvbiBjb3JlRXhjZXB0aW9uKFRocm93YWJsZSBlLCBTdHJpbmcgbXNnKSB7Ci0JCXJldHVybiBuZXcgQ29yZUV4Y2VwdGlvbihlcnJvclN0YXR1cyhtc2csIGUpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElTdGF0dXMgZXJyb3JTdGF0dXMoU3RyaW5nIG1zZywgVGhyb3dhYmxlIGUpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBJU3RhdHVzLk9LLCBtc2csIGUpOwotCX0KLQotCS8qKgotCSAqIFNwbGl0IG1vbml0b3IgaW50byBuIGVxdWFsIHN1Yi1tb25pdG9ycyBhbmQgcmV0dXJuIHRoZW0uCi0JICogVGhpcyBjYWxscyBiZWdpblRhc2sgb24gbW9uaXRvciBhbmQgYXNzaWducyBhbGwgaXRzIHRpbWUgdG8gdGhlIHN1Yi1tb25pdG9ycy4KLQkgKiBtb25pdG9yIG1heSBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVByb2dyZXNzTW9uaXRvcltdIHNwbGl0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgaW50IG4pIHsKLQkJaWYgKG1vbml0b3IgPT0gbnVsbCB8fCBtb25pdG9yIGluc3RhbmNlb2YgTnVsbFByb2dyZXNzTW9uaXRvcikgewotCQkJbW9uaXRvciA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgbik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJUHJvZ3Jlc3NNb25pdG9yW10gcmVzdWx0ID0gbmV3IElQcm9ncmVzc01vbml0b3Jbbl07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSArPSAxKSB7Ci0JCQlyZXN1bHRbaV0gPSBjcmVhdGVTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJvZ3Jlc3NNb25pdG9yIGNyZWF0ZVN1YlByb2dyZXNzTW9uaXRvcihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIGludCB0aWNrcykgewotCQlpZiAobW9uaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLQkJcmV0dXJuIG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgdGlja3MsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvbmF0aXZlcy9aaXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL1ppcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTNjNDI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL1ppcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5uYXRpdmVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8vVE9ETzogRG8gd2UgbmVlZCB0aGlzIGNsYXNzIG9yIGlzIGp1c3QgdXNpbmcgRmlsZVV0aWxzLnVuemlwIHN1ZmZpY2llbnQ/Ci0vL1RPRE8gQmUgY2FyZWZ1bCBoZXJlIHdpdGggdGhlIHBlcm1pc3Npb25zLi4uLiBXZSBtYXkgbmVlZCB0byBoYXZlIGEgcHJvcGVyIHVuemlwIHRlY2hub2xvZ3kgaGVyZSB0aGF0IHN1cHBvcnRzIGZpbGUgcGVybWlzc2lvbnMgZm9yIGxpbnV4Ci1wdWJsaWMgY2xhc3MgWmlwIHsKLQlwdWJsaWMgRmlsZVtdIHVuemlwKFN0cmluZyBzb3VyY2UsIFN0cmluZyBkZXN0aW5hdGlvbiwgU3RyaW5nIGJhY2t1cERpcikgewotCQkvLwkJSUFydGlmYWN0IGFydGlmYWN0ID0gZGF0YS5nZXRBcnRpZmFjdCgpOwotCQkvLwkJU3RyaW5nIGRlc3RpbmF0aW9uID0gcGVyZm9ybVZhcmlhYmxlU3Vic3RpdHV0aW9ucyhkYXRhLmdldERlc3RpbmF0aW9uKCkpOwotCQkvLwkJaWYgKGNhbkluc3RhbGxBcnRpZmFjdCgpKSB7Ci0JCS8vVE9ETyBpZiBhcnRpZmFjdCBoYXMgaXNFeHBsb2RlZD09dHJ1ZSBzaG91bGQgcGFzcyBpbiBwcm9ncmVzcyBtb25pdG9yCi0JCS8vIGZvciB1bnppcHBpbmcKLQkJRmlsZSB6aXBGaWxlID0gbmV3IEZpbGUoc291cmNlKTsKLQkJaWYgKHppcEZpbGUgPT0gbnVsbCB8fCAhemlwRmlsZS5leGlzdHMoKSkgewotCQkJLy8gaW50ZXJuYWwgZXJyb3I/Ci0JCQlVdGlsLmxvZyh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB0aGUgZmlsZXMgdG8gYmUgdW56aXBwZWQgaXMgbm90IGhlcmUiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8JCQl0aHJvdyBVdGlsLmNvcmVFeGNlcHRpb24obnVsbCwgTkxTLmJpbmQoTWVzc2FnZXMuZmFpbGVkX3RvX2Rvd25sb2FkX2FydGlmYWN0LCBzb3VyY2UpKTsKLQkJfQotCi0JCS8vCQlJUHJvZ3Jlc3NNb25pdG9yW10gcG0gPSAgbmV3IFNwbGl0UHJvZ3Jlc3NNb25pdG9yKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIDIpOwotCQkvLwkJSVByb2dyZXNzTW9uaXRvciBiYWNrdXBQTSA9IHBtWzBdOwotCQkvLwkJSVByb2dyZXNzTW9uaXRvciB1bnppcFBNID0gcG1bMV07Ci0JCXRyeSB7Ci0JCQkvLyBTZXQgRGVzdGluYXRpb24gbG9jYXRpb24KLQkJCS8vCQkJUGF0aCBkZXN0UGF0aCA9IG5ldyBQYXRoKGRlc3RpbmF0aW9uKTsKLQkJCS8vCQkJaWYgKGRlc3RQYXRoLmlzQWJzb2x1dGUoKSkgewotCQkJLy8JCQkJZGVzdGluYXRpb25EaXIgPSBkZXN0UGF0aC50b0ZpbGUoKTsKLQkJCS8vCQkJfSBlbHNlIHsKLQkJCS8vCQkJCWRlc3RpbmF0aW9uRGlyID0gbmV3IEZpbGUoZ2V0TG9jYXRpb24oUHJvZmlsZS5JTlNUQUxMX0xPQ0FUSU9OKSk7Ci0JCQkvLwkJCQlpZiAoIWRlc3RpbmF0aW9uLmVxdWFscygiLiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vCQkJCQlkZXN0aW5hdGlvbkRpciA9IG5ldyBGaWxlKGRlc3RpbmF0aW9uRGlyLCBkZXN0aW5hdGlvbik7Ci0JCQkvLwkJCQl9Ci0JCQkvLwkJCX0KLQotCQkJaWYgKGJhY2t1cERpciAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8JCQkJYmFja3VwUE0uYmVnaW5UYXNrKE1lc3NhZ2VzLmJhY2tpbmdfdXAsIDEpOwotCQkJCQlCYWNrdXBGaWxlcyBiYWNrdXBGaWxlcyA9IG5ldyBCYWNrdXBGaWxlcyhuZXcgRmlsZShiYWNrdXBEaXIpKTsKLQkJCQkJYmFja3VwRmlsZXMuYmFja3VwRmlsZXNJblppcChiYWNrdXBEaXIsIHppcEZpbGUudG9VUkwoKSwgbmV3IEZpbGUoZGVzdGluYXRpb24pLCBudWxsKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCVV0aWwubG9nKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNvbWV0aGluZyB3ZW50IHdyb25nIHdoZW4gYmFja2luZyB1cCB0aGUgZmlsZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLwkJCQl0aHJvdyBVdGlsLmNvcmVFeGNlcHRpb24oZSwgTkxTLmJpbmQoTWVzc2FnZXMuZXJyb3JfYmFja2luZ191cCwgemlwRmlsZSkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCS8vCQkJCWJhY2t1cFBNLmRvbmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQl0cnkgewotCQkJCVN0cmluZyB0YXNrTmFtZSA9IE5MUy5iaW5kKE1lc3NhZ2VzLnVuemlwcGluZywgc291cmNlKTsKLQkJCQlyZXR1cm4gRmlsZVV0aWxzLnVuemlwRmlsZSh6aXBGaWxlLCBuZXcgRmlsZShkZXN0aW5hdGlvbiksIHRhc2tOYW1lLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlVdGlsLmxvZyh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzb21ldGhpbmcgd2VudCB3cm9uZyB3aGVuIHVuemlwcGluZyIpOyAvLyROT04tTkxTLTEkCi0JCQkJVXRpbC5sb2coInppcGZpbGU6ICIgKyB6aXBGaWxlLmdldEFic29sdXRlUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCVV0aWwubG9nKCJkZXN0aW5hdGlvbjogIiArIGRlc3RpbmF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vCQkJCXRocm93IFV0aWwuY29yZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCS8vCQkJCXVuemlwUE0uZG9uZSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJLy8JCQltb25pdG9yLmRvbmUoKTsKLQkJfQotCQkvLwkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5uYXRpdmVzL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3RvdWNocG9pbnQvbmF0aXZlcy9hY3Rpb25zL0xpbmtBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL2FjdGlvbnMvTGlua0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzYxM2QyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL2FjdGlvbnMvTGlua0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudG91Y2hwb2ludC5uYXRpdmVzLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMuTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMuVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIExpbmtBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImxuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fVEFSR0VUX0RJUiA9ICJ0YXJnZXREaXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9MSU5LX05BTUUgPSAibGlua05hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSTV9MSU5LX1RBUkdFVCA9ICJsaW5rVGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUk1fTElOS19GT1JDRSA9ICJmb3JjZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBJU3RhdHVzIGV4ZWN1dGUoTWFwIHBhcmFtZXRlcnMpIHsKLQkJU3RyaW5nIHRhcmdldERpciA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fVEFSR0VUX0RJUik7Ci0JCWlmICh0YXJnZXREaXIgPT0gbnVsbCkKLQkJCXJldHVybiBVdGlsLmVycm9yU3RhdHVzKE5MUy5iaW5kKE1lc3NhZ2VzLnBhcmFtX25vdF9zZXQsIFBBUk1fVEFSR0VUX0RJUiwgSUQpLCBudWxsKTsKLQotCQlTdHJpbmcgbGlua1RhcmdldCA9IChTdHJpbmcpIHBhcmFtZXRlcnMuZ2V0KFBBUk1fTElOS19UQVJHRVQpOwotCQlpZiAobGlua1RhcmdldCA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuZXJyb3JTdGF0dXMoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1fbm90X3NldCwgUEFSTV9MSU5LX1RBUkdFVCwgSUQpLCBudWxsKTsKLQotCQlTdHJpbmcgbGlua05hbWUgPSAoU3RyaW5nKSBwYXJhbWV0ZXJzLmdldChQQVJNX0xJTktfTkFNRSk7Ci0JCWlmIChsaW5rTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIFV0aWwuZXJyb3JTdGF0dXMoTkxTLmJpbmQoTWVzc2FnZXMucGFyYW1fbm90X3NldCwgUEFSTV9MSU5LX05BTUUsIElEKSwgbnVsbCk7Ci0KLQkJU3RyaW5nIGZvcmNlID0gKFN0cmluZykgcGFyYW1ldGVycy5nZXQoUEFSTV9MSU5LX0ZPUkNFKTsKLQotCQlsbih0YXJnZXREaXIsIGxpbmtUYXJnZXQsIGxpbmtOYW1lLCBCb29sZWFuLnZhbHVlT2YoZm9yY2UpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgdW5kbyhNYXAgcGFyYW1ldGVycykgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBsbihTdHJpbmcgdGFyZ2V0RGlyLCBTdHJpbmcgbGlua1RhcmdldCwgU3RyaW5nIGxpbmtOYW1lLCBib29sZWFuIGZvcmNlKSB7Ci0JCVJ1bnRpbWUgciA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpOwotCQl0cnkgewotCQkJci5leGVjKG5ldyBTdHJpbmdbXSB7ImxuIiwgIi1zIiArIChmb3JjZSA/ICJmIiA6ICIiKSwgbGlua1RhcmdldCwgdGFyZ2V0RGlyICsgSVBhdGguU0VQQVJBVE9SICsgbGlua05hbWV9KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdG91Y2hwb2ludC9uYXRpdmVzL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOGJhMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcy9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi90b3VjaHBvaW50L25hdGl2ZXMvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLWFydGlmYWN0X3JlcG9fbm90X2ZvdW5kPVRoZSBhcnRpZmFjdCByZXBvc2l0b3J5IG1hbmFnZXIgY291bGQgbm90IGJlIGZvdW5kLgotY291bGRfbm90X29idGFpbl9kb3dubG9hZF9jYWNoZT1Db3VsZCBub3Qgb2J0YWluIHRoZSBkb3dubG9hZCBjYWNoZSBsb2NhdGlvbi4KLWRvd25sb2FkX2NhY2hlX25vdF93cml0ZWFibGU9QWdlbnQgZG93bmxvYWQgY2FjaGUgbm90IHdyaXRlYWJsZTogezB9LgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIE5hdGl2ZUluc3RhbGxBZGFwdGVyCi1hcnRpZmFjdF9ub3RfYXZhaWxhYmxlPVRoZSBhcnRpZmFjdCBmb3IgezB9IGlzIG5vdCBhdmFpbGFibGUuCi1yZXN0b3Jpbmc9UmVzdG9yaW5nIHswfQotCi0KLXVuemlwcGluZz1FeHRyYWN0aW5nIHswfQotCi1wYXJhbV9ub3Rfc2V0PVRoZSBcInswfVwiIHBhcmFtZXRlciB3YXMgbm90IHNldCBpbiB0aGUgXCJ7MX1cIiBhY3Rpb24uCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTczOTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1ZTgyZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OTJmODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NTIzY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotI1RodSBBdWcgMTYgMTE6MDA6NTkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1YTM2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1OToyNSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMWVmNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUaHUgSnVsIDI2IDE5OjEzOjEyIEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVhMGNkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5yY3AuQWN0aXZhdG9yCi1CdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSjJTRS0xLjQsCi0gQ0RDLTEuMS9Gb3VuZGF0aW9uLTEuMQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLnJjcDt4LWludGVybmFsOj10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL1Byb3ZBZG1pblVJLmxhdW5jaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvUHJvdkFkbWluVUkubGF1bmNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTc0MTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvUHJvdkFkbWluVUkubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLnBkZS51aS5FcXVpbm94TGF1bmNoZXIiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJhcHBlbmQuYXJncyIgdmFsdWU9InRydWUiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljQWRkIiB2YWx1ZT0iZmFsc2UiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iYXV0b21hdGljVmFsaWRhdGUiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImJvb3RzdHJhcCIgdmFsdWU9IiIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9ImNoZWNrZWQiIHZhbHVlPSJbTk9ORV0iLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0iY2xlYXJDb25maWciIHZhbHVlPSJ0cnVlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iY29uZmlnTG9jYXRpb24iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2N9Ly5tZXRhZGF0YS8ucGx1Z2lucy9vcmcuZWNsaXBzZS5wZGUuY29yZS9Qcm92QWRtaW5VSSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJkZWZhdWx0X2F1dG9fc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPGludEF0dHJpYnV0ZSBrZXk9ImRlZmF1bHRfc3RhcnRfbGV2ZWwiIHZhbHVlPSI0Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0iZXhlY0Vudmlyb25tZW50IiB2YWx1ZT0iQ0RDLTEuMC9Gb3VuZGF0aW9uLTEuMCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJpbmNsdWRlT3B0aW9uYWwiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPR1JBTV9BUkdVTUVOVFMiIHZhbHVlPSItb3MgJHt0YXJnZXQub3N9IC13cyAke3RhcmdldC53c30gLWFyY2ggJHt0YXJnZXQuYXJjaH0gLW5sICR7dGFyZ2V0Lm5sfSAtY29uc29sZSAtY29uc29sZWxvZyAtcHJvZHVjdCBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC5wcm9kdWN0Ii8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5TT1VSQ0VfUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLnBkZS51aS53b3JrYmVuY2hDbGFzc3BhdGhQcm92aWRlciIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InBkZS52ZXJzaW9uIiB2YWx1ZT0iMy4zIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InJlc3RhcnQiIHZhbHVlPSJmYWxzZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJzaG93X3NlbGVjdGVkX29ubHkiIHZhbHVlPSJmYWxzZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9InRhcmdldF9idW5kbGVzIiB2YWx1ZT0ib3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyozLjQuMC5JMjAwODAzMjQtMTgwMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSozLjQuMC52MjAwODAzMTZAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmFudC5jb3JlKjMuMi4wLnYyMDA4MDMxOUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5qb2JzKjMuNC4wLnYyMDA4MDMxMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuaGVscCozLjMuMTAwLnYyMDA4MDMyMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZyoxLjEuMC5JMjAwODAzMjUtMDEwMEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uuc3d0KjMuNC4wLnYzNDM2YUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4NiozLjQuMC52MzQzNkBkZWZhdWx0OmZhbHNlLG9yZy5lY2xpcHNlLmpmYWNlKjMuNC4wLkkyMDA4MDMyOC0xMjA2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4NioxLjAuMTAwLnYyMDA4MDIwMWFAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zKjMuNC4wLnYyMDA4MDMyNy0xMzAwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLnZhcmlhYmxlcyozLjIuMTAwLnYyMDA4MDMyNC0xNjAwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyKjEuMC4xMDAudjIwMDgwMzAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpKjMuNC4wLnYyMDA4MDMyNkA6LG9yZy5lY2xpcHNlLnVpKjMuNC4wLkkyMDA4MDMyOC0xMjA2QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzKjMuMS4yMDAudjIwMDcxMjAzQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnByZWZlcmVuY2VzKjMuMi4yMDAudjIwMDgwMjAxQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gqMy40LjAuSTIwMDgwMzI4LTEyMDZAZGVmYXVsdDpkZWZhdWx0LGNvbS5pYm0uaWN1KjMuOC4xLnYyMDA4MDMwNEBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkucmVnaXN0cnkqMy4yLjIwMC52MjAwNzA3MTdAZGVmYXVsdDpmYWxzZSxvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUqMy40LjAudjIwMDgwMzI0LTE3MjVAZGVmYXVsdDp0cnVlLG9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nKjEuMi4wLkkyMDA4MDMyNS0wMTAwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5KjEuMC4wLnYyMDA4MDMyNy0xMDAwQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlKjMuMy4wLnYyMDA4MDIwMUBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS53aW4zMi54ODYqMS4wLjAudjIwMDgwMzI0QGRlZmF1bHQ6ZmFsc2Usb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbXBhdGliaWxpdHkuYXV0aCozLjIuMTAwLnYyMDA3MDUwMkBkZWZhdWx0OmRlZmF1bHQiLz4KLTxib29sZWFuQXR0cmlidXRlIGtleT0idHJhY2luZyIgdmFsdWU9ImZhbHNlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9InVzZURlZmF1bHRDb25maWdBcmVhIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJ1c2VOYW1lZEpSRSIgdmFsdWU9ImZhbHNlIi8+Ci08c3RyaW5nQXR0cmlidXRlIGtleT0id29ya3NwYWNlX2J1bmRsZXMiIHZhbHVlPSJvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHkqMS4zLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmFwcCoxLjAuMTAwLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IqMC4xLjAucXVhbGlmaWVyQDE6dHJ1ZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zYXIqMC4xLjBAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3guY29tbW9uKjMuNC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVjZioxLjQuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94KjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OnRydWUsb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyKjIuMC4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5qYXJwcm9jZXNzb3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxpZS53b21iYXQuamJkaWZmKjAuMS4wLjFAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycyowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLnNhdDRqLmNvcmUqMi4wLjAudjIwMDgwMzA3QGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkayowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6ZGVmYXVsdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluKjAuMS4wLnF1YWxpZmllckBkZWZhdWx0OmRlZmF1bHQsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSowLjEuMC5xdWFsaWZpZXJAZGVmYXVsdDpkZWZhdWx0LG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAqMC4xLjAucXVhbGlmaWVyQGRlZmF1bHQ6dHJ1ZSxvcmcuc2F0NGoucGIqMi4wLjAudjIwMDgwMzA3QGRlZmF1bHQ6ZGVmYXVsdCIvPgotPC9sYXVuY2hDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjAyMzMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1MDExODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotc291cmNlLi4gPSBzcmMvCi0KLSAgICAgICAgICAgICAgIAotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL2NvbmZpZy5pbmkgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL2NvbmZpZy5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YWMxYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9jb25maWcuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotb3NnaS5idW5kbGVzPVwKLQljb20uaWJtLmljdSxcCi0Jb3JnLmVjbGlwc2UuY29yZS5jb21tYW5kcyxcCi0Jb3JnLmVjbGlwc2UuY29yZS5jb250ZW50dHlwZSxcCi0Jb3JnLmVjbGlwc2UuY29yZS5kYXRhYmluZGluZyxcCi0Jb3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucyxcCi0Jb3JnLmVjbGlwc2UuY29yZS5qb2JzLFwKLQlvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsXAotCW9yZy5lY2xpcHNlLmVjZixcCi0Jb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlcixcCi0Jb3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5LFwKLQlvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LmFwcEBzdGFydCxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb24sXAotCW9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4sXAotCW9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veEBzdGFydCxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlcixcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlci53aW4zMi53aW4zMi54ODYsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuZG93bmxvYWQsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwQHN0YXJ0LFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLFwKLQlvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aSxcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbixcCi0Jb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AsXAotCW9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnksXAotCW9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yQDE6c3RhcnQsXAotCW9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yQHN0YXJ0LFwKLQlvcmcuZWNsaXBzZS5oZWxwLFwKLQlvcmcuZWNsaXBzZS5qZmFjZSxcCi0Jb3JnLmVjbGlwc2UuamZhY2UuZGF0YWJpbmRpbmcsXAotCW9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZXMsXAotCW9yZy5lY2xpcHNlLnN3dCxcCi0Jb3JnLmVjbGlwc2Uuc3d0LndpbjMyLndpbjMyLng4NixcCi0Jb3JnLmVjbGlwc2UudWksXAotCW9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaCxcCi0Jb3JnLnNhdDRqLmNvcmUsXAotCW9yZy5zYXQ0ai5wYgotZWNsaXBzZS5wcm9kdWN0PW9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwLnByb2R1Y3QKLW9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLnVzZVJlZmVyZW5jZT10cnVlCi1vcmcuZWNsaXBzZS51cGRhdGUucmVjb25jaWxlPWZhbHNlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9pY29ucy9wcm92aXNpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9pY29ucy9wcm92aXNpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTg0ZmJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvaWNvbnMvcHJvdmlzaW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvaWNvbnMvcHZpZXcuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9pY29ucy9wdmlldy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTU0YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9pY29ucy9wdmlldy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWExMGM4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBQcm92aXNpb25pbmcgQWRtaW4gVUkgUkNQIGFwcAotIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1idW5kbGVOYW1lPVByb3Zpc2lvbmluZyBBZG1pbiBVSSBSQ1AgKEluY3ViYXRpb24pCi1wcm9kdWN0TmFtZT1FY2xpcHNlIFByb3Zpc2lvbmluZwotYXBwTmFtZT1FY2xpcHNlIFByb3Zpc2lvbmluZyBBZG1pbiBVSQotcGVyc3BlY3RpdmVOYW1lPUVjbGlwc2UgUHJvdmlzaW9uaW5nCi1WaWV3cy5Qcm9ncmVzcz1Qcm9ncmVzcyBWaWV3Ci1hYm91dFRleHQ9IEVjbGlwc2UgUHJvdmlzaW9uaW5nIEFkbWluIFVJIFxuXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhODM0OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC5hcHBsaWNhdGlvbiIKLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuYXBwbGljYXRpb25zIj4KLSAgICAgIDxhcHBsaWNhdGlvbj4KLSAgICAgICAgIDxydW4KLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLnJjcC5BcHBsaWNhdGlvbiI+Ci0gICAgICAgICA8L3J1bj4KLSAgICAgIDwvYXBwbGljYXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJvZHVjdHMiCi0gICAgICAgICBpZD0icHJvZHVjdCI+Ci0gICAgICA8cHJvZHVjdAotICAgICAgICAgICAgbmFtZT0iJXByb2R1Y3ROYW1lIgotICAgICAgICAgICAgYXBwbGljYXRpb249Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwLmFwcGxpY2F0aW9uIj4KLSAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgbmFtZT0iYXBwTmFtZSIKLSAgICAgICAgICAgICAgIHZhbHVlPSIlcHJvZHVjdE5hbWUiLz4KLSAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgbmFtZT0iYWJvdXRUZXh0IgotICAgICAgICAgICAgICAgdmFsdWU9IiVhYm91dFRleHQiLz4KLSAgICAgICAgIDxwcm9wZXJ0eQotICAgICAgICAgICAgICAgbmFtZT0id2luZG93SW1hZ2VzIgotICAgICAgICAgICAgICAgdmFsdWU9InBsYXRmb3JtOi9wbHVnaW4vb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9pY29ucy9wcm92aXNpb24uZ2lmIi8+Ci0gICAgICAgICAgICAgICAKLSAgICA8L3Byb2R1Y3Q+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAgCi0gICAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIlVmlld3MuUHJvZ3Jlc3MiCi0gICAgICAgICAgICBpY29uPSIkbmwkL2ljb25zL3B2aWV3LmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS51aSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5wcm9ncmVzcy5Qcm9ncmVzc1ZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudmlld3MuUHJvZ3Jlc3NWaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgICA8L2V4dGVuc2lvbj4KLSAgICAKLSAgICAgICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wZXJzcGVjdGl2ZXMiPgotICAgICAgPHBlcnNwZWN0aXZlCi0gICAgICAgICAgICBuYW1lPSIlcGVyc3BlY3RpdmVOYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4ucmNwLlByb3Zpc2lvbmluZ1JDUFBlcnNwZWN0aXZlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwLlByb3Zpc2lvbmluZ1JDUFBlcnNwZWN0aXZlIj4KLSAgICAgIDwvcGVyc3BlY3RpdmU+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL3BsdWdpbl9jdXN0b21pemF0aW9uLmluaSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzlhNjJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvcGx1Z2luX2N1c3RvbWl6YXRpb24uaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1vcmcuZWNsaXBzZS51aS9ET0NLX1BFUlNQRUNUSVZFX0JBUj10b3BSaWdodAotb3JnLmVjbGlwc2UudWkvU0hPV19QUk9HUkVTU19PTl9TVEFSVFVQID0gZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvcmNwLnByb2R1Y3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL3JjcC5wcm9kdWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmVmNThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AvcmNwLnByb2R1Y3QKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9wZGUgdmVyc2lvbj0iMy4xIj8+Ci0KLTxwcm9kdWN0IG5hbWU9IiVwcm9kdWN0TmFtZSIgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwLnByb2R1Y3QiIGFwcGxpY2F0aW9uPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC5hcHBsaWNhdGlvbiIgdXNlRmVhdHVyZXM9ImZhbHNlIj4KLQotICAgPGFib3V0SW5mbz4KLSAgICAgIDx0ZXh0PgotICAgICAgICAgJWFib3V0VGV4dAotICAgICAgPC90ZXh0PgotICAgPC9hYm91dEluZm8+Ci0KLSAgIDxjb25maWdJbmkgdXNlPSJjdXN0b20iIHBhdGg9Ii9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9jb25maWcuaW5pIi8+Ci0KLSAgIDxsYXVuY2hlckFyZ3M+Ci0gICAgICA8dm1BcmdzTWFjPi1Yc3RhcnRPbkZpcnN0VGhyZWFkIC1Eb3JnLmVjbGlwc2Uuc3d0LmludGVybmFsLmNhcmJvbi5zbWFsbEZvbnRzPC92bUFyZ3NNYWM+Ci0gICA8L2xhdW5jaGVyQXJncz4KLQotICAgPHdpbmRvd0ltYWdlcyBpMTY9Ii9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL2ljb25zL3Byb3Zpc2lvbi5naWYiLz4KLQotICAgPGxhdW5jaGVyIG5hbWU9ImVjbGlwc2UiPgotICAgICAgPHNvbGFyaXMvPgotICAgICAgPHdpbiB1c2VJY289ImZhbHNlIj4KLSAgICAgICAgIDxibXAvPgotICAgICAgPC93aW4+Ci0gICA8L2xhdW5jaGVyPgotCi0gICA8dm0+Ci0gICA8L3ZtPgotCi0gICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4gaWQ9ImNvbS5pYm0uaWN1Ii8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmNvbW1hbmRzIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmNvbnRlbnR0eXBlIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmRhdGFiaW5kaW5nIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZWNmIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHkiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXIiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guYXBwIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbiIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ii8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmxhdW5jaGVyLndpbjMyLndpbjMyLng4NiIgZnJhZ21lbnQ9InRydWUiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZW5naW5lIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbiIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3AiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucHJlZmVyZW5jZXMiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucmVnaXN0cnkiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuaGVscCIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuamZhY2UiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpmYWNlLmRhdGFiaW5kaW5nIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5vc2dpIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2VzIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5zd3QiLz4KLSAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLnN3dC53aW4zMi53aW4zMi54ODYiIGZyYWdtZW50PSJ0cnVlIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS51aSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoIi8+Ci0gICAgICA8cGx1Z2luIGlkPSJvcmcuc2F0NGouY29yZSIvPgotICAgICAgPHBsdWdpbiBpZD0ib3JnLnNhdDRqLnBiIi8+Ci0gICA8L3BsdWdpbnM+Ci0KLTwvcHJvZHVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3Avc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcmNwL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9yY3AvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZmI4MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9yY3AvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5yY3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIGFjdGl2YXRvciBjbGFzcyBjb250cm9scyB0aGUgcGx1Zy1pbiBsaWZlIGN5Y2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3RpdmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIEFjdGl2YXRvciBwbHVnaW47Ci0KLQlwdWJsaWMgQWN0aXZhdG9yKCkgewotCQkvLyBjb250c3RydWN0b3IKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGJ1bmRsZUNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW4jc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXBsdWdpbiA9IG51bGw7Ci0JCXN1cGVyLnN0b3AoYnVuZGxlQ29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEFjdGl2YXRvciBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmb3IgdGhlIGltYWdlIGZpbGUgYXQgdGhlIGdpdmVuCi0JICogcGx1Zy1pbiByZWxhdGl2ZSBwYXRoCi0JICoKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBwYXRoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL3JjcC9BcHBsaWNhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9yY3AvQXBwbGljYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAxYTg4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL3JjcC9BcHBsaWNhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4ucmNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5hcHAuSUFwcGxpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBjb250cm9scyBhbGwgYXNwZWN0cyBvZiB0aGUgYXBwbGljYXRpb24ncyBleGVjdXRpb24KLSAqLwotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uIGltcGxlbWVudHMgSUFwcGxpY2F0aW9uIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbiNzdGFydChvcmcuZWNsaXBzZS5lcXVpbm94LmFwcC5JQXBwbGljYXRpb25Db250ZXh0KQotCSAqLwotCXB1YmxpYyBPYmplY3Qgc3RhcnQoSUFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5jcmVhdGVEaXNwbGF5KCk7Ci0JCXRyeSB7Ci0JCQlpbnQgcmV0dXJuQ29kZSA9IFBsYXRmb3JtVUkuY3JlYXRlQW5kUnVuV29ya2JlbmNoKGRpc3BsYXksIG5ldyBBcHBsaWNhdGlvbldvcmtiZW5jaEFkdmlzb3IoKSk7Ci0JCQlpZiAocmV0dXJuQ29kZSA9PSBQbGF0Zm9ybVVJLlJFVFVSTl9SRVNUQVJUKQotCQkJCXJldHVybiBJQXBwbGljYXRpb24uRVhJVF9SRVNUQVJUOwotCQkJcmV0dXJuIElBcHBsaWNhdGlvbi5FWElUX09LOwotCQl9IGZpbmFsbHkgewotCQkJZGlzcGxheS5kaXNwb3NlKCk7Ci0JCX0KLQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guYXBwLklBcHBsaWNhdGlvbiNzdG9wKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQlmaW5hbCBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCk7Ci0JCWlmICh3b3JrYmVuY2ggPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gd29ya2JlbmNoLmdldERpc3BsYXkoKTsKLQkJZGlzcGxheS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKCFkaXNwbGF5LmlzRGlzcG9zZWQoKSkKLQkJCQkJd29ya2JlbmNoLmNsb3NlKCk7Ci0JCQl9Ci0JCX0pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3Avc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcmNwL0FwcGxpY2F0aW9uQWN0aW9uQmFyQWR2aXNvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9yY3AvQXBwbGljYXRpb25BY3Rpb25CYXJBZHZpc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MTIzNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9yY3AvQXBwbGljYXRpb25BY3Rpb25CYXJBZHZpc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5yY3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi5BY3Rpb25CYXJBZHZpc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFwcGxpY2F0aW9uLklBY3Rpb25CYXJDb25maWd1cmVyOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25BY3Rpb25CYXJBZHZpc29yIGV4dGVuZHMgQWN0aW9uQmFyQWR2aXNvciB7Ci0KLQlJQWN0aW9uIHByZWZzQWN0aW9uLCBhYm91dEFjdGlvbiwgcXVpdEFjdGlvbjsKLQotCXB1YmxpYyBBcHBsaWNhdGlvbkFjdGlvbkJhckFkdmlzb3IoSUFjdGlvbkJhckNvbmZpZ3VyZXIgY29uZmlndXJlcikgewotCQlzdXBlcihjb25maWd1cmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBtYWtlQWN0aW9ucyhJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQlxdWl0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5RVUlULmNyZWF0ZSh3aW5kb3cpOwotCQlwcmVmc0FjdGlvbiA9IEFjdGlvbkZhY3RvcnkuUFJFRkVSRU5DRVMuY3JlYXRlKHdpbmRvdyk7Ci0JCWFib3V0QWN0aW9uID0gQWN0aW9uRmFjdG9yeS5BQk9VVC5jcmVhdGUod2luZG93KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsTWVudUJhcihJTWVudU1hbmFnZXIgbWVudUJhcikgewotCQlJTWVudU1hbmFnZXIgZmlsZU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoUHJvdkFkbWluVUlNZXNzYWdlcy5BcHBsaWNhdGlvbkFjdGlvbkJhckFkdmlzb3JfRmlsZU1lbnVOYW1lLCAiZmlsZSIpOyAvLyROT04tTkxTLTEkCi0JCW1lbnVCYXIuYWRkKGZpbGVNZW51KTsKLQkJZmlsZU1lbnUuYWRkKHF1aXRBY3Rpb24pOwotCi0JCUlNZW51TWFuYWdlciB3aW5kb3dNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFByb3ZBZG1pblVJTWVzc2FnZXMuQXBwbGljYXRpb25BY3Rpb25CYXJBZHZpc29yX1dpbmRvd01lbnVOYW1lLCAid2luZG93Iik7IC8vJE5PTi1OTFMtMSQKLQkJbWVudUJhci5hZGQod2luZG93TWVudSk7Ci0JCXdpbmRvd01lbnUuYWRkKHByZWZzQWN0aW9uKTsKLQotCQlJTWVudU1hbmFnZXIgaGVscE1lbnUgPSBuZXcgTWVudU1hbmFnZXIoUHJvdkFkbWluVUlNZXNzYWdlcy5BcHBsaWNhdGlvbkFjdGlvbkJhckFkdmlzb3JfSGVscE1lbnVOYW1lLCAiaGVscCIpOyAvLyROT04tTkxTLTEkCi0JCW1lbnVCYXIuYWRkKGhlbHBNZW51KTsKLQkJaGVscE1lbnUuYWRkKGFib3V0QWN0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3Avc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcmNwL0FwcGxpY2F0aW9uV29ya2JlbmNoQWR2aXNvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9yY3AvQXBwbGljYXRpb25Xb3JrYmVuY2hBZHZpc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NTViYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9yY3AvQXBwbGljYXRpb25Xb3JrYmVuY2hBZHZpc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5yY3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hcHBsaWNhdGlvbi4qOwotCi1wdWJsaWMgY2xhc3MgQXBwbGljYXRpb25Xb3JrYmVuY2hBZHZpc29yIGV4dGVuZHMgV29ya2JlbmNoQWR2aXNvciB7Ci0KLQlwdWJsaWMgV29ya2JlbmNoV2luZG93QWR2aXNvciBjcmVhdGVXb3JrYmVuY2hXaW5kb3dBZHZpc29yKElXb3JrYmVuY2hXaW5kb3dDb25maWd1cmVyIGNvbmZpZ3VyZXIpIHsKLQkJcmV0dXJuIG5ldyBBcHBsaWNhdGlvbldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IoY29uZmlndXJlcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbml0aWFsV2luZG93UGVyc3BlY3RpdmVJZCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC5Qcm92aXNpb25pbmdSQ1BQZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL3JjcC9BcHBsaWNhdGlvbldvcmtiZW5jaFdpbmRvd0Fkdmlzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3Avc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcmNwL0FwcGxpY2F0aW9uV29ya2JlbmNoV2luZG93QWR2aXNvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQyMjM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3Avc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcmNwL0FwcGxpY2F0aW9uV29ya2JlbmNoV2luZG93QWR2aXNvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4ucmNwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYXBwbGljYXRpb24uKjsKLQotcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uV29ya2JlbmNoV2luZG93QWR2aXNvciBleHRlbmRzIFdvcmtiZW5jaFdpbmRvd0Fkdmlzb3IgewotCi0JcHVibGljIEFwcGxpY2F0aW9uV29ya2JlbmNoV2luZG93QWR2aXNvcihJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyKSB7Ci0JCXN1cGVyKGNvbmZpZ3VyZXIpOwotCX0KLQotCXB1YmxpYyBBY3Rpb25CYXJBZHZpc29yIGNyZWF0ZUFjdGlvbkJhckFkdmlzb3IoSUFjdGlvbkJhckNvbmZpZ3VyZXIgY29uZmlndXJlcikgewotCQlyZXR1cm4gbmV3IEFwcGxpY2F0aW9uQWN0aW9uQmFyQWR2aXNvcihjb25maWd1cmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcmVXaW5kb3dPcGVuKCkgewotCQlJV29ya2JlbmNoV2luZG93Q29uZmlndXJlciBjb25maWd1cmVyID0gZ2V0V2luZG93Q29uZmlndXJlcigpOwotCQkvLyBUaGUgd29ya2JlbmNoIHByb2dyZXNzIG1hbmFnZXIgd29uJ3QgZ2V0IGluaXRpYWxpemVkIHVudGlsIEkgcmVmZXIgdG8gaXQuCi0JCS8vIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjA4OTYzCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0UHJvZ3Jlc3NTZXJ2aWNlKCk7Ci0JCWNvbmZpZ3VyZXIuc2V0SW5pdGlhbFNpemUobmV3IFBvaW50KDgwMCwgNjAwKSk7Ci0JCWNvbmZpZ3VyZXIuc2V0U2hvd0Nvb2xCYXIoZmFsc2UpOwotCQljb25maWd1cmVyLnNldFNob3dTdGF0dXNMaW5lKHRydWUpOwotCQljb25maWd1cmVyLnNldFNob3dQcm9ncmVzc0luZGljYXRvcih0cnVlKTsKLQkJY29uZmlndXJlci5zZXRUaXRsZShQcm92QWRtaW5VSU1lc3NhZ2VzLkFwcGxpY2F0aW9uV2luZG93VGl0bGUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3Avc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcmNwL1Byb3ZBZG1pblVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3Avc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcmNwL1Byb3ZBZG1pblVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY0NDM4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL3JjcC9Qcm92QWRtaW5VSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLnJjcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTWVzc2FnZSBjbGFzcyBmb3IgcHJvdmlzaW9uaW5nIFVJIG1lc3NhZ2VzLiAgCi0gKiAKLSAqIEBzaW5jZSAzLjQKLSAqLwotcHVibGljIGNsYXNzIFByb3ZBZG1pblVJTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLnJjcC5tZXNzYWdlcyI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgUHJvdkFkbWluVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFwcGxpY2F0aW9uQWN0aW9uQmFyQWR2aXNvcl9GaWxlTWVudU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwbGljYXRpb25BY3Rpb25CYXJBZHZpc29yX0hlbHBNZW51TmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcHBsaWNhdGlvbkFjdGlvbkJhckFkdmlzb3JfV2luZG93TWVudU5hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXBwbGljYXRpb25XaW5kb3dUaXRsZTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3Avc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcmNwL1Byb3Zpc2lvbmluZ1JDUFBlcnNwZWN0aXZlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL3JjcC9Qcm92aXNpb25pbmdSQ1BQZXJzcGVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTJlMGNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3Avc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcmNwL1Byb3Zpc2lvbmluZ1JDUFBlcnNwZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5yY3A7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotCi0vKioKLSAqIFBlcnNwZWN0aXZlIHdoaWNoIG1ha2VzIHRoZSBzdGFuZGFyZCBwcm92aXNpb25pbmcgdmlld3MgYXZhaWxhYmxlLgotICogCi0gKiBAc2luY2UgMy40Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3Zpc2lvbmluZ1JDUFBlcnNwZWN0aXZlIGltcGxlbWVudHMgSVBlcnNwZWN0aXZlRmFjdG9yeSB7Ci0KLQlwcml2YXRlIElQYWdlTGF5b3V0IGZhY3Rvcnk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFEQVRBX1JFUE9TSVRPUklFUyA9ICJvcmcuZWNsaXBzZS5wMi51aS5hZG1pbi5NZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFSVElGQUNUX1JFUE9TSVRPUklFUyA9ICJvcmcuZWNsaXBzZS5wMi51aS5hZG1pbi5BcnRpZmFjdFJlcG9zaXRvcmllc1ZpZXciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0ZJTEVTID0gIm9yZy5lY2xpcHNlLnAyLnVpLmFkbWluLlByb2ZpbGVzVmlldyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBQcm92aXNpb25pbmdSQ1BQZXJzcGVjdGl2ZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVJbml0aWFsTGF5b3V0KElQYWdlTGF5b3V0IGxheW91dCkgewotCQl0aGlzLmZhY3RvcnkgPSBsYXlvdXQ7Ci0JCWFkZFZpZXdzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFZpZXdzKCkgewotCQlJRm9sZGVyTGF5b3V0IHRvcCA9IGZhY3RvcnkuY3JlYXRlRm9sZGVyKCJ0b3AiLCAvLyROT04tTkxTLTEkCi0JCQkJSVBhZ2VMYXlvdXQuVE9QLCAwLjVmLCBmYWN0b3J5LmdldEVkaXRvckFyZWEoKSk7Ci0JCXRvcC5hZGRWaWV3KE1FVEFEQVRBX1JFUE9TSVRPUklFUyk7Ci0JCWZhY3RvcnkuZ2V0Vmlld0xheW91dChNRVRBREFUQV9SRVBPU0lUT1JJRVMpLnNldENsb3NlYWJsZShmYWxzZSk7Ci0JCXRvcC5hZGRWaWV3KEFSVElGQUNUX1JFUE9TSVRPUklFUyk7Ci0JCWZhY3RvcnkuZ2V0Vmlld0xheW91dChBUlRJRkFDVF9SRVBPU0lUT1JJRVMpLnNldENsb3NlYWJsZShmYWxzZSk7Ci0JCWZhY3RvcnkuYWRkVmlldyhQUk9GSUxFUywgSVBhZ2VMYXlvdXQuQk9UVE9NLCAwLjY1ZiwgInRvcCIpOyAvLyROT04tTkxTLTEkCi0JCWZhY3RvcnkuZ2V0Vmlld0xheW91dChQUk9GSUxFUykuc2V0Q2xvc2VhYmxlKGZhbHNlKTsKLQkJZmFjdG9yeS5zZXRFZGl0b3JBcmVhVmlzaWJsZShmYWxzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9yY3AvbWVzc2FnZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi5yY3Avc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcmNwL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ZGVjZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcC9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9yY3AvbWVzc2FnZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotQXBwbGljYXRpb25XaW5kb3dUaXRsZT1FY2xpcHNlIFByb3Zpc2lvbmluZwotQXBwbGljYXRpb25BY3Rpb25CYXJBZHZpc29yX0ZpbGVNZW51TmFtZT0mRmlsZQotQXBwbGljYXRpb25BY3Rpb25CYXJBZHZpc29yX1dpbmRvd01lbnVOYW1lPSZXaW5kb3cKLUFwcGxpY2F0aW9uQWN0aW9uQmFyQWR2aXNvcl9IZWxwTWVudU5hbWU9JkhlbHAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUi9vcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuZGVidWcudWkubGF1bmNoZXIuU3RhbmRhcmRWTVR5cGUvSjJTRS0xLjQiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwNDkzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODUyM2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzEgKzAsMCBAQAotI1RodSBBdWcgMTYgMTE6MDA6NTkgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWw9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9saW5lX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3BhcmFtZXRlcl9kZXNjcmlwdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfYmxhbmtfbGluZXNfYXRfYmVnaW5uaW5nX29mX21ldGhvZF9ib2R5PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5udW1iZXJfb2ZfZW1wdHlfbGluZXNfdG9fcHJlc2VydmU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnB1dF9lbXB0eV9zdGF0ZW1lbnRfb25fbmV3X2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLmNoYXI9dGFiCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci51c2VfdGFic19vbmx5X2Zvcl9sZWFkaW5nX2luZGVudGF0aW9ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLndyYXBfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NGY1NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1OToxOSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4MjBhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5Qcm92QWRtaW5VSUFjdGl2YXRvcgotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS40LAotIENEQy0xLjEvRm91bmRhdGlvbi0xLjEKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLm1vZGVsLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5hY3Rpb25zLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuZGlhbG9ncywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLm1vZGVsLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkub3BlcmF0aW9ucywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnBvbGljeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnF1ZXJ5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkudmlld2VycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVwZGF0ZWNoZWNrZXIsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmVudmlyb25tZW50O3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5kaWFsb2dzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLAotIG9yZy5lY2xpcHNlLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYwMjMzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0gICAgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0gCi08cD5KdW5lIDIsIDIwMDY8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSAKLWluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgCi1hdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyAKLWJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyAKLXByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnPC9hPi48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTAxMTg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYWJvdXQuaHRtbAotc291cmNlLi4gPSBzcmMvCi0KLSAgICAgICAgICAgICAgIAotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vaWNvbnMvb2JqL2FydGlmYWN0X3JlcG9fb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9pY29ucy9vYmovYXJ0aWZhY3RfcmVwb19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDcwZTE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9pY29ucy9vYmovYXJ0aWZhY3RfcmVwb19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL2ljb25zL29iai9pdV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL2ljb25zL29iai9pdV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzA2NjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9pY29ucy9vYmovaXVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9pY29ucy9vYmovbWV0YWRhdGFfcmVwb19vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL2ljb25zL29iai9tZXRhZGF0YV9yZXBvX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4NTY4ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL2ljb25zL29iai9tZXRhZGF0YV9yZXBvX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vaWNvbnMvb2JqL3Byb2ZpbGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9pY29ucy9vYmovcHJvZmlsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTg0ZmJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9pY29ucy9vYmovcHJvZmlsZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL2ljb25zL29iai91bmluc3RhbGxlZF9pdS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vaWNvbnMvb2JqL3VuaW5zdGFsbGVkX2l1LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE5MmI4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vaWNvbnMvb2JqL3VuaW5zdGFsbGVkX2l1LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9pY29ucy9wcm92aXNpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL2ljb25zL3Byb3Zpc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ODRmYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL2ljb25zL3Byb3Zpc2lvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NWRjODcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBQcm92aXNpb25pbmcgQWRtaW4gVUkgcGx1Z2luIHJlc291cmNlcwotIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1idW5kbGVOYW1lPXAyIEFkbWluIFVJCi0KLXBlcnNwZWN0aXZlTmFtZT1Qcm92aXNpb25pbmcKLXZpZXdDYXRlZ29yeU5hbWU9UHJvdmlzaW9uaW5nCi1NZXRhZGF0YVJlcG9zaXRvcmllcy5uYW1lPU1ldGFkYXRhIFJlcG9zaXRvcmllcwotQXJ0aWZhY3RSZXBvc2l0b3JpZXMubmFtZT1BcnRpZmFjdCBSZXBvc2l0b3JpZXMKLVByb2ZpbGVzLm5hbWU9UHJvZmlsZXMKLVByb3Zpc2lvbmluZy50aXRsZT1Qcm92aXNpb25pbmcgQWRtaW4KLVByb2ZpbGUubmFtZT1Qcm9maWxlIEFkbWluIEluZm8KLUlVLm5hbWU9SVUgQWRtaW4gSW5mbwotSW5zdGFsbGVkSVUubmFtZT1JVSBQcm9maWxlIFByb3BlcnRpZXMKLVJlcG9zaXRvcnkubmFtZT1SZXBvc2l0b3J5IEFkbWluIEluZm8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhY2RmOTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlUHJvdmlzaW9uaW5nLnRpdGxlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4ucHJlZmVyZW5jZXMuUHJvdmlzaW9uaW5nUHJlZlBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucDIudWkucHJlZmVyZW5jZXMuUHJvdmlzaW9uaW5nUHJlZlBhZ2UiPgotICAgICAgPC9wYWdlPgotICAgPC9leHRlbnNpb24+Ci0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLSAgICAgIDxpbml0aWFsaXplcgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4ucHJlZmVyZW5jZXMuUHJvdlVJUHJlZmVyZW5jZUluaXRpYWxpemVyIj4KLSAgICAgIDwvaW5pdGlhbGl6ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIG5hbWU9IiV2aWV3Q2F0ZWdvcnlOYW1lIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnAyLnVpLmFkbWluIj4KLSAgICAgIDwvY2F0ZWdvcnk+Ci0gICAgICA8dmlldwotICAgICAgICAgICAgbmFtZT0iJU1ldGFkYXRhUmVwb3NpdG9yaWVzLm5hbWUiCi0gICAgICAgICAgICBpY29uPSIkbmwkL2ljb25zL29iai9tZXRhZGF0YV9yZXBvX29iai5naWYiCi0gICAgICAgICAgICBjYXRlZ29yeT0ib3JnLmVjbGlwc2UucDIudWkuYWRtaW4iCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5NZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXciCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UucDIudWkuYWRtaW4uTWV0YWRhdGFSZXBvc2l0b3JpZXNWaWV3Ij4KLSAgICAgIDwvdmlldz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzIj4KLSAgICAgPHZpZXcKLSAgICAgICAgICAgIG5hbWU9IiVBcnRpZmFjdFJlcG9zaXRvcmllcy5uYW1lIgotICAgICAgICAgICAgaWNvbj0iJG5sJC9pY29ucy9vYmovYXJ0aWZhY3RfcmVwb19vYmouZ2lmIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnAyLnVpLmFkbWluIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4uQXJ0aWZhY3RSZXBvc2l0b3JpZXNWaWV3IgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnAyLnVpLmFkbWluLkFydGlmYWN0UmVwb3NpdG9yaWVzVmlldyI+Ci0gICAgICA8L3ZpZXc+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cyI+Ci0gICAgIDx2aWV3Ci0gICAgICAgICAgICBuYW1lPSIlUHJvZmlsZXMubmFtZSIKLSAgICAgICAgICAgIGljb249IiRubCQvaWNvbnMvb2JqL3Byb2ZpbGVfb2JqLmdpZiIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5wMi51aS5hZG1pbiIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLlByb2ZpbGVzVmlldyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5wMi51aS5hZG1pbi5Qcm9maWxlc1ZpZXciPgotICAgICAgPC92aWV3PgotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBlcnNwZWN0aXZlcyI+Ci0gICAgICA8cGVyc3BlY3RpdmUKLSAgICAgICAgICAgIG5hbWU9IiVwZXJzcGVjdGl2ZU5hbWUiCi0gICAgICAgICAgICBpY29uPSIkbmwkL2ljb25zL3Byb3Zpc2lvbi5naWYiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5Qcm92aXNpb25pbmdQZXJzcGVjdGl2ZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLlByb3Zpc2lvbmluZ1BlcnNwZWN0aXZlIj4KLSAgICAgIDwvcGVyc3BlY3RpdmU+Ci0gICA8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJVByb2ZpbGUubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLmRpYWxvZ3MuUHJvZmlsZVByb3BlcnR5UGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLmRpYWxvZ3MuUHJvZmlsZVByb3BlcnR5UGFnZSI+Ci0gICAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlIi8+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlSVUubmFtZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLmRpYWxvZ3MuSVVJbXBsZW1lbnRhdGlvblByb3BlcnR5UGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLmRpYWxvZ3MuSVVJbXBsZW1lbnRhdGlvblByb3BlcnR5UGFnZSI+Ci0gICAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdCIvPgotICAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgPC9wYWdlPgotICAgICAgICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVJbnN0YWxsZWRJVS5uYW1lIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4uZGlhbG9ncy5JbnN0YWxsZWRJVVByb3BlcnR5UGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLmRpYWxvZ3MuSW5zdGFsbGVkSVVQcm9wZXJ0eVBhZ2UiPgotICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgIDxpbnN0YW5jZW9mCi0gICAgICAgICAgICAgICAgICB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5tb2RlbC5JbnN0YWxsZWRJVUVsZW1lbnQiPgotICAgICAgICAgICAgIDwvaW5zdGFuY2VvZj4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgPC9wYWdlPgotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVSZXBvc2l0b3J5Lm5hbWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5kaWFsb2dzLlJlcG9zaXRvcnlJbXBsZW1lbnRhdGlvblByb3BlcnR5UGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLmRpYWxvZ3MuUmVwb3NpdG9yeUltcGxlbWVudGF0aW9uUHJvcGVydHlQYWdlIj4KLSAgICAgICAgICAgIDxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICA8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLnJlcG9zaXRvcnkuSVJlcG9zaXRvcnkiLz4KLSAgICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIAotICAgICAgPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL0FydGlmYWN0UmVwb3NpdG9yaWVzVmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL0FydGlmYWN0UmVwb3NpdG9yaWVzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjc4YmRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9BcnRpZmFjdFJlcG9zaXRvcmllc1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5kaWFsb2dzLkFkZEFydGlmYWN0UmVwb3NpdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuUHJvdmlzaW9uaW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlclByb3Zpc2lvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnN0YXR1c2hhbmRsZXJzLlN0YXR1c01hbmFnZXI7Ci0KLS8qKgotICogVGhpcyB2aWV3IGFsbG93cyB1c2VycyB0byBpbnRlcmFjdCB3aXRoIGFydGlmYWN0IHJlcG9zaXRvcmllcwotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdFJlcG9zaXRvcmllc1ZpZXcgZXh0ZW5kcyBSZXBvc2l0b3JpZXNWaWV3IHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBcnRpZmFjdFJlcG9zaXRvcmllc1ZpZXcoKSB7Ci0JCS8vIGNvbnN0cnVjdG9yCi0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRJbnB1dCgpIHsKLQkJQXJ0aWZhY3RSZXBvc2l0b3JpZXMgaW5wdXQgPSBuZXcgQXJ0aWZhY3RSZXBvc2l0b3JpZXMoKTsKLQkJaW5wdXQuc2V0UXVlcnlQcm92aWRlcihQcm92QWRtaW5VSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UXVlcnlQcm92aWRlcigpKTsKLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkQ29tbWFuZExhYmVsKCkgewotCQlyZXR1cm4gUHJvdkFkbWluVUlNZXNzYWdlcy5BcnRpZmFjdFJlcG9zaXRvcmllc1ZpZXdfQWRkUmVwb3NpdG9yeUxhYmVsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkQ29tbWFuZFRvb2x0aXAoKSB7Ci0JCXJldHVybiBQcm92QWRtaW5VSU1lc3NhZ2VzLkFydGlmYWN0UmVwb3NpdG9yaWVzVmlld19BZGRSZXBvc2l0b3J5VG9vbHRpcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbW92ZUNvbW1hbmRUb29sdGlwKCkgewotCQlyZXR1cm4gUHJvdkFkbWluVUlNZXNzYWdlcy5BcnRpZmFjdFJlcG9zaXRvcmllc1ZpZXdfUmVtb3ZlUmVwb3NpdG9yeVRvb2x0aXA7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBvcGVuQWRkUmVwb3NpdG9yeURpYWxvZyhTaGVsbCBzaGVsbCkgewotCQlyZXR1cm4gbmV3IEFkZEFydGlmYWN0UmVwb3NpdG9yeURpYWxvZyhzaGVsbCwgZ2V0UmVwb0ZsYWdzKCkpLm9wZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvdmlzaW9uaW5nT3BlcmF0aW9uIGdldFJlbW92ZU9wZXJhdGlvbihPYmplY3RbXSBlbGVtZW50cykgewotCQlBcnJheUxpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSVJlcG9zaXRvcnlFbGVtZW50KQotCQkJCXVybHMuYWRkKCgoSVJlcG9zaXRvcnlFbGVtZW50KSBlbGVtZW50c1tpXSkuZ2V0TG9jYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBSZW1vdmVBcnRpZmFjdFJlcG9zaXRvcnlPcGVyYXRpb24oUHJvdkFkbWluVUlNZXNzYWdlcy5BcnRpZmFjdFJlcG9zaXRvcmllc1ZpZXdfUmVtb3ZlUmVwb3NpdG9yeU9wZXJhdGlvbkxhYmVsLCAoVVJMW10pIHVybHMudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSkpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUmVwb3NpdG9yeShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudCBpbnN0YW5jZW9mIEFydGlmYWN0UmVwb3NpdG9yeUVsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRSZXBvRmxhZ3MoKSB7Ci0JCWlmIChQcm92QWRtaW5VSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfSElERV9TWVNURU1fUkVQT1MpKQotCQkJcmV0dXJuIElBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19OT05fU1lTVEVNOwotCQlyZXR1cm4gSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX0FMTDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4uUmVwb3NpdG9yaWVzVmlldyNnZXRMaXN0ZW5lckV2ZW50VHlwZXMoKQotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TGlzdGVuZXJFdmVudFR5cGVzKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZFZpZXdlclByb3Zpc2lvbmluZ0xpc3RlbmVyLlBST1ZfRVZFTlRfQVJUSUZBQ1RfUkVQT1NJVE9SWTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4uUHJvdlZpZXcjcmVmcmVzaFVuZGVybHlpbmdNb2RlbCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybHlpbmdNb2RlbCgpIHsKLQkJUHJvdmlzaW9uaW5nT3BlcmF0aW9uUnVubmVyLnNjaGVkdWxlKG5ldyBSZWZyZXNoQXJ0aWZhY3RSZXBvc2l0b3JpZXNPcGVyYXRpb24oUHJvdkFkbWluVUlNZXNzYWdlcy5Qcm92Vmlld19SZWZyZXNoQ29tbWFuZExhYmVsLCBnZXRSZXBvRmxhZ3MoKSksIGdldFNoZWxsKCksIFN0YXR1c01hbmFnZXIuU0hPVyB8IFN0YXR1c01hbmFnZXIuTE9HKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9NZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9NZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBiMzYxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vTWV0YWRhdGFSZXBvc2l0b3JpZXNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEdlbnVpdGVjLCBMTEMgLSBhZGRlZCBsaWNlbnNlIHN1cHBvcnQKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5kaWFsb2dzLkFkZE1ldGFkYXRhUmVwb3NpdG9yeURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLmRpYWxvZ3MuQWRkUHJvZmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLnByZWZlcmVuY2VzLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLmFjdGlvbnMuSW5zdGFsbEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLmFjdGlvbnMuUmV2ZXJ0QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkubW9kZWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnBvbGljeS5JUXVlcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnF1ZXJ5LlF1ZXJ5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuTGlzdERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBsdWdpblRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnN0YXR1c2hhbmRsZXJzLlN0YXR1c01hbmFnZXI7Ci0KLS8qKgotICogVGhpcyB2aWV3IGFsbG93cyB1c2VycyB0byBpbnRlcmFjdCB3aXRoIG1ldGFkYXRhIHJlcG9zaXRvcmllcwotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXcgZXh0ZW5kcyBSZXBvc2l0b3JpZXNWaWV3IHsKLQotCXByaXZhdGUgSW5zdGFsbEFjdGlvbiBpbnN0YWxsQWN0aW9uOwotCXByaXZhdGUgUmV2ZXJ0QWN0aW9uIHJldmVydEFjdGlvbjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgTWV0YWRhdGFSZXBvc2l0b3JpZXNWaWV3KCkgewotCQkvLyBjb25zdHJ1Y3RvcgotCX0KLQotCXByb3RlY3RlZCBPYmplY3QgZ2V0SW5wdXQoKSB7Ci0JCU1ldGFkYXRhUmVwb3NpdG9yaWVzIGlucHV0ID0gbmV3IE1ldGFkYXRhUmVwb3NpdG9yaWVzKCk7Ci0JCWlucHV0LnNldFF1ZXJ5UHJvdmlkZXIoUHJvdkFkbWluVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFF1ZXJ5UHJvdmlkZXIoKSk7Ci0JCWlucHV0LnNldFF1ZXJ5Q29udGV4dChuZXcgUXVlcnlDb250ZXh0KCkgewotCQkJcHVibGljIGludCBnZXRRdWVyeVR5cGUoKSB7Ci0JCQkJcmV0dXJuIElRdWVyeVByb3ZpZGVyLk1FVEFEQVRBX1JFUE9TOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkQ29tbWFuZExhYmVsKCkgewotCQlyZXR1cm4gUHJvdkFkbWluVUlNZXNzYWdlcy5NZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXdfQWRkUmVwb3NpdG9yeUxhYmVsOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkQ29tbWFuZFRvb2x0aXAoKSB7Ci0JCXJldHVybiBQcm92QWRtaW5VSU1lc3NhZ2VzLk1ldGFkYXRhUmVwb3NpdG9yaWVzVmlld19BZGRSZXBvc2l0b3J5VG9vbHRpcDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbW92ZUNvbW1hbmRUb29sdGlwKCkgewotCQlyZXR1cm4gUHJvdkFkbWluVUlNZXNzYWdlcy5NZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXdfUmVtb3ZlUmVwb3NpdG9yeVRvb2x0aXA7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBvcGVuQWRkUmVwb3NpdG9yeURpYWxvZyhTaGVsbCBzaGVsbCkgewotCQlyZXR1cm4gbmV3IEFkZE1ldGFkYXRhUmVwb3NpdG9yeURpYWxvZyhzaGVsbCwgZ2V0UmVwb0ZsYWdzKCkpLm9wZW4oKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvdmlzaW9uaW5nT3BlcmF0aW9uIGdldFJlbW92ZU9wZXJhdGlvbihPYmplY3RbXSBlbGVtZW50cykgewotCQlBcnJheUxpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSVJlcG9zaXRvcnlFbGVtZW50KQotCQkJCXVybHMuYWRkKCgoSVJlcG9zaXRvcnlFbGVtZW50KSBlbGVtZW50c1tpXSkuZ2V0TG9jYXRpb24oKSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBSZW1vdmVNZXRhZGF0YVJlcG9zaXRvcnlPcGVyYXRpb24oUHJvdkFkbWluVUlNZXNzYWdlcy5BcnRpZmFjdFJlcG9zaXRvcmllc1ZpZXdfUmVtb3ZlUmVwb3NpdG9yeU9wZXJhdGlvbkxhYmVsLCAoVVJMW10pIHVybHMudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlzdXBlci5tYWtlQWN0aW9ucygpOwotCQlpbnN0YWxsQWN0aW9uID0gbmV3IEluc3RhbGxBY3Rpb24odmlld2VyLCBudWxsLCBnZXRQcm9maWxlQ2hvb3NlcigpLCBQcm92QWRtaW5VSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UG9saWNpZXMoKSwgZ2V0U2hlbGwoKSk7Ci0JCXJldmVydEFjdGlvbiA9IG5ldyBSZXZlcnRBY3Rpb24odmlld2VyLCBudWxsLCBnZXRQcm9maWxlQ2hvb3NlcigpLCBQcm92QWRtaW5VSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UG9saWNpZXMoKSwgZ2V0U2hlbGwoKSk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvZmlsZUNob29zZXIgZ2V0UHJvZmlsZUNob29zZXIoKSB7Ci0JCXJldHVybiBuZXcgSVByb2ZpbGVDaG9vc2VyKCkgewotCi0JCQlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVJZChTaGVsbCBzaGVsbCkgewotCQkJCS8vIFRPRE8gd291bGQgYmUgbmljZSBpZiB0aGUgcHJvZmlsZSBjaG9vc2VyIGRpYWxvZyBsZXQgeW91Ci0JCQkJLy8gY3JlYXRlIGEgbmV3IHByb2ZpbGUKLQkJCQlEZWZlcnJlZFF1ZXJ5Q29udGVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERlZmVycmVkUXVlcnlDb250ZW50UHJvdmlkZXIoUHJvdkFkbWluVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFF1ZXJ5UHJvdmlkZXIoKSk7Ci0JCQkJaWYgKHByb3ZpZGVyLmdldEVsZW1lbnRzKG5ldyBQcm9maWxlcygpKS5sZW5ndGggPT0gMCkgewotCQkJCQlBZGRQcm9maWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBBZGRQcm9maWxlRGlhbG9nKHNoZWxsLCBuZXcgU3RyaW5nWzBdKTsKLQkJCQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCQlyZXR1cm4gZGlhbG9nLmdldEFkZGVkUHJvZmlsZUlkKCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJTGlzdERpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdERpYWxvZyhnZXRTaGVsbCgpKTsKLQkJCQlkaWFsb2cuc2V0VGl0bGUoUHJvdkFkbWluVUlNZXNzYWdlcy5NZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXdfQ2hvb3NlUHJvZmlsZURpYWxvZ1RpdGxlKTsKLQkJCQlkaWFsb2cuc2V0TGFiZWxQcm92aWRlcihuZXcgUHJvdkVsZW1lbnRMYWJlbFByb3ZpZGVyKCkpOwotCQkJCWRpYWxvZy5zZXRJbnB1dChuZXcgUHJvZmlsZXMoKSk7Ci0JCQkJZGlhbG9nLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCQlPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5sZW5ndGggPiAwKSB7Ci0JCQkJCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIFByb3ZVSS5nZXRBZGFwdGVyKHJlc3VsdFswXSwgSVByb2ZpbGUuY2xhc3MpOwotCQkJCQlpZiAocHJvZmlsZSAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCk7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJCXJldHVybiBQcm92QWRtaW5VSU1lc3NhZ2VzLk1ldGFkYXRhUmVwb3NpdG9yaWVzVmlld19DaG9vc2VQcm9maWxlRGlhbG9nVGl0bGU7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCWlmIChpbnN0YWxsQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJbWFuYWdlci5hZGQoaW5zdGFsbEFjdGlvbik7Ci0JCQltYW5hZ2VyLmFkZChyZXZlcnRBY3Rpb24pOwotCQl9Ci0JCXN1cGVyLmZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1JlcG9zaXRvcnkoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRhZGF0YVJlcG9zaXRvcnlFbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVZpZXdlcihmaW5hbCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJc3VwZXIuY29uZmlndXJlVmlld2VyKHRyZWVWaWV3ZXIpOwotCQkvLyBBZGQgZHJhZyBzdXBwb3J0IGZvciBJVSdzCi0JCVRyYW5zZmVyW10gdHJhbnNmZXJzID0gbmV3IFRyYW5zZmVyW10ge29yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTG9jYWxTZWxlY3Rpb25UcmFuc2Zlci5nZXRUcmFuc2ZlcigpLCBQbHVnaW5UcmFuc2Zlci5nZXRJbnN0YW5jZSgpLCBUZXh0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKSx9OwotCQl0cmVlVmlld2VyLmFkZERyYWdTdXBwb3J0KERORC5EUk9QX0NPUFksIHRyYW5zZmVycywgbmV3IElVRHJhZ0FkYXB0ZXIodHJlZVZpZXdlcikpOwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0UmVwb0ZsYWdzKCkgewotCQlpZiAoUHJvdkFkbWluVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0hJREVfU1lTVEVNX1JFUE9TKSkKLQkJCXJldHVybiBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfTk9OX1NZU1RFTTsKLQkJcmV0dXJuIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19BTEw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLlJlcG9zaXRvcmllc1ZpZXcjZ2V0TGlzdGVuZXJFdmVudFR5cGVzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldExpc3RlbmVyRXZlbnRUeXBlcygpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWRWaWV3ZXJQcm92aXNpb25pbmdMaXN0ZW5lci5QUk9WX0VWRU5UX01FVEFEQVRBX1JFUE9TSVRPUlk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLlByb3ZWaWV3I3JlZnJlc2hVbmRlcmx5aW5nTW9kZWwoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hVbmRlcmx5aW5nTW9kZWwoKSB7Ci0JCVByb3Zpc2lvbmluZ09wZXJhdGlvblJ1bm5lci5zY2hlZHVsZShuZXcgUmVmcmVzaE1ldGFkYXRhUmVwb3NpdG9yaWVzT3BlcmF0aW9uKFByb3ZBZG1pblVJTWVzc2FnZXMuUHJvdlZpZXdfUmVmcmVzaENvbW1hbmRMYWJlbCwgZ2V0UmVwb0ZsYWdzKCkpLCBnZXRTaGVsbCgpLCBTdGF0dXNNYW5hZ2VyLlNIT1cgfCBTdGF0dXNNYW5hZ2VyLkxPRyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL1Byb2ZpbGVzVmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL1Byb2ZpbGVzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODI4ZTU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9Qcm9maWxlc1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgR2VudWl0ZWMsIExMQyAtIGFkZGVkIGxpY2Vuc2Ugc3VwcG9ydAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4uZGlhbG9ncy5BZGRQcm9maWxlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4ucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLmFjdGlvbnMuVW5pbnN0YWxsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuYWN0aW9ucy5VcGRhdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5tb2RlbC5JbnN0YWxsZWRJVUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5tb2RlbC5Qcm9maWxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlEaWFsb2dBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc3RhdHVzaGFuZGxlcnMuU3RhdHVzTWFuYWdlcjsKLQotLyoqCi0gKiBUaGlzIHZpZXcgYWxsb3dzIHVzZXJzIHRvIGludGVyYWN0IHdpdGggaW5zdGFsbGVkIHByb2ZpbGVzLgotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLXB1YmxpYyBjbGFzcyBQcm9maWxlc1ZpZXcgZXh0ZW5kcyBQcm92VmlldyB7Ci0JcHJpdmF0ZSBBY3Rpb24gYWRkUHJvZmlsZUFjdGlvbiwgcmVtb3ZlUHJvZmlsZUFjdGlvbiwgdW5pbnN0YWxsQWN0aW9uLCB1cGRhdGVBY3Rpb247Ci0JcHJpdmF0ZSBQcm9wZXJ0eURpYWxvZ0FjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uOwotCXByaXZhdGUgU3RydWN0dXJlZFZpZXdlclByb3Zpc2lvbmluZ0xpc3RlbmVyIGxpc3RlbmVyOwotCi0JcHJpdmF0ZSBjbGFzcyBSZW1vdmVQcm9maWxlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkJUmVtb3ZlUHJvZmlsZUFjdGlvbigpIHsKLQkJCXNldFRleHQoUHJvdkFkbWluVUlNZXNzYWdlcy5Qcm9maWxlc1ZpZXdfUmVtb3ZlUHJvZmlsZUxhYmVsKTsKLQkJCXNldFRvb2xUaXBUZXh0KFByb3ZBZG1pblVJTWVzc2FnZXMuUHJvZmlsZXNWaWV3X1JlbW92ZVByb2ZpbGVUb29sdGlwKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSkpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEVfRElTQUJMRUQpKTsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJTGlzdCBsaXN0ID0gZ2V0U2VsZWN0aW9uKCkudG9MaXN0KCk7Ci0JCQlMaXN0IHByb2ZpbGVzT25seSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotCQkJCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIFByb3ZVSS5nZXRBZGFwdGVyKGxpc3QuZ2V0KGkpLCBJUHJvZmlsZS5jbGFzcyk7Ci0JCQkJaWYgKHByb2ZpbGUgIT0gbnVsbCkgewotCQkJCQlwcm9maWxlc09ubHkuYWRkKHByb2ZpbGUpOwotCQkJCX0KLQkJCX0KLQkJCVByb2ZpbGVPcGVyYXRpb24gb3AgPSBuZXcgUmVtb3ZlUHJvZmlsZXNPcGVyYXRpb24oUHJvdkFkbWluVUlNZXNzYWdlcy5PcHNfUmVtb3ZlUHJvZmlsZU9wZXJhdGlvbkxhYmVsLCAoSVByb2ZpbGVbXSkgcHJvZmlsZXNPbmx5LnRvQXJyYXkobmV3IElQcm9maWxlW3Byb2ZpbGVzT25seS5zaXplKCldKSk7Ci0JCQlQcm92aXNpb25pbmdPcGVyYXRpb25SdW5uZXIucnVuKG9wLCBQcm9maWxlc1ZpZXcudGhpcy5nZXRTaGVsbCgpLCBTdGF0dXNNYW5hZ2VyLlNIT1cgfCBTdGF0dXNNYW5hZ2VyLkxPRyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEFkZFByb2ZpbGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlBZGRQcm9maWxlQWN0aW9uKCkgewotCQkJc2V0VGV4dChQcm92QWRtaW5VSU1lc3NhZ2VzLlByb2ZpbGVzVmlld19BZGRQcm9maWxlTGFiZWwpOwotCQkJc2V0VG9vbFRpcFRleHQoUHJvdkFkbWluVUlNZXNzYWdlcy5Qcm9maWxlc1ZpZXdfQWRkUHJvZmlsZVRvb2x0aXApOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFByb3ZVSUltYWdlcy5nZXRJbWFnZURlc2NyaXB0b3IoUHJvdlVJSW1hZ2VzLklNR19QUk9GSUxFKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQluZXcgQWRkUHJvZmlsZURpYWxvZyh2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldFNoZWxsKCksIGdldEtub3duUHJvZmlsZUlkcygpKS5vcGVuKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgUHJvZmlsZXNWaWV3KCkgewotCQkvLyBjb25zdHJ1Y3RvcgotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCWxpc3RlbmVyID0gbmV3IFN0cnVjdHVyZWRWaWV3ZXJQcm92aXNpb25pbmdMaXN0ZW5lcih2aWV3ZXIsIFN0cnVjdHVyZWRWaWV3ZXJQcm92aXNpb25pbmdMaXN0ZW5lci5QUk9WX0VWRU5UX0lVIHwgU3RydWN0dXJlZFZpZXdlclByb3Zpc2lvbmluZ0xpc3RlbmVyLlBST1ZfRVZFTlRfUFJPRklMRSwgUHJvdkFkbWluVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFF1ZXJ5UHJvdmlkZXIoKSk7Ci0JCVByb3ZVSS5hZGRQcm92aXNpb25pbmdMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTGlzdGVuZXJzKCkgewotCQlzdXBlci5yZW1vdmVMaXN0ZW5lcnMoKTsKLQkJUHJvdlVJLnJlbW92ZVByb3Zpc2lvbmluZ0xpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVWaWV3ZXIoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCXN1cGVyLmNvbmZpZ3VyZVZpZXdlcih0cmVlVmlld2VyKTsKLQkJSW5zdGFsbElVRHJvcEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBJbnN0YWxsSVVEcm9wQWRhcHRlcih0cmVlVmlld2VyLCBQcm92QWRtaW5VSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UG9saWNpZXMoKSk7Ci0JCWFkYXB0ZXIuc2V0RmVlZGJhY2tFbmFibGVkKGZhbHNlKTsKLQkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXSB7b3JnLmVjbGlwc2UuamZhY2UudXRpbC5Mb2NhbFNlbGVjdGlvblRyYW5zZmVyLmdldFRyYW5zZmVyKCl9OwotCQl0cmVlVmlld2VyLmFkZERyb3BTdXBwb3J0KERORC5EUk9QX0NPUFksIHRyYW5zZmVycywgYWRhcHRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbExvY2FsUHVsbERvd24oSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoYWRkUHJvZmlsZUFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHJlbW92ZVByb2ZpbGVBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChwcm9wZXJ0aWVzQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJbWFuYWdlci5hZGQodXBkYXRlQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQodW5pbnN0YWxsQWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaWxsQ29udGV4dE1lbnUoSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoYWRkUHJvZmlsZUFjdGlvbik7Ci0JCWlmIChyZW1vdmVQcm9maWxlQWN0aW9uLmlzRW5hYmxlZCgpKSB7Ci0JCQltYW5hZ2VyLmFkZChyZW1vdmVQcm9maWxlQWN0aW9uKTsKLQkJfQotCQlpZiAocHJvcGVydGllc0FjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJbWFuYWdlci5hZGQocHJvcGVydGllc0FjdGlvbik7Ci0JCX0KLQkJaWYgKHVwZGF0ZUFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJbWFuYWdlci5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQkJCW1hbmFnZXIuYWRkKHVwZGF0ZUFjdGlvbik7Ci0JCQltYW5hZ2VyLmFkZCh1bmluc3RhbGxBY3Rpb24pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbExvY2FsVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgbWFuYWdlcikgewotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQltYW5hZ2VyLmFkZChhZGRQcm9maWxlQWN0aW9uKTsKLQkJbWFuYWdlci5hZGQocmVtb3ZlUHJvZmlsZUFjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUFjdGlvbnMoKSB7Ci0JCXN1cGVyLm1ha2VBY3Rpb25zKCk7Ci0JCWFkZFByb2ZpbGVBY3Rpb24gPSBuZXcgQWRkUHJvZmlsZUFjdGlvbigpOwotCQlyZW1vdmVQcm9maWxlQWN0aW9uID0gbmV3IFJlbW92ZVByb2ZpbGVBY3Rpb24oKTsKLQkJdW5pbnN0YWxsQWN0aW9uID0gbmV3IFVuaW5zdGFsbEFjdGlvbih2aWV3ZXIsIG51bGwsIGdldFByb2ZpbGVDaG9vc2VyKCksIFByb3ZBZG1pblVJQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQb2xpY2llcygpLCBnZXRTaGVsbCgpKTsKLQkJdXBkYXRlQWN0aW9uID0gbmV3IFVwZGF0ZUFjdGlvbih2aWV3ZXIsIG51bGwsIGdldFByb2ZpbGVDaG9vc2VyKCksIFByb3ZBZG1pblVJQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQb2xpY2llcygpLCBnZXRTaGVsbCgpKTsKLQkJcHJvcGVydGllc0FjdGlvbiA9IG5ldyBQcm9wZXJ0eURpYWxvZ0FjdGlvbih0aGlzLmdldFNpdGUoKSwgdmlld2VyKTsKLQotCQlnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuUFJPUEVSVElFUy5nZXRJZCgpLCBwcm9wZXJ0aWVzQWN0aW9uKTsKLQkJdmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3MgPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCVByb2ZpbGVzVmlldy50aGlzLnNlbGVjdGlvbkNoYW5nZWQoc3MpOwotCQkJfQotCQl9KTsKLQotCQkvLyBwcmltZSB0aGUgYWN0aW9uIHZhbGlkYXRpb24KLQkJc2VsZWN0aW9uQ2hhbmdlZCgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzcykgewotCQlzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKHNzKTsKLQkJcHJvcGVydGllc0FjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVtb3ZlUHJvZmlsZUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaWYgKHNzLnNpemUoKSA9PSAxKSB7Ci0JCQlwcm9wZXJ0aWVzQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlJUHJvZmlsZSBwcm9maWxlID0gKElQcm9maWxlKSBQcm92VUkuZ2V0QWRhcHRlcihzcy5nZXRGaXJzdEVsZW1lbnQoKSwgSVByb2ZpbGUuY2xhc3MpOwotCQl9Ci0JCU9iamVjdFtdIHNlbGVjdGlvbkFycmF5ID0gc3MudG9BcnJheSgpOwotCQlpZiAoc2VsZWN0aW9uQXJyYXkubGVuZ3RoID4gMCkgewotCQkJcmVtb3ZlUHJvZmlsZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3Rpb25BcnJheS5sZW5ndGg7IGkrKykgewotCQkJCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIFByb3ZVSS5nZXRBZGFwdGVyKHNlbGVjdGlvbkFycmF5W2ldLCBJUHJvZmlsZS5jbGFzcyk7Ci0JCQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkgewotCQkJCQlyZW1vdmVQcm9maWxlQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBnZXREb3VibGVDbGlja0FjdGlvbigpIHsKLQkJcmV0dXJuIHByb3BlcnRpZXNBY3Rpb247Ci0JfQotCi0JcHJvdGVjdGVkIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IERlZmVycmVkUXVlcnlDb250ZW50UHJvdmlkZXIoUHJvdkFkbWluVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFF1ZXJ5UHJvdmlkZXIoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRJbnB1dCgpIHsKLQkJcmV0dXJuIG5ldyBQcm9maWxlcygpOwotCX0KLQotCUlQcm9maWxlQ2hvb3NlciBnZXRQcm9maWxlQ2hvb3NlcigpIHsKLQkJcmV0dXJuIG5ldyBJUHJvZmlsZUNob29zZXIoKSB7Ci0JCQlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVJZChTaGVsbCBzaGVsbCkgewotCQkJCU9iamVjdCBmaXJzdEVsZW1lbnQgPSBnZXRTZWxlY3Rpb24oKS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJCQlpZiAoZmlyc3RFbGVtZW50IGluc3RhbmNlb2YgSW5zdGFsbGVkSVVFbGVtZW50KSB7Ci0JCQkJCXJldHVybiAoKEluc3RhbGxlZElVRWxlbWVudCkgZmlyc3RFbGVtZW50KS5nZXRQcm9maWxlSWQoKTsKLQkJCQl9Ci0JCQkJSVByb2ZpbGUgcHJvZmlsZSA9IChJUHJvZmlsZSkgUHJvdlVJLmdldEFkYXB0ZXIoZmlyc3RFbGVtZW50LCBJUHJvZmlsZS5jbGFzcyk7Ci0JCQkJaWYgKHByb2ZpbGUgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCQkJcmV0dXJuIFByb3ZBZG1pblVJTWVzc2FnZXMuTWV0YWRhdGFSZXBvc2l0b3JpZXNWaWV3X0Nob29zZVByb2ZpbGVEaWFsb2dUaXRsZTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRWaXN1YWxQcm9wZXJ0aWVzKCkgewotCQlMaXN0IGxpc3QgPSBzdXBlci5nZXRWaXN1YWxQcm9wZXJ0aWVzKCk7Ci0JCWxpc3QuYWRkKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9TSE9XX0lOU1RBTExfUk9PVFNfT05MWSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCVN0cmluZ1tdIGdldEtub3duUHJvZmlsZUlkcygpIHsKLQkJdHJ5IHsKLQkJCUlQcm9maWxlW10gYWxsUHJvZmlsZXMgPSBQcm92aXNpb25pbmdVdGlsLmdldFByb2ZpbGVzKCk7Ci0JCQlTdHJpbmdbXSBpZHMgPSBuZXcgU3RyaW5nW2FsbFByb2ZpbGVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFByb2ZpbGVzLmxlbmd0aDsgaSsrKQotCQkJCWlkc1tpXSA9IGFsbFByb2ZpbGVzW2ldLmdldFByb2ZpbGVJZCgpOwotCQkJcmV0dXJuIGlkczsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCVByb3ZVSS5oYW5kbGVFeGNlcHRpb24oZSwgUHJvdkFkbWluVUlNZXNzYWdlcy5Qcm9maWxlc1ZpZXdfRXJyb3JSZXRyaWV2aW5nUHJvZmlsZXMsIFN0YXR1c01hbmFnZXIuTE9HKTsKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQl9Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vUHJvdkFkbWluUXVlcnlQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL1Byb3ZBZG1pblF1ZXJ5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiZmFjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vUHJvdkFkbWluUXVlcnlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4ucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklVUHJvZmlsZVByb3BlcnR5UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSVVQcm9wZXJ0eVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLlByb3ZVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5vcGVyYXRpb25zLlByb3Zpc2lvbmluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5wb2xpY3kuSVF1ZXJ5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5xdWVyeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudXBkYXRlY2hlY2tlci5VcGRhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc3RhdHVzaGFuZGxlcnMuU3RhdHVzTWFuYWdlcjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgcXVlcmllcyBhcHByb3ByaWF0ZSBmb3IgdGhlIFNESyBVSS4KLSAqIAotICogQHNpbmNlIDMuNAotICovCi0KLXB1YmxpYyBjbGFzcyBQcm92QWRtaW5RdWVyeVByb3ZpZGVyIGltcGxlbWVudHMgSVF1ZXJ5UHJvdmlkZXIgewotCi0JcHJpdmF0ZSBRdWVyeSBhbGxRdWVyeSA9IG5ldyBRdWVyeSgpIHsKLQkJcHVibGljIGJvb2xlYW4gaXNNYXRjaChPYmplY3QgY2FuZGlkYXRlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JfTsKLQotCXB1YmxpYyBFbGVtZW50UXVlcnlEZXNjcmlwdG9yIGdldFF1ZXJ5RGVzY3JpcHRvcihPYmplY3QgZWxlbWVudCwgaW50IHF1ZXJ5VHlwZSkgewotCQlJUXVlcnlhYmxlIHF1ZXJ5YWJsZTsKLQkJUXVlcnlDb250ZXh0IHF1ZXJ5Q29udGV4dCA9IG51bGw7Ci0JCS8vIFdlIGRvbid0IGN1cnJlbnRseSB1c2UgdGhlIHF1ZXJ5IGNvbnRleHQgdG8gYWx0ZXIgdGhlIHF1ZXJ5LCBidXQgYXMgc29vbiBhcyB3ZSBkbywgd2UnbGwKLQkJLy8gd2FudCB0byBtYWtlIHN1cmUgaXQgZ2V0cyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgYXBwcm9wcmlhdGUgZWxlbWVudHMuICBTbwotCQkvLyB3ZSBkbyB0aGF0IG5vdy4KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBRdWVyaWVkRWxlbWVudCkKLQkJCXF1ZXJ5Q29udGV4dCA9ICgoUXVlcmllZEVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5Q29udGV4dCgpOwotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gUHJvdkFkbWluVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlib29sZWFuIHNob3dHcm91cHNPbmx5ID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0hPV19HUk9VUFNfT05MWSk7Ci0JCWJvb2xlYW4gaGlkZVN5c3RlbSA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0hJREVfU1lTVEVNX1JFUE9TKTsKLQkJYm9vbGVhbiBzaG93TGF0ZXN0ID0gc3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQ09MTEFQU0VfSVVfVkVSU0lPTlMpOwotCQlib29sZWFuIHVzZUNhdGVnb3JpZXMgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9VU0VfQ0FURUdPUklFUyk7Ci0JCWJvb2xlYW4gc2hvd1Jvb3RzT25seSA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1NIT1dfSU5TVEFMTF9ST09UU19PTkxZKTsKLQkJUXVlcnkgZ3JvdXBRdWVyeSA9IG5ldyBJVVByb3BlcnR5UXVlcnkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfR1JPVVAsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJUXVlcnkgY2F0ZWdvcnlRdWVyeSA9IG5ldyBJVVByb3BlcnR5UXVlcnkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfQ0FURUdPUlksIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKLQkJUXVlcnkgcXVlcnk7Ci0JCUlQcm9maWxlIHByb2ZpbGU7Ci0JCXN3aXRjaCAocXVlcnlUeXBlKSB7Ci0JCQljYXNlIElRdWVyeVByb3ZpZGVyLkFSVElGQUNUX1JFUE9TIDoKLQkJCQlpbnQgZmxhZ3MgPSBoaWRlU3lzdGVtID8gSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX05PTl9TWVNURU0gOiBJQXJ0aWZhY3RSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfQUxMOwotCQkJCXF1ZXJ5YWJsZSA9IG5ldyBRdWVyeWFibGVBcnRpZmFjdFJlcG9zaXRvcnlNYW5hZ2VyKGZsYWdzKTsKLQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRRdWVyeURlc2NyaXB0b3IocXVlcnlhYmxlLCBudWxsLCBuZXcgQ29sbGVjdG9yKCkgewotCQkJCQlwdWJsaWMgYm9vbGVhbiBhY2NlcHQoT2JqZWN0IG9iamVjdCkgewotCQkJCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFVSTCkKLQkJCQkJCQlyZXR1cm4gc3VwZXIuYWNjZXB0KG5ldyBBcnRpZmFjdFJlcG9zaXRvcnlFbGVtZW50KChVUkwpIG9iamVjdCkpOwotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCWNhc2UgSVF1ZXJ5UHJvdmlkZXIuQVZBSUxBQkxFX0lVUyA6Ci0JCQkJLy8gSXMgaXQgYSByb2xsYmFjayByZXBvc2l0b3J5PwotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgUm9sbGJhY2tSZXBvc2l0b3J5RWxlbWVudCkgewotCQkJCQlRdWVyeSBwcm9maWxlUXVlcnkgPSBuZXcgSW5zdGFsbGFibGVVbml0UXVlcnkoKChSb2xsYmFja1JlcG9zaXRvcnlFbGVtZW50KSBlbGVtZW50KS5nZXRQcm9maWxlSWQoKSk7Ci0JCQkJCXJldHVybiBuZXcgRWxlbWVudFF1ZXJ5RGVzY3JpcHRvcigoKFJvbGxiYWNrUmVwb3NpdG9yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5YWJsZSgpLCBwcm9maWxlUXVlcnksIG5ldyBBdmFpbGFibGVJVUNvbGxlY3Rvcih0aGlzLCAoKFJvbGxiYWNrUmVwb3NpdG9yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5YWJsZSgpLCBxdWVyeUNvbnRleHQsIGZhbHNlKSk7Ci0JCQkJfQotCQkJCS8vIEl0IGlzIGEgcmVndWxhciByZXBvc2l0b3J5LgotCQkJCS8vIFdoYXQgc2hvdWxkIHdlIHNob3cgYXMgYSBjaGlsZCBvZiBhIHJlcG9zaXRvcnk/Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRhZGF0YVJlcG9zaXRvcnlFbGVtZW50KSB7Ci0JCQkJCWlmICh1c2VDYXRlZ29yaWVzKQotCQkJCQkJLy8gV2UgYXJlIHVzaW5nIGNhdGVnb3JpZXMsIGdyb3VwIGludG8gY2F0ZWdvcmllcyBmaXJzdC4KLQkJCQkJCXJldHVybiBuZXcgRWxlbWVudFF1ZXJ5RGVzY3JpcHRvcigoKE1ldGFkYXRhUmVwb3NpdG9yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5YWJsZSgpLCBjYXRlZ29yeVF1ZXJ5LCBuZXcgQ2F0ZWdvcnlFbGVtZW50Q29sbGVjdG9yKHRoaXMsICgoTWV0YWRhdGFSZXBvc2l0b3J5RWxlbWVudCkgZWxlbWVudCkuZ2V0UXVlcnlhYmxlKCksIHF1ZXJ5Q29udGV4dCwgdHJ1ZSkpOwotCQkJCQlpZiAoc2hvd0dyb3Vwc09ubHkpCi0JCQkJCQkvLyBRdWVyeSBhbGwgZ3JvdXBzIGFuZCB1c2UgdGhlIHF1ZXJ5IHJlc3VsdCB0byBvcHRpb25hbGx5IHNlbGVjdCB0aGUgbGF0ZXN0IHZlcnNpb24gb25seQotCQkJCQkJcmV0dXJuIG5ldyBFbGVtZW50UXVlcnlEZXNjcmlwdG9yKCgoTWV0YWRhdGFSZXBvc2l0b3J5RWxlbWVudCkgZWxlbWVudCkuZ2V0UXVlcnlhYmxlKCksIGdyb3VwUXVlcnksIHNob3dMYXRlc3QgPyBuZXcgTGF0ZXN0SVVWZXJzaW9uRWxlbWVudENvbGxlY3Rvcih0aGlzLCAoKE1ldGFkYXRhUmVwb3NpdG9yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5YWJsZSgpLCBxdWVyeUNvbnRleHQsIGZhbHNlKSA6IG5ldyBBdmFpbGFibGVJVUNvbGxlY3Rvcih0aGlzLCAoKE1ldGFkYXRhUmVwb3NpdG9yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5YWJsZSgpLCBxdWVyeUNvbnRleHQsIGZhbHNlKSk7Ci0JCQkJCWlmIChzaG93TGF0ZXN0KQotCQkJCQkJLy8gV2UgYXJlIG5vdCBxdWVyeWluZyBncm91cHMsIGJ1dCB3ZSBhcmUgc2hvd2luZyB0aGUgbGF0ZXN0IHZlcnNpb24gb25seQotCQkJCQkJcmV0dXJuIG5ldyBFbGVtZW50UXVlcnlEZXNjcmlwdG9yKCgoTWV0YWRhdGFSZXBvc2l0b3J5RWxlbWVudCkgZWxlbWVudCkuZ2V0UXVlcnlhYmxlKCksIGFsbFF1ZXJ5LCBuZXcgTGF0ZXN0SVVWZXJzaW9uRWxlbWVudENvbGxlY3Rvcih0aGlzLCAoKE1ldGFkYXRhUmVwb3NpdG9yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5YWJsZSgpLCBxdWVyeUNvbnRleHQsIGZhbHNlKSk7Ci0JCQkJCS8vIFNob3cgJ2VtIGFsbCEKLQkJCQkJcmV0dXJuIG5ldyBFbGVtZW50UXVlcnlEZXNjcmlwdG9yKCgoTWV0YWRhdGFSZXBvc2l0b3J5RWxlbWVudCkgZWxlbWVudCkuZ2V0UXVlcnlhYmxlKCksIGFsbFF1ZXJ5LCBuZXcgQXZhaWxhYmxlSVVDb2xsZWN0b3IodGhpcywgKChNZXRhZGF0YVJlcG9zaXRvcnlFbGVtZW50KSBlbGVtZW50KS5nZXRRdWVyeWFibGUoKSwgcXVlcnlDb250ZXh0LCBmYWxzZSkpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGFkYXRhUmVwb3NpdG9yaWVzKSB7Ci0JCQkJCU1ldGFkYXRhUmVwb3NpdG9yaWVzIG1ldGFSZXBvcyA9IChNZXRhZGF0YVJlcG9zaXRvcmllcykgZWxlbWVudDsKLQkJCQkJaWYgKG1ldGFSZXBvcy5nZXRNZXRhZGF0YVJlcG9zaXRvcmllcygpID09IG51bGwpCi0JCQkJCQltZXRhUmVwb3Muc2V0UmVwb0ZsYWdzKElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19OT05fU1lTVEVNKTsKLQkJCQkJcXVlcnlhYmxlID0gbmV3IFF1ZXJ5YWJsZU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIobWV0YVJlcG9zKTsKLQotCQkJCQlpZiAodXNlQ2F0ZWdvcmllcykKLQkJCQkJCS8vIFdlIGFyZSB1c2luZyBjYXRlZ29yaWVzLCBncm91cCBpbnRvIGNhdGVnb3JpZXMgZmlyc3QuCi0JCQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRRdWVyeURlc2NyaXB0b3IocXVlcnlhYmxlLCBjYXRlZ29yeVF1ZXJ5LCBuZXcgQ2F0ZWdvcnlFbGVtZW50Q29sbGVjdG9yKHRoaXMsIHF1ZXJ5YWJsZSwgcXVlcnlDb250ZXh0LCB0cnVlKSk7Ci0JCQkJCWlmIChzaG93R3JvdXBzT25seSkKLQkJCQkJCS8vIFF1ZXJ5IGFsbCBncm91cHMgYW5kIHVzZSB0aGUgcXVlcnkgcmVzdWx0IHRvIG9wdGlvbmFsbHkgc2VsZWN0IHRoZSBsYXRlc3QgdmVyc2lvbiBvbmx5Ci0JCQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRRdWVyeURlc2NyaXB0b3IocXVlcnlhYmxlLCBncm91cFF1ZXJ5LCBzaG93TGF0ZXN0ID8gbmV3IExhdGVzdElVVmVyc2lvbkVsZW1lbnRDb2xsZWN0b3IodGhpcywgcXVlcnlhYmxlLCBxdWVyeUNvbnRleHQsIGZhbHNlKSA6IG5ldyBBdmFpbGFibGVJVUNvbGxlY3Rvcih0aGlzLCBxdWVyeWFibGUsIHF1ZXJ5Q29udGV4dCwgZmFsc2UpKTsKLQkJCQkJaWYgKHNob3dMYXRlc3QpCi0JCQkJCQkvLyBXZSBhcmUgbm90IHF1ZXJ5aW5nIGdyb3VwcywgYnV0IHdlIGFyZSBzaG93aW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvbmx5Ci0JCQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRRdWVyeURlc2NyaXB0b3IocXVlcnlhYmxlLCBhbGxRdWVyeSwgbmV3IExhdGVzdElVVmVyc2lvbkVsZW1lbnRDb2xsZWN0b3IodGhpcywgcXVlcnlhYmxlLCBxdWVyeUNvbnRleHQsIGZhbHNlKSk7Ci0JCQkJCS8vIFNob3cgJ2VtIGFsbCEKLQkJCQkJcmV0dXJuIG5ldyBFbGVtZW50UXVlcnlEZXNjcmlwdG9yKHF1ZXJ5YWJsZSwgYWxsUXVlcnksIG5ldyBBdmFpbGFibGVJVUNvbGxlY3Rvcih0aGlzLCBxdWVyeWFibGUsIHF1ZXJ5Q29udGV4dCwgZmFsc2UpKTsKLQkJCQl9Ci0JCQkJLy8gVGhpbmdzIGhhdmUgYmVlbiBncm91cGVkIGJ5IGNhdGVnb3J5LCBub3cgd2hhdD8KLQkJCQkvLyBIYW5kbGUgdW5jYXRlZ29yaXplZCBlbGVtZW50cyBmaXJzdAotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVW5jYXRlZ29yaXplZENhdGVnb3J5RWxlbWVudCkgewotCQkJCQkvLyBXaWxsIGhhdmUgdG8gbG9vayBhdCBhbGwgY2F0ZWdvcmllcyBhbmQgb3RoZXIgaXRlbXMgZmlyc3QuIAotCQkJCQlxdWVyeWFibGUgPSAoKFVuY2F0ZWdvcml6ZWRDYXRlZ29yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5YWJsZSgpOwotCQkJCQlRdWVyeSBmaXJzdFBhc3NRdWVyeSA9IGFsbFF1ZXJ5OwotCQkJCQlpZiAoc2hvd0dyb3Vwc09ubHkpCi0JCQkJCQlmaXJzdFBhc3NRdWVyeSA9IG5ldyBDb21wb3VuZFF1ZXJ5KG5ldyBRdWVyeVtdIHtncm91cFF1ZXJ5LCBjYXRlZ29yeVF1ZXJ5fSwgZmFsc2UpOwotCQkJCQlxdWVyeWFibGUgPSAoKFVuY2F0ZWdvcml6ZWRDYXRlZ29yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5YWJsZSgpOwotCQkJCQlDb2xsZWN0b3IgY29sbGVjdG9yID0gc2hvd0xhdGVzdCA/IG5ldyBMYXRlc3RJVVZlcnNpb25FbGVtZW50Q29sbGVjdG9yKHRoaXMsIHF1ZXJ5YWJsZSwgcXVlcnlDb250ZXh0LCBmYWxzZSkgOiBuZXcgQXZhaWxhYmxlSVVDb2xsZWN0b3IodGhpcywgcXVlcnlhYmxlLCBxdWVyeUNvbnRleHQsIGZhbHNlKTsKLQkJCQkJcmV0dXJuIG5ldyBFbGVtZW50UXVlcnlEZXNjcmlwdG9yKHF1ZXJ5YWJsZSwgZmlyc3RQYXNzUXVlcnksIG5ldyBVbmNhdGVnb3JpemVkRWxlbWVudENvbGxlY3Rvcih0aGlzLCBxdWVyeWFibGUsIHF1ZXJ5Q29udGV4dCwgY29sbGVjdG9yKSk7Ci0KLQkJCQl9Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBDYXRlZ29yeUVsZW1lbnQpIHsKLQkJCQkJUXVlcnkgbWVtYmVyc09mQ2F0ZWdvcnlRdWVyeSA9IG5ldyBBbnlSZXF1aXJlZENhcGFiaWxpdHlRdWVyeSgoKENhdGVnb3J5RWxlbWVudCkgZWxlbWVudCkuZ2V0UmVxdWlyZW1lbnRzKCkpOwotCQkJCQlpZiAoc2hvd0dyb3Vwc09ubHkpCi0JCQkJCQkvLyBRdWVyeSBhbGwgZ3JvdXBzIGFuZCB1c2UgdGhlIHF1ZXJ5IHJlc3VsdCB0byBvcHRpb25hbGx5IHNlbGVjdCB0aGUgbGF0ZXN0IHZlcnNpb24gb25seQotCQkJCQkJcmV0dXJuIG5ldyBFbGVtZW50UXVlcnlEZXNjcmlwdG9yKCgoQ2F0ZWdvcnlFbGVtZW50KSBlbGVtZW50KS5nZXRRdWVyeWFibGUoKSwgbmV3IENvbXBvdW5kUXVlcnkobmV3IFF1ZXJ5W10ge25ldyBDb21wb3VuZFF1ZXJ5KG5ldyBRdWVyeVtdIHtncm91cFF1ZXJ5LCBjYXRlZ29yeVF1ZXJ5fSwgZmFsc2UpLCBtZW1iZXJzT2ZDYXRlZ29yeVF1ZXJ5fSwgdHJ1ZSksIHNob3dMYXRlc3QgPyBuZXcgTGF0ZXN0SVVWZXJzaW9uRWxlbWVudENvbGxlY3Rvcih0aGlzLCAoKENhdGVnb3J5RWxlbWVudCkgZWxlbWVudCkuZ2V0UXVlcnlhYmxlKCksIHF1ZXJ5Q29udGV4dCwgdHJ1ZSkgOiBuZXcgQXZhaWxhYmxlSVVDb2xsZWN0b3IodGhpcywgKChDYXRlZ29yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5YWJsZSgpLCBxdWVyeUNvbnRleHQsIHRydWUpKTsKLQkJCQkJaWYgKHNob3dMYXRlc3QpCi0JCQkJCQkvLyBXZSBhcmUgbm90IHF1ZXJ5aW5nIGdyb3VwcywgYnV0IHdlIGFyZSBzaG93aW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvbmx5Ci0JCQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRRdWVyeURlc2NyaXB0b3IoKChDYXRlZ29yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5YWJsZSgpLCBtZW1iZXJzT2ZDYXRlZ29yeVF1ZXJ5LCBuZXcgTGF0ZXN0SVVWZXJzaW9uRWxlbWVudENvbGxlY3Rvcih0aGlzLCAoKENhdGVnb3J5RWxlbWVudCkgZWxlbWVudCkuZ2V0UXVlcnlhYmxlKCksIHF1ZXJ5Q29udGV4dCwgdHJ1ZSkpOwotCQkJCQkvLyBTaG93ICdlbSBhbGwhCi0JCQkJCXJldHVybiBuZXcgRWxlbWVudFF1ZXJ5RGVzY3JpcHRvcigoKENhdGVnb3J5RWxlbWVudCkgZWxlbWVudCkuZ2V0UXVlcnlhYmxlKCksIG1lbWJlcnNPZkNhdGVnb3J5UXVlcnksIG5ldyBBdmFpbGFibGVJVUNvbGxlY3Rvcih0aGlzLCAoKENhdGVnb3J5RWxlbWVudCkgZWxlbWVudCkuZ2V0UXVlcnlhYmxlKCksIHF1ZXJ5Q29udGV4dCwgdHJ1ZSkpOwotCQkJCX0KLQkJCQkvLyBXZSd2ZSBhbHJlYWR5IGNvbGxhcHNlZCBhbGwgdmVyc2lvbnMsIHNob3cgdGhlIHJlc3QKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElVVmVyc2lvbnNFbGVtZW50KSB7Ci0JCQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoKElVVmVyc2lvbnNFbGVtZW50KSBlbGVtZW50KS5nZXRJVSgpOwotCQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRRdWVyeURlc2NyaXB0b3IoKChJVVZlcnNpb25zRWxlbWVudCkgZWxlbWVudCkuZ2V0UXVlcnlhYmxlKCksIG5ldyBJbnN0YWxsYWJsZVVuaXRRdWVyeShpdS5nZXRJZCgpKSwgbmV3IE90aGVySVVWZXJzaW9uc0NvbGxlY3RvcihpdSwgdGhpcywgKChJVVZlcnNpb25zRWxlbWVudCkgZWxlbWVudCkuZ2V0UXVlcnlhYmxlKCksIHF1ZXJ5Q29udGV4dCkpOwotCQkJCX0KLQkJCWNhc2UgSVF1ZXJ5UHJvdmlkZXIuQVZBSUxBQkxFX1VQREFURVMgOgotCQkJCXByb2ZpbGUgPSAoSVByb2ZpbGUpIFByb3ZVSS5nZXRBZGFwdGVyKGVsZW1lbnQsIElQcm9maWxlLmNsYXNzKTsKLQkJCQlJSW5zdGFsbGFibGVVbml0W10gdG9VcGRhdGU7Ci0JCQkJQ29sbGVjdG9yIGNvbGxlY3RvcjsKLQkJCQlpZiAocHJvZmlsZSAhPSBudWxsKSB7Ci0JCQkJCWNvbGxlY3RvciA9IHByb2ZpbGUucXVlcnkobmV3IElVUHJvZmlsZVByb3BlcnR5UXVlcnkocHJvZmlsZSwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BST0ZJTEVfUk9PVF9JVSwgQm9vbGVhbi50b1N0cmluZyh0cnVlKSksIG5ldyBDb2xsZWN0b3IoKSwgbnVsbCk7Ci0JCQkJCXRvVXBkYXRlID0gKElJbnN0YWxsYWJsZVVuaXRbXSkgY29sbGVjdG9yLnRvQXJyYXkoSUluc3RhbGxhYmxlVW5pdC5jbGFzcyk7Ci0JCQkJfSBlbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgVXBkYXRlRXZlbnQpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXByb2ZpbGUgPSBQcm92aXNpb25pbmdVdGlsLmdldFByb2ZpbGUoKChVcGRhdGVFdmVudCkgZWxlbWVudCkuZ2V0UHJvZmlsZUlkKCkpOwotCQkJCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCQkJUHJvdlVJLmhhbmRsZUV4Y2VwdGlvbihlLCBQcm92QWRtaW5VSU1lc3NhZ2VzLlByb3ZBZG1pblF1ZXJ5UHJvdmlkZXJfVXBkYXRlUXVlcnlFcnJvciwgU3RhdHVzTWFuYWdlci5MT0cpOwotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJdG9VcGRhdGUgPSAoKFVwZGF0ZUV2ZW50KSBlbGVtZW50KS5nZXRJVXMoKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJUXVlcnlhYmxlVXBkYXRlcyB1cGRhdGVRdWVyeWFibGUgPSBuZXcgUXVlcnlhYmxlVXBkYXRlcyh0b1VwZGF0ZSk7Ci0JCQkJaWYgKHNob3dMYXRlc3QpCi0JCQkJCWNvbGxlY3RvciA9IG5ldyBMYXRlc3RJVVZlcnNpb25Db2xsZWN0b3IodGhpcywgdXBkYXRlUXVlcnlhYmxlLCBxdWVyeUNvbnRleHQsIHVzZUNhdGVnb3JpZXMpOwotCQkJCWVsc2UKLQkJCQkJY29sbGVjdG9yID0gbmV3IENvbGxlY3RvcigpOwotCQkJCXJldHVybiBuZXcgRWxlbWVudFF1ZXJ5RGVzY3JpcHRvcih1cGRhdGVRdWVyeWFibGUsIGFsbFF1ZXJ5LCBjb2xsZWN0b3IpOwotCQkJY2FzZSBJUXVlcnlQcm92aWRlci5JTlNUQUxMRURfSVVTIDoKLQkJCQlwcm9maWxlID0gKElQcm9maWxlKSBQcm92VUkuZ2V0QWRhcHRlcihlbGVtZW50LCBJUHJvZmlsZS5jbGFzcyk7Ci0JCQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJaWYgKHNob3dSb290c09ubHkpCi0JCQkJCXF1ZXJ5ID0gbmV3IElVUHJvZmlsZVByb3BlcnR5UXVlcnkocHJvZmlsZSwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BST0ZJTEVfUk9PVF9JVSwgQm9vbGVhbi50b1N0cmluZyh0cnVlKSk7Ci0JCQkJZWxzZQotCQkJCQlxdWVyeSA9IGFsbFF1ZXJ5OwotCQkJCWlmIChzaG93R3JvdXBzT25seSkKLQkJCQkJcmV0dXJuIG5ldyBFbGVtZW50UXVlcnlEZXNjcmlwdG9yKHByb2ZpbGUsIG5ldyBDb21wb3VuZFF1ZXJ5KG5ldyBRdWVyeVtdIHtncm91cFF1ZXJ5LCBxdWVyeX0sIHRydWUpLCBuZXcgSW5zdGFsbGVkSVVDb2xsZWN0b3IodGhpcywgcHJvZmlsZSwgcXVlcnlDb250ZXh0KSk7Ci0JCQkJcmV0dXJuIG5ldyBFbGVtZW50UXVlcnlEZXNjcmlwdG9yKHByb2ZpbGUsIHF1ZXJ5LCBuZXcgSW5zdGFsbGVkSVVDb2xsZWN0b3IodGhpcywgcHJvZmlsZSwgcXVlcnlDb250ZXh0KSk7Ci0JCQljYXNlIElRdWVyeVByb3ZpZGVyLk1FVEFEQVRBX1JFUE9TIDoKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE1ldGFkYXRhUmVwb3NpdG9yaWVzKSB7Ci0JCQkJCU1ldGFkYXRhUmVwb3NpdG9yaWVzIG1ldGFSZXBvcyA9IChNZXRhZGF0YVJlcG9zaXRvcmllcykgZWxlbWVudDsKLQkJCQkJaWYgKG1ldGFSZXBvcy5nZXRNZXRhZGF0YVJlcG9zaXRvcmllcygpID09IG51bGwpCi0JCQkJCQltZXRhUmVwb3Muc2V0UmVwb0ZsYWdzKGhpZGVTeXN0ZW0gPyBJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfTk9OX1NZU1RFTSA6IElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLlJFUE9TSVRPUklFU19BTEwpOwotCQkJCQlxdWVyeWFibGUgPSBuZXcgUXVlcnlhYmxlTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcihtZXRhUmVwb3MpOwotCQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRRdWVyeURlc2NyaXB0b3IocXVlcnlhYmxlLCBudWxsLCBuZXcgTWV0YWRhdGFSZXBvc2l0b3J5RWxlbWVudENvbGxlY3Rvcih0aGlzLCBxdWVyeUNvbnRleHQpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQljYXNlIElRdWVyeVByb3ZpZGVyLlBST0ZJTEVTIDoKLQkJCQlxdWVyeWFibGUgPSBuZXcgUXVlcnlhYmxlUHJvZmlsZVJlZ2lzdHJ5KCk7Ci0JCQkJcmV0dXJuIG5ldyBFbGVtZW50UXVlcnlEZXNjcmlwdG9yKHF1ZXJ5YWJsZSwgbmV3IFF1ZXJ5KCkgewotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoKE9iamVjdCBjYW5kaWRhdGUpIHsKLQkJCQkJCXJldHVybiBQcm92VUkuZ2V0QWRhcHRlcihjYW5kaWRhdGUsIElQcm9maWxlLmNsYXNzKSAhPSBudWxsOwotCQkJCQl9Ci0JCQkJfSwgbmV3IFByb2ZpbGVFbGVtZW50Q29sbGVjdG9yKHRoaXMsIG51bGwsIHF1ZXJ5Q29udGV4dCkpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vUHJvdkFkbWluVUlBY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9Qcm92QWRtaW5VSUFjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDdjMmEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9Qcm92QWRtaW5VSUFjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLklTZXJ2aWNlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm92aXNpb25pbmdQbGFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnBvbGljeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZ2lzdHJhdGlvbjsKLQotLyoqCi0gKiBBY3RpdmF0b3IgY2xhc3MgZm9yIHRoZSBhZG1pbiBVSS4KLSAqLwotcHVibGljIGNsYXNzIFByb3ZBZG1pblVJQWN0aXZhdG9yIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm92QWRtaW5VSUFjdGl2YXRvciBwbHVnaW47Ci0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuYWRtaW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSU1BFQ1RJVkVfSUQgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5hZG1pbi5Qcm92aXNpb25pbmdQZXJzcGVjdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVF1ZXJ5UHJvdmlkZXIgcXVlcnlQcm92aWRlcjsKLQlwcml2YXRlIExpY2Vuc2VNYW5hZ2VyIGxpY2Vuc2VNYW5hZ2VyOwotCXByaXZhdGUgSVBsYW5WYWxpZGF0b3IgcGxhblZhbGlkYXRvcjsKLQlwcml2YXRlIFBvbGljaWVzIHBvbGljaWVzOwotCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiBjZXJ0aWZpY2F0ZVVJUmVnaXN0cmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBwbHVnaW4gaW5zdGFuY2UKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvdkFkbWluVUlBY3RpdmF0b3IgZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGltYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBpbWFnZSBmaWxlIGF0IHRoZSBnaXZlbiBwbHVnLWluCi0JICogcmVsYXRpdmUgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aAotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHBhdGgpIHsKLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOX0lELCBwYXRoKTsKLQl9Ci0KLQlwdWJsaWMgUHJvdkFkbWluVUlBY3RpdmF0b3IoKSB7Ci0JCS8vIGNvbnN0cnVjdG9yCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChidW5kbGVDb250ZXh0KTsKLQkJcGx1Z2luID0gdGhpczsKLQkJUHJvdkFkbWluVUlBY3RpdmF0b3IuY29udGV4dCA9IGJ1bmRsZUNvbnRleHQ7Ci0JCWNlcnRpZmljYXRlVUlSZWdpc3RyYXRpb24gPSBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShJU2VydmljZVVJLmNsYXNzLmdldE5hbWUoKSwgbmV3IFZhbGlkYXRpb25EaWFsb2dTZXJ2aWNlVUkoKSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlwbHVnaW4gPSBudWxsOwotCQljZXJ0aWZpY2F0ZVVJUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLQkJc3VwZXIuc3RvcChidW5kbGVDb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgSVF1ZXJ5UHJvdmlkZXIgZ2V0UXVlcnlQcm92aWRlcigpIHsKLQkJaWYgKHF1ZXJ5UHJvdmlkZXIgPT0gbnVsbCkKLQkJCXF1ZXJ5UHJvdmlkZXIgPSBuZXcgUHJvdkFkbWluUXVlcnlQcm92aWRlcigpOwotCQlyZXR1cm4gcXVlcnlQcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgTGljZW5zZU1hbmFnZXIgZ2V0TGljZW5zZU1hbmFnZXIoKSB7Ci0JCWlmIChsaWNlbnNlTWFuYWdlciA9PSBudWxsKQotCQkJbGljZW5zZU1hbmFnZXIgPSBuZXcgU2ltcGxlTGljZW5zZU1hbmFnZXIoKTsKLQkJcmV0dXJuIGxpY2Vuc2VNYW5hZ2VyOwotCX0KLQotCXB1YmxpYyBJUGxhblZhbGlkYXRvciBnZXRQbGFuVmFsaWRhdG9yKCkgewotCQlpZiAocGxhblZhbGlkYXRvciA9PSBudWxsKQotCQkJcGxhblZhbGlkYXRvciA9IG5ldyBJUGxhblZhbGlkYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBjb250aW51ZVdvcmtpbmdXaXRoUGxhbihQcm92aXNpb25pbmdQbGFuIHBsYW4sIFNoZWxsIHNoZWxsKSB7Ci0JCQkJCWlmIChwbGFuID09IG51bGwpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCS8vIElmIHRoZSBwbGFuIHJlcXVpcmVzIGluc3RhbGwgaGFuZGxlciBzdXBwb3J0LCB3ZSB3YW50IHRvIG9wZW4gdGhlIG9sZCB1cGRhdGUgVUkKLQkJCQkJaWYgKFVwZGF0ZU1hbmFnZXJDb21wYXRpYmlsaXR5LnJlcXVpcmVzSW5zdGFsbEhhbmRsZXJTdXBwb3J0KHBsYW4pKSB7Ci0JCQkJCQlNZXNzYWdlRGlhbG9nIGRpYWxvZyA9IG5ldyBNZXNzYWdlRGlhbG9nKHNoZWxsLCBQcm92QWRtaW5VSU1lc3NhZ2VzLlByb3ZBZG1pblVJQWN0aXZhdG9yX1Vuc3VwcG9ydGVkSW5zdGFsbEhhbmRsZXIsIG51bGwsIFByb3ZBZG1pblVJTWVzc2FnZXMuUHJvdkFkbWluVUlBY3RpdmF0b3JfVW5zdXBwb3J0ZWRJbnN0YWxsSGFuZGxlck1lc3NhZ2UsIE1lc3NhZ2VEaWFsb2cuV0FSTklORywgbmV3IFN0cmluZ1tdIHtQcm92QWRtaW5VSU1lc3NhZ2VzLlByb3ZBZG1pblVJQWN0aXZhdG9yX0xhdW5jaFVwZGF0ZU1hbmFnZXIsIFByb3ZBZG1pblVJTWVzc2FnZXMuUHJvdkFkbWluVUlBY3RpdmF0b3JfQ29udGludWVBbnl3YXksIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMfSwgMCk7Ci0JCQkJCQlpbnQgcmV0ID0gZGlhbG9nLm9wZW4oKTsKLQkJCQkJCWlmIChyZXQgPT0gMSkgLy8gY29udGludWUgYW55d2F5Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQlpZiAocmV0ID09IDApCi0JCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoc2hlbGwuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCVVwZGF0ZU1hbmFnZXJDb21wYXRpYmlsaXR5Lm9wZW5JbnN0YWxsZXIoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX07Ci0JCXJldHVybiBwbGFuVmFsaWRhdG9yOwotCX0KLQotCXB1YmxpYyBQb2xpY2llcyBnZXRQb2xpY2llcygpIHsKLQkJaWYgKHBvbGljaWVzID09IG51bGwpIHsKLQkJCXBvbGljaWVzID0gbmV3IFBvbGljaWVzKCkgewotCQkJCXB1YmxpYyBMaWNlbnNlTWFuYWdlciBnZXRMaWNlbnNlTWFuYWdlcigpIHsKLQkJCQkJcmV0dXJuIFByb3ZBZG1pblVJQWN0aXZhdG9yLnRoaXMuZ2V0TGljZW5zZU1hbmFnZXIoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgSVBsYW5WYWxpZGF0b3IgZ2V0UGxhblZhbGlkYXRvcigpIHsKLQkJCQkJcmV0dXJuIFByb3ZBZG1pblVJQWN0aXZhdG9yLnRoaXMuZ2V0UGxhblZhbGlkYXRvcigpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBJUXVlcnlQcm92aWRlciBnZXRRdWVyeVByb3ZpZGVyKCkgewotCQkJCQlyZXR1cm4gUHJvdkFkbWluVUlBY3RpdmF0b3IudGhpcy5nZXRRdWVyeVByb3ZpZGVyKCk7Ci0JCQkJfQotCQkJfTsKLQkJfQotCQlyZXR1cm4gcG9saWNpZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL1Byb3ZBZG1pblVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9Qcm92QWRtaW5VSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YzFiYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL1Byb3ZBZG1pblVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBNZXNzYWdlIGNsYXNzIGZvciBwcm92aXNpb25pbmcgVUkgbWVzc2FnZXMuICAKLSAqIAotICogQHNpbmNlIDMuNAotICovCi1wdWJsaWMgY2xhc3MgUHJvdkFkbWluVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4ubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFByb3ZBZG1pblVJTWVzc2FnZXMuY2xhc3MpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRBcnRpZmFjdFJlcG9zaXRvcnlEaWFsb2dfRHVwbGljYXRlVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEFydGlmYWN0UmVwb3NpdG9yeURpYWxvZ19PcGVyYXRpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRQcm9maWxlRGlhbG9nX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZE1ldGFkYXRhUmVwb3NpdG9yeURpYWxvZ19PcGVyYXRpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXdfQWRkUmVwb3NpdG9yeVRvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWV0YWRhdGFSZXBvc2l0b3JpZXNWaWV3X0FkZFJlcG9zaXRvcnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXdfQ2hvb3NlUHJvZmlsZURpYWxvZ1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1ldGFkYXRhUmVwb3NpdG9yaWVzVmlld19SZW1vdmVSZXBvc2l0b3J5VG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcnRpZmFjdFJlcG9zaXRvcmllc1ZpZXdfQWRkUmVwb3NpdG9yeVRvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXJ0aWZhY3RSZXBvc2l0b3JpZXNWaWV3X0FkZFJlcG9zaXRvcnlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBcnRpZmFjdFJlcG9zaXRvcmllc1ZpZXdfUmVtb3ZlUmVwb3NpdG9yeVRvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXJ0aWZhY3RSZXBvc2l0b3JpZXNWaWV3X1JlbW92ZVJlcG9zaXRvcnlPcGVyYXRpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9maWxlc1ZpZXdfRXJyb3JSZXRyaWV2aW5nUHJvZmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZXNWaWV3X0FkZFByb2ZpbGVUb29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVzVmlld19BZGRQcm9maWxlTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZXNWaWV3X1JlbW92ZVByb2ZpbGVMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9maWxlc1ZpZXdfUmVtb3ZlUHJvZmlsZVRvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVwb3NpdG9yaWVzVmlld19SZW1vdmVDb21tYW5kTGFiZWw7Ci0JLy8gUHJlZmVyZW5jZXMKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnN0YWxsZWRJVVByb3BlcnR5UGFnZV9Ob0luZm9BdmFpbGFibGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdkFkbWluUXVlcnlQcm92aWRlcl9VcGRhdGVRdWVyeUVycm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3ZBZG1pblVJQWN0aXZhdG9yX0NvbnRpbnVlQW55d2F5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3ZBZG1pblVJQWN0aXZhdG9yX0xhdW5jaFVwZGF0ZU1hbmFnZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdkFkbWluVUlBY3RpdmF0b3JfVW5zdXBwb3J0ZWRJbnN0YWxsSGFuZGxlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm92QWRtaW5VSUFjdGl2YXRvcl9VbnN1cHBvcnRlZEluc3RhbGxIYW5kbGVyTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm92aXNpb25pbmdQcmVmUGFnZV9IaWRlU3lzdGVtUmVwb3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdmlzaW9uaW5nUHJlZlBhZ2VfU2hvd0dyb3Vwc09ubHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdmlzaW9uaW5nUHJlZlBhZ2VfU2hvd0luc3RhbGxSb290c09ubHk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdmlzaW9uaW5nUHJlZlBhZ2VfQ29sbGFwc2VJVVZlcnNpb25zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3Zpc2lvbmluZ1ByZWZQYWdlX1VzZUNhdGVnb3JpZXM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcHNfUmVtb3ZlUHJvZmlsZU9wZXJhdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZFByb2ZpbGVEaWFsb2dfT3BlcmF0aW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkUHJvZmlsZURpYWxvZ19EdXBsaWNhdGVQcm9maWxlSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdlZpZXdfUmVmcmVzaENvbW1hbmRMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm92Vmlld19SZWZyZXNoQ29tbWFuZFRvb2x0aXA7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9maWxlUm9vdFByb3BlcnR5TmFtZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlcG9zaXRvcnlHcm91cF9OYW1lQ29sdW1uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVwb3NpdG9yeUdyb3VwX1Byb3BlcnRpZXNMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXBvc2l0b3J5R3JvdXBfVmFsdWVDb2x1bW5MYWJlbDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElVR3JvdXBfSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSVVHcm91cF9JVV9JRF9SZXF1aXJlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJVUdyb3VwX05hbWVzcGFjZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJVUdyb3VwX1Byb3ZpZGVkQ2FwYWJpbGl0aWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElVR3JvdXBfUmVxdWlyZWRDYXBhYmlsaXRpZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSVVHcm91cF9Ub3VjaHBvaW50RGF0YTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJVUdyb3VwX1RvdWNocG9pbnRUeXBlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElVR3JvdXBfVmVyc2lvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJVVByb2ZpbGVQcm9wZXJ0aWVzR3JvdXBfSW52YWxpZFByb2ZpbGVJRDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIElVUHJvcGVydGllc0dyb3VwX0Rlc2NyaXB0aW9uUHJvcGVydHlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJVVByb3BlcnRpZXNHcm91cF9OYW1lUHJvcGVydHlMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJVVByb3BlcnRpZXNHcm91cF9Qcm92aWRlclByb3BlcnR5TGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fUHJvcGVydHlfSXRlbV9TZWxlY3RlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVHcm91cF9Ccm93c2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZUdyb3VwX0Jyb3dzZTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZUdyb3VwX0Vudmlyb25tZW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9maWxlR3JvdXBfRmxhdm9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVHcm91cF9JRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9maWxlR3JvdXBfQ2FjaGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZUdyb3VwX0luc3RhbGxGb2xkZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZUdyb3VwX05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZUdyb3VwX05MOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVHcm91cF9TZWxlY3RQcm9maWxlTWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9maWxlR3JvdXBfRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZmlsZUdyb3VwX1Byb2ZpbGVJRFJlcXVpcmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVHcm91cF9Qcm9maWxlSW5zdGFsbEZvbGRlclJlcXVpcmVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2ZpbGVHcm91cF9TZWxlY3RCdW5kbGVQb29sQ2FjaGU7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9Qcm92Vmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL1Byb3ZWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTJjMmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL1Byb3ZWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4ucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLlByb3ZVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLmFjdGlvbnMuUmVmcmVzaEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm9wZXJhdGlvbnMuVW5kb1JlZG9BY3Rpb25Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlZpZXdQYXJ0OwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc3VwcG9ydHMgdGhlIGNvbW1vbiBjaGFyYWN0ZXJpc3RpY3MgZm9yIHZpZXdzIHRoYXQgbWFuaXB1bGF0ZQotICogcHJvdmlzaW9uaW5nIG1vZGVscy4KLSAqIAotICogQHNpbmNlIDMuNAotICovCi1hYnN0cmFjdCBjbGFzcyBQcm92VmlldyBleHRlbmRzIFZpZXdQYXJ0IHsKLQlUcmVlVmlld2VyIHZpZXdlcjsKLQlwcml2YXRlIFVuZG9SZWRvQWN0aW9uR3JvdXAgdW5kb1JlZG9Hcm91cDsKLQlSZWZyZXNoQWN0aW9uIHJlZnJlc2hBY3Rpb247Ci0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBwcmVmZXJlbmNlTGlzdGVuZXI7Ci0JcHJvdGVjdGVkIERpc3BsYXkgZGlzcGxheTsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUHJvdlZpZXcoKSB7Ci0JCS8vIGNvbnN0cnVjdG9yCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVQYXJ0Q29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIFN0b3JlIHRoZSBkaXNwbGF5IHNvIHdlIGNhbiBtYWtlIGFzeW5jIGNhbGxzIGZyb20gbGlzdGVuZXJzCi0JCWRpc3BsYXkgPSBwYXJlbnQuZ2V0RGlzcGxheSgpOwotCQl2aWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0JCXZpZXdlci5nZXRUcmVlKCkuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJY29uZmlndXJlVmlld2VyKHZpZXdlcik7Ci0JCS8vIERvIHRoaXMgYWZ0ZXIgc2V0dGluZyB1cCBzb3J0ZXJzLCBmaWx0ZXJzLCBldGMuCi0JCS8vIE90aGVyd2lzZSBpdCB3aWxsIHJldHJpZXZlIGNvbnRlbnQgb24gZWFjaCBjaGFuZ2UuCi0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIoZ2V0Q29udGVudFByb3ZpZGVyKCkpOwotCi0JCS8vIE5vdyBzZXQgdXAgdGhlIHZpc3VhbHMsIGNvbHVtbnMgYmVmb3JlIGxhYmVscy4KLQkJc2V0VHJlZUNvbHVtbnModmlld2VyLmdldFRyZWUoKSk7Ci0JCXZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKGdldExhYmVsUHJvdmlkZXIoKSk7Ci0KLQkJLy8gSW5wdXQgaXMgbGFzdAotCQl2aWV3ZXIuc2V0SW5wdXQoZ2V0SW5wdXQoKSk7Ci0KLQkJYWRkTGlzdGVuZXJzKCk7Ci0JCW1ha2VBY3Rpb25zKCk7Ci0JCWhvb2tDb250ZXh0TWVudSgpOwotCQlob29rRG91YmxlQ2xpY2tBY3Rpb24oKTsKLQkJY29udHJpYnV0ZVRvQWN0aW9uQmFycygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBob29rQ29udGV4dE1lbnUoKSB7Ci0JCU1lbnVNYW5hZ2VyIG1lbnVNZ3IgPSBuZXcgTWVudU1hbmFnZXIoIiNQb3B1cE1lbnUiKTsgLy8kTk9OLU5MUy0xJAotCQltZW51TWdyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJbWVudU1nci5hZGRNZW51TGlzdGVuZXIobmV3IElNZW51TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCQlQcm92Vmlldy50aGlzLmZpbGxDb250ZXh0TWVudShtYW5hZ2VyKTsKLQkJCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkJCW1hbmFnZXIuYWRkKHJlZnJlc2hBY3Rpb24pOwotCQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJCX0KLQkJfSk7Ci0JCU1lbnUgbWVudSA9IG1lbnVNZ3IuY3JlYXRlQ29udGV4dE1lbnUodmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXZpZXdlci5nZXRDb250cm9sKCkuc2V0TWVudShtZW51KTsKLQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUobWVudU1nciwgdmlld2VyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaG9va0RvdWJsZUNsaWNrQWN0aW9uKCkgewotCQl2aWV3ZXIuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJSUFjdGlvbiBhY3Rpb24gPSBnZXREb3VibGVDbGlja0FjdGlvbigpOwotCQkJCWlmIChhY3Rpb24gIT0gbnVsbCAmJiBhY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCQkJYWN0aW9uLnJ1bigpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbnRyaWJ1dGVUb0FjdGlvbkJhcnMoKSB7Ci0JCUlBY3Rpb25CYXJzIGJhcnMgPSBnZXRWaWV3U2l0ZSgpLmdldEFjdGlvbkJhcnMoKTsKLQkJSU1lbnVNYW5hZ2VyIG1hbmFnZXIgPSBiYXJzLmdldE1lbnVNYW5hZ2VyKCk7Ci0JCWZpbGxMb2NhbFB1bGxEb3duKG1hbmFnZXIpOwotCQltYW5hZ2VyLmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQltYW5hZ2VyLmFkZChyZWZyZXNoQWN0aW9uKTsKLQotCQlmaWxsTG9jYWxUb29sQmFyKGJhcnMuZ2V0VG9vbEJhck1hbmFnZXIoKSk7Ci0JCXVuZG9SZWRvR3JvdXAuZmlsbEFjdGlvbkJhcnMoYmFycyk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZmlsbExvY2FsUHVsbERvd24oSU1lbnVNYW5hZ2VyIG1hbmFnZXIpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZpbGxMb2NhbFRvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IElBY3Rpb24gZ2V0RG91YmxlQ2xpY2tBY3Rpb24oKTsKLQotCXByb3RlY3RlZCB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQl1bmRvUmVkb0dyb3VwID0gbmV3IFVuZG9SZWRvQWN0aW9uR3JvdXAoZ2V0U2l0ZSgpLCBQcm92VUkuZ2V0UHJvdmlzaW9uaW5nVW5kb0NvbnRleHQoKSwgdHJ1ZSk7Ci0JCXJlZnJlc2hBY3Rpb24gPSBuZXcgUmVmcmVzaEFjdGlvbih2aWV3ZXIsIHZpZXdlci5nZXRDb250cm9sKCkpIHsKLQkJCXByb3RlY3RlZCB2b2lkIHJlZnJlc2goKSB7Ci0JCQkJcmVmcmVzaEFsbCgpOwotCQkJfQotCQl9OwotCQlyZWZyZXNoQWN0aW9uLnNldFRvb2xUaXBUZXh0KFByb3ZBZG1pblVJTWVzc2FnZXMuUHJvdlZpZXdfUmVmcmVzaENvbW1hbmRUb29sdGlwKTsKLQl9Ci0KLQkvKioKLQkgKiBQYXNzaW5nIHRoZSBmb2N1cyByZXF1ZXN0IHRvIHRoZSB2aWV3ZXIncyBjb250cm9sLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvY3VzKCkgewotCQl2aWV3ZXIuZ2V0Q29udHJvbCgpLnNldEZvY3VzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LldvcmtiZW5jaFBhcnQjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKHVuZG9SZWRvR3JvdXAgIT0gbnVsbCkgewotCQkJdW5kb1JlZG9Hcm91cC5kaXNwb3NlKCk7Ci0JCX0KLQkJcmVtb3ZlTGlzdGVuZXJzKCk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRMaXN0ZW5lcnMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcm92QWRtaW5VSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXByZWZlcmVuY2VMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZ2V0VmlzdWFsUHJvcGVydGllcygpLmNvbnRhaW5zKGV2ZW50LmdldFByb3BlcnR5KCkpKSB7Ci0JCQkJCVByb3ZWaWV3LnRoaXMucmVmcmVzaEFsbCgpOwotCQkJCX0KLQkJCX0KLQotCQl9OwotCQlzdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlTGlzdGVuZXJzKCkgewotCQlpZiAocHJlZmVyZW5jZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcm92QWRtaW5VSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQlzdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlTaGVsbCBnZXRTaGVsbCgpIHsKLQkJcmV0dXJuIHZpZXdlci5nZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQlDb250cm9sIGdldFZpZXdlckNvbnRyb2woKSB7Ci0JCXJldHVybiB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCX0KLQotCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIChJU3RydWN0dXJlZFNlbGVjdGlvbikgdmlld2VyLmdldFNlbGVjdGlvbigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVZpZXdlcihmaW5hbCBUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJdmlld2VyLnNldENvbXBhcmF0b3IobmV3IElVQ29tcGFyYXRvcihJVUNvbXBhcmF0b3IuSVVfSUQpKTsKLQkJdmlld2VyLnNldENvbXBhcmVyKG5ldyBQcm92RWxlbWVudENvbXBhcmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIHN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLiAgRG8gbm90aGluZyBoZXJlLgotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBJQ29udGVudFByb3ZpZGVyIGdldENvbnRlbnRQcm92aWRlcigpOwotCi0JcHJvdGVjdGVkIE9iamVjdCBnZXRJbnB1dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VHJlZUNvbHVtbnMoVHJlZSB0cmVlKSB7Ci0JCS8vIEZvciBub3cgd2Ugc2V0IHR3byBjb2x1bW5zIGFuZCB0aGUgY29udGVudCBkZXBlbmRzIG9uIHRoZSBlbGVtZW50cwotCQlUcmVlQ29sdW1uIHRjID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQsIDApOwotCQl0Yy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCXRjLnNldFdpZHRoKDQwMCk7Ci0JCXRjID0gbmV3IFRyZWVDb2x1bW4odHJlZSwgU1dULkxFRlQsIDEpOwotCQl0Yy5zZXRXaWR0aCg2MDApOwotCQl0Yy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgUHJvdkVsZW1lbnRMYWJlbFByb3ZpZGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaFVuZGVybHlpbmdNb2RlbCgpIHsKLQkJLy8gRGVmYXVsdCBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0VmlzdWFsUHJvcGVydGllcygpIHsKLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlsaXN0LmFkZChQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0hPV19HUk9VUFNfT05MWSk7Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCWZpbmFsIHZvaWQgcmVmcmVzaEFsbCgpIHsKLQkJLy8gUmVmcmVzaCB0aGUgdW5kZXJseWluZyBlbGVtZW50cwotCQlyZWZyZXNoVW5kZXJseWluZ01vZGVsKCk7Ci0JCS8vIFdlIHRoZW4gcmVzZXQgdGhlIGlucHV0IHRvIGVuc3VyZSB0aGF0IGFueXRoaW5nIHRoZSBjb250ZW50IHByb3ZpZGVycyAKLQkJLy8gYXJlIGNhY2hpbmcgZ2V0cyByZXNldCBhbHNvLiAgVGhlIG5ldCBlZmZlY3QgaXMgdGhhdCBldmVyeXRoaW5nIAotCQkvLyB3aWxsIGdldCBxdWVyaWVkIGFnYWluLgotCQl2aWV3ZXIuc2V0SW5wdXQoZ2V0SW5wdXQoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL1Byb3Zpc2lvbmluZ1BlcnNwZWN0aXZlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vUHJvdmlzaW9uaW5nUGVyc3BlY3RpdmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGE1ZTAxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vUHJvdmlzaW9uaW5nUGVyc3BlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuKjsKLQotLyoqCi0gKiBQZXJzcGVjdGl2ZSB3aGljaCBtYWtlcyB0aGUgc3RhbmRhcmQgcHJvdmlzaW9uaW5nIHZpZXdzIGF2YWlsYWJsZS4KLSAqIAotICogQHNpbmNlIDMuNAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm92aXNpb25pbmdQZXJzcGVjdGl2ZSBpbXBsZW1lbnRzIElQZXJzcGVjdGl2ZUZhY3RvcnkgewotCi0JcHJpdmF0ZSBJUGFnZUxheW91dCBmYWN0b3J5OwotCi0JcHVibGljIFByb3Zpc2lvbmluZ1BlcnNwZWN0aXZlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUluaXRpYWxMYXlvdXQoSVBhZ2VMYXlvdXQgbGF5b3V0KSB7Ci0JCXRoaXMuZmFjdG9yeSA9IGxheW91dDsKLQkJYWRkVmlld3MoKTsKLQkJYWRkQWN0aW9uU2V0cygpOwotCQlhZGROZXdXaXphcmRTaG9ydGN1dHMoKTsKLQkJYWRkUGVyc3BlY3RpdmVTaG9ydGN1dHMoKTsKLQkJYWRkVmlld1Nob3J0Y3V0cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRWaWV3cygpIHsKLQkJLy8gQ3JlYXRlcyB0aGUgb3ZlcmFsbCBmb2xkZXIgbGF5b3V0LgotCQkvLyBOb3RlIHRoYXQgZWFjaCBuZXcgRm9sZGVyIHVzZXMgYSBwZXJjZW50YWdlIG9mIHRoZSByZW1haW5pbmcKLQkJLy8gRWRpdG9yQXJlYS4KLQotCQlJRm9sZGVyTGF5b3V0IGJvdHRvbSA9IGZhY3RvcnkuY3JlYXRlRm9sZGVyKCJib3R0b21SaWdodCIsIC8vJE5PTi1OTFMtMSQKLQkJCQlJUGFnZUxheW91dC5CT1RUT00sIDAuNzVmLCBmYWN0b3J5LmdldEVkaXRvckFyZWEoKSk7Ci0JCWJvdHRvbS5hZGRWaWV3KCJvcmcuZWNsaXBzZS5wMi51aS5hZG1pbi5Qcm9maWxlc1ZpZXciKTsgLy8kTk9OLU5MUy0xJAotCi0JCUlGb2xkZXJMYXlvdXQgdG9wTGVmdCA9IGZhY3RvcnkuY3JlYXRlRm9sZGVyKCJ0b3BMZWZ0IiwgLy8kTk9OLU5MUy0xJAotCQkJCUlQYWdlTGF5b3V0LkxFRlQsIDAuNGYsIGZhY3RvcnkuZ2V0RWRpdG9yQXJlYSgpKTsKLQkJdG9wTGVmdC5hZGRWaWV3KCJvcmcuZWNsaXBzZS5wMi51aS5hZG1pbi5NZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQl0b3BMZWZ0LmFkZFZpZXcoIm9yZy5lY2xpcHNlLnAyLnVpLmFkbWluLkFydGlmYWN0UmVwb3NpdG9yaWVzVmlldyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEFjdGlvblNldHMoKSB7Ci0JCWZhY3RvcnkuYWRkQWN0aW9uU2V0KElQYWdlTGF5b3V0LklEX05BVklHQVRFX0FDVElPTl9TRVQpOyAvLyBOT04tTkxTLTEKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkUGVyc3BlY3RpdmVTaG9ydGN1dHMoKSB7Ci0JCWZhY3RvcnkuYWRkUGVyc3BlY3RpdmVTaG9ydGN1dCgib3JnLmVjbGlwc2UudWkucmVzb3VyY2VQZXJzcGVjdGl2ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZE5ld1dpemFyZFNob3J0Y3V0cygpIHsKLQkJLy8gZmFjdG9yeS5hZGROZXdXaXphcmRTaG9ydGN1dCgib3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXcuZm9sZGVyIik7Ly9OT04tTkxTLTEKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkVmlld1Nob3J0Y3V0cygpIHsKLQkJZmFjdG9yeS5hZGRTaG93Vmlld1Nob3J0Y3V0KCJvcmcuZWNsaXBzZS5wMi51aS5hZG1pbi5NZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXciKTsgLy8kTk9OLU5MUy0xJAotCQlmYWN0b3J5LmFkZFNob3dWaWV3U2hvcnRjdXQoIm9yZy5lY2xpcHNlLnAyLnVpLmFkbWluLkFydGlmYWN0UmVwb3NpdG9yaWVzVmlldyIpOyAvLyROT04tTkxTLTEkCi0JCWZhY3RvcnkuYWRkU2hvd1ZpZXdTaG9ydGN1dCgib3JnLmVjbGlwc2UucDIudWkuYWRtaW4uUHJvZmlsZXNWaWV3Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9SZXBvc2l0b3JpZXNWaWV3LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vUmVwb3NpdG9yaWVzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmFiNDM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9SZXBvc2l0b3JpZXNWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW47Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4ucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkubW9kZWwuSVJlcG9zaXRvcnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkub3BlcmF0aW9ucy5Qcm92aXNpb25pbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS52aWV3ZXJzLlJlcG9zaXRvcnlDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXJQcm92aXNpb25pbmdMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5RGlhbG9nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnN0YXR1c2hhbmRsZXJzLlN0YXR1c01hbmFnZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBzdXBwb3J0cyB0aGUgY29tbW9uIGNoYXJhY3RlcmlzdGljcyBmb3Igdmlld3MgdGhhdCBtYW5pcHVsYXRlCi0gKiBwcm92aXNpb25pbmcgcmVwb3NpdG9yaWVzLgotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLWFic3RyYWN0IGNsYXNzIFJlcG9zaXRvcmllc1ZpZXcgZXh0ZW5kcyBQcm92VmlldyB7Ci0KLQlwcml2YXRlIGNsYXNzIFJlbW92ZVJlcG9zaXRvcnlBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlSZW1vdmVSZXBvc2l0b3J5QWN0aW9uKCkgewotCQkJc2V0VGV4dChnZXRSZW1vdmVDb21tYW5kTGFiZWwoKSk7Ci0JCQlzZXRUb29sVGlwVGV4dChnZXRSZW1vdmVDb21tYW5kVG9vbHRpcCgpKTsKLQkJCXNldEltYWdlRGVzY3JpcHRvcihQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlRGVzY3JpcHRvcihJU2hhcmVkSW1hZ2VzLklNR19UT09MX0RFTEVURSkpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9ERUxFVEVfRElTQUJMRUQpKTsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJUHJvdmlzaW9uaW5nT3BlcmF0aW9uUnVubmVyLnJ1bihnZXRSZW1vdmVPcGVyYXRpb24oZ2V0U2VsZWN0aW9uKCkudG9BcnJheSgpKSwgZ2V0U2hlbGwoKSwgU3RhdHVzTWFuYWdlci5TSE9XIHwgU3RhdHVzTWFuYWdlci5MT0cpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBBZGRSZXBvc2l0b3J5QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkJQWRkUmVwb3NpdG9yeUFjdGlvbigpIHsKLQkJCXNldFRleHQoZ2V0QWRkQ29tbWFuZExhYmVsKCkpOwotCQkJc2V0VG9vbFRpcFRleHQoZ2V0QWRkQ29tbWFuZFRvb2x0aXAoKSk7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoUHJvdlVJSW1hZ2VzLmdldEltYWdlRGVzY3JpcHRvcihQcm92VUlJbWFnZXMuSU1HX0FSVElGQUNUX1JFUE9TSVRPUlkpKTsKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJT2JqZWN0W10gZWxlbWVudHMgPSAoKElUcmVlQ29udGVudFByb3ZpZGVyKSB2aWV3ZXIuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldEVsZW1lbnRzKGdldElucHV0KCkpOwotCQkJQXJyYXlMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJCWlmIChlbGVtZW50c1tpXSBpbnN0YW5jZW9mIElSZXBvc2l0b3J5RWxlbWVudCkKLQkJCQkJdXJscy5hZGQoKChJUmVwb3NpdG9yeUVsZW1lbnQpIGVsZW1lbnRzW2ldKS5nZXRMb2NhdGlvbigpKTsKLQkJCW9wZW5BZGRSZXBvc2l0b3J5RGlhbG9nKGdldFNoZWxsKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBBY3Rpb24gYWRkUmVwb3NpdG9yeUFjdGlvbiwgcmVtb3ZlUmVwb3NpdG9yeUFjdGlvbjsKLQlwcml2YXRlIFByb3BlcnR5RGlhbG9nQWN0aW9uIHByb3BlcnRpZXNBY3Rpb247Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXJQcm92aXNpb25pbmdMaXN0ZW5lciBsaXN0ZW5lcjsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgUmVwb3NpdG9yaWVzVmlldygpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZExpc3RlbmVycygpIHsKLQkJc3VwZXIuYWRkTGlzdGVuZXJzKCk7Ci0JCWxpc3RlbmVyID0gbmV3IFN0cnVjdHVyZWRWaWV3ZXJQcm92aXNpb25pbmdMaXN0ZW5lcih2aWV3ZXIsIGdldExpc3RlbmVyRXZlbnRUeXBlcygpLCBQcm92QWRtaW5VSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UXVlcnlQcm92aWRlcigpKTsKLQkJUHJvdlVJLmFkZFByb3Zpc2lvbmluZ0xpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVMaXN0ZW5lcnMoKSB7Ci0JCXN1cGVyLnJlbW92ZUxpc3RlbmVycygpOwotCQlQcm92VUkucmVtb3ZlUHJvdmlzaW9uaW5nTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbGxMb2NhbFB1bGxEb3duKElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKGFkZFJlcG9zaXRvcnlBY3Rpb24pOwotCQltYW5hZ2VyLmFkZChyZW1vdmVSZXBvc2l0b3J5QWN0aW9uKTsKLQkJbWFuYWdlci5hZGQocHJvcGVydGllc0FjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlsbENvbnRleHRNZW51KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCW1hbmFnZXIuYWRkKGFkZFJlcG9zaXRvcnlBY3Rpb24pOwotCQlpZiAocmVtb3ZlUmVwb3NpdG9yeUFjdGlvbi5pc0VuYWJsZWQoKSkgewotCQkJbWFuYWdlci5hZGQocmVtb3ZlUmVwb3NpdG9yeUFjdGlvbik7Ci0JCX0KLQkJaWYgKHByb3BlcnRpZXNBY3Rpb24uaXNFbmFibGVkKCkpIHsKLQkJCW1hbmFnZXIuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCQltYW5hZ2VyLmFkZChwcm9wZXJ0aWVzQWN0aW9uKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpbGxMb2NhbFRvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJbWFuYWdlci5hZGQoYWRkUmVwb3NpdG9yeUFjdGlvbik7Ci0JCW1hbmFnZXIuYWRkKHJlbW92ZVJlcG9zaXRvcnlBY3Rpb24pOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG1ha2VBY3Rpb25zKCkgewotCQlzdXBlci5tYWtlQWN0aW9ucygpOwotCQlhZGRSZXBvc2l0b3J5QWN0aW9uID0gbmV3IEFkZFJlcG9zaXRvcnlBY3Rpb24oKTsKLQkJcmVtb3ZlUmVwb3NpdG9yeUFjdGlvbiA9IG5ldyBSZW1vdmVSZXBvc2l0b3J5QWN0aW9uKCk7Ci0JCWdldFZpZXdTaXRlKCkuZ2V0QWN0aW9uQmFycygpLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoQWN0aW9uRmFjdG9yeS5ERUxFVEUuZ2V0SWQoKSwgcmVtb3ZlUmVwb3NpdG9yeUFjdGlvbik7Ci0KLQkJcHJvcGVydGllc0FjdGlvbiA9IG5ldyBQcm9wZXJ0eURpYWxvZ0FjdGlvbih0aGlzLmdldFNpdGUoKSwgdmlld2VyKTsKLQkJZ2V0Vmlld1NpdGUoKS5nZXRBY3Rpb25CYXJzKCkuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBST1BFUlRJRVMuZ2V0SWQoKSwgcHJvcGVydGllc0FjdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxICYmIGlzUmVwb3NpdG9yeShzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpKSB7Ci0JCQlwcm9wZXJ0aWVzQWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlyZW1vdmVSZXBvc2l0b3J5QWN0aW9uLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlwcm9wZXJ0aWVzQWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJcmVtb3ZlUmVwb3NpdG9yeUFjdGlvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJUmVwb3NpdG9yaWVzVmlldy50aGlzLnNlbGVjdGlvbkNoYW5nZWQoc3MpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUFjdGlvbiBnZXREb3VibGVDbGlja0FjdGlvbigpIHsKLQkJcmV0dXJuIHByb3BlcnRpZXNBY3Rpb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJcHJvcGVydGllc0FjdGlvbi5zZXRFbmFibGVkKHNlbGVjdGlvbi5zaXplKCkgPT0gMSAmJiAoKFByb3ZVSS5nZXRBZGFwdGVyKHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSwgSUluc3RhbGxhYmxlVW5pdC5jbGFzcykgIT0gbnVsbCkgfHwgKGlzUmVwb3NpdG9yeShzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCkpKSkpOwotCQlib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKLQkJT2JqZWN0W10gc2VsZWN0aW9uQXJyYXkgPSBzZWxlY3Rpb24udG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbkFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIWlzUmVwb3NpdG9yeShzZWxlY3Rpb25BcnJheVtpXSkpIHsKLQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbmFibGVkID0gdHJ1ZTsKLQkJfQotCQlyZW1vdmVSZXBvc2l0b3J5QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKCkgewotCQlyZXR1cm4gbmV3IFJlcG9zaXRvcnlDb250ZW50UHJvdmlkZXIoUHJvdkFkbWluVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFF1ZXJ5UHJvdmlkZXIoKSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IG9wZW5BZGRSZXBvc2l0b3J5RGlhbG9nKFNoZWxsIHNoZWxsKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBQcm92aXNpb25pbmdPcGVyYXRpb24gZ2V0UmVtb3ZlT3BlcmF0aW9uKE9iamVjdFtdIGVsZW1lbnRzKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0QWRkQ29tbWFuZExhYmVsKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEFkZENvbW1hbmRUb29sdGlwKCk7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbW92ZUNvbW1hbmRMYWJlbCgpIHsKLQkJcmV0dXJuIFByb3ZBZG1pblVJTWVzc2FnZXMuUmVwb3NpdG9yaWVzVmlld19SZW1vdmVDb21tYW5kTGFiZWw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRSZW1vdmVDb21tYW5kVG9vbHRpcCgpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaXNSZXBvc2l0b3J5KE9iamVjdCBlbGVtZW50KTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0TGlzdGVuZXJFdmVudFR5cGVzKCk7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRWaXN1YWxQcm9wZXJ0aWVzKCkgewotCQlMaXN0IGxpc3QgPSBzdXBlci5nZXRWaXN1YWxQcm9wZXJ0aWVzKCk7Ci0JCWxpc3QuYWRkKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ISURFX1NZU1RFTV9SRVBPUyk7Ci0JCWxpc3QuYWRkKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9VU0VfQ0FURUdPUklFUyk7Ci0JCWxpc3QuYWRkKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9DT0xMQVBTRV9JVV9WRVJTSU9OUyk7Ci0JCXJldHVybiBsaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL0FkZEFydGlmYWN0UmVwb3NpdG9yeURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL2RpYWxvZ3MvQWRkQXJ0aWZhY3RSZXBvc2l0b3J5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYTI5NzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL2RpYWxvZ3MvQWRkQXJ0aWZhY3RSZXBvc2l0b3J5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4uUHJvdkFkbWluVUlBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5Qcm92QWRtaW5VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5kaWFsb2dzLkFkZFJlcG9zaXRvcnlEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5kaWFsb2dzLlVSTFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBEaWFsb2cgdGhhdCBhbGxvd3MgYW4gYXJ0aWZhY3QgcmVwb3NpdG9yeSB0byBiZSBkZWZpbmVkIGFuZCBhZGRlZC4KLSAqIAotICogQHNpbmNlIDMuNAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRBcnRpZmFjdFJlcG9zaXRvcnlEaWFsb2cgZXh0ZW5kcyBBZGRSZXBvc2l0b3J5RGlhbG9nIHsKLQotCXB1YmxpYyBBZGRBcnRpZmFjdFJlcG9zaXRvcnlEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIGludCByZXBvRmxhZ3MpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIHJlcG9GbGFncyk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3Zpc2lvbmluZ09wZXJhdGlvbiBnZXRPcGVyYXRpb24oVVJMIHVybCkgewotCQlyZXR1cm4gbmV3IEFkZEFydGlmYWN0UmVwb3NpdG9yeU9wZXJhdGlvbihQcm92QWRtaW5VSU1lc3NhZ2VzLkFkZEFydGlmYWN0UmVwb3NpdG9yeURpYWxvZ19PcGVyYXRpb25MYWJlbCwgdXJsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVVJMVmFsaWRhdG9yIGNyZWF0ZVVSTFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBVUkxWYWxpZGF0b3IoKSB7Ci0JCQlwcm90ZWN0ZWQgSVN0YXR1cyB2YWxpZGF0ZVJlcG9zaXRvcnlVUkwoVVJMIGxvY2F0aW9uLCBib29sZWFuIGNvbnRhY3RSZXBvc2l0b3JpZXMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCUlTdGF0dXMgZHVwbGljYXRlU3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQlVUkxbXSBrbm93blJlcG9zaXRvcmllczsKLQkJCQl0cnkgewotCQkJCQlrbm93blJlcG9zaXRvcmllcyA9IFByb3Zpc2lvbmluZ1V0aWwuZ2V0QXJ0aWZhY3RSZXBvc2l0b3JpZXMocmVwb0ZsYWcpOwotCQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWtub3duUmVwb3NpdG9yaWVzID0gbmV3IFVSTFswXTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrbm93blJlcG9zaXRvcmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoa25vd25SZXBvc2l0b3JpZXNbaV0udG9FeHRlcm5hbEZvcm0oKS5lcXVhbHNJZ25vcmVDYXNlKGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpKSB7Ci0JCQkJCQlkdXBsaWNhdGVTdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3ZBZG1pblVJQWN0aXZhdG9yLlBMVUdJTl9JRCwgTE9DQUxfVkFMSURBVElPTl9FUlJPUiwgUHJvdkFkbWluVUlNZXNzYWdlcy5BZGRBcnRpZmFjdFJlcG9zaXRvcnlEaWFsb2dfRHVwbGljYXRlVVJMLCBudWxsKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBkdXBsaWNhdGVTdGF0dXM7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL2RpYWxvZ3MvQWRkTWV0YWRhdGFSZXBvc2l0b3J5RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vZGlhbG9ncy9BZGRNZXRhZGF0YVJlcG9zaXRvcnlEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1MmRjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vZGlhbG9ncy9BZGRNZXRhZGF0YVJlcG9zaXRvcnlEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5Qcm92QWRtaW5VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuZGlhbG9ncy5BZGRSZXBvc2l0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkub3BlcmF0aW9ucy5BZGRNZXRhZGF0YVJlcG9zaXRvcnlPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5vcGVyYXRpb25zLlByb3Zpc2lvbmluZ09wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLQotLyoqCi0gKiBEaWFsb2cgdGhhdCBhbGxvd3MgYSBtZXRhZGF0YSByZXBvc2l0b3J5IHRvIGJlIGRlZmluZWQgYW5kIGFkZGVkLgotICogCi0gKiBAc2luY2UgMy40Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFkZE1ldGFkYXRhUmVwb3NpdG9yeURpYWxvZyBleHRlbmRzIEFkZFJlcG9zaXRvcnlEaWFsb2cgewotCi0JcHVibGljIEFkZE1ldGFkYXRhUmVwb3NpdG9yeURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgaW50IHJlcG9GbGFncykgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgcmVwb0ZsYWdzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvdmlzaW9uaW5nT3BlcmF0aW9uIGdldE9wZXJhdGlvbihVUkwgdXJsKSB7Ci0JCXJldHVybiBuZXcgQWRkTWV0YWRhdGFSZXBvc2l0b3J5T3BlcmF0aW9uKFByb3ZBZG1pblVJTWVzc2FnZXMuQWRkTWV0YWRhdGFSZXBvc2l0b3J5RGlhbG9nX09wZXJhdGlvbkxhYmVsLCB1cmwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL0FkZFByb2ZpbGVEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL0FkZFByb2ZpbGVEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjZGFhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vZGlhbG9ncy9BZGRQcm9maWxlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4uZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLlByb3ZBZG1pblVJQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4uUHJvdkFkbWluVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmVuZ2luZS5JUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLlByb3Zpc2lvbmluZ09wZXJhdGlvblJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLm9wZXJhdGlvbnMuQWRkUHJvZmlsZU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc3RhdHVzaGFuZGxlcnMuU3RhdHVzTWFuYWdlcjsKLQotLyoqCi0gKiBEaWFsb2cgdGhhdCBhbGxvd3MgYSBwcm9maWxlIHRvIGJlIGRlZmluZWQgYW5kIGFkZGVkLgotICogCi0gKiBAc2luY2UgMy40Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFkZFByb2ZpbGVEaWFsb2cgZXh0ZW5kcyBTdGF0dXNEaWFsb2cgewotCi0JcHJpdmF0ZSBQcm9maWxlR3JvdXAgcHJvZmlsZUdyb3VwOwotCXByaXZhdGUgQnV0dG9uIG9rQnV0dG9uOwotCXByaXZhdGUgU3RyaW5nW10ga25vd25Qcm9maWxlSWRzOwotCXByaXZhdGUgU3RyaW5nIGFkZGVkUHJvZmlsZUlkOwotCi0JcHVibGljIEFkZFByb2ZpbGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZ1tdIGtub3duUHJvZmlsZXMpIHsKLQotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXRoaXMua25vd25Qcm9maWxlSWRzID0ga25vd25Qcm9maWxlczsKLQkJc2V0VGl0bGUoUHJvdkFkbWluVUlNZXNzYWdlcy5BZGRQcm9maWxlRGlhbG9nX1RpdGxlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXByb2ZpbGVHcm91cCA9IG5ldyBQcm9maWxlR3JvdXAocGFyZW50LCBudWxsLCBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGV2ZW50KSB7Ci0JCQkJdmVyaWZ5Q29tcGxldGUoKTsKLQkJCX0KLQkJfSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocHJvZmlsZUdyb3VwLmdldENvbXBvc2l0ZSgpKTsKLQkJcmV0dXJuIHByb2ZpbGVHcm91cC5nZXRDb21wb3NpdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCXZlcmlmeUNvbXBsZXRlKCk7Ci0JCWlmIChva0J1dHRvbi5pc0VuYWJsZWQoKSkgewotCQkJYWRkUHJvZmlsZSgpOwotCQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIFdlIG9ubHkgZ2V0IGhlcmUgaWYgYWxyZWFkeSB2YWxpZGF0ZWQgKG9rIHdhcyBwcmVzc2VkKQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRQcm9maWxlKCkgewotCQlJUHJvZmlsZSBwcm9maWxlID0gcHJvZmlsZUdyb3VwLmdldFByb2ZpbGUoKTsKLQkJaWYgKHByb2ZpbGUgIT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWFkZGVkUHJvZmlsZUlkID0gcHJvZmlsZUdyb3VwLmdldFByb2ZpbGVJZCgpOwotCQlNYXAgcHJvZmlsZVByb3BlcnRpZXMgPSBwcm9maWxlR3JvdXAuZ2V0UHJvZmlsZVByb3BlcnRpZXMoKTsKLQkJUHJvdmlzaW9uaW5nT3BlcmF0aW9uUnVubmVyLnJ1bihuZXcgQWRkUHJvZmlsZU9wZXJhdGlvbihQcm92QWRtaW5VSU1lc3NhZ2VzLkFkZFByb2ZpbGVEaWFsb2dfT3BlcmF0aW9uTGFiZWwsIGFkZGVkUHJvZmlsZUlkLCBwcm9maWxlUHJvcGVydGllcyksIGdldFNoZWxsKCksIFN0YXR1c01hbmFnZXIuU0hPVyB8IFN0YXR1c01hbmFnZXIuTE9HKTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUNvbXBsZXRlKCkgewotCQlpZiAob2tCdXR0b24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdGF0dXMgc3RhdHVzID0gcHJvZmlsZUdyb3VwLnZlcmlmeSgpOwotCQlpZiAoIXN0YXR1cy5pc09LKCkpIHsKLQkJCXRoaXMudXBkYXRlU3RhdHVzKHN0YXR1cyk7Ci0JCQlzZXRPa0VuYWJsZW1lbnQoZmFsc2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChpc0R1cGxpY2F0ZSgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJb2tCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJdGhpcy51cGRhdGVTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQcm92QWRtaW5VSUFjdGl2YXRvci5QTFVHSU5fSUQsIElTdGF0dXMuT0ssICIiLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0R1cGxpY2F0ZSgpIHsKLQkJaWYgKGtub3duUHJvZmlsZUlkcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGtub3duUHJvZmlsZUlkcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGtub3duUHJvZmlsZUlkc1tpXS5lcXVhbHMocHJvZmlsZUdyb3VwLmdldFByb2ZpbGVJZCgpKSkgewotCQkJCXNldE9rRW5hYmxlbWVudChmYWxzZSk7Ci0JCQkJdGhpcy51cGRhdGVTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm92QWRtaW5VSUFjdGl2YXRvci5QTFVHSU5fSUQsIElTdGF0dXMuT0ssIFByb3ZBZG1pblVJTWVzc2FnZXMuQWRkUHJvZmlsZURpYWxvZ19EdXBsaWNhdGVQcm9maWxlSUQsIG51bGwpKTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9uc0VuYWJsZVN0YXRlKElTdGF0dXMgc3RhdHVzKSB7Ci0JCXNldE9rRW5hYmxlbWVudCghc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE9rRW5hYmxlbWVudChib29sZWFuIGVuYWJsZSkgewotCQlpZiAob2tCdXR0b24gIT0gbnVsbCAmJiAhb2tCdXR0b24uaXNEaXNwb3NlZCgpKQotCQkJb2tCdXR0b24uc2V0RW5hYmxlZChlbmFibGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcHJvZmlsZSBpZCB0aGF0IHdhcyBhZGRlZCB3aXRoIHRoaXMgZGlhbG9nLCBvciBudWxsCi0JICogaWYgbm8gcHJvZmlsZSBoYXMgYmVlbiBhZGRlZC4gIFRoaXMgbWV0aG9kIHdpbGwgbm90IHJldHVybgotCSAqIGEgdmFsaWQgcHJvZmlsZSB1bnRpbCB0aGUgdXNlciBoYXMgcHJlc3NlZCBPSyBhbmQgdGhlIHByb2ZpbGUKLQkgKiBoYXMgYmVlbiBhZGRlZCB0byB0aGUgcHJvZmlsZSByZWdpc3RyeS4KLQkgKiBAcmV0dXJuIHRoZSBhZGRlZCBwcm9maWxlJ3MgaWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGVkUHJvZmlsZUlkKCkgewotCQlyZXR1cm4gYWRkZWRQcm9maWxlSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL2RpYWxvZ3MvSVVHcm91cC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL2RpYWxvZ3MvSVVHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWQxMjU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL0lVR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5Qcm92VUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQW4gSVVHcm91cCBpcyBhIHJldXNhYmxlIFVJIGNvbXBvbmVudCB0aGF0IGRpc3BsYXlzIHByb3BlcnRpZXMgb2YgYW4gSVUuIEl0IGNhbiBiZSB1c2VkIGluIAotICogZGlmZmVyZW50IGRpYWxvZ3MgdGhhdCBtYW5pcHVsYXRlIG9yIGRlZmluZSBJVSdzLgotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBJVUdyb3VwIHsKLQotCXByb3RlY3RlZCBPYmplY3QgaXVFbGVtZW50OwotCXByaXZhdGUgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBJVUdyb3VwKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIE9iamVjdCBpdSwgTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhpcy5pdUVsZW1lbnQgPSBpdTsKLQkJY29tcG9zaXRlID0gY3JlYXRlR3JvdXBDb21wb3NpdGUocGFyZW50LCBsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbXBvc2l0ZSBjcmVhdGVHcm91cENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lcik7Ci0KLQlwdWJsaWMgQ29tcG9zaXRlIGdldENvbXBvc2l0ZSgpIHsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdCBnZXRJVSgpIHsKLQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0KSBQcm92VUkuZ2V0QWRhcHRlcihpdUVsZW1lbnQsIElJbnN0YWxsYWJsZVVuaXQuY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZUlVKCkgewotCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vZGlhbG9ncy9JVUltcGxlbWVudGF0aW9uR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL0lVSW1wbGVtZW50YXRpb25Hcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2U0MzFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL0lVSW1wbGVtZW50YXRpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4uUHJvdkFkbWluVUlBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5Qcm92QWRtaW5VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLk1ldGFkYXRhRmFjdG9yeS5JbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5WZXJzaW9uOwotCi0vKioKLSAqIEFuIElVSW1wbGVtZW50YXRpb25Hcm91cCBpcyBhIHJldXNhYmxlIFVJIGNvbXBvbmVudCB0aGF0IGRpc3BsYXlzIGFuZCBlZGl0cyB0aGUgCi0gKiBpbXBsZW1lbnRhdGlvbi1vcmllbnRlZCBwcm9wZXJ0aWVzIG9mIGFuIElVLiBJdCBjYW4gYmUgdXNlZCBpbiAKLSAqIGRpZmZlcmVudCBkaWFsb2dzIHRoYXQgbWFuaXB1bGF0ZSBvciBkZWZpbmUgSVUncy4KLSAqIAotICogQHNpbmNlIDMuNAotICovCi1wdWJsaWMgY2xhc3MgSVVJbXBsZW1lbnRhdGlvbkdyb3VwIGV4dGVuZHMgSVVHcm91cCB7Ci0KLQlwcml2YXRlIFRleHQgaWQ7Ci0JcHJpdmF0ZSBUZXh0IHZlcnNpb247Ci0JcHJpdmF0ZSBUZXh0IG5hbWVzcGFjZTsKLQlwcml2YXRlIFRleHQgdG91Y2hwb2ludFR5cGU7Ci0JcHJpdmF0ZSBMaXN0IHRvdWNocG9pbnREYXRhOwotCXByaXZhdGUgTGlzdCByZXF1aXJlZENhcGFiaWxpdGllczsKLQlwcml2YXRlIExpc3QgcHJvdmlkZWRDYXBhYmlsaXRpZXM7Ci0KLQlwdWJsaWMgSVVJbXBsZW1lbnRhdGlvbkdyb3VwKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIElJbnN0YWxsYWJsZVVuaXQgaXUsIE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN1cGVyKHBhcmVudCwgaXUsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUdyb3VwQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzUwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBHcmlkIGRhdGEgZm9yIHRleHQgY29udHJvbHMKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQotCQkvLyBHcmlkIGRhdGEgZm9yIGNvbnRyb2xzIHNwYW5uaW5nIGJvdGggY29sdW1ucwotCQlHcmlkRGF0YSBnZDIgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QyLmhvcml6b250YWxTcGFuID0gMjsKLQotCQkvLyBHcmlkIGRhdGEgZm9yIGxpc3RzIGdyYWJiaW5nIHZlcnRpY2FsIHNwYWNlCi0JCUdyaWREYXRhIGdkTGlzdCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlHQyBnYyA9IG5ldyBHQyhwYXJlbnQpOwotCQlnYy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCUZvbnRNZXRyaWNzIGZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlnZExpc3QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlnZExpc3QuaGVpZ2h0SGludCA9IERpYWxvZy5jb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCA1KTsKLQotCQlib29sZWFuIGVkaXRhYmxlID0gaXVFbGVtZW50ID09IG51bGwgJiYgbGlzdGVuZXIgIT0gbnVsbDsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChQcm92QWRtaW5VSU1lc3NhZ2VzLklVR3JvdXBfSUQpOwotCQlpZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWlkLnNldExheW91dERhdGEoZ2QpOwotCQlpZiAoZWRpdGFibGUpIHsKLQkJCWlkLmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfSBlbHNlIHsKLQkJCWlkLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJfQotCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3ZBZG1pblVJTWVzc2FnZXMuSVVHcm91cF9WZXJzaW9uKTsKLQkJdmVyc2lvbiA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCXZlcnNpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvdkFkbWluVUlNZXNzYWdlcy5JVUdyb3VwX05hbWVzcGFjZSk7Ci0JCW5hbWVzcGFjZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCW5hbWVzcGFjZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChQcm92QWRtaW5VSU1lc3NhZ2VzLklVR3JvdXBfVG91Y2hwb2ludFR5cGUpOwotCQl0b3VjaHBvaW50VHlwZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQl0b3VjaHBvaW50VHlwZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChQcm92QWRtaW5VSU1lc3NhZ2VzLklVR3JvdXBfVG91Y2hwb2ludERhdGEpOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkMik7Ci0JCXRvdWNocG9pbnREYXRhID0gbmV3IExpc3QoY29tcG9zaXRlLCBTV1QuQk9SREVSIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJdG91Y2hwb2ludERhdGEuc2V0TGF5b3V0RGF0YShnZExpc3QpOwotCQljcmVhdGVDb3B5TWVudSh0b3VjaHBvaW50RGF0YSk7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvdkFkbWluVUlNZXNzYWdlcy5JVUdyb3VwX1JlcXVpcmVkQ2FwYWJpbGl0aWVzKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShnZDIpOwotCQlyZXF1aXJlZENhcGFiaWxpdGllcyA9IG5ldyBMaXN0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5NVUxUSSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCXJlcXVpcmVkQ2FwYWJpbGl0aWVzLnNldExheW91dERhdGEoZ2RMaXN0KTsKLQkJY3JlYXRlQ29weU1lbnUocmVxdWlyZWRDYXBhYmlsaXRpZXMpOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3ZBZG1pblVJTWVzc2FnZXMuSVVHcm91cF9Qcm92aWRlZENhcGFiaWxpdGllcyk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QyKTsKLQkJcHJvdmlkZWRDYXBhYmlsaXRpZXMgPSBuZXcgTGlzdChjb21wb3NpdGUsIFNXVC5CT1JERVIgfCBTV1QuTVVMVEkgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQlwcm92aWRlZENhcGFiaWxpdGllcy5zZXRMYXlvdXREYXRhKGdkTGlzdCk7Ci0JCWNyZWF0ZUNvcHlNZW51KHByb3ZpZGVkQ2FwYWJpbGl0aWVzKTsKLQotCQlpZiAoZWRpdGFibGUpIHsKLQkJCWlkLmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXZlcnNpb24uYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCQkJbmFtZXNwYWNlLmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCXRvdWNocG9pbnRUeXBlLmFkZE1vZGlmeUxpc3RlbmVyKGxpc3RlbmVyKTsKLQkJfSBlbHNlIHsKLQkJCWlkLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCXZlcnNpb24uc2V0RWRpdGFibGUoZmFsc2UpOwotCQkJbmFtZXNwYWNlLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJCXRvdWNocG9pbnRUeXBlLnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJfQotCQlpbml0aWFsaXplRmllbGRzKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGaWVsZHMoKSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSBnZXRJVSgpOwotCQlpZiAoaXUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlkLnNldFRleHQoaXUuZ2V0SWQoKSk7Ci0JCXZlcnNpb24uc2V0VGV4dChpdS5nZXRWZXJzaW9uKCkudG9TdHJpbmcoKSk7Ci0KLQkJU3RyaW5nIHZhbHVlID0gaXUuZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJbmFtZXNwYWNlLnNldFRleHQodmFsdWUpOwotCQl9Ci0JCVRvdWNocG9pbnRUeXBlIHR5cGUgPSBpdS5nZXRUb3VjaHBvaW50VHlwZSgpOwotCQlpZiAodHlwZSAhPSBudWxsKSB7Ci0JCQl0b3VjaHBvaW50VHlwZS5zZXRUZXh0KHR5cGUuZ2V0SWQoKSk7Ci0JCX0KLQkJVG91Y2hwb2ludERhdGFbXSBkYXRhID0gaXUuZ2V0VG91Y2hwb2ludERhdGEoKTsKLQkJU3RyaW5nW10gaXRlbXMgPSBuZXcgU3RyaW5nW2RhdGEubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7Ci0JCQlpdGVtc1tpXSA9IGRhdGFbaV0udG9TdHJpbmcoKTsKLQkJfQotCQl0b3VjaHBvaW50RGF0YS5zZXRJdGVtcyhpdGVtcyk7Ci0KLQkJUmVxdWlyZWRDYXBhYmlsaXR5W10gcmVxID0gaXUuZ2V0UmVxdWlyZWRDYXBhYmlsaXRpZXMoKTsKLQkJaXRlbXMgPSBuZXcgU3RyaW5nW3JlcS5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlcS5sZW5ndGg7IGkrKykgewotCQkJaXRlbXNbaV0gPSByZXFbaV0udG9TdHJpbmcoKTsKLQkJfQotCQlyZXF1aXJlZENhcGFiaWxpdGllcy5zZXRJdGVtcyhpdGVtcyk7Ci0JCVByb3ZpZGVkQ2FwYWJpbGl0eVtdIHByb3YgPSBpdS5nZXRQcm92aWRlZENhcGFiaWxpdGllcygpOwotCQlpdGVtcyA9IG5ldyBTdHJpbmdbcHJvdi5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3YubGVuZ3RoOyBpKyspIHsKLQkJCWl0ZW1zW2ldID0gcHJvdltpXS50b1N0cmluZygpOwotCQl9Ci0JCXByb3ZpZGVkQ2FwYWJpbGl0aWVzLnNldEl0ZW1zKGl0ZW1zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVJVSgpIHsKLQkJLy8gSWYgaXQncyBub3QgYW4gSW5zdGFsbGFibGVVbml0IGl0IGlzIG5vdCBlZGl0YWJsZQotCQlpZiAoaXVFbGVtZW50ID09IG51bGwgfHwgaXVFbGVtZW50IGluc3RhbmNlb2YgSUluc3RhbGxhYmxlVW5pdCkgewotCQkJSW5zdGFsbGFibGVVbml0RGVzY3JpcHRpb24gdW5pdCA9IG5ldyBJbnN0YWxsYWJsZVVuaXREZXNjcmlwdGlvbigpOwotCQkJdW5pdC5zZXRJZChpZC5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCXVuaXQuc2V0VmVyc2lvbihuZXcgVmVyc2lvbih2ZXJzaW9uLmdldFRleHQoKS50cmltKCkpKTsKLQkJCXVuaXQuc2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdC5OQU1FU1BBQ0VfSVVfSUQsIG5hbWVzcGFjZS5nZXRUZXh0KCkudHJpbSgpKTsKLQkJCS8vIFRPRE8gdGhpcyBpcyBib2d1cyBiZWNhdXNlIHdlIGRvbid0IGxldCB1c2VyIHByb3ZpZGUgYSB0b3VjaHBvaW50IHR5cGUgdmVyc2lvbgotCQkJdW5pdC5zZXRUb3VjaHBvaW50VHlwZShNZXRhZGF0YUZhY3RvcnkuY3JlYXRlVG91Y2hwb2ludFR5cGUodG91Y2hwb2ludFR5cGUuZ2V0VGV4dCgpLnRyaW0oKSwgbmV3IFZlcnNpb24oIjEuMC4wIikpKTsgLy8kTk9OLU5MUy0xJAotCQkJaXVFbGVtZW50ID0gTWV0YWRhdGFGYWN0b3J5LmNyZWF0ZUluc3RhbGxhYmxlVW5pdCh1bml0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIHN0YXR1cyBpbmRpY2F0aW5nIHRoZSB2YWxpZGl0eSBvZiB0aGUgcHJvZmlsZSBpbmZvCi0JICogCi0JICogQHJldHVybiBhIHN0YXR1cyBpbmRpY2F0aW5nIHRoZSB2YWxpZGl0eSBvZiB0aGUgcHJvZmlsZSBpbmZvCi0JICovCi0JcHVibGljIElTdGF0dXMgdmVyaWZ5KCkgewotCQlpZiAoaWQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQcm92QWRtaW5VSUFjdGl2YXRvci5QTFVHSU5fSUQsIDAsIFByb3ZBZG1pblVJTWVzc2FnZXMuSVVHcm91cF9JVV9JRF9SZXF1aXJlZCwgbnVsbCk7Ci0JCX0KLQotCQkvLyBUT0RPIHdoYXQga2luZCBvZiB2YWxpZGF0aW9uIGRvIHdlIHBlcmZvcm0gZm9yIG90aGVyIHByb3BlcnRpZXM/Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFByb3ZBZG1pblVJQWN0aXZhdG9yLlBMVUdJTl9JRCwgSVN0YXR1cy5PSywgIiIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29weU1lbnUoZmluYWwgTGlzdCBsaXN0KSB7Ci0JCU1lbnUgY29weU1lbnUgPSBuZXcgTWVudShsaXN0KTsKLQkJTWVudUl0ZW0gY29weUl0ZW0gPSBuZXcgTWVudUl0ZW0oY29weU1lbnUsIFNXVC5OT05FKTsKLQkJY29weUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJLyoKLQkJCSAqIEBzZWUgU2VsZWN0aW9uTGlzdGVuZXIud2lkZ2V0U2VsZWN0ZWQgKFNlbGVjdGlvbkV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJY29weVNlbGVjdGlvbnNUb0NsaXBib2FyZChsaXN0KTsKLQkJCX0KLQotCQkJLyoKLQkJCSAqIEBzZWUgU2VsZWN0aW9uTGlzdGVuZXIud2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWNvcHlTZWxlY3Rpb25zVG9DbGlwYm9hcmQobGlzdCk7Ci0JCQl9Ci0JCX0pOwotCQljb3B5SXRlbS5zZXRUZXh0KEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiY29weSIpKTsgLy8kTk9OLU5MUy0xJAotCQlsaXN0LnNldE1lbnUoY29weU1lbnUpOwotCX0KLQotCXZvaWQgY29weVNlbGVjdGlvbnNUb0NsaXBib2FyZChMaXN0IGxpc3QpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nW10gc2VsZWN0aW9ucyA9IGxpc3QuZ2V0U2VsZWN0aW9uKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZChzZWxlY3Rpb25zW2ldKTsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDbGlwYm9hcmQgY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZChsaXN0LmdldERpc3BsYXkoKSk7Ci0JCWNsaXBib2FyZC5zZXRDb250ZW50cyhuZXcgT2JqZWN0W10ge2J1ZmZlci50b1N0cmluZygpfSwgbmV3IFRyYW5zZmVyW10ge1RleHRUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JCWNsaXBib2FyZC5kaXNwb3NlKCk7Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL0lVSW1wbGVtZW50YXRpb25Qcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL0lVSW1wbGVtZW50YXRpb25Qcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2NzlkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vZGlhbG9ncy9JVUltcGxlbWVudGF0aW9uUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5Qcm92QWRtaW5VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLlByb3ZVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotCi0vKioKLSAqIFByb3BlcnR5UGFnZSB0aGF0IHNob3dzIGFuIElVJ3MgcHJvcGVydGllcwotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLXB1YmxpYyBjbGFzcyBJVUltcGxlbWVudGF0aW9uUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIHsKLQotCXByaXZhdGUgSVVJbXBsZW1lbnRhdGlvbkdyb3VwIGl1R3JvdXA7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgUHJvdlVJLmdldEFkYXB0ZXIoZ2V0RWxlbWVudCgpLCBJSW5zdGFsbGFibGVVbml0LmNsYXNzKTsKLQkJaWYgKGl1ID09IG51bGwpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkRFRkFVTFQpOwotCQkJbGFiZWwuc2V0VGV4dChQcm92QWRtaW5VSU1lc3NhZ2VzLk5vX1Byb3BlcnR5X0l0ZW1fU2VsZWN0ZWQpOwotCQl9Ci0JCWl1R3JvdXAgPSBuZXcgSVVJbXBsZW1lbnRhdGlvbkdyb3VwKHBhcmVudCwgaXUsIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQl2ZXJpZnlDb21wbGV0ZSgpOwotCQkJfQotCQl9KTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChpdUdyb3VwLmdldENvbXBvc2l0ZSgpKTsKLQkJdmVyaWZ5Q29tcGxldGUoKTsKLQkJcmV0dXJuIGl1R3JvdXAuZ2V0Q29tcG9zaXRlKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQl2b2lkIHZlcmlmeUNvbXBsZXRlKCkgewotCQlpZiAoaXVHcm91cCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0YXR1cyBzdGF0dXMgPSBpdUdyb3VwLnZlcmlmeSgpOwotCQlzZXRWYWxpZChzdGF0dXMuaXNPSygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vZGlhbG9ncy9JVVByb2ZpbGVQcm9wZXJ0aWVzR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL0lVUHJvZmlsZVByb3BlcnRpZXNHcm91cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzFmZDM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL0lVUHJvZmlsZVByb3BlcnRpZXNHcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4uZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4uUHJvdkFkbWluVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLlByb3ZVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLm1vZGVsLkluc3RhbGxlZElVRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLm9wZXJhdGlvbnMuUHJvdmlzaW9uaW5nVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnN0YXR1c2hhbmRsZXJzLlN0YXR1c01hbmFnZXI7Ci0KLS8qKgotICogQW4gSVVQcm9wZXJ0aWVzR3JvdXAgaXMgYSByZXVzYWJsZSBVSSBjb21wb25lbnQgdGhhdCBkaXNwbGF5cyBhbmQgZWRpdHMgdGhlIAotICogdXNlci1vcmllbnRlZCBwcm9wZXJ0aWVzIG9mIGFuIElVLiBJdCBjYW4gYmUgdXNlZCBpbiAKLSAqIGRpZmZlcmVudCBkaWFsb2dzIHRoYXQgbWFuaXB1bGF0ZSBvciBkZWZpbmUgSVUncy4KLSAqIAotICogQHNpbmNlIDMuNAotICovCi1wdWJsaWMgY2xhc3MgSVVQcm9maWxlUHJvcGVydGllc0dyb3VwIGV4dGVuZHMgSVVHcm91cCB7Ci0KLQlwcml2YXRlIFRhYmxlIHByb3BlcnRpZXNUYWJsZTsKLQotCXB1YmxpYyBJVVByb2ZpbGVQcm9wZXJ0aWVzR3JvdXAoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgSW5zdGFsbGVkSVVFbGVtZW50IGl1RWxlbWVudCwgTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIocGFyZW50LCBpdUVsZW1lbnQsIGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUdyb3VwQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gNDAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlwcm9wZXJ0aWVzVGFibGUgPSBuZXcgVGFibGUoY29tcG9zaXRlLCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJcHJvcGVydGllc1RhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXByb3BlcnRpZXNUYWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQlUYWJsZUNvbHVtbiBuYW1lQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHByb3BlcnRpZXNUYWJsZSwgU1dULk5PTkUpOwotCQluYW1lQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJbmFtZUNvbHVtbi5zZXRXaWR0aCgyMDApOwotCQlUYWJsZUNvbHVtbiB2YWx1ZUNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihwcm9wZXJ0aWVzVGFibGUsIFNXVC5OT05FKTsKLQkJdmFsdWVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCQl2YWx1ZUNvbHVtbi5zZXRXaWR0aCgyNTApOwotCQlpbml0aWFsaXplRmllbGRzKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGaWVsZHMoKSB7Ci0JCWlmIChpdUVsZW1lbnQgPT0gbnVsbCB8fCAhKGl1RWxlbWVudCBpbnN0YW5jZW9mIEluc3RhbGxlZElVRWxlbWVudCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlTdHJpbmdbXSBwcm9wTmFtZXMgPSBuZXcgU3RyaW5nW10ge0lJbnN0YWxsYWJsZVVuaXQuUFJPUF9QUk9GSUxFX1JPT1RfSVV9OwotCQlTdHJpbmdbXSB1c2VyUHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHtQcm92QWRtaW5VSU1lc3NhZ2VzLlByb2ZpbGVSb290UHJvcGVydHlOYW1lfTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbShwcm9wZXJ0aWVzVGFibGUsIFNXVC5OVUxMKTsKLQkJCUlQcm9maWxlIHByb2ZpbGUgPSBnZXRQcm9maWxlKChJbnN0YWxsZWRJVUVsZW1lbnQpIGl1RWxlbWVudCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSBwcm9maWxlID09IG51bGwgPyBudWxsIDogcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShnZXRJVSgpLCBwcm9wTmFtZXNbaV0pOwotCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7dXNlclByb3BOYW1lc1tpXSwgdmFsdWV9KTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVByb2ZpbGUgZ2V0UHJvZmlsZShJbnN0YWxsZWRJVUVsZW1lbnQgZWxlbWVudCkgewotCQl0cnkgewotCQkJcmV0dXJuIFByb3Zpc2lvbmluZ1V0aWwuZ2V0UHJvZmlsZShlbGVtZW50LmdldFByb2ZpbGVJZCgpKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCVByb3ZVSS5oYW5kbGVFeGNlcHRpb24oZSwgTkxTLmJpbmQoUHJvdkFkbWluVUlNZXNzYWdlcy5JVVByb2ZpbGVQcm9wZXJ0aWVzR3JvdXBfSW52YWxpZFByb2ZpbGVJRCwgZWxlbWVudC5nZXRQcm9maWxlSWQoKSksIFN0YXR1c01hbmFnZXIuTE9HKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL2RpYWxvZ3MvSVVQcm9wZXJ0aWVzR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL0lVUHJvcGVydGllc0dyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhZDExNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL2RpYWxvZ3MvSVVQcm9wZXJ0aWVzR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBHZW51aXRlYywgTExDIC0gYWRkZWQgbGljZW5zZSBzdXBwb3J0Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5Qcm92QWRtaW5VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLQotLyoqCi0gKiBBbiBJVVByb3BlcnRpZXNHcm91cCBpcyBhIHJldXNhYmxlIFVJIGNvbXBvbmVudCB0aGF0IGRpc3BsYXlzIGFuZCBlZGl0cyB0aGUgCi0gKiB1c2VyLW9yaWVudGVkIHByb3BlcnRpZXMgb2YgYW4gSVUuIEl0IGNhbiBiZSB1c2VkIGluIAotICogZGlmZmVyZW50IGRpYWxvZ3MgdGhhdCBtYW5pcHVsYXRlIG9yIGRlZmluZSBJVSdzLgotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLXB1YmxpYyBjbGFzcyBJVVByb3BlcnRpZXNHcm91cCBleHRlbmRzIElVR3JvdXAgewotCi0JcHJpdmF0ZSBUYWJsZSBwcm9wZXJ0aWVzVGFibGU7Ci0KLQlwdWJsaWMgSVVQcm9wZXJ0aWVzR3JvdXAoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgSUluc3RhbGxhYmxlVW5pdCBpdSwgTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIocGFyZW50LCBpdSwgbGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlR3JvdXBDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS53aWR0aEhpbnQgPSA0MDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXByb3BlcnRpZXNUYWJsZSA9IG5ldyBUYWJsZShjb21wb3NpdGUsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQlwcm9wZXJ0aWVzVGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcHJvcGVydGllc1RhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCVRhYmxlQ29sdW1uIG5hbWVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4ocHJvcGVydGllc1RhYmxlLCBTV1QuTk9ORSk7Ci0JCW5hbWVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCQluYW1lQ29sdW1uLnNldFdpZHRoKDIwMCk7Ci0JCVRhYmxlQ29sdW1uIHZhbHVlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHByb3BlcnRpZXNUYWJsZSwgU1dULk5PTkUpOwotCQl2YWx1ZUNvbHVtbi5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCXZhbHVlQ29sdW1uLnNldFdpZHRoKDI1MCk7Ci0JCWluaXRpYWxpemVGaWVsZHMoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZpZWxkcygpIHsKLQkJaWYgKGl1RWxlbWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nW10gcHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHtJSW5zdGFsbGFibGVVbml0LlBST1BfTkFNRSwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX0RFU0NSSVBUSU9OLCBJSW5zdGFsbGFibGVVbml0LlBST1BfUFJPVklERVJ9OwotCQlTdHJpbmdbXSB1c2VyUHJvcE5hbWVzID0gbmV3IFN0cmluZ1tdIHtQcm92QWRtaW5VSU1lc3NhZ2VzLklVUHJvcGVydGllc0dyb3VwX05hbWVQcm9wZXJ0eUxhYmVsLCBQcm92QWRtaW5VSU1lc3NhZ2VzLklVUHJvcGVydGllc0dyb3VwX0Rlc2NyaXB0aW9uUHJvcGVydHlMYWJlbCwgUHJvdkFkbWluVUlNZXNzYWdlcy5JVVByb3BlcnRpZXNHcm91cF9Qcm92aWRlclByb3BlcnR5TGFiZWx9OwotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3BOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHByb3BlcnRpZXNUYWJsZSwgU1dULk5VTEwpOwotCQkJU3RyaW5nIHZhbHVlID0gZ2V0SVUoKS5nZXRQcm9wZXJ0eShwcm9wTmFtZXNbaV0pOwotCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJaXRlbS5zZXRUZXh0KG5ldyBTdHJpbmdbXSB7dXNlclByb3BOYW1lc1tpXSwgdmFsdWV9KTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL0luc3RhbGxlZElVUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vZGlhbG9ncy9JbnN0YWxsZWRJVVByb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWFhMDAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL0luc3RhbGxlZElVUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5Qcm92QWRtaW5VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkubW9kZWwuSW5zdGFsbGVkSVVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci0KLS8qKgotICogUHJvcGVydHlQYWdlIHRoYXQgc2hvd3MgYW4gSVUncyBwcm9wZXJ0aWVzCi0gKiAKLSAqIEBzaW5jZSAzLjQKLSAqLwotcHVibGljIGNsYXNzIEluc3RhbGxlZElVUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIHsKLQotCXByaXZhdGUgSVVQcm9maWxlUHJvcGVydGllc0dyb3VwIGl1R3JvdXA7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCU9iamVjdCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoIShlbGVtZW50IGluc3RhbmNlb2YgSW5zdGFsbGVkSVVFbGVtZW50KSkgewotCQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuREVGQVVMVCk7Ci0JCQlsYWJlbC5zZXRUZXh0KFByb3ZBZG1pblVJTWVzc2FnZXMuSW5zdGFsbGVkSVVQcm9wZXJ0eVBhZ2VfTm9JbmZvQXZhaWxhYmxlKTsKLQkJCXJldHVybiBsYWJlbDsKLQkJfQotCQlpdUdyb3VwID0gbmV3IElVUHJvZmlsZVByb3BlcnRpZXNHcm91cChwYXJlbnQsIChJbnN0YWxsZWRJVUVsZW1lbnQpIGVsZW1lbnQsIG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCQkvLyBub3QgZWRpdGFibGUKLQkJCX0KLQkJfSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoaXVHcm91cC5nZXRDb21wb3NpdGUoKSk7Ci0JCXJldHVybiBpdUdyb3VwLmdldENvbXBvc2l0ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL2RpYWxvZ3MvUHJvZmlsZUdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vZGlhbG9ncy9Qcm9maWxlR3JvdXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY3ZjcyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vZGlhbG9ncy9Qcm9maWxlR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgQW5kcmV3IE92ZXJob2x0IDxvdmVyaG9sdEByZWRoYXQuY29tPiAtIEZpeCBmb3IgQnVnIDE5Nzk3MCAgCi0gKiAgICAgICAgCVtwcm92XSB1bnNldCBQcm9maWxlIG5hbWUgY2F1c2VzIGV4Y2VwdGlvbiBicmluZ2luZyB1cCBwcm9maWxlIHByb3BlcnRpZXMKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLmRpYWxvZ3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5Qcm92QWRtaW5VSUFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLlByb3ZBZG1pblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5Qcm9maWxlRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotCi0vKioKLSAqIEEgUHJvZmlsZUdyb3VwIGlzIGEgcmV1c2FibGUgVUkgY29tcG9uZW50IHRoYXQgZGlzcGxheXMgdGhlCi0gKiBwcm9wZXJ0aWVzIG9mIGEgcHJvZmlsZS4gIEl0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlLgotICogLiBJdCBjYW4gYmUgdXNlZCBpbiBkaWZmZXJlbnQgZGlhbG9ncyB0aGF0IG1hbmlwdWxhdGUKLSAqIG9yIGRlZmluZSBwcm9maWxlcy4KLSAqIAotICogQHNpbmNlIDMuNAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9maWxlR3JvdXAgewotCi0JVGV4dCBpZDsKLQlUZXh0IGxvY2F0aW9uOwotCVRleHQgY2FjaGU7Ci0JVGV4dCBuYW1lOwotCVRleHQgZGVzY3JpcHRpb247Ci0JVGV4dCBmbGF2b3I7Ci0JVGV4dCBlbnZpcm9ubWVudHM7Ci0JVGV4dCBubDsKLQlJUHJvZmlsZSBwcm9maWxlOwotCi0JcHVibGljIFByb2ZpbGVHcm91cChmaW5hbCBDb21wb3NpdGUgcGFyZW50LCBJUHJvZmlsZSBwcm9maWxlLCBNb2RpZnlMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLnByb2ZpbGUgPSBwcm9maWxlOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gMzUwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBHcmlkIGRhdGEgZm9yIG1vc3QgdGV4dCBjb250cm9scwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvdkFkbWluVUlNZXNzYWdlcy5Qcm9maWxlR3JvdXBfSUQpOwotCQlpZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWlkLnNldExheW91dERhdGEoZ2QpOwotCQlzZXRFZGl0YWJsZShpZCwgcHJvZmlsZSA9PSBudWxsLCBsaXN0ZW5lcik7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvdkFkbWluVUlNZXNzYWdlcy5Qcm9maWxlR3JvdXBfSW5zdGFsbEZvbGRlcik7Ci0JCWxvY2F0aW9uID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJbG9jYXRpb24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXNldEVkaXRhYmxlKGxvY2F0aW9uLCBwcm9maWxlID09IG51bGwsIGxpc3RlbmVyKTsKLQotCQlCdXR0b24gbG9jYXRpb25CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlsb2NhdGlvbkJ1dHRvbi5zZXRUZXh0KFByb3ZBZG1pblVJTWVzc2FnZXMuUHJvZmlsZUdyb3VwX0Jyb3dzZSk7Ci0JCWxvY2F0aW9uQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQlEaXJlY3RvcnlEaWFsb2cgZGlhbG9nID0gbmV3IERpcmVjdG9yeURpYWxvZyhwYXJlbnQuZ2V0U2hlbGwoKSwgU1dULkFQUExJQ0FUSU9OX01PREFMKTsKLQkJCQlkaWFsb2cuc2V0TWVzc2FnZShQcm92QWRtaW5VSU1lc3NhZ2VzLlByb2ZpbGVHcm91cF9TZWxlY3RQcm9maWxlTWVzc2FnZSk7Ci0JCQkJU3RyaW5nIGRpciA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKGRpciAhPSBudWxsKSB7Ci0JCQkJCWxvY2F0aW9uLnNldFRleHQoZGlyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlzZXRFZGl0YWJsZShsb2NhdGlvbkJ1dHRvbiwgcHJvZmlsZSA9PSBudWxsLCBsaXN0ZW5lcik7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvdkFkbWluVUlNZXNzYWdlcy5Qcm9maWxlR3JvdXBfQ2FjaGUpOwotCQljYWNoZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWNhY2hlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlzZXRFZGl0YWJsZShjYWNoZSwgcHJvZmlsZSA9PSBudWxsLCBsaXN0ZW5lcik7Ci0KLQkJbG9jYXRpb25CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULlBVU0gpOwotCQlsb2NhdGlvbkJ1dHRvbi5zZXRUZXh0KFByb3ZBZG1pblVJTWVzc2FnZXMuUHJvZmlsZUdyb3VwX0Jyb3dzZTIpOwotCQlsb2NhdGlvbkJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJRGlyZWN0b3J5RGlhbG9nIGRpYWxvZyA9IG5ldyBEaXJlY3RvcnlEaWFsb2cocGFyZW50LmdldFNoZWxsKCksIFNXVC5BUFBMSUNBVElPTl9NT0RBTCk7Ci0JCQkJZGlhbG9nLnNldE1lc3NhZ2UoUHJvdkFkbWluVUlNZXNzYWdlcy5Qcm9maWxlR3JvdXBfU2VsZWN0QnVuZGxlUG9vbENhY2hlKTsKLQkJCQlTdHJpbmcgZGlyID0gZGlhbG9nLm9wZW4oKTsKLQkJCQlpZiAoZGlyICE9IG51bGwpIHsKLQkJCQkJY2FjaGUuc2V0VGV4dChkaXIpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXNldEVkaXRhYmxlKGxvY2F0aW9uQnV0dG9uLCBwcm9maWxlID09IG51bGwsIGxpc3RlbmVyKTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChQcm92QWRtaW5VSU1lc3NhZ2VzLlByb2ZpbGVHcm91cF9OYW1lKTsKLQkJbmFtZSA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCW5hbWUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNldEVkaXRhYmxlKG5hbWUsIHByb2ZpbGUgPT0gbnVsbCwgbGlzdGVuZXIpOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3ZBZG1pblVJTWVzc2FnZXMuUHJvZmlsZUdyb3VwX0Rlc2NyaXB0aW9uKTsKLQkJZGVzY3JpcHRpb24gPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQlkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2V0RWRpdGFibGUoZGVzY3JpcHRpb24sIHByb2ZpbGUgPT0gbnVsbCwgbGlzdGVuZXIpOwotCi0JCWxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KFByb3ZBZG1pblVJTWVzc2FnZXMuUHJvZmlsZUdyb3VwX0ZsYXZvcik7Ci0JCWZsYXZvciA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWZsYXZvci5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2V0RWRpdGFibGUoZmxhdm9yLCBwcm9maWxlID09IG51bGwsIGxpc3RlbmVyKTsKLQotCQlsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChQcm92QWRtaW5VSU1lc3NhZ2VzLlByb2ZpbGVHcm91cF9FbnZpcm9ubWVudHMpOwotCQllbnZpcm9ubWVudHMgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5CT1JERVIpOwotCQllbnZpcm9ubWVudHMuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNldEVkaXRhYmxlKGVudmlyb25tZW50cywgcHJvZmlsZSA9PSBudWxsLCBsaXN0ZW5lcik7Ci0KLQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoUHJvdkFkbWluVUlNZXNzYWdlcy5Qcm9maWxlR3JvdXBfTkwpOwotCQlubCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCW5sLnNldExheW91dERhdGEoZ2QpOwotCQlzZXRFZGl0YWJsZShubCwgcHJvZmlsZSA9PSBudWxsLCBsaXN0ZW5lcik7Ci0KLQkJaW5pdGlhbGl6ZUZpZWxkcygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRmllbGRzKCkgewotCQlpZiAocHJvZmlsZSA9PSBudWxsKSB7Ci0JCQlsb2NhdGlvbi5zZXRUZXh0KFByb2ZpbGVGYWN0b3J5LmdldERlZmF1bHRMb2NhdGlvbigpKTsKLQkJCWVudmlyb25tZW50cy5zZXRUZXh0KFByb2ZpbGVGYWN0b3J5LmdldERlZmF1bHRFbnZpcm9ubWVudHMoKSk7Ci0JCQlubC5zZXRUZXh0KFByb2ZpbGVGYWN0b3J5LmdldERlZmF1bHROTCgpKTsKLQkJCWZsYXZvci5zZXRUZXh0KFByb2ZpbGVGYWN0b3J5LmdldERlZmF1bHRGbGF2b3IoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSBwcm9maWxlLmdldFByb2ZpbGVJZCgpOwotCQkJLy8gU2hvdWxkIG5vdCBoYXBwZW4sIHByb2ZpbGVzIG11c3QgaGF2ZSBhbiBpZCwgYnV0IGp1c3QgaW4gY2FzZS4KLQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCXZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlkLnNldFRleHQodmFsdWUpOwotCi0JCQkvLyBUaGUgcmVtYWluaW5nIHZhbHVlcyBtYXkgYmUgbnVsbAotCQkJdmFsdWUgPSBwcm9maWxlLmdldFByb3BlcnR5KElQcm9maWxlLlBST1BfSU5TVEFMTF9GT0xERVIpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQlsb2NhdGlvbi5zZXRUZXh0KHZhbHVlKTsKLQkJCX0KLQkJCXZhbHVlID0gcHJvZmlsZS5nZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0NBQ0hFKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsKSB7Ci0JCQkJY2FjaGUuc2V0VGV4dCh2YWx1ZSk7Ci0JCQl9Ci0KLQkJCXZhbHVlID0gcHJvZmlsZS5nZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX05BTUUpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQluYW1lLnNldFRleHQodmFsdWUpOwotCQkJfQotCQkJdmFsdWUgPSBwcm9maWxlLmdldFByb3BlcnR5KElQcm9maWxlLlBST1BfREVTQ1JJUFRJT04pOwotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRUZXh0KHZhbHVlKTsKLQkJCX0KLQkJCXZhbHVlID0gcHJvZmlsZS5nZXRQcm9wZXJ0eShJUHJvZmlsZS5QUk9QX0ZMQVZPUik7Ci0JCQlmbGF2b3Iuc2V0VGV4dCh2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiBQcm9maWxlRmFjdG9yeS5nZXREZWZhdWx0Rmxhdm9yKCkpOwotCi0JCQl2YWx1ZSA9IHByb2ZpbGUuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9FTlZJUk9OTUVOVFMpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQllbnZpcm9ubWVudHMuc2V0VGV4dCh2YWx1ZSk7Ci0JCQl9Ci0JCQl2YWx1ZSA9IHByb2ZpbGUuZ2V0UHJvcGVydHkoSVByb2ZpbGUuUFJPUF9OTCk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCW5sLnNldFRleHQodmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIE1hcCBnZXRQcm9maWxlUHJvcGVydGllcygpIHsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkgewotCQkJTWFwIHByb2ZpbGVQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoKTsKLQotCQkJU3RyaW5nIHZhbHVlID0gbG9jYXRpb24uZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlwcm9maWxlUHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9JTlNUQUxMX0ZPTERFUiwgdmFsdWUpOwotCQkJfQotCi0JCQl2YWx1ZSA9IGNhY2hlLmdldFRleHQoKS50cmltKCk7Ci0JCQlpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcHJvZmlsZVByb3BlcnRpZXMucHV0KElQcm9maWxlLlBST1BfQ0FDSEUsIHZhbHVlKTsKLQkJCX0KLQkJCXZhbHVlID0gbmFtZS5nZXRUZXh0KCkudHJpbSgpOwotCQkJaWYgKHZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCXByb2ZpbGVQcm9wZXJ0aWVzLnB1dChJUHJvZmlsZS5QUk9QX05BTUUsIHZhbHVlKTsKLQkJCX0KLQkJCXZhbHVlID0gZGVzY3JpcHRpb24uZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlwcm9maWxlUHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9ERVNDUklQVElPTiwgdmFsdWUpOwotCQkJfQotCQkJdmFsdWUgPSBmbGF2b3IuZ2V0VGV4dCgpLnRyaW0oKTsKLQkJCWlmICh2YWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlwcm9maWxlUHJvcGVydGllcy5wdXQoSVByb2ZpbGUuUFJPUF9GTEFWT1IsIHZhbHVlKTsKLQkJCX0KLQkJCXZhbHVlID0gZW52aXJvbm1lbnRzLmdldFRleHQoKS50cmltKCk7Ci0JCQlpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcHJvZmlsZVByb3BlcnRpZXMucHV0KElQcm9maWxlLlBST1BfRU5WSVJPTk1FTlRTLCB2YWx1ZSk7Ci0JCQl9Ci0JCQl2YWx1ZSA9IG5sLmdldFRleHQoKS50cmltKCk7Ci0JCQlpZiAodmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcHJvZmlsZVByb3BlcnRpZXMucHV0KElQcm9maWxlLlBST1BfTkwsIHZhbHVlKTsKLQkJCX0KLQkJCXJldHVybiBwcm9maWxlUHJvcGVydGllczsKLQkJfQotCQlyZXR1cm4gcHJvZmlsZS5nZXRQcm9wZXJ0aWVzKCk7Ci0JfQotCi0JcHVibGljIENvbXBvc2l0ZSBnZXRDb21wb3NpdGUoKSB7Ci0JCWlmIChpZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gaWQuZ2V0UGFyZW50KCk7Ci0JfQotCi0JcHVibGljIElQcm9maWxlIGdldFByb2ZpbGUoKSB7Ci0JCXJldHVybiBwcm9maWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZUlkKCkgewotCQlpZiAocHJvZmlsZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcHJvZmlsZS5nZXRQcm9maWxlSWQoKTsKLQkJfQotCQlyZXR1cm4gaWQuZ2V0VGV4dCgpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBzdGF0dXMgaW5kaWNhdGluZyB0aGUgdmFsaWRpdHkgb2YgdGhlIHByb2ZpbGUgaW5mbwotCSAqIAotCSAqIEByZXR1cm4gYSBzdGF0dXMgaW5kaWNhdGluZyB0aGUgdmFsaWRpdHkgb2YgdGhlIHByb2ZpbGUgaW5mbwotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHZlcmlmeSgpIHsKLQkJaWYgKGlkLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJvdkFkbWluVUlBY3RpdmF0b3IuUExVR0lOX0lELCAwLCBQcm92QWRtaW5VSU1lc3NhZ2VzLlByb2ZpbGVHcm91cF9Qcm9maWxlSURSZXF1aXJlZCwgbnVsbCk7Ci0JCX0KLQkJaWYgKGxvY2F0aW9uLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUHJvdkFkbWluVUlBY3RpdmF0b3IuUExVR0lOX0lELCAwLCBQcm92QWRtaW5VSU1lc3NhZ2VzLlByb2ZpbGVHcm91cF9Qcm9maWxlSW5zdGFsbEZvbGRlclJlcXVpcmVkLCBudWxsKTsKLQkJfQotCi0JCS8vIFRPRE8gd2hhdCBraW5kIG9mIHZhbGlkYXRpb24gZG8gd2UgcGVyZm9ybSBmb3Igb3RoZXIgcHJvcGVydGllcz8KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUHJvdkFkbWluVUlBY3RpdmF0b3IuUExVR0lOX0lELCBJU3RhdHVzLk9LLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRFZGl0YWJsZShDb250cm9sIGNvbnRyb2wsIGJvb2xlYW4gZWRpdGFibGUsIE1vZGlmeUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dCkgewotCQkJVGV4dCB0ZXh0ID0gKFRleHQpIGNvbnRyb2w7Ci0JCQl0ZXh0LnNldEVkaXRhYmxlKGVkaXRhYmxlKTsKLQkJCWlmIChsaXN0ZW5lciAhPSBudWxsICYmIGVkaXRhYmxlKQotCQkJCXRleHQuYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9IGVsc2UgewotCQkJY29udHJvbC5zZXRFbmFibGVkKGVkaXRhYmxlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL1Byb2ZpbGVQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL1Byb2ZpbGVQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0YTdmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vZGlhbG9ncy9Qcm9maWxlUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5Qcm92QWRtaW5VSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLklQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuUHJvdlVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLQotLyoqCi0gKiBQcm9wZXJ0eVBhZ2UgdGhhdCBzaG93cyBhbiBJVSdzIHByb3BlcnRpZXMKLSAqIAotICogQHNpbmNlIDMuNAotICovCi1wdWJsaWMgY2xhc3MgUHJvZmlsZVByb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0KLQlwcml2YXRlIFByb2ZpbGVHcm91cCBwcm9maWxlR3JvdXA7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIFByb3ZVSS5nZXRBZGFwdGVyKGdldEVsZW1lbnQoKSwgSVByb2ZpbGUuY2xhc3MpOwotCQlpZiAocHJvZmlsZSA9PSBudWxsKSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5ERUZBVUxUKTsKLQkJCWxhYmVsLnNldFRleHQoUHJvdkFkbWluVUlNZXNzYWdlcy5Ob19Qcm9wZXJ0eV9JdGVtX1NlbGVjdGVkKTsKLQkJfQotCQkvLyBBc3N1bWUgdGhhdCB3ZSBkbyBub3QgZWRpdCBwcm9maWxlIHByb3BlcnRpZXMgZm9yIG5vdwotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCi0JCXByb2ZpbGVHcm91cCA9IG5ldyBQcm9maWxlR3JvdXAocGFyZW50LCBwcm9maWxlLCBudWxsKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwcm9maWxlR3JvdXAuZ2V0Q29tcG9zaXRlKCkpOwotCQlyZXR1cm4gcHJvZmlsZUdyb3VwLmdldENvbXBvc2l0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9kaWFsb2dzL1JlcG9zaXRvcnlJbXBsZW1lbnRhdGlvblByb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL2RpYWxvZ3MvUmVwb3NpdG9yeUltcGxlbWVudGF0aW9uUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5NDQ5OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL2RpYWxvZ3MvUmVwb3NpdG9yeUltcGxlbWVudGF0aW9uUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLlByb3ZBZG1pblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5kaWFsb2dzLlJlcG9zaXRvcnlQcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci0KLS8qKgotICogUHJvcGVydHlQYWdlIHRoYXQgc2hvd3MgYSByZXBvc2l0b3J5J3MgcHJvcGVydGllcwotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5SW1wbGVtZW50YXRpb25Qcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBSZXBvc2l0b3J5UHJvcGVydHlQYWdlIHsKLQotCXByaXZhdGUgVGFibGUgcHJvcGVydGllc1RhYmxlOwotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIENvbXBvc2l0ZSkgewotCQkJQ29tcG9zaXRlIGNvbXAgPSAoQ29tcG9zaXRlKSBjb250cm9sOwotCQkJTGFiZWwgcHJvcGVydGllc0xhYmVsID0gbmV3IExhYmVsKGNvbXAsIFNXVC5OT05FKTsKLQkJCXByb3BlcnRpZXNMYWJlbC5zZXRUZXh0KFByb3ZBZG1pblVJTWVzc2FnZXMuUmVwb3NpdG9yeUdyb3VwX1Byb3BlcnRpZXNMYWJlbCk7Ci0JCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCXByb3BlcnRpZXNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCQlwcm9wZXJ0aWVzVGFibGUgPSBuZXcgVGFibGUoY29tcCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJCWRhdGEuZ3JhYkV4Y2Vzc1ZlcnRpY2FsU3BhY2UgPSB0cnVlOwotCQkJcHJvcGVydGllc1RhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQlwcm9wZXJ0aWVzVGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJCVRhYmxlQ29sdW1uIG5hbWVDb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4ocHJvcGVydGllc1RhYmxlLCBTV1QuTk9ORSk7Ci0JCQluYW1lQ29sdW1uLnNldFRleHQoUHJvdkFkbWluVUlNZXNzYWdlcy5SZXBvc2l0b3J5R3JvdXBfTmFtZUNvbHVtbkxhYmVsKTsKLQkJCVRhYmxlQ29sdW1uIHZhbHVlQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHByb3BlcnRpZXNUYWJsZSwgU1dULk5PTkUpOwotCQkJdmFsdWVDb2x1bW4uc2V0VGV4dChQcm92QWRtaW5VSU1lc3NhZ2VzLlJlcG9zaXRvcnlHcm91cF9WYWx1ZUNvbHVtbkxhYmVsKTsKLQotCQkJaW5pdGlhbGl6ZVRhYmxlKCk7Ci0KLQkJCW5hbWVDb2x1bW4ucGFjaygpOwotCQkJdmFsdWVDb2x1bW4ucGFjaygpOwotCQl9Ci0JCXJldHVybiBjb250cm9sOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVUYWJsZSgpIHsKLQkJaWYgKGdldFJlcG9zaXRvcnlFbGVtZW50KCkgIT0gbnVsbCkgewotCQkJTWFwIHJlcG9Qcm9wZXJ0aWVzID0gZ2V0UmVwb3NpdG9yeUVsZW1lbnQoKS5nZXRSZXBvc2l0b3J5KG51bGwpLmdldFByb3BlcnRpZXMoKTsKLQkJCWlmIChyZXBvUHJvcGVydGllcyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gcHJvcE5hbWVzID0gKFN0cmluZ1tdKSByZXBvUHJvcGVydGllcy5rZXlTZXQoKS50b0FycmF5KG5ldyBTdHJpbmdbcmVwb1Byb3BlcnRpZXMuc2l6ZSgpXSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHByb3BlcnRpZXNUYWJsZSwgU1dULk5VTEwpOwotCQkJCQlpdGVtLnNldFRleHQobmV3IFN0cmluZ1tdIHtwcm9wTmFtZXNbaV0sIHJlcG9Qcm9wZXJ0aWVzLmdldChwcm9wTmFtZXNbaV0pLnRvU3RyaW5nKCl9KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0OTcxZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLVByb3ZBZG1pblF1ZXJ5UHJvdmlkZXJfVXBkYXRlUXVlcnlFcnJvcj1VbmV4cGVjdGVkIGVycm9yIHdoaWxlIGxvb2tpbmcgZm9yIHVwZGF0ZXMKLVByb3ZBZG1pblVJQWN0aXZhdG9yX0NvbnRpbnVlQW55d2F5PUNvbnRpbnVlCi1Qcm92QWRtaW5VSUFjdGl2YXRvcl9MYXVuY2hVcGRhdGVNYW5hZ2VyPUxhdW5jaCBVTS4uLgotUHJvdkFkbWluVUlBY3RpdmF0b3JfVW5zdXBwb3J0ZWRJbnN0YWxsSGFuZGxlcj1VbnN1cHBvcnRlZCBJbnN0YWxsIEhhbmRsZXIKLVByb3ZBZG1pblVJQWN0aXZhdG9yX1Vuc3VwcG9ydGVkSW5zdGFsbEhhbmRsZXJNZXNzYWdlPVRoZSBmZWF0dXJlIHlvdSBhcmUgdHJ5aW5nIHRvIGluc3RhbGwgaGFzIGRlZmluZWQgYW4gVXBkYXRlIE1hbmFnZXIgaW5zdGFsbCBoYW5kbGVyLiAgWW91IG1heSBsYXVuY2ggdGhlIG9sZCBVcGRhdGUgTWFuYWdlciBpbiBvcmRlciB0byBnZXQgdGhlIGluc3RhbGwgaGFuZGxlciBzdXBwb3J0LCBvciBjb250aW51ZSB0aGUgaW5zdGFsbCBhbmQgaWdub3JlIHRoZSBpbnN0YWxsIGhhbmRsZXIuCi1Qcm92aXNpb25pbmdQcmVmUGFnZV9TaG93R3JvdXBzT25seT1TaG93IG9ubHkgJmdyb3VwIElVJ3MgaW4gcHJvZmlsZSBvciByZXBvc2l0b3J5IHZpZXdzCi1Qcm92aXNpb25pbmdQcmVmUGFnZV9TaG93SW5zdGFsbFJvb3RzT25seT1TaG93IG9ubHkgdGhlIGluc3RhbGwgJnJvb3RzIGluIGEgcHJvZmlsZQotUHJvdmlzaW9uaW5nUHJlZlBhZ2VfSGlkZVN5c3RlbVJlcG9zPUhpZGUgJnN5c3RlbSByZXBvc2l0b3JpZXMgaW4gcmVwb3NpdG9yeSB2aWV3cwotUHJvdmlzaW9uaW5nUHJlZlBhZ2VfQ29sbGFwc2VJVVZlcnNpb25zPUNvbGxhcHNlIG11bHRpcGxlIElVICZ2ZXJzaW9ucyB1bmRlcm5lYXRoIGxhdGVzdCB2ZXJzaW9uCi1Qcm92aXNpb25pbmdQcmVmUGFnZV9Vc2VDYXRlZ29yaWVzPVNob3cgSVVzIGJ5ICZjYXRlZ29yeSBpbiByZXBvc2l0b3J5IHZpZXdzCi1JbnN0YWxsZWRJVVByb3BlcnR5UGFnZV9Ob0luZm9BdmFpbGFibGU9Tm8gcHJvZmlsZS1zcGVjaWZpYyBwcm9wZXJ0aWVzIGFyZSBhdmFpbGFibGUuCi1BZGRQcm9maWxlRGlhbG9nX1RpdGxlPUFkZCBQcm9maWxlCi1BZGRQcm9maWxlRGlhbG9nX09wZXJhdGlvbkxhYmVsPUFkZCBQcm9maWxlCi1BZGRNZXRhZGF0YVJlcG9zaXRvcnlEaWFsb2dfT3BlcmF0aW9uTGFiZWw9QWRkIE1ldGFkYXRhIFJlcG9zaXRvcnkKLUFkZEFydGlmYWN0UmVwb3NpdG9yeURpYWxvZ19EdXBsaWNhdGVVUkw9RHVwbGljYXRlIFVSTAotQWRkQXJ0aWZhY3RSZXBvc2l0b3J5RGlhbG9nX09wZXJhdGlvbkxhYmVsPUFkZCBBcnRpZmFjdCBSZXBvc2l0b3J5Ci1NZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXdfQWRkUmVwb3NpdG9yeUxhYmVsPUFkZCByZXBvc2l0b3J5Li4uCi1NZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXdfQWRkUmVwb3NpdG9yeVRvb2x0aXA9QWRkIGEgbmV3IG1ldGFkYXRhIHJlcG9zaXRvcnkKLVJlcG9zaXRvcmllc1ZpZXdfUmVtb3ZlQ29tbWFuZExhYmVsPVJlbW92ZQotTWV0YWRhdGFSZXBvc2l0b3JpZXNWaWV3X1JlbW92ZVJlcG9zaXRvcnlUb29sdGlwPVJlbW92ZSB0aGUgc2VsZWN0ZWQgbWV0YWRhdGEgcmVwb3NpdG9yaWVzCi1NZXRhZGF0YVJlcG9zaXRvcmllc1ZpZXdfQ2hvb3NlUHJvZmlsZURpYWxvZ1RpdGxlPUNob29zZSBQcm9maWxlCi1BcnRpZmFjdFJlcG9zaXRvcmllc1ZpZXdfUmVtb3ZlUmVwb3NpdG9yeU9wZXJhdGlvbkxhYmVsPVJlbW92ZSBBcnRpZmFjdCBSZXBvc2l0b3JpZXMKLUFydGlmYWN0UmVwb3NpdG9yaWVzVmlld19BZGRSZXBvc2l0b3J5TGFiZWw9QWRkIHJlcG9zaXRvcnkuLi4KLUFydGlmYWN0UmVwb3NpdG9yaWVzVmlld19BZGRSZXBvc2l0b3J5VG9vbHRpcD1BZGQgYSBuZXcgYXJ0aWZhY3QgcmVwb3NpdG9yeQotQXJ0aWZhY3RSZXBvc2l0b3JpZXNWaWV3X1JlbW92ZVJlcG9zaXRvcnlUb29sdGlwPVJlbW92ZSB0aGUgc2VsZWN0ZWQgYXJ0aWZhY3QgcmVwb3NpdG9yaWVzCi1Qcm9maWxlc1ZpZXdfRXJyb3JSZXRyaWV2aW5nUHJvZmlsZXM9RXJyb3IgcmV0cmlldmluZyBwcm9maWxlcwotUHJvZmlsZXNWaWV3X0FkZFByb2ZpbGVUb29sdGlwPUFkZCBhIG5ldyBwcm9maWxlCi1Qcm92Vmlld19SZWZyZXNoQ29tbWFuZFRvb2x0aXA9UmVmcmVzaCB0aGUgaXRlbXMgaW4gdGhlIHZpZXcuCi1Qcm9maWxlc1ZpZXdfQWRkUHJvZmlsZUxhYmVsPUFkZCBwcm9maWxlLi4uCi1Qcm92Vmlld19SZWZyZXNoQ29tbWFuZExhYmVsPVJlZnJlc2gKLVByb2ZpbGVzVmlld19SZW1vdmVQcm9maWxlTGFiZWw9UmVtb3ZlCi1Qcm9maWxlc1ZpZXdfUmVtb3ZlUHJvZmlsZVRvb2x0aXA9UmVtb3ZlIHRoZSBzZWxlY3RlZCBwcm9maWxlcwotQWRkUHJvZmlsZURpYWxvZ19EdXBsaWNhdGVQcm9maWxlSUQ9VGhlIHByb2ZpbGUgSUQgaXMgYWxyZWFkeSBpbiB1c2UuCi1PcHNfUmVtb3ZlUHJvZmlsZU9wZXJhdGlvbkxhYmVsPVJlbW92ZSBQcm9maWxlcwotUHJvZmlsZVJvb3RQcm9wZXJ0eU5hbWU9UHJvZmlsZSBSb290Ci1SZXBvc2l0b3J5R3JvdXBfUHJvcGVydGllc0xhYmVsPVJlcG9zaXRvcnkgcHJvcGVydGllczoKLVJlcG9zaXRvcnlHcm91cF9OYW1lQ29sdW1uTGFiZWw9TmFtZQotUmVwb3NpdG9yeUdyb3VwX1ZhbHVlQ29sdW1uTGFiZWw9VmFsdWUKLUlVR3JvdXBfSUQ9SVUgJmlkOgotSVVHcm91cF9WZXJzaW9uPSZWZXJzaW9uOgotTm9fUHJvcGVydHlfSXRlbV9TZWxlY3RlZD1UaGVyZSBpcyBub3RoaW5nIHRvIHNob3cgaW4gdGhlIHByb3BlcnRpZXMKLUlVR3JvdXBfTmFtZXNwYWNlPSZOYW1lc3BhY2U6Ci1JVUdyb3VwX1RvdWNocG9pbnRUeXBlPSZUb3VjaHBvaW50IHR5cGU6Ci1JVUdyb3VwX1RvdWNocG9pbnREYXRhPVRvdWNocG9pbnQgJmRhdGE6Ci1JVUdyb3VwX1JlcXVpcmVkQ2FwYWJpbGl0aWVzPSZSZXF1aXJlZCBjYXBhYmlsaXRpZXM6Ci1JVUdyb3VwX1Byb3ZpZGVkQ2FwYWJpbGl0aWVzPSZQcm92aWRlZCBjYXBhYmlsaXRpZXM6Ci1JVUdyb3VwX0lVX0lEX1JlcXVpcmVkPU11c3Qgc2V0IGFuIElVIElECi1JVVByb2ZpbGVQcm9wZXJ0aWVzR3JvdXBfSW52YWxpZFByb2ZpbGVJRD1Qcm9maWxlIGlkIHswfSBub3QgdmFsaWQuCi1JVVByb3BlcnRpZXNHcm91cF9EZXNjcmlwdGlvblByb3BlcnR5TGFiZWw9RGVzY3JpcHRpb24KLUlVUHJvcGVydGllc0dyb3VwX05hbWVQcm9wZXJ0eUxhYmVsPU5hbWUKLUlVUHJvcGVydGllc0dyb3VwX1Byb3ZpZGVyUHJvcGVydHlMYWJlbD1Qcm92aWRlcgotUHJvZmlsZUdyb3VwX0lEPVByb2ZpbGUgJmlkOgotUHJvZmlsZUdyb3VwX0Jyb3dzZT0mQnJvd3NlLi4uCi1Qcm9maWxlR3JvdXBfQnJvd3NlMj1CJnJvd3NlLi4uCi1Qcm9maWxlR3JvdXBfU2VsZWN0UHJvZmlsZU1lc3NhZ2U9U2VsZWN0IGFuIGluc3RhbGxhdGlvbiBkaXJlY3Rvcnk6Ci1Qcm9maWxlR3JvdXBfU2VsZWN0QnVuZGxlUG9vbENhY2hlPVNlbGVjdCBhIGJ1bmRsZSBwb29sIGRpcmVjdG9yeToKLVByb2ZpbGVHcm91cF9OYW1lPSZOYW1lOgotUHJvZmlsZUdyb3VwX0Rlc2NyaXB0aW9uPSZEZXNjcmlwdGlvbjoKLVByb2ZpbGVHcm91cF9GbGF2b3I9JkZsYXZvcjoKLVByb2ZpbGVHcm91cF9OTD1OJkw6Ci1Qcm9maWxlR3JvdXBfQ2FjaGU9QnVuZGxlICZwb29sIGxvY2F0aW9uOgotUHJvZmlsZUdyb3VwX0luc3RhbGxGb2xkZXI9SW5zdGFsbCBmJm9sZGVyOgotUHJvZmlsZUdyb3VwX0Vudmlyb25tZW50cz0mRW52aXJvbm1lbnRzOgotUHJvZmlsZUdyb3VwX1Byb2ZpbGVJRFJlcXVpcmVkPU11c3Qgc3BlY2lmeSBhIFByb2ZpbGUgSUQKLVByb2ZpbGVHcm91cF9Qcm9maWxlSW5zdGFsbEZvbGRlclJlcXVpcmVkPU11c3Qgc3BlY2lmeSBhbiBpbnN0YWxsIGZvbGRlcgotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcHJlZmVyZW5jZXMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjE2ODAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbi9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9hZG1pbi9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDb25zdGFudCBkZWZpbml0aW9ucyBmb3IgcGx1Zy1pbiBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUNvbnN0YW50cyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NIT1dfR1JPVVBTX09OTFkgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5hZG1pbi5zaG93R3JvdXBzT25seSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX0hJREVfU1lTVEVNX1JFUE9TID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuYWRtaW4uaGlkZVN5c3RlbVJlcG9zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfQ09MTEFQU0VfSVVfVkVSU0lPTlMgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5hZG1pbi5jb2xsYXBzZUlVVmVyc2lvbnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9VU0VfQ0FURUdPUklFUyA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLmFkbWluLnVzZUNhdGVnb3JpZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9TSE9XX0lOU1RBTExfUk9PVFNfT05MWSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLmFkbWluLnNob3dJbnN0YWxsUm9vdHMiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcHJlZmVyZW5jZXMvUHJvdlVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcHJlZmVyZW5jZXMvUHJvdlVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNmYwMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL3ByZWZlcmVuY2VzL1Byb3ZVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuYWRtaW4ucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5Qcm92QWRtaW5VSUFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogSW5pdGlhbGl6ZXMgdGhlIHByZWZlcmVuY2VzIGZvciB0aGUgcHJvdmlzaW9uaW5nIFVJLgotICogQHNpbmNlIDMuNAotICoKLSAqLwotcHVibGljIGNsYXNzIFByb3ZVSVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBQcm92QWRtaW5VSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1NIT1dfR1JPVVBTX09OTFksIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9TSE9XX0lOU1RBTExfUk9PVFNfT05MWSwgdHJ1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0hJREVfU1lTVEVNX1JFUE9TLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQ09MTEFQU0VfSVVfVkVSU0lPTlMsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9VU0VfQ0FURUdPUklFUywgZmFsc2UpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL2FkbWluL3ByZWZlcmVuY2VzL1Byb3Zpc2lvbmluZ1ByZWZQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcHJlZmVyZW5jZXMvUHJvdmlzaW9uaW5nUHJlZlBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RlNmUzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4vc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvYWRtaW4vcHJlZmVyZW5jZXMvUHJvdmlzaW9uaW5nUHJlZlBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5hZG1pbi5Qcm92QWRtaW5VSUFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLmFkbWluLlByb3ZBZG1pblVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5Cb29sZWFuRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgcHJvdmlzaW9uaW5nIHByZWZlcmVuY2VzLgotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLQotcHVibGljIGNsYXNzIFByb3Zpc2lvbmluZ1ByZWZQYWdlIGV4dGVuZHMgRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwdWJsaWMgUHJvdmlzaW9uaW5nUHJlZlBhZ2UoKSB7Ci0JCXN1cGVyKEdSSUQpOwotCQlzZXRQcmVmZXJlbmNlU3RvcmUoUHJvdkFkbWluVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZSNjcmVhdGVGaWVsZEVkaXRvcnMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKLQkJYWRkRmllbGQobmV3IEJvb2xlYW5GaWVsZEVkaXRvcihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0hPV19HUk9VUFNfT05MWSwgUHJvdkFkbWluVUlNZXNzYWdlcy5Qcm92aXNpb25pbmdQcmVmUGFnZV9TaG93R3JvdXBzT25seSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkpOwotCQlhZGRGaWVsZChuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9TSE9XX0lOU1RBTExfUk9PVFNfT05MWSwgUHJvdkFkbWluVUlNZXNzYWdlcy5Qcm92aXNpb25pbmdQcmVmUGFnZV9TaG93SW5zdGFsbFJvb3RzT25seSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSkpOwotCQlhZGRGaWVsZChuZXcgQm9vbGVhbkZpZWxkRWRpdG9yKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ISURFX1NZU1RFTV9SRVBPUywgUHJvdkFkbWluVUlNZXNzYWdlcy5Qcm92aXNpb25pbmdQcmVmUGFnZV9IaWRlU3lzdGVtUmVwb3MsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLQkJYWRkRmllbGQobmV3IEJvb2xlYW5GaWVsZEVkaXRvcihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQ09MTEFQU0VfSVVfVkVSU0lPTlMsIFByb3ZBZG1pblVJTWVzc2FnZXMuUHJvdmlzaW9uaW5nUHJlZlBhZ2VfQ29sbGFwc2VJVVZlcnNpb25zLCBnZXRGaWVsZEVkaXRvclBhcmVudCgpKSk7Ci0JCWFkZEZpZWxkKG5ldyBCb29sZWFuRmllbGRFZGl0b3IoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1VTRV9DQVRFR09SSUVTLCBQcm92QWRtaW5VSU1lc3NhZ2VzLlByb3Zpc2lvbmluZ1ByZWZQYWdlX1VzZUNhdGVnb3JpZXMsIGdldEZpZWxkRWRpdG9yUGFyZW50KCkpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzM5MzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxZTA3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGs8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2NTBjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0jVHVlIFNlcCAxOCAyMToyNTo0OSBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1hYm9ydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9lbnVtX2NvbnN0YW50PTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZXhwbGljaXRfY29uc3RydWN0b3JfY2FsbD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fcXVhbGlmaWVkX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXNzaWdubWVudD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29tcGFjdF9pZj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfY29uZGl0aW9uYWxfZXhwcmVzc2lvbj04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZW51bV9jb25zdGFudHM9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcz0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3NlbGVjdG9yX2luX21ldGhvZF9pbnZvY2F0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9wYWNrYWdlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmllbGQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21lbWJlcl90eXBlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWV0aG9kPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbmV3X2NodW5rPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfcGFja2FnZT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2U9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9jb25zdGFudD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9zd2l0Y2g9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5fYmxvY2tfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9oZWFkZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2xpbmVfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTE2MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1N1biBTZXAgMjMgMTE6NTk6MzEgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9ZmFsc2UKLXNwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5NTRkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJWJ1bmRsZU5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGs7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay5Qcm92U0RLVUlBY3RpdmF0b3IKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuYWN0aW9ucywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLmRpYWxvZ3MsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5tb2RlbCwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLm9wZXJhdGlvbnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5wb2xpY3ksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5xdWVyeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnZpZXdlcnMsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51cGRhdGVjaGVja2VyLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlcjt2ZXJzaW9uPSIxLjEuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS51dGlsO3ZlcnNpb249IjEuMS4wIiwKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiLAotIG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluO3ZlcnNpb249IjEuMi4wIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGsucHJlZnM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay51cGRhdGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5zZGs7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UucGRlLnAyLnVpIgotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZQotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNCwKLSBDREMtMS4xL0ZvdW5kYXRpb24tMS4xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQwZjk1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNjUwZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMKLSMgUHJvdmlzaW9uaW5nIFVJIHBsdWdpbiByZXNvdXJjZXMKLSMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotYnVuZGxlTmFtZT1FcXVpbm94IFByb3Zpc2lvbmluZyBQbGF0Zm9ybSBVcGRhdGUgU3VwcG9ydAotSVUuZ2VuZXJhbD1HZW5lcmFsIEluZm9ybWF0aW9uCi1JVS5saWNlbnNlPUxpY2Vuc2UgQWdyZWVtZW50Ci1JVS5jb3B5cmlnaHQ9Q29weXJpZ2h0Ci1SZXBvc2l0b3J5Lm5hbWU9R2VuZXJhbCBJbmZvcm1hdGlvbgotVXBkYXRlLmNvbW1hbmQ9U29mdHdhcmUgVXBkYXRlcy4uLgotVXBkYXRlLmNvbW1hbmQubW5lbW9uaWM9UwotcHJvdmlzaW9uaW5nUHJlZlBhZ2UgPSBJbnN0YWxsL1VwZGF0ZQotYXV0b21hdGljVXBkYXRlc1ByZWZQYWdlID0gQXV0b21hdGljIFVwZGF0ZXMKLWV4dGVybmFsRmlsZXNQcmVmUGFnZSA9IFVwZGF0aW5nIGZyb20gdGhlIEZpbGUgU3lzdGVtCi1wcmVmZXJlbmNlS2V5d29yZHMuZ2VuZXJhbD1hdXRvbWF0aWMgdXBkYXRlIHNjaGVkdWxlIGRvd25sb2FkIHNvZnR3YXJlIGluc3RhbGwgaW1wb3J0IGJ1bmRsZQotcHJlZmVyZW5jZXM9VXBkYXRlIGFuZCBJbnN0YWxsIFByZWZlcmVuY2VzCi1jbGFzc2ljQ2F0ZWdvcnlOYW1lPUNsYXNzaWMgVXBkYXRlCi1jbGFzc2ljQ2F0ZWdvcnlEZXNjPUVuYWJsZXMgY2xhc3NpYyB1cGRhdGUgZnVuY3Rpb25hbGl0eQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlYjljMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjIiPz4KLTxwbHVnaW4+Ci0gICAJPGV4dGVuc2lvbiAKLSAgIAkJaWQ9InByZWZlcmVuY2VzIiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIiBuYW1lPSIlcHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLnByZWZzLlByZWZlcmVuY2VJbml0aWFsaXplciIvPgotCTwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnN0YXJ0dXAiPgotICAgICAgPHN0YXJ0dXAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLkF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlciI+Ci0gICAgICA8L3N0YXJ0dXA+Ci0gICA8L2V4dGVuc2lvbj4KLSA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJvcGVydHlQYWdlcyI+Ci0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJUlVLmNvcHlyaWdodCIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLmRpYWxvZ3MuSVVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsuSVVDb3B5cmlnaHRQcm9wZXJ0eVBhZ2UiPgotICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQiPgotICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgIDwvcGFnZT4KLSAgICAgICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVJVS5nZW5lcmFsIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuZGlhbG9ncy5JVUdlbmVyYWxJbmZvUHJvcGVydHlQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLklVR2VuZXJhbEluZm9Qcm9wZXJ0eVBhZ2UiPgotICAgICAgICAgICAgPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgPGFkYXB0Ci0gICAgICAgICAgICAgICAgICB0eXBlPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklJbnN0YWxsYWJsZVVuaXQiPgotICAgICAgICAgICAgIDwvYWRhcHQ+Ci0gICAgICAgICAgPC9lbmFibGVkV2hlbj4KLSAgICAgIDwvcGFnZT4KLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlSVUubGljZW5zZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLmRpYWxvZ3MuSVVMaWNlbnNlUHJvcGVydHlQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLklVTGljZW5zZVByb3BlcnR5UGFnZSI+Ci0gICAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuSUluc3RhbGxhYmxlVW5pdCI+Ci0gICAgICAgICAgICAgPC9hZGFwdD4KLSAgICAgICAgICA8L2VuYWJsZWRXaGVuPgotICAgICAgPC9wYWdlPgotIAotICAgICAgPHBhZ2UKLSAgICAgICAgICAgIG5hbWU9IiVSZXBvc2l0b3J5Lm5hbWUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5kaWFsb2dzLlJlcG9zaXRvcnlQcm9wZXJ0eVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGsuUmVwb3NpdG9yeVByb3BlcnR5UGFnZSI+Ci0gICAgICAgICAgICA8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICA8YWRhcHQKLSAgICAgICAgICAgICAgICAgIHR5cGU9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkubW9kZWwuSVJlcG9zaXRvcnlFbGVtZW50Ij4KLSAgICAgICAgICAgICA8L2FkYXB0PgotICAgICAgICAgIDwvZW5hYmxlZFdoZW4+Ci0gICAgICA8L3BhZ2U+Ci0gICAgICAKLSAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotICAgICAgICAgICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJXByb3Zpc2lvbmluZ1ByZWZQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLnByZWZzLlByb3Zpc2lvbmluZ1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLlByb3Zpc2lvbmluZ1ByZWZlcmVuY2VQYWdlIj4KLSAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay51cGRhdGVzLmdlbmVyYWwiLz4KLSAgICAgIDwvcGFnZT4KLSAKLSAgICAgIDxwYWdlCi0gICAgICAgICAgICBuYW1lPSIlYXV0b21hdGljVXBkYXRlc1ByZWZQYWdlIgotICAgICAgICAgICAgY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLlByb3Zpc2lvbmluZ1ByZWZlcmVuY2VQYWdlIgotICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLnByZWZzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay5BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UiPgotICAgICAgICAgICAgPGtleXdvcmRSZWZlcmVuY2UgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLnVwZGF0ZXMuZ2VuZXJhbCIvPgotICAgICAgPC9wYWdlPgotICAgICAgCi0gICAgICA8cGFnZQotICAgICAgICAgICAgbmFtZT0iJWV4dGVybmFsRmlsZXNQcmVmUGFnZSIKLSAgICAgICAgICAgIGNhdGVnb3J5PSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay5Qcm92aXNpb25pbmdQcmVmZXJlbmNlUGFnZSIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay5wcmVmcy5FeHRlcm5hbEZpbGVzUHJlZmVyZW5jZVBhZ2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGsuRXh0ZXJuYWxGaWxlc1ByZWZlcmVuY2VQYWdlIj4KLSAgICAgICAgICAgIDxrZXl3b3JkUmVmZXJlbmNlIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay51cGRhdGVzLmdlbmVyYWwiLz4KLSAgICAgIDwvcGFnZT4KLSAgIDwvZXh0ZW5zaW9uPgotCi0gICAgICA8ZXh0ZW5zaW9uCi0gICAJCXBvaW50PSJvcmcuZWNsaXBzZS51aS5rZXl3b3JkcyI+Ci0gICAgICA8a2V5d29yZAotICAgICAgICAgICAgbGFiZWw9IiVwcmVmZXJlbmNlS2V5d29yZHMuZ2VuZXJhbCIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay51cGRhdGVzLmdlbmVyYWwiLz4KLSAgICAgIDwvZXh0ZW5zaW9uPgotICAgICAgCi0gICAgICAKLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0gICAgICA8Y29tbWFuZAotICAgICAgICAgICAgbmFtZT0iJVVwZGF0ZS5jb21tYW5kIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLnVwZGF0ZSI+Ci0gICAgICA8L2NvbW1hbmQ+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5oYW5kbGVycyI+Ci0gICAgICA8aGFuZGxlcgotICAgICAgICAgICAgY29tbWFuZElkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay51cGRhdGUiCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGsuVXBkYXRlSGFuZGxlciI+Ci0gICAgICA8L2hhbmRsZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5tZW51cyI+Ci0gICAgICA8bWVudUNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgbG9jYXRpb25VUkk9Im1lbnU6aGVscD9hZnRlcj1hZGRpdGlvbnMiPgotICAgICAgICAgICAgPGNvbW1hbmQKLSAgICAgICAgICAgICAgICAgIGNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsudXBkYXRlIgotICAgICAgICAgICAgCSAgbW5lbW9uaWM9IiVVcGRhdGUuY29tbWFuZC5tbmVtb25pYyIKLSAgICAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay51cGRhdGUiPgotICAgICAgICAgICAgPC9jb21tYW5kPgotICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICA8L21lbnVDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24KLSAgICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpdml0aWVzIj4KLSAgICAgIDxhY3Rpdml0eQotICAgICAgICAgICAgZGVzY3JpcHRpb249IiVjbGFzc2ljQ2F0ZWdvcnlEZXNjIgotICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLmNsYXNzaWNVcGRhdGUiCi0gICAgICAgICAgICBuYW1lPSIlY2xhc3NpY0NhdGVnb3J5TmFtZSI+Ci0gICAgICA8L2FjdGl2aXR5PgotICAgICAgPGFjdGl2aXR5UGF0dGVybkJpbmRpbmcKLSAgICAgICAgICAgIGFjdGl2aXR5SWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLmNsYXNzaWNVcGRhdGUiCi0gICAgICAgICAgICBpc0VxdWFsaXR5UGF0dGVybj0iZmFsc2UiCi0gICAgICAgICAgICBwYXR0ZXJuPSIuKm9yZ1wuZWNsaXBzZVwudXBkYXRlXC5pbnRlcm5hbC4qIj4KLSAgICAgIDwvYWN0aXZpdHlQYXR0ZXJuQmluZGluZz4KLSAgICAgIDxhY3Rpdml0eVBhdHRlcm5CaW5kaW5nCi0gICAgICAgICAgICBhY3Rpdml0eUlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay5jbGFzc2ljVXBkYXRlIgotICAgICAgICAgICAgaXNFcXVhbGl0eVBhdHRlcm49ImZhbHNlIgotICAgICAgICAgICAgcGF0dGVybj0iLipvcmdcLmVjbGlwc2VcLnVpXC51cGRhdGUuKiI+Ci0gICAgICA8L2FjdGl2aXR5UGF0dGVybkJpbmRpbmc+Ci0gICAgICA8Y2F0ZWdvcnkKLSAgICAgICAgICAgIGRlc2NyaXB0aW9uPSIlY2xhc3NpY0NhdGVnb3J5RGVzYyIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay5jYXRlZ29yeS5jbGFzc2ljVXBkYXRlIgotICAgICAgICAgICAgbmFtZT0iJWNsYXNzaWNDYXRlZ29yeU5hbWUiPgotICAgICAgPC9jYXRlZ29yeT4KLSAgICAgIDxjYXRlZ29yeUFjdGl2aXR5QmluZGluZwotICAgICAgICAgICAgYWN0aXZpdHlJZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsuY2xhc3NpY1VwZGF0ZSIKLSAgICAgICAgICAgIGNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLmNhdGVnb3J5LmNsYXNzaWNVcGRhdGUiPgotICAgICAgPC9jYXRlZ29yeUFjdGl2aXR5QmluZGluZz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0gICAgICA8aW5pdGlhbGl6ZXIKLSAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay5wcmVmcy5DbGFzc2ljVXBkYXRlSW5pdGlhbGl6ZXIiPgotICAgICAgPC9pbml0aWFsaXplcj4KLSAgIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL0FkZENvbG9jYXRlZFJlcG9zaXRvcnlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL0FkZENvbG9jYXRlZFJlcG9zaXRvcnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc1NjM3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9BZGRDb2xvY2F0ZWRSZXBvc2l0b3J5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLmFjdGlvbnMuUHJvdmlzaW9uaW5nQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgQWRkQ29sb2NhdGVkUmVwb3NpdG9yeUFjdGlvbiBleHRlbmRzIFByb3Zpc2lvbmluZ0FjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkQ29sb2NhdGVkUmVwb3NpdG9yeUFjdGlvbihJU2VsZWN0aW9uUHJvdmlkZXIgc2VsZWN0aW9uUHJvdmlkZXIsIFNoZWxsIHNoZWxsKSB7Ci0JCXN1cGVyKFByb3ZTREtNZXNzYWdlcy5BZGRDb2xvY2F0ZWRSZXBvc2l0b3J5QWN0aW9uX0xhYmVsLCBzZWxlY3Rpb25Qcm92aWRlciwgc2hlbGwpOwotCQlzZXRUb29sVGlwVGV4dChQcm92U0RLTWVzc2FnZXMuQWRkQ29sb2NhdGVkUmVwb3NpdG9yeUFjdGlvbl9Ub29sVGlwKTsKLQkJaW5pdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJbmV3IEFkZENvbG9jYXRlZFJlcG9zaXRvcnlEaWFsb2coZ2V0U2hlbGwoKSwgSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX05PTl9TWVNURU0pLm9wZW4oKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9BZGRDb2xvY2F0ZWRSZXBvc2l0b3J5RGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9BZGRDb2xvY2F0ZWRSZXBvc2l0b3J5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMmY4ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvQWRkQ29sb2NhdGVkUmVwb3NpdG9yeURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuZGlhbG9ncy5BZGRSZXBvc2l0b3J5RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkub3BlcmF0aW9ucy5BZGRDb2xvY2F0ZWRSZXBvc2l0b3J5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkub3BlcmF0aW9ucy5Qcm92aXNpb25pbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogRGlhbG9nIHRoYXQgYWxsb3dzIGNvbG9jYXRlZCBtZXRhZGF0YSBhbmQgYXJ0aWZhY3QgcmVwb3NpdG9yaWVzCi0gKiB0byBiZSBkZWZpbmVkIGFuZCBhZGRlZC4KLSAqIAotICogQHNpbmNlIDMuNAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRDb2xvY2F0ZWRSZXBvc2l0b3J5RGlhbG9nIGV4dGVuZHMgQWRkUmVwb3NpdG9yeURpYWxvZyB7Ci0KLQlwdWJsaWMgQWRkQ29sb2NhdGVkUmVwb3NpdG9yeURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgaW50IHJlcG9GbGFncykgewotCQlzdXBlcihwYXJlbnRTaGVsbCwgcmVwb0ZsYWdzKTsKLQkJc2V0VGl0bGUoUHJvdlNES01lc3NhZ2VzLkFkZENvbG9jYXRlZFJlcG9zaXRvcnlEaWFsb2dfVGl0bGUpOwotCi0JfQotCi0JcHJvdGVjdGVkIFByb3Zpc2lvbmluZ09wZXJhdGlvbiBnZXRPcGVyYXRpb24oVVJMIHVybCkgewotCQlyZXR1cm4gbmV3IEFkZENvbG9jYXRlZFJlcG9zaXRvcnlPcGVyYXRpb24oZ2V0U2hlbGwoKS5nZXRUZXh0KCksIHVybCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvQXV0b21hdGljVXBkYXRlU2NoZWR1bGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9BdXRvbWF0aWNVcGRhdGVTY2hlZHVsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0NDJkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9BdXRvbWF0aWNVcGRhdGVTY2hlZHVsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGs7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuU2VydmljZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay5wcmVmcy5QcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5Qcm92VUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5tb2RlbC5Qcm9maWxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnBvbGljeS5JUXVlcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnF1ZXJ5LkVsZW1lbnRRdWVyeURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51cGRhdGVjaGVja2VyLklVcGRhdGVDaGVja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudXBkYXRlY2hlY2tlci5JVXBkYXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0YXJ0dXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc3RhdHVzaGFuZGxlcnMuU3RhdHVzTWFuYWdlcjsKLQotLyoqCi0gKiBUaGlzIHBsdWctaW4gaXMgbG9hZGVkIG9uIHN0YXJ0dXAgdG8gZm9yayBhIGpvYiB0aGF0IHNlYXJjaGVzIGZvciBuZXcKLSAqIHBsdWctaW5zLgotICovCi1wdWJsaWMgY2xhc3MgQXV0b21hdGljVXBkYXRlU2NoZWR1bGVyIGltcGxlbWVudHMgSVN0YXJ0dXAgewotCS8vIHZhbHVlcyBhcmUgdG8gYmUgcGlja2VkIHVwIGZyb20gdGhlIGFycmF5cyBEQVlTIGFuZCBIT1VSUwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfREFZID0gImRheSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBfSE9VUiA9ICJob3VyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBEQVlTID0ge1Byb3ZTREtNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwX2RheSwgUHJvdlNES01lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfTW9uZGF5LCBQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9UdWVzZGF5LCBQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9XZWRuZXNkYXksIFByb3ZTREtNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwX1RodXJzZGF5LCBQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9GcmlkYXksIFByb3ZTREtNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwX1NhdHVyZGF5LCBQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF9TdW5kYXl9OwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBIT1VSUyA9IHtQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8xQU0sIFByb3ZTREtNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzJBTSwgUHJvdlNES01lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfM0FNLCBQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF80QU0sIFByb3ZTREtNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzVBTSwgUHJvdlNES01lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfNkFNLCBQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF83QU0sIFByb3ZTREtNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzhBTSwgUHJvdlNES01lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfOUFNLCBQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8xMEFNLCBQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8xMUFNLCBQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8xMlBNLCBQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF8xUE0sIFByb3ZTREtNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzJQTSwgUHJvdlNES01lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfM1BNLCBQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF80UE0sIFByb3ZTREtNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzVQTSwgUHJvdlNES01lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfNlBNLCBQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF83UE0sCi0JCQlQcm92U0RLTWVzc2FnZXMuU2NoZWR1bGVyU3RhcnR1cF84UE0sIFByb3ZTREtNZXNzYWdlcy5TY2hlZHVsZXJTdGFydHVwXzlQTSwgUHJvdlNES01lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfMTBQTSwgUHJvdlNES01lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfMTFQTSwgUHJvdlNES01lc3NhZ2VzLlNjaGVkdWxlclN0YXJ0dXBfMTJBTSx9OwotCi0JcHJpdmF0ZSBJVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIgPSBudWxsOwotCXByaXZhdGUgSVVwZGF0ZUNoZWNrZXIgY2hlY2tlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHJvZmlsZUlkOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBBdXRvbWF0aWNVcGRhdGVTY2hlZHVsZXIoKSB7Ci0JCVByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuc2V0U2NoZWR1bGVyKHRoaXMpOwotCQljaGVja2VyID0gKElVcGRhdGVDaGVja2VyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoUHJvdlNES1VJQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVVwZGF0ZUNoZWNrZXIuU0VSVklDRV9OQU1FKTsKLQkJaWYgKGNoZWNrZXIgPT0gbnVsbCkgewotCQkJLy8gU29tZXRoaW5nIGRpZCBub3QgaW5pdGlhbGl6ZSBwcm9wZXJseQotCQkJSVN0YXR1cyBzdGF0dXMgPSBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFByb3ZTREtVSUFjdGl2YXRvci5QTFVHSU5fSUQsIFByb3ZTREtNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVTY2hlZHVsZXJfVXBkYXRlTm90SW5pdGlhbGl6ZWQpOwotCQkJUHJvdlVJLnJlcG9ydFN0YXR1cyhzdGF0dXMsIFN0YXR1c01hbmFnZXIuTE9HKTsKLQkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJcHJvZmlsZUlkID0gUHJvdlNES1VJQWN0aXZhdG9yLmdldFNlbGZQcm9maWxlSWQoKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCXByb2ZpbGVJZCA9IG51bGw7Ci0JCQlpZiAoZS5nZXRTdGF0dXMoKSAhPSBudWxsKQotCQkJCVByb3ZVSS5yZXBvcnRTdGF0dXMoZS5nZXRTdGF0dXMoKSwgU3RhdHVzTWFuYWdlci5MT0cpOwotCQkJZWxzZQotCQkJCVByb3ZVSS5oYW5kbGVFeGNlcHRpb24oZSwgbnVsbCwgU3RhdHVzTWFuYWdlci5MT0cpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlYXJseVN0YXJ0dXAoKSB7Ci0JCXNjaGVkdWxlVXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCXJlbW92ZVVwZGF0ZUxpc3RlbmVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzY2hlZHVsZVVwZGF0ZSgpIHsKLQkJcmVtb3ZlVXBkYXRlTGlzdGVuZXIoKTsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIHNjaGVkdWxlID0gcHJlZi5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0FVVE9fVVBEQVRFX1NDSEVEVUxFKTsKLQkJLy8gU2VlIGlmIHdlIGhhdmUgYSBzY2hlZHVsZWQgY2hlY2sgb3Igc3RhcnR1cCBvbmx5LiAgSWYgaXQgaXMKLQkJLy8gc3RhcnR1cCBvbmx5LCB0aGVyZSBpcyBub3RoaW5nIG1vcmUgdG8gZG8gbm93LCBhIGxpc3RlbmVyIHdpbGwKLQkJLy8gYmUgY3JlYXRlZCBvbiB0aGUgbmV4dCBzdGFydHVwLgotCQlpZiAoc2NoZWR1bGUuZXF1YWxzKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9VUERBVEVfT05fU1RBUlRVUCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlzY2hlZHVsZVVwZGF0ZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzY2hlZHVsZVVwZGF0ZSgpIHsKLQkJLy8gTm90aGluZyB0byBkbyBpZiB3ZSBkb24ndCBrbm93IHdoYXQgcHJvZmlsZSB3ZSBhcmUgY2hlY2tpbmcKLQkJaWYgKHByb2ZpbGVJZCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlQcmVmZXJlbmNlcyBwcmVmID0gUHJvdlNES1VJQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkvLyBTZWUgaWYgYXV0b21hdGljIHNlYXJjaCBpcyBlbmFibGVkIGF0IGFsbAotCQlpZiAocHJlZi5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9BVVRPX1VQREFURV9FTkFCTEVEKSA9PSBmYWxzZSkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHNjaGVkdWxlID0gcHJlZi5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0FVVE9fVVBEQVRFX1NDSEVEVUxFKTsKLQkJbG9uZyBkZWxheSA9IElVcGRhdGVDaGVja2VyLk9ORV9USU1FX0NIRUNLOwotCQlsb25nIHBvbGwgPSBJVXBkYXRlQ2hlY2tlci5PTkVfVElNRV9DSEVDSzsKLQkJaWYgKCFzY2hlZHVsZS5lcXVhbHMoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1VQREFURV9PTl9TVEFSVFVQKSkgewotCQkJZGVsYXkgPSBjb21wdXRlRGVsYXkocHJlZik7Ci0JCQlwb2xsID0gY29tcHV0ZVBvbGwocHJlZik7Ci0JCX0KLQkJbGlzdGVuZXIgPSBQcm92U0RLVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldEF1dG9tYXRpY1VwZGF0ZXIoKTsKLQkJRWxlbWVudFF1ZXJ5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gUHJvdlNES1VJQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRRdWVyeVByb3ZpZGVyKCkuZ2V0UXVlcnlEZXNjcmlwdG9yKG5ldyBQcm9maWxlRWxlbWVudChwcm9maWxlSWQpLCBJUXVlcnlQcm92aWRlci5JTlNUQUxMRURfSVVTKTsKLQkJY2hlY2tlci5hZGRVcGRhdGVDaGVjayhwcm9maWxlSWQsIGRlc2NyaXB0b3IucXVlcnksIGRlbGF5LCBwb2xsLCBsaXN0ZW5lcik7Ci0KLQl9Ci0KLQlwcml2YXRlIGludCBnZXREYXkoUHJlZmVyZW5jZXMgcHJlZikgewotCQlTdHJpbmcgZGF5ID0gcHJlZi5nZXRTdHJpbmcoUF9EQVkpOwotCQlmb3IgKGludCBkID0gMDsgZCA8IERBWVMubGVuZ3RoOyBkKyspCi0JCQlpZiAoREFZU1tkXS5lcXVhbHMoZGF5KSkKLQkJCQlzd2l0Y2ggKGQpIHsKLQkJCQkJY2FzZSAwIDoKLQkJCQkJCXJldHVybiAtMTsKLQkJCQkJY2FzZSAxIDoKLQkJCQkJCXJldHVybiBDYWxlbmRhci5NT05EQVk7Ci0JCQkJCWNhc2UgMiA6Ci0JCQkJCQlyZXR1cm4gQ2FsZW5kYXIuVFVFU0RBWTsKLQkJCQkJY2FzZSAzIDoKLQkJCQkJCXJldHVybiBDYWxlbmRhci5XRURORVNEQVk7Ci0JCQkJCWNhc2UgNCA6Ci0JCQkJCQlyZXR1cm4gQ2FsZW5kYXIuVEhVUlNEQVk7Ci0JCQkJCWNhc2UgNSA6Ci0JCQkJCQlyZXR1cm4gQ2FsZW5kYXIuRlJJREFZOwotCQkJCQljYXNlIDYgOgotCQkJCQkJcmV0dXJuIENhbGVuZGFyLlNBVFVSREFZOwotCQkJCQljYXNlIDcgOgotCQkJCQkJcmV0dXJuIENhbGVuZGFyLlNVTkRBWTsKLQkJCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRIb3VyKFByZWZlcmVuY2VzIHByZWYpIHsKLQkJU3RyaW5nIGhvdXIgPSBwcmVmLmdldFN0cmluZyhQX0hPVVIpOwotCQlmb3IgKGludCBoID0gMDsgaCA8IEhPVVJTLmxlbmd0aDsgaCsrKQotCQkJaWYgKEhPVVJTW2hdLmVxdWFscyhob3VyKSkKLQkJCQlyZXR1cm4gaCArIDE7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qCi0JICogQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbSB0aGlzIG1vbWVudCB0byB0aGUgbmV4dAotCSAqIHNjaGVkdWxlZCB1cGRhdGUgY2hlY2suIElmIHRoYXQgbW9tZW50IGhhcyBhbHJlYWR5IHBhc3NlZCwgcmV0dXJucyAwTCAoc3RhcnQKLQkgKiBpbW1lZGlhdGVseSkuCi0JICovCi0JcHJpdmF0ZSBsb25nIGNvbXB1dGVEZWxheShQcmVmZXJlbmNlcyBwcmVmKSB7Ci0KLQkJaW50IHRhcmdldF9kID0gZ2V0RGF5KHByZWYpOwotCQlpbnQgdGFyZ2V0X2ggPSBnZXRIb3VyKHByZWYpOwotCi0JCUNhbGVuZGFyIGNhbGVuZGFyID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKLQkJLy8gbWF5IG5lZWQgdG8gdXNlIHRoZSBCb290TG9hZGVyIGxvY2FsZQotCQlpbnQgY3VycmVudF9kID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLkRBWV9PRl9XRUVLKTsKLQkJLy8gc3RhcnRzIHdpdGggU1VOREFZCi0JCWludCBjdXJyZW50X2ggPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuSE9VUl9PRl9EQVkpOwotCQlpbnQgY3VycmVudF9tID0gY2FsZW5kYXIuZ2V0KENhbGVuZGFyLk1JTlVURSk7Ci0JCWludCBjdXJyZW50X3MgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuU0VDT05EKTsKLQkJaW50IGN1cnJlbnRfbXMgPSBjYWxlbmRhci5nZXQoQ2FsZW5kYXIuTUlMTElTRUNPTkQpOwotCi0JCWxvbmcgZGVsYXkgPSAwTDsgLy8gbWlsbGlzZWNvbmRzCi0KLQkJaWYgKHRhcmdldF9kID09IC0xKSB7Ci0JCQkvLyBDb21wdXRlIHRoZSBkZWxheSBmb3IgImV2ZXJ5IGRheSBhdCB4IG8nY2xvY2siCi0JCQkvLyBJcyBpdCBub3cgPwotCQkJaWYgKHRhcmdldF9oID09IGN1cnJlbnRfaCAmJiBjdXJyZW50X20gPT0gMCAmJiBjdXJyZW50X3MgPT0gMCkKLQkJCQlyZXR1cm4gZGVsYXk7Ci0KLQkJCWludCBkZWx0YV9oID0gdGFyZ2V0X2ggLSBjdXJyZW50X2g7Ci0JCQlpZiAodGFyZ2V0X2ggPD0gY3VycmVudF9oKQotCQkJCWRlbHRhX2ggKz0gMjQ7Ci0JCQlkZWxheSA9ICgoZGVsdGFfaCAqIDYwIC0gY3VycmVudF9tKSAqIDYwIC0gY3VycmVudF9zKSAqIDEwMDAgLSBjdXJyZW50X21zOwotCQkJcmV0dXJuIGRlbGF5OwotCQl9Ci0JCS8vIENvbXB1dGUgdGhlIGRlbGF5IGZvciAiZXZlcnkgWGRheSBhdCB4IG8nY2xvY2siCi0JCS8vIElzIGl0IG5vdyA/Ci0JCWlmICh0YXJnZXRfZCA9PSBjdXJyZW50X2QgJiYgdGFyZ2V0X2ggPT0gY3VycmVudF9oICYmIGN1cnJlbnRfbSA9PSAwICYmIGN1cnJlbnRfcyA9PSAwKQotCQkJcmV0dXJuIGRlbGF5OwotCi0JCWludCBkZWx0YV9kID0gdGFyZ2V0X2QgLSBjdXJyZW50X2Q7Ci0JCWlmICh0YXJnZXRfZCA8IGN1cnJlbnRfZCB8fCB0YXJnZXRfZCA9PSBjdXJyZW50X2QgJiYgKHRhcmdldF9oIDwgY3VycmVudF9oIHx8IHRhcmdldF9oID09IGN1cnJlbnRfaCAmJiBjdXJyZW50X20gPiAwKSkKLQkJCWRlbHRhX2QgKz0gNzsKLQotCQlkZWxheSA9ICgoKGRlbHRhX2QgKiAyNCArIHRhcmdldF9oIC0gY3VycmVudF9oKSAqIDYwIC0gY3VycmVudF9tKSAqIDYwIC0gY3VycmVudF9zKSAqIDEwMDAgLSBjdXJyZW50X21zOwotCQlyZXR1cm4gZGVsYXk7Ci0JfQotCi0JLyoKLQkgKiBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHBvbGxpbmcgZnJlcXVlbmN5LgotCSAqIFdlIGhhdmUgYWxyZWFkeSBlc3RhYmxpc2hlZCB0aGF0IHRoZXJlIGlzIGEgc2NoZWR1bGUsIHZzLiBvbmx5Ci0JICogb24gc3RhcnR1cC4KLQkgKi8KLQlwcml2YXRlIGxvbmcgY29tcHV0ZVBvbGwoUHJlZmVyZW5jZXMgcHJlZikgewotCi0JCWludCB0YXJnZXRfZCA9IGdldERheShwcmVmKTsKLQkJaWYgKHRhcmdldF9kID09IC0xKSB7Ci0JCQkvLyBFdmVyeSAyNCBob3VycwotCQkJcmV0dXJuIDI0ICogNjAgKiA2MCAqIDEwMDA7Ci0JCX0KLQkJcmV0dXJuIDcgKiAyNCAqIDYwICogNjAgKiAxMDAwOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVVcGRhdGVMaXN0ZW5lcigpIHsKLQkJLy8gUmVtb3ZlIHRoZSBjdXJyZW50IGxpc3RlbmVyIGlmIHRoZXJlIGlzIG9uZQotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCAmJiBjaGVja2VyICE9IG51bGwpIHsKLQkJCWNoZWNrZXIucmVtb3ZlVXBkYXRlQ2hlY2sobGlzdGVuZXIpOwotCQkJbGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvQXZhaWxhYmxlSVVWaWV3UXVlcnlDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9BdmFpbGFibGVJVVZpZXdRdWVyeUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0ODY3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9BdmFpbGFibGVJVVZpZXdRdWVyeUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkucG9saWN5LklRdWVyeVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkucXVlcnkuUXVlcnlDb250ZXh0OwotCi0vKioKLSAqIEF2YWlsYWJsZUlVVmlld1F1ZXJ5Q29udGV4dCBkZWZpbmVzIHRoZSBkaWZmZXJlbnQgd2F5cwotICogYXZhaWxhYmxlIElVcyBjYW4gYmUgdmlld2VkIGluIHRoZSBTREsgVUkuCi0gKi8KLXB1YmxpYyBjbGFzcyBBdmFpbGFibGVJVVZpZXdRdWVyeUNvbnRleHQgZXh0ZW5kcyBRdWVyeUNvbnRleHQgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJRVdfQllfQ0FURUdPUlkgPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZJRVdfQllfUkVQTyA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVklFV19GTEFUID0gMzsKLQotCS8vIERlZmF1bHQgdG8gcmVwbyBhcyB0aGlzIHByb3ZpZGVzIHRoZSBmYXN0ZXN0IGluZm9ybWF0aW9uCi0JcHJpdmF0ZSBpbnQgdmlldyA9IFZJRVdfQllfUkVQTzsKLQkvLyBXaGV0aGVyIHRvIHNob3cgbGF0ZXN0IHZlcnNpb25zIG9ubHksIGRlZmF1bHRzIHRvCi0JLy8gdHJ1ZS4gIENsaWVudHMgdHlwaWNhbGx5IHVzZSBhIHByZWYgc2V0dGluZyBvciBkaWFsb2cKLQkvLyBzZXR0aW5nIHRvIGluaXRpYWxpemUKLQlwcml2YXRlIGJvb2xlYW4gc2hvd0xhdGVzdFZlcnNpb25zT25seSA9IHRydWU7Ci0JLy8gV2hldGhlciB0byBoaWRlIHRoaW5ncyB0aGF0IGFyZSBhbHJlYWR5IGluc3RhbGxlZAotCS8vIERlZmF1bHRzIHRvIGZhbHNlIHNpbmNlIHdlIHdvdWxkbid0IGtub3cgd2hhdCBwcm9maWxlIHRvIHVzZQotCXByaXZhdGUgYm9vbGVhbiBoaWRlQWxyZWFkeUluc3RhbGxlZCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIHByb2ZpbGVJZCA9IG51bGw7Ci0KLQlwdWJsaWMgQXZhaWxhYmxlSVVWaWV3UXVlcnlDb250ZXh0KGludCB2aWV3VHlwZSkgewotCQl0aGlzLnZpZXcgPSB2aWV3VHlwZTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnF1ZXJ5LlF1ZXJ5Q29udGV4dCNnZXRRdWVyeVR5cGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UXVlcnlUeXBlKCkgewotCQlpZiAodmlldyA9PSBWSUVXX0JZX1JFUE8pCi0JCQlyZXR1cm4gSVF1ZXJ5UHJvdmlkZXIuTUVUQURBVEFfUkVQT1M7Ci0JCXJldHVybiBJUXVlcnlQcm92aWRlci5BVkFJTEFCTEVfSVVTOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Vmlld1R5cGUoKSB7Ci0JCXJldHVybiB2aWV3OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpZXdUeXBlKGludCB2aWV3VHlwZSkgewotCQl2aWV3ID0gdmlld1R5cGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0U2hvd0xhdGVzdFZlcnNpb25zT25seSgpIHsKLQkJcmV0dXJuIHNob3dMYXRlc3RWZXJzaW9uc09ubHk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2hvd0xhdGVzdFZlcnNpb25zT25seShib29sZWFuIHNob3dMYXRlc3QpIHsKLQkJc2hvd0xhdGVzdFZlcnNpb25zT25seSA9IHNob3dMYXRlc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgaGlkZUFscmVhZHlJbnN0YWxsZWQoU3RyaW5nIGluc3RhbGxlZFByb2ZpbGVJZCkgewotCQlwcm9maWxlSWQgPSBpbnN0YWxsZWRQcm9maWxlSWQ7Ci0JCWhpZGVBbHJlYWR5SW5zdGFsbGVkID0gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaG93QWxyZWFkeUluc3RhbGxlZCgpIHsKLQkJaGlkZUFscmVhZHlJbnN0YWxsZWQgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRIaWRlQWxyZWFkeUluc3RhbGxlZCgpIHsKLQkJcmV0dXJuIGhpZGVBbHJlYWR5SW5zdGFsbGVkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5zdGFsbGVkUHJvZmlsZUlkKCkgewotCQlyZXR1cm4gcHJvZmlsZUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL0NvbG9jYXRlZFJlcG9zaXRvcnlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL0NvbG9jYXRlZFJlcG9zaXRvcnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdjMjUyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9Db2xvY2F0ZWRSZXBvc2l0b3J5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkazsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuUHJvdmlzaW9uaW5nT3BlcmF0aW9uUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuYWN0aW9ucy5Qcm92aXNpb25pbmdBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5tb2RlbC5NZXRhZGF0YVJlcG9zaXRvcnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkub3BlcmF0aW9ucy5Qcm92aXNpb25pbmdPcGVyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc3RhdHVzaGFuZGxlcnMuU3RhdHVzTWFuYWdlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENvbG9jYXRlZFJlcG9zaXRvcnlBY3Rpb24gZXh0ZW5kcyBQcm92aXNpb25pbmdBY3Rpb24gewotCi0JcHVibGljIENvbG9jYXRlZFJlcG9zaXRvcnlBY3Rpb24oU3RyaW5nIGxhYmVsLCBTdHJpbmcgdG9vbHRpcFRleHQsIElTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciwgU2hlbGwgc2hlbGwpIHsKLQkJc3VwZXIobGFiZWwsIHNlbGVjdGlvblByb3ZpZGVyLCBzaGVsbCk7Ci0JCXNldFRvb2xUaXBUZXh0KHRvb2x0aXBUZXh0KTsKLQkJaW5pdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJUHJvdmlzaW9uaW5nT3BlcmF0aW9uUnVubmVyLnNjaGVkdWxlKGdldE9wZXJhdGlvbigpLCBnZXRTaGVsbCgpLCBTdGF0dXNNYW5hZ2VyLlNIT1cgfCBTdGF0dXNNYW5hZ2VyLkxPRyk7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFByb3Zpc2lvbmluZ09wZXJhdGlvbiBnZXRPcGVyYXRpb24oKTsKLQotCXByb3RlY3RlZCBVUkxbXSBnZXRTZWxlY3RlZFVSTHMoT2JqZWN0W10gc2VsZWN0aW9uQXJyYXkpIHsKLQkJTGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGlvbkFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoc2VsZWN0aW9uQXJyYXlbaV0gaW5zdGFuY2VvZiBNZXRhZGF0YVJlcG9zaXRvcnlFbGVtZW50KQotCQkJCXVybHMuYWRkKCgoTWV0YWRhdGFSZXBvc2l0b3J5RWxlbWVudCkgc2VsZWN0aW9uQXJyYXlbaV0pLmdldExvY2F0aW9uKCkpOwotCQl9Ci0JCXJldHVybiAoVVJMW10pIHVybHMudG9BcnJheShuZXcgVVJMW3VybHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2tFbmFibGVtZW50KE9iamVjdFtdIHNlbGVjdGlvbkFycmF5KSB7Ci0JCXNldEVuYWJsZWQoZ2V0U2VsZWN0ZWRVUkxzKHNlbGVjdGlvbkFycmF5KS5sZW5ndGggPiAwKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9JVVByb2ZpbGVQcm9wZXJ0eUJ5SWRRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvSVVQcm9maWxlUHJvcGVydHlCeUlkUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZhYjljZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9JVVByb2ZpbGVQcm9wZXJ0eUJ5SWRRdWVyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSVVQcm9wZXJ0eVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkub3BlcmF0aW9ucy5Qcm92aXNpb25pbmdVdGlsOwotCi0vKioKLSAqIEEgcXVlcnkgdGhhdCBzZWFyY2hlcyBmb3Ige0BsaW5rIElJbnN0YWxsYWJsZVVuaXR9IGluc3RhbmNlcyB0aGF0IGhhdmUKLSAqIGEgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcHJvZmlsZSwgd2hvc2UgdmFsdWUgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgdmFsdWUuCi0gKiBVc2VzIHRoZSBwcm9maWxlIGlkIGluc3RlYWQgb2YgdGhlIHByb2ZpbGUgdG8gcmVmZXJlbmNlIHRoZSBwcm9maWxlLgotICogVGhlIHByb2ZpbGUgaW5zdGFuY2UgaXMgY2FjaGVkIG9ubHkgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgcXVlcnkuCi0gKiBUaGlzIHF1ZXJ5IGlzIHVzZWQgaW5zdGVhZCBvZiBJVVByb2ZpbGVQcm9wZXJ0eVF1ZXJ5IGJlY2F1c2Ugd2UgcGFzcwotICogdGhpcyBxdWVyeSB0byB0aGUgYXV0b21hdGljIHVwZGF0ZSBjaGVja2VyIGFuZCBpdCB3aWxsIGJlIHJlZmVyZW5jZWQgZHVyaW5nCi0gKiB0aGUgbGlmZSBvZiB0aGUgcGxhdGZvcm0uICAKLSAqLwotcHVibGljIGNsYXNzIElVUHJvZmlsZVByb3BlcnR5QnlJZFF1ZXJ5IGV4dGVuZHMgSVVQcm9wZXJ0eVF1ZXJ5IHsKLQlwcml2YXRlIFN0cmluZyBwcm9maWxlSWQ7Ci0JcHJpdmF0ZSBJUHJvZmlsZSBjYWNoZWRQcm9maWxlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBxdWVyeSBvbiB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZSBhbmQgdmFsdWUuCi0JICovCi0JcHVibGljIElVUHJvZmlsZVByb3BlcnR5QnlJZFF1ZXJ5KFN0cmluZyBwcm9maWxlSWQsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCXN1cGVyKHByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCXRoaXMucHJvZmlsZUlkID0gcHJvZmlsZUlkOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJvcGVydHkoSUluc3RhbGxhYmxlVW5pdCBpdSwgU3RyaW5nIG5hbWUpIHsKLQkJSVByb2ZpbGUgcHJvZmlsZSA9IGdldFByb2ZpbGUoKTsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcHJvZmlsZS5nZXRJbnN0YWxsYWJsZVVuaXRQcm9wZXJ0eShpdSwgbmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvZmlsZSBnZXRQcm9maWxlKCkgewotCQlpZiAoY2FjaGVkUHJvZmlsZSA9PSBudWxsKQotCQkJdHJ5IHsKLQkJCQljYWNoZWRQcm9maWxlID0gUHJvdmlzaW9uaW5nVXRpbC5nZXRQcm9maWxlKHByb2ZpbGVJZCk7Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZSwgdGhpcyB3aWxsIHJldHVybiBudWxsCi0JCQl9Ci0JCXJldHVybiBjYWNoZWRQcm9maWxlOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0b3IgcGVyZm9ybShJdGVyYXRvciBpdGVyYXRvciwgQ29sbGVjdG9yIHJlc3VsdCkgewotCQlDb2xsZWN0b3IgY29sbGVjdG9yID0gc3VwZXIucGVyZm9ybShpdGVyYXRvciwgcmVzdWx0KTsKLQkJY2FjaGVkUHJvZmlsZSA9IG51bGw7Ci0JCXJldHVybiBjb2xsZWN0b3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvUHJvdlNES01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9Qcm92U0RLTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwODQxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9Qcm92U0RLTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogTWVzc2FnZSBjbGFzcyBmb3IgcHJvdmlzaW9uaW5nIFVJIG1lc3NhZ2VzLiAgCi0gKiAKLSAqIEBzaW5jZSAzLjQKLSAqLwotcHVibGljIGNsYXNzIFByb3ZTREtNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLm1lc3NhZ2VzIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBQcm92U0RLTWVzc2FnZXMuY2xhc3MpOwotCX0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRDb2xvY2F0ZWRSZXBvc2l0b3J5QWN0aW9uX0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZENvbG9jYXRlZFJlcG9zaXRvcnlBY3Rpb25fVG9vbFRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRDb2xvY2F0ZWRSZXBvc2l0b3J5RGlhbG9nX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4dGVybmFsRmlsZUhhbmRsZXJfQnVuZGxlSW5zdGFsbGVkT0s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZXJuYWxGaWxlSGFuZGxlcl9FcnJvckNvcHlpbmdGaWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4dGVybmFsRmlsZUhhbmRsZXJfRXJyb3JFeHBhbmRpbmdBcmNoaXZlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4dGVybmFsRmlsZUhhbmRsZXJfRXJyb3JMb2FkaW5nRnJvbVppcERpcmVjdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlcm5hbEZpbGVIYW5kbGVyX1Byb21wdEZvckluc3RhbGxCdW5kbGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZXJuYWxGaWxlSGFuZGxlcl9SZXBvc2l0b3J5R2VuZXJhdGVkT0s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZXJuYWxGaWxlSGFuZGxlcl9Qcm9tcHRGb3JVbnppcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlcm5hbEZpbGVzUHJlZmVyZW5jZVBhZ2VfQWRkQnVuZGxlR3JvdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZXJuYWxGaWxlc1ByZWZlcmVuY2VQYWdlX0FyY2hpdmVSZXBvR2VuZXJhdGlvbkdyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4dGVybmFsRmlsZXNQcmVmZXJlbmNlUGFnZV9BdXRvSW5zdGFsbEJ1bmRsZUFsd2F5czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlcm5hbEZpbGVzUHJlZmVyZW5jZVBhZ2VfQXV0b0luc3RhbGxCdW5kbGVOZXZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlcm5hbEZpbGVzUHJlZmVyZW5jZVBhZ2VfQXV0b0luc3RhbGxCdW5kbGVQcm9tcHQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZXJuYWxGaWxlc1ByZWZlcmVuY2VQYWdlX0dlbmVyYXRlQXJjaGl2ZVJlcG9BbHdheXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXh0ZXJuYWxGaWxlc1ByZWZlcmVuY2VQYWdlX0dlbmVyYXRlQXJjaGl2ZVJlcG9OZXZlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeHRlcm5hbEZpbGVzUHJlZmVyZW5jZVBhZ2VfR2VuZXJhdGVBcmNoaXZlUmVwb1Byb21wdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVDb2xvY2F0ZWRSZXBvc2l0b3J5QWN0aW9uX0xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUNvbG9jYXRlZFJlcG9zaXRvcnlBY3Rpb25fVG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX0FkZEJ1dHRvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX0V4cG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX0ltcG9ydDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX0xvY2F0aW9uQ29sdW1uSGVhZGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlcG9zaXRvcnlNYW5pcHVsYXRpb25EaWFsb2dfTmFtZUNvbHVtbkhlYWRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX1Byb3BlcnRpZXNCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVwb3NpdG9yeU1hbmlwdWxhdGlvbkRpYWxvZ19SZW1vdmVCdXR0b247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVwb3NpdG9yeU1hbmlwdWxhdGlvbkRpYWxvZ19SZW1vdmVPcGVyYXRpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX1VwZGF0ZVNpdGVzRGlhbG9nVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19BZGRTaXRlQnV0dG9uVGV4dDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVBbmRJbnN0YWxsRGlhbG9nX0FkZFNpdGVPcGVyYXRpb25sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVBbmRJbnN0YWxsRGlhbG9nX0F2YWlsYWJsZVNvZnR3YXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfSW5zdGFsbGVkU29mdHdhcmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19NYW5hZ2VTaXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVBbmRJbnN0YWxsRGlhbG9nX01hbmFnZVNpdGVzVG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVBbmRJbnN0YWxsRGlhbG9nX05hbWVkT3BlcmF0aW9uSW5Qcm9ncmVzczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVBbmRJbnN0YWxsRGlhbG9nX09wZXJhdGlvbkluUHJvZ3Jlc3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19QcmVmTGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVBbmRJbnN0YWxsRGlhbG9nX1JlbW92ZVNpdGVPcGVyYXRpb25MYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVBbmRJbnN0YWxsRGlhbG9nX1JldmVydEFjdGlvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfUmV2ZXJ0VG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVBbmRJbnN0YWxsRGlhbG9nX1RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfUHJvcGVydGllczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVBbmRJbnN0YWxsRGlhbG9nX1JlZnJlc2g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19SZWZyZXNoVG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVBbmRJbnN0YWxsRGlhbG9nX1Nob3dBbHJlYWR5SW5zdGFsbGVkSXRlbXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19TaG93TGF0ZXN0VmVyc2lvbnNPbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfVmlld0J5Q2F0ZWdvcnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19WaWV3QnlOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfVmlld0J5U2l0ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcGRhdGVIYW5kbGVyX0Nhbm5vdExhdW5jaFVJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVwZGF0ZUhhbmRsZXJfU0RLVXBkYXRlVUlNZXNzYWdlVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF9kYXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF9Nb25kYXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF9UdWVzZGF5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfV2VkbmVzZGF5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfVGh1cnNkYXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF9GcmlkYXk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF9TYXR1cmRheTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwX1N1bmRheTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzFBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzJBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzNBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzRBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzVBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzZBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzdBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzhBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzlBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzEwQU07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8xMUFNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfMTJQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzFQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzJQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzNQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzRQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzVQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzZQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzdQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzhQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzlQTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTY2hlZHVsZXJTdGFydHVwXzEwUE07Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2NoZWR1bGVyU3RhcnR1cF8xMVBNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNjaGVkdWxlclN0YXJ0dXBfMTJBTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUG9wdXBfUHJlZkxpbmtPbmx5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNQb3B1cF9SZW1pbmRBbmRQcmVmTGluazsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUG9wdXBfUmVtaW5kZXJKb2JUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZmluZFVwZGF0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlU2NoZWR1bGVyXzMwTWludXRlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVTY2hlZHVsZXJfNjBNaW51dGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlcl8yNDBNaW51dGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlcl9VcGRhdGVOb3RJbml0aWFsaXplZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUG9wdXBfVXBkYXRlc0F2YWlsYWJsZVRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXJfQXV0b21hdGljRG93bmxvYWRPcGVyYXRpb25OYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXJfQ2xpY2tUb1Jldmlld1VwZGF0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlcl9DbGlja1RvUmV2aWV3VXBkYXRlc1dpdGhQcm9ibGVtczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVyX0Vycm9yQ2hlY2tpbmdVcGRhdGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9VcGRhdGVTY2hlZHVsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZmluZE9uU3RhcnQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2ZpbmRPblNjaGVkdWxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9kb3dubG9hZE9wdGlvbnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX3NlYXJjaEFuZE5vdGlmeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZG93bmxvYWRBbmROb3RpZnk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2F0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9SZW1pbmRHcm91cDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfUmVtaW5kU2NoZWR1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX1JlbWluZE9uY2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXV0b21hdGljVXBkYXRlc1BvcHVwX0NsaWNrVG9SZXZpZXdEb3dubG9hZGVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY1VwZGF0ZXNQb3B1cF9DbGlja1RvUmV2aWV3Tm90RG93bmxvYWRlZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX1NlbGVjdE1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdmlzaW9uaW5nUHJlZmVyZW5jZVBhZ2VfQWx3YXlzT3BlbldpemFyZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm92aXNpb25pbmdQcmVmZXJlbmNlUGFnZV9Ccm93c2luZ1ByZWZzR3JvdXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdmlzaW9uaW5nUHJlZmVyZW5jZVBhZ2VfU2hvd0xhdGVzdFZlcnNpb25zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3Zpc2lvbmluZ1ByZWZlcmVuY2VQYWdlX1Nob3dBbGxWZXJzaW9uczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm92aXNpb25pbmdQcmVmZXJlbmNlUGFnZV9OZXZlck9wZW5XaXphcmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdmlzaW9uaW5nUHJlZmVyZW5jZVBhZ2VfT3BlbldpemFyZElmSW52YWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm92aXNpb25pbmdQcmVmZXJlbmNlUGFnZV9Qcm9tcHRUb09wZW5XaXphcmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdlNES1F1ZXJ5UHJvdmlkZXJfRXJyb3JSZXRyaWV2aW5nUHJvZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm92U0RLVUlBY3RpdmF0b3JfRXJyb3JXcml0aW5nTGljZW5zZVJlZ2lzdHJ5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3ZTREtVSUFjdGl2YXRvcl9MYXVuY2hVcGRhdGVNYW5hZ2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3ZTREtVSUFjdGl2YXRvcl9MaWNlbnNlTWFuYWdlclJlYWRFcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm92U0RLVUlBY3RpdmF0b3JfTm9TZWxmUHJvZmlsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm92U0RLVUlBY3RpdmF0b3JfT3BlbldpemFyZEFueXdheTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm92U0RLVUlBY3RpdmF0b3JfUXVlc3Rpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdlNES1VJQWN0aXZhdG9yX1Vuc3VwcG9ydGVkRmVhdHVyZU1lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvdlNES1VJQWN0aXZhdG9yX1Vuc3VwcG9ydGVkRmVhdHVyZVRpdGxlOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvUHJvdlNES1F1ZXJ5UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL1Byb3ZTREtRdWVyeVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MTYwOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvUHJvdlNES1F1ZXJ5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGs7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGsucHJlZnMuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklVUHJvZmlsZVByb3BlcnR5UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSVVQcm9wZXJ0eVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLlByb3ZVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLm1vZGVsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5vcGVyYXRpb25zLlByb3Zpc2lvbmluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5wb2xpY3kuSVF1ZXJ5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5xdWVyeS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudXBkYXRlY2hlY2tlci5VcGRhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnN0YXR1c2hhbmRsZXJzLlN0YXR1c01hbmFnZXI7Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIHF1ZXJpZXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBTREsgVUkuCi0gKiAKLSAqIEBzaW5jZSAzLjQKLSAqLwotCi1wdWJsaWMgY2xhc3MgUHJvdlNES1F1ZXJ5UHJvdmlkZXIgaW1wbGVtZW50cyBJUXVlcnlQcm92aWRlciB7Ci0KLQlwcml2YXRlIFF1ZXJ5IGFsbFF1ZXJ5ID0gbmV3IFF1ZXJ5KCkgewotCQlwdWJsaWMgYm9vbGVhbiBpc01hdGNoKE9iamVjdCBjYW5kaWRhdGUpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQl9OwotCi0JcHVibGljIEVsZW1lbnRRdWVyeURlc2NyaXB0b3IgZ2V0UXVlcnlEZXNjcmlwdG9yKE9iamVjdCBlbGVtZW50LCBpbnQgcXVlcnlUeXBlKSB7Ci0JCUlRdWVyeWFibGUgcXVlcnlhYmxlOwotCQlRdWVyeUNvbnRleHQgcXVlcnlDb250ZXh0ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBRdWVyaWVkRWxlbWVudCkKLQkJCXF1ZXJ5Q29udGV4dCA9ICgoUXVlcmllZEVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5Q29udGV4dCgpOwotCQlib29sZWFuIHNob3dMYXRlc3QgPSBQcm92U0RLVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1NIT1dfTEFURVNUX1ZFUlNJT04pOwotCQlzd2l0Y2ggKHF1ZXJ5VHlwZSkgewotCQkJY2FzZSBJUXVlcnlQcm92aWRlci5BUlRJRkFDVF9SRVBPUyA6Ci0JCQkJcXVlcnlhYmxlID0gbmV3IFF1ZXJ5YWJsZUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIoSUFydGlmYWN0UmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX05PTl9TWVNURU0pOwotCQkJCXJldHVybiBuZXcgRWxlbWVudFF1ZXJ5RGVzY3JpcHRvcihxdWVyeWFibGUsIG51bGwsIG5ldyBDb2xsZWN0b3IoKSB7Ci0JCQkJCXB1YmxpYyBib29sZWFuIGFjY2VwdChPYmplY3Qgb2JqZWN0KSB7Ci0JCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgVVJMKQotCQkJCQkJCXJldHVybiBzdXBlci5hY2NlcHQobmV3IEFydGlmYWN0UmVwb3NpdG9yeUVsZW1lbnQoKFVSTCkgb2JqZWN0KSk7Ci0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJfQotCQkJCX0pOwotCQkJY2FzZSBJUXVlcnlQcm92aWRlci5BVkFJTEFCTEVfSVVTIDoKLQkJCQkvLyBUaGluZ3MgZ2V0IG1vcmUgY29tcGxpY2F0ZWQgaWYgdGhlIHVzZXIgd2FudHMgdG8gZmlsdGVyIG91dCBpbnN0YWxsZWQgaXRlbXMuIAotCQkJCS8vIFRoaXMgaW52b2x2ZXMgc2V0dGluZyB1cCBhIHNlY29uZGFyeSBxdWVyeSBmb3IgaW5zdGFsbGVkIGNvbnRlbnQgdGhhdCB0aGUgdmFyaW91cwotCQkJCS8vIGNvbGxlY3RvcnMgd2lsbCB1c2UgdG8gcmVqZWN0IGNvbnRlbnQuICBXZSBjYW4ndCB1c2UgYSBjb21wb3VuZCBxdWVyeSBiZWNhdXNlIHRoZQotCQkJCS8vIHF1ZXJ5YWJsZXMgYXJlIGRpZmZlcmVudCAocHJvZmlsZSBmb3IgaW5zdGFsbGVkIGNvbnRlbnQsIHJlcG8gZm9yIGF2YWlsYWJsZSBjb250ZW50KQotCQkJCUF2YWlsYWJsZUlVVmlld1F1ZXJ5Q29udGV4dCBhdmFpbGFibGVWaWV3UXVlcnlDb250ZXh0ID0gbnVsbDsKLQkJCQlBdmFpbGFibGVJVUNvbGxlY3RvciBhdmFpbGFibGVJVUNvbGxlY3RvcjsKLQkJCQlib29sZWFuIGhpZGVJbnN0YWxsZWQgPSBmYWxzZTsKLQkJCQlFbGVtZW50UXVlcnlEZXNjcmlwdG9yIGluc3RhbGxlZFF1ZXJ5RGVzY3JpcHRvciA9IG51bGw7Ci0JCQkJaWYgKHF1ZXJ5Q29udGV4dCBpbnN0YW5jZW9mIEF2YWlsYWJsZUlVVmlld1F1ZXJ5Q29udGV4dCkgewotCQkJCQlhdmFpbGFibGVWaWV3UXVlcnlDb250ZXh0ID0gKEF2YWlsYWJsZUlVVmlld1F1ZXJ5Q29udGV4dCkgKChRdWVyaWVkRWxlbWVudCkgZWxlbWVudCkuZ2V0UXVlcnlDb250ZXh0KCk7Ci0JCQkJCXNob3dMYXRlc3QgPSBhdmFpbGFibGVWaWV3UXVlcnlDb250ZXh0LmdldFNob3dMYXRlc3RWZXJzaW9uc09ubHkoKTsKLQkJCQkJaGlkZUluc3RhbGxlZCA9IGF2YWlsYWJsZVZpZXdRdWVyeUNvbnRleHQuZ2V0SGlkZUFscmVhZHlJbnN0YWxsZWQoKTsKLQkJCQkJU3RyaW5nIHByb2ZpbGVJZCA9IGF2YWlsYWJsZVZpZXdRdWVyeUNvbnRleHQuZ2V0SW5zdGFsbGVkUHJvZmlsZUlkKCk7Ci0JCQkJCWlmIChoaWRlSW5zdGFsbGVkICYmIHByb2ZpbGVJZCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCUlQcm9maWxlIHByb2ZpbGUgPSBQcm92aXNpb25pbmdVdGlsLmdldFByb2ZpbGUocHJvZmlsZUlkKTsKLQkJCQkJCQlpbnN0YWxsZWRRdWVyeURlc2NyaXB0b3IgPSBuZXcgRWxlbWVudFF1ZXJ5RGVzY3JpcHRvcihwcm9maWxlLCBuZXcgSVVQcm9maWxlUHJvcGVydHlCeUlkUXVlcnkocHJvZmlsZS5nZXRQcm9maWxlSWQoKSwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BST0ZJTEVfUk9PVF9JVSwgQm9vbGVhbi50b1N0cmluZyh0cnVlKSksIG5ldyBDb2xsZWN0b3IoKSk7Ci0JCQkJCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGp1c3QgYmFpbCBvdXQsIHdlIHdvbid0IHRyeSB0byBxdWVyeSB0aGUgaW5zdGFsbGVkCi0JCQkJCQkJaW5zdGFsbGVkUXVlcnlEZXNjcmlwdG9yID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIFNob3dpbmcgY2hpbGRyZW4gb2YgYSByb2xsYmFjayBlbGVtZW50Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBSb2xsYmFja1JlcG9zaXRvcnlFbGVtZW50KSB7Ci0JCQkJCVF1ZXJ5IHByb2ZpbGVJZFF1ZXJ5ID0gbmV3IEluc3RhbGxhYmxlVW5pdFF1ZXJ5KCgoUm9sbGJhY2tSZXBvc2l0b3J5RWxlbWVudCkgZWxlbWVudCkuZ2V0UHJvZmlsZUlkKCkpOwotCQkJCQlRdWVyeSByb2xsYmFja0lVUXVlcnkgPSBuZXcgSVVQcm9wZXJ0eVF1ZXJ5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX1BST0ZJTEUsIEJvb2xlYW4udG9TdHJpbmcodHJ1ZSkpOwotCQkJCQlhdmFpbGFibGVJVUNvbGxlY3RvciA9IG5ldyBSb2xsYmFja0lVQ29sbGVjdG9yKHRoaXMsICgoUm9sbGJhY2tSZXBvc2l0b3J5RWxlbWVudCkgZWxlbWVudCkuZ2V0UXVlcnlhYmxlKCksIHF1ZXJ5Q29udGV4dCk7Ci0JCQkJCWlmIChoaWRlSW5zdGFsbGVkICYmIGluc3RhbGxlZFF1ZXJ5RGVzY3JpcHRvciAhPSBudWxsKQotCQkJCQkJYXZhaWxhYmxlSVVDb2xsZWN0b3IuaGlkZUluc3RhbGxlZElVcyhpbnN0YWxsZWRRdWVyeURlc2NyaXB0b3IpOwotCQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRRdWVyeURlc2NyaXB0b3IoKChSb2xsYmFja1JlcG9zaXRvcnlFbGVtZW50KSBlbGVtZW50KS5nZXRRdWVyeWFibGUoKSwgbmV3IENvbXBvdW5kUXVlcnkobmV3IFF1ZXJ5W10ge3Byb2ZpbGVJZFF1ZXJ5LCByb2xsYmFja0lVUXVlcnl9LCB0cnVlKSwgYXZhaWxhYmxlSVVDb2xsZWN0b3IpOwotCQkJCX0KLQotCQkJCVF1ZXJ5IGdyb3VwUXVlcnkgPSBuZXcgSVVQcm9wZXJ0eVF1ZXJ5KElJbnN0YWxsYWJsZVVuaXQuUFJPUF9UWVBFX0dST1VQLCBCb29sZWFuLlRSVUUudG9TdHJpbmcoKSk7Ci0JCQkJUXVlcnkgY2F0ZWdvcnlRdWVyeSA9IG5ldyBJVVByb3BlcnR5UXVlcnkoSUluc3RhbGxhYmxlVW5pdC5QUk9QX1RZUEVfQ0FURUdPUlksIEJvb2xlYW4udG9TdHJpbmcodHJ1ZSkpOwotCi0JCQkJLy8gU2hvd2luZyBjaGlsZCBJVSdzIG9mIHNvbWUgcmVwb3NpdG9yaWVzCi0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRhZGF0YVJlcG9zaXRvcmllcykgewotCQkJCQlNZXRhZGF0YVJlcG9zaXRvcmllcyBtZXRhUmVwb3MgPSAoTWV0YWRhdGFSZXBvc2l0b3JpZXMpIGVsZW1lbnQ7Ci0JCQkJCWlmIChtZXRhUmVwb3MuZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoKSA9PSBudWxsKQotCQkJCQkJbWV0YVJlcG9zLnNldFJlcG9GbGFncyhJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfTk9OX1NZU1RFTSk7Ci0JCQkJCXF1ZXJ5YWJsZSA9IG5ldyBRdWVyeWFibGVNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyKG1ldGFSZXBvcyk7Ci0KLQkJCQkJaWYgKGF2YWlsYWJsZVZpZXdRdWVyeUNvbnRleHQgIT0gbnVsbCkgewotCQkJCQkJaWYgKGF2YWlsYWJsZVZpZXdRdWVyeUNvbnRleHQuZ2V0Vmlld1R5cGUoKSA9PSBBdmFpbGFibGVJVVZpZXdRdWVyeUNvbnRleHQuVklFV19GTEFUKSB7Ci0JCQkJCQkJQXZhaWxhYmxlSVVDb2xsZWN0b3IgY29sbGVjdG9yOwotCQkJCQkJCWlmIChzaG93TGF0ZXN0KQotCQkJCQkJCQljb2xsZWN0b3IgPSBuZXcgTGF0ZXN0SVVWZXJzaW9uRWxlbWVudENvbGxlY3Rvcih0aGlzLCBxdWVyeWFibGUsIHF1ZXJ5Q29udGV4dCwgdHJ1ZSk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQljb2xsZWN0b3IgPSBuZXcgQXZhaWxhYmxlSVVDb2xsZWN0b3IodGhpcywgcXVlcnlhYmxlLCBxdWVyeUNvbnRleHQsIHRydWUpOwotCQkJCQkJCWlmIChoaWRlSW5zdGFsbGVkICYmIGluc3RhbGxlZFF1ZXJ5RGVzY3JpcHRvciAhPSBudWxsKQotCQkJCQkJCQljb2xsZWN0b3IuaGlkZUluc3RhbGxlZElVcyhpbnN0YWxsZWRRdWVyeURlc2NyaXB0b3IpOwotCQkJCQkJCXJldHVybiBuZXcgRWxlbWVudFF1ZXJ5RGVzY3JpcHRvcihxdWVyeWFibGUsIGdyb3VwUXVlcnksIGNvbGxlY3Rvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gQXNzdW1lIGNhdGVnb3J5IHZpZXcgaWYgaXQgd2Fzbid0IGZsYXQgb3IgaWYgdGhlcmUgd2FzIG5vIHF1ZXJ5IGNvbnRleHQgYXQgYWxsLgotCQkJCQkvLyBJbnN0YWxsZWQgY29udGVudCBub3QgYSBjb25jZXJuIGZvciBjb2xsZWN0aW5nIGNhdGVnb3JpZXMKLQkJCQkJcmV0dXJuIG5ldyBFbGVtZW50UXVlcnlEZXNjcmlwdG9yKHF1ZXJ5YWJsZSwgY2F0ZWdvcnlRdWVyeSwgbmV3IENhdGVnb3J5RWxlbWVudENvbGxlY3Rvcih0aGlzLCBxdWVyeWFibGUsIHF1ZXJ5Q29udGV4dCwgdHJ1ZSkpOwotCQkJCX0KLQotCQkJCS8vIFNob3dpbmcgY2hpbGRyZW4gb2YgYSByZXBvc2l0b3J5LiAgV2UgYWx3YXlzIHNob3cgY2F0ZWdvcmllcywgbm8gY29uY2VybiBmb3IgZmlsdGVyaW5nIGluc3RhbGxlZCBjb250ZW50Ci0JCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBNZXRhZGF0YVJlcG9zaXRvcnlFbGVtZW50KSB7Ci0JCQkJCXJldHVybiBuZXcgRWxlbWVudFF1ZXJ5RGVzY3JpcHRvcigoKE1ldGFkYXRhUmVwb3NpdG9yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5YWJsZSgpLCBjYXRlZ29yeVF1ZXJ5LCBuZXcgQ2F0ZWdvcnlFbGVtZW50Q29sbGVjdG9yKHRoaXMsICgoTWV0YWRhdGFSZXBvc2l0b3J5RWxlbWVudCkgZWxlbWVudCkuZ2V0UXVlcnlhYmxlKCksIHF1ZXJ5Q29udGV4dCwgdHJ1ZSkpOwotCQkJCX0KLQotCQkJCS8vIFNob3dpbmcgY2hpbGRyZW4gb2YgY2F0ZWdvcmllcwotCQkJCS8vIE11c3QgZG8gdGhpcyBvbmUgYmVmb3JlIENhdGVnb3J5RWxlbWVudCBzaW5jZSBpdCdzIGEgc3ViY2xhc3MKLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFVuY2F0ZWdvcml6ZWRDYXRlZ29yeUVsZW1lbnQpIHsKLQkJCQkJLy8gV2lsbCBoYXZlIHRvIGxvb2sgYXQgYWxsIGNhdGVnb3JpZXMgYW5kIGdyb3VwcyBhbmQgZnJvbSB0aGVyZSwgZmlndXJlIG91dCB3aGF0J3MgbGVmdAotCQkJCQlRdWVyeSBmaXJzdFBhc3NRdWVyeSA9IG5ldyBDb21wb3VuZFF1ZXJ5KG5ldyBRdWVyeVtdIHtncm91cFF1ZXJ5LCBjYXRlZ29yeVF1ZXJ5fSwgZmFsc2UpOwotCQkJCQlxdWVyeWFibGUgPSAoKFVuY2F0ZWdvcml6ZWRDYXRlZ29yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5YWJsZSgpOwotCQkJCQlhdmFpbGFibGVJVUNvbGxlY3RvciA9IHNob3dMYXRlc3QgPyBuZXcgTGF0ZXN0SVVWZXJzaW9uRWxlbWVudENvbGxlY3Rvcih0aGlzLCBxdWVyeWFibGUsIHF1ZXJ5Q29udGV4dCwgZmFsc2UpIDogbmV3IEF2YWlsYWJsZUlVQ29sbGVjdG9yKHRoaXMsIHF1ZXJ5YWJsZSwgcXVlcnlDb250ZXh0LCBmYWxzZSk7Ci0JCQkJCWlmIChoaWRlSW5zdGFsbGVkICYmIGluc3RhbGxlZFF1ZXJ5RGVzY3JpcHRvciAhPSBudWxsKQotCQkJCQkJYXZhaWxhYmxlSVVDb2xsZWN0b3IuaGlkZUluc3RhbGxlZElVcyhpbnN0YWxsZWRRdWVyeURlc2NyaXB0b3IpOwotCQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRRdWVyeURlc2NyaXB0b3IocXVlcnlhYmxlLCBmaXJzdFBhc3NRdWVyeSwgbmV3IFVuY2F0ZWdvcml6ZWRFbGVtZW50Q29sbGVjdG9yKHRoaXMsIHF1ZXJ5YWJsZSwgcXVlcnlDb250ZXh0LCBhdmFpbGFibGVJVUNvbGxlY3RvcikpOwotCi0JCQkJfQotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2F0ZWdvcnlFbGVtZW50KSB7Ci0JCQkJCVF1ZXJ5IG1lbWJlcnNPZkNhdGVnb3J5UXVlcnkgPSBuZXcgQW55UmVxdWlyZWRDYXBhYmlsaXR5UXVlcnkoKChDYXRlZ29yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFJlcXVpcmVtZW50cygpKTsKLQkJCQkJaWYgKHNob3dMYXRlc3QpCi0JCQkJCQlhdmFpbGFibGVJVUNvbGxlY3RvciA9IG5ldyBMYXRlc3RJVVZlcnNpb25FbGVtZW50Q29sbGVjdG9yKHRoaXMsICgoQ2F0ZWdvcnlFbGVtZW50KSBlbGVtZW50KS5nZXRRdWVyeWFibGUoKSwgcXVlcnlDb250ZXh0LCB0cnVlKTsKLQkJCQkJZWxzZQotCQkJCQkJYXZhaWxhYmxlSVVDb2xsZWN0b3IgPSBuZXcgQXZhaWxhYmxlSVVDb2xsZWN0b3IodGhpcywgKChDYXRlZ29yeUVsZW1lbnQpIGVsZW1lbnQpLmdldFF1ZXJ5YWJsZSgpLCBxdWVyeUNvbnRleHQsIHRydWUpOwotCQkJCQlpZiAoaGlkZUluc3RhbGxlZCAmJiBpbnN0YWxsZWRRdWVyeURlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCQkJCWF2YWlsYWJsZUlVQ29sbGVjdG9yLmhpZGVJbnN0YWxsZWRJVXMoaW5zdGFsbGVkUXVlcnlEZXNjcmlwdG9yKTsKLQkJCQkJcmV0dXJuIG5ldyBFbGVtZW50UXVlcnlEZXNjcmlwdG9yKCgoQ2F0ZWdvcnlFbGVtZW50KSBlbGVtZW50KS5nZXRRdWVyeWFibGUoKSwgbmV3IENvbXBvdW5kUXVlcnkobmV3IFF1ZXJ5W10ge25ldyBDb21wb3VuZFF1ZXJ5KG5ldyBRdWVyeVtdIHtncm91cFF1ZXJ5LCBjYXRlZ29yeVF1ZXJ5fSwgZmFsc2UpLCBtZW1iZXJzT2ZDYXRlZ29yeVF1ZXJ5fSwgdHJ1ZSksIGF2YWlsYWJsZUlVQ29sbGVjdG9yKTsKLQkJCQl9Ci0JCQkJLy8gSWYgd2UgYXJlIHNob3dpbmcgb25seSB0aGUgbGF0ZXN0IHZlcnNpb24sIHdlIG5ldmVyIHJlcHJlc2VudCBvdGhlciB2ZXJzaW9ucyBhcyBjaGlsZHJlbi4KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElVVmVyc2lvbnNFbGVtZW50KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCWNhc2UgSVF1ZXJ5UHJvdmlkZXIuQVZBSUxBQkxFX1VQREFURVMgOgotCQkJCUlQcm9maWxlIHByb2ZpbGUgPSAoSVByb2ZpbGUpIFByb3ZVSS5nZXRBZGFwdGVyKGVsZW1lbnQsIElQcm9maWxlLmNsYXNzKTsKLQkJCQlJSW5zdGFsbGFibGVVbml0W10gdG9VcGRhdGU7Ci0JCQkJQ29sbGVjdG9yIGNvbGxlY3RvcjsKLQkJCQlpZiAocHJvZmlsZSAhPSBudWxsKSB7Ci0JCQkJCWNvbGxlY3RvciA9IHByb2ZpbGUucXVlcnkobmV3IElVUHJvZmlsZVByb3BlcnR5QnlJZFF1ZXJ5KHByb2ZpbGUuZ2V0UHJvZmlsZUlkKCksIElJbnN0YWxsYWJsZVVuaXQuUFJPUF9QUk9GSUxFX1JPT1RfSVUsIEJvb2xlYW4udG9TdHJpbmcodHJ1ZSkpLCBuZXcgQ29sbGVjdG9yKCksIG51bGwpOwotCQkJCQl0b1VwZGF0ZSA9IChJSW5zdGFsbGFibGVVbml0W10pIGNvbGxlY3Rvci50b0FycmF5KElJbnN0YWxsYWJsZVVuaXQuY2xhc3MpOwotCQkJCX0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFVwZGF0ZUV2ZW50KSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlwcm9maWxlID0gUHJvdmlzaW9uaW5nVXRpbC5nZXRQcm9maWxlKCgoVXBkYXRlRXZlbnQpIGVsZW1lbnQpLmdldFByb2ZpbGVJZCgpKTsKLQkJCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVByb3ZVSS5oYW5kbGVFeGNlcHRpb24oZSwgTkxTLmJpbmQoUHJvdlNES01lc3NhZ2VzLlByb3ZTREtRdWVyeVByb3ZpZGVyX0Vycm9yUmV0cmlldmluZ1Byb2ZpbGUsICgoVXBkYXRlRXZlbnQpIGVsZW1lbnQpLmdldFByb2ZpbGVJZCgpKSwgU3RhdHVzTWFuYWdlci5MT0cpOwotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQkJCQkJdG9VcGRhdGUgPSAoKFVwZGF0ZUV2ZW50KSBlbGVtZW50KS5nZXRJVXMoKTsKLQkJCQl9IGVsc2UKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJUXVlcnlhYmxlVXBkYXRlcyB1cGRhdGVRdWVyeWFibGUgPSBuZXcgUXVlcnlhYmxlVXBkYXRlcyh0b1VwZGF0ZSk7Ci0JCQkJaWYgKHNob3dMYXRlc3QpCi0JCQkJCWNvbGxlY3RvciA9IG5ldyBMYXRlc3RJVVZlcnNpb25Db2xsZWN0b3IodGhpcywgdXBkYXRlUXVlcnlhYmxlLCBxdWVyeUNvbnRleHQsIHRydWUpOwotCQkJCWVsc2UKLQkJCQkJY29sbGVjdG9yID0gbmV3IENvbGxlY3RvcigpOwotCQkJCXJldHVybiBuZXcgRWxlbWVudFF1ZXJ5RGVzY3JpcHRvcih1cGRhdGVRdWVyeWFibGUsIGFsbFF1ZXJ5LCBjb2xsZWN0b3IpOwotCQkJY2FzZSBJUXVlcnlQcm92aWRlci5JTlNUQUxMRURfSVVTIDoKLQkJCQlwcm9maWxlID0gKElQcm9maWxlKSBQcm92VUkuZ2V0QWRhcHRlcihlbGVtZW50LCBJUHJvZmlsZS5jbGFzcyk7Ci0JCQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0yMjkzNTIKLQkJCQkvLyBSb2xsYmFjayBwcm9maWxlcyBhcmUgc3BlY2lhbGl6ZWQvdGVtcG9yYXJ5IGluc3RhbmNlcyBzbyB3ZSBtdXN0IHVzZSBhIHF1ZXJ5IHRoYXQgdXNlcyB0aGUgcHJvZmlsZSBpbnN0YW5jZSwgbm90IHRoZSBpZC4KLQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFJvbGxiYWNrUHJvZmlsZUVsZW1lbnQpCi0JCQkJCXJldHVybiBuZXcgRWxlbWVudFF1ZXJ5RGVzY3JpcHRvcihwcm9maWxlLCBuZXcgSVVQcm9maWxlUHJvcGVydHlRdWVyeShwcm9maWxlLCBJSW5zdGFsbGFibGVVbml0LlBST1BfUFJPRklMRV9ST09UX0lVLCBCb29sZWFuLnRvU3RyaW5nKHRydWUpKSwgbmV3IEluc3RhbGxlZElVQ29sbGVjdG9yKHRoaXMsIHByb2ZpbGUsIHF1ZXJ5Q29udGV4dCkpOwotCQkJCXJldHVybiBuZXcgRWxlbWVudFF1ZXJ5RGVzY3JpcHRvcihwcm9maWxlLCBuZXcgSVVQcm9maWxlUHJvcGVydHlCeUlkUXVlcnkocHJvZmlsZS5nZXRQcm9maWxlSWQoKSwgSUluc3RhbGxhYmxlVW5pdC5QUk9QX1BST0ZJTEVfUk9PVF9JVSwgQm9vbGVhbi50b1N0cmluZyh0cnVlKSksIG5ldyBJbnN0YWxsZWRJVUNvbGxlY3Rvcih0aGlzLCBwcm9maWxlLCBxdWVyeUNvbnRleHQpKTsKLQkJCWNhc2UgSVF1ZXJ5UHJvdmlkZXIuTUVUQURBVEFfUkVQT1MgOgotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWV0YWRhdGFSZXBvc2l0b3JpZXMpIHsKLQkJCQkJTWV0YWRhdGFSZXBvc2l0b3JpZXMgbWV0YVJlcG9zID0gKE1ldGFkYXRhUmVwb3NpdG9yaWVzKSBlbGVtZW50OwotCQkJCQlpZiAobWV0YVJlcG9zLmdldE1ldGFkYXRhUmVwb3NpdG9yaWVzKCkgPT0gbnVsbCkKLQkJCQkJCW1ldGFSZXBvcy5zZXRSZXBvRmxhZ3MoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX05PTl9TWVNURU0pOwotCQkJCQlxdWVyeWFibGUgPSBuZXcgUXVlcnlhYmxlTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcihtZXRhUmVwb3MpOwotCQkJCQltZXRhUmVwb3Muc2V0UXVlcnlhYmxlKHF1ZXJ5YWJsZSk7Ci0JCQkJCXJldHVybiBuZXcgRWxlbWVudFF1ZXJ5RGVzY3JpcHRvcihxdWVyeWFibGUsIG51bGwsIG5ldyBNZXRhZGF0YVJlcG9zaXRvcnlFbGVtZW50Q29sbGVjdG9yKHRoaXMsIHF1ZXJ5Q29udGV4dCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWNhc2UgSVF1ZXJ5UHJvdmlkZXIuUFJPRklMRVMgOgotCQkJCXF1ZXJ5YWJsZSA9IG5ldyBRdWVyeWFibGVQcm9maWxlUmVnaXN0cnkoKTsKLQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRRdWVyeURlc2NyaXB0b3IocXVlcnlhYmxlLCBuZXcgUXVlcnkoKSB7Ci0JCQkJCXB1YmxpYyBib29sZWFuIGlzTWF0Y2goT2JqZWN0IGNhbmRpZGF0ZSkgewotCQkJCQkJcmV0dXJuIFByb3ZVSS5nZXRBZGFwdGVyKGNhbmRpZGF0ZSwgSVByb2ZpbGUuY2xhc3MpICE9IG51bGw7Ci0JCQkJCX0KLQkJCQl9LCBuZXcgUHJvZmlsZUVsZW1lbnRDb2xsZWN0b3IodGhpcywgbnVsbCwgcXVlcnlDb250ZXh0KSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL1Byb3ZTREtVSUFjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvUHJvdlNES1VJQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNDhjOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvUHJvdlNES1VJQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLnByZWZzLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGsudXBkYXRlcy5BdXRvbWF0aWNVcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5JU2VydmljZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLklQcm92aXNpb25pbmdFdmVudEJ1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLlByb3Zpc2lvbmluZ1BsYW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUuSVByb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5vcGVyYXRpb25zLlByb3Zpc2lvbmluZ1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5wb2xpY3kuSVBsYW5WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5wb2xpY3kuSVF1ZXJ5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuc3RhdHVzaGFuZGxlcnMuU3RhdHVzTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBBY3RpdmF0b3IgY2xhc3MgZm9yIHRoZSBwMiBVSS4KLSAqLwotcHVibGljIGNsYXNzIFByb3ZTREtVSUFjdGl2YXRvciBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEFOWV9QUk9GSUxFID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUFJPRklMRV9JRCA9ICJEZWZhdWx0UHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElDRU5TRV9TVE9SQUdFID0gImxpY2Vuc2VzLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBQcm92U0RLVUlBY3RpdmF0b3IgcGx1Z2luOwotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIEF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlciBzY2hlZHVsZXI7Ci0JcHJpdmF0ZSBBdXRvbWF0aWNVcGRhdGVyIHVwZGF0ZXI7Ci0JcHJpdmF0ZSBJUXVlcnlQcm92aWRlciBxdWVyeVByb3ZpZGVyOwotCXByaXZhdGUgU2ltcGxlTGljZW5zZU1hbmFnZXIgbGljZW5zZU1hbmFnZXI7Ci0JcHJpdmF0ZSBJUGxhblZhbGlkYXRvciBwbGFuVmFsaWRhdG9yOwotCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiBjZXJ0aWZpY2F0ZVVJUmVnaXN0cmF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBwbHVnaW4gaW5zdGFuY2UKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvdlNES1VJQWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZvciB0aGUgaW1hZ2UgZmlsZSBhdCB0aGUgZ2l2ZW4gcGx1Zy1pbgotCSAqIHJlbGF0aXZlIHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGgKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBwYXRoKSB7Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTl9JRCwgcGF0aCk7Ci0JfQotCi0JcHVibGljIFByb3ZTREtVSUFjdGl2YXRvcigpIHsKLQkJLy8gY29uc3RydWN0b3IKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGJ1bmRsZUNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCQlQcm92U0RLVUlBY3RpdmF0b3IuY29udGV4dCA9IGJ1bmRsZUNvbnRleHQ7Ci0JCXJlYWRMaWNlbnNlUmVnaXN0cnkoKTsKLQkJY2VydGlmaWNhdGVVSVJlZ2lzdHJhdGlvbiA9IGNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKElTZXJ2aWNlVUkuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgVmFsaWRhdGlvbkRpYWxvZ1NlcnZpY2VVSSgpLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZExpY2Vuc2VSZWdpc3RyeSgpIHsKLQkJSVBhdGggbG9jYXRpb24gPSBnZXRTdGF0ZUxvY2F0aW9uKCkuYXBwZW5kKExJQ0VOU0VfU1RPUkFHRSk7Ci0JCUZpbGUgZiA9IGxvY2F0aW9uLnRvRmlsZSgpOwotCQlCdWZmZXJlZElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0JCWlmIChmLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCXN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0oZikpOwotCQkJCWdldExpY2Vuc2VNYW5hZ2VyKCkucmVhZChzdHJlYW0pOwotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVByb3ZVSS5yZXBvcnRTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIDAsIFByb3ZTREtNZXNzYWdlcy5Qcm92U0RLVUlBY3RpdmF0b3JfTGljZW5zZU1hbmFnZXJSZWFkRXJyb3IsIGUpLCBTdGF0dXNNYW5hZ2VyLkxPRyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVMaWNlbnNlUmVnaXN0cnkoKSB7Ci0JCWlmICghZ2V0TGljZW5zZU1hbmFnZXIoKS5oYXNBY2NlcHRlZExpY2Vuc2VzKCkpCi0JCQlyZXR1cm47Ci0JCUlQYXRoIGxvY2F0aW9uID0gZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChMSUNFTlNFX1NUT1JBR0UpOwotCQlGaWxlIGYgPSBsb2NhdGlvbi50b0ZpbGUoKTsKLQkJQnVmZmVyZWRPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmLCBmYWxzZSkpOwotCQkJZ2V0TGljZW5zZU1hbmFnZXIoKS53cml0ZShzdHJlYW0pOwotCQkJc3RyZWFtLmNsb3NlKCk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVByb3ZVSS5yZXBvcnRTdGF0dXMobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBQTFVHSU5fSUQsIDAsIFByb3ZTREtNZXNzYWdlcy5Qcm92U0RLVUlBY3RpdmF0b3JfRXJyb3JXcml0aW5nTGljZW5zZVJlZ2lzdHJ5LCBlKSwgU3RhdHVzTWFuYWdlci5MT0cpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQl3cml0ZUxpY2Vuc2VSZWdpc3RyeSgpOwotCQlpZiAoc2NoZWR1bGVyICE9IG51bGwpIHsKLQkJCXNjaGVkdWxlci5zaHV0ZG93bigpOwotCQkJc2NoZWR1bGVyID0gbnVsbDsKLQkJfQotCQlpZiAodXBkYXRlciAhPSBudWxsKSB7Ci0JCQl1cGRhdGVyLnNodXRkb3duKCk7Ci0JCQl1cGRhdGVyID0gbnVsbDsKLQkJfQotCQlwbHVnaW4gPSBudWxsOwotCQljZXJ0aWZpY2F0ZVVJUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLQkJc3VwZXIuc3RvcChidW5kbGVDb250ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgQXV0b21hdGljVXBkYXRlU2NoZWR1bGVyIGdldFNjaGVkdWxlcigpIHsKLQkJLy8gSWYgdGhlIHNjaGVkdWxlciB3YXMgZGlzYWJsZWQsIGl0IGRvZXMgbm90IGdldCBpbml0aWFsaXplZAotCQlpZiAoc2NoZWR1bGVyID09IG51bGwpCi0JCQlzY2hlZHVsZXIgPSBuZXcgQXV0b21hdGljVXBkYXRlU2NoZWR1bGVyKCk7Ci0JCXJldHVybiBzY2hlZHVsZXI7Ci0JfQotCi0JcHVibGljIElQcm92aXNpb25pbmdFdmVudEJ1cyBnZXRQcm92aXNpb25pbmdFdmVudEJ1cygpIHsKLQkJU2VydmljZVJlZmVyZW5jZSBidXNSZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoSVByb3Zpc2lvbmluZ0V2ZW50QnVzLlNFUlZJQ0VfTkFNRSk7Ci0JCWlmIChidXNSZWZlcmVuY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElQcm92aXNpb25pbmdFdmVudEJ1cykgY29udGV4dC5nZXRTZXJ2aWNlKGJ1c1JlZmVyZW5jZSk7Ci0JfQotCi0JcHVibGljIEF1dG9tYXRpY1VwZGF0ZXIgZ2V0QXV0b21hdGljVXBkYXRlcigpIHsKLQkJaWYgKHVwZGF0ZXIgPT0gbnVsbCkKLQkJCXVwZGF0ZXIgPSBuZXcgQXV0b21hdGljVXBkYXRlcigpOwotCQlyZXR1cm4gdXBkYXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGlkIG9mIHRoZSBwcm9maWxlIGZvciB0aGUgcnVubmluZyBzeXN0ZW0uICBUaHJvdyBhIFByb3Zpc2lvbkV4Y2VwdGlvbgotCSAqIGlmIG5vIHNlbGYgcHJvZmlsZSBpcyBhdmFpbGFibGUsIHVubGVzcyBjb25maWd1cmVkIHRvIGFuc3dlciBhbnkKLQkgKiBwcm9maWxlLiAgR2V0dGluZyBhbnkgcHJvZmlsZSBhbGxvd3MgdGVzdGluZyBvZiB0aGUKLQkgKiBVSSBldmVuIHdoZW4gdGhlIHN5c3RlbSBpcyBub3Qgc2VsZiBob3N0aW5nLiAgCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2VsZlByb2ZpbGVJZCgpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQkvLyBHZXQgdGhlIHByb2ZpbGUgb2YgdGhlIHJ1bm5pbmcgc3lzdGVtLgotCQlJUHJvZmlsZSBwcm9maWxlID0gUHJvdmlzaW9uaW5nVXRpbC5nZXRQcm9maWxlKElQcm9maWxlUmVnaXN0cnkuU0VMRik7Ci0JCWlmIChwcm9maWxlID09IG51bGwpIHsKLQkJCWlmIChBTllfUFJPRklMRSkgewotCQkJCVByb3ZVSS5yZXBvcnRTdGF0dXMoZ2V0Tm9TZWxmUHJvZmlsZVN0YXR1cygpLCBTdGF0dXNNYW5hZ2VyLkxPRyk7Ci0JCQkJSVByb2ZpbGVbXSBwcm9maWxlcyA9IFByb3Zpc2lvbmluZ1V0aWwuZ2V0UHJvZmlsZXMoKTsKLQkJCQlpZiAocHJvZmlsZXMubGVuZ3RoID4gMCkKLQkJCQkJcmV0dXJuIHByb2ZpbGVzWzBdLmdldFByb2ZpbGVJZCgpOwotCQkJCXJldHVybiBQcm9maWxlRmFjdG9yeS5tYWtlUHJvZmlsZShERUZBVUxUX1BST0ZJTEVfSUQpLmdldFByb2ZpbGVJZCgpOwotCQkJfQotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihnZXROb1NlbGZQcm9maWxlU3RhdHVzKCkpOwotCQl9Ci0JCXJldHVybiBwcm9maWxlLmdldFByb2ZpbGVJZCgpOwotCX0KLQotCXZvaWQgc2V0U2NoZWR1bGVyKEF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlciBzY2hlZHVsZXIpIHsKLQkJdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7Ci0JfQotCi0Jc3RhdGljIElTdGF0dXMgZ2V0Tm9TZWxmUHJvZmlsZVN0YXR1cygpIHsKLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5XQVJOSU5HLCBQTFVHSU5fSUQsIFByb3ZTREtNZXNzYWdlcy5Qcm92U0RLVUlBY3RpdmF0b3JfTm9TZWxmUHJvZmlsZSk7Ci0JfQotCi0JcHVibGljIElRdWVyeVByb3ZpZGVyIGdldFF1ZXJ5UHJvdmlkZXIoKSB7Ci0JCWlmIChxdWVyeVByb3ZpZGVyID09IG51bGwpCi0JCQlxdWVyeVByb3ZpZGVyID0gbmV3IFByb3ZTREtRdWVyeVByb3ZpZGVyKCk7Ci0JCXJldHVybiBxdWVyeVByb3ZpZGVyOwotCX0KLQotCXB1YmxpYyBTaW1wbGVMaWNlbnNlTWFuYWdlciBnZXRMaWNlbnNlTWFuYWdlcigpIHsKLQkJaWYgKGxpY2Vuc2VNYW5hZ2VyID09IG51bGwpCi0JCQlsaWNlbnNlTWFuYWdlciA9IG5ldyBTaW1wbGVMaWNlbnNlTWFuYWdlcigpOwotCQlyZXR1cm4gbGljZW5zZU1hbmFnZXI7Ci0JfQotCi0JcHVibGljIElQbGFuVmFsaWRhdG9yIGdldFBsYW5WYWxpZGF0b3IoKSB7Ci0JCWlmIChwbGFuVmFsaWRhdG9yID09IG51bGwpCi0JCQlwbGFuVmFsaWRhdG9yID0gbmV3IElQbGFuVmFsaWRhdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGNvbnRpbnVlV29ya2luZ1dpdGhQbGFuKFByb3Zpc2lvbmluZ1BsYW4gcGxhbiwgU2hlbGwgc2hlbGwpIHsKLQkJCQkJaWYgKHBsYW4gPT0gbnVsbCkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJLy8gSWYgdGhlIHBsYW4gcmVxdWlyZXMgaW5zdGFsbCBoYW5kbGVyIHN1cHBvcnQsIHdlIHdhbnQgdG8gb3BlbiB0aGUgb2xkIHVwZGF0ZSBVSQotCQkJCQlpZiAoVXBkYXRlTWFuYWdlckNvbXBhdGliaWxpdHkucmVxdWlyZXNJbnN0YWxsSGFuZGxlclN1cHBvcnQocGxhbikpIHsKLQkJCQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coc2hlbGwsIFByb3ZTREtNZXNzYWdlcy5Qcm92U0RLVUlBY3RpdmF0b3JfVW5zdXBwb3J0ZWRGZWF0dXJlVGl0bGUsIG51bGwsIFByb3ZTREtNZXNzYWdlcy5Qcm92U0RLVUlBY3RpdmF0b3JfVW5zdXBwb3J0ZWRGZWF0dXJlTWVzc2FnZSwgTWVzc2FnZURpYWxvZy5XQVJOSU5HLCBuZXcgU3RyaW5nW10ge1Byb3ZTREtNZXNzYWdlcy5Qcm92U0RLVUlBY3RpdmF0b3JfTGF1bmNoVXBkYXRlTWFuYWdlciwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUx9LCAwKTsKLQkJCQkJCWlmIChkaWFsb2cub3BlbigpID09IDApCi0JCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoc2hlbGwuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJCVVwZGF0ZU1hbmFnZXJDb21wYXRpYmlsaXR5Lm9wZW5JbnN0YWxsZXIoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0pOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJLy8gU3BlY2lhbCBjYXNlIHRob3NlIHN0YXR1c2VzIHdoZXJlIHdlIHdvdWxkIG5ldmVyIHdhbnQgdG8gb3BlbiBhIHdpemFyZAotCQkJCQlpZiAocGxhbi5nZXRTdGF0dXMoKS5nZXRDb2RlKCkgPT0gSVN0YXR1c0NvZGVzLk5PVEhJTkdfVE9fVVBEQVRFKSB7Ci0JCQkJCQlQcm92VUkucmVwb3J0U3RhdHVzKHBsYW4uZ2V0U3RhdHVzKCksIFN0YXR1c01hbmFnZXIuQkxPQ0spOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJLy8gQWxsb3cgdGhlIHdpemFyZCB0byBvcGVuIGlmIHRoZXJlIGlzIG5vIGVycm9yCi0JCQkJCWlmIChwbGFuLmdldFN0YXR1cygpLmdldFNldmVyaXR5KCkgIT0gSVN0YXR1cy5FUlJPUikKLQkJCQkJCXJldHVybiB0cnVlOwotCi0JCQkJCS8vIFRoZXJlIGlzIGFuIGVycm9yLiAgQ2hlY2sgdGhlIHByZWZlcmVuY2UgdG8gc2VlIHdoZXRoZXIgdG8gY29udGludWUuCi0JCQkJCVN0cmluZyBvcGVuUGxhbiA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfT1BFTl9XSVpBUkRfT05fRVJST1JfUExBTik7Ci0JCQkJCWlmIChNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5BTFdBWVMuZXF1YWxzKG9wZW5QbGFuKSkgewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQkJaWYgKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSLmVxdWFscyhvcGVuUGxhbikpIHsKLQkJCQkJCVByb3ZVSS5yZXBvcnRTdGF0dXMocGxhbi5nZXRTdGF0dXMoKSwgU3RhdHVzTWFuYWdlci5TSE9XIHwgU3RhdHVzTWFuYWdlci5MT0cpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJCU1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlIGRpYWxvZyA9IE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLm9wZW5ZZXNOb0NhbmNlbFF1ZXN0aW9uKHNoZWxsLCBQcm92U0RLTWVzc2FnZXMuUHJvdlNES1VJQWN0aXZhdG9yX1F1ZXN0aW9uLCBQcm92U0RLTWVzc2FnZXMuUHJvdlNES1VJQWN0aXZhdG9yX09wZW5XaXphcmRBbnl3YXksIG51bGwsIGZhbHNlLCBnZXRQcmVmZXJlbmNlU3RvcmUoKSwgUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX09QRU5fV0laQVJEX09OX0VSUk9SX1BMQU4pOwotCi0JCQkJCS8vIEFueSBhbnN3ZXIgYnV0IHllcyB3aWxsIHN0b3AgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBwbGFuLCBidXQgTk8gaXMgaW50ZXJwcmV0ZWQgdG8gbWVhbiwgc2hvdyBtZSB0aGUgZXJyb3IuCi0JCQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IElEaWFsb2dDb25zdGFudHMuTk9fSUQpCi0JCQkJCQlQcm92VUkucmVwb3J0U3RhdHVzKHBsYW4uZ2V0U3RhdHVzKCksIFN0YXR1c01hbmFnZXIuU0hPVyB8IFN0YXR1c01hbmFnZXIuTE9HKTsKLQkJCQkJcmV0dXJuIGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gSURpYWxvZ0NvbnN0YW50cy5ZRVNfSUQ7Ci0JCQkJfQotCi0JCQl9OwotCQlyZXR1cm4gcGxhblZhbGlkYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9SZW1vdmVDb2xvY2F0ZWRSZXBvc2l0b3J5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9SZW1vdmVDb2xvY2F0ZWRSZXBvc2l0b3J5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyOTI0ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvUmVtb3ZlQ29sb2NhdGVkUmVwb3NpdG9yeUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGs7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLm9wZXJhdGlvbnMuUHJvdmlzaW9uaW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkub3BlcmF0aW9ucy5SZW1vdmVDb2xvY2F0ZWRSZXBvc2l0b3J5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlQ29sb2NhdGVkUmVwb3NpdG9yeUFjdGlvbiBleHRlbmRzIENvbG9jYXRlZFJlcG9zaXRvcnlBY3Rpb24gewotCi0JcHVibGljIFJlbW92ZUNvbG9jYXRlZFJlcG9zaXRvcnlBY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyLCBTaGVsbCBzaGVsbCkgewotCQlzdXBlcihQcm92U0RLTWVzc2FnZXMuUmVtb3ZlQ29sb2NhdGVkUmVwb3NpdG9yeUFjdGlvbl9MYWJlbCwgUHJvdlNES01lc3NhZ2VzLlJlbW92ZUNvbG9jYXRlZFJlcG9zaXRvcnlBY3Rpb25fVG9vbHRpcCwgc2VsZWN0aW9uUHJvdmlkZXIsIHNoZWxsKTsKLQotCX0KLQotCXByb3RlY3RlZCBQcm92aXNpb25pbmdPcGVyYXRpb24gZ2V0T3BlcmF0aW9uKCkgewotCQlyZXR1cm4gbmV3IFJlbW92ZUNvbG9jYXRlZFJlcG9zaXRvcnlPcGVyYXRpb24oUHJvdlNES01lc3NhZ2VzLlJlcG9zaXRvcnlNYW5pcHVsYXRpb25EaWFsb2dfUmVtb3ZlT3BlcmF0aW9uTGFiZWwsIGdldFNlbGVjdGVkVVJMcyhnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCkudG9BcnJheSgpKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvU3RhdHVzTGluZUNMYWJlbENvbnRyaWJ1dGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvU3RhdHVzTGluZUNMYWJlbENvbnRyaWJ1dGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDIyMmEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL1N0YXR1c0xpbmVDTGFiZWxDb250cmlidXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGs7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLQotLyoqCi0gKiBAc2luY2UgMy40Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdGF0dXNMaW5lQ0xhYmVsQ29udHJpYnV0aW9uIGV4dGVuZHMgQ29udHJpYnV0aW9uSXRlbSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBERUZBVUxUX0NIQVJfV0lEVEggPSA0MDsKLQotCXByaXZhdGUgaW50IGNoYXJXaWR0aDsKLQlwcml2YXRlIENMYWJlbCBsYWJlbDsKLQlwcml2YXRlIEltYWdlIGltYWdlOwotCXByaXZhdGUgU3RyaW5nIHRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgaW50IHdpZHRoSGludCA9IC0xOwotCXByaXZhdGUgaW50IGhlaWdodEhpbnQgPSAtMTsKLQotCXByaXZhdGUgTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJpdmF0ZSBpbnQgZXZlbnRUeXBlOwotCXByaXZhdGUgU3RyaW5nIHRvb2x0aXA7Ci0KLQlwdWJsaWMgU3RhdHVzTGluZUNMYWJlbENvbnRyaWJ1dGlvbihTdHJpbmcgaWQsIGludCBjaGFyV2lkdGgpIHsKLQkJc3VwZXIoaWQpOwotCQl0aGlzLmNoYXJXaWR0aCA9IGNoYXJXaWR0aDsKLQkJc2V0VmlzaWJsZShmYWxzZSk7IC8vIG5vIHRleHQgdG8gc3RhcnQgd2l0aAotCX0KLQotCXB1YmxpYyB2b2lkIGZpbGwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlsYWJlbCA9IG5ldyBDTGFiZWwocGFyZW50LCBTV1QuREVGQVVMVCk7Ci0JCVN0YXR1c0xpbmVMYXlvdXREYXRhIHN0YXR1c0xpbmVMYXlvdXREYXRhID0gbmV3IFN0YXR1c0xpbmVMYXlvdXREYXRhKCk7Ci0KLQkJaWYgKHdpZHRoSGludCA8IDApIHsKLQkJCUdDIGdjID0gbmV3IEdDKHBhcmVudCk7Ci0JCQlnYy5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQkJRm9udE1ldHJpY3MgZm0gPSBnYy5nZXRGb250TWV0cmljcygpOwotCQkJd2lkdGhIaW50ID0gZm0uZ2V0QXZlcmFnZUNoYXJXaWR0aCgpICogY2hhcldpZHRoOwotCQkJaGVpZ2h0SGludCA9IGZtLmdldEhlaWdodCgpOwotCQkJZ2MuZGlzcG9zZSgpOwotCQl9Ci0KLQkJc3RhdHVzTGluZUxheW91dERhdGEud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKHN0YXR1c0xpbmVMYXlvdXREYXRhKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJbGFiZWwuc2V0SW1hZ2UoaW1hZ2UpOwotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJbGFiZWwuYWRkTGlzdGVuZXIoZXZlbnRUeXBlLCBsaXN0ZW5lcik7Ci0JCX0KLQkJaWYgKHRvb2x0aXAgIT0gbnVsbCkgewotCQkJbGFiZWwuc2V0VG9vbFRpcFRleHQodG9vbHRpcCk7Ci0JCX0KLQotCQlzdGF0dXNMaW5lTGF5b3V0RGF0YSA9IG5ldyBTdGF0dXNMaW5lTGF5b3V0RGF0YSgpOwotCQlzdGF0dXNMaW5lTGF5b3V0RGF0YS5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihpbnQgdHlwZSwgTGlzdGVuZXIgbGFiZWxMaXN0ZW5lcikgewotCQl0aGlzLmV2ZW50VHlwZSA9IHR5cGU7Ci0JCXRoaXMubGlzdGVuZXIgPSBsYWJlbExpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCXRoaXMudGV4dCA9IHRleHQ7Ci0KLQkJaWYgKGxhYmVsICE9IG51bGwgJiYgIWxhYmVsLmlzRGlzcG9zZWQoKSkKLQkJCWxhYmVsLnNldFRleHQodGhpcy50ZXh0KTsKLQotCQlpZiAodGhpcy50ZXh0Lmxlbmd0aCgpID09IDApIHsKLQkJCWlmIChpc1Zpc2libGUoKSkgewotCQkJCXNldFZpc2libGUoZmFsc2UpOwotCQkJCUlDb250cmlidXRpb25NYW5hZ2VyIGNvbnRyaWJ1dGlvbk1hbmFnZXIgPSBnZXRQYXJlbnQoKTsKLQotCQkJCWlmIChjb250cmlidXRpb25NYW5hZ2VyICE9IG51bGwpCi0JCQkJCWNvbnRyaWJ1dGlvbk1hbmFnZXIudXBkYXRlKHRydWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKCFpc1Zpc2libGUoKSkgewotCQkJCXNldFZpc2libGUodHJ1ZSk7Ci0JCQkJSUNvbnRyaWJ1dGlvbk1hbmFnZXIgY29udHJpYnV0aW9uTWFuYWdlciA9IGdldFBhcmVudCgpOwotCi0JCQkJaWYgKGNvbnRyaWJ1dGlvbk1hbmFnZXIgIT0gbnVsbCkKLQkJCQkJY29udHJpYnV0aW9uTWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUb29sdGlwKFN0cmluZyB0b29sdGlwKSB7Ci0JCWlmICh0b29sdGlwID09IG51bGwpCi0JCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLQotCQl0aGlzLnRvb2x0aXAgPSB0b29sdGlwOwotCi0JCWlmIChsYWJlbCAhPSBudWxsICYmICFsYWJlbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWxhYmVsLnNldFRvb2xUaXBUZXh0KHRoaXMudG9vbHRpcCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbWFnZShJbWFnZSBpbWFnZSkgewotCQlpZiAoaW1hZ2UgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotCi0JCXRoaXMuaW1hZ2UgPSBpbWFnZTsKLQotCQlpZiAobGFiZWwgIT0gbnVsbCAmJiAhbGFiZWwuaXNEaXNwb3NlZCgpKQotCQkJbGFiZWwuc2V0SW1hZ2UodGhpcy5pbWFnZSk7Ci0KLQkJaWYgKCFpc1Zpc2libGUoKSkgewotCQkJc2V0VmlzaWJsZSh0cnVlKTsKLQkJCUlDb250cmlidXRpb25NYW5hZ2VyIGNvbnRyaWJ1dGlvbk1hbmFnZXIgPSBnZXRQYXJlbnQoKTsKLQotCQkJaWYgKGNvbnRyaWJ1dGlvbk1hbmFnZXIgIT0gbnVsbCkKLQkJCQljb250cmlidXRpb25NYW5hZ2VyLnVwZGF0ZSh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL1VwZGF0ZUFuZEluc3RhbGxEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL1VwZGF0ZUFuZEluc3RhbGxEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkxNzkxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9VcGRhdGVBbmRJbnN0YWxsRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGsucHJlZnMuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLlByb3Zpc2lvbmluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLmFjdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLm9wZXJhdGlvbnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnBvbGljeS5JUXVlcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnNkay5Qcm92UG9saWNpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5zZGsuUmVwb3NpdG9yeU1hbmlwdWxhdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlclByb3Zpc2lvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuU2FtZVNoZWxsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLQotLyoqCi0gKiBEaWFsb2cgdGhhdCBhbGxvd3MgdXNlcnMgdG8gdXBkYXRlIHRoZWlyIGluc3RhbGxlZCBJVSdzIG9yIGZpbmQgbmV3IG9uZXMuCi0gKiAKLSAqIEBzaW5jZSAzLjQKLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZUFuZEluc3RhbGxEaWFsb2cgZXh0ZW5kcyBUcmF5RGlhbG9nIGltcGxlbWVudHMgSVZpZXdNZW51UHJvdmlkZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVVRUT05BQ1RJT04gPSAiYnV0dG9uQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hFSUdIVCA9IDI0MDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9XSURUSCA9IDMwMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUl9JTkRFTlQgPSA1OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVRFX0NPTFVNTl9XSURUSF9JTl9ETFVTID0gMzAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBPVEhFUl9DT0xVTU5fV0lEVEhfSU5fRExVUyA9IDIwMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkVSVElDQUxfTUFSR0lOX0RMVSA9IDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfVklFV19UWVBFID0gQXZhaWxhYmxlSVVWaWV3UXVlcnlDb250ZXh0LlZJRVdfQllfUkVQTzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfSU5TVEFMTEVEID0gMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5ERVhfQVZBSUxBQkxFID0gMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTE9HX1NFVFRJTkdTX1NFQ1RJT04gPSAiVXBkYXRlQW5kSW5zdGFsbERpYWxvZyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNURURfVEFCX1NFVFRJTkcgPSAiU2VsZWN0ZWRUYWIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFWQUlMQUJMRV9WSUVXX1RZUEUgPSAiQXZhaWxhYmxlVmlld1R5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfTEFURVNUX1ZFUlNJT05TX09OTFkgPSAiU2hvd0xhdGVzdFZlcnNpb25zT25seSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSElERV9JTlNUQUxMRURfSVVTID0gIkhpZGVJbnN0YWxsZWRDb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIHByb2ZpbGVJZDsKLQlEaXNwbGF5IGRpc3BsYXk7Ci0JQXZhaWxhYmxlSVVWaWV3UXVlcnlDb250ZXh0IHF1ZXJ5Q29udGV4dDsKLQlUYWJGb2xkZXIgdGFiRm9sZGVyOwotCUF2YWlsYWJsZUlVR3JvdXAgYXZhaWxhYmxlSVVHcm91cDsKLQlJbnN0YWxsZWRJVUdyb3VwIGluc3RhbGxlZElVR3JvdXA7Ci0JSVJlcG9zaXRvcnlNYW5pcHVsYXRvciByZXBvc2l0b3J5TWFuaXB1bGF0b3I7Ci0JQ2hhbmdlVmlld0FjdGlvbiB2aWV3QnlSZXBvLCB2aWV3RmxhdCwgdmlld0NhdGVnb3J5OwotCUJ1dHRvbiBpbnN0YWxsZWRQcm9wQnV0dG9uLCBhdmFpbGFibGVQcm9wQnV0dG9uLCBpbnN0YWxsQnV0dG9uLCB1bmluc3RhbGxCdXR0b24sIHVwZGF0ZUJ1dHRvbiwgcmV2ZXJ0QnV0dG9uLCBtYW5pcHVsYXRlUmVwb0J1dHRvbiwgYWRkUmVwb0J1dHRvbiwgcmVtb3ZlUmVwb0J1dHRvbjsKLQlCdXR0b24gc2hvd0luc3RhbGxlZENoZWNrYm94LCBzaG93TGF0ZXN0VmVyc2lvbnNDaGVja2JveDsKLQlQcm9ncmVzc0luZGljYXRvciBwcm9ncmVzc0luZGljYXRvcjsKLQlMYWJlbCBwcm9ncmVzc0xhYmVsOwotCUlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByZWZlcmVuY2VMaXN0ZW5lcjsKLQlJSm9iQ2hhbmdlTGlzdGVuZXIgcHJvZ3Jlc3NMaXN0ZW5lcjsKLQlTdHJ1Y3R1cmVkVmlld2VyUHJvdmlzaW9uaW5nTGlzdGVuZXIgcHJvZmlsZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBjbGFzcyBDaGFuZ2VWaWV3QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkJaW50IHZpZXdUeXBlOwotCi0JCUNoYW5nZVZpZXdBY3Rpb24oU3RyaW5nIHRleHQsIGludCB2aWV3VHlwZSkgewotCQkJc3VwZXIodGV4dCwgSUFjdGlvbi5BU19SQURJT19CVVRUT04pOwotCQkJdGhpcy52aWV3VHlwZSA9IHZpZXdUeXBlOwotCQkJc2V0Q2hlY2tlZCh0aGlzLnZpZXdUeXBlID09IHF1ZXJ5Q29udGV4dC5nZXRWaWV3VHlwZSgpKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmICh0aGlzLnZpZXdUeXBlICE9IHF1ZXJ5Q29udGV4dC5nZXRWaWV3VHlwZSgpKSB7Ci0JCQkJcXVlcnlDb250ZXh0LnNldFZpZXdUeXBlKHZpZXdUeXBlKTsKLQkJCQl1cGRhdGVBdmFpbGFibGVWaWV3U3RhdGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIERpYWxvZy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgVXBkYXRlQW5kSW5zdGFsbERpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIHByb2ZpbGVJZCkgewotCQlzdXBlcihzaGVsbCk7Ci0JCWlmIChzaGVsbCAhPSBudWxsKQotCQkJdGhpcy5kaXNwbGF5ID0gc2hlbGwuZ2V0RGlzcGxheSgpOwotCQllbHNlCi0JCQl0aGlzLmRpc3BsYXkgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQkJdGhpcy5wcm9maWxlSWQgPSBwcm9maWxlSWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgc2hlbGwpIHsKLQkJc2hlbGwuc2V0VGV4dChQcm92U0RLTWVzc2FnZXMuVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19UaXRsZSk7Ci0JCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKHNoZWxsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHQyBnYyA9IG5ldyBHQyhjb21wKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWNvbXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJY29tcC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlnYy5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQotCQljcmVhdGVUYWJGb2xkZXIoY29tcCk7Ci0KLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXByZWZlcmVuY2VMaXN0ZW5lciA9IG5ldyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1NIT1dfTEFURVNUX1ZFUlNJT04pKQotCQkJCQlhdmFpbGFibGVJVUdyb3VwLmdldFN0cnVjdHVyZWRWaWV3ZXIoKS5yZWZyZXNoKCk7Ci0JCQl9Ci0JCX07Ci0JCXN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIocHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJY29tcC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBlKSB7Ci0JCQkJaGFuZGxlRGlzcG9zZSgpOwotCQkJfQotCQl9KTsKLQotCQlMaW5rIHVwZGF0ZVByZWZzTGluayA9IG5ldyBMaW5rKGNvbXAsIFNXVC5MRUZUIHwgU1dULldSQVApOwotCQl1cGRhdGVQcmVmc0xpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJCQlQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1BBR0VfQVVUT19VUERBVEVTLCBudWxsLCBudWxsKTsKLQkJCQlkaWFsb2cub3BlbigpOwotCQkJfQotCQl9KTsKLQkJdXBkYXRlUHJlZnNMaW5rLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLlVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfUHJlZkxpbmspOwotCQljcmVhdGVQcm9ncmVzc0FyZWEoY29tcCk7Ci0JCWluaXRpYWxpemVXaWRnZXRTdGF0ZSgpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGNvbXApOwotCQlyZXR1cm4gY29tcDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVdpZGdldFN0YXRlKCkgewotCQkvLyBTZXQgd2lkZ2V0cyBhY2NvcmRpbmcgdG8gcXVlcnkgY29udGV4dAotCQlzaG93SW5zdGFsbGVkQ2hlY2tib3guc2V0U2VsZWN0aW9uKCFxdWVyeUNvbnRleHQuZ2V0SGlkZUFscmVhZHlJbnN0YWxsZWQoKSk7Ci0JCXNob3dMYXRlc3RWZXJzaW9uc0NoZWNrYm94LnNldFNlbGVjdGlvbihxdWVyeUNvbnRleHQuZ2V0U2hvd0xhdGVzdFZlcnNpb25zT25seSgpKTsKLQkJdXBkYXRlVHJlZUNvbHVtbnMoKTsKLQkJQ29udHJvbCBmb2N1c0NvbnRyb2wgPSBudWxsOwotCQlpZiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gSU5ERVhfSU5TVEFMTEVEKQotCQkJZm9jdXNDb250cm9sID0gaW5zdGFsbGVkSVVHcm91cC5nZXREZWZhdWx0Rm9jdXNDb250cm9sKCk7Ci0JCWVsc2UKLQkJCWZvY3VzQ29udHJvbCA9IGF2YWlsYWJsZUlVR3JvdXAuZ2V0RGVmYXVsdEZvY3VzQ29udHJvbCgpOwotCQlpZiAoZm9jdXNDb250cm9sICE9IG51bGwpCi0JCQlmb2N1c0NvbnRyb2wuc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlVGFiRm9sZGVyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkvLyB0YWIgZm9sZGVyCi0JCXRhYkZvbGRlciA9IG5ldyBUYWJGb2xkZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJZ2QuaGVpZ2h0SGludCA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhERUZBVUxUX0hFSUdIVCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlnZC5ncmFiRXhjZXNzVmVydGljYWxTcGFjZSA9IHRydWU7Ci0JCXRhYkZvbGRlci5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLyBJbnN0YWxsZWQgYW5kIEF2YWlsYWJsZSB0YWJzCi0JCVRhYkl0ZW0gaW5zdGFsbGVkVGFiID0gbmV3IFRhYkl0ZW0odGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWluc3RhbGxlZFRhYi5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5VcGRhdGVBbmRJbnN0YWxsRGlhbG9nX0luc3RhbGxlZFNvZnR3YXJlKTsKLQotCQlUYWJJdGVtIGF2YWlsYWJsZVRhYiA9IG5ldyBUYWJJdGVtKHRhYkZvbGRlciwgU1dULk5PTkUpOwotCQlhdmFpbGFibGVUYWIuc2V0VGV4dChQcm92U0RLTWVzc2FnZXMuVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19BdmFpbGFibGVTb2Z0d2FyZSk7Ci0KLQkJLy8gUmVhZGluZyB0aGUgc2V0dGluZ3Mgd2lsbCBhbHNvIGluaXRpYWxpemUgdGhlIHF1ZXJ5IGNvbnRleHQsIHNvIGRvIHRoaXMgYmVmb3JlCi0JCS8vIGNyZWF0aW5nIHRoZSBpbmRpdmlkdWFsIHBhZ2VzLCB3aGljaCBjb25zdWx0IHRoZSBjb250ZXh0LgotCQlyZWFkRGlhbG9nU2V0dGluZ3MoKTsKLQotCQkvLyBOb3cgY3JlYXRlIHRoZSBhY3R1YWwgcGFnZXMuCi0JCWluc3RhbGxlZFRhYi5zZXRDb250cm9sKGNyZWF0ZUluc3RhbGxlZElVc1BhZ2UodGFiRm9sZGVyKSk7Ci0JCWF2YWlsYWJsZVRhYi5zZXRDb250cm9sKGNyZWF0ZUF2YWlsYWJsZUlVc1BhZ2UodGFiRm9sZGVyKSk7Ci0KLQkJc2V0RHJvcFRhcmdldCh0YWJGb2xkZXIpOwotCi0JCXRhYkZvbGRlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJVGFiSXRlbSBpdGVtID0gKFRhYkl0ZW0pIGV2ZW50Lml0ZW07Ci0JCQkJQ29udHJvbCBjb250cm9sID0gaXRlbS5nZXRDb250cm9sKCk7Ci0JCQkJaWYgKGNvbnRyb2wgIT0gbnVsbCkgewotCQkJCQljb250cm9sLnNldEZvY3VzKCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJvZ3Jlc3NBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCQlwcm9ncmVzc0xhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwcm9ncmVzc0luZGljYXRvciA9IG5ldyBQcm9ncmVzc0luZGljYXRvcihjb21wb3NpdGUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJcHJvZ3Jlc3NJbmRpY2F0b3Iuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXByb2dyZXNzTGlzdGVuZXIgPSBuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQljaGVja1Byb2dyZXNzSW5kaWNhdG9yKG51bGwpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHNjaGVkdWxlZChmaW5hbCBJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWNoZWNrUHJvZ3Jlc3NJbmRpY2F0b3IoZXZlbnQuZ2V0Sm9iKCkuZ2V0TmFtZSgpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9OwotCQlQcm92aXNpb25pbmdPcGVyYXRpb25SdW5uZXIuYWRkSm9iQ2hhbmdlTGlzdGVuZXIocHJvZ3Jlc3NMaXN0ZW5lcik7Ci0JCWNoZWNrUHJvZ3Jlc3NJbmRpY2F0b3IobnVsbCk7Ci0JfQotCi0JLy8gTWF5IGJlIGNhbGxlZCBmcm9tIGFuIGFzeW5jIGV4ZWMsIHNvIGNoZWNrIHRoYXQgd2UgYXJlIHN0aWxsCi0JLy8gYWxpdmUuCi0Jdm9pZCBjaGVja1Byb2dyZXNzSW5kaWNhdG9yKFN0cmluZyBqb2JOYW1lKSB7Ci0JCWlmIChwcm9ncmVzc0luZGljYXRvci5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChQcm92aXNpb25pbmdPcGVyYXRpb25SdW5uZXIuaGFzU2NoZWR1bGVkT3BlcmF0aW9ucygpKSB7Ci0JCQlwcm9ncmVzc0luZGljYXRvci5iZWdpbkFuaW1hdGVkVGFzaygpOwotCQkJaWYgKGpvYk5hbWUgPT0gbnVsbCkKLQkJCQlwcm9ncmVzc0xhYmVsLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLlVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfT3BlcmF0aW9uSW5Qcm9ncmVzcyk7Ci0JCQllbHNlCi0JCQkJcHJvZ3Jlc3NMYWJlbC5zZXRUZXh0KE5MUy5iaW5kKFByb3ZTREtNZXNzYWdlcy5VcGRhdGVBbmRJbnN0YWxsRGlhbG9nX05hbWVkT3BlcmF0aW9uSW5Qcm9ncmVzcywgam9iTmFtZSkpOwotCQl9IGVsc2UgewotCQkJcHJvZ3Jlc3NJbmRpY2F0b3IuZG9uZSgpOwotCQkJcHJvZ3Jlc3NMYWJlbC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXByb2dyZXNzTGFiZWwuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCQkvLyBUaGVzZSBtYXkgaGF2ZSBjaGFuZ2VkIGJlY2F1c2UgdGhlIHN0YXR1cyBvZiBzY2hlZHVsZWQgcHJvdmlzaW9uaW5nIGpvYnMgY2hhbmdlZAotCQl2YWxpZGF0ZUF2YWlsYWJsZUlVQnV0dG9ucygpOwotCQl2YWxpZGF0ZUluc3RhbGxlZElVQnV0dG9ucygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjaXNSZXNpemFibGUoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzUmVzaXphYmxlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIElSZXBvc2l0b3J5TWFuaXB1bGF0b3IgZ2V0UmVwb3NpdG9yeU1hbmlwdWxhdG9yKCkgewotCQlpZiAocmVwb3NpdG9yeU1hbmlwdWxhdG9yID09IG51bGwpCi0JCQlyZXBvc2l0b3J5TWFuaXB1bGF0b3IgPSBuZXcgSVJlcG9zaXRvcnlNYW5pcHVsYXRvcigpIHsKLQkJCQlwdWJsaWMgU3RyaW5nIGdldE1hbmlwdWxhdG9yTGFiZWwoKSB7Ci0JCQkJCXJldHVybiBQcm92U0RLTWVzc2FnZXMuVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19NYW5hZ2VTaXRlczsKLQotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIG1hbmlwdWxhdGVSZXBvc2l0b3JpZXMoU2hlbGwgc2hlbGwpIHsKLQkJCQkJbmV3IFJlcG9zaXRvcnlNYW5pcHVsYXRpb25EaWFsb2coc2hlbGwsIHRoaXMpLm9wZW4oKTsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJcHVibGljIFByb3Zpc2lvbmluZ09wZXJhdGlvbiBnZXRBZGRPcGVyYXRpb24oVVJMIHJlcG9VUkwpIHsKLQkJCQkJcmV0dXJuIG5ldyBBZGRDb2xvY2F0ZWRSZXBvc2l0b3J5T3BlcmF0aW9uKGdldEFkZE9wZXJhdGlvbkxhYmVsKCksIHJlcG9VUkwpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0QWRkT3BlcmF0aW9uTGFiZWwoKSB7Ci0JCQkJCXJldHVybiBQcm92U0RLTWVzc2FnZXMuVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19BZGRTaXRlT3BlcmF0aW9ubGFiZWw7Ci0JCQkJfQotCi0JCQkJcHVibGljIFVSTFtdIGdldEtub3duUmVwb3NpdG9yaWVzKCkgewotCQkJCQl0cnkgewotCQkJCQkJcmV0dXJuIFByb3Zpc2lvbmluZ1V0aWwuZ2V0TWV0YWRhdGFSZXBvc2l0b3JpZXMoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX0FMTCk7Ci0JCQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFVSTFswXTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXB1YmxpYyBQcm92aXNpb25pbmdPcGVyYXRpb24gZ2V0UmVtb3ZlT3BlcmF0aW9uKFVSTFtdIHJlcG9zVG9SZW1vdmUpIHsKLQkJCQkJcmV0dXJuIG5ldyBSZW1vdmVDb2xvY2F0ZWRSZXBvc2l0b3J5T3BlcmF0aW9uKGdldFJlbW92ZU9wZXJhdGlvbkxhYmVsKCksIHJlcG9zVG9SZW1vdmUpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0UmVtb3ZlT3BlcmF0aW9uTGFiZWwoKSB7Ci0JCQkJCXJldHVybiBQcm92U0RLTWVzc2FnZXMuVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19SZW1vdmVTaXRlT3BlcmF0aW9uTGFiZWw7Ci0JCQkJfQotCi0JCQkJcHVibGljIFVSTFZhbGlkYXRvciBnZXRVUkxWYWxpZGF0b3IoU2hlbGwgc2hlbGwpIHsKLQkJCQkJRGVmYXVsdE1ldGFkYXRhVVJMVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBEZWZhdWx0TWV0YWRhdGFVUkxWYWxpZGF0b3IoKTsKLQkJCQkJdmFsaWRhdG9yLnNldEtub3duUmVwb3NpdG9yaWVzRmxhZyhJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlci5SRVBPU0lUT1JJRVNfTk9OX1NZU1RFTSk7Ci0JCQkJCXJldHVybiB2YWxpZGF0b3I7Ci0JCQkJfQotCQkJfTsKLQkJcmV0dXJuIHJlcG9zaXRvcnlNYW5pcHVsYXRvcjsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlQXZhaWxhYmxlSVVzUGFnZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUpOwotCQlnZC53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhERUZBVUxUX1dJRFRIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCQlzZXREcm9wVGFyZ2V0KGNvbXBvc2l0ZSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5Ub3AgPSAwOwotCQkvLyBicmVhdGhpbmcgcm9vbSB1bmRlcm5lYXRoIGxhc3QgY2hlY2tib3hlcwotCQlsYXlvdXQubWFyZ2luQm90dG9tID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKFZFUlRJQ0FMX01BUkdJTl9ETFUpOwotCi0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBOb3cgdGhlIGF2YWlsYWJsZSBncm91cCAKLQkJYXZhaWxhYmxlSVVHcm91cCA9IG5ldyBBdmFpbGFibGVJVUdyb3VwKGNvbXBvc2l0ZSwgUHJvdlNES1VJQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRRdWVyeVByb3ZpZGVyKCksIEpGYWNlUmVzb3VyY2VzLmdldERpYWxvZ0ZvbnQoKSwgbmV3IFByb3Zpc2lvbmluZ0NvbnRleHQoKSwgcXVlcnlDb250ZXh0LCBuZXcgQXZhaWxhYmxlSVVQYXR0ZXJuRmlsdGVyKFByb3ZVSS5nZXRJVUNvbHVtbkNvbmZpZygpKSwgUHJvdlVJLmdldElVQ29sdW1uQ29uZmlnKCksIHRoaXMsIHRydWUpOwotCi0JCS8vIFZlcnRpY2FsIGJ1dHRvbnMKLQkJQ29tcG9zaXRlIHZCdXR0b25CYXIgPSAoQ29tcG9zaXRlKSBjcmVhdGVBdmFpbGFibGVJVXNWZXJ0aWNhbEJ1dHRvbkJhcihjb21wb3NpdGUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX0JBUl9IRUlHSFQpOwotCQl2QnV0dG9uQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gU2VsZWN0aW9uIGxpc3RlbmVycyBtdXN0IGJlIHJlZ2lzdGVyZWQgb24gYm90aCB0aGUgbm9ybWFsIHNlbGVjdGlvbgotCQkvLyBldmVudHMgYW5kIHRoZSBjaGVjayBtYXJrIGV2ZW50cy4gIE11c3QgYmUgZG9uZSBhZnRlciBidXR0b25zIAotCQkvLyBhcmUgY3JlYXRlZCBzbyB0aGF0IHRoZSBidXR0b25zIGNhbgotCQkvLyByZWdpc3RlciBhbmQgcmVjZWl2ZSB0aGVpciBzZWxlY3Rpb24gbm90aWZpY2F0aW9ucyBiZWZvcmUgdXMuCi0JCWF2YWlsYWJsZUlVR3JvdXAuZ2V0U3RydWN0dXJlZFZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdmFsaWRhdGVBdmFpbGFibGVJVUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJYXZhaWxhYmxlSVVHcm91cC5nZXRDaGVja01hcHBpbmdTZWxlY3Rpb25Qcm92aWRlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdmFsaWRhdGVBdmFpbGFibGVJVUJ1dHRvbnMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gV2UgbWlnaHQgbmVlZCB0byBhZGp1c3QgdGhlIGNvbnRlbnQgb2YgdGhpcyB2aWV3ZXIgYWNjb3JkaW5nIHRvIGluc3RhbGxhdGlvbgotCQkvLyBjaGFuZ2VzLiAgV2Ugd2FudCB0byBiZSB2ZXJ5IHNlbGVjdGl2ZSBhYm91dCByZWZyZXNoaW5nLgotCQlwcm9maWxlTGlzdGVuZXIgPSBuZXcgU3RydWN0dXJlZFZpZXdlclByb3Zpc2lvbmluZ0xpc3RlbmVyKGF2YWlsYWJsZUlVR3JvdXAuZ2V0U3RydWN0dXJlZFZpZXdlcigpLCBTdHJ1Y3R1cmVkVmlld2VyUHJvdmlzaW9uaW5nTGlzdGVuZXIuUFJPVl9FVkVOVF9QUk9GSUxFLCBQcm92U0RLVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFF1ZXJ5UHJvdmlkZXIoKSkgewotCQkJcHJvdGVjdGVkIHZvaWQgcHJvZmlsZUFkZGVkKFN0cmluZyBpZCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHJvdGVjdGVkIHZvaWQgcHJvZmlsZVJlbW92ZWQoU3RyaW5nIGlkKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCi0JCQlwcm90ZWN0ZWQgdm9pZCBwcm9maWxlQ2hhbmdlZChTdHJpbmcgaWQpIHsKLQkJCQlpZiAoaWQuZXF1YWxzKHByb2ZpbGVJZCkpIHsKLQkJCQkJZGlzcGxheS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWlmIChpc0Nsb3NpbmcoKSkKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCWlmICghc2hvd0luc3RhbGxlZENoZWNrYm94LmdldFNlbGVjdGlvbigpKQotCQkJCQkJCQlyZWZyZXNoQWxsKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQkJCX0KLQkJfTsKLQkJUHJvdlVJLmFkZFByb3Zpc2lvbmluZ0xpc3RlbmVyKHByb2ZpbGVMaXN0ZW5lcik7Ci0KLQkJYXZhaWxhYmxlSVVHcm91cC5zZXRVc2VCb2xkRm9udEZvckZpbHRlcmVkSXRlbXMocXVlcnlDb250ZXh0LmdldFZpZXdUeXBlKCkgIT0gQXZhaWxhYmxlSVVWaWV3UXVlcnlDb250ZXh0LlZJRVdfRkxBVCk7Ci0JCXNldERyb3BUYXJnZXQoYXZhaWxhYmxlSVVHcm91cC5nZXRTdHJ1Y3R1cmVkVmlld2VyKCkuZ2V0Q29udHJvbCgpKTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKENIQVJfSU5ERU5UKTsKLQkJZ2QudmVydGljYWxJbmRlbnQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoVkVSVElDQUxfTUFSR0lOX0RMVSk7Ci0JCXNob3dMYXRlc3RWZXJzaW9uc0NoZWNrYm94ID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCXNob3dMYXRlc3RWZXJzaW9uc0NoZWNrYm94LnNldFRleHQoUHJvdlNES01lc3NhZ2VzLlVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfU2hvd0xhdGVzdFZlcnNpb25zT25seSk7Ci0JCXNob3dMYXRlc3RWZXJzaW9uc0NoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdXBkYXRlQXZhaWxhYmxlVmlld1N0YXRlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1cGRhdGVBdmFpbGFibGVWaWV3U3RhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCXNob3dMYXRlc3RWZXJzaW9uc0NoZWNrYm94LnNldExheW91dERhdGEoZ2QpOwotCi0JCXNob3dJbnN0YWxsZWRDaGVja2JveCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlzaG93SW5zdGFsbGVkQ2hlY2tib3guc2V0VGV4dChQcm92U0RLTWVzc2FnZXMuVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19TaG93QWxyZWFkeUluc3RhbGxlZEl0ZW1zKTsKLQkJc2hvd0luc3RhbGxlZENoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJdXBkYXRlQXZhaWxhYmxlVmlld1N0YXRlKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl1cGRhdGVBdmFpbGFibGVWaWV3U3RhdGUoKTsKLQkJCX0KLQkJfSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWdkLmhvcml6b250YWxJbmRlbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoQ0hBUl9JTkRFTlQpOwotCQlzaG93SW5zdGFsbGVkQ2hlY2tib3guc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJdmFsaWRhdGVBdmFpbGFibGVJVUJ1dHRvbnMoKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaWxsVmlld01lbnUoSU1lbnVNYW5hZ2VyIHZpZXdNZW51KSB7Ci0JCXZpZXdCeVJlcG8gPSBuZXcgQ2hhbmdlVmlld0FjdGlvbihQcm92U0RLTWVzc2FnZXMuVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19WaWV3QnlTaXRlLCBBdmFpbGFibGVJVVZpZXdRdWVyeUNvbnRleHQuVklFV19CWV9SRVBPKTsKLQkJdmlld01lbnUuYWRkKHZpZXdCeVJlcG8pOwotCQl2aWV3Q2F0ZWdvcnkgPSBuZXcgQ2hhbmdlVmlld0FjdGlvbihQcm92U0RLTWVzc2FnZXMuVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19WaWV3QnlDYXRlZ29yeSwgQXZhaWxhYmxlSVVWaWV3UXVlcnlDb250ZXh0LlZJRVdfQllfQ0FURUdPUlkpOwotCQl2aWV3TWVudS5hZGQodmlld0NhdGVnb3J5KTsKLQkJdmlld0ZsYXQgPSBuZXcgQ2hhbmdlVmlld0FjdGlvbihQcm92U0RLTWVzc2FnZXMuVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19WaWV3QnlOYW1lLCBBdmFpbGFibGVJVVZpZXdRdWVyeUNvbnRleHQuVklFV19GTEFUKTsKLQkJdmlld01lbnUuYWRkKHZpZXdGbGF0KTsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlQXZhaWxhYmxlSVVzVmVydGljYWxCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgY29tcG9zaXRlLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBjcmVhdGUgYSBsYXlvdXQgd2l0aCBzcGFjaW5nIGFuZCBtYXJnaW5zIGFwcHJvcHJpYXRlIGZvciB0aGUgZm9udAotCQkvLyBzaXplLgotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gNTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJbGF5b3V0LnZlcnRpY2FsU3BhY2luZyA9IGNvbnZlcnRWZXJ0aWNhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLlZFUlRJQ0FMX1NQQUNJTkcpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gQWRkIHRoZSBidXR0b25zIHRvIHRoZSBidXR0b24gYmFyLgotCQkvLyBXZSB1c2UgdGhlIGNoZWNrIGJveCBzZWxlY3Rpb24gcHJvdmlkZXIgdG8gZGV0ZXJtaW5lIHdoYXQgdG8gaW5zdGFsbC4gIEZvciBvdGhlciBhY3Rpb25zIHdlIHVzZSB0aGUgbm9ybWFsIHNlbGVjdGlvbiBwcm92aWRlci4KLQkJSUFjdGlvbiBpbnN0YWxsQWN0aW9uID0gbmV3IEluc3RhbGxBY3Rpb24oYXZhaWxhYmxlSVVHcm91cC5nZXRDaGVja01hcHBpbmdTZWxlY3Rpb25Qcm92aWRlcigpLCBwcm9maWxlSWQsIG51bGwsIFByb3ZQb2xpY2llcy5nZXREZWZhdWx0KCksIGdldFNoZWxsKCkpOwotCQlpbnN0YWxsQnV0dG9uID0gY3JlYXRlVmVydGljYWxCdXR0b24oY29tcG9zaXRlLCBpbnN0YWxsQWN0aW9uLCBmYWxzZSk7Ci0KLQkJSUFjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uID0gbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKG5ldyBTYW1lU2hlbGxQcm92aWRlcihwYXJlbnQuZ2V0U2hlbGwoKSksIGF2YWlsYWJsZUlVR3JvdXAuZ2V0U3RydWN0dXJlZFZpZXdlcigpKTsKLQkJcHJvcGVydGllc0FjdGlvbi5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5VcGRhdGVBbmRJbnN0YWxsRGlhbG9nX1Byb3BlcnRpZXMpOwotCQlhdmFpbGFibGVQcm9wQnV0dG9uID0gY3JlYXRlVmVydGljYWxCdXR0b24oY29tcG9zaXRlLCBwcm9wZXJ0aWVzQWN0aW9uLCBmYWxzZSk7Ci0KLQkJLy8gc3BhY2VyCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJSUFjdGlvbiByZWZyZXNoQWN0aW9uID0gbmV3IFJlZnJlc2hBY3Rpb24oYXZhaWxhYmxlSVVHcm91cC5nZXRTdHJ1Y3R1cmVkVmlld2VyKCksIGF2YWlsYWJsZUlVR3JvdXAuZ2V0U3RydWN0dXJlZFZpZXdlcigpLmdldENvbnRyb2woKSkgewotCQkJcHJvdGVjdGVkIHZvaWQgcmVmcmVzaCgpIHsKLQkJCQlhdmFpbGFibGVJVUdyb3VwLnJlZnJlc2goKTsKLQkJCX0KLQkJfTsKLQkJcmVmcmVzaEFjdGlvbi5zZXRUb29sVGlwVGV4dChQcm92U0RLTWVzc2FnZXMuVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19SZWZyZXNoVG9vbHRpcCk7Ci0JCWNyZWF0ZVZlcnRpY2FsQnV0dG9uKGNvbXBvc2l0ZSwgcmVmcmVzaEFjdGlvbiwgZmFsc2UpOwotCi0JCS8vIHNwYWNlcgotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJSUFjdGlvbiBtYW5pcHVsYXRlUmVwb3MgPSBuZXcgQWN0aW9uKCkgewotCQkJcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJZ2V0UmVwb3NpdG9yeU1hbmlwdWxhdG9yKCkubWFuaXB1bGF0ZVJlcG9zaXRvcmllcyhnZXRTaGVsbCgpKTsKLQkJCX0KLQkJfTsKLQkJbWFuaXB1bGF0ZVJlcG9zLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLlVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfTWFuYWdlU2l0ZXMpOwotCQltYW5pcHVsYXRlUmVwb3Muc2V0VG9vbFRpcFRleHQoUHJvdlNES01lc3NhZ2VzLlVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfTWFuYWdlU2l0ZXNUb29sdGlwKTsKLQkJbWFuaXB1bGF0ZVJlcG9CdXR0b24gPSBjcmVhdGVWZXJ0aWNhbEJ1dHRvbihjb21wb3NpdGUsIG1hbmlwdWxhdGVSZXBvcywgZmFsc2UpOwotCi0JCUlBY3Rpb24gYWRkU2l0ZXMgPSBuZXcgQWRkQ29sb2NhdGVkUmVwb3NpdG9yeUFjdGlvbihhdmFpbGFibGVJVUdyb3VwLmdldFN0cnVjdHVyZWRWaWV3ZXIoKSwgZ2V0U2hlbGwoKSk7Ci0JCS8vIENoYW5nZSB0aGUgdGV4dCBzbyBpdCdzIGNsZWFyIHRoaXMgaXMgYWRkaW5nIHNpdGVzLCBub3QganVzdCAiYWRkIi4gIFNpbmNlIGl0ZW1zIGluIHRoZSBsaXN0IGFyZSBub3QgYWxsIHNpdGVzLgotCQlhZGRTaXRlcy5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5VcGRhdGVBbmRJbnN0YWxsRGlhbG9nX0FkZFNpdGVCdXR0b25UZXh0KTsKLQkJYWRkUmVwb0J1dHRvbiA9IGNyZWF0ZVZlcnRpY2FsQnV0dG9uKGNvbXBvc2l0ZSwgYWRkU2l0ZXMsIGZhbHNlKTsKLQotCQlJQWN0aW9uIHJlbW92ZVNpdGVzID0gbmV3IFJlbW92ZUNvbG9jYXRlZFJlcG9zaXRvcnlBY3Rpb24oYXZhaWxhYmxlSVVHcm91cC5nZXRTdHJ1Y3R1cmVkVmlld2VyKCksIGdldFNoZWxsKCkpOwotCQlyZW1vdmVSZXBvQnV0dG9uID0gY3JlYXRlVmVydGljYWxCdXR0b24oY29tcG9zaXRlLCByZW1vdmVTaXRlcywgZmFsc2UpOwotCi0JCWNyZWF0ZU1lbnUoYXZhaWxhYmxlSVVHcm91cC5nZXRTdHJ1Y3R1cmVkVmlld2VyKCkuZ2V0Q29udHJvbCgpLCBuZXcgSUFjdGlvbltdIHtpbnN0YWxsQWN0aW9uLCBwcm9wZXJ0aWVzQWN0aW9uLCByZWZyZXNoQWN0aW9ufSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZUF2YWlsYWJsZVZpZXdTdGF0ZSgpIHsKLQkJaWYgKGF2YWlsYWJsZUlVR3JvdXAuZ2V0VHJlZSgpID09IG51bGwgfHwgYXZhaWxhYmxlSVVHcm91cC5nZXRUcmVlKCkuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCQlmaW5hbCBDb21wb3NpdGUgcGFyZW50ID0gYXZhaWxhYmxlSVVHcm91cC5nZXRDb21wb3NpdGUoKS5nZXRQYXJlbnQoKTsKLQkJdmFsaWRhdGVBdmFpbGFibGVJVUJ1dHRvbnMoKTsKLQkJYXZhaWxhYmxlSVVHcm91cC5zZXRVc2VCb2xkRm9udEZvckZpbHRlcmVkSXRlbXMocXVlcnlDb250ZXh0LmdldFZpZXdUeXBlKCkgIT0gQXZhaWxhYmxlSVVWaWV3UXVlcnlDb250ZXh0LlZJRVdfRkxBVCk7Ci0KLQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZGlzcGxheSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCXBhcmVudC5zZXRSZWRyYXcoZmFsc2UpOwotCQkJCXVwZGF0ZVRyZWVDb2x1bW5zKCk7Ci0JCQkJcXVlcnlDb250ZXh0LnNldFNob3dMYXRlc3RWZXJzaW9uc09ubHkoc2hvd0xhdGVzdFZlcnNpb25zQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotCQkJCWlmIChzaG93SW5zdGFsbGVkQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCXF1ZXJ5Q29udGV4dC5zaG93QWxyZWFkeUluc3RhbGxlZCgpOwotCQkJCWVsc2UKLQkJCQkJcXVlcnlDb250ZXh0LmhpZGVBbHJlYWR5SW5zdGFsbGVkKHByb2ZpbGVJZCk7Ci0JCQkJYXZhaWxhYmxlSVVHcm91cC5zZXRRdWVyeUNvbnRleHQocXVlcnlDb250ZXh0KTsKLQkJCQlwYXJlbnQubGF5b3V0KHRydWUpOwotCQkJCXBhcmVudC5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXZvaWQgdXBkYXRlVHJlZUNvbHVtbnMoKSB7Ci0JCWlmIChhdmFpbGFibGVJVUdyb3VwLmdldFRyZWUoKSA9PSBudWxsIHx8IGF2YWlsYWJsZUlVR3JvdXAuZ2V0VHJlZSgpLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQkJVHJlZUNvbHVtbltdIGNvbHVtbnMgPSBhdmFpbGFibGVJVUdyb3VwLmdldFRyZWUoKS5nZXRDb2x1bW5zKCk7Ci0JCWlmIChjb2x1bW5zLmxlbmd0aCA+IDApCi0JCQljb2x1bW5zWzBdLnNldFdpZHRoKGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKHF1ZXJ5Q29udGV4dC5nZXRWaWV3VHlwZSgpID09IEF2YWlsYWJsZUlVVmlld1F1ZXJ5Q29udGV4dC5WSUVXX0JZX1JFUE8gPyBTSVRFX0NPTFVNTl9XSURUSF9JTl9ETFVTIDogT1RIRVJfQ09MVU1OX1dJRFRIX0lOX0RMVVMpKTsKLQotCX0KLQotCXZvaWQgdmFsaWRhdGVBdmFpbGFibGVJVUJ1dHRvbnMoKSB7Ci0JCS8vIFRoaXMgcmVsaWVzIG9uIHRoZSBhY3Rpb25zIHRoZW1zZWx2ZXMgcmVjZWl2aW5nIHRoZSBzZWxlY3Rpb24gY2hhbmdlZAotCQkvLyBsaXN0ZW5lciBiZWZvcmUgd2UgZG8sIHNpbmNlIHdlIHVzZSB0aGVpciBzdGF0ZSB0byBlbmFibGUgdGhlIGJ1dHRvbnMuCi0JCXVwZGF0ZUVuYWJsZW1lbnQoaW5zdGFsbEJ1dHRvbik7Ci0JCXVwZGF0ZUVuYWJsZW1lbnQoYXZhaWxhYmxlUHJvcEJ1dHRvbik7Ci0JCXVwZGF0ZUVuYWJsZW1lbnQobWFuaXB1bGF0ZVJlcG9CdXR0b24pOwotCQl1cGRhdGVFbmFibGVtZW50KGFkZFJlcG9CdXR0b24pOwotCQl1cGRhdGVFbmFibGVtZW50KHJlbW92ZVJlcG9CdXR0b24pOwotCQlib29sZWFuIHNob3dSZXBvcyA9IHF1ZXJ5Q29udGV4dC5nZXRWaWV3VHlwZSgpID09IEF2YWlsYWJsZUlVVmlld1F1ZXJ5Q29udGV4dC5WSUVXX0JZX1JFUE87Ci0JCWFkZFJlcG9CdXR0b24uc2V0VmlzaWJsZShzaG93UmVwb3MpOwotCQlyZW1vdmVSZXBvQnV0dG9uLnNldFZpc2libGUoc2hvd1JlcG9zKTsKLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlSW5zdGFsbGVkSVVzUGFnZShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWdkLndpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKERFRkFVTFRfV0lEVEgpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIFRhYmxlIG9mIGluc3RhbGxlZCBJVSdzCi0JCWluc3RhbGxlZElVR3JvdXAgPSBuZXcgSW5zdGFsbGVkSVVHcm91cChjb21wb3NpdGUsIFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UXVlcnlQcm92aWRlcigpLCBKRmFjZVJlc291cmNlcy5nZXREaWFsb2dGb250KCksIG5ldyBQcm92aXNpb25pbmdDb250ZXh0KCksIHByb2ZpbGVJZCk7Ci0KLQkJLy8gVmVydGljYWwgYnV0dG9ucwotCQlDb21wb3NpdGUgdkJ1dHRvbkJhciA9IChDb21wb3NpdGUpIGNyZWF0ZUluc3RhbGxlZElVc1ZlcnRpY2FsQnV0dG9uQmFyKGNvbXBvc2l0ZSwgUHJvdlNES1VJQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRRdWVyeVByb3ZpZGVyKCkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlkYXRhLnZlcnRpY2FsSW5kZW50ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX0JBUl9IRUlHSFQpOwotCQl2QnV0dG9uQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gTXVzdCBiZSBkb25lIGFmdGVyIGJ1dHRvbnMgYXJlIGNyZWF0ZWQgc28gdGhhdCB0aGUgYnV0dG9ucyBjYW4KLQkJLy8gcmVnaXN0ZXIgYW5kIHJlY2VpdmUgdGhlaXIgc2VsZWN0aW9uIG5vdGlmaWNhdGlvbnMgYmVmb3JlIHVzLgotCQlpbnN0YWxsZWRJVUdyb3VwLmdldFN0cnVjdHVyZWRWaWV3ZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCXZhbGlkYXRlSW5zdGFsbGVkSVVCdXR0b25zKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCXNldERyb3BUYXJnZXQoaW5zdGFsbGVkSVVHcm91cC5nZXRTdHJ1Y3R1cmVkVmlld2VyKCkuZ2V0Q29udHJvbCgpKTsKLQotCQl2YWxpZGF0ZUluc3RhbGxlZElVQnV0dG9ucygpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgQ29udHJvbCBjcmVhdGVJbnN0YWxsZWRJVXNWZXJ0aWNhbEJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50LCBJUXVlcnlQcm92aWRlciBxdWVyeVByb3ZpZGVyKSB7Ci0JCS8vIENyZWF0ZSBjb21wb3NpdGUuCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vIGNyZWF0ZSBhIGxheW91dCB3aXRoIHNwYWNpbmcgYW5kIG1hcmdpbnMgYXBwcm9wcmlhdGUgZm9yIHRoZSBmb250Ci0JCS8vIHNpemUuCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSA1OwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBBZGQgdGhlIGJ1dHRvbnMgdG8gdGhlIGJ1dHRvbiBiYXIuCi0JCS8vIEZvciB1cGRhdGUgb25seSwgd2Ugd2FudCBpdCB0byBjaGVjayBmb3IgYWxsIHVwZGF0ZXMgaWYgdGhlcmUgaXMgbm90aGluZyBzZWxlY3RlZAotCQlJQWN0aW9uIHVwZGF0ZUFjdGlvbiA9IG5ldyBVcGRhdGVBY3Rpb24obmV3IElTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJaW5zdGFsbGVkSVVHcm91cC5nZXRTdHJ1Y3R1cmVkVmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCX0KLQotCQkJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQkJCVN0cnVjdHVyZWRWaWV3ZXIgdmlld2VyID0gaW5zdGFsbGVkSVVHcm91cC5nZXRTdHJ1Y3R1cmVkVmlld2VyKCk7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB2aWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCQkJZmluYWwgT2JqZWN0W10gYWxsID0gKChJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcikgaW5zdGFsbGVkSVVHcm91cC5nZXRTdHJ1Y3R1cmVkVmlld2VyKCkuZ2V0Q29udGVudFByb3ZpZGVyKCkpLmdldEVsZW1lbnRzKHZpZXdlci5nZXRJbnB1dCgpKTsKLQkJCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGFsbCk7Ci0JCQkJfQotCQkJCXJldHVybiBzZWxlY3Rpb247Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJaW5zdGFsbGVkSVVHcm91cC5nZXRTdHJ1Y3R1cmVkVmlld2VyKCkucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQkJaW5zdGFsbGVkSVVHcm91cC5nZXRTdHJ1Y3R1cmVkVmlld2VyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0sIHByb2ZpbGVJZCwgbnVsbCwgUHJvdlBvbGljaWVzLmdldERlZmF1bHQoKSwgcGFyZW50LmdldFNoZWxsKCkpOwotCQl1cGRhdGVCdXR0b24gPSBjcmVhdGVWZXJ0aWNhbEJ1dHRvbihjb21wb3NpdGUsIHVwZGF0ZUFjdGlvbiwgZmFsc2UpOwotCi0JCUlBY3Rpb24gdW5pbnN0YWxsQWN0aW9uID0gbmV3IFVuaW5zdGFsbEFjdGlvbihpbnN0YWxsZWRJVUdyb3VwLmdldFN0cnVjdHVyZWRWaWV3ZXIoKSwgcHJvZmlsZUlkLCBudWxsLCBQcm92UG9saWNpZXMuZ2V0RGVmYXVsdCgpLCBwYXJlbnQuZ2V0U2hlbGwoKSk7Ci0JCXVuaW5zdGFsbEJ1dHRvbiA9IGNyZWF0ZVZlcnRpY2FsQnV0dG9uKGNvbXBvc2l0ZSwgdW5pbnN0YWxsQWN0aW9uLCBmYWxzZSk7Ci0KLQkJSUFjdGlvbiBwcm9wZXJ0aWVzQWN0aW9uID0gbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKG5ldyBTYW1lU2hlbGxQcm92aWRlcihwYXJlbnQuZ2V0U2hlbGwoKSksIGluc3RhbGxlZElVR3JvdXAuZ2V0U3RydWN0dXJlZFZpZXdlcigpKTsKLQkJcHJvcGVydGllc0FjdGlvbi5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5VcGRhdGVBbmRJbnN0YWxsRGlhbG9nX1Byb3BlcnRpZXMpOwotCQlpbnN0YWxsZWRQcm9wQnV0dG9uID0gY3JlYXRlVmVydGljYWxCdXR0b24oY29tcG9zaXRlLCBwcm9wZXJ0aWVzQWN0aW9uLCBmYWxzZSk7Ci0KLQkJLy8gc3BhY2VyCi0JCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQlJQWN0aW9uIHJldmVydEFjdGlvbiA9IG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJUmV2ZXJ0V2l6YXJkIHdpemFyZCA9IG5ldyBSZXZlcnRXaXphcmQocHJvZmlsZUlkLCBQcm92U0RLVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFF1ZXJ5UHJvdmlkZXIoKSk7Ci0JCQkJV2l6YXJkRGlhbG9nIGRpYWxvZyA9IG5ldyBXaXphcmREaWFsb2coZ2V0U2hlbGwoKSwgd2l6YXJkKTsKLQkJCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0U2l6ZSg2MDAsIDUwMCk7Ci0JCQkJZGlhbG9nLm9wZW4oKTsKLQkJCX0KLQkJfTsKLQkJcmV2ZXJ0QWN0aW9uLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLlVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfUmV2ZXJ0QWN0aW9uTGFiZWwpOwotCQlyZXZlcnRBY3Rpb24uc2V0VG9vbFRpcFRleHQoUHJvdlNES01lc3NhZ2VzLlVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfUmV2ZXJ0VG9vbHRpcCk7Ci0JCXJldmVydEJ1dHRvbiA9IGNyZWF0ZVZlcnRpY2FsQnV0dG9uKGNvbXBvc2l0ZSwgcmV2ZXJ0QWN0aW9uLCBmYWxzZSk7Ci0KLQkJY3JlYXRlTWVudShpbnN0YWxsZWRJVUdyb3VwLmdldFN0cnVjdHVyZWRWaWV3ZXIoKS5nZXRDb250cm9sKCksIG5ldyBJQWN0aW9uW10ge3VwZGF0ZUFjdGlvbiwgdW5pbnN0YWxsQWN0aW9uLCBwcm9wZXJ0aWVzQWN0aW9ufSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlTWVudShDb250cm9sIGNvbnRyb2wsIElBY3Rpb25bXSBhY3Rpb25zKSB7Ci0JCU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWN0aW9ucy5sZW5ndGg7IGkrKykKLQkJCW1lbnVNYW5hZ2VyLmFkZChhY3Rpb25zW2ldKTsKLQkJTWVudSBtZW51ID0gbWVudU1hbmFnZXIuY3JlYXRlQ29udGV4dE1lbnUoY29udHJvbCk7Ci0JCWNvbnRyb2wuc2V0TWVudShtZW51KTsKLQl9Ci0KLQl2b2lkIHZhbGlkYXRlSW5zdGFsbGVkSVVCdXR0b25zKCkgewotCQkvLyBOb3RlIHRoYXQgdGhpcyByZWxpZXMgb24gdGhlIGFjdGlvbnMgZ2V0dGluZyB0aGUgc2VsZWN0aW9uIG5vdGlmaWNhdGlvbgotCQkvLyBiZWZvcmUgd2UgZG8sIHNpbmNlIHdlIHJlbHkgb24gdGhlIGFjdGlvbiBlbmFibGVtZW50IHRvIHVwZGF0ZQotCQkvLyB0aGUgYnV0dG9ucy4gIFRoaXMgc2hvdWxkIGJlIG9rIHNpbmNlIHRoZSBidXR0b25zCi0JCS8vIGhvb2sgdGhlIGxpc3RlbmVyIG9uIGNyZWF0ZS4KLQkJdXBkYXRlRW5hYmxlbWVudChpbnN0YWxsZWRQcm9wQnV0dG9uKTsKLQkJdXBkYXRlRW5hYmxlbWVudCh1bmluc3RhbGxCdXR0b24pOwotCQl1cGRhdGVFbmFibGVtZW50KHVwZGF0ZUJ1dHRvbik7Ci0JCS8vIHNwZWNpYWwgY2FzZSBiZWNhdXNlIHJldmVydCBpc24ndCBhIHN0YW5kYXJkIGFjdGlvbgotCQlyZXZlcnRCdXR0b24uc2V0RW5hYmxlZCghUHJvdmlzaW9uaW5nT3BlcmF0aW9uUnVubmVyLmhhc1NjaGVkdWxlZE9wZXJhdGlvbnNGb3IocHJvZmlsZUlkKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRW5hYmxlbWVudChCdXR0b24gYnV0dG9uKSB7Ci0JCS8vIEF0IHRoaXMgcG9pbnQgdGhlIGFjdGlvbidzIGVuYWJsZW1lbnQgaXMgY29ycmVjdCBmb3IgaXRzCi0JCS8vIHNlbGVjdGlvbi4gIE5vdyB3ZSB3YW50IHRvIGRvdWJsZSBjaGVjayBvdGhlciBjb25kaXRpb25zLgotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEJ1dHRvbkFjdGlvbihidXR0b24pOwotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBQcm92aXNpb25pbmdBY3Rpb24pCi0JCQkJKChQcm92aXNpb25pbmdBY3Rpb24pIGFjdGlvbikuY2hlY2tFbmFibGVtZW50KCk7Ci0JCQlidXR0b24uc2V0RW5hYmxlZChhY3Rpb24uaXNFbmFibGVkKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlVmVydGljYWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgSUFjdGlvbiBhY3Rpb24sIGJvb2xlYW4gZGVmYXVsdEJ1dHRvbikgewotCQlCdXR0b24gYnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5QVVNIKTsKLQkJYnV0dG9uLnNldFRleHQoYWN0aW9uLmdldFRleHQoKSk7Ci0KLQkJc2V0QnV0dG9uTGF5b3V0RGF0YShidXR0b24pOwotCQlPYmplY3QgZGF0YSA9IGJ1dHRvbi5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgR3JpZERhdGEpCi0JCQkoKEdyaWREYXRhKSBkYXRhKS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQotCQlidXR0b24uYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJCQl2ZXJ0aWNhbEJ1dHRvblByZXNzZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQkJYnV0dG9uLnNldFRvb2xUaXBUZXh0KGFjdGlvbi5nZXRUb29sVGlwVGV4dCgpKTsKLQkJaWYgKGRlZmF1bHRCdXR0b24pIHsKLQkJCVNoZWxsIHNoZWxsID0gcGFyZW50LmdldFNoZWxsKCk7Ci0JCQlpZiAoc2hlbGwgIT0gbnVsbCkgewotCQkJCXNoZWxsLnNldERlZmF1bHRCdXR0b24oYnV0dG9uKTsKLQkJCX0KLQkJfQotCQlidXR0b24uc2V0RGF0YShCVVRUT05BQ1RJT04sIGFjdGlvbik7Ci0JCXJldHVybiBidXR0b247Ci0JfQotCi0Jdm9pZCB2ZXJ0aWNhbEJ1dHRvblByZXNzZWQoRXZlbnQgZXZlbnQpIHsKLQkJSUFjdGlvbiBhY3Rpb24gPSBnZXRCdXR0b25BY3Rpb24oZXZlbnQud2lkZ2V0KTsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24ucnVuV2l0aEV2ZW50KGV2ZW50KTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUFjdGlvbiBnZXRCdXR0b25BY3Rpb24oV2lkZ2V0IHdpZGdldCkgewotCQlPYmplY3QgZGF0YSA9IHdpZGdldC5nZXREYXRhKEJVVFRPTkFDVElPTik7Ci0JCWlmIChkYXRhID09IG51bGwgfHwgIShkYXRhIGluc3RhbmNlb2YgSUFjdGlvbikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoSUFjdGlvbikgZGF0YTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZERpYWxvZ1NldHRpbmdzKCkgewotCQlpZiAodGFiRm9sZGVyID09IG51bGwgfHwgdGFiRm9sZGVyLmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCQkvLyBJbml0aWFsaXplIHRoZSBxdWVyeSBjb250ZXh0IHVzaW5nIGRlZmF1bHRzIGFuZCBwcmVmIHZhbHVlcwotCQlxdWVyeUNvbnRleHQgPSBuZXcgQXZhaWxhYmxlSVVWaWV3UXVlcnlDb250ZXh0KERFRkFVTFRfVklFV19UWVBFKTsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCXF1ZXJ5Q29udGV4dC5zZXRTaG93TGF0ZXN0VmVyc2lvbnNPbmx5KHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1NIT1dfTEFURVNUX1ZFUlNJT04pKTsKLQkJcXVlcnlDb250ZXh0LmhpZGVBbHJlYWR5SW5zdGFsbGVkKHByb2ZpbGVJZCk7Ci0KLQkJLy8gTm93IHJlZmluZSBpdCBiYXNlZCBvbiB0aGUgZGlhbG9nIHNldHRpbmdzCi0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBzZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HU19TRUNUSU9OKTsKLQkJaWYgKHNlY3Rpb24gIT0gbnVsbCkgewotCQkJLy8gRGVmYXVsdCBzZWxlY3RlZCB0YWIKLQkJCWludCB0YWIgPSAwOwotCQkJaWYgKHNlY3Rpb24uZ2V0KFNFTEVDVEVEX1RBQl9TRVRUSU5HKSAhPSBudWxsKQotCQkJCXRhYiA9IHNlY3Rpb24uZ2V0SW50KFNFTEVDVEVEX1RBQl9TRVRUSU5HKTsKLQkJCXRhYkZvbGRlci5zZXRTZWxlY3Rpb24odGFiKTsKLQotCQkJLy8gVmlldyBieS4uLgotCQkJdHJ5IHsKLQkJCQlpZiAoc2VjdGlvbi5nZXQoQVZBSUxBQkxFX1ZJRVdfVFlQRSkgIT0gbnVsbCkKLQkJCQkJcXVlcnlDb250ZXh0LnNldFZpZXdUeXBlKHNlY3Rpb24uZ2V0SW50KEFWQUlMQUJMRV9WSUVXX1RZUEUpKTsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlIGlmIHRoZXJlIGFjdHVhbGx5IHdhcyBhIHZhbHVlIHRoYXQgZGlkbid0IHBhcnNlLiAgCi0JCQkJLy8gV2UnbGwgZ2V0IGEgZGVmYXVsdCBxdWVyeSBjb250ZXh0IGJlbG93LgotCQkJfQotCi0JCQkvLyBTaG93IGxhdGVzdCB2ZXJzaW9ucwotCQkJaWYgKHNlY3Rpb24uZ2V0KFNIT1dfTEFURVNUX1ZFUlNJT05TX09OTFkpICE9IG51bGwpCi0JCQkJcXVlcnlDb250ZXh0LnNldFNob3dMYXRlc3RWZXJzaW9uc09ubHkoc2VjdGlvbi5nZXRCb29sZWFuKFNIT1dfTEFURVNUX1ZFUlNJT05TX09OTFkpKTsKLQotCQkJLy8gSGlkZSBpbnN0YWxsZWQgY29udGVudAotCQkJYm9vbGVhbiBoaWRlQ29udGVudCA9IHNlY3Rpb24uZ2V0Qm9vbGVhbihISURFX0lOU1RBTExFRF9JVVMpOwotCQkJaWYgKGhpZGVDb250ZW50KQotCQkJCXF1ZXJ5Q29udGV4dC5oaWRlQWxyZWFkeUluc3RhbGxlZChwcm9maWxlSWQpOwotCQkJZWxzZQotCQkJCXF1ZXJ5Q29udGV4dC5zaG93QWxyZWFkeUluc3RhbGxlZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVEaWFsb2dTZXR0aW5ncygpIHsKLQkJaWYgKCF0YWJGb2xkZXIuaXNEaXNwb3NlZCgpKSB7Ci0JCQlnZXREaWFsb2dCb3VuZHNTZXR0aW5ncygpLnB1dChTRUxFQ1RFRF9UQUJfU0VUVElORywgdGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKS5wdXQoQVZBSUxBQkxFX1ZJRVdfVFlQRSwgcXVlcnlDb250ZXh0LmdldFZpZXdUeXBlKCkpOwotCQkJZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKS5wdXQoU0hPV19MQVRFU1RfVkVSU0lPTlNfT05MWSwgc2hvd0xhdGVzdFZlcnNpb25zQ2hlY2tib3guZ2V0U2VsZWN0aW9uKCkpOwotCQkJZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKS5wdXQoSElERV9JTlNUQUxMRURfSVVTLCAhc2hvd0luc3RhbGxlZENoZWNrYm94LmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBzZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HU19TRUNUSU9OKTsKLQkJaWYgKHNlY3Rpb24gPT0gbnVsbCkgewotCQkJc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oRElBTE9HX1NFVFRJTkdTX1NFQ1RJT04pOwotCQl9Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gcHJvdmlkZSBhIGNsb3NlIGJ1dHRvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgYnV0dG9uIGJhciBjb21wb3NpdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DTE9TRV9JRCwgSURpYWxvZ0NvbnN0YW50cy5DTE9TRV9MQUJFTCwgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKElEaWFsb2dDb25zdGFudHMuQ0xPU0VfSUQgPT0gYnV0dG9uSWQpIHsKLQkJCXNhdmVEaWFsb2dTZXR0aW5ncygpOwotCQkJY2xvc2UoKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0RHJvcFRhcmdldChDb250cm9sIGNvbnRyb2wpIHsKLQkJRHJvcFRhcmdldCB0YXJnZXQgPSBuZXcgRHJvcFRhcmdldChjb250cm9sLCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTkspOwotCQl0YXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1VSTFRyYW5zZmVyLmdldEluc3RhbmNlKCksIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IFJlcG9zaXRvcnlNYW5pcHVsYXRvckRyb3BUYXJnZXQoZ2V0UmVwb3NpdG9yeU1hbmlwdWxhdG9yKCksIGNvbnRyb2wpIHsKLQkJCXByb3RlY3RlZCBib29sZWFuIGRyb3BUYXJnZXRJc1ZhbGlkKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCS8vIE92ZXJyaWRkZW4gc28gdGhhdCBkcm9wcyBhcmUgb25seSB2YWxpZCBvbiB0aGUgYXZhaWxhYmxlIHNvZnR3YXJlIHBhZ2UuCi0JCQkJaWYgKHRhYkZvbGRlci5nZXRTZWxlY3Rpb25JbmRleCgpID09IElOREVYX0FWQUlMQUJMRSkKLQkJCQkJcmV0dXJuIHN1cGVyLmRyb3BUYXJnZXRJc1ZhbGlkKGV2ZW50KTsKLQkJCQlpZiAodGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCkgPT0gSU5ERVhfSU5TVEFMTEVEKQotCQkJCQkvLyBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTIyMjEyMAotCQkJCQkvLyBJbiB0aGUgZnV0dXJlIHdlIG1heSB3aXNoIHRvIGNoZWNrIFRhYkl0ZW0uZ2V0Qm91bmRzKCkgYW5kIAotCQkJCQkvLyBUYWJGb2xkZXIuZ2V0SXRlbShwb2ludCkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBhdmFpbGFibGUgc29mdHdhcmUKLQkJCQkJLy8gdGFiIGdvdCB0aGUgZHJvcCB3aGlsZSBvbiB0aGUgaW5zdGFsbGVkIHNvZnR3YXJlIHBhZ2UuCi0JCQkJCS8vIFdlIG1heSBhbHNvIGhhdmUgYSBkaWZmZXJlbnQgaW50ZXJwcmV0YXRpb24gd2hlbiB0aGUgaW5zdGFsbGVkIHNvZnR3YXJlCi0JCQkJCS8vIHBhZ2UgaXMgdGhlIHRhcmdldC4gIEZvciBub3cgd2UgZG8gbm90aGluZy4KLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfSk7Ci0JfQotCi0Jdm9pZCBoYW5kbGVEaXNwb3NlKCkgewotCQlpZiAocHJlZmVyZW5jZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCVByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwcmVmZXJlbmNlTGlzdGVuZXIpOwotCQkJcHJlZmVyZW5jZUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCQlpZiAocHJvZ3Jlc3NMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlQcm92aXNpb25pbmdPcGVyYXRpb25SdW5uZXIucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIocHJvZ3Jlc3NMaXN0ZW5lcik7Ci0JCQlwcm9ncmVzc0xpc3RlbmVyID0gbnVsbDsKLQkJfQotCQlpZiAocHJvZmlsZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCVByb3ZVSS5yZW1vdmVQcm92aXNpb25pbmdMaXN0ZW5lcihwcm9maWxlTGlzdGVuZXIpOwotCQkJcHJvZmlsZUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvVXBkYXRlSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvVXBkYXRlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWIzOTA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL1VwZGF0ZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuQWJzdHJhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuY29tbWFuZHMuRXhlY3V0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci0KLS8qKgotICogVXBkYXRlSGFuZGxlciBpbnZva2VzIHRoZSBtYWluIHVwZGF0ZS9pbnN0YWxsIFVJLgotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVIYW5kbGVyIGV4dGVuZHMgQWJzdHJhY3RIYW5kbGVyIHsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgVXBkYXRlSGFuZGxlcigpIHsKLQkJLy8gY29uc3RydWN0b3IKLQl9Ci0KLQkvKioKLQkgKiBFeGVjdXRlIHRoZSB1cGRhdGUgY29tbWFuZC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGV4ZWN1dGUoRXhlY3V0aW9uRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb2ZpbGVJZDsKLQotCQkvLyBOZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIHByb2ZpbGUgd2UgYXJlIHVzaW5nIGFuZCBvcGVuIGEgZGlhbG9nCi0JCXRyeSB7Ci0JCQlwcm9maWxlSWQgPSBQcm92U0RLVUlBY3RpdmF0b3IuZ2V0U2VsZlByb2ZpbGVJZCgpOwotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJcHJvZmlsZUlkID0gbnVsbDsKLQkJfQotCQlpZiAocHJvZmlsZUlkICE9IG51bGwpIHsKLQkJCW9wZW5EaWFsb2cobnVsbCwgcHJvZmlsZUlkKTsKLQkJfSBlbHNlIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKG51bGwsIFByb3ZTREtNZXNzYWdlcy5VcGRhdGVIYW5kbGVyX1NES1VwZGF0ZVVJTWVzc2FnZVRpdGxlLCBQcm92U0RLTWVzc2FnZXMuVXBkYXRlSGFuZGxlcl9DYW5ub3RMYXVuY2hVSSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkRpYWxvZyhTaGVsbCBzaGVsbCwgU3RyaW5nIHByb2ZpbGVJZCkgewotCQlVcGRhdGVBbmRJbnN0YWxsRGlhbG9nIGRpYWxvZyA9IG5ldyBVcGRhdGVBbmRJbnN0YWxsRGlhbG9nKHNoZWxsLCBwcm9maWxlSWQpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9tZXNzYWdlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2Y5ZmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL21lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotQWRkQ29sb2NhdGVkUmVwb3NpdG9yeUFjdGlvbl9Ub29sVGlwPUFkZCBhIHNpdGUgdXNlZCB0byBhY2Nlc3MgdGhlIGF2YWlsYWJsZSBzb2Z0d2FyZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQWRkQ29sb2NhdGVkUmVwb3NpdG9yeUFjdGlvbl9MYWJlbD0mQWRkIFNpdGUuLi4KLUFkZENvbG9jYXRlZFJlcG9zaXRvcnlEaWFsb2dfVGl0bGU9QWRkIFNpdGUKLUV4dGVybmFsRmlsZUhhbmRsZXJfQnVuZGxlSW5zdGFsbGVkT0s9QnVuZGxlIHdhcyBzdWNjZXNzZnVsbHkgaW5zdGFsbGVkIGluIHswfQotRXh0ZXJuYWxGaWxlSGFuZGxlcl9FcnJvckNvcHlpbmdGaWxlPUVycm9yIHdoaWxlIHRyeWluZyB0byBjb3B5IHRoZSBmaWxlIHswfQotRXh0ZXJuYWxGaWxlSGFuZGxlcl9FcnJvckV4cGFuZGluZ0FyY2hpdmU9RXJyb3Igd2hpbGUgZXhwYW5kaW5nIHRoZSBhcmNoaXZlIHswfQotRXh0ZXJuYWxGaWxlSGFuZGxlcl9FcnJvckxvYWRpbmdGcm9tWmlwRGlyZWN0b3J5PUVycm9yIHJlYWRpbmcgdGhlIGNvbnRlbnQgZXhwYW5kZWQgaW4gezB9Ci1FeHRlcm5hbEZpbGVIYW5kbGVyX1Byb21wdEZvckluc3RhbGxCdW5kbGU9InswfSIgaXMgYSBzb2Z0d2FyZSBwbHVnLWluLiAgRG8geW91IHdhbnQgdG8gaW5zdGFsbCBpdD8gIChSZXF1aXJlcyByZXN0YXJ0IHdoZW4gZmluaXNoZWQpLgotRXh0ZXJuYWxGaWxlSGFuZGxlcl9SZXBvc2l0b3J5R2VuZXJhdGVkT0s9UmVwb3NpdG9yeSB3YXMgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZCBhdCB7MH0KLUV4dGVybmFsRmlsZUhhbmRsZXJfUHJvbXB0Rm9yVW56aXA9RG8geW91IHdhbnQgdG8gZXhwYW5kIHRoZSBjb250ZW50cyBvZiB7MH0gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIGZvciBpbnN0YWxsPwotRXh0ZXJuYWxGaWxlc1ByZWZlcmVuY2VQYWdlX0FkZEJ1bmRsZUdyb3VwPVdoZW4gSSBhZGQgYSBwbHVnLWluIGZpbGUgYXMgYW4gdXBkYXRlIHNpdGUKLUV4dGVybmFsRmlsZXNQcmVmZXJlbmNlUGFnZV9BcmNoaXZlUmVwb0dlbmVyYXRpb25Hcm91cD1XaGVuIEkgYWRkIGFuIHVucmVjb2duaXplZCBhcmNoaXZlIGZpbGUgYXMgYW4gdXBkYXRlIHNpdGUKLUV4dGVybmFsRmlsZXNQcmVmZXJlbmNlUGFnZV9BdXRvSW5zdGFsbEJ1bmRsZUFsd2F5cz1BdXRvbWF0aWNhbGx5ICZpbnN0YWxsIHRoZSBwbHVnaW4KLUV4dGVybmFsRmlsZXNQcmVmZXJlbmNlUGFnZV9BdXRvSW5zdGFsbEJ1bmRsZU5ldmVyPSZSZXBvciZ0IGFuIGVycm9yCi1FeHRlcm5hbEZpbGVzUHJlZmVyZW5jZVBhZ2VfQXV0b0luc3RhbGxCdW5kbGVQcm9tcHQ9QXNrICZtZSBpZiB0aGUgcGx1Z2luIHNob3VsZCBiZSBpbnN0YWxsZWQKLUV4dGVybmFsRmlsZXNQcmVmZXJlbmNlUGFnZV9HZW5lcmF0ZUFyY2hpdmVSZXBvQWx3YXlzPSZFeHBhbmQgdGhlIGFyY2hpdmUgYW5kIGdlbmVyYXRlIHRoZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gaW5zdGFsbCB0aGUgYXJjaGl2ZSBjb250ZW50cwotRXh0ZXJuYWxGaWxlc1ByZWZlcmVuY2VQYWdlX0dlbmVyYXRlQXJjaGl2ZVJlcG9OZXZlcj1SZSZwb3J0IHRoZSB1bnJlY29nbml6ZWQgYXJjaGl2ZSBjb250ZW50IGFzIGFuIGVycm9yCi1FeHRlcm5hbEZpbGVzUHJlZmVyZW5jZVBhZ2VfR2VuZXJhdGVBcmNoaXZlUmVwb1Byb21wdD1BcyZrIG1lIGlmIHRoZSBpbmZvcm1hdGlvbiBzaG91bGQgYmUgZ2VuZXJhdGVkCi1VcGRhdGVBbmRJbnN0YWxsRGlhbG9nX0luc3RhbGxlZFNvZnR3YXJlPUkmbnN0YWxsZWQgU29mdHdhcmUKLVVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfQWRkU2l0ZUJ1dHRvblRleHQ9JkFkZCBTaXRlLi4uCi1VcGRhdGVBbmRJbnN0YWxsRGlhbG9nX0FkZFNpdGVPcGVyYXRpb25sYWJlbD1BZGQgU2l0ZQotVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19BdmFpbGFibGVTb2Z0d2FyZT1BJnZhaWxhYmxlIFNvZnR3YXJlCi1VcGRhdGVBbmRJbnN0YWxsRGlhbG9nX1ByZWZMaW5rPVNldCBhbiBhdXRvbWF0aWMgdXBkYXRlIHNjaGVkdWxlIGFuZCBvdGhlciA8YT5VcGRhdGUgUHJlZmVyZW5jZXM8L2E+Ci1VcGRhdGVBbmRJbnN0YWxsRGlhbG9nX1RpdGxlPVNvZnR3YXJlIFVwZGF0ZXMgYW5kIEFkZC1vbnMKLVVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfTWFuYWdlU2l0ZXM9Jk1hbmFnZSBzaXRlcy4uLgotVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19NYW5hZ2VTaXRlc1Rvb2x0aXA9Q2hhbmdlIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBzb2Z0d2FyZSBzaXRlcwotVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19OYW1lZE9wZXJhdGlvbkluUHJvZ3Jlc3M9ezB9IGluIHByb2dyZXNzOgotVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19PcGVyYXRpb25JblByb2dyZXNzPU9wZXJhdGlvbiBpbiBwcm9ncmVzcwotVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19SZW1vdmVTaXRlT3BlcmF0aW9uTGFiZWw9UmVtb3ZlIFNpdGUKLVVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfUmV2ZXJ0QWN0aW9uTGFiZWw9JlJldmVydCBjb25maWd1cmF0aW9uLi4uCi1VcGRhdGVBbmRJbnN0YWxsRGlhbG9nX1JldmVydFRvb2x0aXA9UmV2ZXJ0IHRvIGEgcHJldmlvdXMgaW5zdGFsbCBjb25maWd1cmF0aW9uCi1VcGRhdGVBbmRJbnN0YWxsRGlhbG9nX1Byb3BlcnRpZXM9JlByb3BlcnRpZXMuLi4KLVVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfUmVmcmVzaD0mUmVmcmVzaAotVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19SZWZyZXNoVG9vbHRpcD1SZWZyZXNoIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBzb2Z0d2FyZQotVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19TaG93QWxyZWFkeUluc3RhbGxlZEl0ZW1zPUluY2wmdWRlIGl0ZW1zIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gaW5zdGFsbGVkCi1VcGRhdGVBbmRJbnN0YWxsRGlhbG9nX1Nob3dMYXRlc3RWZXJzaW9uc09ubHk9U2hvdyBvbmx5IHRoZSAmbGF0ZXN0IHZlcnNpb25zIG9mIGF2YWlsYWJsZSBzb2Z0d2FyZQotVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19WaWV3QnlDYXRlZ29yeT0mQ2F0ZWdvcnkKLVVwZGF0ZUFuZEluc3RhbGxEaWFsb2dfVmlld0J5TmFtZT0mTmFtZQotVXBkYXRlQW5kSW5zdGFsbERpYWxvZ19WaWV3QnlTaXRlPSZTaXRlCi0KLVVwZGF0ZUhhbmRsZXJfQ2Fubm90TGF1bmNoVUk9Q2Fubm90IGxhdW5jaCB0aGUgVXBkYXRlIFVJLiAgVGhpcyBpbnN0YWxsYXRpb24gaGFzIG5vdCBiZWVuIGNvbmZpZ3VyZWQgcHJvcGVybHkgZm9yIFNvZnR3YXJlIFVwZGF0ZXMuCi1VcGRhdGVIYW5kbGVyX1NES1VwZGF0ZVVJTWVzc2FnZVRpdGxlPVNvZnR3YXJlIFVwZGF0ZXMKLVJlbW92ZUNvbG9jYXRlZFJlcG9zaXRvcnlBY3Rpb25fTGFiZWw9JlJlbW92ZSBzaXRlcy4uLgotUmVtb3ZlQ29sb2NhdGVkUmVwb3NpdG9yeUFjdGlvbl9Ub29sdGlwPVJlbW92ZSBzZWxlY3RlZCBzaXRlcyBmcm9tIHRoZSBhdmFpbGFibGUgc29mdHdhcmUgc2l0ZSBsaXN0Ci1SZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX0FkZEJ1dHRvbj0mQWRkLi4uCi1SZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX0V4cG9ydD1FJnhwb3J0Li4uCi1SZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX0ltcG9ydD0mSW1wb3J0Li4uCi1SZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX0xvY2F0aW9uQ29sdW1uSGVhZGVyPUxvY2F0aW9uCi1SZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX05hbWVDb2x1bW5IZWFkZXI9TmFtZQotUmVwb3NpdG9yeU1hbmlwdWxhdGlvbkRpYWxvZ19Qcm9wZXJ0aWVzQnV0dG9uPSZQcm9wZXJ0aWVzLi4uCi1SZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX1JlbW92ZUJ1dHRvbj0mUmVtb3ZlCi1SZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX1JlbW92ZU9wZXJhdGlvbkxhYmVsPVJlbW92ZQotUmVwb3NpdG9yeU1hbmlwdWxhdGlvbkRpYWxvZ19VcGRhdGVTaXRlc0RpYWxvZ1RpdGxlPUF2YWlsYWJsZSBTb2Z0d2FyZSBTaXRlcwotUmVwb3NpdG9yeU1hbmlwdWxhdGlvbkRpYWxvZ19TZWxlY3RNZXNzYWdlPVRoZSBzaXRlcyB3aXRoIGNoZWNrIG1hcmtzIHdpbGwgYmUgdXNlZCB0byBmaW5kIGF2YWlsYWJsZSBzb2Z0d2FyZS4gIFRoZSBvdGhlcnMgYXJlIGlnbm9yZWQuCi1TY2hlZHVsZXJTdGFydHVwX2RheT1FdmVyeSBkYXkKLVNjaGVkdWxlclN0YXJ0dXBfTW9uZGF5PUV2ZXJ5IE1vbmRheQotU2NoZWR1bGVyU3RhcnR1cF9UdWVzZGF5PUV2ZXJ5IFR1ZXNkYXkKLVNjaGVkdWxlclN0YXJ0dXBfV2VkbmVzZGF5PUV2ZXJ5IFdlZG5lc2RheQotU2NoZWR1bGVyU3RhcnR1cF9UaHVyc2RheT1FdmVyeSBUaHVyc2RheQotU2NoZWR1bGVyU3RhcnR1cF9GcmlkYXk9RXZlcnkgRnJpZGF5Ci1TY2hlZHVsZXJTdGFydHVwX1NhdHVyZGF5PUV2ZXJ5IFNhdHVyZGF5Ci1TY2hlZHVsZXJTdGFydHVwX1N1bmRheT1FdmVyeSBTdW5kYXkKLVNjaGVkdWxlclN0YXJ0dXBfMUFNPTE6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfMkFNPTI6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfM0FNPTM6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfNEFNPTQ6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfNUFNPTU6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfNkFNPTY6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfN0FNPTc6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfOEFNPTg6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfOUFNPTk6MDAgQU0KLVNjaGVkdWxlclN0YXJ0dXBfMTBBTT0xMDowMCBBTQotU2NoZWR1bGVyU3RhcnR1cF8xMUFNPTExOjAwIEFNCi1TY2hlZHVsZXJTdGFydHVwXzEyUE09MTI6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfMVBNPTE6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfMlBNPTI6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfM1BNPTM6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfNFBNPTQ6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfNVBNPTU6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfNlBNPTY6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfN1BNPTc6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfOFBNPTg6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfOVBNPTk6MDAgUE0KLVNjaGVkdWxlclN0YXJ0dXBfMTBQTT0xMDowMCBQTQotU2NoZWR1bGVyU3RhcnR1cF8xMVBNPTExOjAwIFBNCi1TY2hlZHVsZXJTdGFydHVwXzEyQU09MTI6MDAgQU0KLUF1dG9tYXRpY1VwZGF0ZXNQb3B1cF9QcmVmTGlua09ubHk9U2V0IHVwIDxhPlJlbWluZGVyIG9wdGlvbnM8L2E+Ci1BdXRvbWF0aWNVcGRhdGVzUG9wdXBfUmVtaW5kQW5kUHJlZkxpbms9WW91IHdpbGwgYmUgcmVtaW5kZWQgaW4gezB9LlxuU2V0IHJlbWluZGVyIDxhIGhyZWY9InsxfSI+cHJlZmVyZW5jZXM8L2E+Ci1BdXRvbWF0aWNVcGRhdGVzUG9wdXBfUmVtaW5kZXJKb2JUaXRsZT1VcGRhdGUgcmVtaW5kZXIgam9iCi1BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZmluZFVwZGF0ZXM9QXV0b21hdGljYWxseSAmZmluZCBuZXcgdXBkYXRlcyBhbmQgbm90aWZ5IG1lCi1BdXRvbWF0aWNVcGRhdGVTY2hlZHVsZXJfMzBNaW51dGVzPTMwIG1pbnV0ZXMKLUF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlcl82ME1pbnV0ZXM9SG91cgotQXV0b21hdGljVXBkYXRlU2NoZWR1bGVyXzI0ME1pbnV0ZXM9IDQgSG91cnMKLUF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlcl9VcGRhdGVOb3RJbml0aWFsaXplZD1UaGUgdXBkYXRlIGNoZWNrZXIgc2VydmljZSBpcyBub3QgaW5pdGlhbGl6ZWQKLUF1dG9tYXRpY1VwZGF0ZXNQb3B1cF9VcGRhdGVzQXZhaWxhYmxlVGl0bGU9VXBkYXRlcyBBdmFpbGFibGUKLUF1dG9tYXRpY1VwZGF0ZXJfQXV0b21hdGljRG93bmxvYWRPcGVyYXRpb25OYW1lPUF1dG9tYXRpYyB1cGRhdGVzIGRvd25sb2FkCi1BdXRvbWF0aWNVcGRhdGVyX0NsaWNrVG9SZXZpZXdVcGRhdGVzPVVwZGF0ZXMgYXJlIGF2YWlsYWJsZS4gIENsaWNrIGhlcmUgdG8gcmV2aWV3IGFuZCBpbnN0YWxsIHRoZW0uCi1BdXRvbWF0aWNVcGRhdGVyX0NsaWNrVG9SZXZpZXdVcGRhdGVzV2l0aFByb2JsZW1zPVVwZGF0ZXMgYXJlIGF2YWlsYWJsZSwgYnV0IHRoZXJlIG1heSBiZSBzb21lIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMuICBDbGljayBoZXJlIHRvIHJldmlldyB0aGVtLgotQXV0b21hdGljVXBkYXRlcl9FcnJvckNoZWNraW5nVXBkYXRlcz1VbmV4cGVjdGVkIGVycm9yIHdoaWxlIGNoZWNraW5nIHRoZSB2YWxpZGl0eSBvZiB1cGRhdGVzLgotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX1VwZGF0ZVNjaGVkdWxlPSZVcGRhdGUgc2NoZWR1bGUKLUF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9maW5kT25TdGFydD1Mb29rIGZvciB1cGRhdGVzIGVhY2ggdGltZSAmcGxhdGZvcm0gaXMgc3RhcnRlZAotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2ZpbmRPblNjaGVkdWxlPUxvb2sgZm9yIHVwZGF0ZXMgb24gdGhlIGZvbGxvd2luZyAmc2NoZWR1bGU6Ci1BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfZG93bmxvYWRPcHRpb25zPSZEb3dubG9hZCBvcHRpb25zCi1BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2Vfc2VhcmNoQW5kTm90aWZ5PVNlYXJjaCBmb3IgdXBkYXRlcyBhbmQgJm5vdGlmeSBtZSB3aGVuIHRoZXkgYXJlIGF2YWlsYWJsZQotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2Rvd25sb2FkQW5kTm90aWZ5PURvd25sb2FkIG5ldyB1cGRhdGVzICZhdXRvbWF0aWNhbGx5IGFuZCBub3RpZnkgbWUgd2hlbiByZWFkeSB0byBpbnN0YWxsIHRoZW0KLUF1dG9tYXRpY1VwZGF0ZXNQb3B1cF9DbGlja1RvUmV2aWV3RG93bmxvYWRlZD1Tb2Z0d2FyZSB1cGRhdGVzIGhhdmUgYmVlbiBkb3dubG9hZGVkLlxuQ2xpY2sgdG8gcmV2aWV3IGFuZCBpbnN0YWxsIHVwZGF0ZXMuCi1BdXRvbWF0aWNVcGRhdGVzUG9wdXBfQ2xpY2tUb1Jldmlld05vdERvd25sb2FkZWQ9VXBkYXRlcyBhcmUgYXZhaWxhYmxlIGZvciB5b3VyIHNvZnR3YXJlLlxuQ2xpY2sgdG8gcmV2aWV3IGFuZCBpbnN0YWxsIHVwZGF0ZXMuCi1BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfYXQ9YXQKLUF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9SZW1pbmRHcm91cD0mV2hlbiB1cGRhdGVzIGFyZSBmb3VuZAotQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX1JlbWluZFNjaGVkdWxlPSZSZW1pbmQgbWUgYWJvdXQgdXBkYXRlcyBldmVyeToKLUF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9SZW1pbmRPbmNlPU5vdGlmeSBtZSAmb25jZSBhYm91dCB1cGRhdGVzCi1Qcm92U0RLUXVlcnlQcm92aWRlcl9FcnJvclJldHJpZXZpbmdQcm9maWxlPUVycm9yIHdoaWxlIHJldHJpZXZpbmcgcHJvZmlsZSB7MH0KLVByb3ZTREtVSUFjdGl2YXRvcl9FcnJvcldyaXRpbmdMaWNlbnNlUmVnaXN0cnk9RXJyb3Igd3JpdGluZyBsaWNlbnNlIHJlZ2lzdHJ5LiAgQWNjZXB0ZWQgbGljZW5zZXMgd2lsbCBub3QgYmUgcmVtZW1iZXJlZC4KLVByb3ZTREtVSUFjdGl2YXRvcl9MYXVuY2hVcGRhdGVNYW5hZ2VyPUxhdW5jaC4uLgotUHJvdlNES1VJQWN0aXZhdG9yX0xpY2Vuc2VNYW5hZ2VyUmVhZEVycm9yPUVycm9yIHJlYWRpbmcgbGljZW5zZSByZWdpc3RyeS4gIEFjY2VwdGVkIGxpY2Vuc2VzIHdpbGwgbm90IGJlIHJlbWVtYmVyZWQuCi1Qcm92U0RLVUlBY3RpdmF0b3JfTm9TZWxmUHJvZmlsZT1Db3VsZCBub3QgbG9jYXRlIHRoZSBydW5uaW5nIHByb2ZpbGUgaW5zdGFuY2UKLVByb3ZTREtVSUFjdGl2YXRvcl9PcGVuV2l6YXJkQW55d2F5PVRoZSBzb2Z0d2FyZSBpdGVtcyB5b3Ugc2VsZWN0ZWQgbWF5IG5vdCBiZSB2YWxpZCB3aXRoIHlvdXIgY3VycmVudCBpbnN0YWxsYXRpb24uICBEbyB5b3Ugd2FudCB0byBvcGVuIHRoZSB3aXphcmQgYW55d2F5IHRvIHJldmlldyB0aGUgc2VsZWN0aW9ucz8KLVByb3ZTREtVSUFjdGl2YXRvcl9RdWVzdGlvbj1RdWVzdGlvbgotUHJvdlNES1VJQWN0aXZhdG9yX1Vuc3VwcG9ydGVkRmVhdHVyZU1lc3NhZ2U9QSBmZWF0dXJlIHRoYXQgeW91IGhhdmUgc2VsZWN0ZWQgdXNlcyBpbnN0YWxsIHByb2NlZHVyZXMgdGhhdCBhcmUgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBpbnN0YWxsYXRpb24gc3VwcG9ydC4gIFRoaXMgZmVhdHVyZSBjYW4gb25seSBiZSBpbnN0YWxsZWQgYnkgdGhlIG9sZGVyIFVwZGF0ZSBNYW5hZ2VyLiAgXAotXAotRG8geW91IHdhbnQgdG8gbGF1bmNoIHRoZSBvbGRlciBVcGRhdGUgTWFuYWdlcj8KLVByb3ZTREtVSUFjdGl2YXRvcl9VbnN1cHBvcnRlZEZlYXR1cmVUaXRsZT1VbnN1cHBvcnRlZCBJbnN0YWxsCi1Qcm92aXNpb25pbmdQcmVmZXJlbmNlUGFnZV9BbHdheXNPcGVuV2l6YXJkPSZPcGVuIHRoZSB3aXphcmQgYW55d2F5IHRvIHJldmlldyBvciBjaGFuZ2Ugc2VsZWN0aW9ucwotUHJvdmlzaW9uaW5nUHJlZmVyZW5jZVBhZ2VfQnJvd3NpbmdQcmVmc0dyb3VwPUJyb3dzaW5nIGZvciB1cGRhdGVzCi1Qcm92aXNpb25pbmdQcmVmZXJlbmNlUGFnZV9TaG93TGF0ZXN0VmVyc2lvbnM9U2hvdyBvbmx5IHRoZSAmbGF0ZXN0IHZlcnNpb25zIG9mIGF2YWlsYWJsZSBzb2Z0d2FyZQotUHJvdmlzaW9uaW5nUHJlZmVyZW5jZVBhZ2VfU2hvd0FsbFZlcnNpb25zPVNob3cgYWxsICZ2ZXJzaW9ucyBvZiBhdmFpbGFibGUgc29mdHdhcmUKLVByb3Zpc2lvbmluZ1ByZWZlcmVuY2VQYWdlX05ldmVyT3BlbldpemFyZD0mUmVwb3J0IHRoZSBwcm9ibGVtcyBhbmQgZG8gbm90IG9wZW4gdGhlIHdpemFyZAotUHJvdmlzaW9uaW5nUHJlZmVyZW5jZVBhZ2VfT3BlbldpemFyZElmSW52YWxpZD1XaGVuIHNvZnR3YXJlIHNlbGVjdGVkIGZvciBhbiBpbnN0YWxsIHdpemFyZCBtYXkgbm90IGJlIGNvbXBhdGlibGUKLVByb3Zpc2lvbmluZ1ByZWZlcmVuY2VQYWdlX1Byb21wdFRvT3BlbldpemFyZD0mQXNrIG1lIHdoYXQgdG8gZG8gd2hlbiBpdCBoYXBwZW5zCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9wcmVmcy9BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL3ByZWZzL0F1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRiYTQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL3ByZWZzL0F1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay5wcmVmczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLnVwZGF0ZXMuQXV0b21hdGljVXBkYXRlc1BvcHVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBCdXR0b24gZW5hYmxlZENoZWNrOwotCXByaXZhdGUgQnV0dG9uIG9uU3RhcnR1cFJhZGlvLCBvblNjaGVkdWxlUmFkaW87Ci0JcHJpdmF0ZSBDb21ibyBkYXlDb21ibzsKLQlwcml2YXRlIExhYmVsIGF0TGFiZWw7Ci0JcHJpdmF0ZSBDb21ibyBob3VyQ29tYm87Ci0JcHJpdmF0ZSBCdXR0b24gc2VhcmNoT25seVJhZGlvLCBzZWFyY2hBbmREb3dubG9hZFJhZGlvOwotCXByaXZhdGUgQnV0dG9uIHJlbWluZE9uY2VSYWRpbywgcmVtaW5kU2NoZWR1bGVSYWRpbzsKLQlwcml2YXRlIENvbWJvIHJlbWluZEVsYXBzZUNvbWJvOwotCXByaXZhdGUgR3JvdXAgdXBkYXRlU2NoZWR1bGVHcm91cCwgZG93bmxvYWRHcm91cCwgcmVtaW5kR3JvdXA7Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gaW5pdAotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbnRhaW5lciA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWNvbnRhaW5lci5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQllbmFibGVkQ2hlY2sgPSBuZXcgQnV0dG9uKGNvbnRhaW5lciwgU1dULkNIRUNLKTsKLQkJZW5hYmxlZENoZWNrLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9maW5kVXBkYXRlcyk7Ci0KLQkJY3JlYXRlU3BhY2VyKGNvbnRhaW5lciwgMSk7Ci0KLQkJdXBkYXRlU2NoZWR1bGVHcm91cCA9IG5ldyBHcm91cChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJdXBkYXRlU2NoZWR1bGVHcm91cC5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfVXBkYXRlU2NoZWR1bGUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXVwZGF0ZVNjaGVkdWxlR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCXVwZGF0ZVNjaGVkdWxlR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJb25TdGFydHVwUmFkaW8gPSBuZXcgQnV0dG9uKHVwZGF0ZVNjaGVkdWxlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCW9uU3RhcnR1cFJhZGlvLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9maW5kT25TdGFydCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJb25TdGFydHVwUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCW9uU3RhcnR1cFJhZGlvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCXBhZ2VDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCW9uU2NoZWR1bGVSYWRpbyA9IG5ldyBCdXR0b24odXBkYXRlU2NoZWR1bGVHcm91cCwgU1dULlJBRElPKTsKLQkJb25TY2hlZHVsZVJhZGlvLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9maW5kT25TY2hlZHVsZSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJb25TY2hlZHVsZVJhZGlvLnNldExheW91dERhdGEoZ2QpOwotCQlvblNjaGVkdWxlUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZGF5Q29tYm8gPSBuZXcgQ29tYm8odXBkYXRlU2NoZWR1bGVHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWRheUNvbWJvLnNldEl0ZW1zKEF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlci5EQVlTKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2Qud2lkdGhIaW50ID0gMjAwOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gMzA7Ci0JCWRheUNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCi0JCWF0TGFiZWwgPSBuZXcgTGFiZWwodXBkYXRlU2NoZWR1bGVHcm91cCwgU1dULk5VTEwpOwotCQlhdExhYmVsLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9hdCk7Ci0KLQkJaG91ckNvbWJvID0gbmV3IENvbWJvKHVwZGF0ZVNjaGVkdWxlR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlob3VyQ29tYm8uc2V0SXRlbXMoQXV0b21hdGljVXBkYXRlU2NoZWR1bGVyLkhPVVJTKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJaG91ckNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCi0JCWNyZWF0ZVNwYWNlcihjb250YWluZXIsIDEpOwotCi0JCWRvd25sb2FkR3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyLCBTV1QuTk9ORSk7Ci0JCWRvd25sb2FkR3JvdXAuc2V0VGV4dChQcm92U0RLTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX2Rvd25sb2FkT3B0aW9ucyk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZG93bmxvYWRHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZG93bmxvYWRHcm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlzZWFyY2hPbmx5UmFkaW8gPSBuZXcgQnV0dG9uKGRvd25sb2FkR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNlYXJjaE9ubHlSYWRpby5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2Vfc2VhcmNoQW5kTm90aWZ5KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlzZWFyY2hPbmx5UmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXNlYXJjaE9ubHlSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQotCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvID0gbmV3IEJ1dHRvbihkb3dubG9hZEdyb3VwLCBTV1QuUkFESU8pOwotCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9kb3dubG9hZEFuZE5vdGlmeSk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJc2VhcmNoQW5kRG93bmxvYWRSYWRpby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJc2VhcmNoQW5kRG93bmxvYWRSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQotCQljcmVhdGVTcGFjZXIoY29udGFpbmVyLCAxKTsKLQotCQlyZW1pbmRHcm91cCA9IG5ldyBHcm91cChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJcmVtaW5kR3JvdXAuc2V0VGV4dChQcm92U0RLTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc1ByZWZlcmVuY2VQYWdlX1JlbWluZEdyb3VwKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlyZW1pbmRHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJcmVtaW5kR3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJcmVtaW5kT25jZVJhZGlvID0gbmV3IEJ1dHRvbihyZW1pbmRHcm91cCwgU1dULlJBRElPKTsKLQkJcmVtaW5kT25jZVJhZGlvLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQcmVmZXJlbmNlUGFnZV9SZW1pbmRPbmNlKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlyZW1pbmRPbmNlUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJlbWluZE9uY2VSYWRpby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwYWdlQ2hhbmdlZCgpOwotCQkJfQotCQl9KTsKLQotCQlyZW1pbmRTY2hlZHVsZVJhZGlvID0gbmV3IEJ1dHRvbihyZW1pbmRHcm91cCwgU1dULlJBRElPKTsKLQkJcmVtaW5kU2NoZWR1bGVSYWRpby5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2VfUmVtaW5kU2NoZWR1bGUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXJlbWluZFNjaGVkdWxlUmFkaW8uc2V0TGF5b3V0RGF0YShnZCk7Ci0JCXJlbWluZFNjaGVkdWxlUmFkaW8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJcmVtaW5kRWxhcHNlQ29tYm8gPSBuZXcgQ29tYm8ocmVtaW5kR3JvdXAsIFNXVC5SRUFEX09OTFkpOwotCQlyZW1pbmRFbGFwc2VDb21iby5zZXRJdGVtcyhBdXRvbWF0aWNVcGRhdGVzUG9wdXAuRUxBUFNFRCk7Ci0KLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2Qud2lkdGhIaW50ID0gMjAwOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gMzA7Ci0JCXJlbWluZEVsYXBzZUNvbWJvLnNldExheW91dERhdGEoZ2QpOwotCi0JCWluaXRpYWxpemUoKTsKLQotCQllbmFibGVkQ2hlY2suYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJcGFnZUNoYW5nZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb250YWluZXIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNwYWNlcihDb21wb3NpdGUgY29tcG9zaXRlLCBpbnQgY29sdW1uU3BhbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSBjb2x1bW5TcGFuOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJZW5hYmxlZENoZWNrLnNldFNlbGVjdGlvbihwcmVmLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0FVVE9fVVBEQVRFX0VOQUJMRUQpKTsKLQkJc2V0U2NoZWR1bGUocHJlZi5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0FVVE9fVVBEQVRFX1NDSEVEVUxFKSk7Ci0KLQkJZGF5Q29tYm8uc2V0VGV4dChBdXRvbWF0aWNVcGRhdGVTY2hlZHVsZXIuREFZU1tnZXREYXkocHJlZiwgZmFsc2UpXSk7Ci0JCWhvdXJDb21iby5zZXRUZXh0KEF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlci5IT1VSU1tnZXRIb3VyKHByZWYsIGZhbHNlKV0pOwotCi0JCXJlbWluZFNjaGVkdWxlUmFkaW8uc2V0U2VsZWN0aW9uKHByZWYuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUkVNSU5EX1NDSEVEVUxFKSk7Ci0JCXJlbWluZE9uY2VSYWRpby5zZXRTZWxlY3Rpb24oIXByZWYuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUkVNSU5EX1NDSEVEVUxFKSk7Ci0JCXJlbWluZEVsYXBzZUNvbWJvLnNldFRleHQocHJlZi5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1JFTUlORF9FTEFQU0VEKSk7Ci0JCXNlYXJjaE9ubHlSYWRpby5zZXRTZWxlY3Rpb24oIXByZWYuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRE9XTkxPQURfT05MWSkpOwotCQlzZWFyY2hBbmREb3dubG9hZFJhZGlvLnNldFNlbGVjdGlvbihwcmVmLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RPV05MT0FEX09OTFkpKTsKLQotCQlwYWdlQ2hhbmdlZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTY2hlZHVsZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlLmVxdWFscyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVVBEQVRFX09OX1NUQVJUVVApKQotCQkJb25TdGFydHVwUmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotCQllbHNlCi0JCQlvblNjaGVkdWxlUmFkaW8uc2V0U2VsZWN0aW9uKHRydWUpOwotCX0KLQotCXZvaWQgcGFnZUNoYW5nZWQoKSB7Ci0JCWJvb2xlYW4gbWFzdGVyID0gZW5hYmxlZENoZWNrLmdldFNlbGVjdGlvbigpOwotCQl1cGRhdGVTY2hlZHVsZUdyb3VwLnNldEVuYWJsZWQobWFzdGVyKTsKLQkJb25TdGFydHVwUmFkaW8uc2V0RW5hYmxlZChtYXN0ZXIpOwotCQlvblNjaGVkdWxlUmFkaW8uc2V0RW5hYmxlZChtYXN0ZXIpOwotCQlkYXlDb21iby5zZXRFbmFibGVkKG1hc3RlciAmJiBvblNjaGVkdWxlUmFkaW8uZ2V0U2VsZWN0aW9uKCkpOwotCQlhdExhYmVsLnNldEVuYWJsZWQobWFzdGVyICYmIG9uU2NoZWR1bGVSYWRpby5nZXRTZWxlY3Rpb24oKSk7Ci0JCWhvdXJDb21iby5zZXRFbmFibGVkKG1hc3RlciAmJiBvblNjaGVkdWxlUmFkaW8uZ2V0U2VsZWN0aW9uKCkpOwotCQlkb3dubG9hZEdyb3VwLnNldEVuYWJsZWQobWFzdGVyKTsKLQkJc2VhcmNoT25seVJhZGlvLnNldEVuYWJsZWQobWFzdGVyKTsKLQkJc2VhcmNoQW5kRG93bmxvYWRSYWRpby5zZXRFbmFibGVkKG1hc3Rlcik7Ci0JCXJlbWluZEdyb3VwLnNldEVuYWJsZWQobWFzdGVyKTsKLQkJcmVtaW5kU2NoZWR1bGVSYWRpby5zZXRFbmFibGVkKG1hc3Rlcik7Ci0JCXJlbWluZE9uY2VSYWRpby5zZXRFbmFibGVkKG1hc3Rlcik7Ci0JCXJlbWluZEVsYXBzZUNvbWJvLnNldEVuYWJsZWQobWFzdGVyICYmIHJlbWluZFNjaGVkdWxlUmFkaW8uZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBQcm92U0RLVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWVuYWJsZWRDaGVjay5zZXRTZWxlY3Rpb24ocHJlZi5nZXREZWZhdWx0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQVVUT19VUERBVEVfRU5BQkxFRCkpOwotCi0JCXNldFNjaGVkdWxlKHByZWYuZ2V0RGVmYXVsdFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQVVUT19VUERBVEVfU0NIRURVTEUpKTsKLQkJb25TY2hlZHVsZVJhZGlvLnNldFNlbGVjdGlvbihwcmVmLmdldERlZmF1bHRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9BVVRPX1VQREFURV9TQ0hFRFVMRSkpOwotCi0JCWRheUNvbWJvLnNldFRleHQoQXV0b21hdGljVXBkYXRlU2NoZWR1bGVyLkRBWVNbZ2V0RGF5KHByZWYsIHRydWUpXSk7Ci0JCWhvdXJDb21iby5zZXRUZXh0KEF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlci5IT1VSU1tnZXRIb3VyKHByZWYsIHRydWUpXSk7Ci0KLQkJcmVtaW5kT25jZVJhZGlvLnNldFNlbGVjdGlvbighcHJlZi5nZXREZWZhdWx0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUkVNSU5EX1NDSEVEVUxFKSk7Ci0JCXJlbWluZFNjaGVkdWxlUmFkaW8uc2V0U2VsZWN0aW9uKHByZWYuZ2V0RGVmYXVsdEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1JFTUlORF9TQ0hFRFVMRSkpOwotCQlyZW1pbmRFbGFwc2VDb21iby5zZXRUZXh0KHByZWYuZ2V0RGVmYXVsdFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUkVNSU5EX0VMQVBTRUQpKTsKLQotCQlzZWFyY2hPbmx5UmFkaW8uc2V0U2VsZWN0aW9uKCFwcmVmLmdldERlZmF1bHRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ET1dOTE9BRF9PTkxZKSk7Ci0JCXNlYXJjaEFuZERvd25sb2FkUmFkaW8uc2V0U2VsZWN0aW9uKHByZWYuZ2V0RGVmYXVsdEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RPV05MT0FEX09OTFkpKTsKLQkJcGFnZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKiogCi0JICogTWV0aG9kIGRlY2xhcmVkIG9uIElQcmVmZXJlbmNlUGFnZS4KLQkgKiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcHJlZi5zZXRWYWx1ZShQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQVVUT19VUERBVEVfRU5BQkxFRCwgZW5hYmxlZENoZWNrLmdldFNlbGVjdGlvbigpKTsKLQkJaWYgKG9uU3RhcnR1cFJhZGlvLmdldFNlbGVjdGlvbigpKQotCQkJcHJlZi5zZXRWYWx1ZShQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQVVUT19VUERBVEVfU0NIRURVTEUsIFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9VUERBVEVfT05fU1RBUlRVUCk7Ci0JCWVsc2UKLQkJCXByZWYuc2V0VmFsdWUoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0FVVE9fVVBEQVRFX1NDSEVEVUxFLCBQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVVBEQVRFX09OX1NDSEVEVUxFKTsKLQotCQlpZiAocmVtaW5kU2NoZWR1bGVSYWRpby5nZXRTZWxlY3Rpb24oKSkgewotCQkJcHJlZi5zZXRWYWx1ZShQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUkVNSU5EX1NDSEVEVUxFLCB0cnVlKTsKLQkJCXByZWYuc2V0VmFsdWUoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1JFTUlORF9FTEFQU0VELCByZW1pbmRFbGFwc2VDb21iby5nZXRUZXh0KCkpOwotCQl9IGVsc2UgewotCQkJcHJlZi5zZXRWYWx1ZShQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUkVNSU5EX1NDSEVEVUxFLCBmYWxzZSk7Ci0JCX0KLQotCQlwcmVmLnNldFZhbHVlKEF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlci5QX0RBWSwgZGF5Q29tYm8uZ2V0VGV4dCgpKTsKLQkJcHJlZi5zZXRWYWx1ZShBdXRvbWF0aWNVcGRhdGVTY2hlZHVsZXIuUF9IT1VSLCBob3VyQ29tYm8uZ2V0VGV4dCgpKTsKLQotCQlwcmVmLnNldFZhbHVlKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9ET1dOTE9BRF9PTkxZLCBzZWFyY2hBbmREb3dubG9hZFJhZGlvLmdldFNlbGVjdGlvbigpKTsKLQotCQlQcm92U0RLVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCVByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0U2NoZWR1bGVyKCkucmVzY2hlZHVsZVVwZGF0ZSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXREYXkoUHJlZmVyZW5jZXMgcHJlZiwgYm9vbGVhbiB1c2VEZWZhdWx0KSB7Ci0JCVN0cmluZyBkYXkgPSB1c2VEZWZhdWx0ID8gcHJlZi5nZXREZWZhdWx0U3RyaW5nKEF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlci5QX0RBWSkgOiBwcmVmLmdldFN0cmluZyhBdXRvbWF0aWNVcGRhdGVTY2hlZHVsZXIuUF9EQVkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IEF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlci5EQVlTLmxlbmd0aDsgaSsrKQotCQkJaWYgKEF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlci5EQVlTW2ldLmVxdWFscyhkYXkpKQotCQkJCXJldHVybiBpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRIb3VyKFByZWZlcmVuY2VzIHByZWYsIGJvb2xlYW4gdXNlRGVmYXVsdCkgewotCQlTdHJpbmcgaG91ciA9IHVzZURlZmF1bHQgPyBwcmVmLmdldERlZmF1bHRTdHJpbmcoQXV0b21hdGljVXBkYXRlU2NoZWR1bGVyLlBfSE9VUikgOiBwcmVmLmdldFN0cmluZyhBdXRvbWF0aWNVcGRhdGVTY2hlZHVsZXIuUF9IT1VSKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBBdXRvbWF0aWNVcGRhdGVTY2hlZHVsZXIuSE9VUlMubGVuZ3RoOyBpKyspCi0JCQlpZiAoQXV0b21hdGljVXBkYXRlU2NoZWR1bGVyLkhPVVJTW2ldLmVxdWFscyhob3VyKSkKLQkJCQlyZXR1cm4gaTsKLQkJcmV0dXJuIDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvcHJlZnMvQ2xhc3NpY1VwZGF0ZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9wcmVmcy9DbGFzc2ljVXBkYXRlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFmNTZhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9wcmVmcy9DbGFzc2ljVXBkYXRlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay5wcmVmczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay5Qcm92U0RLVUlBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5Qcm92VUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGl2aXRpZXMuSU11dGFibGVBY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aXZpdGllcy5JV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnN0YXR1c2hhbmRsZXJzLlN0YXR1c01hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBDbGFzc2ljVXBkYXRlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUF9FTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElWSVRZX0lEID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLmNsYXNzaWNVcGRhdGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVQREFURV9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UudXBkYXRlLnNjaGVkdWxlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQlmaW5hbCBJV29ya2JlbmNoQWN0aXZpdHlTdXBwb3J0IGFjdGl2aXR5U3VwcG9ydCA9IHdvcmtiZW5jaC5nZXRBY3Rpdml0eVN1cHBvcnQoKTsKLQkJCUlNdXRhYmxlQWN0aXZpdHlNYW5hZ2VyIGNyZWF0ZVdvcmtpbmdDb3B5ID0gYWN0aXZpdHlTdXBwb3J0LmNyZWF0ZVdvcmtpbmdDb3B5KCk7Ci0JCQlTZXQgYWN0aXZpdHlJZHMgPSBjcmVhdGVXb3JraW5nQ29weS5nZXRFbmFibGVkQWN0aXZpdHlJZHMoKTsKLQkJCWZpbmFsIFNldCBlbmFibGVkQWN0aXZpdHlJZHMgPSBuZXcgSGFzaFNldChhY3Rpdml0eUlkcyk7Ci0JCQllbmFibGVkQWN0aXZpdHlJZHMucmVtb3ZlKEFDVElWSVRZX0lEKTsKLQkJCXdvcmtiZW5jaC5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCS8vYWN0aXZpdHkgY2hhbmdlIGxpc3RlbmVycyBtYXkgdG91Y2ggd2lkZ2V0cwotCQkJCQlhY3Rpdml0eVN1cHBvcnQuc2V0RW5hYmxlZEFjdGl2aXR5SWRzKGVuYWJsZWRBY3Rpdml0eUlkcyk7Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJUHJlZmVyZW5jZXMgcHJlZlAyID0gUHJvdlNES1VJQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkvL29ubHkgbWlncmF0ZSBhdXRvLXVwZGF0ZSBwcmVmZXJlbmNlIGZyb20gVU0gb25jZQotCQlib29sZWFuIGF1dG9VcGRhdGVJbml0ID0gcHJlZlAyLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0FVVE9fVVBEQVRFX0lOSVQpOwotCQlpZiAoIWF1dG9VcGRhdGVJbml0KSB7Ci0JCQkvLyBnZXQgVU0gYXV0b21hdGljIHVwZGF0ZSBwcmVmZXJlbmNlCi0JCQlJUHJlZmVyZW5jZXNTZXJ2aWNlIHByZWZlcmVuY2VzU2VydmljZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpOwotCQkJb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlcyBpbnN0YW5jZVNjb3BlID0gcHJlZmVyZW5jZXNTZXJ2aWNlLmdldFJvb3ROb2RlKCkubm9kZShJbnN0YW5jZVNjb3BlLlNDT1BFKTsKLQkJCXRyeSB7Ci0JCQkJYm9vbGVhbiB1cGRhdGVOb2RlRXhpc3RzID0gaW5zdGFuY2VTY29wZS5ub2RlRXhpc3RzKFVQREFURV9QTFVHSU5fSUQpOwotCQkJCW9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXMgcHJlZlVNID0gaW5zdGFuY2VTY29wZS5ub2RlKFVQREFURV9QTFVHSU5fSUQpOwotCQkJCWJvb2xlYW4gZW5hYmxlVXBkYXRlID0gcHJlZlVNLmdldEJvb2xlYW4oUF9FTkFCTEVELCBmYWxzZSk7Ci0JCQkJLy8gc2V0IHAyIGF1dG9tYXRpYyB1cGRhdGUgcHJlZmVyZW5jZSB0byBtYXRjaCBVTSBwcmVmZXJlbmNlCi0JCQkJcHJlZlAyLnNldFZhbHVlKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9BVVRPX1VQREFURV9FTkFCTEVELCBlbmFibGVVcGRhdGUpOwotCQkJCXByZWZQMi5zZXRWYWx1ZShQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfQVVUT19VUERBVEVfSU5JVCwgdHJ1ZSk7Ci0JCQkJUHJvdlNES1VJQWN0aXZhdG9yLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQkvLyB0dXJuIG9mZiBVTSBhdXRvbWF0aWMgdXBkYXRlIHByZWZlcmVuY2UgaWYgaXQgZXhpc3RzCi0JCQkJaWYgKHVwZGF0ZU5vZGVFeGlzdHMpIHsKLQkJCQkJcHJlZlVNLnB1dEJvb2xlYW4oUF9FTkFCTEVELCBmYWxzZSk7Ci0JCQkJCXByZWZVTS5mbHVzaCgpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJUHJvdlVJLmhhbmRsZUV4Y2VwdGlvbihlLCAiRXJyb3Igc2F2aW5nIGNsYXNzaWMgdXBkYXRlIHByZWZlcmVuY2VzIiwgU3RhdHVzTWFuYWdlci5MT0cpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9wcmVmcy9FeHRlcm5hbEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL3ByZWZzL0V4dGVybmFsRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzgxMjJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL3ByZWZzL0V4dGVybmFsRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLnByZWZzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGsuUHJvdlNES01lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLlByb3ZTREtVSUFjdGl2YXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuRmllbGRFZGl0b3JQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlJhZGlvR3JvdXBGaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIHByb3Zpc2lvbmluZyBwcmVmZXJlbmNlcy4KLSAqIAotICogQHNpbmNlIDMuNAotICovCi0KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbEZpbGVzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBGaWVsZEVkaXRvclByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlwdWJsaWMgRXh0ZXJuYWxGaWxlc1ByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcihHUklEKTsKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpZWxkRWRpdG9ycygpIHsKLQkJYWRkRmllbGQobmV3IFJhZGlvR3JvdXBGaWVsZEVkaXRvcihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfR0VORVJBVEVfQVJDSElWRVJFUE9GT0xERVIsIFByb3ZTREtNZXNzYWdlcy5FeHRlcm5hbEZpbGVzUHJlZmVyZW5jZVBhZ2VfQXJjaGl2ZVJlcG9HZW5lcmF0aW9uR3JvdXAsIDEsIG5ldyBTdHJpbmdbXVtdIHsge1Byb3ZTREtNZXNzYWdlcy5FeHRlcm5hbEZpbGVzUHJlZmVyZW5jZVBhZ2VfR2VuZXJhdGVBcmNoaXZlUmVwb0Fsd2F5cywgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuQUxXQVlTfSwge1Byb3ZTREtNZXNzYWdlcy5FeHRlcm5hbEZpbGVzUHJlZmVyZW5jZVBhZ2VfR2VuZXJhdGVBcmNoaXZlUmVwb05ldmVyLCBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5ORVZFUn0sIHtQcm92U0RLTWVzc2FnZXMuRXh0ZXJuYWxGaWxlc1ByZWZlcmVuY2VQYWdlX0dlbmVyYXRlQXJjaGl2ZVJlcG9Qcm9tcHQsIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVH19LCBnZXRGaWVsZEVkaXRvclBhcmVudCgpLCB0cnVlKSk7Ci0JCWFkZEZpZWxkKG5ldyBSYWRpb0dyb3VwRmllbGRFZGl0b3IoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0FVVE9fSU5TVEFMTF9CVU5ETEVTLCBQcm92U0RLTWVzc2FnZXMuRXh0ZXJuYWxGaWxlc1ByZWZlcmVuY2VQYWdlX0FkZEJ1bmRsZUdyb3VwLCAxLCBuZXcgU3RyaW5nW11bXSB7IHtQcm92U0RLTWVzc2FnZXMuRXh0ZXJuYWxGaWxlc1ByZWZlcmVuY2VQYWdlX0F1dG9JbnN0YWxsQnVuZGxlQWx3YXlzLCBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5BTFdBWVN9LCB7UHJvdlNES01lc3NhZ2VzLkV4dGVybmFsRmlsZXNQcmVmZXJlbmNlUGFnZV9BdXRvSW5zdGFsbEJ1bmRsZU5ldmVyLCBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5ORVZFUn0sIHtQcm92U0RLTWVzc2FnZXMuRXh0ZXJuYWxGaWxlc1ByZWZlcmVuY2VQYWdlX0F1dG9JbnN0YWxsQnVuZGxlUHJvbXB0LCBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFR9fSwgZ2V0RmllbGRFZGl0b3JQYXJlbnQoKSwgdHJ1ZSkpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2gpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9wcmVmcy9QcmVmZXJlbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNmU5Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvcHJlZnMvUHJlZmVyZW5jZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLnByZWZzOwotCi0vKioKLSAqIEBzaW5jZSAzLjQKLSAqLwotcHVibGljIGNsYXNzIFByZWZlcmVuY2VDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUEFHRV9QUk9WSVNJT05JTkcgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGsuUHJvdmlzaW9uaW5nUHJlZmVyZW5jZVBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9QQUdFX0FVVE9fVVBEQVRFUyA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay5BdXRvbWF0aWNVcGRhdGVzUHJlZmVyZW5jZVBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9BVVRPX1VQREFURV9FTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9BVVRPX1VQREFURV9TQ0hFRFVMRSA9ICJzY2hlZHVsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1VQREFURV9PTl9TVEFSVFVQID0gIm9uLXN0YXJ0dXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9VUERBVEVfT05fU0NIRURVTEUgPSAib24tc2NoZWR1bGUiOyAvLyROT04tTkxTLTEkICAvLyBzdHJpbmcgdmFsdWUgZGVmaW5lZCBpbiBBdXRvbWF0aWNVcGRhdGVTY2hlZHVsZXIgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9ET1dOTE9BRF9PTkxZID0gImRvd25sb2FkIjsgLy8gdmFsdWUgaXMgdHJ1ZSBvciBmYWxzZSwgZGVmYXVsdCBpcyBmYWxzZSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9SRU1JTkRfU0NIRURVTEUgPSAicmVtaW5kT25TY2hlZHVsZSI7IC8vIHZhbHVlIGlzIHRydWUgb3IgZmFsc2UgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfUkVNSU5EX0VMQVBTRUQgPSAicmVtaW5kRWxhcHNlZFRpbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGX1NIT1dfTEFURVNUX1ZFUlNJT04gPSAic2hvd0xhdGVzdFZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9PUEVOX1dJWkFSRF9PTl9FUlJPUl9QTEFOID0gImFsbG93Tm9uT0tQbGFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZfR0VORVJBVEVfQVJDSElWRVJFUE9GT0xERVIgPSAiZ2VuZXJhdGVSZXBvc0ZvckFyY2hpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9BVVRPX0lOU1RBTExfQlVORExFUyA9ICJhdXRvSW5zdGFsbEJ1bmRsZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRl9BVVRPX1VQREFURV9JTklUID0gImF1dG9VcGRhdGVJbml0IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvcHJlZnMvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9wcmVmcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwMDdkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9wcmVmcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay5wcmVmczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLlByb3ZTREtNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLk1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQHNpbmNlIDMuNAotICovCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZSgib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsiKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlLnB1dEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0FVVE9fVVBEQVRFX0VOQUJMRUQsIGZhbHNlKTsKLQkJbm9kZS5wdXQoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0FVVE9fVVBEQVRFX1NDSEVEVUxFLCBQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfVVBEQVRFX09OX1NUQVJUVVApOwotCQlub2RlLnB1dEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX0RPV05MT0FEX09OTFksIGZhbHNlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9SRU1JTkRfU0NIRURVTEUsIGZhbHNlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9TSE9XX0xBVEVTVF9WRVJTSU9OLCB0cnVlKTsKLQkJbm9kZS5wdXQoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1JFTUlORF9FTEFQU0VELCBQcm92U0RLTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlU2NoZWR1bGVyXzMwTWludXRlcyk7Ci0JCW5vZGUucHV0KFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9PUEVOX1dJWkFSRF9PTl9FUlJPUl9QTEFOLCBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5QUk9NUFQpOwotCQlub2RlLnB1dChQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfR0VORVJBVEVfQVJDSElWRVJFUE9GT0xERVIsIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVCk7Ci0JCW5vZGUucHV0KFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9BVVRPX0lOU1RBTExfQlVORExFUywgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL3ByZWZzL1Byb3Zpc2lvbmluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay9wcmVmcy9Qcm92aXNpb25pbmdQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTcwYTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL3ByZWZzL1Byb3Zpc2lvbmluZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLnByZWZzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLlByb3ZTREtNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay5Qcm92U0RLVUlBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIGdlbmVyYWwgcHJvdmlzaW9uaW5nIHByZWZlcmVuY2VzLgotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLQotcHVibGljIGNsYXNzIFByb3Zpc2lvbmluZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBHcm91cCBicm93c2luZ0dyb3VwLCB2YWxpZGF0ZUdyb3VwOwotCXByaXZhdGUgQnV0dG9uIHNob3dMYXRlc3RSYWRpbywgc2hvd0FsbFJhZGlvOwotCXByaXZhdGUgQnV0dG9uIGFsd2F5c1Nob3dGYWlsZWRQbGFuLCBuZXZlclNob3dGYWlsZWRQbGFuLCBwcm9tcHRPbkZhaWxlZFBsYW47Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb250YWluZXIgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb250YWluZXIuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JvdXAgZm9yIHNob3cgYWxsIHZlcnNpb25zIHZzLiBzaG93IGxhdGVzdAotCQlicm93c2luZ0dyb3VwID0gbmV3IEdyb3VwKGNvbnRhaW5lciwgU1dULk5PTkUpOwotCQlicm93c2luZ0dyb3VwLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLlByb3Zpc2lvbmluZ1ByZWZlcmVuY2VQYWdlX0Jyb3dzaW5nUHJlZnNHcm91cCk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJYnJvd3NpbmdHcm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJYnJvd3NpbmdHcm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlzaG93TGF0ZXN0UmFkaW8gPSBuZXcgQnV0dG9uKGJyb3dzaW5nR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNob3dMYXRlc3RSYWRpby5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5Qcm92aXNpb25pbmdQcmVmZXJlbmNlUGFnZV9TaG93TGF0ZXN0VmVyc2lvbnMpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNob3dMYXRlc3RSYWRpby5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlzaG93QWxsUmFkaW8gPSBuZXcgQnV0dG9uKGJyb3dzaW5nR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXNob3dBbGxSYWRpby5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5Qcm92aXNpb25pbmdQcmVmZXJlbmNlUGFnZV9TaG93QWxsVmVyc2lvbnMpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXNob3dBbGxSYWRpby5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvL0dyb3VwIGZvciB2YWxpZGF0aW5nIGEgZmFpbGVkIHBsYW4KLQkJdmFsaWRhdGVHcm91cCA9IG5ldyBHcm91cChjb250YWluZXIsIFNXVC5OT05FKTsKLQkJdmFsaWRhdGVHcm91cC5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5Qcm92aXNpb25pbmdQcmVmZXJlbmNlUGFnZV9PcGVuV2l6YXJkSWZJbnZhbGlkKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQl2YWxpZGF0ZUdyb3VwLnNldExheW91dChsYXlvdXQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQl2YWxpZGF0ZUdyb3VwLnNldExheW91dERhdGEoZ2QpOwotCi0JCWFsd2F5c1Nob3dGYWlsZWRQbGFuID0gbmV3IEJ1dHRvbih2YWxpZGF0ZUdyb3VwLCBTV1QuUkFESU8pOwotCQlhbHdheXNTaG93RmFpbGVkUGxhbi5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5Qcm92aXNpb25pbmdQcmVmZXJlbmNlUGFnZV9BbHdheXNPcGVuV2l6YXJkKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAzOwotCQlhbHdheXNTaG93RmFpbGVkUGxhbi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQluZXZlclNob3dGYWlsZWRQbGFuID0gbmV3IEJ1dHRvbih2YWxpZGF0ZUdyb3VwLCBTV1QuUkFESU8pOwotCQluZXZlclNob3dGYWlsZWRQbGFuLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLlByb3Zpc2lvbmluZ1ByZWZlcmVuY2VQYWdlX05ldmVyT3BlbldpemFyZCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMzsKLQkJbmV2ZXJTaG93RmFpbGVkUGxhbi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlwcm9tcHRPbkZhaWxlZFBsYW4gPSBuZXcgQnV0dG9uKHZhbGlkYXRlR3JvdXAsIFNXVC5SQURJTyk7Ci0JCXByb21wdE9uRmFpbGVkUGxhbi5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5Qcm92aXNpb25pbmdQcmVmZXJlbmNlUGFnZV9Qcm9tcHRUb09wZW5XaXphcmQpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDM7Ci0JCXByb21wdE9uRmFpbGVkUGxhbi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlpbml0aWFsaXplKCk7Ci0KLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChjb250YWluZXIpOwotCQlyZXR1cm4gY29udGFpbmVyOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBQcm92U0RLVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXNob3dMYXRlc3RSYWRpby5zZXRTZWxlY3Rpb24ocHJlZi5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9TSE9XX0xBVEVTVF9WRVJTSU9OKSk7Ci0JCXNob3dBbGxSYWRpby5zZXRTZWxlY3Rpb24oIXByZWYuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0hPV19MQVRFU1RfVkVSU0lPTikpOwotCQlTdHJpbmcgb3BlbldpemFyZCA9IHByZWYuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9PUEVOX1dJWkFSRF9PTl9FUlJPUl9QTEFOKTsKLQkJYWx3YXlzU2hvd0ZhaWxlZFBsYW4uc2V0U2VsZWN0aW9uKG9wZW5XaXphcmQuZXF1YWxzKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLkFMV0FZUykpOwotCQluZXZlclNob3dGYWlsZWRQbGFuLnNldFNlbGVjdGlvbihvcGVuV2l6YXJkLmVxdWFscyhNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5ORVZFUikpOwotCQlwcm9tcHRPbkZhaWxlZFBsYW4uc2V0U2VsZWN0aW9uKG9wZW5XaXphcmQuZXF1YWxzKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCVByZWZlcmVuY2VzIHByZWYgPSBQcm92U0RLVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXNob3dMYXRlc3RSYWRpby5zZXRTZWxlY3Rpb24ocHJlZi5nZXREZWZhdWx0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0hPV19MQVRFU1RfVkVSU0lPTikpOwotCQlzaG93QWxsUmFkaW8uc2V0U2VsZWN0aW9uKCFwcmVmLmdldERlZmF1bHRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9TSE9XX0xBVEVTVF9WRVJTSU9OKSk7Ci0JCVN0cmluZyBvcGVuV2l6YXJkID0gcHJlZi5nZXREZWZhdWx0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9PUEVOX1dJWkFSRF9PTl9FUlJPUl9QTEFOKTsKLQkJYWx3YXlzU2hvd0ZhaWxlZFBsYW4uc2V0U2VsZWN0aW9uKG9wZW5XaXphcmQuZXF1YWxzKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLkFMV0FZUykpOwotCQluZXZlclNob3dGYWlsZWRQbGFuLnNldFNlbGVjdGlvbihvcGVuV2l6YXJkLmVxdWFscyhNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5ORVZFUikpOwotCQlwcm9tcHRPbkZhaWxlZFBsYW4uc2V0U2VsZWN0aW9uKG9wZW5XaXphcmQuZXF1YWxzKE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLlBST01QVCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZiA9IFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcHJlZi5zZXRWYWx1ZShQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfU0hPV19MQVRFU1RfVkVSU0lPTiwgc2hvd0xhdGVzdFJhZGlvLmdldFNlbGVjdGlvbigpKTsKLQkJaWYgKGFsd2F5c1Nob3dGYWlsZWRQbGFuLmdldFNlbGVjdGlvbigpKQotCQkJcHJlZi5zZXRWYWx1ZShQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfT1BFTl9XSVpBUkRfT05fRVJST1JfUExBTiwgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuQUxXQVlTKTsKLQkJZWxzZSBpZiAobmV2ZXJTaG93RmFpbGVkUGxhbi5nZXRTZWxlY3Rpb24oKSkKLQkJCXByZWYuc2V0VmFsdWUoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX09QRU5fV0laQVJEX09OX0VSUk9SX1BMQU4sIE1lc3NhZ2VEaWFsb2dXaXRoVG9nZ2xlLk5FVkVSKTsKLQkJZWxzZQotCQkJcHJlZi5zZXRWYWx1ZShQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfT1BFTl9XSVpBUkRfT05fRVJST1JfUExBTiwgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUuUFJPTVBUKTsKLQotCQlQcm92U0RLVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIE5vdGhpbmcgdG8gZG8KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL3VwZGF0ZXMvQXV0b21hdGljVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvdXBkYXRlcy9BdXRvbWF0aWNVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZjNmMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLnNkay9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91aS9zZGsvdXBkYXRlcy9BdXRvbWF0aWNVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLnVwZGF0ZXM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FdmVudE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGsucHJlZnMuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cy5JUHJvdmlzaW9uaW5nRXZlbnRCdXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLlByb3Zpc2lvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IuUHJvZmlsZUNoYW5nZVJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5kaXJlY3Rvci5Qcm92aXNpb25pbmdQbGFuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLmFjdGlvbnMuVXBkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkub3BlcmF0aW9ucy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkucG9saWN5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5xdWVyeS5FbGVtZW50UXVlcnlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuc2RrLlByb3ZQb2xpY2llczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVwZGF0ZWNoZWNrZXIuSVVwZGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudXBkYXRlY2hlY2tlci5VcGRhdGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLldvcmtiZW5jaEpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5zdGF0dXNoYW5kbGVycy5TdGF0dXNNYW5hZ2VyOwotCi0vKioKLSAqIEBzaW5jZSAzLjQKLSAqLwotcHVibGljIGNsYXNzIEF1dG9tYXRpY1VwZGF0ZXIgaW1wbGVtZW50cyBJVXBkYXRlTGlzdGVuZXIgewotCi0JLyoqCi0JICogQHNpbmNlIDMuNAotCSAqCi0JICovCi0JZmluYWwgY2xhc3MgQXV0b21hdGljVXBkYXRlQWN0aW9uIGV4dGVuZHMgVXBkYXRlQWN0aW9uIHsKLQkJUHJvdmlzaW9uaW5nUGxhbiBjdXJyZW50UGxhbjsKLQotCQlBdXRvbWF0aWNVcGRhdGVBY3Rpb24oSVNlbGVjdGlvblByb3ZpZGVyIHNlbGVjdGlvblByb3ZpZGVyLCBTdHJpbmcgcHJvZmlsZUlkLCBJUHJvZmlsZUNob29zZXIgY2hvb3NlciwgUG9saWNpZXMgcG9saWNpZXMsIFNoZWxsIHNoZWxsKSB7Ci0JCQlzdXBlcihzZWxlY3Rpb25Qcm92aWRlciwgcHJvZmlsZUlkLCBjaG9vc2VyLCBwb2xpY2llcywgc2hlbGwpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBsYW4oKSB7Ci0JCQl0cnkgewotCQkJCWN1cnJlbnRQbGFuID0gZ2V0UHJvdmlzaW9uaW5nUGxhbihpdXNXaXRoVXBkYXRlcywgcHJvZmlsZUlkLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgUHJvdmlzaW9uaW5nUGxhbiBnZXRQcm92aXNpb25pbmdQbGFuKCkgewotCQkJaWYgKGN1cnJlbnRQbGFuICE9IG51bGwpCi0JCQkJcmV0dXJuIGN1cnJlbnRQbGFuOwotCQkJcmV0dXJuIHN1cGVyLmdldFByb3Zpc2lvbmluZ1BsYW4oKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJUGxhblZhbGlkYXRvciBnZXRQbGFuVmFsaWRhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBJUGxhblZhbGlkYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBjb250aW51ZVdvcmtpbmdXaXRoUGxhbihQcm92aXNpb25pbmdQbGFuIHBsYW4sIFNoZWxsIHNoZWxsKSB7Ci0JCQkJCWlmIChhbHJlYWR5VmFsaWRhdGVkKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCS8vIEluIGFsbCBvdGhlciBjYXNlcyB3ZSByZXR1cm4gZmFsc2UsIGJlY2F1c2UgdGhlIGNsaWNraW5nIHRoZSBwb3B1cCB3aWxsIGFjdHVhbGx5IHJ1biB0aGUgYWN0aW9uLgotCQkJCQkvLyBXZSBhcmUganVzdCBjaGVja2luZyBwcmVmcyB0byBkZXRlcm1pbmUgd2hldGhlciB0byB0byBzaG93IHRoZSBwb3B1cCBvciBub3QuCi0JCQkJCVN0cmluZyBvcGVuUGxhbiA9IHByZWZzLmdldFN0cmluZyhQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfT1BFTl9XSVpBUkRfT05fRVJST1JfUExBTik7Ci0JCQkJCWlmIChwbGFuICE9IG51bGwpIHsKLQkJCQkJCWJvb2xlYW4gbm9FcnJvciA9IHBsYW4uZ2V0U3RhdHVzKCkuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkVSUk9SOwotCQkJCQkJaWYgKG5vRXJyb3IgfHwgIShNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5ORVZFUi5lcXVhbHMob3BlblBsYW4pKSkgewotCQkJCQkJCS8vIFNob3cgdGhlIGFmZm9yZGFuY2UgaWYgdXNlciBwcmVmZXJzIGFsd2F5cyBvcGVuaW5nIGEgY3VycmVudFBsYW4gb3IgYmVpbmcgcHJvbXB0ZWQKLQkJCQkJCQkvLyBJbiB0aGlzIGNvbnRleHQsIHRoZSBhZmZvcmRhbmNlIGlzIHRoZSBwcm9tcHQuCi0JCQkJCQkJaWYgKHVwZGF0ZUFmZm9yZGFuY2UgPT0gbnVsbCkKLQkJCQkJCQkJY3JlYXRlVXBkYXRlQWZmb3JkYW5jZSgpOwotCQkJCQkJCXNldFVwZGF0ZUFmZm9yZGFuY2VTdGF0ZShub0Vycm9yKTsKLQkJCQkJCQkvLyBJZiB0aGUgdXNlciBhbHdheXMgd2FudHMgdG8gb3BlbiBpbnZhbGlkIHBsYW5zLCBvciB0aGVyZSBpcyBubyBlcnJvciB0aGVuIGdvIGFoZWFkIGFuZCBzaG93Ci0JCQkJCQkJLy8gdGhlIHBvcHVwLgotCQkJCQkJCWlmICgobm9FcnJvciB8fCBNZXNzYWdlRGlhbG9nV2l0aFRvZ2dsZS5BTFdBWVMuZXF1YWxzKG9wZW5QbGFuKSkgJiYgcG9wdXAgPT0gbnVsbCkKLQkJCQkJCQkJY3JlYXRlVXBkYXRlUG9wdXAoKTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gVGhlcmUgaXMgYW4gZXJyb3IgYW5kIHRoZSBwcmVmIGlzIE5FVkVSLCB0aGUgdXNlciBkb2Vzbid0IHdhbnQgdG8ga25vdyBhYm91dCBpdAotCQkJCQkJCVByb3ZVSS5yZXBvcnRTdGF0dXMocGxhbi5nZXRTdGF0dXMoKSwgU3RhdHVzTWFuYWdlci5MT0cpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JfQotCi0JUHJlZmVyZW5jZXMgcHJlZnM7Ci0JU3RhdHVzTGluZUNMYWJlbENvbnRyaWJ1dGlvbiB1cGRhdGVBZmZvcmRhbmNlOwotCUF1dG9tYXRpY1VwZGF0ZUFjdGlvbiB1cGRhdGVBY3Rpb247Ci0JSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyOwotCUlJbnN0YWxsYWJsZVVuaXRbXSBpdXNXaXRoVXBkYXRlczsKLQlTdHJpbmcgcHJvZmlsZUlkOwotCUF1dG9tYXRpY1VwZGF0ZXNQb3B1cCBwb3B1cDsKLQlQcm92aXNpb25pbmdMaXN0ZW5lciBwcm9maWxlQ2hhbmdlTGlzdGVuZXI7Ci0JYm9vbGVhbiBhbHJlYWR5VmFsaWRhdGVkID0gZmFsc2U7Ci0JYm9vbGVhbiBhbHJlYWR5RG93bmxvYWRlZCA9IGZhbHNlOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX1VQREFURV9TVEFUVVNfSVRFTSA9ICJBdXRvVXBkYXRlc1N0YXR1cyI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBBdXRvbWF0aWNVcGRhdGVyKCkgewotCQlwcmVmcyA9IFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudXBkYXRlY2hlY2tlci5JVXBkYXRlTGlzdGVuZXIjdXBkYXRlc0F2YWlsYWJsZShvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVwZGF0ZWNoZWNrZXIuVXBkYXRlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlc0F2YWlsYWJsZShmaW5hbCBVcGRhdGVFdmVudCBldmVudCkgewotCQlmaW5hbCBib29sZWFuIGRvd25sb2FkID0gcHJlZnMuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfRE9XTkxPQURfT05MWSk7Ci0JCXByb2ZpbGVJZCA9IGV2ZW50LmdldFByb2ZpbGVJZCgpOwotCQlpdXNXaXRoVXBkYXRlcyA9IGV2ZW50LmdldElVcygpOwotCQl2YWxpZGF0ZVVwZGF0ZXMobnVsbCwgdHJ1ZSk7Ci0JCWFscmVhZHlEb3dubG9hZGVkID0gZmFsc2U7Ci0KLQkJaWYgKGl1c1dpdGhVcGRhdGVzLmxlbmd0aCA8PSAwKSB7Ci0JCQljbGVhclVwZGF0ZXNBdmFpbGFibGUoKTsKLQkJCXJldHVybjsKLQkJfQotCQlyZWdpc3RlclByb2ZpbGVDaGFuZ2VMaXN0ZW5lcigpOwotCi0JCS8vIERvd25sb2FkIHRoZSBpdGVtcyBpZiB0aGUgcHJlZmVyZW5jZSBkaWN0YXRlcyBiZWZvcmUKLQkJLy8gc2hvd2luZyB0aGUgdXNlciB0aGF0IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS4KLQkJdHJ5IHsKLQkJCWlmIChkb3dubG9hZCkgewotCQkJCUVsZW1lbnRRdWVyeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UXVlcnlQcm92aWRlcigpLmdldFF1ZXJ5RGVzY3JpcHRvcihldmVudCwgSVF1ZXJ5UHJvdmlkZXIuQVZBSUxBQkxFX1VQREFURVMpOwotCQkJCUlJbnN0YWxsYWJsZVVuaXRbXSByZXBsYWNlbWVudHMgPSAoSUluc3RhbGxhYmxlVW5pdFtdKSBkZXNjcmlwdG9yLnF1ZXJ5YWJsZS5xdWVyeShkZXNjcmlwdG9yLnF1ZXJ5LCBkZXNjcmlwdG9yLmNvbGxlY3RvciwgbnVsbCkudG9BcnJheShJSW5zdGFsbGFibGVVbml0LmNsYXNzKTsKLQkJCQlpZiAocmVwbGFjZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkJUHJvZmlsZUNoYW5nZVJlcXVlc3QgcmVxdWVzdCA9IFByb2ZpbGVDaGFuZ2VSZXF1ZXN0LmNyZWF0ZUJ5UHJvZmlsZUlkKGV2ZW50LmdldFByb2ZpbGVJZCgpKTsKLQkJCQkJcmVxdWVzdC5yZW1vdmVJbnN0YWxsYWJsZVVuaXRzKGl1c1dpdGhVcGRhdGVzKTsKLQkJCQkJcmVxdWVzdC5hZGRJbnN0YWxsYWJsZVVuaXRzKHJlcGxhY2VtZW50cyk7Ci0JCQkJCWZpbmFsIFByb3Zpc2lvbmluZ1BsYW4gcGxhbiA9IFByb3Zpc2lvbmluZ1V0aWwuZ2V0UGxhbm5lcigpLmdldFByb3Zpc2lvbmluZ1BsYW4ocmVxdWVzdCwgbmV3IFByb3Zpc2lvbmluZ0NvbnRleHQoKSwgbnVsbCk7Ci0JCQkJCUpvYiBqb2IgPSBQcm92aXNpb25pbmdPcGVyYXRpb25SdW5uZXIuc2NoZWR1bGUobmV3IFByb2ZpbGVNb2RpZmljYXRpb25PcGVyYXRpb24oUHJvdlNES01lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXJfQXV0b21hdGljRG93bmxvYWRPcGVyYXRpb25OYW1lLCBldmVudC5nZXRQcm9maWxlSWQoKSwgcGxhbiwgbmV3IERvd25sb2FkUGhhc2VTZXQoKSwgZmFsc2UpLCBudWxsLCBTdGF0dXNNYW5hZ2VyLkxPRyk7Ci0JCQkJCWpvYi5hZGRKb2JDaGFuZ2VMaXN0ZW5lcihuZXcgSm9iQ2hhbmdlQWRhcHRlcigpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIGRvbmUoSUpvYkNoYW5nZUV2ZW50IGpvYkV2ZW50KSB7Ci0JCQkJCQkJYWxyZWFkeURvd25sb2FkZWQgPSB0cnVlOwotCQkJCQkJCUlTdGF0dXMgc3RhdHVzID0gam9iRXZlbnQuZ2V0UmVzdWx0KCk7Ci0JCQkJCQkJaWYgKHN0YXR1cy5pc09LKCkpIHsKLQkJCQkJCQkJY3JlYXRlVXBkYXRlQWN0aW9uKCk7Ci0JCQkJCQkJCXVwZGF0ZUFjdGlvbi5pbml0aWFsaXplUGxhbigpOwotCQkJCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJCXVwZGF0ZUFjdGlvbi5ydW4oKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSk7Ci0JCQkJCQkJfSBlbHNlIGlmIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSAhPSBJU3RhdHVzLkNBTkNFTCkgewotCQkJCQkJCQlQcm92VUkucmVwb3J0U3RhdHVzKHN0YXR1cywgU3RhdHVzTWFuYWdlci5MT0cpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQljcmVhdGVVcGRhdGVBY3Rpb24oKTsKLQkJCQl1cGRhdGVBY3Rpb24uaW5pdGlhbGl6ZVBsYW4oKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQl1cGRhdGVBY3Rpb24ucnVuKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQotCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJUHJvdlVJLmhhbmRsZUV4Y2VwdGlvbihlLCBQcm92U0RLTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlcl9FcnJvckNoZWNraW5nVXBkYXRlcywgU3RhdHVzTWFuYWdlci5MT0cpOwotCQl9Ci0KLQl9Ci0KLQkvKgotCSAqIFZhbGlkYXRlIHRoYXQgaXVzVG9CZVVwZGF0ZWQgaXMgdmFsaWQsIGFuZCByZXNldCB0aGUgY2FjaGUuICAKLQkgKiBJZiBpc0tub3duVG9CZUF2YWlsYWJsZSBpcyBmYWxzZSwgdGhlbiByZWNoZWNrIHRoYXQgdGhlIHVwZGF0ZSBpcwotCSAqIGF2YWlsYWJsZS4gIGlzS25vd25Ub0JlQXZhaWxhYmxlIHNob3VsZCBiZSBmYWxzZSB3aGVuIHRoZSB1cGRhdGUgbGlzdCAKLQkgKiBtaWdodCBiZSBzdGFsZSAoUmVtaW5kaW5nIHRoZSB1c2VyIG9mIHVwZGF0ZXMgbWF5IGhhcHBlbiBsb25nCi0JICogYWZ0ZXIgdGhlIHVwZGF0ZS4gIFRoaXMgcmVkdWNlcyB0aGUgcmlzayBvZiBub3RpZnlpbmcgdGhlIHVzZXIKLQkgKiBvZiB1cGRhdGVzIGFuZCB0aGVuIG5vdCBmaW5kaW5nIHRoZW0gLikKLQkgKi8KLQotCXZvaWQgdmFsaWRhdGVVcGRhdGVzKElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgYm9vbGVhbiBpc0tub3duVG9CZUF2YWlsYWJsZSkgewotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdXNXaXRoVXBkYXRlcy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlpZiAoaXNLbm93blRvQmVBdmFpbGFibGUgfHwgUHJvdmlzaW9uaW5nVXRpbC5nZXRQbGFubmVyKCkudXBkYXRlc0ZvcihpdXNXaXRoVXBkYXRlc1tpXSwgbmV3IFByb3Zpc2lvbmluZ0NvbnRleHQoKSwgbW9uaXRvcikubGVuZ3RoID4gMCkgewotCQkJCQlpZiAoIXVwZGF0ZUxvY2tlZChpdXNXaXRoVXBkYXRlc1tpXSkpCi0JCQkJCQlsaXN0LmFkZChpdXNXaXRoVXBkYXRlc1tpXSk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlQcm92VUkuaGFuZGxlRXhjZXB0aW9uKGUsIFByb3ZTREtNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVyX0Vycm9yQ2hlY2tpbmdVcGRhdGVzLCBTdGF0dXNNYW5hZ2VyLkxPRyk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCX0KLQkJaXVzV2l0aFVwZGF0ZXMgPSAoSUluc3RhbGxhYmxlVW5pdFtdKSBsaXN0LnRvQXJyYXkobmV3IElJbnN0YWxsYWJsZVVuaXRbbGlzdC5zaXplKCldKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gdXBkYXRlTG9ja2VkKElJbnN0YWxsYWJsZVVuaXQgaXUpIHsKLQkJaW50IGxvY2sgPSBJSW5zdGFsbGFibGVVbml0LkxPQ0tfTk9ORTsKLQkJdHJ5IHsKLQkJCUlQcm9maWxlIHByb2ZpbGUgPSBQcm92aXNpb25pbmdVdGlsLmdldFByb2ZpbGUocHJvZmlsZUlkKTsKLQkJCVN0cmluZyB2YWx1ZSA9IHByb2ZpbGUuZ2V0SW5zdGFsbGFibGVVbml0UHJvcGVydHkoaXUsIElJbnN0YWxsYWJsZVVuaXQuUFJPUF9QUk9GSUxFX0xPQ0tFRF9JVSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQlsb2NrID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSBhbmQgYXNzdW1lIG5vIGxvY2sKLQkJfQotCQlyZXR1cm4gKGxvY2sgJiBJSW5zdGFsbGFibGVVbml0LkxPQ0tfVVBEQVRFKSA9PSBJSW5zdGFsbGFibGVVbml0LkxPQ0tfVVBEQVRFOwotCX0KLQotCVNoZWxsIGdldFdvcmtiZW5jaFdpbmRvd1NoZWxsKCkgewotCQlJV29ya2JlbmNoV2luZG93IGFjdGl2ZVdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCXJldHVybiBhY3RpdmVXaW5kb3cgIT0gbnVsbCA/IGFjdGl2ZVdpbmRvdy5nZXRTaGVsbCgpIDogbnVsbDsKLQotCX0KLQotCUlTdGF0dXNMaW5lTWFuYWdlciBnZXRTdGF0dXNMaW5lTWFuYWdlcigpIHsKLQkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpCi0JCQlyZXR1cm4gc3RhdHVzTGluZU1hbmFnZXI7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgYWN0aXZlV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKGFjdGl2ZVdpbmRvdyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIFlVQ0shICBZVUNLISAgWVVDSyEKLQkJLy8gSVdvcmtiZW5jaFdpbmRvdyBkb2VzIG5vdCBkZWZpbmUgZ2V0U3RhdHVzTGluZU1hbmFnZXIoKSwgeWV0IFdvcmtiZW5jaFdpbmRvdyBkb2VzCi0JCXRyeSB7Ci0JCQlNZXRob2QgbWV0aG9kID0gYWN0aXZlV2luZG93LmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2QoImdldFN0YXR1c0xpbmVNYW5hZ2VyIiwgbmV3IENsYXNzWzBdKTsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlPYmplY3Qgc3RhdHVzTGluZSA9IG1ldGhvZC5pbnZva2UoYWN0aXZlV2luZG93LCBuZXcgT2JqZWN0WzBdKTsKLQkJCQlpZiAoc3RhdHVzTGluZSBpbnN0YW5jZW9mIElTdGF0dXNMaW5lTWFuYWdlcikgewotCQkJCQlzdGF0dXNMaW5lTWFuYWdlciA9IChJU3RhdHVzTGluZU1hbmFnZXIpIHN0YXR1c0xpbmU7Ci0JCQkJCXJldHVybiBzdGF0dXNMaW5lTWFuYWdlcjsKLQkJCQl9Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBvaCB3ZWxsCi0JCQl9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJIHRyaWVkCi0JCQl9Ci0JCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjYW4ndCBibGFtZSB1cyBmb3IgdHJ5aW5nLgotCQl9Ci0KLQkJSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSBhY3RpdmVXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZVBhcnQoKS5nZXRTaXRlKCk7Ci0JCWlmIChzaXRlIGluc3RhbmNlb2YgSVZpZXdTaXRlKSB7Ci0JCQlzdGF0dXNMaW5lTWFuYWdlciA9ICgoSVZpZXdTaXRlKSBzaXRlKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJfSBlbHNlIGlmIChzaXRlIGluc3RhbmNlb2YgSUVkaXRvclNpdGUpIHsKLQkJCXN0YXR1c0xpbmVNYW5hZ2VyID0gKChJRWRpdG9yU2l0ZSkgc2l0ZSkuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1c0xpbmVNYW5hZ2VyOwotCX0KLQotCXZvaWQgdXBkYXRlU3RhdHVzTGluZSgpIHsKLQkJSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIgPSBnZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQlpZiAobWFuYWdlciAhPSBudWxsKQotCQkJbWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JfQotCi0Jdm9pZCBjcmVhdGVVcGRhdGVBZmZvcmRhbmNlKCkgewotCQl1cGRhdGVBZmZvcmRhbmNlID0gbmV3IFN0YXR1c0xpbmVDTGFiZWxDb250cmlidXRpb24oQVVUT19VUERBVEVfU1RBVFVTX0lURU0sIDUpOwotCQl1cGRhdGVBZmZvcmRhbmNlLmFkZExpc3RlbmVyKFNXVC5Nb3VzZURvd24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJbGF1bmNoVXBkYXRlKCk7Ci0JCQl9Ci0JCX0pOwotCQlJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlciA9IGdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyICE9IG51bGwpIHsKLQkJCW1hbmFnZXIuYWRkKHVwZGF0ZUFmZm9yZGFuY2UpOwotCQkJbWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldFVwZGF0ZUFmZm9yZGFuY2VTdGF0ZShib29sZWFuIGlzVmFsaWQpIHsKLQkJaWYgKHVwZGF0ZUFmZm9yZGFuY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzVmFsaWQpIHsKLQkJCXVwZGF0ZUFmZm9yZGFuY2Uuc2V0VG9vbHRpcChQcm92U0RLTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlcl9DbGlja1RvUmV2aWV3VXBkYXRlcyk7Ci0JCQl1cGRhdGVBZmZvcmRhbmNlLnNldEltYWdlKFByb3ZVSUltYWdlcy5nZXRJbWFnZShQcm92VUlJbWFnZXMuSU1HX1RPT0xfVVBEQVRFKSk7Ci0JCX0gZWxzZSB7Ci0JCQl1cGRhdGVBZmZvcmRhbmNlLnNldFRvb2x0aXAoUHJvdlNES01lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXJfQ2xpY2tUb1Jldmlld1VwZGF0ZXNXaXRoUHJvYmxlbXMpOwotCQkJdXBkYXRlQWZmb3JkYW5jZS5zZXRJbWFnZShQcm92VUlJbWFnZXMuZ2V0SW1hZ2UoUHJvdlVJSW1hZ2VzLklNR19UT09MX1VQREFURV9QUk9CTEVNUykpOwotCQl9Ci0JCUlTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyID0gZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJbWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGNyZWF0ZVVwZGF0ZVBvcHVwKCkgewotCQlwb3B1cCA9IG5ldyBBdXRvbWF0aWNVcGRhdGVzUG9wdXAoZ2V0V29ya2JlbmNoV2luZG93U2hlbGwoKSwgYWxyZWFkeURvd25sb2FkZWQsIHByZWZzKTsKLQkJcG9wdXAub3BlbigpOwotCi0JfQotCi0Jdm9pZCBjcmVhdGVVcGRhdGVBY3Rpb24oKSB7Ci0JCWlmICh1cGRhdGVBY3Rpb24gPT0gbnVsbCkKLQkJCXVwZGF0ZUFjdGlvbiA9IG5ldyBBdXRvbWF0aWNVcGRhdGVBY3Rpb24oZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSwgcHJvZmlsZUlkLCBudWxsLCBQcm92UG9saWNpZXMuZ2V0RGVmYXVsdCgpLCBudWxsKTsKLQl9Ci0KLQl2b2lkIGNsZWFyVXBkYXRlc0F2YWlsYWJsZSgpIHsKLQkJaWYgKHVwZGF0ZUFmZm9yZGFuY2UgIT0gbnVsbCkgewotCQkJSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIgPSBnZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQkJaWYgKG1hbmFnZXIgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIucmVtb3ZlKHVwZGF0ZUFmZm9yZGFuY2UpOwotCQkJCW1hbmFnZXIudXBkYXRlKHRydWUpOwotCQkJfQotCQkJdXBkYXRlQWZmb3JkYW5jZS5kaXNwb3NlKCk7Ci0JCQl1cGRhdGVBZmZvcmRhbmNlID0gbnVsbDsKLQkJfQotCQlpZiAocG9wdXAgIT0gbnVsbCkgewotCQkJcG9wdXAuY2xvc2UoZmFsc2UpOwotCQkJcG9wdXAgPSBudWxsOwotCQl9Ci0JCWFscmVhZHlWYWxpZGF0ZWQgPSBmYWxzZTsKLQl9Ci0KLQlJU2VsZWN0aW9uUHJvdmlkZXIgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JCXJldHVybiBuZXcgSVNlbGVjdGlvblByb3ZpZGVyKCkgewotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI2FkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJLy8gSWdub3JlIGJlY2F1c2UgdGhlIHNlbGVjdGlvbiB3b24ndCBjaGFuZ2UgCi0JCQl9Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjZ2V0U2VsZWN0aW9uKCkKLQkJCSAqLwotCQkJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihpdXNXaXRoVXBkYXRlcyk7Ci0JCQl9Ci0KLQkJCS8qIChub24tSmF2YWRvYykKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXIjcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcikKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQkvLyBpZ25vcmUgYmVjYXVzZSB0aGUgc2VsZWN0aW9uIGlzIHN0YXRpYwotCQkJfQotCi0JCQkvKiAobm9uLUphdmFkb2MpCi0JCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyI3NldFNlbGVjdGlvbihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JCQkgKi8KLQkJCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbCkgewotCQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBJU2VsZWN0aW9uUHJvdmlkZXIgaXMgc3RhdGljLCBhbmQgY2Fubm90IGJlIG1vZGlmaWVkLiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX07Ci0JfQotCi0JcHVibGljIHZvaWQgbGF1bmNoVXBkYXRlKCkgewotCQlhbHJlYWR5VmFsaWRhdGVkID0gdHJ1ZTsKLQkJdXBkYXRlQWN0aW9uLnJ1bigpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWdpc3RlclByb2ZpbGVDaGFuZ2VMaXN0ZW5lcigpIHsKLQkJaWYgKHByb2ZpbGVDaGFuZ2VMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlwcm9maWxlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgUHJvdmlzaW9uaW5nTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbm90aWZ5KEV2ZW50T2JqZWN0IG8pIHsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBQcm9maWxlRXZlbnQpIHsKLQkJCQkJCVByb2ZpbGVFdmVudCBldmVudCA9IChQcm9maWxlRXZlbnQpIG87Ci0JCQkJCQlpZiAoZXZlbnQuZ2V0UmVhc29uKCkgPT0gUHJvZmlsZUV2ZW50LkNIQU5HRUQgJiYgcHJvZmlsZUlkLmVxdWFscyhldmVudC5nZXRQcm9maWxlSWQoKSkpIHsKLQkJCQkJCQl2YWxpZGF0ZVVwZGF0ZXMoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlJUHJvdmlzaW9uaW5nRXZlbnRCdXMgYnVzID0gUHJvdlNES1VJQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRQcm92aXNpb25pbmdFdmVudEJ1cygpOwotCQkJaWYgKGJ1cyAhPSBudWxsKQotCQkJCWJ1cy5hZGRMaXN0ZW5lcihwcm9maWxlQ2hhbmdlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGUgcHJvZmlsZSBoYXMgY2hhbmdlZC4gIE1ha2Ugc3VyZSBvdXIgdG9VcGRhdGUgbGlzdCBpcwotCSAqIHN0aWxsIHZhbGlkIGFuZCBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIHVwZGF0ZSwgZ2V0IHJpZAotCSAqIG9mIHRoZSB1cGRhdGUgcG9wdXAgYW5kIGFmZm9yZGFuY2UuCi0JICovCi0Jdm9pZCB2YWxpZGF0ZVVwZGF0ZXMoKSB7Ci0JCUpvYiB2YWxpZGF0ZUpvYiA9IG5ldyBXb3JrYmVuY2hKb2IoIlVwZGF0ZSB2YWxpZGF0ZSBqb2IiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQkJdmFsaWRhdGVVcGRhdGVzKG1vbml0b3IsIGZhbHNlKTsKLQkJCQlpZiAoaXVzV2l0aFVwZGF0ZXMubGVuZ3RoID09IDApCi0JCQkJCWNsZWFyVXBkYXRlc0F2YWlsYWJsZSgpOwotCQkJCWVsc2UgewotCQkJCQljcmVhdGVVcGRhdGVBY3Rpb24oKTsKLQkJCQkJdXBkYXRlQWN0aW9uLmluaXRpYWxpemVQbGFuKCk7Ci0JCQkJCXNldFVwZGF0ZUFmZm9yZGFuY2VTdGF0ZSh1cGRhdGVBY3Rpb24uZ2V0UHJvdmlzaW9uaW5nUGxhbigpLmdldFN0YXR1cygpLmlzT0soKSk7Ci0JCQkJfQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQl2YWxpZGF0ZUpvYi5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCXZhbGlkYXRlSm9iLnNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCXZhbGlkYXRlSm9iLnNjaGVkdWxlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWlmIChwcm9maWxlQ2hhbmdlTGlzdGVuZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVByb3Zpc2lvbmluZ0V2ZW50QnVzIGJ1cyA9IFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UHJvdmlzaW9uaW5nRXZlbnRCdXMoKTsKLQkJaWYgKGJ1cyAhPSBudWxsKQotCQkJYnVzLnJlbW92ZUxpc3RlbmVyKHByb2ZpbGVDaGFuZ2VMaXN0ZW5lcik7Ci0JCXByb2ZpbGVDaGFuZ2VMaXN0ZW5lciA9IG51bGw7Ci0JCXN0YXR1c0xpbmVNYW5hZ2VyID0gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL3VwZGF0ZXMvQXV0b21hdGljVXBkYXRlc1BvcHVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VpL3Nkay91cGRhdGVzL0F1dG9tYXRpY1VwZGF0ZXNQb3B1cC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDhjMWEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdWkvc2RrL3VwZGF0ZXMvQXV0b21hdGljVXBkYXRlc1BvcHVwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLnVwZGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXMuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudWkuc2RrLlByb3ZTREtNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay5Qcm92U0RLVUlBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGsucHJlZnMuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLlByb3ZVSUltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklEaWFsb2dTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlBvcHVwRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmxheW91dC5HcmlkRGF0YUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5Xb3JrYmVuY2hKb2I7Ci0KLS8qKgotICogQXV0b21hdGljVXBkYXRlc1BvcHVwIGlzIGFuIGFzeW5jIHBvcHVwIGRpYWxvZyBmb3Igbm90aWZ5aW5nCi0gKiB0aGUgdXNlciBvZiB1cGRhdGVzLgotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvbWF0aWNVcGRhdGVzUG9wdXAgZXh0ZW5kcyBQb3B1cERpYWxvZyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTEFQU0VEID0ge1Byb3ZTREtNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVTY2hlZHVsZXJfMzBNaW51dGVzLCBQcm92U0RLTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlU2NoZWR1bGVyXzYwTWludXRlcywgUHJvdlNES01lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZVNjaGVkdWxlcl8yNDBNaW51dGVzfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1JTlVURSA9IDYwICogMTAwMEw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTX0hSRUYgPSAiUFJFRlMiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJQUxPR19TRVRUSU5HU19TRUNUSU9OID0gIkF1dG9tYXRpY1VwZGF0ZXNQb3B1cCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9QVVBfT0ZGU0VUID0gMjA7Ci0KLQlQcmVmZXJlbmNlcyBwcmVmczsKLQlsb25nIHJlbWluZERlbGF5ID0gLTFMOwotCUlQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHByZWZMaXN0ZW5lcjsKLQlXb3JrYmVuY2hKb2IgcmVtaW5kSm9iOwotCWJvb2xlYW4gZG93bmxvYWRlZDsKLQlDb21wb3NpdGUgZGlhbG9nQXJlYTsKLQlMaW5rIHJlbWluZExpbms7Ci0JTW91c2VMaXN0ZW5lciBjbGlja0xpc3RlbmVyOwotCi0JcHVibGljIEF1dG9tYXRpY1VwZGF0ZXNQb3B1cChTaGVsbCBwYXJlbnRTaGVsbCwgYm9vbGVhbiBhbHJlYWR5RG93bmxvYWRlZCwgUHJlZmVyZW5jZXMgcHJlZnMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwsIFBvcHVwRGlhbG9nLklORk9QT1BVUFJFU0laRV9TSEVMTFNUWUxFIHwgU1dULk1PREVMRVNTLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBQcm92U0RLTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc1BvcHVwX1VwZGF0ZXNBdmFpbGFibGVUaXRsZSwgbnVsbCk7Ci0JCWRvd25sb2FkZWQgPSBhbHJlYWR5RG93bmxvYWRlZDsKLQkJdGhpcy5wcmVmcyA9IHByZWZzOwotCQlyZW1pbmREZWxheSA9IGNvbXB1dGVSZW1pbmREZWxheSgpOwotCQljbGlja0xpc3RlbmVyID0gbmV3IE1vdXNlQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCQlQcm92U0RLVUlBY3RpdmF0b3IuZ2V0RGVmYXVsdCgpLmdldEF1dG9tYXRpY1VwZGF0ZXIoKS5sYXVuY2hVcGRhdGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJZGlhbG9nQXJlYSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWRpYWxvZ0FyZWEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlkaWFsb2dBcmVhLnNldExheW91dChsYXlvdXQpOwotCQlkaWFsb2dBcmVhLmFkZE1vdXNlTGlzdGVuZXIoY2xpY2tMaXN0ZW5lcik7Ci0KLQkJLy8gVGhlICJjbGljayB0byB1cGRhdGUiIGxhYmVsCi0JCUxhYmVsIGluZm9MYWJlbCA9IG5ldyBMYWJlbChkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCWlmIChkb3dubG9hZGVkKQotCQkJaW5mb0xhYmVsLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQb3B1cF9DbGlja1RvUmV2aWV3RG93bmxvYWRlZCk7Ci0JCWVsc2UKLQkJCWluZm9MYWJlbC5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzUG9wdXBfQ2xpY2tUb1Jldmlld05vdERvd25sb2FkZWQpOwotCQlpbmZvTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCWluZm9MYWJlbC5hZGRNb3VzZUxpc3RlbmVyKGNsaWNrTGlzdGVuZXIpOwotCi0JCWNyZWF0ZVJlbWluZFNlY3Rpb24oZGlhbG9nQXJlYSk7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUmVtaW5kU2VjdGlvbihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJlbWluZExpbmsgPSBuZXcgTGluayhwYXJlbnQsIFNXVC5NVUxUSSB8IFNXVC5XUkFQIHwgU1dULlJJR0hUKTsKLQkJdXBkYXRlUmVtaW5kVGV4dCgpOwotCQlyZW1pbmRMaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUEFHRV9BVVRPX1VQREFURVMsIG51bGwsIG51bGwpOwotCQkJCWRpYWxvZy5vcGVuKCk7Ci0KLQkJCX0KLQkJfSk7Ci0JCXJlbWluZExpbmsuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJlbWluZFRleHQoKSB7Ci0JCWlmIChwcmVmcy5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9SRU1JTkRfU0NIRURVTEUpKQotCQkJcmVtaW5kTGluay5zZXRUZXh0KE5MUy5iaW5kKFByb3ZTREtNZXNzYWdlcy5BdXRvbWF0aWNVcGRhdGVzUG9wdXBfUmVtaW5kQW5kUHJlZkxpbmssIG5ldyBTdHJpbmdbXSB7cHJlZnMuZ2V0U3RyaW5nKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9SRU1JTkRfRUxBUFNFRCksIFBSRUZTX0hSRUZ9KSk7Ci0JCWVsc2UKLQkJCXJlbWluZExpbmsuc2V0VGV4dChQcm92U0RLTWVzc2FnZXMuQXV0b21hdGljVXBkYXRlc1BvcHVwX1ByZWZMaW5rT25seSk7Ci0JCXJlbWluZExpbmsuZ2V0UGFyZW50KCkubGF5b3V0KHRydWUpOwotCX0KLQotCXByb3RlY3RlZCBJRGlhbG9nU2V0dGluZ3MgZ2V0RGlhbG9nQm91bmRzU2V0dGluZ3MoKSB7Ci0JCUlEaWFsb2dTZXR0aW5ncyBzZXR0aW5ncyA9IFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0RGlhbG9nU2V0dGluZ3MoKTsKLQkJSURpYWxvZ1NldHRpbmdzIHNlY3Rpb24gPSBzZXR0aW5ncy5nZXRTZWN0aW9uKERJQUxPR19TRVRUSU5HU19TRUNUSU9OKTsKLQkJaWYgKHNlY3Rpb24gPT0gbnVsbCkgewotCQkJc2VjdGlvbiA9IHNldHRpbmdzLmFkZE5ld1NlY3Rpb24oRElBTE9HX1NFVFRJTkdTX1NFQ1RJT04pOwotCQl9Ci0JCXJldHVybiBzZWN0aW9uOwotCX0KLQotCXB1YmxpYyBpbnQgb3BlbigpIHsKLQkJcHJlZkxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCWhhbmRsZVByZWZlcmVuY2VDaGFuZ2UoZXZlbnQpOwotCQkJfQotCQl9OwotCQlwcmVmcy5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZMaXN0ZW5lcik7Ci0JCXJldHVybiBzdXBlci5vcGVuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2xvc2UoKSB7Ci0JCXJldHVybiBjbG9zZSh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZShib29sZWFuIHJlbWluZCkgewotCQlpZiAocmVtaW5kICYmIHByZWZzLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1JFTUlORF9TQ0hFRFVMRSkpCi0JCQlzY2hlZHVsZVJlbWluZEpvYigpOwotCQllbHNlCi0JCQljYW5jZWxSZW1pbmRKb2IoKTsKLQkJaWYgKHByZWZMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlwcmVmcy5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHByZWZMaXN0ZW5lcik7Ci0JCQlwcmVmTGlzdGVuZXIgPSBudWxsOwotCQl9Ci0JCXJldHVybiBzdXBlci5jbG9zZSgpOwotCi0JfQotCi0Jdm9pZCBzY2hlZHVsZVJlbWluZEpvYigpIHsKLQkJLy8gQ2FuY2VsIGFueSBwZW5kaW5nIHJlbWluZCBqb2IgaWYgdGhlcmUgaXMgb25lCi0JCWlmIChyZW1pbmRKb2IgIT0gbnVsbCkKLQkJCXJlbWluZEpvYi5jYW5jZWwoKTsKLQkJLy8gSWYgbm8gdXBkYXRlcyBoYXZlIGJlZW4gZm91bmQsIHRoZXJlIGlzIG5vdGhpbmcgdG8gcmVtaW5kCi0JCWlmIChyZW1pbmREZWxheSA8IDApCi0JCQlyZXR1cm47Ci0JCXJlbWluZEpvYiA9IG5ldyBXb3JrYmVuY2hKb2IoUHJvdlNES01lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQb3B1cF9SZW1pbmRlckpvYlRpdGxlKSB7Ci0JCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJcmV0dXJuIFN0YXR1cy5DQU5DRUxfU1RBVFVTOwotCQkJCW9wZW4oKTsKLQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCX0KLQkJfTsKLQkJcmVtaW5kSm9iLnNldFN5c3RlbSh0cnVlKTsKLQkJcmVtaW5kSm9iLnNldFByaW9yaXR5KEpvYi5JTlRFUkFDVElWRSk7Ci0JCXJlbWluZEpvYi5zY2hlZHVsZShyZW1pbmREZWxheSk7Ci0KLQl9Ci0KLQkvKgotCSAqIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZvciB0aGUgZGVsYXkKLQkgKiBpbiByZW1pbmRpbmcgdGhlIHVzZXIgb2YgdXBkYXRlcwotCSAqLwotCWxvbmcgY29tcHV0ZVJlbWluZERlbGF5KCkgewotCQlpZiAocHJlZnMuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUkVNSU5EX1NDSEVEVUxFKSkgewotCQkJU3RyaW5nIGVsYXBzZWQgPSBwcmVmcy5nZXRTdHJpbmcoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1JFTUlORF9FTEFQU0VEKTsKLQkJCWZvciAoaW50IGQgPSAwOyBkIDwgRUxBUFNFRC5sZW5ndGg7IGQrKykKLQkJCQlpZiAoRUxBUFNFRFtkXS5lcXVhbHMoZWxhcHNlZCkpCi0JCQkJCXN3aXRjaCAoZCkgewotCQkJCQkJY2FzZSAwIDoKLQkJCQkJCQkvLyAzMCBtaW51dGVzCi0JCQkJCQkJcmV0dXJuIDMwICogTUlOVVRFOwotCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkvLyA2MCBtaW51dGVzCi0JCQkJCQkJcmV0dXJuIDYwICogTUlOVVRFOwotCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQkvLyAyNDAgbWludXRlcwotCQkJCQkJCXJldHVybiAyNDAgKiBNSU5VVEU7Ci0JCQkJCX0KLQkJfQotCQlyZXR1cm4gLTFMOwotCX0KLQotCXZvaWQgY2FuY2VsUmVtaW5kSm9iKCkgewotCQlpZiAocmVtaW5kSm9iICE9IG51bGwpIHsKLQkJCXJlbWluZEpvYi5jYW5jZWwoKTsKLQkJCXJlbWluZEpvYiA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBuZXdTaGVsbCkgewotCQlzdXBlci5jb25maWd1cmVTaGVsbChuZXdTaGVsbCk7Ci0JCW5ld1NoZWxsLnNldFRleHQoUHJvdlNES01lc3NhZ2VzLkF1dG9tYXRpY1VwZGF0ZXNQb3B1cF9VcGRhdGVzQXZhaWxhYmxlVGl0bGUpOwotCX0KLQotCS8qKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3cjZ2V0SW5pdGlhbExvY2F0aW9uKG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludCkKLQkgKi8KLQlwcm90ZWN0ZWQgUG9pbnQgZ2V0SW5pdGlhbExvY2F0aW9uKFBvaW50IGluaXRpYWxTaXplKSB7Ci0JCVNoZWxsIHBhcmVudCA9IGdldFBhcmVudFNoZWxsKCk7Ci0JCVBvaW50IHBhcmVudFNpemUsIHBhcmVudExvY2F0aW9uOwotCi0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50U2l6ZSA9IHBhcmVudC5nZXRTaXplKCk7Ci0JCQlwYXJlbnRMb2NhdGlvbiA9IHBhcmVudC5nZXRMb2NhdGlvbigpOwotCQl9IGVsc2UgewotCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmdldEJvdW5kcygpOwotCQkJcGFyZW50U2l6ZSA9IG5ldyBQb2ludChib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQkJcGFyZW50TG9jYXRpb24gPSBuZXcgUG9pbnQoMCwgMCk7Ci0JCX0KLQkJLy8gV2UgaGF2ZSB0byB0YWtlIHBhcmVudCBsb2NhdGlvbiBpbnRvIGFjY291bnQgYmVjYXVzZSBTV1QgY29uc2lkZXJzIGFsbAotCQkvLyBzaGVsbCBsb2NhdGlvbnMgdG8gYmUgaW4gZGlzcGxheSBjb29yZGluYXRlcywgZXZlbiBpZiB0aGUgc2hlbGwgaXMgcGFyZW50ZWQuCi0JCXJldHVybiBuZXcgUG9pbnQocGFyZW50U2l6ZS54IC0gaW5pdGlhbFNpemUueCArIHBhcmVudExvY2F0aW9uLnggLSBQT1BVUF9PRkZTRVQsIHBhcmVudFNpemUueSAtIGluaXRpYWxTaXplLnkgKyBwYXJlbnRMb2NhdGlvbi55IC0gUE9QVVBfT0ZGU0VUKTsKLQl9Ci0KLQl2b2lkIGhhbmRsZVByZWZlcmVuY2VDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoUHJlZmVyZW5jZUNvbnN0YW50cy5QUkVGX1JFTUlORF9TQ0hFRFVMRS5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpIHsKLQkJCS8vIFJlbWluZGVycyB0dXJuZWQgb24KLQkJCWlmIChwcmVmcy5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuUFJFRl9SRU1JTkRfU0NIRURVTEUpKSB7Ci0JCQkJaWYgKHJlbWluZExpbmsgPT0gbnVsbCkKLQkJCQkJY3JlYXRlUmVtaW5kU2VjdGlvbihkaWFsb2dBcmVhKTsKLQkJCQllbHNlIHsKLQkJCQkJdXBkYXRlUmVtaW5kVGV4dCgpOwotCQkJCQlnZXRTaGVsbCgpLmxheW91dCh0cnVlLCB0cnVlKTsKLQkJCQl9Ci0JCQkJY29tcHV0ZVJlbWluZERlbGF5KCk7Ci0JCQkJc2NoZWR1bGVSZW1pbmRKb2IoKTsKLQkJCX0gZWxzZSB7IC8vIHJlbWluZGVycyB0dXJuZWQgb2ZmCi0JCQkJaWYgKHJlbWluZExpbmsgIT0gbnVsbCkgewotCQkJCQl1cGRhdGVSZW1pbmRUZXh0KCk7Ci0JCQkJCWdldFNoZWxsKCkubGF5b3V0KHRydWUsIHRydWUpOwotCQkJCX0KLQkJCQljYW5jZWxSZW1pbmRKb2IoKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLlBSRUZfUkVNSU5EX0VMQVBTRUQuZXF1YWxzKGV2ZW50LmdldFByb3BlcnR5KCkpKSB7Ci0JCQkvLyBSZW1pbmRpbmcgc2NoZWR1bGUgY2hhbmdlZAotCQkJY29tcHV0ZVJlbWluZERlbGF5KCk7Ci0JCQlzY2hlZHVsZVJlbWluZEpvYigpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBPdmVycmlkZGVuIHNvIHRoYXQgY2xpY2tpbmcgaW4gdGhlIHRpdGxlIG1lbnUgYXJlYSBjbG9zZXMgdGhlIGRpYWxvZy4KLQkgKiBBbHNvIGNyZWF0ZXMgYSBjbG9zZSBib3ggbWVudSBpbiB0aGUgdGl0bGUgYXJlYS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVUaXRsZU1lbnVBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHRpdGxlQ29tcG9zaXRlID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlVGl0bGVNZW51QXJlYShwYXJlbnQpOwotCQl0aXRsZUNvbXBvc2l0ZS5hZGRNb3VzZUxpc3RlbmVyKGNsaWNrTGlzdGVuZXIpOwotCi0JCVRvb2xCYXIgdG9vbEJhciA9IG5ldyBUb29sQmFyKHRpdGxlQ29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCVRvb2xJdGVtIGNsb3NlQnV0dG9uID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNILCAwKTsKLQotCQlHcmlkRGF0YUZhY3RvcnkuZmlsbERlZmF1bHRzKCkuYWxpZ24oU1dULkVORCwgU1dULkNFTlRFUikuYXBwbHlUbyh0b29sQmFyKTsKLQkJY2xvc2VCdXR0b24uc2V0SW1hZ2UoUHJvdlVJSW1hZ2VzLmdldEltYWdlKFByb3ZVSUltYWdlcy5JTUdfVE9PTF9DTE9TRSkpOwotCQljbG9zZUJ1dHRvbi5zZXRIb3RJbWFnZShQcm92VUlJbWFnZXMuZ2V0SW1hZ2UoUHJvdlVJSW1hZ2VzLklNR19UT09MX0NMT1NFX0hPVCkpOwotCQljbG9zZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQljbG9zZSgpOwotCQkJfQotCQl9KTsKLQkJLy8gU2VlIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNzcxODMKLQkJdG9vbEJhci5hZGRNb3VzZUxpc3RlbmVyKG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQkJY2xvc2UoKTsKLQkJCX0KLQkJfSk7Ci0JCXJldHVybiB0aXRsZUNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIE92ZXJyaWRkZW4gdG8gYWRqdXN0IHRoZSBzcGFuIG9mIHRoZSB0aXRsZSBsYWJlbC4KLQkgKiBSZWFjaHksIHJlYWNoeS4uLi4KLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLlBvcHVwRGlhbG9nI2NyZWF0ZVRpdGxlQ29udHJvbChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlVGl0bGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlVGl0bGVDb250cm9sKHBhcmVudCk7Ci0JCU9iamVjdCBkYXRhID0gY29udHJvbC5nZXRMYXlvdXREYXRhKCk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgR3JpZERhdGEpIHsKLQkJCSgoR3JpZERhdGEpIGRhdGEpLmhvcml6b250YWxTcGFuID0gMTsKLQkJfQotCQlyZXR1cm4gY29udHJvbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3VpL3Nkay9Qcm92UG9saWNpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvdWkvc2RrL1Byb3ZQb2xpY2llcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDgyNDc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvdWkvc2RrL1Byb3ZQb2xpY2llcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuc2RrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51aS5zZGsuUHJvdlNES1VJQWN0aXZhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkucG9saWN5Lio7Ci0KLS8qKgotICogUHJvdlBvbGljaWVzIGRlZmluZXMgdGhlIGNvbmZpZ3VyYWJsZSBhc3BlY3RzIG9mIHRoZSBTREsgVUkuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm92UG9saWNpZXMgZXh0ZW5kcyBQb2xpY2llcyB7Ci0JcHJpdmF0ZSBzdGF0aWMgUHJvdlBvbGljaWVzIGRlZmF1bHRJbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgUHJvdlBvbGljaWVzIGdldERlZmF1bHQoKSB7Ci0JCWlmIChkZWZhdWx0SW5zdGFuY2UgPT0gbnVsbCkKLQkJCWRlZmF1bHRJbnN0YW5jZSA9IG5ldyBQcm92UG9saWNpZXMoKTsKLQkJcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSVF1ZXJ5UHJvdmlkZXIgZ2V0UXVlcnlQcm92aWRlcigpIHsKLQkJcmV0dXJuIFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UXVlcnlQcm92aWRlcigpOwotCX0KLQotCXB1YmxpYyBMaWNlbnNlTWFuYWdlciBnZXRMaWNlbnNlTWFuYWdlcigpIHsKLQkJcmV0dXJuIFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0TGljZW5zZU1hbmFnZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVBsYW5WYWxpZGF0b3IgZ2V0UGxhblZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UGxhblZhbGlkYXRvcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvdWkvc2RrL1JlcG9zaXRvcnlNYW5pcHVsYXRpb25EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvdWkvc2RrL1JlcG9zaXRvcnlNYW5pcHVsYXRpb25EaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkYzMwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3VpL3Nkay9SZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkuc2RrOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVpLnNkay4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LlJlcG9zaXRvcnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVpLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5kaWFsb2dzLlJlcG9zaXRvcnlNYW5pcHVsYXRvckRyb3BUYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51aS5tb2RlbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudWkudmlld2Vycy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuU2FtZVNoZWxsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRGlzcG9zZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlEaWFsb2dBY3Rpb247Ci0KLS8qKgotICogRGlhbG9nIHRoYXQgYWxsb3dzIHVzZXJzIHRvIHVwZGF0ZSwgYWRkLCBvciByZW1vdmUgcmVwb3NpdG9yaWVzLgotICogCi0gKiBAc2luY2UgMy40Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nIGV4dGVuZHMgVHJheURpYWxvZyB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFdJRFRIX0lOX0RMVVMgPSA0ODA7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IEhFSUdIVF9JTl9ETFVTID0gMjQwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEJVVFRPTkFDVElPTiA9ICJidXR0b25BY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLQlTdHJ1Y3R1cmVkVmlld2VyUHJvdmlzaW9uaW5nTGlzdGVuZXIgbGlzdGVuZXI7Ci0JcHJpdmF0ZSBDaGVja2JveFRhYmxlVmlld2VyIHJlcG9zaXRvcnlWaWV3ZXI7Ci0JcHJpdmF0ZSBJUmVwb3NpdG9yeU1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yOwotCXByaXZhdGUgUmVwb3NpdG9yeUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIERpYWxvZy4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgUmVwb3NpdG9yeU1hbmlwdWxhdGlvbkRpYWxvZyhTaGVsbCBzaGVsbCwgSVJlcG9zaXRvcnlNYW5pcHVsYXRvciBtYW5pcHVsYXRvcikgewotCQlzdXBlcihzaGVsbCk7Ci0JCXRoaXMubWFuaXB1bGF0b3IgPSBtYW5pcHVsYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVTaGVsbChTaGVsbCBzaGVsbCkgewotCQlzaGVsbC5zZXRUZXh0KFByb3ZTREtNZXNzYWdlcy5SZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX1VwZGF0ZVNpdGVzRGlhbG9nVGl0bGUpOwotCQlzdXBlci5jb25maWd1cmVTaGVsbChzaGVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9NQVJHSU4pOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfTUFSR0lOKTsKLQkJbGF5b3V0Lmhvcml6b250YWxTcGFjaW5nID0gY29udmVydEhvcml6b250YWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5IT1JJWk9OVEFMX1NQQUNJTkcpOwotCQlsYXlvdXQudmVydGljYWxTcGFjaW5nID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuVkVSVElDQUxfU1BBQ0lORyk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChQcm92U0RLTWVzc2FnZXMuUmVwb3NpdG9yeU1hbmlwdWxhdGlvbkRpYWxvZ19TZWxlY3RNZXNzYWdlKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuSE9SSVpPTlRBTF9TUEFDSU5HKTsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBUYWJsZSBvZiBhdmFpbGFibGUgcmVwb3NpdG9yaWVzCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGNvbXBvc2l0ZSwgU1dULkNIRUNLIHwgU1dULk1VTFRJIHwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0JCXJlcG9zaXRvcnlWaWV3ZXIgPSBuZXcgQ2hlY2tib3hUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCXNldFRhYmxlQ29sdW1ucyh0YWJsZSk7Ci0JCWNvbnRlbnRQcm92aWRlciA9IG5ldyBSZXBvc2l0b3J5Q29udGVudFByb3ZpZGVyKFByb3ZTREtVSUFjdGl2YXRvci5nZXREZWZhdWx0KCkuZ2V0UXVlcnlQcm92aWRlcigpKTsKLQkJcmVwb3NpdG9yeVZpZXdlci5zZXRDb21wYXJlcihuZXcgUHJvdkVsZW1lbnRDb21wYXJlcigpKTsKLQkJcmVwb3NpdG9yeVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkpOwotCQlyZXBvc2l0b3J5Vmlld2VyLnNldENvbnRlbnRQcm92aWRlcihjb250ZW50UHJvdmlkZXIpOwotCQlyZXBvc2l0b3J5Vmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFByb3ZFbGVtZW50TGFiZWxQcm92aWRlcigpKTsKLQotCQkvLyBJbnB1dCBsYXN0Ci0JCXJlcG9zaXRvcnlWaWV3ZXIuc2V0SW5wdXQoZ2V0SW5wdXQoKSk7Ci0JCXNldENoZWNrU3RhdGUoKTsKLQotCQlyZXBvc2l0b3J5Vmlld2VyLmFkZENoZWNrU3RhdGVMaXN0ZW5lcihuZXcgSUNoZWNrU3RhdGVMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGNoZWNrU3RhdGVDaGFuZ2VkKENoZWNrU3RhdGVDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0RWxlbWVudCgpIGluc3RhbmNlb2YgTWV0YWRhdGFSZXBvc2l0b3J5RWxlbWVudCkgewotCQkJCQkoKE1ldGFkYXRhUmVwb3NpdG9yeUVsZW1lbnQpIGV2ZW50LmdldEVsZW1lbnQoKSkuc2V0RW5hYmxlZChldmVudC5nZXRDaGVja2VkKCkpOwotCQkJCQljaGFuZ2VkID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCQlEcm9wVGFyZ2V0IHRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHJlcG9zaXRvcnlWaWV3ZXIuZ2V0Q29udHJvbCgpLCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfQ09QWSB8IERORC5EUk9QX0xJTkspOwotCQl0YXJnZXQuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyW10ge1VSTFRyYW5zZmVyLmdldEluc3RhbmNlKCksIEZpbGVUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfSk7Ci0JCXRhcmdldC5hZGREcm9wTGlzdGVuZXIobmV3IFJlcG9zaXRvcnlNYW5pcHVsYXRvckRyb3BUYXJnZXQobWFuaXB1bGF0b3IsIHJlcG9zaXRvcnlWaWV3ZXIuZ2V0Q29udHJvbCgpKSk7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gdHJ1ZTsKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhXSURUSF9JTl9ETFVTKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydFZlcnRpY2FsRExVc1RvUGl4ZWxzKEhFSUdIVF9JTl9ETFVTKTsKLQkJcmVwb3NpdG9yeVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBWZXJ0aWNhbCBidXR0b25zCi0JCUNvbXBvc2l0ZSB2ZXJ0aWNhbEJ1dHRvbkJhciA9IChDb21wb3NpdGUpIGNyZWF0ZVZlcnRpY2FsQnV0dG9uQmFyKGNvbXBvc2l0ZSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCk7Ci0JCWRhdGEudmVydGljYWxJbmRlbnQgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5CVVRUT05fQkFSX0hFSUdIVCk7Ci0JCXZlcnRpY2FsQnV0dG9uQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpc3RlbmVyID0gZ2V0Vmlld2VyUHJvdmlzaW9uaW5nTGlzdGVuZXIoKTsKLQkJUHJvdlVJLmFkZFByb3Zpc2lvbmluZ0xpc3RlbmVyKGxpc3RlbmVyKTsKLQkJY29tcG9zaXRlLmFkZERpc3Bvc2VMaXN0ZW5lcihuZXcgRGlzcG9zZUxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCQkJUHJvdlVJLnJlbW92ZVByb3Zpc2lvbmluZ0xpc3RlbmVyKGxpc3RlbmVyKTsKLQkJCX0KLQkJfSk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nI2lzUmVzaXphYmxlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Jlc2l6YWJsZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlVmVydGljYWxCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsLCBib29sZWFuIGRlZmF1bHRCdXR0b24pIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gc2V0VmVydGljYWxCdXR0b25MYXlvdXREYXRhKGJ1dHRvbik7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0KLQkJYnV0dG9uLmFkZExpc3RlbmVyKFNXVC5TZWxlY3Rpb24sIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJdmVydGljYWxCdXR0b25QcmVzc2VkKGV2ZW50KTsKLQkJCX0KLQkJfSk7Ci0JCWJ1dHRvbi5zZXRUb29sVGlwVGV4dChsYWJlbCk7Ci0JCWlmIChkZWZhdWx0QnV0dG9uKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IHBhcmVudC5nZXRTaGVsbCgpOwotCQkJaWYgKHNoZWxsICE9IG51bGwpIHsKLQkJCQlzaGVsbC5zZXREZWZhdWx0QnV0dG9uKGJ1dHRvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQl2b2lkIHZlcnRpY2FsQnV0dG9uUHJlc3NlZChFdmVudCBldmVudCkgewotCQlPYmplY3QgZGF0YSA9IGV2ZW50LndpZGdldC5nZXREYXRhKEJVVFRPTkFDVElPTik7Ci0JCWlmIChkYXRhID09IG51bGwgfHwgIShkYXRhIGluc3RhbmNlb2YgSUFjdGlvbikpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJQWN0aW9uIGFjdGlvbiA9IChJQWN0aW9uKSBkYXRhOwotCQlhY3Rpb24ucnVuV2l0aEV2ZW50KGV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIEdyaWREYXRhIHNldFZlcnRpY2FsQnV0dG9uTGF5b3V0RGF0YShCdXR0b24gYnV0dG9uKSB7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJaW50IHdpZHRoSGludCA9IGNvbnZlcnRIb3Jpem9udGFsRExVc1RvUGl4ZWxzKElEaWFsb2dDb25zdGFudHMuQlVUVE9OX1dJRFRIKTsKLQkJUG9pbnQgbWluU2l6ZSA9IGJ1dHRvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQsIHRydWUpOwotCQlkYXRhLndpZHRoSGludCA9IE1hdGgubWF4KHdpZHRoSGludCwgbWluU2l6ZS54KTsKLQkJYnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRUYWJsZUNvbHVtbnMoVGFibGUgdGFibGUpIHsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJU3RyaW5nW10gY29sdW1uSGVhZGVycyA9IHtQcm92U0RLTWVzc2FnZXMuUmVwb3NpdG9yeU1hbmlwdWxhdGlvbkRpYWxvZ19OYW1lQ29sdW1uSGVhZGVyLCBQcm92U0RLTWVzc2FnZXMuUmVwb3NpdG9yeU1hbmlwdWxhdGlvbkRpYWxvZ19Mb2NhdGlvbkNvbHVtbkhlYWRlcn07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uSGVhZGVycy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gdGMgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FLCBpKTsKLQkJCXRjLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCXRjLnNldFRleHQoY29sdW1uSGVhZGVyc1tpXSk7Ci0JCQl0Yy5zZXRXaWR0aChjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkVOVFJZX0ZJRUxEX1dJRFRIKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlVmVydGljYWxCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDcmVhdGUgY29tcG9zaXRlLgotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJaW5pdGlhbGl6ZURpYWxvZ1VuaXRzKGNvbXBvc2l0ZSk7Ci0KLQkJLy8gY3JlYXRlIGEgbGF5b3V0IHdpdGggc3BhY2luZyBhbmQgbWFyZ2lucyBhcHByb3ByaWF0ZSBmb3IgdGhlIGZvbnQKLQkJLy8gc2l6ZS4KLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDU7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSBjb252ZXJ0SG9yaXpvbnRhbERMVXNUb1BpeGVscyhJRGlhbG9nQ29uc3RhbnRzLkhPUklaT05UQUxfU1BBQ0lORyk7Ci0JCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSBjb252ZXJ0VmVydGljYWxETFVzVG9QaXhlbHMoSURpYWxvZ0NvbnN0YW50cy5WRVJUSUNBTF9TUEFDSU5HKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCWNyZWF0ZVZlcnRpY2FsQnV0dG9ucyhjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVWZXJ0aWNhbEJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlCdXR0b24gYnV0dG9uID0gY3JlYXRlVmVydGljYWxCdXR0b24ocGFyZW50LCBQcm92U0RLTWVzc2FnZXMuUmVwb3NpdG9yeU1hbmlwdWxhdGlvbkRpYWxvZ19Qcm9wZXJ0aWVzQnV0dG9uLCBmYWxzZSk7Ci0JCWJ1dHRvbi5zZXREYXRhKEJVVFRPTkFDVElPTiwgbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKG5ldyBTYW1lU2hlbGxQcm92aWRlcihwYXJlbnQuZ2V0U2hlbGwoKSksIHJlcG9zaXRvcnlWaWV3ZXIpKTsKLQkJLy8gc3BhY2VyCi0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlidXR0b24gPSBjcmVhdGVWZXJ0aWNhbEJ1dHRvbihwYXJlbnQsIFByb3ZTREtNZXNzYWdlcy5SZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX0FkZEJ1dHRvbiwgZmFsc2UpOwotCQlidXR0b24uc2V0RGF0YShCVVRUT05BQ1RJT04sIG5ldyBBZGRDb2xvY2F0ZWRSZXBvc2l0b3J5QWN0aW9uKHJlcG9zaXRvcnlWaWV3ZXIsIGdldFNoZWxsKCkpKTsKLQkJYnV0dG9uID0gY3JlYXRlVmVydGljYWxCdXR0b24ocGFyZW50LCBQcm92U0RLTWVzc2FnZXMuUmVwb3NpdG9yeU1hbmlwdWxhdGlvbkRpYWxvZ19SZW1vdmVCdXR0b24sIGZhbHNlKTsKLQkJYnV0dG9uLnNldERhdGEoQlVUVE9OQUNUSU9OLCBuZXcgUmVtb3ZlQ29sb2NhdGVkUmVwb3NpdG9yeUFjdGlvbihyZXBvc2l0b3J5Vmlld2VyLCBnZXRTaGVsbCgpKSk7Ci0KLQkJLy8gc3BhY2VyCi0JCW5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQotCQlidXR0b24gPSBjcmVhdGVWZXJ0aWNhbEJ1dHRvbihwYXJlbnQsIFByb3ZTREtNZXNzYWdlcy5SZXBvc2l0b3J5TWFuaXB1bGF0aW9uRGlhbG9nX0ltcG9ydCwgZmFsc2UpOwotCQlidXR0b24uc2V0RGF0YShCVVRUT05BQ1RJT04sIG5ldyBBY3Rpb24oKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJVXBkYXRlTWFuYWdlckNvbXBhdGliaWxpdHkuaW1wb3J0U2l0ZXMoZ2V0U2hlbGwoKSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfSk7Ci0JCWJ1dHRvbiA9IGNyZWF0ZVZlcnRpY2FsQnV0dG9uKHBhcmVudCwgUHJvdlNES01lc3NhZ2VzLlJlcG9zaXRvcnlNYW5pcHVsYXRpb25EaWFsb2dfRXhwb3J0LCBmYWxzZSk7Ci0JCWJ1dHRvbi5zZXREYXRhKEJVVFRPTkFDVElPTiwgbmV3IEFjdGlvbigpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlVcGRhdGVNYW5hZ2VyQ29tcGF0aWJpbGl0eS5leHBvcnRTaXRlcyhnZXRTaGVsbCgpLCBnZXRFbGVtZW50cygpKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwcml2YXRlIE1ldGFkYXRhUmVwb3NpdG9yaWVzIGdldElucHV0KCkgewotCQlNZXRhZGF0YVJlcG9zaXRvcmllcyBpbnB1dCA9IG5ldyBNZXRhZGF0YVJlcG9zaXRvcmllcygpOwotCQlpbnB1dC5zZXRJbmNsdWRlRGlzYWJsZWRSZXBvc2l0b3JpZXModHJ1ZSk7Ci0JCWlucHV0LnNldFF1ZXJ5UHJvdmlkZXIoUHJvdlNES1VJQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRRdWVyeVByb3ZpZGVyKCkpOwotCQlpbnB1dC5zZXRRdWVyeUNvbnRleHQobmV3IEF2YWlsYWJsZUlVVmlld1F1ZXJ5Q29udGV4dChBdmFpbGFibGVJVVZpZXdRdWVyeUNvbnRleHQuVklFV19CWV9SRVBPKSk7Ci0JCXJldHVybiBpbnB1dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBva1ByZXNzZWQoKSB7Ci0JCWlmIChjaGFuZ2VkKQotCQkJRWxlbWVudFV0aWxzLnVwZGF0ZVJlcG9zaXRvcnlVc2luZ0VsZW1lbnRzKGdldEVsZW1lbnRzKCksIGdldFNoZWxsKCkpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRWaWV3ZXJQcm92aXNpb25pbmdMaXN0ZW5lciBnZXRWaWV3ZXJQcm92aXNpb25pbmdMaXN0ZW5lcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVmlld2VyUHJvdmlzaW9uaW5nTGlzdGVuZXIocmVwb3NpdG9yeVZpZXdlciwgU3RydWN0dXJlZFZpZXdlclByb3Zpc2lvbmluZ0xpc3RlbmVyLlBST1ZfRVZFTlRfTUVUQURBVEFfUkVQT1NJVE9SWSwgUHJvdlNES1VJQWN0aXZhdG9yLmdldERlZmF1bHQoKS5nZXRRdWVyeVByb3ZpZGVyKCkpIHsKLQkJCXByb3RlY3RlZCB2b2lkIHJlcG9zaXRvcnlEaXNjb3ZlcmVkKFJlcG9zaXRvcnlFdmVudCBlKSB7Ci0JCQkJYXN5bmNSZWZyZXNoKCk7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHJlcG9zaXRvcnlDaGFuZ2VkKFJlcG9zaXRvcnlFdmVudCBlKSB7Ci0JCQkJYXN5bmNSZWZyZXNoKCk7Ci0JCQl9Ci0KLQkJCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hBbGwoKSB7Ci0JCQkJc3VwZXIucmVmcmVzaEFsbCgpOwotCQkJCXNldENoZWNrU3RhdGUoKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0Q2hlY2tTdGF0ZSgpIHsKLQkJTWV0YWRhdGFSZXBvc2l0b3J5RWxlbWVudFtdIGVsZW1lbnRzID0gZ2V0RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJCXJlcG9zaXRvcnlWaWV3ZXIuc2V0Q2hlY2tlZChlbGVtZW50c1tpXSwgZWxlbWVudHNbaV0uaXNFbmFibGVkKCkpOwotCX0KLQotCXByaXZhdGUgTWV0YWRhdGFSZXBvc2l0b3J5RWxlbWVudFtdIGdldEVsZW1lbnRzKCkgewotCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHJlcG9zaXRvcnlWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtcygpOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoaXRlbXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGl0ZW1zW2ldLmdldERhdGEoKSBpbnN0YW5jZW9mIE1ldGFkYXRhUmVwb3NpdG9yeUVsZW1lbnQpCi0JCQkJbGlzdC5hZGQoaXRlbXNbaV0uZ2V0RGF0YSgpKTsKLQkJfQotCQlyZXR1cm4gKE1ldGFkYXRhUmVwb3NpdG9yeUVsZW1lbnRbXSkgbGlzdC50b0FycmF5KG5ldyBNZXRhZGF0YVJlcG9zaXRvcnlFbGVtZW50W2xpc3Quc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyY2UyNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9DREMtMS4wJUZvdW5kYXRpb24tMS4wIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWU4MmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1iaW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTgyOTU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY3MTMzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzMjkgKzAsMCBAQAotI0ZyaSBGZWIgMjIgMTE6MTU6MjQgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9YWJvcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiZTcyZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNTdW4gU2VwIDIzIDExOjU5OjE0IEVEVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCIgc3RhbmRhbG9uZVw9Im5vIj8+PHRlbXBsYXRlcy8+Ci1zcF9jbGVhbnVwLmFkZF9kZWZhdWx0X3NlcmlhbF92ZXJzaW9uX2lkPXRydWUKLXNwX2NsZWFudXAuYWRkX2dlbmVyYXRlZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2RlcHJlY2F0ZWRfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19vdmVycmlkZV9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9zZXJpYWxfdmVyc2lvbl9pZD1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX2Jsb2Nrcz10cnVlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC5jb252ZXJ0X3RvX2VuaGFuY2VkX2Zvcl9sb29wPWZhbHNlCi1zcF9jbGVhbnVwLmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1zcF9jbGVhbnVwLm1ha2VfbG9jYWxfdmFyaWFibGVfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wYXJhbWV0ZXJzX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcHJpdmF0ZV9maWVsZHNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX3ZhcmlhYmxlX2RlY2xhcmF0aW9uc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAubmV2ZXJfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPXRydWUKLXNwX2NsZWFudXAub25fc2F2ZV91c2VfYWRkaXRpb25hbF9hY3Rpb25zPWZhbHNlCi1zcF9jbGVhbnVwLm9yZ2FuaXplX2ltcG9ydHM9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19maWVsZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9pbnN0YW5jZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfdGhyb3VnaF9zdWJ0eXBlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZXRob2RfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3ByaXZhdGVfY29uc3RydWN0b3JzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19hbGw9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfaWdub3JlX2VtcHR5PWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9jYXN0cz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bm5lY2Vzc2FyeV9ubHNfdGFncz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2ltcG9ydHM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9sb2NhbF92YXJpYWJsZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX2ZpZWxkcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9tZXRob2RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX3R5cGVzPXRydWUKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzPWZhbHNlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVyc19hbGw9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzX29ubHlfZm9yX3JldHVybl9hbmRfdGhyb3c9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3Nfb25seV9pZl9uZWNlc3Nhcnk9dHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTA0YmQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI1NhdCBBdWcgMTEgMjA6MTc6NTIgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1wbHVnaW5Qcm9qZWN0LmV4dGVuc2lvbnM9ZmFsc2UKLXJlc29sdmUucmVxdWlyZWJ1bmRsZT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZlMzQ1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyO3NpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlY2hlY2tlci5BY3RpdmF0b3IKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZGlyZWN0b3IsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5lbmdpbmUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLnF1ZXJ5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjQuMCIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4wL0ZvdW5kYXRpb24tMS4wLAotIEoyU0UtMS4zCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVjaGVja2VyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51cGRhdGVjaGVja2VyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWksb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGssb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbiIKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzMuMy4wLDQuMCkiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYyNzg1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotCQk8aDM+VGhpcmQgUGFydHkgQ29udGVudDwvaDM+Ci0JCTxwPlRoZSBDb250ZW50IGluY2x1ZGVzIGl0ZW1zIHRoYXQgaGF2ZSBiZWVuIHNvdXJjZWQgZnJvbSB0aGlyZCBwYXJ0aWVzIGFzIHNldCBvdXQgYmVsb3cuIElmIHlvdSAKLQkJZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBmb2xsb3dpbmcgaXMgcHJvdmlkZWQgCi0JCWZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHksIGFuZCB5b3Ugc2hvdWxkIGxvb2sgdG8gdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIGZvciAKLQkJdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdXNlLjwvcD4KLQotCQk8aDQ+RmlsZUluc3RhbGwgMS4wPC9oND4gCi0JCTxwPlRoZSBidW5kbGUgaW5jbHVkZXMgZGVyaXZhdGl2ZSB3b3JrcyBvZiBzb2Z0d2FyZSBvcmlnaW5hbGx5IGRldmVsb3BlZCBieSBQZXRlciBLcmllbnMgKGFRdXRlKS4KLQkJVGhhdCBvcmlnaW5hbCB3b3JrIHdhcyBsaWNlbnNlZCB1bmRlciB0aGUgRVBMIHYxLjAgYW5kIHRoaXMgZGVyaXZhdGl2ZSB3b3JrIGlzIHNpbWlsYXJseSBsaWNlbnNlZC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM3N2I5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMvCi1vdXRwdXQuLiA9IGJpbi8KLWJpbi5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5ZmJjMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZSA9IEVxdWlub3ggUHJvdmlzaW9uaW5nIFVwZGF0ZSBDaGVja2VyCi1wcm92aWRlck5hbWUgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlY2hlY2tlci9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZWNoZWNrZXIvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliNTZmNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlY2hlY2tlci9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZWNoZWNrZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVwZGF0ZWNoZWNrZXIuSVVwZGF0ZUNoZWNrZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLS8qKgotICogQWN0aXZhdG9yIGNsYXNzIHRoYXQgcmVnaXN0ZXJzIHRoZSB1cGRhdGUgY2hlY2tlciBzZXJ2aWNlLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uQ2hlY2tlcjsKLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRDb250ZXh0KCkgewotCQlyZXR1cm4gY29udGV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBY3RpdmF0b3IuY29udGV4dCA9IGJ1bmRsZUNvbnRleHQ7Ci0JCXJlZ2lzdHJhdGlvbkNoZWNrZXIgPSBjb250ZXh0LnJlZ2lzdGVyU2VydmljZShJVXBkYXRlQ2hlY2tlci5TRVJWSUNFX05BTUUsIG5ldyBVcGRhdGVDaGVja2VyKCksIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmVnaXN0cmF0aW9uQ2hlY2tlci51bnJlZ2lzdGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlY2hlY2tlci9VcGRhdGVDaGVja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGVjaGVja2VyL1VwZGF0ZUNoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYxMTI2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGVjaGVja2VyL1VwZGF0ZUNoZWNrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVjaGVja2VyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlNlcnZpY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmRpcmVjdG9yLklQbGFubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuZW5naW5lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucXVlcnkuSW5zdGFsbGFibGVVbml0UXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51cGRhdGVjaGVja2VyLio7Ci0KLS8qKgotICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSVVwZGF0ZUNoZWNrZXJ9LgotICogPHA+Ci0gKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBvcHRpbWl6ZWQuICBJdCBkb2Vzbid0IG9wdGltaXplIGZvciBtdWx0aXBsZQotICogcG9sbHMgb24gdGhlIHNhbWUgcHJvZmlsZSwgbm9yIGRvZXMgaXQgY2FjaGUgYW55IGluZm8gYWJvdXQgYSBwcm9maWxlIGZyb20KLSAqIHBvbGwgdG8gcG9sbC4KLSAqLwotcHVibGljIGNsYXNzIFVwZGF0ZUNoZWNrZXIgaW1wbGVtZW50cyBJVXBkYXRlQ2hlY2tlciB7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBib29sZWFuIFRSQUNFID0gZmFsc2U7Ci0JcHJpdmF0ZSBIYXNoU2V0IGNoZWNrZXJzID0gbmV3IEhhc2hTZXQoKTsgLy8gdGhyZWFkcwotCUlQcm9maWxlUmVnaXN0cnkgcHJvZmlsZVJlZ2lzdHJ5OwotCUlQbGFubmVyIHBsYW5uZXI7Ci0KLQlwcml2YXRlIGNsYXNzIFVwZGF0ZUNoZWNrVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCWxvbmcgcG9sbCwgZGVsYXk7Ci0JCUlVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcjsKLQkJU3RyaW5nIHByb2ZpbGVJZDsKLQkJUXVlcnkgcXVlcnk7Ci0KLQkJVXBkYXRlQ2hlY2tUaHJlYWQoU3RyaW5nIHByb2ZpbGVJZCwgUXVlcnkgcXVlcnksIGxvbmcgZGVsYXksIGxvbmcgcG9sbCwgSVVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQl0aGlzLnBvbGwgPSBwb2xsOwotCQkJdGhpcy5kZWxheSA9IGRlbGF5OwotCQkJdGhpcy5wcm9maWxlSWQgPSBwcm9maWxlSWQ7Ci0JCQl0aGlzLnF1ZXJ5ID0gcXVlcnk7Ci0JCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQl0cnkgewotCQkJCWlmIChkZWxheSAhPSBPTkVfVElNRV9DSEVDSyAmJiBkZWxheSA+IDApIHsKLQkJCQkJVGhyZWFkLnNsZWVwKGRlbGF5KTsKLQkJCQl9Ci0JCQkJd2hpbGUgKCFkb25lKSB7Ci0KLQkJCQkJbG9nKCJDaGVja2luZyBmb3IgdXBkYXRlcyBmb3IgIiArIHByb2ZpbGVJZCArICIgYXQgIiArIGdldFRpbWVTdGFtcCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCUlJbnN0YWxsYWJsZVVuaXRbXSBpdXNXaXRoVXBkYXRlcyA9IGNoZWNrRm9yVXBkYXRlcyhwcm9maWxlSWQsIHF1ZXJ5KTsKLQkJCQkJaWYgKGl1c1dpdGhVcGRhdGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJCWxvZygiTm90aWZ5aW5nIGxpc3RlbmVyIG9mIGF2YWlsYWJsZSB1cGRhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVVwZGF0ZUV2ZW50IGV2ZW50ID0gbmV3IFVwZGF0ZUV2ZW50KHByb2ZpbGVJZCwgaXVzV2l0aFVwZGF0ZXMpOwotCQkJCQkJaWYgKCFkb25lKQotCQkJCQkJCWxpc3RlbmVyLnVwZGF0ZXNBdmFpbGFibGUoZXZlbnQpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJbG9nKCJObyB1cGRhdGVzIHdlcmUgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoZGVsYXkgPT0gT05FX1RJTUVfQ0hFQ0sgfHwgZGVsYXkgPD0gMCkgewotCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlUaHJlYWQuc2xlZXAocG9sbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm90aGluZwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlsb2coIkV4Y2VwdGlvbiBpbiB1cGRhdGUgY2hlY2sgdGhyZWFkIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudXBkYXRlY2hlY2tlci5JVXBkYXRlQ2hlY2tlciNhZGRVcGRhdGVDaGVjayhqYXZhLmxhbmcuU3RyaW5nLCBsb25nLCBsb25nLCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnVwZGF0ZWNoZWNrZXIuSVVwZGF0ZUxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFVwZGF0ZUNoZWNrKFN0cmluZyBwcm9maWxlSWQsIFF1ZXJ5IHF1ZXJ5LCBsb25nIGRlbGF5LCBsb25nIHBvbGwsIElVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsb2coIkFkZGluZyB1cGRhdGUgY2hlY2tlciBmb3IgIiArIHByb2ZpbGVJZCArICIgYXQgIiArIGdldFRpbWVTdGFtcCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCVVwZGF0ZUNoZWNrVGhyZWFkIHRocmVhZCA9IG5ldyBVcGRhdGVDaGVja1RocmVhZChwcm9maWxlSWQsIHF1ZXJ5LCBkZWxheSwgcG9sbCwgbGlzdGVuZXIpOwotCQljaGVja2Vycy5hZGQodGhyZWFkKTsKLQkJdGhyZWFkLnN0YXJ0KCk7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51cGRhdGVjaGVja2VyLklVcGRhdGVDaGVja2VyI3JlbW92ZVVwZGF0ZUNoZWNrKG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudXBkYXRlY2hlY2tlci5JVXBkYXRlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlVXBkYXRlQ2hlY2soSVVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBjaGVja2Vycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCVVwZGF0ZUNoZWNrVGhyZWFkIHRocmVhZCA9IChVcGRhdGVDaGVja1RocmVhZCkgaXRlci5uZXh0KCk7Ci0JCQlpZiAodGhyZWFkLmxpc3RlbmVyID09IGxpc3RlbmVyKSB7Ci0JCQkJdGhyZWFkLmRvbmUgPSB0cnVlOwotCQkJCWNoZWNrZXJzLnJlbW92ZSh0aHJlYWQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGFycmF5IG9mIGl1cyBpbiB0aGUgcHJvZmlsZSB0aGF0IGhhdmUgdXBkYXRlcwotCSAqIGF2YWlsYWJsZS4KLQkgKi8KLQlJSW5zdGFsbGFibGVVbml0W10gY2hlY2tGb3JVcGRhdGVzKFN0cmluZyBwcm9maWxlSWQsIFF1ZXJ5IHF1ZXJ5KSB7Ci0JCUlQcm9maWxlIHByb2ZpbGUgPSBnZXRQcm9maWxlUmVnaXN0cnkoKS5nZXRQcm9maWxlKHByb2ZpbGVJZCk7Ci0JCUFycmF5TGlzdCBpdXNXaXRoVXBkYXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKHByb2ZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUluc3RhbGxhYmxlVW5pdFswXTsKLQkJUHJvdmlzaW9uaW5nQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb3Zpc2lvbmluZ0NvbnRleHQoZ2V0QXZhaWxhYmxlUmVwb3NpdG9yaWVzKCkpOwotCQlpZiAocXVlcnkgPT0gbnVsbCkKLQkJCXF1ZXJ5ID0gSW5zdGFsbGFibGVVbml0UXVlcnkuQU5ZOwotCQlJdGVyYXRvciBpdGVyID0gcHJvZmlsZS5xdWVyeShxdWVyeSwgbmV3IENvbGxlY3RvcigpLCBudWxsKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgaXUgPSAoSUluc3RhbGxhYmxlVW5pdCkgaXRlci5uZXh0KCk7Ci0JCQlJSW5zdGFsbGFibGVVbml0W10gcmVwbGFjZW1lbnRzID0gZ2V0UGxhbm5lcigpLnVwZGF0ZXNGb3IoaXUsIGNvbnRleHQsIG51bGwpOwotCQkJaWYgKHJlcGxhY2VtZW50cy5sZW5ndGggPiAwKQotCQkJCWl1c1dpdGhVcGRhdGVzLmFkZChpdSk7Ci0JCX0KLQkJcmV0dXJuIChJSW5zdGFsbGFibGVVbml0W10pIGl1c1dpdGhVcGRhdGVzLnRvQXJyYXkobmV3IElJbnN0YWxsYWJsZVVuaXRbaXVzV2l0aFVwZGF0ZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGlzdCBvZiBtZXRhZGF0YSByZXBvc2l0b3JpZXMgdGhhdCBhcmUgY3VycmVudGx5IGF2YWlsYWJsZS4KLQkgKi8KLQlwcml2YXRlIFVSTFtdIGdldEF2YWlsYWJsZVJlcG9zaXRvcmllcygpIHsKLQkJSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIgcmVwb01nciA9IChJTWV0YWRhdGFSZXBvc2l0b3J5TWFuYWdlcikgU2VydmljZUhlbHBlci5nZXRTZXJ2aWNlKEFjdGl2YXRvci5nZXRDb250ZXh0KCksIElNZXRhZGF0YVJlcG9zaXRvcnlNYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7Ci0JCVVSTFtdIHJlcG9zaXRvcmllcyA9IHJlcG9NZ3IuZ2V0S25vd25SZXBvc2l0b3JpZXMoSU1ldGFkYXRhUmVwb3NpdG9yeU1hbmFnZXIuUkVQT1NJVE9SSUVTX0FMTCk7Ci0JCUFycmF5TGlzdCBhdmFpbGFibGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVwb3NpdG9yaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCXJlcG9NZ3IubG9hZFJlcG9zaXRvcnkocmVwb3NpdG9yaWVzW2ldLCBudWxsKTsKLQkJCQlhdmFpbGFibGUuYWRkKHJlcG9zaXRvcmllc1tpXSk7Ci0JCQl9IGNhdGNoIChQcm92aXNpb25FeGNlcHRpb24gZSkgewotCQkJCS8vaWdub3JlIHVuYXZhaWxhYmxlIHJlcG9zaXRvcnkKLQkJCX0KLQkJfQotCQlyZXR1cm4gKFVSTFtdKSBhdmFpbGFibGUudG9BcnJheShuZXcgVVJMW2F2YWlsYWJsZS5zaXplKCldKTsKLQl9Ci0KLQl2b2lkIGxvZyhTdHJpbmcgc3RyaW5nLCBUaHJvd2FibGUgZSkgewotCQlTeXN0ZW0uZXJyLnByaW50bG4oc3RyaW5nICsgIjogIiArIGUpOyAvLyROT04tTkxTLTEkCi0JCWlmIChERUJVRykKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotCi0Jdm9pZCBsb2coU3RyaW5nIHN0cmluZykgewotCQlpZiAoVFJBQ0UpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oc3RyaW5nKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0VGltZVN0YW1wKCkgewotCQlEYXRlIGQgPSBuZXcgRGF0ZSgpOwotCQlTaW1wbGVEYXRlRm9ybWF0IGRmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIltNTS9kZC95eTtISDptbTpzczpTU1NdIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGRmLmZvcm1hdChkKTsKLQl9Ci0KLQlJUGxhbm5lciBnZXRQbGFubmVyKCkgewotCQlpZiAocGxhbm5lciA9PSBudWxsKSB7Ci0JCQlwbGFubmVyID0gKElQbGFubmVyKSBTZXJ2aWNlSGVscGVyLmdldFNlcnZpY2UoQWN0aXZhdG9yLmdldENvbnRleHQoKSwgSVBsYW5uZXIuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJCWlmIChwbGFubmVyID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm92aXNpb25pbmcgc3lzdGVtIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBsYW5uZXI7Ci0JfQotCi0JSVByb2ZpbGVSZWdpc3RyeSBnZXRQcm9maWxlUmVnaXN0cnkoKSB7Ci0JCWlmIChwcm9maWxlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJcHJvZmlsZVJlZ2lzdHJ5ID0gKElQcm9maWxlUmVnaXN0cnkpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0Q29udGV4dCgpLCBJUHJvZmlsZVJlZ2lzdHJ5LmNsYXNzLmdldE5hbWUoKSk7Ci0JCQlpZiAocHJvZmlsZVJlZ2lzdHJ5ID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQcm92aXNpb25pbmcgc3lzdGVtIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2ZpbGVSZWdpc3RyeTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3VwZGF0ZWNoZWNrZXIvSVVwZGF0ZUNoZWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3VwZGF0ZWNoZWNrZXIvSVVwZGF0ZUNoZWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM0M2Q3OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi91cGRhdGVjaGVja2VyL0lVcGRhdGVDaGVja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudXBkYXRlY2hlY2tlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIucXVlcnkuUXVlcnk7Ci0KLS8qKgotICogQW4gVXBkYXRlQ2hlY2tlciBwZXJpb2RpY2FsbHkgcG9sbHMgZm9yIHVwZGF0ZXMgdG8gc3BlY2lmaWVkIHByb2ZpbGVzIGFuZAotICogaW5mb3JtcyBsaXN0ZW5lcnMgaWYgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgTGlzdGVuZXJzIG1heSB0aGVuIGRldGVybWluZQotICogd2hldGhlciB0byByZXRyaWV2ZSB0aGUgdXBkYXRlcywgaW5mb3JtIHRoZSB1c2VyLCBldGMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVVwZGF0ZUNoZWNrZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfTkFNRSA9IElVcGRhdGVDaGVja2VyLmNsYXNzLmdldE5hbWUoKTsKLQlwdWJsaWMgc3RhdGljIGxvbmcgT05FX1RJTUVfQ0hFQ0sgPSAtMUw7Ci0KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBhZGRVcGRhdGVDaGVjayhTdHJpbmcgcHJvZmlsZUlkLCBRdWVyeSBpdXNUb0NoZWNrUXVlcnksIGxvbmcgZGVsYXksIGxvbmcgcG9sbCwgSVVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHJlbW92ZVVwZGF0ZUNoZWNrKElVcGRhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi91cGRhdGVjaGVja2VyL0lVcGRhdGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcDIvdXBkYXRlY2hlY2tlci9JVXBkYXRlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkZTYzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi91cGRhdGVjaGVja2VyL0lVcGRhdGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIudXBkYXRlY2hlY2tlcjsKLQotLyoqCi0gKiBBbiBJVXBkYXRlTGlzdGVuZXIgaW5mb3JtcyBsaXN0ZW5lcnMgdGhhdCBhbiB1cGRhdGUgaXMgYXZhaWxhYmxlIGZvcgotICogdGhlIHNwZWNpZmllZCBwcm9maWxlLiAgTGlzdGVuZXJzIHNob3VsZCBleHBlY3QgdG8gcmVjZWl2ZSB0aGlzIG5vdGlmaWNhdGlvbgotICogZnJvbSBhIGJhY2tncm91bmQgdGhyZWFkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVcGRhdGVMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVzQXZhaWxhYmxlKFVwZGF0ZUV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3VwZGF0ZWNoZWNrZXIvVXBkYXRlRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3Byb3Zpc2lvbmFsL3AyL3VwZGF0ZWNoZWNrZXIvVXBkYXRlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTg3YjMyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9wMi91cGRhdGVjaGVja2VyL1VwZGF0ZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi51cGRhdGVjaGVja2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotCi0vKioKLSAqIEFuIFVwZGF0ZUV2ZW50IGRlc2NyaWJlcyB3aGF0IElVJ3MgaGF2ZSB1cGRhdGVzIGZvciBhIGdpdmVuIHByb2ZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBVcGRhdGVFdmVudCB7Ci0KLQlTdHJpbmcgcHJvZmlsZUlkOwotCUlJbnN0YWxsYWJsZVVuaXRbXSBpdXNXaXRoVXBkYXRlczsKLQotCXB1YmxpYyBVcGRhdGVFdmVudChTdHJpbmcgcHJvZmlsZUlkLCBJSW5zdGFsbGFibGVVbml0W10gaXVzV2l0aFVwZGF0ZXMpIHsKLQkJdGhpcy5wcm9maWxlSWQgPSBwcm9maWxlSWQ7Ci0JCXRoaXMuaXVzV2l0aFVwZGF0ZXMgPSBpdXNXaXRoVXBkYXRlczsKLQl9Ci0KLQlwdWJsaWMgSUluc3RhbGxhYmxlVW5pdFtdIGdldElVcygpIHsKLQkJcmV0dXJuIGl1c1dpdGhVcGRhdGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZUlkKCkgewotCQlyZXR1cm4gcHJvZmlsZUlkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYmI3YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9KMlNFLTEuNCIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVlODJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYmluClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E5YjRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OTlkMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLSNGcmkgRmViIDIyIDExOjA2OjUwIEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWFib3J0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlY3JlYXRlTW9kaWZpZWRDbGFzc0ZpbGVJbk91dHB1dEZvbGRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmFsbHRocm91Z2hDYXNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mYXRhbE9wdGlvbmFsRXJyb3I9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ0Rlc2NyaXB0aW9uPXJldHVybl90YWcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5udWxsUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucGFyYW1ldGVyQXNzaWdubWVudD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3RlbnRpYWxOdWxsUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5yYXdUeXBlUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucmVkdW5kYW50TnVsbENoZWNrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uSW5jbHVkZURvY0NvbW1lbnRSZWZlcmVuY2U9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlckluY2x1ZGVEb2NDb21tZW50UmVmZXJlbmNlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3Jvb3RfdGFncz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9mb3JfcGFyYW1ldGVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmxpbmVfbGVuZ3RoPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tcGFjdF9lbHNlX2lmPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb249Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9Mgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmZvcm1hdF9ndWFyZGlhbl9jbGF1c2Vfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19hbm5vdGF0aW9uX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9jb25zdGFudF9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b190eXBlX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JyZWFrc19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfZW1wdHlfbGluZXM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2JvZHk9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zd2l0Y2hzdGF0ZW1lbnRzX2NvbXBhcmVfdG9fc3dpdGNoPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplPTQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2F0X2VuZF9vZl9maWxlX2lmX21pc3Npbmc9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2F0Y2hfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm5vdGF0aW9uX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9tZXRob2RfYm9keT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfZWxsaXBzaXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9zZW1pY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2FzdD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N3aXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2RlZmF1bHQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2NvbnN0YW50X2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luY3JlbWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZm9yX2luaXRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fcmV0dXJuPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3Rocm93PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV91bmFyeV9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fYnJhY2tldHNfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNlc19pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2Vsc2Vfc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZW1wdHlfYXJyYXlfaW5pdGlhbGl6ZXJfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2ltcGxlX2lmX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF90aGVuX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5saW5lU3BsaXQ9ODAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZDdmYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLSNNb24gTm92IDA1IDE3OjAxOjIxIEVTVCAyMDA3Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZWRpdG9yX3NhdmVfcGFydGljaXBhbnRfb3JnLmVjbGlwc2UuamR0LnVpLnBvc3RzYXZlbGlzdGVuZXIuY2xlYW51cD10cnVlCi1mb3JtYXR0ZXJfcHJvZmlsZT1fY29yZQotZm9ybWF0dGVyX3NldHRpbmdzX3ZlcnNpb249MTEKLW9yZy5lY2xpcHNlLmpkdC51aS5pZ25vcmVsb3dlcmNhc2VuYW1lcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQudWkuaW1wb3J0b3JkZXI9Owotb3JnLmVjbGlwc2UuamR0LnVpLm9uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS5zdGF0aWNvbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkxM2QyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLXBsdWdpblByb2plY3QuZXh0ZW5zaW9ucz1mYWxzZQotcmVzb2x2ZS5yZXF1aXJlYnVuZGxlPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGI5OTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZTtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotQnVuZGxlLVZlcnNpb246IDEuMC4wLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlLkFjdGl2YXRvcgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci5mZWF0dXJlcywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5ldmVudGJ1cywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEucmVwb3NpdG9yeSwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLnF1ZXJ5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmFydGlmYWN0LnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIuY29yZS5yZXBvc2l0b3J5LAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS5zdG9yYWdlLAotIG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlcjt2ZXJzaW9uPSIxLjIuMCIsCi0gb3JnLmVjbGlwc2Uub3NnaS5zaWduZWRjb250ZW50O3ZlcnNpb249IjEuMC4wIiwKLSBvcmcuZWNsaXBzZS5vc2dpLnV0aWw7dmVyc2lvbj0iMS4xLjAiLAotIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSIxLjMuMCIsCi0gb3JnLm9zZ2kudXRpbC50cmFja2VyO3ZlcnNpb249IjEuMy4wIiwKLSBvcmcueG1sLnNheCwKLSBvcmcueG1sLnNheC5oZWxwZXJzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlciwKLSBvcmcuZWNsaXBzZS5lY2YsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5jb21tb247YnVuZGxlLXZlcnNpb249IlszLjMuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeTtidW5kbGUtdmVyc2lvbj0iMC4xLjAiLAotIG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeTtidW5kbGUtdmVyc2lvbj0iMC4xLjAiLAotIG9yZy5lY2xpcHNlLmNvcmUuam9icztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKMlNFLTEuNCwKLSBDREMtMS4xL0ZvdW5kYXRpb24tMS4xCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlLmFydGlmYWN0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlLm1ldGFkYXRhO3gtaW50ZXJuYWw6PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjI3ODVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIvPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotIAotPHA+SnVuZSAyLCAyMDA2PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIAotYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgCi1iZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgCi1wcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50Ci1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZzwvYT4uPC9wPgotCi0JCTxoMz5UaGlyZCBQYXJ0eSBDb250ZW50PC9oMz4KLQkJPHA+VGhlIENvbnRlbnQgaW5jbHVkZXMgaXRlbXMgdGhhdCBoYXZlIGJlZW4gc291cmNlZCBmcm9tIHRoaXJkIHBhcnRpZXMgYXMgc2V0IG91dCBiZWxvdy4gSWYgeW91IAotCQlkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIGZvbGxvd2luZyBpcyBwcm92aWRlZCAKLQkJZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSwgYW5kIHlvdSBzaG91bGQgbG9vayB0byB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgZm9yIAotCQl0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB1c2UuPC9wPgotCi0JCTxoND5GaWxlSW5zdGFsbCAxLjA8L2g0PiAKLQkJPHA+VGhlIGJ1bmRsZSBpbmNsdWRlcyBkZXJpdmF0aXZlIHdvcmtzIG9mIHNvZnR3YXJlIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGJ5IFBldGVyIEtyaWVucyAoYVF1dGUpLgotCQlUaGF0IG9yaWdpbmFsIHdvcmsgd2FzIGxpY2Vuc2VkIHVuZGVyIHRoZSBFUEwgdjEuMCBhbmQgdGhpcyBkZXJpdmF0aXZlIHdvcmsgaXMgc2ltaWxhcmx5IGxpY2Vuc2VkLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmIwMWU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1zcmMuaW5jbHVkZXMgPSBhYm91dC5odG1sCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzY0MDU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWUgPSBVcGRhdGUgc2l0ZSByZXBvc2l0b3J5IGFkYXB0ZXIgYnVuZGxlIChJbmN1YmF0aW9uKQotcHJvdmlkZXJOYW1lID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YThlMTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMiI/PgotPHBsdWdpbj4KLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgICAgIGlkPSJtZXRhZGF0YVJlcG9zaXRvcnkiCi0gICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Lm1ldGFkYXRhUmVwb3NpdG9yaWVzIj4KLSAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlLm1ldGFkYXRhLlVwZGF0ZVNpdGVNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5Ij4KLSAgICAgIDwvZmFjdG9yeT4KLSAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgIHN1ZmZpeD0ic2l0ZS54bWwiPgotICAgICAgPC9maWx0ZXI+Ci0gICA8L2V4dGVuc2lvbj4KLSAgICAgIDxleHRlbnNpb24KLSAgICAgICAgICAgIGlkPSJhcnRpZmFjdFJlcG9zaXRvcnkiCi0gICAgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LmFydGlmYWN0UmVwb3NpdG9yaWVzIj4KLSAgICAgICAgIDxmYWN0b3J5Ci0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlLmFydGlmYWN0LlVwZGF0ZVNpdGVBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5Ij4KLSAgICAgICAgIDwvZmFjdG9yeT4KLSAgICAgICAgIDxmaWx0ZXIKLSAgICAgICAgICAgICAgIHN1ZmZpeD0ic2l0ZS54bWwiPgotICAgICAgICAgPC9maWx0ZXI+Ci0gICAgICA8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlc2l0ZS9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZXNpdGUvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZjM3YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlc2l0ZS9BY3RpdmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZXNpdGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlVSTFV0aWw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJRCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0OwotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvciNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzZXRCdW5kbGVDb250ZXh0KGNvbnRleHQpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVBY3RpdmF0b3Ijc3RvcChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXNldEJ1bmRsZUNvbnRleHQobnVsbCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzZXRCdW5kbGVDb250ZXh0KEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgewotCQlBY3RpdmF0b3IuYnVuZGxlQ29udGV4dCA9IGJ1bmRsZUNvbnRleHQ7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQnVuZGxlQ29udGV4dCBnZXRCdW5kbGVDb250ZXh0KCkgewotCQlyZXR1cm4gYnVuZGxlQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgcmVhc29uYWJsZSBodW1hbi1yZWFkYWJsZSByZXBvc2l0b3J5IG5hbWUgZm9yIHRoZSBnaXZlbiBsb2NhdGlvbi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXBvc2l0b3J5TmFtZShVUkwgbG9jYXRpb24pIHsKLQkJRmlsZSBmaWxlID0gVVJMVXRpbC50b0ZpbGUobG9jYXRpb24pOwotCQlyZXR1cm4gZmlsZSA9PSBudWxsID8gbG9jYXRpb24udG9FeHRlcm5hbEZvcm0oKSA6IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGVzaXRlL0VDRlRyYW5zcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlc2l0ZS9FQ0ZUcmFuc3BvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhMmE2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGVzaXRlL0VDRlRyYW5zcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqCQljb21wZW9wbGUgQUcgKFN0ZWZhbiBMaWViaWcpIC0gdmFyaW91cyBvbmdvaW5nIG1haW50ZW5hbmNlCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVjZi5jb3JlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZWNmLmNvcmUuc2VjdXJpdHkuQ29ubmVjdENvbnRleHRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVjZi5jb3JlLnNlY3VyaXR5LklDb25uZWN0Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2Zlci5ldmVudHMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLmlkZW50aXR5LkZpbGVDcmVhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2Zlci5pZGVudGl0eS5GaWxlSURGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIuc2VydmljZS5JUmV0cmlldmVGaWxlVHJhbnNmZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuSVN0YXRlZnVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5JU2VydmljZVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLklTZXJ2aWNlVUkuQXV0aGVudGljYXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5yZXBvc2l0b3J5LklSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkuc3RvcmFnZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi0vKioKLSAqIEEgdHJhbnNwb3J0IGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBFQ0YgZmlsZSB0cmFuc2ZlciBBUEkuCi0gKi8KLXB1YmxpYyBjbGFzcyBFQ0ZUcmFuc3BvcnQgewotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgcGFzc3dvcmQgcmV0cnkgYXR0ZW1wdHMgYWxsb3dlZCBiZWZvcmUgZmFpbGluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9HSU5fUkVUUklFUyA9IDM7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm90b2NvbEV4Y2VwdGlvbiBFUlJPUl80MDEgPSBuZXcgUHJvdG9jb2xFeGNlcHRpb24oKTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfUkVESVJFQ1QgPSAiU2VydmVyIHJlZGlyZWN0ZWQgdG9vIG1hbnkgdGltZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIHRyYW5zcG9ydCBpbnN0YW5jZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBFQ0ZUcmFuc3BvcnQgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiBBIGpvYiB0aGF0IHdhaXRzIG9uIGEgYmFycmllci4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgV2FpdEpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgZmluYWwgT2JqZWN0W10gYmFycmllcjsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIHdhaXQgam9iLgotCQkgKiBAcGFyYW0gbG9jYXRpb24gQSBsb2NhdGlvbiBzdHJpbmcgdGhhdCBpcyB1c2VkIGluIHRoZSBqb2IgbmFtZQotCQkgKiBAcGFyYW0gYmFycmllciBUaGUgam9iIHdpbGwgd2FpdCB1bnRpbCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGJhcnJpZXIgaXMgbm9uLW51bGwKLQkJICovCi0JCVdhaXRKb2IoU3RyaW5nIGxvY2F0aW9uLCBPYmplY3RbXSBiYXJyaWVyKSB7Ci0JCQlzdXBlcihOTFMuYmluZChNZXNzYWdlcy5yZXBvX2xvYWRpbmcsIGxvY2F0aW9uKSk7Ci0JCQl0aGlzLmJhcnJpZXIgPSBiYXJyaWVyOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQl9Ci0KLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JCSAqLwotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGJhcnJpZXIpIHsKLQkJCQl3aGlsZSAoYmFycmllclswXSA9PSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQliYXJyaWVyLndhaXQoKTsKLQkJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkJLy9pZ25vcmUKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlVHJhY2tlciByZXRyaWV2YWxGYWN0b3J5VHJhY2tlcjsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gaW5pdGlhbGl6ZWQgaW5zdGFuY2Ugb2YgRUNGVHJhbnNwb3J0Ci0JICovCi0JcHVibGljIHN0YXRpYyBzeW5jaHJvbml6ZWQgRUNGVHJhbnNwb3J0IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRUNGVHJhbnNwb3J0KCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFByaXZhdGUgdG8gYXZvaWQgY2xpZW50IGluc3RhbnRpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBFQ0ZUcmFuc3BvcnQoKSB7Ci0JCXJldHJpZXZhbEZhY3RvcnlUcmFja2VyID0gbmV3IFNlcnZpY2VUcmFja2VyKEFjdGl2YXRvci5nZXRCdW5kbGVDb250ZXh0KCksIElSZXRyaWV2ZUZpbGVUcmFuc2ZlckZhY3RvcnkuY2xhc3MuZ2V0TmFtZSgpLCBudWxsKTsKLQkJcmV0cmlldmFsRmFjdG9yeVRyYWNrZXIub3BlbigpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGxhc3QgbW9kaWZpZWQgZGF0ZSBmb3IgdGhlIHNwZWNpZmllZCBmaWxlLgotCSAqIEBwYXJhbSBsb2NhdGlvbiAtIFRoZSBVUkwgbG9jYXRpb24gb2YgdGhlIGZpbGUuCi0JICogQHJldHVybiBBIDxjb2RlPmxvbmc8L2NvZGU+IHJlcHJlc2VudGluZyB0aGUgZGF0ZS4gUmV0dXJucyA8Y29kZT4wPC9jb2RlPiBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQgb3IgYW4gZXJyb3Igb2NjdXJyZWQuCi0JICogQGV4Y2VwdGlvbiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBpZiB0aGUgcmVxdWVzdCB3YXMgY2FuY2VsZWQuCi0JICovCi0JcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKFVSTCBsb2NhdGlvbikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBsb2NhdGlvblN0cmluZyA9IGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCXRyeSB7Ci0JCQlJQ29ubmVjdENvbnRleHQgY29udGV4dCA9IGdldENvbm5lY3Rpb25Db250ZXh0KGxvY2F0aW9uU3RyaW5nLCBmYWxzZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IExPR0lOX1JFVFJJRVM7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCXJldHVybiBkb0dldExhc3RNb2RpZmllZChsb2NhdGlvblN0cmluZywgY29udGV4dCk7Ci0JCQkJfSBjYXRjaCAoUHJvdG9jb2xFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoRVJST1JfNDAxID09IGUpCi0JCQkJCQljb250ZXh0ID0gZ2V0Q29ubmVjdGlvbkNvbnRleHQobG9jYXRpb25TdHJpbmcsIHRydWUpOwotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUuZ2V0TWVzc2FnZSgpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVXNlckNhbmNlbGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCQkvL3RvbyBtYW55IHJldHJpZXMsIHNvIHJlcG9ydCBhcyBmYWlsdXJlCi0JCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0ZBSUxFRF9BVVRIRU5USUNBVElPTiwgTkxTLmJpbmQoTWVzc2FnZXMuaW9fZmFpbGVkUmVhZCwgbG9jYXRpb25TdHJpbmcpLCBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSB0aGUgRUNGIGNhbGwgdG8gZ2V0IHRoZSBsYXN0IG1vZGlmaWVkIHRpbWUsIGZhaWxpbmcgaWYgdGhlcmUgaXMgYW55Ci0JICogcHJvdG9jb2wgZmFpbHVyZSBzdWNoIGFzIGFuIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUuCi0JICovCi0JcHJpdmF0ZSBsb25nIGRvR2V0TGFzdE1vZGlmaWVkKFN0cmluZyBsb2NhdGlvbiwgSUNvbm5lY3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7Ci0JCUlDb250YWluZXIgY29udGFpbmVyOwotCQl0cnkgewotCQkJY29udGFpbmVyID0gQ29udGFpbmVyRmFjdG9yeS5nZXREZWZhdWx0KCkuY3JlYXRlQ29udGFpbmVyKCk7Ci0JCX0gY2F0Y2ggKENvbnRhaW5lckNyZWF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlJUmVtb3RlRmlsZVN5c3RlbUJyb3dzZXJDb250YWluZXJBZGFwdGVyIGFkYXB0ZXIgPSAoSVJlbW90ZUZpbGVTeXN0ZW1Ccm93c2VyQ29udGFpbmVyQWRhcHRlcikgY29udGFpbmVyLmdldEFkYXB0ZXIoSVJlbW90ZUZpbGVTeXN0ZW1Ccm93c2VyQ29udGFpbmVyQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpIHsKLQkJCXJldHVybiAwOwotCQl9Ci0JCUlSZW1vdGVGaWxlIHJlbW90ZUZpbGUgPSBjaGVja0ZpbGUoYWRhcHRlciwgbG9jYXRpb24sIGNvbnRleHQpOwotCQlpZiAocmVtb3RlRmlsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gcmVtb3RlRmlsZS5nZXRJbmZvKCkuZ2V0TGFzdE1vZGlmaWVkKCk7Ci0JfQotCi0JLyoqCi0JICogRG93bmxvYWRzIHRoZSBjb250ZW50cyBvZiB0aGUgZ2l2ZW4gVVJMIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLiBUaGUKLQkgKiBkZXN0aW5hdGlvbiBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgYnkgdGhpcyBtZXRob2Qgd2hldGhlciBpdCBzdWNjZWVkcwotCSAqIHRvIGRvd25sb2FkIG9yIG5vdC4KLQkgKi8KLQlwdWJsaWMgSVN0YXR1cyBkb3dubG9hZChTdHJpbmcgdXJsLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJSUNvbm5lY3RDb250ZXh0IGNvbnRleHQgPSBnZXRDb25uZWN0aW9uQ29udGV4dCh1cmwsIGZhbHNlKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgTE9HSU5fUkVUUklFUzsgaSsrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmV0dXJuIHBlcmZvcm1Eb3dubG9hZCh1cmwsIGRlc3RpbmF0aW9uLCBjb250ZXh0LCBtb25pdG9yKTsKLQkJCQl9IGNhdGNoIChQcm90b2NvbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChlID09IEVSUk9SXzQwMSkKLQkJCQkJCWNvbnRleHQgPSBnZXRDb25uZWN0aW9uQ29udGV4dCh1cmwsIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVXNlckNhbmNlbGxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJZGVzdGluYXRpb24uY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvL2lnbm9yZSBzZWNvbmRhcnkgZmFpbHVyZQotCQkJfQotCQl9Ci0JCS8vcmVhY2hlZCBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIHdpdGhvdXQgc3VjY2VzcwotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0ZBSUxFRF9BVVRIRU5USUNBVElPTiwgTkxTLmJpbmQoTWVzc2FnZXMuaW9fZmFpbGVkUmVhZCwgdXJsKSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIElTdGF0dXMgcGVyZm9ybURvd25sb2FkKFN0cmluZyB0b0Rvd25sb2FkLCBPdXRwdXRTdHJlYW0gdGFyZ2V0LCBJQ29ubmVjdENvbnRleHQgY29udGV4dCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewotCQlJUmV0cmlldmVGaWxlVHJhbnNmZXJGYWN0b3J5IGZhY3RvcnkgPSAoSVJldHJpZXZlRmlsZVRyYW5zZmVyRmFjdG9yeSkgcmV0cmlldmFsRmFjdG9yeVRyYWNrZXIuZ2V0U2VydmljZSgpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuIHN0YXR1c09uKHRhcmdldCwgbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLmlvX2ZhaWxlZFJlYWQsIHRvRG93bmxvYWQpKSk7Ci0KLQkJcmV0dXJuIHRyYW5zZmVyKGZhY3RvcnkubmV3SW5zdGFuY2UoKSwgdG9Eb3dubG9hZCwgdGFyZ2V0LCBjb250ZXh0LCBtb25pdG9yKTsKLQl9Ci0KLQlwcml2YXRlIElSZW1vdGVGaWxlIGNoZWNrRmlsZShmaW5hbCBJUmVtb3RlRmlsZVN5c3RlbUJyb3dzZXJDb250YWluZXJBZGFwdGVyIHJldHJpZXZhbENvbnRhaW5lciwgZmluYWwgU3RyaW5nIGxvY2F0aW9uLCBJQ29ubmVjdENvbnRleHQgY29udGV4dCkgdGhyb3dzIFByb3RvY29sRXhjZXB0aW9uIHsKLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsyXTsKLQkJZmluYWwgT2JqZWN0IEZBSUwgPSBuZXcgT2JqZWN0KCk7Ci0JCUlSZW1vdGVGaWxlU3lzdGVtTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgSVJlbW90ZUZpbGVTeXN0ZW1MaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZVJlbW90ZUZpbGVFdmVudChJUmVtb3RlRmlsZVN5c3RlbUV2ZW50IGV2ZW50KSB7Ci0JCQkJRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IGV2ZW50LmdldEV4Y2VwdGlvbigpOwotCQkJCWlmIChleGNlcHRpb24gIT0gbnVsbCkgewotCQkJCQlzeW5jaHJvbml6ZWQgKHJlc3VsdCkgewotCQkJCQkJcmVzdWx0WzBdID0gRkFJTDsKLQkJCQkJCXJlc3VsdFsxXSA9IGV4Y2VwdGlvbjsKLQkJCQkJCXJlc3VsdC5ub3RpZnkoKTsKLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBJUmVtb3RlRmlsZVN5c3RlbUJyb3dzZUV2ZW50KSB7Ci0JCQkJCUlSZW1vdGVGaWxlU3lzdGVtQnJvd3NlRXZlbnQgZnNiZSA9IChJUmVtb3RlRmlsZVN5c3RlbUJyb3dzZUV2ZW50KSBldmVudDsKLQkJCQkJSVJlbW90ZUZpbGVbXSByZW1vdGVGaWxlcyA9IGZzYmUuZ2V0UmVtb3RlRmlsZXMoKTsKLQkJCQkJaWYgKHJlbW90ZUZpbGVzICE9IG51bGwgJiYgcmVtb3RlRmlsZXMubGVuZ3RoID4gMCAmJiByZW1vdGVGaWxlc1swXSAhPSBudWxsKSB7Ci0JCQkJCQlzeW5jaHJvbml6ZWQgKHJlc3VsdCkgewotCQkJCQkJCXJlc3VsdFswXSA9IHJlbW90ZUZpbGVzWzBdOwotCQkJCQkJCXJlc3VsdC5ub3RpZnkoKTsKLQkJCQkJCX0KLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN5bmNocm9uaXplZCAocmVzdWx0KSB7Ci0JCQkJCQkJcmVzdWx0WzBdID0gRkFJTDsKLQkJCQkJCQlyZXN1bHQubm90aWZ5KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRyeSB7Ci0JCQlyZXRyaWV2YWxDb250YWluZXIuc2V0Q29ubmVjdENvbnRleHRGb3JBdXRoZW50aWNhdGlvbihjb250ZXh0KTsKLQkJCXJldHJpZXZhbENvbnRhaW5lci5zZW5kQnJvd3NlUmVxdWVzdChGaWxlSURGYWN0b3J5LmdldERlZmF1bHQoKS5jcmVhdGVGaWxlSUQocmV0cmlldmFsQ29udGFpbmVyLmdldEJyb3dzZU5hbWVzcGFjZSgpLCBsb2NhdGlvbiksIGxpc3RlbmVyKTsKLQkJfSBjYXRjaCAoUmVtb3RlRmlsZVN5c3RlbUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfSBjYXRjaCAoRmlsZUNyZWF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQl3YWl0Rm9yKGxvY2F0aW9uLCByZXN1bHQpOwotCQlpZiAocmVzdWx0WzBdID09IEZBSUwgJiYgcmVzdWx0WzFdIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCUlPRXhjZXB0aW9uIGlvRXhjZXB0aW9uID0gKElPRXhjZXB0aW9uKSByZXN1bHRbMV07Ci0JCQkvL3Rocm93IGEgc3BlY2lhbCBleGNlcHRpb24gZm9yIGF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgc28gd2Uga25vdyB0byBwcm9tcHQgZm9yIHVzZXJuYW1lL3Bhc3N3b3JkCi0JCQlTdHJpbmcgbWVzc2FnZSA9IGlvRXhjZXB0aW9uLmdldE1lc3NhZ2UoKTsKLQkJCWlmIChtZXNzYWdlICE9IG51bGwgJiYgKG1lc3NhZ2UuaW5kZXhPZigiIDQwMSAiKSAhPSAtMSB8fCBtZXNzYWdlLmluZGV4T2YoU0VSVkVSX1JFRElSRUNUKSAhPSAtMSkpIC8vJE5PTi1OTFMtMSQKLQkJCQl0aHJvdyBFUlJPUl80MDE7Ci0JCX0KLQkJaWYgKHJlc3VsdFswXSBpbnN0YW5jZW9mIElSZW1vdGVGaWxlKQotCQkJcmV0dXJuIChJUmVtb3RlRmlsZSkgcmVzdWx0WzBdOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXMgdHJhbnNmZXIoZmluYWwgSVJldHJpZXZlRmlsZVRyYW5zZmVyQ29udGFpbmVyQWRhcHRlciByZXRyaWV2YWxDb250YWluZXIsIGZpbmFsIFN0cmluZyB0b0Rvd25sb2FkLCBmaW5hbCBPdXRwdXRTdHJlYW0gdGFyZ2V0LCBJQ29ubmVjdENvbnRleHQgY29udGV4dCwgZmluYWwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdG9jb2xFeGNlcHRpb24gewotCQlmaW5hbCBJU3RhdHVzW10gcmVzdWx0ID0gbmV3IElTdGF0dXNbMV07Ci0JCUlGaWxlVHJhbnNmZXJMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJRmlsZVRyYW5zZmVyTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBoYW5kbGVUcmFuc2ZlckV2ZW50KElGaWxlVHJhbnNmZXJFdmVudCBldmVudCkgewotCQkJCWlmIChldmVudCBpbnN0YW5jZW9mIElJbmNvbWluZ0ZpbGVUcmFuc2ZlclJlY2VpdmVTdGFydEV2ZW50KSB7Ci0JCQkJCUlJbmNvbWluZ0ZpbGVUcmFuc2ZlclJlY2VpdmVTdGFydEV2ZW50IHJzZSA9IChJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlU3RhcnRFdmVudCkgZXZlbnQ7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQkJCQlyc2UucmVjZWl2ZSh0YXJnZXQpOwotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGNvbnZlcnRUb1N0YXR1cyhlKTsKLQkJCQkJCXN5bmNocm9uaXplZCAocmVzdWx0KSB7Ci0JCQkJCQkJcmVzdWx0WzBdID0gc3RhdHVzOwotCQkJCQkJCXJlc3VsdC5ub3RpZnkoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlRGF0YUV2ZW50KSB7Ci0JCQkJCUlJbmNvbWluZ0ZpbGVUcmFuc2ZlciBzb3VyY2UgPSAoKElJbmNvbWluZ0ZpbGVUcmFuc2ZlclJlY2VpdmVEYXRhRXZlbnQpIGV2ZW50KS5nZXRTb3VyY2UoKTsKLQkJCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgewotCQkJCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQkJCXNvdXJjZS5jYW5jZWwoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZXZlbnQgaW5zdGFuY2VvZiBJSW5jb21pbmdGaWxlVHJhbnNmZXJSZWNlaXZlRG9uZUV2ZW50KSB7Ci0JCQkJCUV4Y2VwdGlvbiBleGNlcHRpb24gPSAoKElJbmNvbWluZ0ZpbGVUcmFuc2ZlclJlY2VpdmVEb25lRXZlbnQpIGV2ZW50KS5nZXRFeGNlcHRpb24oKTsKLQkJCQkJSVN0YXR1cyBzdGF0dXMgPSBjb252ZXJ0VG9TdGF0dXMoZXhjZXB0aW9uKTsKLQkJCQkJc3luY2hyb25pemVkIChyZXN1bHQpIHsKLQkJCQkJCXJlc3VsdFswXSA9IHN0YXR1czsKLQkJCQkJCXJlc3VsdC5ub3RpZnkoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQl0cnkgewotCQkJcmV0cmlldmFsQ29udGFpbmVyLnNldENvbm5lY3RDb250ZXh0Rm9yQXV0aGVudGljYXRpb24oY29udGV4dCk7Ci0JCQlyZXRyaWV2YWxDb250YWluZXIuc2VuZFJldHJpZXZlUmVxdWVzdChGaWxlSURGYWN0b3J5LmdldERlZmF1bHQoKS5jcmVhdGVGaWxlSUQocmV0cmlldmFsQ29udGFpbmVyLmdldFJldHJpZXZlTmFtZXNwYWNlKCksIHRvRG93bmxvYWQpLCBsaXN0ZW5lciwgbnVsbCk7Ci0JCX0gY2F0Y2ggKEluY29taW5nRmlsZVRyYW5zZmVyRXhjZXB0aW9uIGUpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gZS5nZXRTdGF0dXMoKTsKLQkJCVRocm93YWJsZSBleGNlcHRpb24gPSBzdGF0dXMuZ2V0RXhjZXB0aW9uKCk7Ci0JCQlpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKLQkJCQlpZiAoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSAhPSBudWxsICYmIChleGNlcHRpb24uZ2V0TWVzc2FnZSgpLmluZGV4T2YoIjQwMSIpICE9IC0xIHx8IGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkuaW5kZXhPZihTRVJWRVJfUkVESVJFQ1QpICE9IC0xKSkgLy8kTk9OLU5MUy0xJAotCQkJCQl0aHJvdyBFUlJPUl80MDE7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhdHVzT24odGFyZ2V0LCBzdGF0dXMpOwotCQl9IGNhdGNoIChGaWxlQ3JlYXRlRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBzdGF0dXNPbih0YXJnZXQsIGUuZ2V0U3RhdHVzKCkpOwotCQl9Ci0JCXdhaXRGb3IodG9Eb3dubG9hZCwgcmVzdWx0KTsKLQkJcmV0dXJuIHN0YXR1c09uKHRhcmdldCwgcmVzdWx0WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb25uZWN0aW9uIGNvbnRleHQgZm9yIHRoZSBnaXZlbiBVUkwuIFRoaXMgbWF5IHByb21wdCB0aGUKLQkgKiB1c2VyIGZvciB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGFzIHJlcXVpcmVkLgotCSAqIAotCSAqIEBwYXJhbSB4bWxMb2NhdGlvbiAtIHRoZSBmaWxlIGxvY2F0aW9uIHJlcXVpcmluZyBsb2dpbiBkZXRhaWxzCi0JICogQHBhcmFtIHByb21wdCAtIHVzZSA8Y29kZT50cnVlPC9jb2RlPiB0byBwcm9tcHQgdGhlIHVzZXIgaW5zdGVhZCBvZgotCSAqIGxvb2tpbmcgYXQgdGhlIHNlY3VyZSBwcmVmZXJlbmNlIHN0b3JlIGZvciBsb2dpbiwgdXNlIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqIHRvIG9ubHkgdHJ5IHRoZSBzZWN1cmUgcHJlZmVyZW5jZSBzdG9yZQotCSAqIEB0aHJvd3MgVXNlckNhbmNlbGxlZEV4Y2VwdGlvbiB3aGVuIHRoZSB1c2VyIGNhbmNlbHMgdGhlIGxvZ2luIHByb21wdCAKLQkgKiBAdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiBpZiB0aGUgcGFzc3dvcmQgY2Fubm90IGJlIHJlYWQgb3Igc2F2ZWQKLQkgKiBAcmV0dXJuIFRoZSBjb25uZWN0aW9uIGNvbnRleHQKLQkgKi8KLQlwdWJsaWMgSUNvbm5lY3RDb250ZXh0IGdldENvbm5lY3Rpb25Db250ZXh0KFN0cmluZyB4bWxMb2NhdGlvbiwgYm9vbGVhbiBwcm9tcHQpIHRocm93cyBVc2VyQ2FuY2VsbGVkRXhjZXB0aW9uLCBQcm92aXNpb25FeGNlcHRpb24gewotCQlJU2VjdXJlUHJlZmVyZW5jZXMgc2VjdXJlUHJlZmVyZW5jZXMgPSBTZWN1cmVQcmVmZXJlbmNlc0ZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotCQlJUGF0aCBob3N0TG9jYXRpb24gPSBuZXcgUGF0aCh4bWxMb2NhdGlvbikucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQlTdHJpbmcgbm9kZUtleTsKLQkJdHJ5IHsKLQkJCW5vZGVLZXkgPSBVUkxFbmNvZGVyLmVuY29kZShob3N0TG9jYXRpb24udG9TdHJpbmcoKSwgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlMikgewotCQkJLy9mYWxsIGJhY2sgdG8gZGVmYXVsdCBwbGF0Zm9ybSBlbmNvZGluZwotCQkJbm9kZUtleSA9IFVSTEVuY29kZXIuZW5jb2RlKGhvc3RMb2NhdGlvbi50b1N0cmluZygpKTsKLQkJfQotCQlTdHJpbmcgbm9kZU5hbWUgPSBJUmVwb3NpdG9yeS5QUkVGRVJFTkNFX05PREUgKyAnLycgKyBub2RlS2V5OwotCQlJU2VjdXJlUHJlZmVyZW5jZXMgcHJlZk5vZGUgPSBudWxsOwotCQlpZiAoc2VjdXJlUHJlZmVyZW5jZXMubm9kZUV4aXN0cyhub2RlTmFtZSkpCi0JCQlwcmVmTm9kZSA9IHNlY3VyZVByZWZlcmVuY2VzLm5vZGUobm9kZU5hbWUpOwotCQlpZiAoIXByb21wdCkgewotCQkJaWYgKHByZWZOb2RlID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl0cnkgewotCQkJCVN0cmluZyB1c2VybmFtZSA9IHByZWZOb2RlLmdldChJUmVwb3NpdG9yeS5QUk9QX1VTRVJOQU1FLCBudWxsKTsKLQkJCQlTdHJpbmcgcGFzc3dvcmQgPSBwcmVmTm9kZS5nZXQoSVJlcG9zaXRvcnkuUFJPUF9QQVNTV09SRCwgbnVsbCk7Ci0JCQkJLy9pZiB3ZSBkb24ndCBoYXZlIHN0b3JlZCBjb25uZWN0aW9uIGRhdGEganVzdCByZXR1cm4gYSBudWxsIGNvbm5lY3Rpb24gY29udGV4dAotCQkJCWlmICh1c2VybmFtZSA9PSBudWxsIHx8IHBhc3N3b3JkID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXJldHVybiBDb25uZWN0Q29udGV4dEZhY3RvcnkuY3JlYXRlVXNlcm5hbWVQYXNzd29yZENvbm5lY3RDb250ZXh0KHVzZXJuYW1lLCBwYXNzd29yZCk7Ci0JCQl9IGNhdGNoIChTdG9yYWdlRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9pbnRlcm5hbEVycm9yLCB4bWxMb2NhdGlvbi50b1N0cmluZygpKTsKLQkJCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsIG1zZywgbnVsbCkpOwotCQkJfQotCQl9Ci0JCS8vbmVlZCB0byBwcm9tcHQgdXNlciBmb3IgdXNlciBuYW1lIGFuZCBwYXNzd29yZAotCQlTZXJ2aWNlVHJhY2tlciBhZG1pblVJVHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcihBY3RpdmF0b3IuZ2V0QnVuZGxlQ29udGV4dCgpLCBJU2VydmljZVVJLmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7Ci0JCWFkbWluVUlUcmFja2VyLm9wZW4oKTsKLQkJSVNlcnZpY2VVSSBhZG1pblVJU2VydmljZSA9IChJU2VydmljZVVJKSBhZG1pblVJVHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0JCUF1dGhlbnRpY2F0aW9uSW5mbyBsb2dpbkRldGFpbHMgPSBudWxsOwotCQlpZiAoYWRtaW5VSVNlcnZpY2UgIT0gbnVsbCkKLQkJCWxvZ2luRGV0YWlscyA9IGFkbWluVUlTZXJ2aWNlLmdldFVzZXJuYW1lUGFzc3dvcmQoaG9zdExvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQkvL251bGwgcmVzdWx0IG1lYW5zIHVzZXIgY2FuY2VsZWQgcGFzc3dvcmQgZGlhbG9nCi0JCWlmIChsb2dpbkRldGFpbHMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBVc2VyQ2FuY2VsbGVkRXhjZXB0aW9uKCk7Ci0JCS8vc2F2ZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGlmIHJlcXVlc3RlZCBieSB1c2VyCi0JCWlmIChsb2dpbkRldGFpbHMuc2F2ZVJlc3VsdCgpKSB7Ci0JCQlpZiAocHJlZk5vZGUgPT0gbnVsbCkKLQkJCQlwcmVmTm9kZSA9IHNlY3VyZVByZWZlcmVuY2VzLm5vZGUobm9kZU5hbWUpOwotCQkJdHJ5IHsKLQkJCQlwcmVmTm9kZS5wdXQoSVJlcG9zaXRvcnkuUFJPUF9VU0VSTkFNRSwgbG9naW5EZXRhaWxzLmdldFVzZXJOYW1lKCksIHRydWUpOwotCQkJCXByZWZOb2RlLnB1dChJUmVwb3NpdG9yeS5QUk9QX1BBU1NXT1JELCBsb2dpbkRldGFpbHMuZ2V0UGFzc3dvcmQoKSwgdHJ1ZSk7Ci0JCQkJcHJlZk5vZGUuZmx1c2goKTsKLQkJCX0gY2F0Y2ggKFN0b3JhZ2VFeGNlcHRpb24gZTEpIHsKLQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMucmVwb01hbl9pbnRlcm5hbEVycm9yLCB4bWxMb2NhdGlvbi50b1N0cmluZygpKTsKLQkJCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsIG1zZywgbnVsbCkpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5yZXBvTWFuX2ludGVybmFsRXJyb3IsIHhtbExvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgbXNnLCBudWxsKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENvbm5lY3RDb250ZXh0RmFjdG9yeS5jcmVhdGVVc2VybmFtZVBhc3N3b3JkQ29ubmVjdENvbnRleHQobG9naW5EZXRhaWxzLmdldFVzZXJOYW1lKCksIGxvZ2luRGV0YWlscy5nZXRQYXNzd29yZCgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBjb252ZXJ0VG9TdGF0dXMoRXhjZXB0aW9uIGUpIHsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQlpZiAoZSBpbnN0YW5jZW9mIFVzZXJDYW5jZWxsZWRFeGNlcHRpb24pCi0JCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLkNBTkNFTCwgQWN0aXZhdG9yLklELCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCXJldHVybiBuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgZS5nZXRNZXNzYWdlKCksIGUpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElTdGF0dXMgc3RhdHVzT24oT3V0cHV0U3RyZWFtIHRhcmdldCwgSVN0YXR1cyBzdGF0dXMpIHsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElTdGF0ZWZ1bCkKLQkJCSgoSVN0YXRlZnVsKSB0YXJnZXQpLnNldFN0YXR1cyhzdGF0dXMpOwotCQlyZXR1cm4gc3RhdHVzOwotCX0KLQotCS8qKgotCSAqIFdhaXRzIHVudGlsIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgZ2l2ZW4gYXJyYXkgaXMgbm9uLW51bGwuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdhaXRGb3IoU3RyaW5nIGxvY2F0aW9uLCBPYmplY3RbXSBiYXJyaWVyKSB7Ci0JCVdhaXRKb2Igd2FpdCA9IG5ldyBXYWl0Sm9iKGxvY2F0aW9uLCBiYXJyaWVyKTsKLQkJd2FpdC5zY2hlZHVsZSgpOwotCQl3aGlsZSAoYmFycmllclswXSA9PSBudWxsKSB7Ci0JCQlib29sZWFuIGxvZ2dlZCA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQl3YWl0LmpvaW4oKTsKLQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoIWxvZ2dlZCkKLQkJCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgQWN0aXZhdG9yLklELCAiVW5leHBlY3RlZCBpbnRlcnJ1cHQgd2hpbGUgd2FpdGluZyBvbiBFQ0YgdHJhbnNmZXIiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZXNpdGUvTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZXNpdGUvTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMyNDg1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGVzaXRlL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlc2l0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLnVwZGF0ZXNpdGUubWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvckNyZWF0aW5nUmVwb3NpdG9yeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvclJlYWRpbmdEaWdlc3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXJyb3JSZWFkaW5nRmVhdHVyZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvclJlYWRpbmdTaXRlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRSZXBvc2l0b3J5TG9jYXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFsZm9ybWVkQXJjaGl2ZVVSTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQbGF0Zm9ybUFkbWluTm90UmVnaXN0ZXJlZDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGlvX2ZhaWxlZFJlYWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb19sb2FkaW5nOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwb01hbl9pbnRlcm5hbEVycm9yOwotCi0Jc3RhdGljIHsKLQkJLy8gaW5pdGlhbGl6ZSByZXNvdXJjZSBidW5kbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTWVzc2FnZXMoKSB7Ci0JCS8vIHByZXZlbnQgaW5zdGFudGlhdGlvbgotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZXNpdGUvVXBkYXRlU2l0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlc2l0ZS9VcGRhdGVTaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNjI5OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlc2l0ZS9VcGRhdGVTaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5jb3JlLmhlbHBlcnMuTG9nSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLlVSTFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IuZmVhdHVyZXMuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUuUHJvdmlzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2l0ZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTl9TRVBBUkFUT1IgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFSX0VYVEVOU0lPTiA9ICIuamFyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0RJUiA9ICJmZWF0dXJlcy8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9ESVIgPSAicGx1Z2lucy8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZFQVRVUkVfVEVNUF9GSUxFID0gImZlYXR1cmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNJVEVfRklMRSA9ICJzaXRlLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSX1NFUEFSQVRPUiA9ICIvIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9GSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFVFJZX0NPVU5UID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UX1hNTCA9ICIueG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSVRFID0gInNpdGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgY2hlY2tzdW07Ci0JcHJpdmF0ZSBVUkwgbG9jYXRpb247Ci0JcHJpdmF0ZSBTaXRlTW9kZWwgc2l0ZTsKLQotCS8qCi0JICogU29tZSB2YXJpYWJsZXMgZm9yIGNhY2hpbmcuCi0JICovCi0JLy8gbWFwIG9mIFN0cmluZyAoVVJMLnRvRXh0ZXJuYWxGb3JtKCkpIHRvIFVwZGF0ZVNpdGUKLQlwcml2YXRlIHN0YXRpYyBNYXAgc2l0ZUNhY2hlID0gbmV3IEhhc2hNYXAoKTsKLQkvLyBtYXAgb2YgU3RyaW5nIChmZWF0dXJlSURfZmVhdHVyZVZlcnNpb24pIHRvIEZlYXR1cmUKLQlwcml2YXRlIE1hcCBmZWF0dXJlQ2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCi0JLyoKLQkgKiBSZXR1cm4gYSBuZXcgVVJMIGZvciB0aGUgZ2l2ZW4gZmlsZSB3aGljaCBpcyBiYXNlZCBmcm9tIHRoZSBzcGVjaWZpZWQgcm9vdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRGaWxlVVJMKFVSTCByb290LCBTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlTdHJpbmcgcGF0aCA9IHJvb3QuZ2V0UGF0aCgpOwotCQlpZiAocGF0aC5lbmRzV2l0aChmaWxlTmFtZSkpCi0JCQlyZXR1cm4gcm9vdDsKLQotCQlpZiAoY29uc3RhaW5zVXBkYXRlU2l0ZUZpbGVOYW1lKHBhdGgpKQotCQkJcmV0dXJuIG5ldyBVUkwocm9vdCwgZmlsZU5hbWUpOwotCi0JCWlmIChwYXRoLmVuZHNXaXRoKERJUl9TRVBBUkFUT1IpKQotCQkJcmV0dXJuIG5ldyBVUkwocm9vdC50b0V4dGVybmFsRm9ybSgpICsgZmlsZU5hbWUpOwotCQlyZXR1cm4gbmV3IFVSTChyb290LnRvRXh0ZXJuYWxGb3JtKCkgKyBESVJfU0VQQVJBVE9SICsgZmlsZU5hbWUpOwotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgVVJMIGJhc2VkIG9uIHRoZSBnaXZlbiBVUkwsIHdoaWNoIHBvaW50cyB0byBhIHNpdGUueG1sIGZpbGUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgVVJMIGdldFNpdGVVUkwoVVJMIHVybCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBwYXRoID0gdXJsLmdldFBhdGgoKTsKLQkJaWYgKGNvbnN0YWluc1VwZGF0ZVNpdGVGaWxlTmFtZShwYXRoKSkKLQkJCXJldHVybiB1cmw7Ci0KLQkJaWYgKHBhdGguZW5kc1dpdGgoRElSX1NFUEFSQVRPUikpCi0JCQlyZXR1cm4gbmV3IFVSTCh1cmwudG9FeHRlcm5hbEZvcm0oKSArIFNJVEVfRklMRSk7Ci0JCXJldHVybiBuZXcgVVJMKHVybC50b0V4dGVybmFsRm9ybSgpICsgRElSX1NFUEFSQVRPUiArIFNJVEVfRklMRSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb25zdGFpbnNVcGRhdGVTaXRlRmlsZU5hbWUoU3RyaW5nIHBhdGgpIHsKLQkJaWYgKHBhdGguZW5kc1dpdGgoRE9UX1hNTCkpIHsKLQkJCWludCBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlTdHJpbmcgbGFzdFNlZ21lbnQgPSBsYXN0U2xhc2ggPT0gLTEgPyBwYXRoIDogcGF0aC5zdWJzdHJpbmcobGFzdFNsYXNoICsgMSk7Ci0JCQlpZiAobGFzdFNlZ21lbnQuaW5kZXhPZihTSVRFKSAhPSAtMSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBMb2FkIGFuZCByZXR1cm4gYW4gdXBkYXRlIHNpdGUgb2JqZWN0IGZyb20gdGhlIGdpdmVuIGxvY2F0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgVXBkYXRlU2l0ZSBsb2FkKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVXBkYXRlU2l0ZSByZXN1bHQgPSAoVXBkYXRlU2l0ZSkgc2l0ZUNhY2hlLmdldChsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpKTsKLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJSW5wdXRTdHJlYW0gaW5wdXQgPSBudWxsOwotCQlGaWxlIHNpdGVGaWxlID0gbG9hZFNpdGVGaWxlKGxvY2F0aW9uLCBtb25pdG9yKTsKLQkJdHJ5IHsKLQkJCURlZmF1bHRTaXRlUGFyc2VyIHNpdGVQYXJzZXIgPSBuZXcgRGVmYXVsdFNpdGVQYXJzZXIoKTsKLQkJCUNoZWNrc3VtIGNoZWNrc3VtID0gbmV3IENSQzMyKCk7Ci0JCQlpbnB1dCA9IG5ldyBDaGVja2VkSW5wdXRTdHJlYW0obmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbShzaXRlRmlsZSkpLCBjaGVja3N1bSk7Ci0JCQlTaXRlTW9kZWwgc2l0ZU1vZGVsID0gc2l0ZVBhcnNlci5wYXJzZShpbnB1dCk7Ci0JCQlTdHJpbmcgY2hlY2tzdW1TdHJpbmcgPSBMb25nLnRvU3RyaW5nKGNoZWNrc3VtLmdldFZhbHVlKCkpOwotCQkJcmVzdWx0ID0gbmV3IFVwZGF0ZVNpdGUoc2l0ZU1vZGVsLCBnZXRTaXRlVVJMKGxvY2F0aW9uKSwgY2hlY2tzdW1TdHJpbmcpOwotCQkJc2l0ZUNhY2hlLnB1dChsb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLCByZXN1bHQpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdTaXRlLCBsb2NhdGlvbik7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfUkVBRCwgbXNnLCBlKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdTaXRlLCBsb2NhdGlvbik7Ci0JCQl0aHJvdyBuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfUkVBRCwgbXNnLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpbnB1dCAhPSBudWxsKQotCQkJCQlpbnB1dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJaWYgKCFQUk9UT0NPTF9GSUxFLmVxdWFscyhsb2NhdGlvbi5nZXRQcm90b2NvbCgpKSkKLQkJCQlzaXRlRmlsZS5kZWxldGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBsb2NhbCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnRzIG9mIHRoZSB1cGRhdGUgc2l0ZSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZSBsb2FkU2l0ZUZpbGUoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlUaHJvd2FibGUgZmFpbHVyZTsKLQkJRmlsZSBzaXRlRmlsZTsKLQkJSVN0YXR1cyB0cmFuc2ZlclJlc3VsdDsKLQkJdHJ5IHsKLQkJCVVSTCBhY3R1YWxMb2NhdGlvbiA9IGdldFNpdGVVUkwobG9jYXRpb24pOwotCQkJaWYgKFBST1RPQ09MX0ZJTEUuZXF1YWxzKGFjdHVhbExvY2F0aW9uLmdldFByb3RvY29sKCkpKSB7Ci0JCQkJc2l0ZUZpbGUgPSBuZXcgRmlsZShhY3R1YWxMb2NhdGlvbi5nZXRQYXRoKCkpOwotCQkJCWlmIChzaXRlRmlsZS5leGlzdHMoKSkKLQkJCQkJdHJhbnNmZXJSZXN1bHQgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuRXJyb3JSZWFkaW5nU2l0ZSwgbG9jYXRpb24pOwotCQkJCQl0cmFuc2ZlclJlc3VsdCA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBtc2csIG5ldyBGaWxlTm90Rm91bmRFeGNlcHRpb24oc2l0ZUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXNpdGVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgic2l0ZSIsICIueG1sIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNpdGVGaWxlKSk7Ci0JCQkJdHJhbnNmZXJSZXN1bHQgPSBnZXRUcmFuc3BvcnQoKS5kb3dubG9hZChhY3R1YWxMb2NhdGlvbi50b0V4dGVybmFsRm9ybSgpLCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JCQl9Ci0JCQlpZiAodHJhbnNmZXJSZXN1bHQuaXNPSygpKQotCQkJCXJldHVybiBzaXRlRmlsZTsKLQkJCWZhaWx1cmUgPSB0cmFuc2ZlclJlc3VsdC5nZXRFeGNlcHRpb24oKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJZmFpbHVyZSA9IGU7Ci0JCX0KLQkJaW50IGNvZGUgPSAoZmFpbHVyZSBpbnN0YW5jZW9mIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbikgPyBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9OT1RfRk9VTkQgOiBQcm92aXNpb25FeGNlcHRpb24uUkVQT1NJVE9SWV9GQUlMRURfUkVBRDsKLQkJU3RyaW5nIG1zZyA9IE5MUy5iaW5kKE1lc3NhZ2VzLkVycm9yUmVhZGluZ1NpdGUsIGxvY2F0aW9uKTsKLQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgY29kZSwgbXNnLCBmYWlsdXJlKSk7Ci0JfQotCi0JLyoKLQkgKiBQYXJzZSB0aGUgZmVhdHVyZS54bWwgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gYW5kIHJldHVybiB0aGUgZmVhdHVyZSBvYmplY3QuCi0JICogSW4gY2FzZSBvZiBmYWlsdXJlLCB0aGUgZmFpbHVyZSBpcyBsb2dnZWQgYW5kIG51bGwgaXMgcmV0dXJuZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBGZWF0dXJlIHBhcnNlRmVhdHVyZShGZWF0dXJlUGFyc2VyIGZlYXR1cmVQYXJzZXIsIFVSTCBmZWF0dXJlVVJMKSB7Ci0JCUZpbGUgZmVhdHVyZUZpbGUgPSBudWxsOwotCQlpZiAoUFJPVE9DT0xfRklMRS5lcXVhbHMoZmVhdHVyZVVSTC5nZXRQcm90b2NvbCgpKSkgewotCQkJZmVhdHVyZUZpbGUgPSBuZXcgRmlsZShmZWF0dXJlVVJMLmdldFBhdGgoKSk7Ci0JCQlyZXR1cm4gZmVhdHVyZVBhcnNlci5wYXJzZShmZWF0dXJlRmlsZSk7Ci0JCX0KLQkJdHJ5IHsKLQkJCWZlYXR1cmVGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZShGRUFUVVJFX1RFTVBfRklMRSwgSkFSX0VYVEVOU0lPTik7Ci0JCQlPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZmVhdHVyZUZpbGUpKTsKLQkJCUlTdGF0dXMgdHJhbnNmZXJSZXN1bHQgPSBudWxsOwotCQkJLy90cnkgdGhlIGRvd25sb2FkIHR3aWNlIGluIGNhc2Ugb2YgdHJhbnNpZW50IG5ldHdvcmsgcHJvYmxlbXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgUkVUUllfQ09VTlQ7IGkrKykgewotCQkJCWRlc3RpbmF0aW9uID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZlYXR1cmVGaWxlKSk7Ci0JCQkJdHJhbnNmZXJSZXN1bHQgPSBnZXRUcmFuc3BvcnQoKS5kb3dubG9hZChmZWF0dXJlVVJMLnRvRXh0ZXJuYWxGb3JtKCksIGRlc3RpbmF0aW9uLCBudWxsKTsKLQkJCQlpZiAodHJhbnNmZXJSZXN1bHQuaXNPSygpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmICghdHJhbnNmZXJSZXN1bHQuaXNPSygpKSB7Ci0JCQkJTG9nSGVscGVyLmxvZyhuZXcgUHJvdmlzaW9uRXhjZXB0aW9uKHRyYW5zZmVyUmVzdWx0KSk7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gZmVhdHVyZVBhcnNlci5wYXJzZShmZWF0dXJlRmlsZSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLkVycm9yUmVhZGluZ0ZlYXR1cmUsIGZlYXR1cmVVUkwpLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoZmVhdHVyZUZpbGUgIT0gbnVsbCkKLQkJCQlmZWF0dXJlRmlsZS5kZWxldGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgc2l0ZSBwb2ludGVkIHRvIGJ5IHRoZSBnaXZlbiBVUkwgaXMgbm90IHZhbGlkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShVUkwgdXJsLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJVVJMIHNpdGVVUkwgPSBnZXRTaXRlVVJMKHVybCk7Ci0JCQlsb25nIGxhc3RNb2RpZmllZCA9IGdldFRyYW5zcG9ydCgpLmdldExhc3RNb2RpZmllZChzaXRlVVJMKTsKLQkJCWlmIChsYXN0TW9kaWZpZWQgPT0gMCkgewotCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdTaXRlLCB1cmwpOwotCQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIFByb3Zpc2lvbkV4Y2VwdGlvbi5SRVBPU0lUT1JZX0ZBSUxFRF9SRUFELCBtc2csIG51bGwpKTsKLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdTaXRlLCB1cmwpOwotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfRkFJTEVEX1JFQUQsIG1zZywgZSkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBDb25zdHJ1Y3RvciBmb3IgdGhlIGNsYXNzLgotCSAqLwotCXByaXZhdGUgVXBkYXRlU2l0ZShTaXRlTW9kZWwgc2l0ZSwgVVJMIGxvY2F0aW9uLCBTdHJpbmcgY2hlY2tzdW0pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zaXRlID0gc2l0ZTsKLQkJdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwotCQl0aGlzLmNoZWNrc3VtID0gY2hlY2tzdW07Ci0JfQotCi0JLyoKLQkgKiBJdGVyYXRlIG92ZXIgdGhlIGFyY2hpdmUgZW50cmllcyBpbiB0aGlzIHNpdGUgYW5kIHJldHVybiB0aGUgbWF0Y2hpbmcgVVJMIHN0cmluZyBmb3IKLQkgKiB0aGUgZ2l2ZW4gaWRlbnRpZmllciwgaWYgdGhlcmUgaXMgb25lLgotCSAqLwotCXByaXZhdGUgVVJMIGdldEFyY2hpdmVVUkwoVVJMIGJhc2UsIFN0cmluZyBpZGVudGlmaWVyKSB7Ci0JCVVSTEVudHJ5W10gYXJjaGl2ZXMgPSBzaXRlLmdldEFyY2hpdmVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBhcmNoaXZlcyAhPSBudWxsICYmIGkgPCBhcmNoaXZlcy5sZW5ndGg7IGkrKykgewotCQkJVVJMRW50cnkgZW50cnkgPSBhcmNoaXZlc1tpXTsKLQkJCWlmIChpZGVudGlmaWVyLmVxdWFscyhlbnRyeS5nZXRBbm5vdGF0aW9uKCkpKQotCQkJCXJldHVybiBpbnRlcm5hbEdldFVSTChiYXNlLCBlbnRyeS5nZXRVUkwoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gdGhlIGNoZWNrc3VtIGZvciB0aGlzIHNpdGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDaGVja3N1bSgpIHsKLQkJcmV0dXJuIGNoZWNrc3VtOwotCX0KLQotCS8qCi0JICogUmV0dXJuIGEgVVJMIHdoaWNoIHJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIG9mIHRoZSBnaXZlbiBmZWF0dXJlLgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0U2l0ZUZlYXR1cmVVUkwoU2l0ZUZlYXR1cmUgc2l0ZUZlYXR1cmUpIHsKLQkJVVJMIHVybCA9IHNpdGVGZWF0dXJlLmdldFVSTCgpOwotCQlpZiAodXJsICE9IG51bGwpCi0JCQlyZXR1cm4gdXJsOwotCi0JCVVSTCBiYXNlID0gZ2V0QmFzZVVSTCgpOwotCQlTdHJpbmcgZmVhdHVyZVVSTFN0cmluZyA9IHNpdGVGZWF0dXJlLmdldFVSTFN0cmluZygpOwotCQlyZXR1cm4gaW50ZXJuYWxHZXRVUkwoYmFzZSwgZmVhdHVyZVVSTFN0cmluZyk7Ci0JfQotCi0JLyoKLQkgKiBSZXR1cm4gYSBVUkwgd2hpY2ggcmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgdGhlIGdpdmVuIGZlYXR1cmUuCi0JICovCi0JcHVibGljIFVSTCBnZXRGZWF0dXJlVVJMKFN0cmluZyBpZCwgU3RyaW5nIHZlcnNpb24pIHsKLQkJU2l0ZUZlYXR1cmVbXSBlbnRyaWVzID0gc2l0ZS5nZXRGZWF0dXJlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpZC5lcXVhbHMoZW50cmllc1tpXS5nZXRGZWF0dXJlSWRlbnRpZmllcigpKSAmJiB2ZXJzaW9uLmVxdWFscyhlbnRyaWVzW2ldLmdldEZlYXR1cmVWZXJzaW9uKCkpKSB7Ci0JCQkJcmV0dXJuIGdldFNpdGVGZWF0dXJlVVJMKGVudHJpZXNbaV0pOwotCQkJfQotCQl9Ci0KLQkJVVJMIGJhc2UgPSBnZXRCYXNlVVJMKCk7Ci0JCVVSTCB1cmwgPSBnZXRBcmNoaXZlVVJMKGJhc2UsIEZFQVRVUkVfRElSICsgaWQgKyBWRVJTSU9OX1NFUEFSQVRPUiArIHZlcnNpb24gKyBKQVJfRVhURU5TSU9OKTsKLQkJaWYgKHVybCAhPSBudWxsKQotCQkJcmV0dXJuIHVybDsKLQotCQkvLyBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCBVUkwKLQkJdHJ5IHsKLQkJCXJldHVybiBnZXRGaWxlVVJMKGJhc2UsIEZFQVRVUkVfRElSICsgaWQgKyBWRVJTSU9OX1NFUEFSQVRPUiArIHZlcnNpb24gKyBKQVJfRVhURU5TSU9OKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZG4ndCBoYXBwZW4KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgbG9jYXRpb24gb2YgdGhpcyBzaXRlLgotCSAqLwotCXB1YmxpYyBVUkwgZ2V0TG9jYXRpb24oKSB7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiBhIFVSTCB3aGljaCByZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBvZiB0aGUgZ2l2ZW4gcGx1Zy1pbi4KLQkgKi8KLQlwdWJsaWMgVVJMIGdldFBsdWdpblVSTChGZWF0dXJlRW50cnkgcGx1Z2luKSB7Ci0JCVVSTCBiYXNlID0gZ2V0QmFzZVVSTCgpOwotCQlTdHJpbmcgcGF0aCA9IFBMVUdJTl9ESVIgKyBwbHVnaW4uZ2V0SWQoKSArIFZFUlNJT05fU0VQQVJBVE9SICsgcGx1Z2luLmdldFZlcnNpb24oKSArIEpBUl9FWFRFTlNJT047Ci0JCVVSTCB1cmwgPSBnZXRBcmNoaXZlVVJMKGJhc2UsIHBhdGgpOwotCQlpZiAodXJsICE9IG51bGwpCi0JCQlyZXR1cm4gdXJsOwotCQl0cnkgewotCQkJcmV0dXJuIGdldEZpbGVVUkwoYmFzZSwgcGF0aCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGRuJ3QgaGFwcGVuCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBVUkwgZ2V0QmFzZVVSTCgpIHsKLQkJVVJMIGJhc2UgPSBudWxsOwotCQlTdHJpbmcgc2l0ZVVSTFN0cmluZyA9IHNpdGUuZ2V0TG9jYXRpb25VUkxTdHJpbmcoKTsKLQkJaWYgKHNpdGVVUkxTdHJpbmcgIT0gbnVsbCkgewotCQkJaWYgKCFzaXRlVVJMU3RyaW5nLmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlzaXRlVVJMU3RyaW5nICs9ICIvIjsgLy8kTk9OLU5MUy0xJAotCQkJYmFzZSA9IGludGVybmFsR2V0VVJMKGxvY2F0aW9uLCBzaXRlVVJMU3RyaW5nKTsKLQkJfQotCQlpZiAoYmFzZSA9PSBudWxsKQotCQkJYmFzZSA9IGxvY2F0aW9uOwotCQlyZXR1cm4gYmFzZTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgc2l0ZSBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgU2l0ZU1vZGVsIGdldFNpdGUoKSB7Ci0JCXJldHVybiBzaXRlOwotCX0KLQotCS8qCi0JICogVGhlIHRyYWlsaW5nIHBhcmFtZXRlciBjYW4gYmUgZWl0aGVyIG51bGwsIHJlbGF0aXZlIG9yIGFic29sdXRlLiBJZiBpdCBpcyBudWxsLAotCSAqIHRoZW4gcmV0dXJuIG51bGwuIElmIGl0IGlzIGFic29sdXRlLCB0aGVuIGNyZWF0ZSBhIG5ldyB1cmwgYW5kIHJldHVybiBpdC4gSWYgaXQgaXMKLQkgKiByZWxhdGl2ZSwgdGhlbiBtYWtlIGl0IHJlbGF0aXZlIHRvIHRoZSBnaXZlbiBiYXNlIHVybC4KLQkgKi8KLQlwcml2YXRlIFVSTCBpbnRlcm5hbEdldFVSTChVUkwgYmFzZSwgU3RyaW5nIHRyYWlsaW5nKSB7Ci0JCWlmICh0cmFpbGluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTCh0cmFpbGluZyk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBuZXcgVVJMKGJhc2UsIHRyYWlsaW5nKTsKLQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlMikgewotCQkJCS8vIHNob3VsZG4ndCBoYXBwZW4KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIExvYWQgYW5kIHJldHVybiB0aGUgZmVhdHVyZXMgcmVmZXJlbmNlcyBpbiB0aGlzIHVwZGF0ZSBzaXRlLgotCSAqLwotCXB1YmxpYyBGZWF0dXJlW10gbG9hZEZlYXR1cmVzKCkgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUZlYXR1cmVbXSByZXN1bHQgPSBsb2FkRmVhdHVyZXNGcm9tRGlnZXN0KCk7Ci0JCXJldHVybiByZXN1bHQgPT0gbnVsbCA/IGxvYWRGZWF0dXJlc0Zyb21TaXRlKCkgOiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBUcnkgYW5kIGxvYWQgdGhlIGZlYXR1cmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdXBkYXRlIHNpdGUncwotCSAqIGRpZ2VzdCBmaWxlLCBpZiBpdCBleGlzdHMuCi0JICovCi0JcHJpdmF0ZSBGZWF0dXJlW10gbG9hZEZlYXR1cmVzRnJvbURpZ2VzdCgpIHsKLQkJRmlsZSBkaWdlc3RGaWxlID0gbnVsbDsKLQkJYm9vbGVhbiBsb2NhbCA9IGZhbHNlOwotCQlpZiAoIWZlYXR1cmVDYWNoZS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gKEZlYXR1cmVbXSkgZmVhdHVyZUNhY2hlLnZhbHVlcygpLnRvQXJyYXkobmV3IEZlYXR1cmVbZmVhdHVyZUNhY2hlLnNpemUoKV0pOwotCQl0cnkgewotCQkJVVJMIGRpZ2VzdFVSTCA9IGdldERpZ2VzdFVSTCgpOwotCQkJaWYgKFBST1RPQ09MX0ZJTEUuZXF1YWxzKGRpZ2VzdFVSTC5nZXRQcm90b2NvbCgpKSkgewotCQkJCWRpZ2VzdEZpbGUgPSBVUkxVdGlsLnRvRmlsZShkaWdlc3RVUkwpOwotCQkJCWlmICghZGlnZXN0RmlsZS5leGlzdHMoKSkKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJbG9jYWwgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlkaWdlc3RGaWxlID0gRmlsZS5jcmVhdGVUZW1wRmlsZSgiZGlnZXN0IiwgIi56aXAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJQnVmZmVyZWRPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24gPSBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0oZGlnZXN0RmlsZSkpOwotCQkJCUlTdGF0dXMgcmVzdWx0ID0gZ2V0VHJhbnNwb3J0KCkuZG93bmxvYWQoZGlnZXN0VVJMLnRvRXh0ZXJuYWxGb3JtKCksIGRlc3RpbmF0aW9uLCBudWxsKTsKLQkJCQlpZiAoIXJlc3VsdC5pc09LKCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJRmVhdHVyZVtdIGZlYXR1cmVzID0gbmV3IERpZ2VzdFBhcnNlcigpLnBhcnNlKGRpZ2VzdEZpbGUpOwotCQkJaWYgKGZlYXR1cmVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGtleSA9IGZlYXR1cmVzW2ldLmdldElkKCkgKyBWRVJTSU9OX1NFUEFSQVRPUiArIGZlYXR1cmVzW2ldLmdldFZlcnNpb24oKTsKLQkJCQlmZWF0dXJlQ2FjaGUucHV0KGtleSwgZmVhdHVyZXNbaV0pOwotCQkJfQotCQkJcmV0dXJuIGZlYXR1cmVzOwotCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotCQkJLy8gd2UgZG8gbm90IHRyYWNrIEZORiBleGNlcHRpb25zIGFzIHdlIHdpbGwgZmFsbCBiYWNrIHRvIHRoZSAKLQkJCS8vIHN0YW5kYXJkIGZlYXR1cmUgcGFyc2luZyBmcm9tIHRoZSBzaXRlIGl0c2VsZiwgc2VlIGJ1ZyAyMjU1ODcuCi0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbXNnID0gTkxTLmJpbmQoTWVzc2FnZXMuSW52YWxpZFJlcG9zaXRvcnlMb2NhdGlvbiwgbG9jYXRpb24pOwotCQkJTG9nSGVscGVyLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgUHJvdmlzaW9uRXhjZXB0aW9uLlJFUE9TSVRPUllfSU5WQUxJRF9MT0NBVElPTiwgbXNnLCBlKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE5MUy5iaW5kKE1lc3NhZ2VzLkVycm9yUmVhZGluZ0RpZ2VzdCwgbG9jYXRpb24pLCBlKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAoIWxvY2FsICYmIGRpZ2VzdEZpbGUgIT0gbnVsbCkKLQkJCQlkaWdlc3RGaWxlLmRlbGV0ZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgVVJMIGdldERpZ2VzdFVSTCgpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gewotCQlVUkwgZGlnZXN0QmFzZSA9IGxvY2F0aW9uOwotCQlTdHJpbmcgZGlnZXN0VVJMU3RyaW5nID0gc2l0ZS5nZXREaWdlc3RVUkxTdHJpbmcoKTsKLQkJaWYgKGRpZ2VzdFVSTFN0cmluZyAhPSBudWxsKSB7Ci0JCQlpZiAoIWRpZ2VzdFVSTFN0cmluZy5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQkJZGlnZXN0VVJMU3RyaW5nICs9ICIvIjsgLy8kTk9OLU5MUy0xJAotCQkJZGlnZXN0QmFzZSA9IGludGVybmFsR2V0VVJMKGxvY2F0aW9uLCBkaWdlc3RVUkxTdHJpbmcpOwotCQl9Ci0KLQkJcmV0dXJuIGdldEZpbGVVUkwoZGlnZXN0QmFzZSwgImRpZ2VzdC56aXAiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogTG9hZCBhbmQgcmV0dXJuIHRoZSBmZWF0dXJlcyB0aGF0IGFyZSByZWZlcmVuY2VkIGJ5IHRoaXMgdXBkYXRlIHNpdGUuIE5vdGUgdGhpcwotCSAqIHJlcXVpcmVzIGRvd25sb2FkaW5nIGFuZCBwYXJzaW5nIHRoZSBmZWF0dXJlIG1hbmlmZXN0IGxvY2FsbHkuCi0JICovCi0JcHJpdmF0ZSBGZWF0dXJlW10gbG9hZEZlYXR1cmVzRnJvbVNpdGUoKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJU2l0ZUZlYXR1cmVbXSBzaXRlRmVhdHVyZXMgPSBzaXRlLmdldEZlYXR1cmVzKCk7Ci0JCUZlYXR1cmVQYXJzZXIgZmVhdHVyZVBhcnNlciA9IG5ldyBGZWF0dXJlUGFyc2VyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZUZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTaXRlRmVhdHVyZSBzaXRlRmVhdHVyZSA9IHNpdGVGZWF0dXJlc1tpXTsKLQkJCVN0cmluZyBrZXkgPSBudWxsOwotCQkJaWYgKHNpdGVGZWF0dXJlLmdldEZlYXR1cmVJZGVudGlmaWVyKCkgIT0gbnVsbCAmJiBzaXRlRmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpICE9IG51bGwpIHsKLQkJCQlrZXkgPSBzaXRlRmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpICsgVkVSU0lPTl9TRVBBUkFUT1IgKyBzaXRlRmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpOwotCQkJCWlmIChmZWF0dXJlQ2FjaGUuY29udGFpbnNLZXkoa2V5KSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQlVUkwgZmVhdHVyZVVSTCA9IGdldFNpdGVGZWF0dXJlVVJMKHNpdGVGZWF0dXJlKTsKLQkJCUZlYXR1cmUgZmVhdHVyZSA9IHBhcnNlRmVhdHVyZShmZWF0dXJlUGFyc2VyLCBmZWF0dXJlVVJMKTsKLQkJCWlmIChmZWF0dXJlID09IG51bGwpIHsKLQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdGZWF0dXJlLCBmZWF0dXJlVVJMKSkpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoa2V5ID09IG51bGwpIHsKLQkJCQkJc2l0ZUZlYXR1cmUuc2V0RmVhdHVyZUlkZW50aWZpZXIoZmVhdHVyZS5nZXRJZCgpKTsKLQkJCQkJc2l0ZUZlYXR1cmUuc2V0RmVhdHVyZVZlcnNpb24oZmVhdHVyZS5nZXRWZXJzaW9uKCkpOwotCQkJCQlrZXkgPSBzaXRlRmVhdHVyZS5nZXRGZWF0dXJlSWRlbnRpZmllcigpICsgVkVSU0lPTl9TRVBBUkFUT1IgKyBzaXRlRmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpOwotCQkJCX0KLQkJCQlmZWF0dXJlQ2FjaGUucHV0KGtleSwgZmVhdHVyZSk7Ci0JCQkJbG9hZEluY2x1ZGVkRmVhdHVyZXMoZmVhdHVyZSwgZmVhdHVyZVBhcnNlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChGZWF0dXJlW10pIGZlYXR1cmVDYWNoZS52YWx1ZXMoKS50b0FycmF5KG5ldyBGZWF0dXJlW2ZlYXR1cmVDYWNoZS5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIExvYWQgdGhlIGZlYXR1cmVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IHRoZSBnaXZlbiBmZWF0dXJlLgotCSAqLwotCXByaXZhdGUgdm9pZCBsb2FkSW5jbHVkZWRGZWF0dXJlcyhGZWF0dXJlIGZlYXR1cmUsIEZlYXR1cmVQYXJzZXIgZmVhdHVyZVBhcnNlcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCUZlYXR1cmVFbnRyeVtdIGZlYXR1cmVFbnRyaWVzID0gZmVhdHVyZS5nZXRFbnRyaWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmVhdHVyZUVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCUZlYXR1cmVFbnRyeSBlbnRyeSA9IGZlYXR1cmVFbnRyaWVzW2ldOwotCQkJaWYgKGVudHJ5LmlzUmVxdWlyZXMoKSB8fCBlbnRyeS5pc1BsdWdpbigpKQotCQkJCWNvbnRpbnVlOwotCQkJU3RyaW5nIGtleSA9IGVudHJ5LmdldElkKCkgKyBWRVJTSU9OX1NFUEFSQVRPUiArIGVudHJ5LmdldFZlcnNpb24oKTsKLQkJCWlmIChmZWF0dXJlQ2FjaGUuY29udGFpbnNLZXkoa2V5KSkKLQkJCQljb250aW51ZTsKLQotCQkJVVJMIGluY2x1ZGVkRmVhdHVyZVVSTCA9IGdldEZlYXR1cmVVUkwoZW50cnkuZ2V0SWQoKSwgZW50cnkuZ2V0VmVyc2lvbigpKTsKLQkJCUZlYXR1cmUgaW5jbHVkZWRGZWF0dXJlID0gcGFyc2VGZWF0dXJlKGZlYXR1cmVQYXJzZXIsIGluY2x1ZGVkRmVhdHVyZVVSTCk7Ci0JCQlpZiAoaW5jbHVkZWRGZWF0dXJlID09IG51bGwpIHsKLQkJCQlMb2dIZWxwZXIubG9nKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgQWN0aXZhdG9yLklELCBOTFMuYmluZChNZXNzYWdlcy5FcnJvclJlYWRpbmdGZWF0dXJlLCBpbmNsdWRlZEZlYXR1cmVVUkwpKSk7Ci0JCQl9IGVsc2UgewotCQkJCWZlYXR1cmVDYWNoZS5wdXQoa2V5LCBpbmNsdWRlZEZlYXR1cmUpOwotCQkJCWxvYWRJbmNsdWRlZEZlYXR1cmVzKGluY2x1ZGVkRmVhdHVyZSwgZmVhdHVyZVBhcnNlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBFQ0ZUcmFuc3BvcnQgZ2V0VHJhbnNwb3J0KCkgewotCQlyZXR1cm4gRUNGVHJhbnNwb3J0LmdldEluc3RhbmNlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlc2l0ZS9hcnRpZmFjdC9VcGRhdGVTaXRlQXJ0aWZhY3RSZXBvc2l0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGVzaXRlL2FydGlmYWN0L1VwZGF0ZVNpdGVBcnRpZmFjdFJlcG9zaXRvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxOTU4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGVzaXRlL2FydGlmYWN0L1VwZGF0ZVNpdGVBcnRpZmFjdFJlcG9zaXRvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlLmFydGlmYWN0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5Lio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLklBcnRpZmFjdEtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLm1ldGFkYXRhLmdlbmVyYXRvci4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLmFydGlmYWN0LnJlcG9zaXRvcnkuU2ltcGxlQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5jb3JlLnJlcG9zaXRvcnkuQWJzdHJhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2l0ZUFydGlmYWN0UmVwb3NpdG9yeSBleHRlbmRzIEFic3RyYWN0UmVwb3NpdG9yeSBpbXBsZW1lbnRzIElBcnRpZmFjdFJlcG9zaXRvcnkgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUuYXJ0aWZhY3RSZXBvc2l0b3J5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgSW50ZWdlciBWRVJTSU9OID0gbmV3IEludGVnZXIoMSk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfQVJUSUZBQ1RfUkVGRVJFTkNFID0gImFydGlmYWN0LnJlZmVyZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9GT1JDRV9USFJFQURJTkcgPSAiZWNsaXBzZS5wMi5mb3JjZS50aHJlYWRpbmciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfU0lURV9DSEVDS1NVTSA9ICJzaXRlLmNoZWNrc3VtIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9UT0NPTF9GSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIElBcnRpZmFjdFJlcG9zaXRvcnkgYXJ0aWZhY3RSZXBvc2l0b3J5OwotCi0JcHVibGljIFVwZGF0ZVNpdGVBcnRpZmFjdFJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlzdXBlcihBY3RpdmF0b3IuZ2V0UmVwb3NpdG9yeU5hbWUobG9jYXRpb24pLCBUWVBFLCBWRVJTSU9OLnRvU3RyaW5nKCksIGxvY2F0aW9uLCBudWxsLCBudWxsLCBudWxsKTsKLQotCQkvLyB0b2RvIHByb2dyZXNzIG1vbml0b3JpbmcKLQkJLy8gbG9hZGluZyB2YWxpZGF0ZXMgYmVmb3JlIHdlIGNyZWF0ZSByZXBvc2l0b3JpZXMKLQkJVXBkYXRlU2l0ZSB1cGRhdGVTaXRlID0gVXBkYXRlU2l0ZS5sb2FkKGxvY2F0aW9uLCBudWxsKTsKLQotCQlCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBBY3RpdmF0b3IuZ2V0QnVuZGxlQ29udGV4dCgpOwotCQlVUkwgbG9jYWxSZXBvc2l0b3J5VVJMID0gbnVsbDsKLQkJdHJ5IHsKLQkJCVN0cmluZyBzdGF0ZURpck5hbWUgPSBJbnRlZ2VyLnRvU3RyaW5nKGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkuaGFzaENvZGUoKSk7Ci0JCQlGaWxlIGJ1bmRsZURhdGEgPSBjb250ZXh0LmdldERhdGFGaWxlKG51bGwpOwotCQkJRmlsZSBzdGF0ZURpciA9IG5ldyBGaWxlKGJ1bmRsZURhdGEsIHN0YXRlRGlyTmFtZSk7Ci0JCQlsb2NhbFJlcG9zaXRvcnlVUkwgPSBzdGF0ZURpci50b1VSTCgpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IFByb3Zpc2lvbkV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEFjdGl2YXRvci5JRCwgTWVzc2FnZXMuRXJyb3JDcmVhdGluZ1JlcG9zaXRvcnksIGUpKTsKLQkJfQotCQlhcnRpZmFjdFJlcG9zaXRvcnkgPSBpbml0aWFsaXplQXJ0aWZhY3RSZXBvc2l0b3J5KGNvbnRleHQsIGxvY2FsUmVwb3NpdG9yeVVSTCwgInVwZGF0ZSBzaXRlIGltcGxlbWVudGF0aW9uIC0gIiArIGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHNhdmVkQ2hlY2tzdW0gPSAoU3RyaW5nKSBhcnRpZmFjdFJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcygpLmdldChQUk9QX1NJVEVfQ0hFQ0tTVU0pOwotCQlpZiAoc2F2ZWRDaGVja3N1bSAhPSBudWxsICYmIHNhdmVkQ2hlY2tzdW0uZXF1YWxzKHVwZGF0ZVNpdGUuZ2V0Q2hlY2tzdW0oKSkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFsb2NhdGlvbi5nZXRQcm90b2NvbCgpLmVxdWFscyhQUk9UT0NPTF9GSUxFKSkKLQkJCWFydGlmYWN0UmVwb3NpdG9yeS5zZXRQcm9wZXJ0eShQUk9QX0ZPUkNFX1RIUkVBRElORywgInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlhcnRpZmFjdFJlcG9zaXRvcnkucmVtb3ZlQWxsKCk7Ci0JCWdlbmVyYXRlQXJ0aWZhY3RzKHVwZGF0ZVNpdGUpOwotCQlhcnRpZmFjdFJlcG9zaXRvcnkuc2V0UHJvcGVydHkoUFJPUF9TSVRFX0NIRUNLU1VNLCB1cGRhdGVTaXRlLmdldENoZWNrc3VtKCkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBnZW5lcmF0ZUFydGlmYWN0cyhVcGRhdGVTaXRlIHVwZGF0ZVNpdGUpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlGZWF0dXJlW10gZmVhdHVyZXMgPSB1cGRhdGVTaXRlLmxvYWRGZWF0dXJlcygpOwotCi0JCVNldCBhbGxTaXRlQXJ0aWZhY3RzID0gbmV3IEhhc2hTZXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZXNbaV07Ci0JCQlJQXJ0aWZhY3RLZXkgZmVhdHVyZUtleSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUZlYXR1cmVBcnRpZmFjdEtleShmZWF0dXJlLmdldElkKCksIGZlYXR1cmUuZ2V0VmVyc2lvbigpKTsKLQkJCUFydGlmYWN0RGVzY3JpcHRvciBmZWF0dXJlQXJ0aWZhY3REZXNjcmlwdG9yID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvcihmZWF0dXJlS2V5KTsKLQkJCVVSTCBmZWF0dXJlVVJMID0gdXBkYXRlU2l0ZS5nZXRGZWF0dXJlVVJMKGZlYXR1cmUuZ2V0SWQoKSwgZmVhdHVyZS5nZXRWZXJzaW9uKCkpOwotCQkJZmVhdHVyZUFydGlmYWN0RGVzY3JpcHRvci5zZXRSZXBvc2l0b3J5UHJvcGVydHkoUFJPUF9BUlRJRkFDVF9SRUZFUkVOQ0UsIGZlYXR1cmVVUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQlhbGxTaXRlQXJ0aWZhY3RzLmFkZChmZWF0dXJlQXJ0aWZhY3REZXNjcmlwdG9yKTsKLQotCQkJRmVhdHVyZUVudHJ5W10gZmVhdHVyZUVudHJpZXMgPSBmZWF0dXJlLmdldEVudHJpZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZmVhdHVyZUVudHJpZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlGZWF0dXJlRW50cnkgZW50cnkgPSBmZWF0dXJlRW50cmllc1tqXTsKLQkJCQlpZiAoZW50cnkuaXNQbHVnaW4oKSAmJiAhZW50cnkuaXNSZXF1aXJlcygpKSB7Ci0JCQkJCUlBcnRpZmFjdEtleSBrZXkgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVCdW5kbGVBcnRpZmFjdEtleShlbnRyeS5nZXRJZCgpLCBlbnRyeS5nZXRWZXJzaW9uKCkpOwotCQkJCQlBcnRpZmFjdERlc2NyaXB0b3IgYXJ0aWZhY3REZXNjcmlwdG9yID0gbmV3IEFydGlmYWN0RGVzY3JpcHRvcihrZXkpOwotCQkJCQlVUkwgcGx1Z2luVVJMID0gdXBkYXRlU2l0ZS5nZXRQbHVnaW5VUkwoZW50cnkpOwotCQkJCQlhcnRpZmFjdERlc2NyaXB0b3Iuc2V0UmVwb3NpdG9yeVByb3BlcnR5KFBST1BfQVJUSUZBQ1RfUkVGRVJFTkNFLCBwbHVnaW5VUkwudG9FeHRlcm5hbEZvcm0oKSk7Ci0JCQkJCWFsbFNpdGVBcnRpZmFjdHMuYWRkKGFydGlmYWN0RGVzY3JpcHRvcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSUFydGlmYWN0RGVzY3JpcHRvcltdIGRlc2NyaXB0b3JzID0gKElBcnRpZmFjdERlc2NyaXB0b3JbXSkgYWxsU2l0ZUFydGlmYWN0cy50b0FycmF5KG5ldyBJQXJ0aWZhY3REZXNjcmlwdG9yW2FsbFNpdGVBcnRpZmFjdHMuc2l6ZSgpXSk7Ci0JCWFydGlmYWN0UmVwb3NpdG9yeS5hZGREZXNjcmlwdG9ycyhkZXNjcmlwdG9ycyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlKFVSTCB1cmwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCVVwZGF0ZVNpdGUudmFsaWRhdGUodXJsLCBtb25pdG9yKTsKLQl9Ci0KLQlwcml2YXRlIElBcnRpZmFjdFJlcG9zaXRvcnkgaW5pdGlhbGl6ZUFydGlmYWN0UmVwb3NpdG9yeShCdW5kbGVDb250ZXh0IGNvbnRleHQsIFVSTCBzdGF0ZURpclVSTCwgU3RyaW5nIHJlcG9zaXRvcnlOYW1lKSB7Ci0JCVNpbXBsZUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTaW1wbGVBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5KCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS5sb2FkKHN0YXRlRGlyVVJMLCBudWxsKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQotCQl9Ci0JCS8vIFRPRE8gbWlnaHQgd2FudCB0byBwYXNzIGFsb25nIHJlcG9zaXRvcnkgcHJvcGVydGllcz8KLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlKHN0YXRlRGlyVVJMLCByZXBvc2l0b3J5TmFtZSwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gYXJ0aWZhY3RSZXBvc2l0b3J5LmdldFByb3BlcnRpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHNldFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gYXJ0aWZhY3RSZXBvc2l0b3J5LnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0b3IoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWFydGlmYWN0UmVwb3NpdG9yeS5hZGREZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotCQlyZXR1cm4gYXJ0aWZhY3RSZXBvc2l0b3J5LmNvbnRhaW5zKGRlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5jb250YWlucyhrZXkpOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIGdldEFydGlmYWN0KElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvciwgT3V0cHV0U3RyZWFtIGRlc3RpbmF0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdChkZXNjcmlwdG9yLCBkZXN0aW5hdGlvbiwgbW9uaXRvcik7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdERlc2NyaXB0b3JbXSBnZXRBcnRpZmFjdERlc2NyaXB0b3JzKElBcnRpZmFjdEtleSBrZXkpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdERlc2NyaXB0b3JzKGtleSk7Ci0JfQotCi0JcHVibGljIElBcnRpZmFjdEtleVtdIGdldEFydGlmYWN0S2V5cygpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdEtleXMoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0YXR1cyBnZXRBcnRpZmFjdHMoSUFydGlmYWN0UmVxdWVzdFtdIHJlcXVlc3RzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJcmV0dXJuIGFydGlmYWN0UmVwb3NpdG9yeS5nZXRBcnRpZmFjdHMocmVxdWVzdHMsIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKElBcnRpZmFjdERlc2NyaXB0b3IgZGVzY3JpcHRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBhcnRpZmFjdFJlcG9zaXRvcnkuZ2V0T3V0cHV0U3RyZWFtKGRlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJYXJ0aWZhY3RSZXBvc2l0b3J5LnJlbW92ZUFsbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURlc2NyaXB0b3IoSUFydGlmYWN0RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0JCWFydGlmYWN0UmVwb3NpdG9yeS5yZW1vdmVEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURlc2NyaXB0b3IoSUFydGlmYWN0S2V5IGtleSkgewotCQlhcnRpZmFjdFJlcG9zaXRvcnkucmVtb3ZlRGVzY3JpcHRvcihrZXkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERlc2NyaXB0b3JzKElBcnRpZmFjdERlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycykgewotCQlhcnRpZmFjdFJlcG9zaXRvcnkuYWRkRGVzY3JpcHRvcnMoZGVzY3JpcHRvcnMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZXNpdGUvYXJ0aWZhY3QvVXBkYXRlU2l0ZUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZXNpdGUvYXJ0aWZhY3QvVXBkYXRlU2l0ZUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYzZWNkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGVzaXRlL2FydGlmYWN0L1VwZGF0ZVNpdGVBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlLmFydGlmYWN0OwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLlByb3Zpc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgVXBkYXRlU2l0ZUFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkgaW1wbGVtZW50cyBJQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeSB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5I2NyZWF0ZShqYXZhLm5ldC5VUkwsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEudXRpbC5NYXApCi0JICovCi0JcHVibGljIElBcnRpZmFjdFJlcG9zaXRvcnkgY3JlYXRlKFVSTCBsb2NhdGlvbiwgU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBNYXAgcHJvcGVydGllcykgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5hcnRpZmFjdC5yZXBvc2l0b3J5LklBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5I2xvYWQoamF2YS5uZXQuVVJMLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSUFydGlmYWN0UmVwb3NpdG9yeSBsb2FkKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBVcGRhdGVTaXRlQXJ0aWZhY3RSZXBvc2l0b3J5KGxvY2F0aW9uLCBtb25pdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGVzaXRlL21lc3NhZ2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGVzaXRlL21lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZDczNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlc2l0ZS9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotRXJyb3JDcmVhdGluZ1JlcG9zaXRvcnk9RXJyb3Igb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgcmVwb3NpdG9yeS4KLUVycm9yUmVhZGluZ0RpZ2VzdD1FcnJvciByZWFkaW5nIHNpdGUgZGlnZXN0IHswfS4KLUVycm9yUmVhZGluZ0ZlYXR1cmU9RXJyb3IgcmVhZGluZyBmZWF0dXJlIHswfS4KLUVycm9yUmVhZGluZ1NpdGU9RXJyb3IgcmVhZGluZyB1cGRhdGUgc2l0ZSB7MH0uCi1JbnZhbGlkUmVwb3NpdG9yeUxvY2F0aW9uPUludmFsaWQgcmVwb3NpdG9yeSBsb2NhdGlvbiB7MH0uCi1QbGF0Zm9ybUFkbWluTm90UmVnaXN0ZXJlZD1QbGF0Zm9ybUFkbWluIG5vdCByZWdpc3RlcmVkLgotTWFsZm9ybWVkQXJjaGl2ZVVSTD1NYWxmb3JtZWQgVVJMIHswfSBmb3IgcGF0aCB7MX0gaW4gc2l0ZSBhdCB7Mn0uCi1pb19mYWlsZWRSZWFkPVVuYWJsZSB0byByZWFkIHJlcG9zaXRvcnkgYXQgezB9LgotcmVwb01hbl9pbnRlcm5hbEVycm9yPUludGVybmFsIGVycm9yLgotcmVwb19sb2FkaW5nID0gTG9hZGluZyB0aGUgcmVwb3NpdG9yeSB7MH0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3AyL3VwZGF0ZXNpdGUvbWV0YWRhdGEvVXBkYXRlU2l0ZU1ldGFkYXRhUmVwb3NpdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlc2l0ZS9tZXRhZGF0YS9VcGRhdGVTaXRlTWV0YWRhdGFSZXBvc2l0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyY2U5N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlc2l0ZS9tZXRhZGF0YS9VcGRhdGVTaXRlTWV0YWRhdGFSZXBvc2l0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlc2l0ZS5tZXRhZGF0YTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIuY29yZS5oZWxwZXJzLkxvZ0hlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnAyLmNvcmUuaGVscGVycy5TZXJ2aWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLmZlYXR1cmVzLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wMi51cGRhdGVzaXRlLk1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5jb3JlLmV2ZW50YnVzLklQcm92aXNpb25pbmdFdmVudEJ1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5JUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnAyLmNvcmUucmVwb3NpdG9yeS5SZXBvc2l0b3J5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JQXJ0aWZhY3RLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5JSW5zdGFsbGFibGVVbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIubWV0YWRhdGEuZ2VuZXJhdG9yLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5xdWVyeS5RdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LkFic3RyYWN0TWV0YWRhdGFSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuc3BpLnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkuU2ltcGxlTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnNlcnZpY2UucmVzb2x2ZXIuKjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVNpdGVNZXRhZGF0YVJlcG9zaXRvcnkgZXh0ZW5kcyBBYnN0cmFjdE1ldGFkYXRhUmVwb3NpdG9yeSB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFID0gIm9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS5tZXRhZGF0YVJlcG9zaXRvcnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIFZFUlNJT04gPSBuZXcgSW50ZWdlcigxKTsKLQlwcml2YXRlIGZpbmFsIElNZXRhZGF0YVJlcG9zaXRvcnkgbWV0YWRhdGFSZXBvc2l0b3J5OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX1ZFUlNJT05fU0VQQVJBVE9SID0gIl8iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfU0lURV9DSEVDS1NVTSA9ICJzaXRlLmNoZWNrc3VtIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIFVwZGF0ZVNpdGVNZXRhZGF0YVJlcG9zaXRvcnkoVVJMIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBQcm92aXNpb25FeGNlcHRpb24gewotCQlzdXBlcihBY3RpdmF0b3IuZ2V0UmVwb3NpdG9yeU5hbWUobG9jYXRpb24pLCBUWVBFLCBWRVJTSU9OLnRvU3RyaW5nKCksIGxvY2F0aW9uLCBudWxsLCBudWxsLCBudWxsKTsKLQkJLy8gdG9kbyBwcm9ncmVzcyBtb25pdG9yaW5nCi0JCS8vIGxvYWRpbmcgdmFsaWRhdGVzIGJlZm9yZSB3ZSBjcmVhdGUgcmVwb3NpdG9yaWVzCi0JCVVwZGF0ZVNpdGUgdXBkYXRlU2l0ZSA9IFVwZGF0ZVNpdGUubG9hZChsb2NhdGlvbiwgbnVsbCk7Ci0JCWJyb2FkY2FzdEFzc29jaWF0ZVNpdGVzKHVwZGF0ZVNpdGUpOwotCi0JCUJ1bmRsZUNvbnRleHQgY29udGV4dCA9IEFjdGl2YXRvci5nZXRCdW5kbGVDb250ZXh0KCk7Ci0JCVN0cmluZyBzdGF0ZURpck5hbWUgPSBJbnRlZ2VyLnRvU3RyaW5nKGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkuaGFzaENvZGUoKSk7Ci0JCUZpbGUgYnVuZGxlRGF0YSA9IGNvbnRleHQuZ2V0RGF0YUZpbGUobnVsbCk7Ci0JCUZpbGUgc3RhdGVEaXIgPSBuZXcgRmlsZShidW5kbGVEYXRhLCBzdGF0ZURpck5hbWUpOwotCQlVUkwgbG9jYWxSZXBvc2l0b3J5VVJMOwotCQl0cnkgewotCQkJbG9jYWxSZXBvc2l0b3J5VVJMID0gc3RhdGVEaXIudG9VUkwoKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHVuZXhwZWN0ZWQKLQkJCXRocm93IG5ldyBQcm92aXNpb25FeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBBY3RpdmF0b3IuSUQsIE1lc3NhZ2VzLkVycm9yQ3JlYXRpbmdSZXBvc2l0b3J5LCBlKSk7Ci0JCX0KLQotCQltZXRhZGF0YVJlcG9zaXRvcnkgPSBpbml0aWFsaXplTWV0YWRhdGFSZXBvc2l0b3J5KGNvbnRleHQsIGxvY2FsUmVwb3NpdG9yeVVSTCwgInVwZGF0ZSBzaXRlIGltcGxlbWVudGF0aW9uIC0gIiArIGxvY2F0aW9uLnRvRXh0ZXJuYWxGb3JtKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHNhdmVkQ2hlY2tzdW0gPSAoU3RyaW5nKSBtZXRhZGF0YVJlcG9zaXRvcnkuZ2V0UHJvcGVydGllcygpLmdldChQUk9QX1NJVEVfQ0hFQ0tTVU0pOwotCQlpZiAoc2F2ZWRDaGVja3N1bSAhPSBudWxsICYmIHNhdmVkQ2hlY2tzdW0uZXF1YWxzKHVwZGF0ZVNpdGUuZ2V0Q2hlY2tzdW0oKSkpCi0JCQlyZXR1cm47Ci0JCW1ldGFkYXRhUmVwb3NpdG9yeS5yZW1vdmVBbGwoKTsKLQkJZ2VuZXJhdGVNZXRhZGF0YSh1cGRhdGVTaXRlKTsKLQkJbWV0YWRhdGFSZXBvc2l0b3J5LnNldFByb3BlcnR5KFBST1BfU0lURV9DSEVDS1NVTSwgdXBkYXRlU2l0ZS5nZXRDaGVja3N1bSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBCcm9hZGNhc3QgZXZlbnRzIGZvciBhbnkgYXNzb2NpYXRlZCBzaXRlcyBmb3IgdGhpcyByZXBvc2l0b3J5IHNvIHJlcG9zaXRvcnkKLQkgKiBtYW5hZ2VycyBhcmUgYXdhcmUgb2YgdGhlbS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYnJvYWRjYXN0QXNzb2NpYXRlU2l0ZXMoVXBkYXRlU2l0ZSBiYXNlU2l0ZSkgewotCQlpZiAoYmFzZVNpdGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJVVJMRW50cnlbXSBzaXRlcyA9IGJhc2VTaXRlLmdldFNpdGUoKS5nZXRBc3NvY2lhdGVkU2l0ZXMoKTsKLQkJaWYgKHNpdGVzID09IG51bGwgfHwgc2l0ZXMubGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJSVByb3Zpc2lvbmluZ0V2ZW50QnVzIGJ1cyA9IChJUHJvdmlzaW9uaW5nRXZlbnRCdXMpIFNlcnZpY2VIZWxwZXIuZ2V0U2VydmljZShBY3RpdmF0b3IuZ2V0QnVuZGxlQ29udGV4dCgpLCBJUHJvdmlzaW9uaW5nRXZlbnRCdXMuU0VSVklDRV9OQU1FKTsKLQkJaWYgKGJ1cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCVVSTCBzaXRlTG9jYXRpb24gPSBuZXcgVVJMKHNpdGVzW2ldLmdldFVSTCgpKTsKLQkJCQlidXMucHVibGlzaEV2ZW50KG5ldyBSZXBvc2l0b3J5RXZlbnQoc2l0ZUxvY2F0aW9uLCBJUmVwb3NpdG9yeS5UWVBFX01FVEFEQVRBLCBSZXBvc2l0b3J5RXZlbnQuRElTQ09WRVJFRCwgdHJ1ZSkpOwotCQkJCWJ1cy5wdWJsaXNoRXZlbnQobmV3IFJlcG9zaXRvcnlFdmVudChzaXRlTG9jYXRpb24sIElSZXBvc2l0b3J5LlRZUEVfQVJUSUZBQ1QsIFJlcG9zaXRvcnlFdmVudC5ESVNDT1ZFUkVELCB0cnVlKSk7Ci0JCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCUxvZ0hlbHBlci5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLldBUk5JTkcsIEFjdGl2YXRvci5JRCwgIlNpdGUgaGFzIGludmFsaWQgYXNzb2NpYXRlIHNpdGU6ICIgKyBiYXNlU2l0ZS5nZXRMb2NhdGlvbigpLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlTWV0YWRhdGEoVXBkYXRlU2l0ZSB1cGRhdGVTaXRlKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJU2l0ZU1vZGVsIHNpdGVNb2RlbCA9IHVwZGF0ZVNpdGUuZ2V0U2l0ZSgpOwotCi0JCS8vIHdlIGxvYWQgdGhlIGZlYXR1cmVzIGhlcmUgdG8gZW5zdXJlIHRoYXQgYWxsIHNpdGUgZmVhdHVyZXMgYXJlIGZ1bGx5IHBvcHVsYXRlZCB3aXRoCi0JCS8vIGlkIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGJlZm9yZSBsb29raW5nIGF0IGNhdGVnb3J5IGluZm9ybWF0aW9uCi0JCUZlYXR1cmVbXSBmZWF0dXJlcyA9IHVwZGF0ZVNpdGUubG9hZEZlYXR1cmVzKCk7Ci0KLQkJU2l0ZUNhdGVnb3J5W10gc2l0ZUNhdGVnb3JpZXMgPSBzaXRlTW9kZWwuZ2V0Q2F0ZWdvcmllcygpOwotCQlNYXAgY2F0ZWdvcnlOYW1lVG9GZWF0dXJlSVVzID0gbmV3IEhhc2hNYXAoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlQ2F0ZWdvcmllcy5sZW5ndGg7IGkrKykKLQkJCWNhdGVnb3J5TmFtZVRvRmVhdHVyZUlVcy5wdXQoc2l0ZUNhdGVnb3JpZXNbaV0uZ2V0TmFtZSgpLCBuZXcgSGFzaFNldCgpKTsKLQotCQlTaXRlRmVhdHVyZVtdIHNpdGVGZWF0dXJlcyA9IHNpdGVNb2RlbC5nZXRGZWF0dXJlcygpOwotCQlNYXAgZmVhdHVyZUtleVRvQ2F0ZWdvcnlOYW1lcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l0ZUZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTaXRlRmVhdHVyZSBzaXRlRmVhdHVyZSA9IHNpdGVGZWF0dXJlc1tpXTsKLQkJCVN0cmluZyBmZWF0dXJlS2V5ID0gc2l0ZUZlYXR1cmUuZ2V0RmVhdHVyZUlkZW50aWZpZXIoKSArIEZFQVRVUkVfVkVSU0lPTl9TRVBBUkFUT1IgKyBzaXRlRmVhdHVyZS5nZXRGZWF0dXJlVmVyc2lvbigpOwotCQkJZmVhdHVyZUtleVRvQ2F0ZWdvcnlOYW1lcy5wdXQoZmVhdHVyZUtleSwgc2l0ZUZlYXR1cmUuZ2V0Q2F0ZWdvcnlOYW1lcygpKTsKLQkJfQotCi0JCVByb3BlcnRpZXMgZXh0cmFQcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJZXh0cmFQcm9wZXJ0aWVzLnB1dChJSW5zdGFsbGFibGVVbml0LlBST1BfUEFSVElBTF9JVSwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOwotCQlTZXQgYWxsU2l0ZUlVcyA9IG5ldyBIYXNoU2V0KCk7Ci0JCUJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeSBidW5kbGVEZXNjaXB0aW9uRmFjdG9yeSA9IGluaXRpYWxpemVCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkoQWN0aXZhdG9yLmdldEJ1bmRsZUNvbnRleHQoKSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykgewotCQkJRmVhdHVyZSBmZWF0dXJlID0gZmVhdHVyZXNbaV07Ci0JCQlGZWF0dXJlRW50cnlbXSBmZWF0dXJlRW50cmllcyA9IGZlYXR1cmUuZ2V0RW50cmllcygpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBmZWF0dXJlRW50cmllcy5sZW5ndGg7IGorKykgewotCQkJCUZlYXR1cmVFbnRyeSBlbnRyeSA9IGZlYXR1cmVFbnRyaWVzW2pdOwotCQkJCWlmIChlbnRyeS5pc1BsdWdpbigpICYmICFlbnRyeS5pc1JlcXVpcmVzKCkpIHsKLQkJCQkJRGljdGlvbmFyeSBtb2NrTWFuaWZlc3QgPSBuZXcgUHJvcGVydGllcygpOwotCQkJCQltb2NrTWFuaWZlc3QucHV0KCJNYW5pZmVzdC1WZXJzaW9uIiwgIjEuMCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJbW9ja01hbmlmZXN0LnB1dCgiQnVuZGxlLU1hbmlmZXN0VmVyc2lvbiIsICIyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQltb2NrTWFuaWZlc3QucHV0KCJCdW5kbGUtU3ltYm9saWNOYW1lIiwgZW50cnkuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbW9ja01hbmlmZXN0LnB1dCgiQnVuZGxlLVZlcnNpb24iLCBlbnRyeS5nZXRWZXJzaW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCUJ1bmRsZURlc2NyaXB0aW9uIGJ1bmRsZURlc2NyaXB0aW9uID0gYnVuZGxlRGVzY2lwdGlvbkZhY3RvcnkuZ2V0QnVuZGxlRGVzY3JpcHRpb24obW9ja01hbmlmZXN0LCBudWxsKTsKLQkJCQkJSUFydGlmYWN0S2V5IGtleSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUJ1bmRsZUFydGlmYWN0S2V5KGVudHJ5LmdldElkKCksIGVudHJ5LmdldFZlcnNpb24oKSk7Ci0JCQkJCUlJbnN0YWxsYWJsZVVuaXRbXSBidW5kbGVJVXMgPSBNZXRhZGF0YUdlbmVyYXRvckhlbHBlci5jcmVhdGVFY2xpcHNlSVUoYnVuZGxlRGVzY3JpcHRpb24sIG51bGwsIGVudHJ5LmlzVW5wYWNrKCksIGtleSwgZXh0cmFQcm9wZXJ0aWVzKTsKLQkJCQkJZm9yIChpbnQgbiA9IDA7IG4gPCBidW5kbGVJVXMubGVuZ3RoOyBuKyspIHsKLQkJCQkJCWFsbFNpdGVJVXMuYWRkKGJ1bmRsZUlVc1tuXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCUlJbnN0YWxsYWJsZVVuaXQgZmVhdHVyZUlVID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlRmVhdHVyZUphcklVKGZlYXR1cmUsIHRydWUpOwotCQkJSUluc3RhbGxhYmxlVW5pdCBncm91cElVID0gTWV0YWRhdGFHZW5lcmF0b3JIZWxwZXIuY3JlYXRlR3JvdXBJVShmZWF0dXJlLCBmZWF0dXJlSVUpOwotCi0JCQlTdHJpbmcgZmVhdHVyZUtleSA9IGZlYXR1cmUuZ2V0SWQoKSArIEZFQVRVUkVfVkVSU0lPTl9TRVBBUkFUT1IgKyBmZWF0dXJlLmdldFZlcnNpb24oKTsKLQkJCVN0cmluZ1tdIGNhdGVnb3J5TmFtZXMgPSAoU3RyaW5nW10pIGZlYXR1cmVLZXlUb0NhdGVnb3J5TmFtZXMuZ2V0KGZlYXR1cmVLZXkpOwotCQkJaWYgKGNhdGVnb3J5TmFtZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgY2F0ZWdvcnlOYW1lcy5sZW5ndGg7IGorKykgewotCQkJCQlTZXQgZmVhdHVyZUlVTGlzdCA9IChTZXQpIGNhdGVnb3J5TmFtZVRvRmVhdHVyZUlVcy5nZXQoY2F0ZWdvcnlOYW1lc1tqXSk7Ci0JCQkJCWlmIChmZWF0dXJlSVVMaXN0ICE9IG51bGwpIHsKLQkJCQkJCWZlYXR1cmVJVUxpc3QuYWRkKGdyb3VwSVUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYWxsU2l0ZUlVcy5hZGQoZmVhdHVyZUlVKTsKLQkJCWFsbFNpdGVJVXMuYWRkKGdyb3VwSVUpOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXRlQ2F0ZWdvcmllcy5sZW5ndGg7IGkrKykgewotCQkJU2l0ZUNhdGVnb3J5IGNhdGVnb3J5ID0gc2l0ZUNhdGVnb3JpZXNbaV07Ci0JCQlTZXQgZmVhdHVyZUlVcyA9IChTZXQpIGNhdGVnb3J5TmFtZVRvRmVhdHVyZUlVcy5nZXQoY2F0ZWdvcnkuZ2V0TmFtZSgpKTsKLQkJCUlJbnN0YWxsYWJsZVVuaXQgY2F0ZWdvcnlJVSA9IE1ldGFkYXRhR2VuZXJhdG9ySGVscGVyLmNyZWF0ZUNhdGVnb3J5SVUoY2F0ZWdvcnksIGZlYXR1cmVJVXMsIG51bGwpOwotCQkJYWxsU2l0ZUlVcy5hZGQoY2F0ZWdvcnlJVSk7Ci0JCX0KLQotCQlJSW5zdGFsbGFibGVVbml0W10gaXVzID0gKElJbnN0YWxsYWJsZVVuaXRbXSkgYWxsU2l0ZUlVcy50b0FycmF5KG5ldyBJSW5zdGFsbGFibGVVbml0W2FsbFNpdGVJVXMuc2l6ZSgpXSk7Ci0JCW1ldGFkYXRhUmVwb3NpdG9yeS5hZGRJbnN0YWxsYWJsZVVuaXRzKGl1cyk7Ci0JfQotCi0JLyoobm9uLUphdmFkb2MpCi0JICogQHNlZSBJTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSN2YWxpZGF0ZShVUkwsIElQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlKFVSTCB1cmwsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIFByb3Zpc2lvbkV4Y2VwdGlvbiB7Ci0JCVVwZGF0ZVNpdGUudmFsaWRhdGUodXJsLCBtb25pdG9yKTsKLQl9Ci0KLQlwcml2YXRlIElNZXRhZGF0YVJlcG9zaXRvcnkgaW5pdGlhbGl6ZU1ldGFkYXRhUmVwb3NpdG9yeShCdW5kbGVDb250ZXh0IGNvbnRleHQsIFVSTCBzdGF0ZURpclVSTCwgU3RyaW5nIHJlcG9zaXRvcnlOYW1lKSB7Ci0JCVNpbXBsZU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTaW1wbGVNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5KCk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZmFjdG9yeS5sb2FkKHN0YXRlRGlyVVJMLCBudWxsKTsKLQkJfSBjYXRjaCAoUHJvdmlzaW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vZmFsbCB0aHJvdWdoIGFuZCBjcmVhdGUgYSBuZXcgcmVwb3NpdG9yeQotCQl9Ci0JCS8vIFRPRE8gbWlnaHQgd2FudCB0byBwYXNzIGFsb25nIHJlcG9zaXRvcnkgcHJvcGVydGllcz8KLQkJcmV0dXJuIGZhY3RvcnkuY3JlYXRlKHN0YXRlRGlyVVJMLCByZXBvc2l0b3J5TmFtZSwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHJpdmF0ZSBCdW5kbGVEZXNjcmlwdGlvbkZhY3RvcnkgaW5pdGlhbGl6ZUJ1bmRsZURlc2NyaXB0aW9uRmFjdG9yeShCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLQkJU2VydmljZVJlZmVyZW5jZSByZWZlcmVuY2UgPSBjb250ZXh0LmdldFNlcnZpY2VSZWZlcmVuY2UoUGxhdGZvcm1BZG1pbi5jbGFzcy5nZXROYW1lKCkpOwotCQlpZiAocmVmZXJlbmNlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1lc3NhZ2VzLlBsYXRmb3JtQWRtaW5Ob3RSZWdpc3RlcmVkKTsKLQkJUGxhdGZvcm1BZG1pbiBwbGF0Zm9ybUFkbWluID0gKFBsYXRmb3JtQWRtaW4pIGNvbnRleHQuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQlpZiAocGxhdGZvcm1BZG1pbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNZXNzYWdlcy5QbGF0Zm9ybUFkbWluTm90UmVnaXN0ZXJlZCk7Ci0KLQkJdHJ5IHsKLQkJCVN0YXRlT2JqZWN0RmFjdG9yeSBzdGF0ZU9iamVjdEZhY3RvcnkgPSBwbGF0Zm9ybUFkbWluLmdldEZhY3RvcnkoKTsKLQkJCXJldHVybiBuZXcgQnVuZGxlRGVzY3JpcHRpb25GYWN0b3J5KHN0YXRlT2JqZWN0RmFjdG9yeSwgbnVsbCk7Ci0JCX0gZmluYWxseSB7Ci0JCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWZlcmVuY2UpOwotCQl9Ci0JfQotCi0JcHVibGljIE1hcCBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gbWV0YWRhdGFSZXBvc2l0b3J5LmdldFByb3BlcnRpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHNldFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgewotCQlyZXR1cm4gbWV0YWRhdGFSZXBvc2l0b3J5LnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCX0KLQotCXB1YmxpYyBDb2xsZWN0b3IgcXVlcnkoUXVlcnkgcXVlcnksIENvbGxlY3RvciBjb2xsZWN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlyZXR1cm4gbWV0YWRhdGFSZXBvc2l0b3J5LnF1ZXJ5KHF1ZXJ5LCBjb2xsZWN0b3IsIG1vbml0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbCgpIHsKLQkJbWV0YWRhdGFSZXBvc2l0b3J5LnJlbW92ZUFsbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEluc3RhbGxhYmxlVW5pdHMoSUluc3RhbGxhYmxlVW5pdFtdIGluc3RhbGxhYmxlVW5pdHMpIHsKLQkJbWV0YWRhdGFSZXBvc2l0b3J5LmFkZEluc3RhbGxhYmxlVW5pdHMoaW5zdGFsbGFibGVVbml0cyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlSW5zdGFsbGFibGVVbml0cyhRdWVyeSBxdWVyeSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCXJldHVybiBtZXRhZGF0YVJlcG9zaXRvcnkucmVtb3ZlSW5zdGFsbGFibGVVbml0cyhxdWVyeSwgbW9uaXRvcik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShSZXBvc2l0b3J5U3RhdGUgc3RhdGUpIHsKLQkJLy9ub3RoaW5nIHRvIGRvCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGVzaXRlL21ldGFkYXRhL1VwZGF0ZVNpdGVNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZS9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wMi91cGRhdGVzaXRlL21ldGFkYXRhL1VwZGF0ZVNpdGVNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZGQzMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUvc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcDIvdXBkYXRlc2l0ZS9tZXRhZGF0YS9VcGRhdGVTaXRlTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucDIudXBkYXRlc2l0ZS5tZXRhZGF0YTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwucDIuY29yZS5Qcm92aXNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeTsKLQotcHVibGljIGNsYXNzIFVwZGF0ZVNpdGVNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5IGltcGxlbWVudHMgSU1ldGFkYXRhUmVwb3NpdG9yeUZhY3RvcnkgewotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5zcGkucDIubWV0YWRhdGEucmVwb3NpdG9yeS5JTWV0YWRhdGFSZXBvc2l0b3J5RmFjdG9yeSNjcmVhdGUoamF2YS5uZXQuVVJMLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLnV0aWwuTWFwKQotCSAqLwotCXB1YmxpYyBJTWV0YWRhdGFSZXBvc2l0b3J5IGNyZWF0ZShVUkwgbG9jYXRpb24sIFN0cmluZyBuYW1lLCBTdHJpbmcgdHlwZSwgTWFwIHByb3BlcnRpZXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5I3ZhbGlkYXRlKGphdmEubmV0LlVSTCwgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0KLQlwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZShVUkwgbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJVXBkYXRlU2l0ZU1ldGFkYXRhUmVwb3NpdG9yeS52YWxpZGF0ZShsb2NhdGlvbiwgbW9uaXRvcik7Ci0JCX0gY2F0Y2ggKFByb3Zpc2lvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJfQotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLnNwaS5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5LklNZXRhZGF0YVJlcG9zaXRvcnlGYWN0b3J5I2xvYWQoamF2YS5uZXQuVVJMLCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgSU1ldGFkYXRhUmVwb3NpdG9yeSBsb2FkKFVSTCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgUHJvdmlzaW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBVcGRhdGVTaXRlTWV0YWRhdGFSZXBvc2l0b3J5KGxvY2F0aW9uLCBtb25pdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMGM3YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0NEQy0xLjAlRm91bmRhdGlvbi0xLjAiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTA3N2E0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJpbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNjU3Y2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjRkNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotI1dlZCBKYW4gMjMgMTA6MDA6MzMgRVNUIDIwMDgKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWduX3R5cGVfbWVtYmVyc19vbl9jb2x1bW5zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudD0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2V4cGxpY2l0X2NvbnN0cnVjdG9yX2NhbGw9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQ9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYmluYXJ5X2V4cHJlc3Npb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbXBhY3RfaWY9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb249ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2V4cHJlc3Npb25zX2luX2FycmF5X2luaXRpYWxpemVyPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9tdWx0aXBsZV9maWVsZHM9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJjbGFzc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fZW51bV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX3R5cGVfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3Rocm93c19jbGF1c2VfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfaW1wb3J0cz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYWZ0ZXJfcGFja2FnZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpZWxkPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfZmlyc3RfY2xhc3NfYm9keV9kZWNsYXJhdGlvbj0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZD0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX25ld19jaHVuaz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX3BhY2thZ2U9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5faW1wb3J0X2dyb3Vwcz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl90eXBlX2RlY2xhcmF0aW9ucz0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm9ueW1vdXNfdHlwZV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jaz1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9ja19pbl9jYXNlPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fY29uc3RhbnQ9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfZW51bV9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9tZXRob2RfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3Jfc3dpdGNoPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2Jsb2NrX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmNsZWFyX2JsYW5rX2xpbmVzX2luX2phdmFkb2NfY29tbWVudD1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2Jsb2NrX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9odG1sPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9qYXZhZG9jX2NvbW1lbnRzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb249ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9yb290X3RhZ3M9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9yb290X3RhZ3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbnNlcnRfbmV3X2xpbmVfZm9yX3BhcmFtZXRlcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5saW5lX2xlbmd0aD04MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbXBhY3RfZWxzZV9pZj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb250aW51YXRpb25faW5kZW50YXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyPTIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5mb3JtYXRfZ3VhcmRpYW5fY2xhdXNlX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2RlY2xhcmF0aW9uX2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9icmVha3NfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2VtcHR5X2xpbmVzPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ibG9jaz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N0YXRlbWVudHNfY29tcGFyZV90b19ib2R5PXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX3N3aXRjaD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50YXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfY2xvc2luZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9lbHNlX2luX2lmX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9maW5hbGx5X2luX3RyeV9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfd2hpbGVfaW5fZG9fc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5ub3RhdGlvbl9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9jb25zdGFudD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfZW51bV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHk9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Fzc2VydD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYW5ub3RhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9leHBsaWNpdGNvbnN0cnVjdG9yY2FsbF9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5pdHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYW5kX2luX3R5cGVfcGFyYW1ldGVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYXNzaWdubWVudF9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2JpbmFyeV9vcGVyYXRvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Nhc3Q9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2lmPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9jYXNlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWw9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYWxsb2NhdGlvbl9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZW51bV9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbmNyZW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9lbGxpcHNpcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2g9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5faWY9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcGFyZW50aGVzaXplZF9leHByZXNzaW9uX2luX3JldHVybj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl90aHJvdz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3Bvc3RmaXhfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcHJlZml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcXVlc3Rpb25faW5fd2lsZGNhcmQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfc2VtaWNvbG9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfdW5hcnlfb3BlcmF0b3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2JyYWNrZXRzX2luX2FycmF5X3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X2JyYWNrZXRzX2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2Fubm90YXRpb25fdHlwZV9tZW1iZXJfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfcGFyZW5zX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbHNlX3N0YXRlbWVudF9vbl9zYW1lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX2VtcHR5X2FycmF5X2luaXRpYWxpemVyX29uX29uZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9pbXBsZV9pZl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0PTgwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9ibG9ja19jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm5ldmVyX2luZGVudF9saW5lX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2JsYW5rX2xpbmVzX2F0X2JlZ2lubmluZ19vZl9tZXRob2RfYm9keT0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5wdXRfZW1wdHlfc3RhdGVtZW50X29uX25ld19saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyPXRhYgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZT00Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudXNlX3RhYnNfb25seV9mb3JfbGVhZGluZ19pbmRlbnRhdGlvbnM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU4NGQ0NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jU3VuIFNlcCAyMyAxMTo1OTo0OCBFRFQgMjAwNwotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVkaXRvcl9zYXZlX3BhcnRpY2lwYW50X29yZy5lY2xpcHNlLmpkdC51aS5wb3N0c2F2ZWxpc3RlbmVyLmNsZWFudXA9dHJ1ZQotZm9ybWF0dGVyX3Byb2ZpbGU9X2NvcmUKLWZvcm1hdHRlcl9zZXR0aW5nc192ZXJzaW9uPTExCi1vcmcuZWNsaXBzZS5qZHQudWkuaWdub3JlbG93ZXJjYXNlbmFtZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LnVpLmltcG9ydG9yZGVyPTsKLW9yZy5lY2xpcHNlLmpkdC51aS5vbmRlbWFuZHRocmVzaG9sZD0zCi1vcmcuZWNsaXBzZS5qZHQudWkuc3RhdGljb25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiIHN0YW5kYWxvbmVcPSJubyI/Pjx0ZW1wbGF0ZXMvPgotc3BfY2xlYW51cC5hZGRfZGVmYXVsdF9zZXJpYWxfdmVyc2lvbl9pZD10cnVlCi1zcF9jbGVhbnVwLmFkZF9nZW5lcmF0ZWRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfbWlzc2luZ19kZXByZWNhdGVkX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAuYWRkX21pc3Npbmdfb3ZlcnJpZGVfYW5ub3RhdGlvbnM9dHJ1ZQotc3BfY2xlYW51cC5hZGRfc2VyaWFsX3ZlcnNpb25faWQ9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9ibG9ja3M9dHJ1ZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3BhcmVudGhlc2VzX2luX2V4cHJlc3Npb25zPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAuY29udmVydF90b19lbmhhbmNlZF9mb3JfbG9vcD1mYWxzZQotc3BfY2xlYW51cC5mb3JtYXRfc291cmNlX2NvZGU9dHJ1ZQotc3BfY2xlYW51cC5tYWtlX2xvY2FsX3ZhcmlhYmxlX2ZpbmFsPWZhbHNlCi1zcF9jbGVhbnVwLm1ha2VfcGFyYW1ldGVyc19maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3ByaXZhdGVfZmllbGRzX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubWFrZV92YXJpYWJsZV9kZWNsYXJhdGlvbnNfZmluYWw9dHJ1ZQotc3BfY2xlYW51cC5uZXZlcl91c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLm5ldmVyX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz10cnVlCi1zcF9jbGVhbnVwLm9uX3NhdmVfdXNlX2FkZGl0aW9uYWxfYWN0aW9ucz1mYWxzZQotc3BfY2xlYW51cC5vcmdhbml6ZV9pbXBvcnRzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfZmllbGRfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfaW5zdGFuY2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3Rocm91Z2hfc3VidHlwZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9dHJ1ZQotc3BfY2xlYW51cC5xdWFsaWZ5X3N0YXRpY19tZW1iZXJfYWNjZXNzZXNfd2l0aF9kZWNsYXJpbmdfY2xhc3M9ZmFsc2UKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWV0aG9kX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV9wcml2YXRlX2NvbnN0cnVjdG9ycz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXNfYWxsPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2lnbm9yZV9lbXB0eT1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfY2FzdHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW5uZWNlc3NhcnlfbmxzX3RhZ3M9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9pbXBvcnRzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfbG9jYWxfdmFyaWFibGVzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV9maWVsZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfbWV0aG9kcz10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfcHJpdmF0ZV90eXBlcz10cnVlCi1zcF9jbGVhbnVwLnNvcnRfbWVtYmVycz1mYWxzZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnNfYWxsPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX2Jsb2Nrc19vbmx5X2Zvcl9yZXR1cm5fYW5kX3Rocm93PWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19maWVsZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzcz1mYWxzZQotc3BfY2xlYW51cC51c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzX29ubHlfaWZfbmVjZXNzYXJ5PXRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWFmZTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3I7c2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjAucXVhbGlmaWVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yLkFjdGl2YXRvcgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKLUltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3gsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5mcmFtZXdvcmthZG1pbi51dGlscywKLSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yLAotIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuZnJhbWV3b3JrYWRtaW4sCi0gb3JnLm9zZ2kuZnJhbWV3b3JrO3ZlcnNpb249IjEuMy4wIiwKLSBvcmcub3NnaS5zZXJ2aWNlLnBhY2thZ2VhZG1pbjt2ZXJzaW9uPSIxLjIuMCIsCi0gb3JnLm9zZ2kuc2VydmljZS5zdGFydGxldmVsO3ZlcnNpb249IjEuMC4wIiwKLSBvcmcub3NnaS51dGlsLnRyYWNrZXIKLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSIsCi0gb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IudXRpbHM7eC1pbnRlcm5hbDo9dHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IENEQy0xLjAvRm91bmRhdGlvbi0xLjAsCi0gSjJTRS0xLjQKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iMy40LjAiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM3MmU1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotcXVhbGlmaWVyPWNvbnRleHQKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmFmYmRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1idW5kbGVOYW1lPSBTaW1wbGUgQ29uZmlndXJhdG9yIE1hbmlwdWxhdG9yCi1wcm92aWRlck5hbWU9IEVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL21hbmlwdWxhdG9yL0FjdGl2YXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvbWFuaXB1bGF0b3IvQWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MTAyN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvbWFuaXB1bGF0b3IvQWN0aXZhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9ybWFuaXB1bGF0b3IuQ29uZmlndXJhdG9yTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IudXRpbHMuU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnV0aWwudHJhY2tlci5TZXJ2aWNlVHJhY2tlcjsKLQotcHVibGljIGNsYXNzIEFjdGl2YXRvciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciB7Ci0JZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUcgPSB0cnVlOwotCXByaXZhdGUgc3RhdGljIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQlwcml2YXRlIHN0YXRpYyBTZXJ2aWNlVHJhY2tlciBpbnN0YWxsTG9jYXRpb25UcmFja2VyOwotCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb247Ci0JU2ltcGxlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JJbXBsIG1hbmlwdWxhdG9yID0gbnVsbDsKLQotCXN0YXRpYyBCdW5kbGVDb250ZXh0IGdldENvbnRleHQoKSB7Ci0JCXJldHVybiBjb250ZXh0OwotCX0KLQotCXByaXZhdGUgdm9pZCByZWdpc3RlckNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yKCkgewotCQlEaWN0aW9uYXJ5IHByb3BzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlwcm9wcy5wdXQoQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IuU0VSVklDRV9QUk9QX0tFWV9DT05GSUdVUkFUT1JfQlVORExFU1lNQk9MSUNOQU1FLCBTaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMuU0VSVklDRV9QUk9QX1ZBTFVFX0NPTkZJR1VSQVRPUl9TWU1CT0xJQ05BTUUpOwotCQlwcm9wcy5wdXQoQ29uc3RhbnRzLlNFUlZJQ0VfVkVORE9SLCAiRWNsaXBzZS5vcmciKTsKLQkJbWFuaXB1bGF0b3IgPSBuZXcgU2ltcGxlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JJbXBsKCk7Ci0JCXJlZ2lzdHJhdGlvbiA9IGNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yLmNsYXNzLmdldE5hbWUoKSwgbWFuaXB1bGF0b3IsIHByb3BzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlBY3RpdmF0b3IuY29udGV4dCA9IGJ1bmRsZUNvbnRleHQ7Ci0JCXRoaXMucmVnaXN0ZXJDb25maWd1cmF0b3JNYW5pcHVsYXRvcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKHJlZ2lzdHJhdGlvbiAhPSBudWxsKQotCQkJcmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLQkJaWYgKGluc3RhbGxMb2NhdGlvblRyYWNrZXIgIT0gbnVsbCkgewotCQkJaW5zdGFsbExvY2F0aW9uVHJhY2tlci5jbG9zZSgpOwotCQkJaW5zdGFsbExvY2F0aW9uVHJhY2tlciA9IG51bGw7Ci0JCX0KLQkJQWN0aXZhdG9yLmNvbnRleHQgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL21hbmlwdWxhdG9yL1NpbXBsZUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL21hbmlwdWxhdG9yL1NpbXBsZUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgxOWFhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9tYW5pcHVsYXRvci9TaW1wbGVDb25maWd1cmF0b3JNYW5pcHVsYXRvckZhY3RvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcm1hbmlwdWxhdG9yLkNvbmZpZ3VyYXRvck1hbmlwdWxhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9ybWFuaXB1bGF0b3IuQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JGYWN0b3J5SW1wbCBleHRlbmRzIENvbmZpZ3VyYXRvck1hbmlwdWxhdG9yRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IgY3JlYXRlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IoKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JJbXBsKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9tYW5pcHVsYXRvci9TaW1wbGVDb25maWd1cmF0b3JNYW5pcHVsYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL21hbmlwdWxhdG9yL1NpbXBsZUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTM2OTg3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL21hbmlwdWxhdG9yL1NpbXBsZUNvbmZpZ3VyYXRvck1hbmlwdWxhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLmVxdWlub3guRXF1aW5veEZ3Q29uZmlnRmlsZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLnV0aWxzLlV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwucHJvdmlzaW9uYWwuY29uZmlndXJhdG9ybWFuaXB1bGF0b3IuQ29uZmlndXJhdG9yTWFuaXB1bGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5mcmFtZXdvcmthZG1pbi4qOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLnV0aWxzLlNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29uZmlndXJhdG9yTWFuaXB1bGF0b3JJbXBsIGltcGxlbWVudHMgQ29uZmlndXJhdG9yTWFuaXB1bGF0b3IgewotCWNsYXNzIExvY2F0aW9uSW5mbyB7Ci0JCVN0cmluZ1tdIHByZXJlcXVpc2l0ZUxvY2F0aW9ucyA9IG51bGw7Ci0JCVN0cmluZyBzeXN0ZW1CdW5kbGVMb2NhdGlvbiA9IG51bGw7Ci0JCVN0cmluZ1tdIHN5c3RlbUZyYWdtZW50ZWRCdW5kbGVMb2NhdGlvbnMgPSBudWxsOwotCX0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotCXN0YXRpYyBTdHJpbmcgQ09ORklHX0xPQ0FUSU9OID0gU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLkNPTkZJR19MSVNUOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MID0gImZpbGU6IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnVuZGxlSW5mb1tdIE5VTExfQlVORExFSU5GT1MgPSBuZXcgQnVuZGxlSW5mb1swXTsKLQotCXByaXZhdGUgU2V0IG1hbmlwdWxhdG9ycyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkvKioJCi0JICogUmV0dXJuIHRoZSBDb25maWd1cmF0b3JDb25maWdMb2NhdGlvbiB3aGljaCBpcyBkZXRlcm1pbmVkIAotCSAqIGJ5IHRoZSBwYXJhbWV0ZXJzIHNldCBpbiBNYW5pcHVsYXRvci4gCi0JICogCi0JICogQHBhcmFtIG1hbmlwdWxhdG9yCi0JICogQHJldHVybiBVUkwKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBVUkwgZ2V0Q29uZmlnTG9jYXRpb24oTWFuaXB1bGF0b3IgbWFuaXB1bGF0b3IpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlGaWxlIGZ3Q29uZmlnTG9jID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkuZ2V0RndDb25maWdMb2NhdGlvbigpOwotCQlGaWxlIGJhc2VEaXIgPSBudWxsOwotCQlpZiAoZndDb25maWdMb2MgPT0gbnVsbCkgewotCQkJYmFzZURpciA9IG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpLmdldEhvbWUoKTsKLQkJCWlmIChiYXNlRGlyID09IG51bGwpIHsKLQkJCQlpZiAobWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkuZ2V0TGF1bmNoZXIoKSAhPSBudWxsKSB7Ci0JCQkJCWJhc2VEaXIgPSBtYW5pcHVsYXRvci5nZXRMYXVuY2hlckRhdGEoKS5nZXRMYXVuY2hlcigpLmdldFBhcmVudEZpbGUoKTsKLQkJCQl9IGVsc2UgewotCQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJBbGwgb2YgZndDb25maWdGaWxlLCBob21lLCBsYXVuY2hlciBhcmUgbm90IHNldC4iKTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoZndDb25maWdMb2MuZXhpc3RzKCkpCi0JCQkJaWYgKGZ3Q29uZmlnTG9jLmlzRGlyZWN0b3J5KCkpCi0JCQkJCWJhc2VEaXIgPSBmd0NvbmZpZ0xvYzsKLQkJCQllbHNlCi0JCQkJCWJhc2VEaXIgPSBmd0NvbmZpZ0xvYy5nZXRQYXJlbnRGaWxlKCk7Ci0JCQllbHNlIHsKLQkJCQkvLyBUT0RPIFdlIG5lZWQgdG8gZGVjaWRlIHdoZXRoZXIgbGF1bmNoZXIgZGF0YSBjb25maWdMb2NhdGlvbiBpcyB0aGUgbG9jYXRpb24gb2YgYSBmaWxlIG9yIGEgZGlyZWN0b3J5IAotCQkJCWlmIChmd0NvbmZpZ0xvYy5nZXROYW1lKCkuZW5kc1dpdGgoIi5pbmkiKSkKLQkJCQkJYmFzZURpciA9IGZ3Q29uZmlnTG9jLmdldFBhcmVudEZpbGUoKTsKLQkJCQllbHNlCi0JCQkJCWJhc2VEaXIgPSBmd0NvbmZpZ0xvYzsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJYmFzZURpciA9IG5ldyBGaWxlKGJhc2VEaXIsIFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5DT05GSUdVUkFUT1JfRk9MREVSKTsKLQkJCUZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGJhc2VEaXIsIFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5DT05GSUdfTElTVCk7Ci0JCQl0cnkgewotCQkJCVV0aWxzLmNyZWF0ZVBhcmVudERpcih0YXJnZXRGaWxlKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCXJldHVybiB0YXJnZXRGaWxlLnRvVVJMKCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBOZXZlciBoYXBwZW4uIGlnbm9yZS4KLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotCi0Jc3RhdGljIGJvb2xlYW4gaXNQcmVyZXF1aXNpdGVCdW5kbGVzKFN0cmluZyBsb2NhdGlvbiwgTG9jYXRpb25JbmZvIGluZm8pIHsKLQkJYm9vbGVhbiByZXQgPSBmYWxzZTsKLQotCQlpZiAoaW5mby5wcmVyZXF1aXNpdGVMb2NhdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvLnByZXJlcXVpc2l0ZUxvY2F0aW9ucy5sZW5ndGg7IGkrKykKLQkJCWlmIChsb2NhdGlvbi5lcXVhbHMoaW5mby5wcmVyZXF1aXNpdGVMb2NhdGlvbnNbaV0pKSB7Ci0JCQkJcmV0ID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXN0YXRpYyBib29sZWFuIGlzU3lzdGVtQnVuZGxlKFN0cmluZyBsb2NhdGlvbiwgTG9jYXRpb25JbmZvIGluZm8pIHsKLQkJaWYgKGluZm8uc3lzdGVtQnVuZGxlTG9jYXRpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGxvY2F0aW9uLmVxdWFscyhpbmZvLnN5c3RlbUJ1bmRsZUxvY2F0aW9uKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gaXNTeXN0ZW1GcmFnbWVudEJ1bmRsZShTdHJpbmcgbG9jYXRpb24sIExvY2F0aW9uSW5mbyBpbmZvKSB7Ci0JCWJvb2xlYW4gcmV0ID0gZmFsc2U7Ci0JCWlmIChpbmZvLnN5c3RlbUZyYWdtZW50ZWRCdW5kbGVMb2NhdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvLnN5c3RlbUZyYWdtZW50ZWRCdW5kbGVMb2NhdGlvbnMubGVuZ3RoOyBpKyspCi0JCQlpZiAobG9jYXRpb24uZXF1YWxzKGluZm8uc3lzdGVtRnJhZ21lbnRlZEJ1bmRsZUxvY2F0aW9uc1tpXSkpIHsKLQkJCQlyZXQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYXJnZXRDb25maWd1cmF0b3JCdW5kbGUoQnVuZGxlSW5mb1tdIGJJbmZvcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGJJbmZvcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGlzVGFyZ2V0Q29uZmlndXJhdG9yQnVuZGxlKGJJbmZvc1tpXS5nZXRMb2NhdGlvbigpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJCS8vVE9ETyBjb25maXJtIHRoYXQgc3RhcnRsZXZlbCBvZiBjb25maWd1cmF0b3IgYnVuZGxlIG11c3QgYmUgbm8gbGFyZ2VyIHRoYW4gYmVnaW5uaW5nIHN0YXJ0IGxldmVsIG9mIGZ3LiBIb3dldmVyLCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB0aGUgc3RhcnQgbGV2ZWwgb2YgY2FjaGVkIG9uZXMuCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYXJnZXRDb25maWd1cmF0b3JCdW5kbGUoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCWZpbmFsIFN0cmluZyBzeW1ib2xpYyA9IFV0aWxzLmdldFBhdGhGcm9tQ2xhdXNlKFV0aWxzLmdldE1hbmlmZXN0TWFpbkF0dHJpYnV0ZXMobG9jYXRpb24sIENvbnN0YW50cy5CVU5ETEVfU1lNQk9MSUNOQU1FKSk7Ci0JCXJldHVybiAoU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLlNFUlZJQ0VfUFJPUF9WQUxVRV9DT05GSUdVUkFUT1JfU1lNQk9MSUNOQU1FLmVxdWFscyhzeW1ib2xpYykpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhbGdvcml0aG0oaW50IGluaXRpYWxTbCwgU29ydGVkTWFwIGJzbFRvTGlzdCwgQnVuZGxlSW5mbyBjb25maWd1cmF0b3JCSW5mbywgTGlzdCBzZXRUb0luaXRpYWxDb25maWcsIExpc3Qgc2V0VG9TaW1wbGVDb25maWcsIExvY2F0aW9uSW5mbyBpbmZvKSB7Ci0JCWludCBjb25maWd1cmF0b3JTTCA9IGNvbmZpZ3VyYXRvckJJbmZvLmdldFN0YXJ0TGV2ZWwoKTsKLQotCQlJbnRlZ2VyIHNMMCA9IChJbnRlZ2VyKSBic2xUb0xpc3Qua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ly8gU3RhcnRMZXZlbCA9PSAwOwotCQlMaXN0IGxpc3QwID0gKExpc3QpIGJzbFRvTGlzdC5nZXQoc0wwKTsKLQkJaWYgKHNMMC5pbnRWYWx1ZSgpID09IDApCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZTIgPSBsaXN0MC5pdGVyYXRvcigpOyBpdGUyLmhhc05leHQoKTspIHsKLQkJCQlCdW5kbGVJbmZvIGJJbmZvID0gKEJ1bmRsZUluZm8pIGl0ZTIubmV4dCgpOwotCQkJCWlmIChpc1N5c3RlbUJ1bmRsZShiSW5mby5nZXRMb2NhdGlvbigpLCBpbmZvKSkgewotCQkJCQlzZXRUb1NpbXBsZUNvbmZpZy5hZGQoYkluZm8pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGUgPSBic2xUb0xpc3Qua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlLmhhc05leHQoKTspIHsKLQkJCUludGVnZXIgc0wgPSAoSW50ZWdlcikgaXRlLm5leHQoKTsKLQkJCUxpc3QgbGlzdCA9IChMaXN0KSBic2xUb0xpc3QuZ2V0KHNMKTsKLQotCQkJaWYgKHNMLmludFZhbHVlKCkgPCBjb25maWd1cmF0b3JTTCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlMiA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlMi5oYXNOZXh0KCk7KSB7Ci0JCQkJCUJ1bmRsZUluZm8gYkluZm8gPSAoQnVuZGxlSW5mbykgaXRlMi5uZXh0KCk7Ci0JCQkJCWlmICghaXNTeXN0ZW1CdW5kbGUoYkluZm8uZ2V0TG9jYXRpb24oKSwgaW5mbykpCi0JCQkJCQlzZXRUb0luaXRpYWxDb25maWcuYWRkKGJJbmZvKTsKLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKHNMLmludFZhbHVlKCkgPiBjb25maWd1cmF0b3JTTCkgewotCQkJCWZvciAoSXRlcmF0b3IgaXRlMiA9IGxpc3QuaXRlcmF0b3IoKTsgaXRlMi5oYXNOZXh0KCk7KSB7Ci0JCQkJCUJ1bmRsZUluZm8gYkluZm8gPSAoQnVuZGxlSW5mbykgaXRlMi5uZXh0KCk7Ci0JCQkJCWlmIChpc1ByZXJlcXVpc2l0ZUJ1bmRsZXMoYkluZm8uZ2V0TG9jYXRpb24oKSwgaW5mbykgfHwgaXNTeXN0ZW1GcmFnbWVudEJ1bmRsZShiSW5mby5nZXRMb2NhdGlvbigpLCBpbmZvKSkKLQkJCQkJCWlmICghaXNTeXN0ZW1CdW5kbGUoYkluZm8uZ2V0TG9jYXRpb24oKSwgaW5mbykpCi0JCQkJCQkJc2V0VG9Jbml0aWFsQ29uZmlnLmFkZChiSW5mbyk7Ci0JCQkJCXNldFRvU2ltcGxlQ29uZmlnLmFkZChiSW5mbyk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGUyID0gbGlzdC5pdGVyYXRvcigpOyBpdGUyLmhhc05leHQoKTspIHsKLQkJCQkJQnVuZGxlSW5mbyBiSW5mbyA9IChCdW5kbGVJbmZvKSBpdGUyLm5leHQoKTsKLQkJCQkJaWYgKGZvdW5kKSB7Ci0JCQkJCQlpZiAoIWlzU3lzdGVtQnVuZGxlKGJJbmZvLmdldExvY2F0aW9uKCksIGluZm8pKQotCQkJCQkJCWlmIChpc1ByZXJlcXVpc2l0ZUJ1bmRsZXMoYkluZm8uZ2V0TG9jYXRpb24oKSwgaW5mbykgfHwgaXNTeXN0ZW1GcmFnbWVudEJ1bmRsZShiSW5mby5nZXRMb2NhdGlvbigpLCBpbmZvKSkKLQkJCQkJCQkJc2V0VG9Jbml0aWFsQ29uZmlnLmFkZChiSW5mbyk7Ci0JCQkJCQlzZXRUb1NpbXBsZUNvbmZpZy5hZGQoYkluZm8pOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJaWYgKGlzVGFyZ2V0Q29uZmlndXJhdG9yQnVuZGxlKGJJbmZvLmdldExvY2F0aW9uKCkpKQotCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQllbHNlIGlmICghaXNTeXN0ZW1CdW5kbGUoYkluZm8uZ2V0TG9jYXRpb24oKSwgaW5mbykpCi0JCQkJCQlzZXRUb0luaXRpYWxDb25maWcuYWRkKGJJbmZvKTsKLQkJCQkJc2V0VG9TaW1wbGVDb25maWcuYWRkKGJJbmZvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlzZXRUb0luaXRpYWxDb25maWcuYWRkKGNvbmZpZ3VyYXRvckJJbmZvKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2hlY2tSZXNvbHZlKEJ1bmRsZUluZm8gYkluZm8sIEJ1bmRsZXNTdGF0ZSBzdGF0ZSkgey8vdGhyb3dzIE1hbmlwdWxhdG9yRXhjZXB0aW9uIHsKLQkJaWYgKGJJbmZvID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJiSW5mbyBpcyBudWxsLiIpOwotCi0JCWlmICghc3RhdGUuaXNSZXNvbHZlZCgpKQotCQkJc3RhdGUucmVzb2x2ZShmYWxzZSk7Ci0JCS8vCQlpZiAoREVCVUcpCi0JCS8vCQkJU3lzdGVtLm91dC5wcmludGxuKHN0YXRlLnRvU3RyaW5nKCkpOwotCi0JCWlmICghc3RhdGUuaXNSZXNvbHZlZChiSW5mbykpIHsKLQkJCXByaW50b3V0VW5zYXRpc2ZpZWRDb25zdHJhaW50cyhiSW5mbywgc3RhdGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkaXZpZGVCdW5kbGVJbmZvcyhNYW5pcHVsYXRvciBtYW5pcHVsYXRvciwgTGlzdCBzZXRUb0luaXRpYWxDb25maWcsIExpc3Qgc2V0VG9TaW1wbGVDb25maWcsIGZpbmFsIGludCBpbml0aWFsQlNMKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlCdW5kbGVzU3RhdGUgc3RhdGUgPSBtYW5pcHVsYXRvci5nZXRCdW5kbGVzU3RhdGUoKTsKLQkJQnVuZGxlSW5mb1tdIHRhcmdldEJ1bmRsZUluZm9zID0gbnVsbDsKLQkJaWYgKHN0YXRlLmlzRnVsbHlTdXBwb3J0ZWQoKSkgewotCQkJdGFyZ2V0QnVuZGxlSW5mb3MgPSBzdGF0ZS5nZXRFeHBlY3RlZFN0YXRlKCk7Ci0JCX0gZWxzZSB7Ci0JCQl0YXJnZXRCdW5kbGVJbmZvcyA9IG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRCdW5kbGVzKCk7Ci0JCX0KLQkJQnVuZGxlSW5mbyBjb25maWd1cmF0b3JCSW5mbyA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGFyZ2V0QnVuZGxlSW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpc1RhcmdldENvbmZpZ3VyYXRvckJ1bmRsZSh0YXJnZXRCdW5kbGVJbmZvc1tpXS5nZXRMb2NhdGlvbigpKSkgewotCQkJCWlmICh0YXJnZXRCdW5kbGVJbmZvc1tpXS5pc01hcmtlZEFzU3RhcnRlZCgpKSB7Ci0JCQkJCWNvbmZpZ3VyYXRvckJJbmZvID0gdGFyZ2V0QnVuZGxlSW5mb3NbaV07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoY29uZmlndXJhdG9yQkluZm8gPT0gbnVsbCAmJiAhbWFuaXB1bGF0b3JzLmNvbnRhaW5zKG1hbmlwdWxhdG9yKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9IGVsc2UgaWYgKG1hbmlwdWxhdG9ycy5jb250YWlucyhtYW5pcHVsYXRvcikgJiYgdGFyZ2V0QnVuZGxlSW5mb3MubGVuZ3RoID09IDApIHsKLQkJCS8vIFJlc3VsdGluZyBzdGF0ZSB3aWxsIGhhdmUgbm8gYnVuZGxlcyAtIHNvIGlzIGFuIHVuaW5zdGFsbCwgaW5jbHVkaW5nCi0JCQkvLyB1bmluc3RhbGwgb2YgdGhlIGNvbmZpZ3VyYXRvci4gSG93ZXZlciwgd2UgaGF2ZSBzZWVuIHRoaXMgbWFuaXB1bGF0b3IKLQkJCS8vIGJlZm9yZSB3aXRoIGEgdGFyZ2V0IGNvbmZpZ3VyYXRvciBidW5kbGUsIHNvIGFsbG93IHVuaW5zdGFsbCB0byBwcm9jZWVkLAotCQkJLy8gYnV0IG9ubHkgZ2V0IG9uZSBjaGFuY2UuCi0JCQltYW5pcHVsYXRvcnMucmVtb3ZlKG1hbmlwdWxhdG9yKTsKLQkJfSBlbHNlIGlmICghbWFuaXB1bGF0b3JzLmNvbnRhaW5zKG1hbmlwdWxhdG9yKSkgewotCQkJbWFuaXB1bGF0b3JzLmFkZChtYW5pcHVsYXRvcik7Ci0JCX0KLQotCQlpZiAoc3RhdGUuaXNGdWxseVN1cHBvcnRlZCgpKSB7Ci0JCQlzdGF0ZS5yZXNvbHZlKGZhbHNlKTsKLQkJfQotCi0JCUxvY2F0aW9uSW5mbyBpbmZvID0gbmV3IExvY2F0aW9uSW5mbygpOwotCQlzZXRTeXN0ZW1CdW5kbGVzKHN0YXRlLCBpbmZvKTsKLQkJaWYgKGNvbmZpZ3VyYXRvckJJbmZvICE9IG51bGwpIHsKLQkJCXNldFByZXJlcXVpc2l0ZUJ1bmRsZXMoY29uZmlndXJhdG9yQkluZm8sIHN0YXRlLCBpbmZvKTsKLQkJCVNvcnRlZE1hcCBic2xUb0xpc3QgPSBnZXRTb3J0ZWRNYXAoaW5pdGlhbEJTTCwgdGFyZ2V0QnVuZGxlSW5mb3MpOwotCQkJYWxnb3JpdGhtKGluaXRpYWxCU0wsIGJzbFRvTGlzdCwgY29uZmlndXJhdG9yQkluZm8sIHNldFRvSW5pdGlhbENvbmZpZywgc2V0VG9TaW1wbGVDb25maWcsIGluZm8pOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgU29ydGVkTWFwIGdldFNvcnRlZE1hcChpbnQgaW5pdGlhbFNsLCBCdW5kbGVJbmZvW10gYkluZm9zKSB7Ci0JCVNvcnRlZE1hcCBic2xUb0xpc3QgPSBuZXcgVHJlZU1hcCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGJJbmZvcy5sZW5ndGg7IGkrKykgewotCQkJSW50ZWdlciBzTCA9IG5ldyBJbnRlZ2VyKGJJbmZvc1tpXS5nZXRTdGFydExldmVsKCkpOwotCQkJaWYgKHNMLmludFZhbHVlKCkgPT0gQnVuZGxlSW5mby5OT19MRVZFTCkKLQkJCQlzTCA9IG5ldyBJbnRlZ2VyKGluaXRpYWxTbCk7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgYnNsVG9MaXN0LmdldChzTCk7Ci0JCQlpZiAobGlzdCA9PSBudWxsKSB7Ci0JCQkJbGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCQkJYnNsVG9MaXN0LnB1dChzTCwgbGlzdCk7Ci0JCQl9Ci0JCQlsaXN0LmFkZChiSW5mb3NbaV0pOwotCQl9Ci0JCXJldHVybiBic2xUb0xpc3Q7Ci0JfQotCi0JcHJpdmF0ZSBCdW5kbGVJbmZvW10gb3JkZXJpbmdJbml0aWFsQ29uZmlnKExpc3Qgc2V0VG9Jbml0aWFsQ29uZmlnKSB7Ci0JCUxpc3Qgbm90VG9CZVN0YXJ0ZWQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlMaXN0IHRvQmVTdGFydGVkID0gbmV3IExpbmtlZExpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdGUyID0gc2V0VG9Jbml0aWFsQ29uZmlnLml0ZXJhdG9yKCk7IGl0ZTIuaGFzTmV4dCgpOykgewotCQkJQnVuZGxlSW5mbyBiSW5mbyA9IChCdW5kbGVJbmZvKSBpdGUyLm5leHQoKTsKLQkJCWlmIChiSW5mby5pc01hcmtlZEFzU3RhcnRlZCgpKQotCQkJCXRvQmVTdGFydGVkLmFkZChiSW5mbyk7Ci0JCQllbHNlCi0JCQkJbm90VG9CZVN0YXJ0ZWQuYWRkKGJJbmZvKTsKLQkJfQotCQlzZXRUb0luaXRpYWxDb25maWcuY2xlYXIoKTsKLQkJc2V0VG9Jbml0aWFsQ29uZmlnLmFkZEFsbChub3RUb0JlU3RhcnRlZCk7Ci0JCXNldFRvSW5pdGlhbENvbmZpZy5hZGRBbGwodG9CZVN0YXJ0ZWQpOwotCQlyZXR1cm4gVXRpbHMuZ2V0QnVuZGxlSW5mb3NGcm9tTGlzdChzZXRUb0luaXRpYWxDb25maWcpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHByaW50b3V0VW5zYXRpc2ZpZWRDb25zdHJhaW50cyhCdW5kbGVJbmZvIGJJbmZvLCBCdW5kbGVzU3RhdGUgc3RhdGUpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlzYi5hcHBlbmQoIk1pc3NpbmcgY29uc3RyYWludHM6XG4iKTsKLQkJCVN0cmluZ1tdIG1pc3NpbmdzID0gc3RhdGUuZ2V0VW5zYXRpc2ZpZWRDb25zdHJhaW50cyhiSW5mbyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG1pc3NpbmdzLmxlbmd0aDsgaSsrKQotCQkJCXNiLmFwcGVuZCgiICIgKyBtaXNzaW5nc1tpXSArICJcbiIpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBCdW5kbGVJbmZvW10gbG9hZENvbmZpZ3VyYXRpb24oVVJMIHVybCwgRmlsZSBsYXVuY2hlckxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAodXJsID09IG51bGwpCi0JCQlyZXR1cm4gTlVMTF9CVU5ETEVJTkZPUzsKLQotCQl0cnkgewotCQkJdXJsLm9wZW5TdHJlYW0oKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBOVUxMX0JVTkRMRUlORk9TOwotCQl9Ci0KLQkJTGlzdCBidW5kbGVJbmZvTGlzdCA9IHJlYWRDb25maWd1cmF0aW9uKHVybCwgbGF1bmNoZXJMb2NhdGlvbik7Ci0JCXJldHVybiBVdGlscy5nZXRCdW5kbGVJbmZvc0Zyb21MaXN0KGJ1bmRsZUluZm9MaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjb3BpZWQgZnJvbSBTaW1wbGVDb25maWd1cmF0b3JVdGlscyBjbGFzcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3QgcmVhZENvbmZpZ3VyYXRpb24oVVJMIHVybCwgRmlsZSBiYXNlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlMaXN0IGJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRyeSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInJlYWRDb25maWd1cmF0aW9uKFVSTCB1cmwpOnVybCgpPSIgKyB1cmwpOwotCQkJLy8gVVJMIGNvbmZpZ0ZpbGVVcmwgPSBnZXRDb25maWdGaWxlVXJsKCk7Ci0JCQkvLyBVUkwgY29uZmlnRmlsZVVybCA9IFV0aWxzLmdldFVybCgiZmlsZSIsbnVsbCwKLQkJCS8vIGlucHV0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCQlCdWZmZXJlZFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcih1cmwub3BlblN0cmVhbSgpKSk7Ci0JCQkvLyBCdWZmZXJlZFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGlucHV0RmlsZSkpOwotCi0JCQlTdHJpbmcgbGluZTsKLQkJCXRyeSB7Ci0JCQkJVVJMIGJhc2VVcmwgPSBuZXcgVVJMKHVybCwgIi4vIik7Ci0JCQkJd2hpbGUgKChsaW5lID0gci5yZWFkTGluZSgpKSAhPSBudWxsKSB7Ci0JCQkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoIiMiKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlsaW5lID0gbGluZS50cmltKCk7Ly8gc3ltYm9saWNOYW1lLHZlcnNpb24sbG9jYXRpb24sc3RhcnRsZXZlbCxleHBlY3RlZFN0YXRlCi0JCQkJCWlmIChsaW5lLmxlbmd0aCgpID09IDApCi0JCQkJCQljb250aW51ZTsKLQotCQkJCQkvLyAoZXhwZWN0ZWRTdGF0ZSBpcyBhbiBpbnRlZ2VyKS4KLQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImxpbmU9IiArIGxpbmUpOwotCQkJCQlpZiAobGluZS5zdGFydHNXaXRoKFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5QQVJBTUVURVJfQkFTRVVSTCArICI9IikpIHsKLQkJCQkJCVN0cmluZyBiYXNlVXJsU3QgPSBsaW5lLnN1YnN0cmluZygoU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLlBBUkFNRVRFUl9CQVNFVVJMICsgIj0iKS5sZW5ndGgoKSk7Ci0JCQkJCQlpZiAoIWJhc2VVcmxTdC5lbmRzV2l0aCgiLyIpKQotCQkJCQkJCWJhc2VVcmxTdCArPSAiLyI7Ci0JCQkJCQliYXNlVXJsID0gbmV3IFVSTCh1cmwsIGJhc2VVcmxTdCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihsaW5lLCAiLCIsIHRydWUpOwotCQkJCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gdG9rLm5leHRUb2tlbigpOwotCQkJCQlpZiAoc3ltYm9saWNOYW1lLmVxdWFscygiLCIpKQotCQkJCQkJc3ltYm9saWNOYW1lID0gbnVsbDsKLQkJCQkJZWxzZQotCQkJCQkJdG9rLm5leHRUb2tlbigpOyAvLyAsCi0KLQkJCQkJU3RyaW5nIHZlcnNpb24gPSB0b2submV4dFRva2VuKCk7Ci0JCQkJCWlmICh2ZXJzaW9uLmVxdWFscygiLCIpKQotCQkJCQkJdmVyc2lvbiA9IG51bGw7Ci0JCQkJCWVsc2UKLQkJCQkJCXRvay5uZXh0VG9rZW4oKTsgLy8gLAotCi0JCQkJCVN0cmluZyB1cmxTdCA9IHRvay5uZXh0VG9rZW4oKTsKLQkJCQkJaWYgKHVybFN0LmVxdWFscygiLCIpKSB7Ci0JCQkJCQlpZiAoc3ltYm9saWNOYW1lICE9IG51bGwgJiYgdmVyc2lvbiAhPSBudWxsKQotCQkJCQkJCXVybFN0ID0gc3ltYm9saWNOYW1lICsgIl8iICsgdmVyc2lvbiArICIuamFyIjsKLQkJCQkJCWVsc2UKLQkJCQkJCQl1cmxTdCA9IG51bGw7Ci0JCQkJCX0gZWxzZQotCQkJCQkJdG9rLm5leHRUb2tlbigpOyAvLyAsCi0JCQkJCXRyeSB7Ci0JCQkJCQluZXcgVVJMKHVybFN0KTsKLQkJCQkJCS8vCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJLy8JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIxIHVybFN0PSIgKyB1cmxTdCk7Ci0JCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl1cmxTdCA9IFV0aWxzLmdldFVybEluRnVsbCh1cmxTdCwgYmFzZVVybCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCQkJCS8vCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJLy8JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIyIHVybFN0PSIgKyB1cmxTdCk7Ci0JCQkJCX0KLQotCQkJCQlpbnQgc2wgPSBJbnRlZ2VyLnBhcnNlSW50KHRvay5uZXh0VG9rZW4oKS50cmltKCkpOwotCQkJCQl0b2submV4dFRva2VuKCk7IC8vICwKLQkJCQkJYm9vbGVhbiBtYXJrZWRBc1N0YXJ0ZWQgPSBCb29sZWFuLnZhbHVlT2YodG9rLm5leHRUb2tlbigpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJLy8gVVJMIHVybEJ1bmRsZSA9IG51bGw7Ci0JCQkJCS8vIHRyeSB7Ci0JCQkJCS8vIHVybEJ1bmRsZSA9IG5ldyBVUkwodXJsU3QpOwotCQkJCQkvLyB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkvLyB1cmxCdW5kbGUgPSBVdGlscy5nZXRGdWxsVXJsKHVybFN0LCBiYXNlVXJsKTsKLQkJCQkJLy8gfQotCi0JCQkJCXVybFN0ID0gbWFrZUFic29sdXRlKHVybFN0LCBiYXNlICE9IG51bGwgPyBiYXNlLnRvVVJMKCkgOiBudWxsKTsKLQkJCQkJQnVuZGxlSW5mbyBiSW5mbyA9IG5ldyBCdW5kbGVJbmZvKHN5bWJvbGljTmFtZSwgdmVyc2lvbiwgdXJsU3QsIHNsLCBtYXJrZWRBc1N0YXJ0ZWQpOwotCQkJCQlidW5kbGVzLmFkZChiSW5mbyk7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigidGFpbCBsaW5lPSIgKyBsaW5lKTsKLQkJCQl9Ci0JCQl9IGZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCXIuY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQkJCQkvLyBpZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJLy8gVE9ETyBsb2cgc29tZXRoaW5nCi0JCQkvLyBidW5kbGVJbmZvcyA9IE5VTExfQlVORExFSU5GT1M7Ci0JCX0KLQkJcmV0dXJuIGJ1bmRsZXM7Ci0JCS8vIGJ1bmRsZUluZm9zID0gKEJ1bmRsZUluZm9bXSkgYnVuZGxlcy50b0FycmF5KG5ldwotCQkvLyBCdW5kbGVJbmZvW2J1bmRsZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHVibGljIEJ1bmRsZUluZm9bXSBzYXZlKE1hbmlwdWxhdG9yIG1hbmlwdWxhdG9yLCBib29sZWFuIGJhY2t1cCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTGlzdCBzZXRUb0luaXRpYWxDb25maWcgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlMaXN0IHNldFRvU2ltcGxlQ29uZmlnID0gbmV3IExpbmtlZExpc3QoKTsKLQkJQ29uZmlnRGF0YSBjb25maWdEYXRhID0gbWFuaXB1bGF0b3IuZ2V0Q29uZmlnRGF0YSgpOwotCi0JCS8vdHJ5IHsKLQkJaWYgKCFkaXZpZGVCdW5kbGVJbmZvcyhtYW5pcHVsYXRvciwgc2V0VG9Jbml0aWFsQ29uZmlnLCBzZXRUb1NpbXBsZUNvbmZpZywgY29uZmlnRGF0YS5nZXRJbml0aWFsQnVuZGxlU3RhcnRMZXZlbCgpKSkKLQkJCXJldHVybiBjb25maWdEYXRhLmdldEJ1bmRsZXMoKTsKLQkJLy99IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkvLwllLnByaW50U3RhY2tUcmFjZSgpOwotCQkvLwlTeXN0ZW0uZXhpdCgtMSk7Ci0JCS8vfQotCQkvLwkJaWYgKERFQlVHKSB7Ci0JCS8vCQkJU3lzdGVtLm91dC5wcmludGxuKCJzZXRUb0luaXRpYWxDb25maWc9XG4iICsgU2ltcGxlQ29uZmlndXJhdG9yVXRpbHMuZ2V0TGlzdFN0KHNldFRvSW5pdGlhbENvbmZpZykpOwotCQkvLwkJCVN5c3RlbS5vdXQucHJpbnRsbigic2V0VG9TaW1wbGVDb25maWc9XG4iICsgU2ltcGxlQ29uZmlndXJhdG9yVXRpbHMuZ2V0TGlzdFN0KHNldFRvU2ltcGxlQ29uZmlnKSk7Ci0JCS8vCQl9Ci0JCVVSTCBjb25maWd1cmF0b3JDb25maWdVcmwgPSBnZXRDb25maWdMb2NhdGlvbihtYW5pcHVsYXRvcik7Ci0JCWlmICghY29uZmlndXJhdG9yQ29uZmlnVXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpCi0JCQluZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJjb25maWd1cmF0b3JDb25maWdVcmwgc2hvdWxkIHN0YXJ0IHdpdGggXCJmaWxlXCIuXG5jb25maWd1cmF0b3JDb25maWdVcmw9IiArIGNvbmZpZ3VyYXRvckNvbmZpZ1VybCk7Ci0JCUZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKGNvbmZpZ3VyYXRvckNvbmZpZ1VybC5nZXRGaWxlKCkpOwotCQlzYXZlQ29uZmlndXJhdGlvbihzZXRUb1NpbXBsZUNvbmZpZywgb3V0cHV0RmlsZSwgRXF1aW5veEZ3Q29uZmlnRmlsZVBhcnNlci5nZXRPU0dpSW5zdGFsbEFyZWEobWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkpLCBiYWNrdXApOwotCQljb25maWdEYXRhLnNldEZ3SW5kZXBlbmRlbnRQcm9wKFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5QUk9QX0tFWV9DT05GSUdVUkwsIG91dHB1dEZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLQkJcmV0dXJuIG9yZGVyaW5nSW5pdGlhbENvbmZpZyhzZXRUb0luaXRpYWxDb25maWcpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzYXZlQ29uZmlndXJhdGlvbihMaXN0IGJ1bmRsZUluZm9MaXN0LCBGaWxlIG91dHB1dEZpbGUsIEZpbGUgYmFzZSwgYm9vbGVhbiBiYWNrdXApIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJzYXZlQ29uZmlndXJhdGlvbihMaXN0IGJ1bmRsZUluZm9MaXN0LCBGaWxlIG91dHB1dEZpbGUsIGJvb2xlYW4gYmFja3VwKTogb3V0RmlsZT0iICsgb3V0cHV0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJQnVmZmVyZWRXcml0ZXIgYnc7Ci0JCWlmIChiYWNrdXApCi0JCQlpZiAob3V0cHV0RmlsZS5leGlzdHMoKSkgewotCQkJCUZpbGUgZGVzdCA9IFV0aWxzLmdldFNpbXBsZURhdGFGb3JtYXR0ZWRGaWxlKG91dHB1dEZpbGUpOwotCQkJCWlmICghb3V0cHV0RmlsZS5yZW5hbWVUbyhkZXN0KSkgewotCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkZhaWwgdG8gcmVuYW1lIGZyb20gKCIgKyBvdXRwdXRGaWxlICsgIikgdG8gKCIgKyBkZXN0ICsgIikiKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChidW5kbGVJbmZvTGlzdCwgbmV3IENvbXBhcmF0b3IoKSB7Ci0JCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQlpZiAobzEgaW5zdGFuY2VvZiBCdW5kbGVJbmZvICYmIG8yIGluc3RhbmNlb2YgQnVuZGxlSW5mbykgewotCQkJCQlyZXR1cm4gKChCdW5kbGVJbmZvKSBvMSkuZ2V0U3ltYm9saWNOYW1lKCkuY29tcGFyZVRvKCgoQnVuZGxlSW5mbykgbzIpLmdldFN5bWJvbGljTmFtZSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIDA7Ci0JCQl9Ci0JCX0pOwotCi0JCWlmIChidW5kbGVJbmZvTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlVdGlscy5jcmVhdGVQYXJlbnREaXIob3V0cHV0RmlsZSk7Ci0JCQlidyA9IG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihvdXRwdXRGaWxlKSk7Ci0KLQkJCWZvciAoSXRlcmF0b3IgaXRlID0gYnVuZGxlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaXRlLmhhc05leHQoKTspIHsKLQkJCQlCdW5kbGVJbmZvIGJJbmZvID0gKEJ1bmRsZUluZm8pIGl0ZS5uZXh0KCk7Ci0JCQkJU3RyaW5nIGxvY2F0aW9uID0gYkluZm8uZ2V0TG9jYXRpb24oKTsKLQotCQkJCWlmIChiSW5mby5nZXRTeW1ib2xpY05hbWUoKSA9PSBudWxsKQotCQkJCQlidy53cml0ZSgiLCIpOwotCQkJCWVsc2UKLQkJCQkJYncud3JpdGUoYkluZm8uZ2V0U3ltYm9saWNOYW1lKCkgKyAiLCIpOwotCQkJCWlmIChiSW5mby5nZXRWZXJzaW9uKCkgPT0gbnVsbCkKLQkJCQkJYncud3JpdGUoIiwiKTsKLQkJCQllbHNlCi0JCQkJCWJ3LndyaXRlKGJJbmZvLmdldFZlcnNpb24oKSArICIsIik7Ci0KLQkJCQlsb2NhdGlvbiA9IG1ha2VSZWxhdGl2ZShsb2NhdGlvbiwgYmFzZSAhPSBudWxsID8gYmFzZS50b1VSTCgpIDogbnVsbCk7Ci0JCQkJYncud3JpdGUobG9jYXRpb24gKyAiLCIpOwotCQkJCWJ3LndyaXRlKGJJbmZvLmdldFN0YXJ0TGV2ZWwoKSArICIsIiArIGJJbmZvLmlzTWFya2VkQXNTdGFydGVkKCkpOwotCQkJCWJ3Lm5ld0xpbmUoKTsKLQkJCX0KLQkJCWJ3LmZsdXNoKCk7Ci0JCQlidy5jbG9zZSgpOwotCQl9IGVsc2UgewotCQkJaWYgKG91dHB1dEZpbGUuZXhpc3RzKCkpIHsKLQkJCQlvdXRwdXRGaWxlLmRlbGV0ZSgpOwotCQkJfQotCQkJRmlsZSBwYXJlbnREaXIgPSBvdXRwdXRGaWxlLmdldFBhcmVudEZpbGUoKTsKLQkJCWlmIChwYXJlbnREaXIuZXhpc3RzKCkpIHsKLQkJCQlwYXJlbnREaXIuZGVsZXRlKCk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtYWtlUmVsYXRpdmUoSVBhdGggdG9SZWwsIElQYXRoIGJhc2UpIHsKLQkJaW50IGkgPSBiYXNlLm1hdGNoaW5nRmlyc3RTZWdtZW50cyh0b1JlbCk7Ci0JCWlmIChpID09IDApIHsKLQkJCXJldHVybiB0b1JlbC50b09TU3RyaW5nKCk7Ci0JCX0KLQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGogPSAwOyBqIDwgKGJhc2Uuc2VnbWVudENvdW50KCkgLSBpKTsgaisrKSB7Ci0JCQlyZXN1bHQgKz0gIi4uIiArIElQYXRoLlNFUEFSQVRPUjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChpID09IHRvUmVsLnNlZ21lbnRDb3VudCgpKQotCQkJcmV0dXJuICIuIjsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQgKz0gdG9SZWwuc2V0RGV2aWNlKG51bGwpLnJlbW92ZUZpcnN0U2VnbWVudHMoaSkudG9PU1N0cmluZygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VSZWxhdGl2ZShTdHJpbmcgdXJsU3RyaW5nLCBVUkwgcm9vdFVSTCkgewotCQkvLyB3ZSBvbmx5IHRyYWZmaWMgaW4gZmlsZTogVVJMcwotCQlpbnQgaW5kZXggPSB1cmxTdHJpbmcuaW5kZXhPZihGSUxFX1BST1RPQ09MKTsKLQkJaWYgKGluZGV4ID09IC0xKQotCQkJcmV0dXJuIHVybFN0cmluZzsKLQkJaW5kZXggPSBpbmRleCArIDU7Ci0KLQkJLy8gZW5zdXJlIHdlIGhhdmUgYW4gYWJzb2x1dGUgcGF0aCB0byBzdGFydCB3aXRoCi0JCWJvb2xlYW4gZG9uZSA9IGZhbHNlOwotCQlVUkwgdXJsID0gbnVsbDsKLQkJU3RyaW5nIGZpbGUgPSB1cmxTdHJpbmc7Ci0JCXdoaWxlICghZG9uZSkgewotCQkJdHJ5IHsKLQkJCQl1cmwgPSBuZXcgVVJMKGZpbGUpOwotCQkJCWZpbGUgPSB1cmwuZ2V0RmlsZSgpOwotCQkJfSBjYXRjaCAoamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlkb25lID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAodXJsID09IG51bGwgfHwgIW5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiB1cmxTdHJpbmc7Ci0KLQkJU3RyaW5nIHJvb3RTdHJpbmcgPSByb290VVJMLnRvRXh0ZXJuYWxGb3JtKCk7Ci0JCXJldHVybiB1cmxTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4KSArIG1ha2VSZWxhdGl2ZShuZXcgUGF0aCh1cmxTdHJpbmcuc3Vic3RyaW5nKGluZGV4KSksIG5ldyBQYXRoKHJvb3RTdHJpbmcuc3Vic3RyaW5nKHJvb3RTdHJpbmcuaW5kZXhPZihGSUxFX1BST1RPQ09MKSArIDUpKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZUFic29sdXRlKFN0cmluZyBvcmlnaW5hbCwgU3RyaW5nIHJvb3RQYXRoKSB7Ci0JCUlQYXRoIHBhdGggPSBuZXcgUGF0aChvcmlnaW5hbCk7Ci0JCS8vIGVuc3VyZSB3ZSBoYXZlIGEgcmVsYXRpdmUgcGF0aCB0byBzdGFydCB3aXRoCi0JCWlmIChwYXRoLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiBvcmlnaW5hbDsKLQkJSVBhdGggcm9vdCA9IG5ldyBQYXRoKHJvb3RQYXRoKTsKLQkJcmV0dXJuIHJvb3QuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKS5hcHBlbmQob3JpZ2luYWwucmVwbGFjZSgnOicsICd9JykpLnRvT1NTdHJpbmcoKS5yZXBsYWNlKCd9JywgJzonKTsKLQl9Ci0KLQkvKgotCSAqIE1ha2UgdGhlIGdpdmVuIHBhdGggYWJzb2x1dGUgdG8gdGhlIHNwZWNpZmllZCByb290LCBpZiBhcHBsaWNhYmxlLiBJZiBub3QsIHRoZW4KLQkgKiByZXR1cm4gdGhlIHBhdGggYXMtaXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZUFic29sdXRlKFN0cmluZyB1cmxTdHJpbmcsIFVSTCByb290VVJMKSB7Ci0JCS8vIHdlIG9ubHkgdHJhZmZpYyBpbiBmaWxlOiBVUkxzCi0JCWludCBpbmRleCA9IHVybFN0cmluZy5pbmRleE9mKEZJTEVfUFJPVE9DT0wpOwotCQlpZiAoaW5kZXggPT0gLTEpCi0JCQlyZXR1cm4gdXJsU3RyaW5nOwotCQlpbmRleCA9IGluZGV4ICsgNTsKLQotCQkvLyBlbnN1cmUgd2UgaGF2ZSBhIHJlbGF0aXZlIHBhdGggdG8gc3RhcnQgd2l0aAotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJVVJMIHVybCA9IG51bGw7Ci0JCVN0cmluZyBmaWxlID0gdXJsU3RyaW5nOwotCQl3aGlsZSAoIWRvbmUpIHsKLQkJCXRyeSB7Ci0JCQkJdXJsID0gbmV3IFVSTChmaWxlKTsKLQkJCQlmaWxlID0gdXJsLmdldEZpbGUoKTsKLQkJCX0gY2F0Y2ggKGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZG9uZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJaWYgKHVybCA9PSBudWxsIHx8IG5ldyBGaWxlKHVybC5nZXRGaWxlKCkpLmlzQWJzb2x1dGUoKSkKLQkJCXJldHVybiB1cmxTdHJpbmc7Ci0KLQkJcmV0dXJuIHVybFN0cmluZy5zdWJzdHJpbmcoMCwgaW5kZXggLSA1KSArIG1ha2VBYnNvbHV0ZSh1cmxTdHJpbmcuc3Vic3RyaW5nKGluZGV4KSwgcm9vdFVSTC50b0V4dGVybmFsRm9ybSgpKTsKLQl9Ci0KLQl2b2lkIHNldFByZXJlcXVpc2l0ZUJ1bmRsZXMoQnVuZGxlSW5mbyBjb25maWd1cmF0b3JCdW5kbGVJbmZvLCBCdW5kbGVzU3RhdGUgc3RhdGUsIExvY2F0aW9uSW5mbyBpbmZvKSB7Ci0JCWlmIChzdGF0ZS5pc0Z1bGx5U3VwcG9ydGVkKCkpCi0JCQlpZiAoIXRoaXMuY2hlY2tSZXNvbHZlKGNvbmZpZ3VyYXRvckJ1bmRsZUluZm8sIHN0YXRlKSkgewotCQkJCXByaW50b3V0VW5zYXRpc2ZpZWRDb25zdHJhaW50cyhjb25maWd1cmF0b3JCdW5kbGVJbmZvLCBzdGF0ZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQlCdW5kbGVJbmZvW10gcHJlcmVxdWlzaXRlcyA9IHN0YXRlLmdldFByZXJlcXVpc3RlQnVuZGxlcyhjb25maWd1cmF0b3JCdW5kbGVJbmZvKTsKLQkJaW5mby5wcmVyZXF1aXNpdGVMb2NhdGlvbnMgPSBuZXcgU3RyaW5nW3ByZXJlcXVpc2l0ZXMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVyZXF1aXNpdGVzLmxlbmd0aDsgaSsrKQotCQkJaW5mby5wcmVyZXF1aXNpdGVMb2NhdGlvbnNbaV0gPSBwcmVyZXF1aXNpdGVzW2ldLmdldExvY2F0aW9uKCk7Ci0JCXJldHVybjsKLQotCX0KLQotCXZvaWQgc2V0U3lzdGVtQnVuZGxlcyhCdW5kbGVzU3RhdGUgc3RhdGUsIExvY2F0aW9uSW5mbyBpbmZvKSB7Ci0JCUJ1bmRsZUluZm8gc3lzdGVtQnVuZGxlSW5mbyA9IHN0YXRlLmdldFN5c3RlbUJ1bmRsZSgpOwotCQlpZiAoc3lzdGVtQnVuZGxlSW5mbyA9PSBudWxsKSB7Ci0JCQkvLyBUT0RPIExvZwotCQkJLy90aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBzeXN0ZW1CdW5kbGUuXG4iKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoc3RhdGUuaXNGdWxseVN1cHBvcnRlZCgpKQotCQkJaWYgKCF0aGlzLmNoZWNrUmVzb2x2ZShzeXN0ZW1CdW5kbGVJbmZvLCBzdGF0ZSkpIHsKLQkJCQlwcmludG91dFVuc2F0aXNmaWVkQ29uc3RyYWludHMoc3lzdGVtQnVuZGxlSW5mbywgc3RhdGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJaW5mby5zeXN0ZW1CdW5kbGVMb2NhdGlvbiA9IHN5c3RlbUJ1bmRsZUluZm8uZ2V0TG9jYXRpb24oKTsKLQkJQnVuZGxlSW5mb1tdIGZyYWdtZW50cyA9IHN0YXRlLmdldFN5c3RlbUZyYWdtZW50ZWRCdW5kbGVzKCk7Ci0JCWluZm8uc3lzdGVtRnJhZ21lbnRlZEJ1bmRsZUxvY2F0aW9ucyA9IG5ldyBTdHJpbmdbZnJhZ21lbnRzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnJhZ21lbnRzLmxlbmd0aDsgaSsrKQotCQkJaW5mby5zeXN0ZW1GcmFnbWVudGVkQnVuZGxlTG9jYXRpb25zW2ldID0gZnJhZ21lbnRzW2ldLmdldExvY2F0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlQnVuZGxlcyhNYW5pcHVsYXRvciBtYW5pcHVsYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTaW1wbGVDb25maWd1cmF0b3JNYW5pcHVsYXRvckltcGwjdXBkYXRlQnVuZGxlcygpIik7Ci0KLQkJQnVuZGxlc1N0YXRlIGJ1bmRsZVN0YXRlID0gbWFuaXB1bGF0b3IuZ2V0QnVuZGxlc1N0YXRlKCk7Ci0KLQkJaWYgKGJ1bmRsZVN0YXRlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChidW5kbGVTdGF0ZS5pc0Z1bGx5U3VwcG9ydGVkKCkpCi0JCQlidW5kbGVTdGF0ZS5yZXNvbHZlKHRydWUpOwotCi0JCUJ1bmRsZUluZm9bXSBjdXJyZW50QkluZm9zID0gYnVuZGxlU3RhdGUuZ2V0RXhwZWN0ZWRTdGF0ZSgpOwotCQlpZiAoIWlzVGFyZ2V0Q29uZmlndXJhdG9yQnVuZGxlKGN1cnJlbnRCSW5mb3MpKQotCQkJcmV0dXJuOwotCQlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotCQlTdHJpbmdbXSBqdm1BcmdzID0gbWFuaXB1bGF0b3IuZ2V0TGF1bmNoZXJEYXRhKCkuZ2V0SnZtQXJncygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGp2bUFyZ3MubGVuZ3RoOyBpKyspCi0JCQlpZiAoanZtQXJnc1tpXS5zdGFydHNXaXRoKCItRCIpKSB7Ci0JCQkJaW50IGluZGV4ID0ganZtQXJnc1tpXS5pbmRleE9mKCI9Iik7Ci0JCQkJaWYgKGluZGV4ID4gMCAmJiBqdm1BcmdzW2ldLmxlbmd0aCgpID4gMikgewotCQkJCQlTdHJpbmcga2V5ID0ganZtQXJnc1tpXS5zdWJzdHJpbmcoMiwgaW5kZXgpOwotCQkJCQlTdHJpbmcgdmFsdWUgPSBqdm1BcmdzW2ldLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJCQlwcm9wZXJ0aWVzLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOwotCQkJCX0KLQkJCX0KLQotCQlVdGlscy5hcHBlbmRQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIG1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5nZXRGd0luZGVwZW5kZW50UHJvcHMoKSk7Ci0JCWJvb2xlYW4gZXhjbHVzaXZlSW5zdGFsbGF0aW9uID0gQm9vbGVhbi52YWx1ZU9mKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLlBST1BfS0VZX0VYQ0xVU0lWRV9JTlNUQUxMQVRJT04pKS5ib29sZWFuVmFsdWUoKTsKLQkJVVJMIGNvbmZpZ3VyYXRvckNvbmZpZ1VybCA9IGdldENvbmZpZ0xvY2F0aW9uKG1hbmlwdWxhdG9yKTsKLQotCQlCdW5kbGVJbmZvW10gdG9JbnN0YWxsID0gdGhpcy5sb2FkQ29uZmlndXJhdGlvbihjb25maWd1cmF0b3JDb25maWdVcmwsIEVxdWlub3hGd0NvbmZpZ0ZpbGVQYXJzZXIuZ2V0T1NHaUluc3RhbGxBcmVhKG1hbmlwdWxhdG9yLmdldExhdW5jaGVyRGF0YSgpKSk7Ci0KLQkJTGlzdCB0b1VuaW5zdGFsbCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWlmIChleGNsdXNpdmVJbnN0YWxsYXRpb24pCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRCSW5mb3MubGVuZ3RoOyBpKyspIHsKLQkJCQlib29sZWFuIGluc3RhbGwgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRvSW5zdGFsbC5sZW5ndGg7IGorKykKLQkJCQkJaWYgKGN1cnJlbnRCSW5mb3NbaV0uZ2V0TG9jYXRpb24oKS5lcXVhbHModG9JbnN0YWxsW2pdLmdldExvY2F0aW9uKCkpKSB7Ci0JCQkJCQlpbnN0YWxsID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJaWYgKCFpbnN0YWxsKQotCQkJCQl0b1VuaW5zdGFsbC5hZGQoY3VycmVudEJJbmZvc1tpXSk7Ci0JCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b0luc3RhbGwubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJYnVuZGxlU3RhdGUuaW5zdGFsbEJ1bmRsZSh0b0luc3RhbGxbaV0pOwotCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy9JZ25vcmUKLQkJCX0KLQkJfQotCQlpZiAoZXhjbHVzaXZlSW5zdGFsbGF0aW9uKQotCQkJZm9yIChJdGVyYXRvciBpdGUgPSB0b1VuaW5zdGFsbC5pdGVyYXRvcigpOyBpdGUuaGFzTmV4dCgpOykgewotCQkJCUJ1bmRsZUluZm8gYkluZm8gPSAoQnVuZGxlSW5mbykgaXRlLm5leHQoKTsKLQkJCQlidW5kbGVTdGF0ZS51bmluc3RhbGxCdW5kbGUoYkluZm8pOwotCQkJfQotCi0JCWJ1bmRsZVN0YXRlLnJlc29sdmUodHJ1ZSk7Ci0JCW1hbmlwdWxhdG9yLmdldENvbmZpZ0RhdGEoKS5zZXRCdW5kbGVzKGJ1bmRsZVN0YXRlLmdldEV4cGVjdGVkU3RhdGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChNYW5pcHVsYXRvciBtYW5pcHVsYXRvcikgewotCQlGaWxlIG91dHB1dEZpbGUgPSBuZXcgRmlsZShnZXRDb25maWdMb2NhdGlvbihtYW5pcHVsYXRvcikuZ2V0RmlsZSgpKTsKLQkJb3V0cHV0RmlsZS5kZWxldGUoKTsKLQotCQlpZiAob3V0cHV0RmlsZS5nZXRQYXJlbnRGaWxlKCkuaXNEaXJlY3RvcnkoKSkKLQkJCW91dHB1dEZpbGUuZ2V0UGFyZW50RmlsZSgpLmRlbGV0ZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL3V0aWxzL1NpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMGQ4MTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLnV0aWxzOwotCi0KLS8qKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1FVEVSX0JBU0VVUkwgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IuYmFzZVVybCI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUF9LRVlfRVhDTFVTSVZFX0lOU1RBTExBVElPTiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5leGNsdXNpdmVJbnN0YWxsYXRpb24iOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFTVF9DT05GSUdfU1RBTVAgPSAibGFzdC5jb25maWcuc3RhbXBzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19MSVNUID0gImJ1bmRsZXMuaW5mbyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUT1JfRk9MREVSID0gIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkZJR19JTkkgPSAiY29uZmlnLmluaSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0tFWV9DT05GSUdVUkwgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IuY29uZmlnVXJsIjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVJHRVRfQ09ORklHVVJBVE9SX05BTUUgPSAib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfUFJPUF9WQUxVRV9DT05GSUdVUkFUT1JfU1lNQk9MSUNOQU1FID0gVEFSR0VUX0NPTkZJR1VSQVRPUl9OQU1FOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjNiNDgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSL29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5kZWJ1Zy51aS5sYXVuY2hlci5TdGFuZGFyZFZNVHlwZS9DREMtMS4xJUZvdW5kYXRpb24tMS4xIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9ImNvbiIgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA0M2NjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJpbgotYnVpbGQueG1sCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLy5leHRlcm5hbFRvb2xCdWlsZGVycy9Db3B5IGJ1aWx0IHZlcnNpb24gb2Ygc2ltcGxlIGNvbmZpZ3VyYXRvciBpbnRvIG1ldGFkYXRhIGdlbmVyYXRvci5sYXVuY2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLy5leHRlcm5hbFRvb2xCdWlsZGVycy9Db3B5IGJ1aWx0IHZlcnNpb24gb2Ygc2ltcGxlIGNvbmZpZ3VyYXRvciBpbnRvIG1ldGFkYXRhIGdlbmVyYXRvci5sYXVuY2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OGFkNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci8uZXh0ZXJuYWxUb29sQnVpbGRlcnMvQ29weSBidWlsdCB2ZXJzaW9uIG9mIHNpbXBsZSBjb25maWd1cmF0b3IgaW50byBtZXRhZGF0YSBnZW5lcmF0b3IubGF1bmNoCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxsYXVuY2hDb25maWd1cmF0aW9uIHR5cGU9Im9yZy5lY2xpcHNlLmFudC5BbnRCdWlsZGVyTGF1bmNoQ29uZmlndXJhdGlvblR5cGUiPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5hbnQudWkuQVRUUl9UQVJHRVRTX1VQREFURUQiIHZhbHVlPSJ0cnVlIi8+Ci08Ym9vbGVhbkF0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmFudC51aS5ERUZBVUxUX1ZNX0lOU1RBTEwiIHZhbHVlPSJmYWxzZSIvPgotPGxpc3RBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLk1BUFBFRF9SRVNPVVJDRV9QQVRIUyI+Ci08bGlzdEVudHJ5IHZhbHVlPSIvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiLz4KLTwvbGlzdEF0dHJpYnV0ZT4KLTxsaXN0QXR0cmlidXRlIGtleT0ib3JnLmVjbGlwc2UuZGVidWcuY29yZS5NQVBQRURfUkVTT1VSQ0VfVFlQRVMiPgotPGxpc3RFbnRyeSB2YWx1ZT0iNCIvPgotPC9saXN0QXR0cmlidXRlPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLmFwcGVuZEVudmlyb25tZW50VmFyaWFibGVzIiB2YWx1ZT0idHJ1ZSIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5kZWJ1Zy51aS5BVFRSX0xBVU5DSF9JTl9CQUNLR1JPVU5EIiB2YWx1ZT0iZmFsc2UiLz4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkNMQVNTUEFUSF9QUk9WSURFUiIgdmFsdWU9Im9yZy5lY2xpcHNlLmFudC51aS5BbnRDbGFzc3BhdGhQcm92aWRlciIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkRFRkFVTFRfQ0xBU1NQQVRIIiB2YWx1ZT0idHJ1ZSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuUFJPSkVDVF9BVFRSIiB2YWx1ZT0ib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiLz4KLTxtYXBBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfQU5UX1BST1BFUlRJRVMiPgotPG1hcEVudHJ5IGtleT0iYnVpbGREaXJlY3RvcnkiIHZhbHVlPSIke2J1aWxkX3Byb2plY3R9L3RyYXNoIi8+Ci08bWFwRW50cnkga2V5PSJ0YXJnZXRGb2xkZXIiIHZhbHVlPSIke3Jlc291cmNlX2xvYzovb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3J9Ii8+Ci08bWFwRW50cnkga2V5PSJlY2xpcHNlLnBkZWJ1aWxkLnNjcmlwdHMiIHZhbHVlPSIvRDovZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5idWlsZF8zLjMuMC52MjAwNzAzMTIvc2NyaXB0cy8iLz4KLTxtYXBFbnRyeSBrZXk9ImVjbGlwc2UucnVubmluZyIgdmFsdWU9InRydWUiLz4KLTxtYXBFbnRyeSBrZXk9InRoaXNQbHVnaW4iIHZhbHVlPSIke3Jlc291cmNlX2xvYzovb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3J9Ii8+Ci08bWFwRW50cnkga2V5PSJlY2xpcHNlLnBkZWJ1aWxkLnRlbXBsYXRlcyIgdmFsdWU9Ii9EOi9lY2xpcHNlL3BsdWdpbnMvb3JnLmVjbGlwc2UucGRlLmJ1aWxkXzMuMy4wLnYyMDA3MDMxMi90ZW1wbGF0ZXMvIi8+Ci08bWFwRW50cnkga2V5PSJlY2xpcHNlLnBkZWJ1aWxkLmhvbWUiIHZhbHVlPSIvRDovZWNsaXBzZS9wbHVnaW5zL29yZy5lY2xpcHNlLnBkZS5idWlsZF8zLjMuMC52MjAwNzAzMTIvLi8iLz4KLTxtYXBFbnRyeSBrZXk9ImVjbGlwc2UuaG9tZSIgdmFsdWU9IkQ6XGVjbGlwc2UiLz4KLTxtYXBFbnRyeSBrZXk9ImJhc2VMb2NhdGlvbiIgdmFsdWU9IiR7dGFyZ2V0X2hvbWV9Ii8+Ci08L21hcEF0dHJpYnV0ZT4KLTxzdHJpbmdBdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfTE9DQVRJT04iIHZhbHVlPSIke3dvcmtzcGFjZV9sb2M6L29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2xvY2FsYnVpbGQueG1sfSIvPgotPHN0cmluZ0F0dHJpYnV0ZSBrZXk9Im9yZy5lY2xpcHNlLnVpLmV4dGVybmFsdG9vbHMuQVRUUl9SVU5fQlVJTERfS0lORFMiIHZhbHVlPSJmdWxsLGluY3JlbWVudGFsLCIvPgotPGJvb2xlYW5BdHRyaWJ1dGUga2V5PSJvcmcuZWNsaXBzZS51aS5leHRlcm5hbHRvb2xzLkFUVFJfVFJJR0dFUlNfQ09ORklHVVJFRCIgdmFsdWU9InRydWUiLz4KLTwvbGF1bmNoQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmFkM2U2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UudWkuZXh0ZXJuYWx0b29scy5FeHRlcm5hbFRvb2xCdWlsZGVyPC9uYW1lPgotCQkJPHRyaWdnZXJzPmZ1bGwsaW5jcmVtZW50YWwsPC90cmlnZ2Vycz4KLQkJCTxhcmd1bWVudHM+Ci0JCQkJPGRpY3Rpb25hcnk+Ci0JCQkJCTxrZXk+TGF1bmNoQ29uZmlnSGFuZGxlPC9rZXk+Ci0JCQkJCTx2YWx1ZT4mbHQ7cHJvamVjdCZndDsvLmV4dGVybmFsVG9vbEJ1aWxkZXJzL0NvcHkgYnVpbHQgdmVyc2lvbiBvZiBzaW1wbGUgY29uZmlndXJhdG9yIGludG8gbWV0YWRhdGEgZ2VuZXJhdG9yLmxhdW5jaDwvdmFsdWU+Ci0JCQkJPC9kaWN0aW9uYXJ5PgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2VkOTVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLSNGcmkgRmViIDIyIDExOjE1OjM4IEVTVCAyMDA4Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbl90eXBlX21lbWJlcnNfb25fY29sdW1ucz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX2VudW1fY29uc3RhbnQ9MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9xdWFsaWZpZWRfYWxsb2NhdGlvbl9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hc3NpZ25tZW50PTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2JpbmFyeV9leHByZXNzaW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb25kaXRpb25hbF9leHByZXNzaW9uPTgwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9lbnVtX2NvbnN0YW50cz0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9leHByZXNzaW9uc19pbl9hcnJheV9pbml0aWFsaXplcj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfbXVsdGlwbGVfZmllbGRzPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9wYXJhbWV0ZXJzX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc2VsZWN0b3JfaW5fbWV0aG9kX2ludm9jYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyY2xhc3NfaW5fdHlwZV9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3Jfc3VwZXJpbnRlcmZhY2VzX2luX2VudW1fZGVjbGFyYXRpb249MTYKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl90eXBlX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPTE2Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX21ldGhvZF9kZWNsYXJhdGlvbj0xNgotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX2ltcG9ydHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2U9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZD0wCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ZpcnN0X2NsYXNzX2JvZHlfZGVjbGFyYXRpb249MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9pbXBvcnRzPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZWZvcmVfbWVtYmVyX3R5cGU9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZXRob2Q9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bms9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlPTAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX2ltcG9ydF9ncm91cHM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JldHdlZW5fdHlwZV9kZWNsYXJhdGlvbnM9MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYXJyYXlfaW5pdGlhbGl6ZXI9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2s9ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfYmxvY2tfaW5fY2FzZT1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50PWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2VudW1fZGVjbGFyYXRpb249ZW5kX29mX2xpbmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5icmFjZV9wb3NpdGlvbl9mb3JfbWV0aG9kX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaD1lbmRfb2ZfbGluZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uPWVuZF9vZl9saW5lCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50PWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9qYXZhZG9jX2NvbW1lbnQ9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9ibG9ja19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaHRtbD10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfamF2YWRvY19jb21tZW50cz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2xpbmVfY29tbWVudHM9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmZvcm1hdF9zb3VyY2VfY29kZT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcGFyYW1ldGVyX2Rlc2NyaXB0aW9uPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5pbmRlbnRfcm9vdF90YWdzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGg9ODAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWY9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbnRpbnVhdGlvbl9pbmRlbnRhdGlvbj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplcj0yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2Fubm90YXRpb25fZGVjbGFyYXRpb25faGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYm9keV9kZWNsYXJhdGlvbnNfY29tcGFyZV90b19lbnVtX2NvbnN0YW50X2hlYWRlcj10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fZW51bV9kZWNsYXJhdGlvbl9oZWFkZXI9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX3R5cGVfaGVhZGVyPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXM9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcz1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYmxvY2s9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keT10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19jYXNlcz10cnVlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2g9dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYXRfZW5kX29mX2ZpbGVfaWZfbWlzc2luZz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jYXRjaF9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXI9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZWxzZV9pbl9pZl9zdGF0ZW1lbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9iZWZvcmVfZmluYWxseV9pbl90cnlfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX3doaWxlX2luX2RvX3N0YXRlbWVudD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X21ldGhvZF9ib2R5PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV90eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hbmRfaW5fdHlwZV9wYXJhbWV0ZXI9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2F0X2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19icmFjZV9pbl9ibG9jaz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQ9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2Nhc2U9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Fubm90YXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3M9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZXhwbGljaXRjb25zdHJ1Y3RvcmNhbGxfYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZm9yX2luaXRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2ludm9jYXRpb25fYXJndW1lbnRzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9tdWx0aXBsZV9maWVsZF9kZWNsYXJhdGlvbnM9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fc3VwZXJpbnRlcmZhY2VzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9lbGxpcHNpcz1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Zvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5faWY9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3doaWxlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3F1ZXN0aW9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl93aWxkY2FyZD1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3NlbWljb2xvbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Fzc2lnbm1lbnRfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hdF9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2Fubm90YXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fY2F0Y2g9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3I9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3dpdGNoPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fd2hpbGU9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2NvbmRpdGlvbmFsPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZGVmYXVsdD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2Zvcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbG9uX2luX2xhYmVsZWRfc3RhdGVtZW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5pdHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fbXVsdGlwbGVfZmllbGRfZGVjbGFyYXRpb25zPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2xvY2FsX2RlY2xhcmF0aW9ucz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX3N1cGVyaW50ZXJmYWNlcz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cz1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfZWxsaXBzaXM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfYXJndW1lbnRzPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnM9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hbm5vdGF0aW9uX3R5cGVfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplcj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYmxvY2s9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2NvbnN0YW50PWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb249aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbj1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2tldF9pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2U9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fYW5ub3RhdGlvbl90eXBlX21lbWJlcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NhdGNoPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2VudW1fY29uc3RhbnQ9ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9mb3I9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2lmPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9tZXRob2RfaW52b2NhdGlvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fc3luY2hyb25pemVkPWluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl93aGlsZT1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm49aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3c9aW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wb3N0Zml4X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3ByZWZpeF9vcGVyYXRvcj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbD1pbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3F1ZXN0aW9uX2luX3dpbGRjYXJkPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbj1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZT1kbyBub3QgaW5zZXJ0Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2VzX2luX2FycmF5X2luaXRpYWxpemVyPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFja2V0c19pbl9hcnJheV9hbGxvY2F0aW9uX2V4cHJlc3Npb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50PWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uPWRvIG5vdCBpbnNlcnQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2ludm9jYXRpb249ZG8gbm90IGluc2VydAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmU9ZmFsc2UKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5rZWVwX3RoZW5fc3RhdGVtZW50X29uX3NhbWVfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmxpbmVTcGxpdD04MDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfYmxvY2tfY29tbWVudHNfb25fZmlyc3RfY29sdW1uPXRydWUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW49dHJ1ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHk9MAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9lbXB0eV9saW5lc190b19wcmVzZXJ2ZT0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZT1mYWxzZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uY2hhcj10YWIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci50YWJ1bGF0aW9uLnNpemU9NAotb3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zPWZhbHNlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIud3JhcF9iZWZvcmVfYmluYXJ5X29wZXJhdG9yPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZTI0NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotI1N1biBTZXAgMjMgMTE6NTk6NDEgRURUIDIwMDcKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lZGl0b3Jfc2F2ZV9wYXJ0aWNpcGFudF9vcmcuZWNsaXBzZS5qZHQudWkucG9zdHNhdmVsaXN0ZW5lci5jbGVhbnVwPXRydWUKLWZvcm1hdHRlcl9wcm9maWxlPV9jb3JlCi1mb3JtYXR0ZXJfc2V0dGluZ3NfdmVyc2lvbj0xMQotb3JnLmVjbGlwc2UuamR0LnVpLmlnbm9yZWxvd2VyY2FzZW5hbWVzPXRydWUKLW9yZy5lY2xpcHNlLmpkdC51aS5pbXBvcnRvcmRlcj07Ci1vcmcuZWNsaXBzZS5qZHQudWkub25kZW1hbmR0aHJlc2hvbGQ9Mwotb3JnLmVjbGlwc2UuamR0LnVpLnN0YXRpY29uZGVtYW5kdGhyZXNob2xkPTMKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04IiBzdGFuZGFsb25lXD0ibm8iPz48dGVtcGxhdGVzLz4KLXNwX2NsZWFudXAuYWRkX2RlZmF1bHRfc2VyaWFsX3ZlcnNpb25faWQ9dHJ1ZQotc3BfY2xlYW51cC5hZGRfZ2VuZXJhdGVkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX21pc3NpbmdfZGVwcmVjYXRlZF9hbm5vdGF0aW9ucz10cnVlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLmFkZF9taXNzaW5nX292ZXJyaWRlX2Fubm90YXRpb25zPXRydWUKLXNwX2NsZWFudXAuYWRkX3NlcmlhbF92ZXJzaW9uX2lkPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfYmxvY2tzPXRydWUKLXNwX2NsZWFudXAuYWx3YXlzX3VzZV9wYXJlbnRoZXNlc19pbl9leHByZXNzaW9ucz1mYWxzZQotc3BfY2xlYW51cC5hbHdheXNfdXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmFsd2F5c191c2VfdGhpc19mb3Jfbm9uX3N0YXRpY19tZXRob2RfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLmNvbnZlcnRfdG9fZW5oYW5jZWRfZm9yX2xvb3A9ZmFsc2UKLXNwX2NsZWFudXAuZm9ybWF0X3NvdXJjZV9jb2RlPXRydWUKLXNwX2NsZWFudXAubWFrZV9sb2NhbF92YXJpYWJsZV9maW5hbD1mYWxzZQotc3BfY2xlYW51cC5tYWtlX3BhcmFtZXRlcnNfZmluYWw9ZmFsc2UKLXNwX2NsZWFudXAubWFrZV9wcml2YXRlX2ZpZWxkc19maW5hbD10cnVlCi1zcF9jbGVhbnVwLm1ha2VfdmFyaWFibGVfZGVjbGFyYXRpb25zX2ZpbmFsPXRydWUKLXNwX2NsZWFudXAubmV2ZXJfdXNlX2Jsb2Nrcz1mYWxzZQotc3BfY2xlYW51cC5uZXZlcl91c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9dHJ1ZQotc3BfY2xlYW51cC5vbl9zYXZlX3VzZV9hZGRpdGlvbmFsX2FjdGlvbnM9ZmFsc2UKLXNwX2NsZWFudXAub3JnYW5pemVfaW1wb3J0cz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX2ZpZWxkX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX2luc3RhbmNlc193aXRoX2RlY2xhcmluZ19jbGFzcz10cnVlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21lbWJlcl9hY2Nlc3Nlc190aHJvdWdoX3N1YnR5cGVzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPXRydWUKLXNwX2NsZWFudXAucXVhbGlmeV9zdGF0aWNfbWVtYmVyX2FjY2Vzc2VzX3dpdGhfZGVjbGFyaW5nX2NsYXNzPWZhbHNlCi1zcF9jbGVhbnVwLnF1YWxpZnlfc3RhdGljX21ldGhvZF9hY2Nlc3Nlc193aXRoX2RlY2xhcmluZ19jbGFzcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfcHJpdmF0ZV9jb25zdHJ1Y3RvcnM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdHJhaWxpbmdfd2hpdGVzcGFjZXM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3RyYWlsaW5nX3doaXRlc3BhY2VzX2FsbD10cnVlCi1zcF9jbGVhbnVwLnJlbW92ZV90cmFpbGluZ193aGl0ZXNwYWNlc19pZ25vcmVfZW1wdHk9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X2Nhc3RzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VubmVjZXNzYXJ5X25sc190YWdzPWZhbHNlCi1zcF9jbGVhbnVwLnJlbW92ZV91bnVzZWRfaW1wb3J0cz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX2xvY2FsX3ZhcmlhYmxlcz1mYWxzZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfZmllbGRzPXRydWUKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAucmVtb3ZlX3VudXNlZF9wcml2YXRlX21ldGhvZHM9dHJ1ZQotc3BfY2xlYW51cC5yZW1vdmVfdW51c2VkX3ByaXZhdGVfdHlwZXM9dHJ1ZQotc3BfY2xlYW51cC5zb3J0X21lbWJlcnM9ZmFsc2UKLXNwX2NsZWFudXAuc29ydF9tZW1iZXJzX2FsbD1mYWxzZQotc3BfY2xlYW51cC51c2VfYmxvY2tzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV9ibG9ja3Nfb25seV9mb3JfcmV0dXJuX2FuZF90aHJvdz1mYWxzZQotc3BfY2xlYW51cC51c2VfcGFyZW50aGVzZXNfaW5fZXhwcmVzc2lvbnM9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfZmllbGRfYWNjZXNzPWZhbHNlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX2ZpZWxkX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCi1zcF9jbGVhbnVwLnVzZV90aGlzX2Zvcl9ub25fc3RhdGljX21ldGhvZF9hY2Nlc3M9ZmFsc2UKLXNwX2NsZWFudXAudXNlX3RoaXNfZm9yX25vbl9zdGF0aWNfbWV0aG9kX2FjY2Vzc19vbmx5X2lmX25lY2Vzc2FyeT10cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmYzM4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvcjtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMC5xdWFsaWZpZXIKLUJ1bmRsZS1OYW1lOiAlYnVuZGxlTmFtZQotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci5BY3RpdmF0b3IKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuY29uc29sZTt2ZXJzaW9uPSIxLjAuMCI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLmRhdGFsb2NhdGlvbjt2ZXJzaW9uPSIxLjAuMCI7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCi0gb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyO3ZlcnNpb249IjEuMi4wIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcub3NnaS5mcmFtZXdvcms7dmVyc2lvbj0iMS4zLjAiLAotIG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluO3ZlcnNpb249IjEuMi4wIiwKLSBvcmcub3NnaS5zZXJ2aWNlLnN0YXJ0bGV2ZWw7dmVyc2lvbj0iMS4wLjAiLAotIG9yZy5vc2dpLnV0aWwudHJhY2tlcjt2ZXJzaW9uPSIxLjMuMCIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aSIKLUJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBDREMtMS4xL0ZvdW5kYXRpb24tMS4xLAotIEoyU0UtMS40CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDIzMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIKLSAgICAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiLz4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLSAKLTxwPkp1bmUgMiwgMjAwNjwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIAotaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSAKLWF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIAotYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIAotcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmciPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmc8L2E+LjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM3MmU1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1zb3VyY2UuLiA9IHNyYy8KLW91dHB1dC4uID0gYmluLwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotcXVhbGlmaWVyPWNvbnRleHQKLXNyYy5pbmNsdWRlcyA9IGFib3V0Lmh0bWwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvbG9jYWxidWlsZC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL2xvY2FsYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWQ3ZmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvbG9jYWxidWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAKLSAgICAgTWFyIDE0LCAyMDA3IDExOjE3OjAyIEFNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgICBwcm9qZWN0ICAgIAotICAgICBkZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgIAotICAgICBBZG1pbmlzdHJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHByb2plY3QgbmFtZT0icHJvamVjdCIgZGVmYXVsdD0iZGVmYXVsdCI+Ci0JPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgZGVzY3JpcHRpb24KLSAgICA8L2Rlc2NyaXB0aW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCi0gICAgICAgICAgdGFyZ2V0OiBkZWZhdWx0ICAgICAgICAgICAgICAKLSAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8dGFyZ2V0IG5hbWU9ImRlZmF1bHQiIGRlc2NyaXB0aW9uPSItLT4gZGVzY3JpcHRpb24iPgotCQk8ZWNobyBtZXNzYWdlPSJiZCBpcyAke2J1aWxkRGlyZWN0b3J5fSIvPgotCQk8dHN0YW1wLz4KLQkJPGVjbGlwc2UuYnVpbGRTY3JpcHQgZWxlbWVudHM9InBsdWdpbkBvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIgCi0JCQlidWlsZERpcmVjdG9yeT0iJHtidWlsZERpcmVjdG9yeX0iIAotCQkJY29uZmlnSW5mbz0iKiwqLCoiIAotCQkJYmFzZUxvY2F0aW9uPSIke2Jhc2VMb2NhdGlvbn0iIAotCQkJYnVpbGRpbmdPU0dpPSJ0cnVlIiAKLQkJCW91dHB1dFVwZGF0ZUphcnM9ImZhbHNlIgotCQkJcGx1Z2lucGF0aD0iJHt0aGlzUGx1Z2lufSIKLQkJCWZvcmNlQ29udGV4dFF1YWxpZmllcj0ieiR7RFNUQU1QfSR7VFNUQU1QfSIKLQkJCS8+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiB0YXJnZXQ9ImJ1aWxkLmphcnMiLz4KLQkJPGFudCBhbnRmaWxlPSJidWlsZC54bWwiIHRhcmdldD0iYnVpbGQudXBkYXRlLmphciIvPgotCQk8bW92ZSB0b2Rpcj0iJHt0YXJnZXRGb2xkZXJ9IiBpbmNsdWRlRW1wdHlEaXJzPSJubyIgZmFpbG9uZXJyb3I9InllcyI+Ci0JCQk8ZmlsZXNldCBkaXI9IiR7YmFzZWRpcn0iPgotCQkJCTxpbmNsdWRlIG5hbWU9IiouamFyIi8+Ci0JCQk8L2ZpbGVzZXQ+Ci0JCQk8cmVnZXhwbWFwcGVyIGZyb209Il4oLiopXy4qJCIgdG89IlwxLmphciIvPgotCQk8L21vdmU+Ci0JCTxhbnQgYW50ZmlsZT0iYnVpbGQueG1sIiB0YXJnZXQ9ImNsZWFuIi8+Ci0JCTxkZWxldGUgZmlsZT0iYnVpbGQueG1sIi8+Ci0JCTxkZWxldGUgZmlsZT0iamF2YUNvbXBpbGVyLi4uYXJncyIvPgotCTwvdGFyZ2V0PgotCi0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2JlNWQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1idW5kbGVOYW1lPSBTaW1wbGUgQ29uZmlndXJhdG9yCi1wcm92aWRlck5hbWU9IEVjbGlwc2Uub3JnCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29uZmlndXJhdG9yL0NvbmZpZ3VyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9jb25maWd1cmF0b3IvQ29uZmlndXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyOTFlYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9wcm92aXNpb25hbC9jb25maWd1cmF0b3IvQ29uZmlndXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5jb25maWd1cmF0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotLyoqCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSByZWdpc3RlcmVkIGludG8gYSBzZXJ2aWNlIHJlZ2lzdHJ5Ci0gKiBieSBhIENvbmZpZ3VyYXRvciBCdW5kbGUuCi0gKiAKLSAqIFRoZSBjbGllbnQgYnVuZGxlIGNhbiBhcHBseSBjb25maWd1cmF0aW9uIHdoaWNoIGNhbiBiZSBpbnRlcnByZXRlZCBieSByZWZlcnJpbmcKLSAqIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gdG8gdGhlIGN1cnJlbnQgcnVubmluZyBPU0dpIGVudmlyb25tZW50LiBJbiBhZGRpdGlvbiwgCi0gKiB0aGUgY2xpZW50IGNhbiBleHBlY3QgYnVuZGxlIHN0YXRlIGluIGFkdmFuY2UgLiAgCi0gKiAKLSAqIFRPRE86IHRoaXMgaW50ZXJmYWNlIG1pZ2h0IG5vdCBiZSByZXF1aXJlZCB0byBiZSBkZWZpbmVkLgotICogCi0gKiAKLSAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIEN1cnJlbnQgRGVmaW5pdGlvbiBvZiBDb25maWd1cmF0b3IgQnVuZGxlOiAKLSAqIAotICogQ29uZmlndXJhdG9yIEJ1bmRsZSB3aWxsIGRvIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uIGF0IGl0cyBzdGFydHVwLgotICogCi0gKiAxLiBDcmVhdGUgYSBDb25maWd1cmF0b3Igb2JqZWN0LgotICogMi4gUmVnaXN0ZXIgaXQgYXMgYSBzZXJ2aWNlIHRvIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5LgotICogMy4gR2V0IHdoZXJlIHRvIHJlYWQgZm9yIGtub3dpbmcgd2hhdCBraW5kcyBvZiBidW5kbGVzIGluIGl0cyBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbnQgd2F5LgotICogNC4gQ2FsbCB7QGxpbmsgQ29uZmlndXJhdG9yI2FwcGx5Q29uZmlndXJhdGlvbihVUkwpfSB3aXRoIHRoZSBVUkwuCi0gKiAKLSAqIEF0IGl0cyBzdG9wcGluZywgdGhlIHNlcnZpY2UgcmVnaXN0ZXJlZCB3aWxsIGJlIHVucmVnaXN0ZXJlZC4KLSAqIAotICogQHNlZSBDb25maWd1cmF0b3JNYW5pcHVsYXRvcgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBDb25maWd1cmF0b3IgewotCi0JLyoqCi0JICogQXBwbHkgY29uZmlndXJhdGlvbiByZWFkIGZyb20gdGhlIHNwZWNpZmllZCB1cmwgdG8gdGhlIE9TR2kgCi0JICogZW52aXJvbm1lbnQgY3VycmVudGx5IHJ1bm5pbmcuCi0JICogCi0JICogQHBhcmFtIHVybCBVUkwgdG8gYmUgcmVhZC4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gSWYgcmVhZGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgdXJsIGZhaWxzLiAKLQkgKi8KLQl2b2lkIGFwcGx5Q29uZmlndXJhdGlvbihVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBBcHBseSBjb25maWd1cmF0aW9uIHJlYWQgZnJvbSB0aGUgcHJldmlvdXNseSB1c2VkIHVybCB0byB0aGUgT1NHaSAKLQkgKiBlbnZpcm9ubWVudCBjdXJyZW50bHkgcnVubmluZy4gSWYgaXQgaXMgbmV2ZXIgdXNlZCwgZG8gbm90aGluZy4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0gSWYgcmVhZGluZyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzcGVjaWZpZWQgdXJsIGZhaWxzLiAKLQkgKi8KLQl2b2lkIGFwcGx5Q29uZmlndXJhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybiB0aGUgdXJsIGluIHVzZS4KLQkgKiBJZiBpdCBpcyBuZXZlciB1c2VkLCByZXR1cm4gbnVsbC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JVVJMIGdldFVybEluVXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9BY3RpdmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL0FjdGl2YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzNkZjI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL0FjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IudXRpbHMuRXF1aW5veFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLnV0aWxzLlNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuKjsKLQotLyoqCi0gKiBBdCBpdHMgc3RhcnQsIFNpbXBsZUNvbmZpZ3VyYXRvciBidW5kbGUgZG9lcyB0aGUgZm9sbG93aW5ncy4KLSAqIAotICogMS4gQSB2YWx1ZSB3aWxsIGJlIGdvdHRlbiBieSBAe2xpbmsgQnVuZGxlQ29udGV4dCNnZXRQcm9wZXJ0eShrZXkpfSB3aXRoIAotICoge0BsaW5rIFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cyNQUk9QX0tFWV9DT05GSUdVUkx9IGFzIGEga2V5LgotICogVGhlIHZhbHVlIHdpbGwgYmUgdXNlZCBmb3IgdGhlIHJlZmVyYWwgVVJMLiBVbmRlciB0aGUgdXJsLCB0aGVyZSBtdXN0IGJlIGEgc2ltcGxlIAotICogYnVuZGxlcyBsaXN0IGZpbGUgdG8gYmUgaW5zdGFsbGVkIHdpdGggdGhpZXIgc3RhcnQgbGV2ZWwgYW5kIGZsYWcgb2YgbWFya2VkIGFzIHN0YXJ0ZWQuCi0gKiAKLSAqIDIuIElmIHRoZSB2YWx1ZSBpcyBudWxsLCBkbyBub3RoaW5nIGFueSBtb3JlLgotICogMy4gT3RoZXJ3aXNlLCByZXRyaWV2ZSB0aGUgYnVuZGxlcyBsaXN0IGZyb20gdGhlIHVybCBhbmQgaW5zdGFsbCwKLSAqICBzZXQgc3RhcnQgbGV2ZWwgb2YgYW5kIHN0YXJ0IGJ1bmRsZXMsIGFzIHNwZWNpZmllZC4KLSAqIAotICogNC4gQSB2YWx1ZSB3aWxsIGJlIGdvdHRlbiBieSBAe2xpbmsgQnVuZGxlQ29udGV4dCNnZXRQcm9wZXJ0eShrZXkpfSB3aXRoIAotICoge0BsaW5rIFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cyNQUk9QX0tFWV9FWENMVVNJVkVfSU5TVEFMTEFUSU9OfSBhcyBhIGtleS4KLSAqIAotICogNS4gSWYgaXQgZXF1YWxzICJmYWxzZSIsIGl0IHdpbGwgZG8gZXhjbHVzaXZlIGluc3RhbGxhdGlvbiwgd2hpY2ggbWVhbnMgdGhhdCAKLSAqIHRoZSBidW5kbGVzIHdpbGwgbm90IGJlIGxpc3RlZCBpbiB0aGUgc3BlY2lmaWVkIHVybCBidXQgaW5zdGFsbGVkIGF0IHRoZSB0aW1lCi0gKiBvZiB0aGUgbWV0aG9kIGNhbGwgZXhjZXB0IFN5c3RlbUJ1bmRsZSB3aWxsIGJlIHVuaW5zdGFsbGVkLiAKLSAqIE90aGVyd2lzZSwgbm8gdW5pbnN0YWxsYXRpb24gd2lsbCBub3QgYmUgZG9uZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQWN0aXZhdG9yIGltcGxlbWVudHMgQnVuZGxlQWN0aXZhdG9yIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlwcml2YXRlIFNlcnZpY2VSZWdpc3RyYXRpb24gY29uZmlndXJhdG9yUmVnaXN0cmF0aW9uOwotCXByaXZhdGUgU2VydmljZVJlZ2lzdHJhdGlvbiBjb21tYW5kUmVnaXN0cmF0aW9uOwotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU2ltcGxlQ29uZmlndXJhdG9ySW1wbCBidW5kbGVDb25maWd1cmF0b3IgPSBuZXcgU2ltcGxlQ29uZmlndXJhdG9ySW1wbChjb250ZXh0LCBjb250ZXh0LmdldEJ1bmRsZSgpKTsKLQkJYnVuZGxlQ29uZmlndXJhdG9yLmFwcGx5Q29uZmlndXJhdGlvbigpOwotCi0JCURpY3Rpb25hcnkgcHJvcHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCXByb3BzLnB1dChDb25zdGFudHMuU0VSVklDRV9WRU5ET1IsICJFY2xpcHNlIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJvcHMucHV0KENvbnN0YW50cy5TRVJWSUNFX1BJRCwgU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLlRBUkdFVF9DT05GSUdVUkFUT1JfTkFNRSk7Ci0JCVNlcnZpY2VGYWN0b3J5IGNvbmZpZ3VyYXRpb25GYWN0b3J5ID0gbmV3IFNpbXBsZUNvbmZpZ3VyYXRvckZhY3RvcnkoY29udGV4dCk7Ci0JCWNvbmZpZ3VyYXRvclJlZ2lzdHJhdGlvbiA9IGNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKENvbmZpZ3VyYXRvci5jbGFzcy5nZXROYW1lKCksIGNvbmZpZ3VyYXRpb25GYWN0b3J5LCBwcm9wcyk7Ci0KLQkJdHJ5IHsKLQkJCWlmIChudWxsICE9IGNvbnRleHQuZ2V0QnVuZGxlKCkubG9hZENsYXNzKCJvcmcuZWNsaXBzZS5vc2dpLmZyYW1ld29yay5jb25zb2xlLkNvbW1hbmRQcm92aWRlciIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29tbWFuZFJlZ2lzdHJhdGlvbiA9IEVxdWlub3hVdGlscy5yZWdpc3RlckNvbnNvbGVDb21tYW5kcyhjb250ZXh0KTsKLQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBDb21tYW5kUHJvdmlkZXIgaXMgbm90IGF2YWlsYWJsZQotCQkJLy8gT2sgLS0gb3B0aW9uYWwKLQkJfQotCi0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVnaXN0ZXJlZCBDb25maWd1cmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGNvbmZpZ3VyYXRvclJlZ2lzdHJhdGlvbiAhPSBudWxsKSB7Ci0JCQljb25maWd1cmF0b3JSZWdpc3RyYXRpb24udW5yZWdpc3RlcigpOwotCQkJY29uZmlndXJhdG9yUmVnaXN0cmF0aW9uID0gbnVsbDsKLQkJfQotCQlpZiAoY29tbWFuZFJlZ2lzdHJhdGlvbiAhPSBudWxsKSB7Ci0JCQljb21tYW5kUmVnaXN0cmF0aW9uLnVucmVnaXN0ZXIoKTsKLQkJCWNvbW1hbmRSZWdpc3RyYXRpb24gPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvQ29uZmlnQXBwbGllci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvQ29uZmlnQXBwbGllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODA2NDJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL0NvbmZpZ0FwcGxpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3LCAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCi0gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLAotICogYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci51dGlscy4qOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay4qOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucGFja2FnZWFkbWluLlBhY2thZ2VBZG1pbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnN0YXJ0bGV2ZWwuU3RhcnRMZXZlbDsKLQotY2xhc3MgQ29uZmlnQXBwbGllciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExBU1RfQlVORExFU19UWFQgPSAibGFzdC5idW5kbGVzLmluZm8iOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIEJ1bmRsZUNvbnRleHQgbWFuaXB1bGF0aW5nQ29udGV4dDsKLQlwcml2YXRlIFBhY2thZ2VBZG1pbiBhZG1pblNlcnZpY2UgPSBudWxsOwotCXByaXZhdGUgU3RhcnRMZXZlbCBzdGFydExldmVsU2VydmljZSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJ1bm5pbmdPbkVxdWlub3g7Ci0JcHJpdmF0ZSBib29sZWFuIGNoZWNrTWFuaWZlc3RCZWZvcmVJbnN0YWxsID0gZmFsc2U7Ci0KLQlwcml2YXRlIEJ1bmRsZSBjYWxsaW5nQnVuZGxlOwotCi0JQ29uZmlnQXBwbGllcihCdW5kbGVDb250ZXh0IGNvbnRleHQsIEJ1bmRsZSBjYWxsaW5nQnVuZGxlKSB7Ci0JCXRoaXMubWFuaXB1bGF0aW5nQ29udGV4dCA9IGNvbnRleHQ7Ci0JCXRoaXMuY2FsbGluZ0J1bmRsZSA9IGNhbGxpbmdCdW5kbGU7Ci0JCS8vU3RyaW5nIHZlbmRvciA9IGNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZSQU1FV09SS19WRU5ET1IpOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigidmVuZG9yPSIgKyB2ZW5kb3IpOwotCQl0aGlzLnJ1bm5pbmdPbkVxdWlub3ggPSAiRWNsaXBzZSIuZXF1YWxzKGNvbnRleHQuZ2V0UHJvcGVydHkoQ29uc3RhbnRzLkZSQU1FV09SS19WRU5ET1IpKTsgLy8kTk9OLU5MUy0xJAotCQlTZXJ2aWNlUmVmZXJlbmNlIHBhY2thZ2VBZG1pblJlZiA9IG1hbmlwdWxhdGluZ0NvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShQYWNrYWdlQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKHBhY2thZ2VBZG1pblJlZiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTm8gUGFja2FnZUFkbWluIHNlcnZpY2UgaXMgYXZhaWxhYmxlLiIpOyAvLyROT04tTkxTLTEkCi0KLQkJYWRtaW5TZXJ2aWNlID0gKFBhY2thZ2VBZG1pbikgbWFuaXB1bGF0aW5nQ29udGV4dC5nZXRTZXJ2aWNlKHBhY2thZ2VBZG1pblJlZik7Ci0KLQkJU2VydmljZVJlZmVyZW5jZSBzdGFydExldmVsUmVmID0gbWFuaXB1bGF0aW5nQ29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKFN0YXJ0TGV2ZWwuY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKHN0YXJ0TGV2ZWxSZWYgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5vIFN0YXJ0TGV2ZWxTZXJ2aWNlIHNlcnZpY2UgaXMgYXZhaWxhYmxlLiIpOyAvLyROT04tTkxTLTEkCi0JCXN0YXJ0TGV2ZWxTZXJ2aWNlID0gKFN0YXJ0TGV2ZWwpIG1hbmlwdWxhdGluZ0NvbnRleHQuZ2V0U2VydmljZShzdGFydExldmVsUmVmKTsKLQotCX0KLQotCXZvaWQgaW5zdGFsbChCdW5kbGVJbmZvW10gZXhwZWN0ZWRTdGF0ZSwgVVJMIHVybCwgYm9vbGVhbiBleGNsdXNpdmVNb2RlKSB7Ci0JCUhhc2hTZXQgdG9Vbmluc3RhbGwgPSBudWxsOwotCQlpZiAoIWV4Y2x1c2l2ZU1vZGUpIHsKLQkJCUJ1bmRsZUluZm9bXSBsYXN0SW5zdGFsbGVkQnVuZGxlcyA9IGdldExhc3RTdGF0ZSgpOwotCQkJaWYgKGxhc3RJbnN0YWxsZWRCdW5kbGVzICE9IG51bGwpIHsKLQkJCQl0b1VuaW5zdGFsbCA9IG5ldyBIYXNoU2V0KEFycmF5cy5hc0xpc3QobGFzdEluc3RhbGxlZEJ1bmRsZXMpKTsKLQkJCQl0b1VuaW5zdGFsbC5yZW1vdmVBbGwoQXJyYXlzLmFzTGlzdChleHBlY3RlZFN0YXRlKSk7Ci0JCQl9Ci0JCQlzYXZlU3RhdGVBc0xhc3QodXJsKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gcHJldm91c2x5UmVzb2x2ZWQgPSBnZXRSZXNvbHZlZEJ1bmRsZXMoKTsKLQkJQ29sbGVjdGlvbiB0b1JlZnJlc2ggPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUNvbGxlY3Rpb24gdG9TdGFydCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGV4Y2x1c2l2ZU1vZGUpIHsKLQkJCXRvUmVmcmVzaC5hZGRBbGwoaW5zdGFsbEJ1bmRsZXMoZXhwZWN0ZWRTdGF0ZSwgdG9TdGFydCkpOwotCQkJdG9SZWZyZXNoLmFkZEFsbCh1bmluc3RhbGxCdW5kbGVzKGV4cGVjdGVkU3RhdGUsIGFkbWluU2VydmljZSkpOwotCQl9IGVsc2UgewotCQkJdG9SZWZyZXNoLmFkZEFsbChpbnN0YWxsQnVuZGxlcyhleHBlY3RlZFN0YXRlLCB0b1N0YXJ0KSk7Ci0JCQlpZiAodG9Vbmluc3RhbGwgIT0gbnVsbCkKLQkJCQl0b1JlZnJlc2guYWRkQWxsKHVuaW5zdGFsbEJ1bmRsZXModG9Vbmluc3RhbGwpKTsKLQkJfQotCQlyZWZyZXNoUGFja2FnZXMoKEJ1bmRsZVtdKSB0b1JlZnJlc2gudG9BcnJheShuZXcgQnVuZGxlW3RvUmVmcmVzaC5zaXplKCldKSwgbWFuaXB1bGF0aW5nQ29udGV4dCk7Ci0JCWlmICh0b1JlZnJlc2guc2l6ZSgpID4gMCkKLQkJCXRyeSB7Ci0JCQkJbWFuaXB1bGF0aW5nQ29udGV4dC5nZXRCdW5kbGUoKS5sb2FkQ2xhc3MoIm9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5yZXNvbHZlci5QbGF0Zm9ybUFkbWluIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBub3cgc2VlIGlmIHRoZXJlIGFyZSBhbnkgY3VycmVudGx5IHJlc29sdmVkIGJ1bmRsZXMgd2l0aCBvcHRpb24gaW1wb3J0cyB3aGljaCBjb3VsZCBiZSByZXNvbHZlZCBvcgotCQkJCS8vIGlmIHRoZXJlIGFyZSBmcmFnbWVudHMgd2l0aCBhZGRpdGlvbmFsIGNvbnN0cmFpbnRzIHdoaWNoIGNvbmZsaWN0IHdpdGggYW4gYWxyZWFkeSByZXNvbHZlZCBob3N0Ci0JCQkJQnVuZGxlW10gYWRkaXRpb25hbFJlZnJlc2ggPSBTdGF0ZVJlc29sdmVyVXRpbHMuZ2V0QWRkaXRpb25hbFJlZnJlc2gocHJldm91c2x5UmVzb2x2ZWQsIG1hbmlwdWxhdGluZ0NvbnRleHQpOwotCQkJCWlmIChhZGRpdGlvbmFsUmVmcmVzaC5sZW5ndGggPiAwKQotCQkJCQlyZWZyZXNoUGFja2FnZXMoYWRkaXRpb25hbFJlZnJlc2gsIG1hbmlwdWxhdGluZ0NvbnRleHQpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjbmZlKSB7Ci0JCQkJLy8gZG8gbm90aGluZzsgbm8gcmVzb2x2ZXIgcGFja2FnZSBhdmFpbGFibGUKLQkJCX0KLQkJc3RhcnRCdW5kbGVzKChCdW5kbGVbXSkgdG9TdGFydC50b0FycmF5KG5ldyBCdW5kbGVbdG9TdGFydC5zaXplKCldKSk7Ci0JCS8vaWYgdGltZSBzdGFtcHMgYXJlIHRoZSBzYW1lCi0JCS8vICBkbyBub3RoaW5nCi0JCS8vICByZXR1cm4KLQkJLy9pZiBsaXN0IGV4aXN0cwotCQkvLyAgZm9yY2UgdGhlIGxpc3QgaW4gdGhlIGZ3awotCQkvL2Vsc2UKLQkJLy8gIGRpc2NvdmVyIGJ1bmRsZXMgaW4gZm9sZGVycyBhbmQgZm9yY2UgdGhlIGxpc3QgaW4gdGhlIGZ3awotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBnZXRSZXNvbHZlZEJ1bmRsZXMoKSB7Ci0JCUNvbGxlY3Rpb24gcmVzb2x2ZWQgPSBuZXcgSGFzaFNldCgpOwotCQlCdW5kbGVbXSBhbGxCdW5kbGVzID0gbWFuaXB1bGF0aW5nQ29udGV4dC5nZXRCdW5kbGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWxsQnVuZGxlcy5sZW5ndGg7IGkrKykKLQkJCWlmICgoYWxsQnVuZGxlc1tpXS5nZXRTdGF0ZSgpICYgKEJ1bmRsZS5JTlNUQUxMRUQgfCBCdW5kbGUuVU5JTlNUQUxMRUQpKSA9PSAwKQotCQkJCXJlc29sdmVkLmFkZChhbGxCdW5kbGVzW2ldKTsKLQkJcmV0dXJuIHJlc29sdmVkOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiB1bmluc3RhbGxCdW5kbGVzKEhhc2hTZXQgdG9Vbmluc3RhbGwpIHsKLQkJQ29sbGVjdGlvbiByZW1vdmVkQnVuZGxlcyA9IG5ldyBBcnJheUxpc3QodG9Vbmluc3RhbGwuc2l6ZSgpKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHRvVW5pbnN0YWxsLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCUJ1bmRsZUluZm8gY3VycmVudCA9IChCdW5kbGVJbmZvKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlCdW5kbGVbXSBtYXRjaGluZ0J1bmRsZXMgPSBhZG1pblNlcnZpY2UuZ2V0QnVuZGxlcyhjdXJyZW50LmdldFN5bWJvbGljTmFtZSgpLCBnZXRWZXJzaW9uUmFuZ2UoY3VycmVudC5nZXRWZXJzaW9uKCkpKTsKLQkJCWZvciAoaW50IGogPSAwOyBtYXRjaGluZ0J1bmRsZXMgIT0gbnVsbCAmJiBqIDwgbWF0Y2hpbmdCdW5kbGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVtb3ZlZEJ1bmRsZXMuYWRkKG1hdGNoaW5nQnVuZGxlc1tqXSk7Ci0JCQkJCW1hdGNoaW5nQnVuZGxlc1tqXS51bmluc3RhbGwoKTsKLQkJCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCQkvL1RPRE8gbG9nIGluIGRlYnVnIG1vZGUuLi4KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlbW92ZWRCdW5kbGVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlU3RhdGVBc0xhc3QoVVJMIHVybCkgewotCQlJbnB1dFN0cmVhbSBzb3VyY2VTdHJlYW0gPSBudWxsOwotCQlPdXRwdXRTdHJlYW0gZGVzdGluYXRpb25TdHJlYW0gPSBudWxsOwotCi0JCUZpbGUgbGFzdEJ1bmRsZXNUeHQgPSBnZXRMYXN0QnVuZGxlVHh0KCk7Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCWRlc3RpbmF0aW9uU3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obGFzdEJ1bmRsZXNUeHQpOwotCQkJCXNvdXJjZVN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJU2ltcGxlQ29uZmlndXJhdG9yVXRpbHMudHJhbnNmZXJTdHJlYW1zKHNvdXJjZVN0cmVhbSwgZGVzdGluYXRpb25TdHJlYW0pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZGVzdGluYXRpb25TdHJlYW0gIT0gbnVsbCkKLQkJCQkJZGVzdGluYXRpb25TdHJlYW0uY2xvc2UoKTsKLQkJCQlpZiAoc291cmNlU3RyZWFtICE9IG51bGwpCi0JCQkJCXNvdXJjZVN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvL25vdGhpbmcKLQkJfQotCX0KLQotCXByaXZhdGUgRmlsZSBnZXRMYXN0QnVuZGxlVHh0KCkgewotCQlyZXR1cm4gbWFuaXB1bGF0aW5nQ29udGV4dC5nZXREYXRhRmlsZShMQVNUX0JVTkRMRVNfVFhUKTsKLQl9Ci0KLQlwcml2YXRlIEJ1bmRsZUluZm9bXSBnZXRMYXN0U3RhdGUoKSB7Ci0JCUZpbGUgbGFzdEJ1bmRsZXNUeHQgPSBnZXRMYXN0QnVuZGxlVHh0KCk7Ci0JCWlmICghbGFzdEJ1bmRsZXNUeHQuaXNGaWxlKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKLQkJCXJldHVybiAoQnVuZGxlSW5mb1tdKSBTaW1wbGVDb25maWd1cmF0b3JVdGlscy5yZWFkQ29uZmlndXJhdGlvbihsYXN0QnVuZGxlc1R4dC50b1VSTCgpKS50b0FycmF5KG5ldyBCdW5kbGVJbmZvWzFdKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBpbnN0YWxsQnVuZGxlcyhCdW5kbGVJbmZvW10gZmluYWxMaXN0LCBDb2xsZWN0aW9uIHRvU3RhcnQpIHsKLQkJQXJyYXlMaXN0IGluc3RhbGxlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy9wcmludFN5c3RlbUJ1bmRsZSgpOwotCi0JCWJvb2xlYW4gdXNlUmVmZXJlbmNlID0gdHJ1ZTsKLQkJaWYgKG1hbmlwdWxhdGluZ0NvbnRleHQuZ2V0UHJvcGVydHkoU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLlBST1BfS0VZX1VTRV9SRUZFUkVOQ0UpID09IG51bGwpCi0JCQl1c2VSZWZlcmVuY2UgPSB0cnVlOwotCQllbHNlCi0JCQl1c2VSZWZlcmVuY2UgPSBCb29sZWFuLnZhbHVlT2YobWFuaXB1bGF0aW5nQ29udGV4dC5nZXRQcm9wZXJ0eShTaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMuUFJPUF9LRVlfVVNFX1JFRkVSRU5DRSkpLmJvb2xlYW5WYWx1ZSgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmluYWxMaXN0Lmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoZmluYWxMaXN0W2ldID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQkvL1RPRE8gaGVyZSB3ZSBkbyBub3QgZGVhbCB3aXRoIGJ1bmRsZXMgdGhhdCBkb24ndCBoYXZlIGEgc3ltYm9saWMgaWQKLQkJCS8vVE9ETyBOZWVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBnZXRCdW5kbGVzIHJldHVybiBtdWx0aXBsZSB2YWx1ZQotCi0JCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gZmluYWxMaXN0W2ldLmdldFN5bWJvbGljTmFtZSgpOwotCQkJU3RyaW5nIHZlcnNpb24gPSBmaW5hbExpc3RbaV0uZ2V0VmVyc2lvbigpOwotCi0JCQlpZiAoY2hlY2tNYW5pZmVzdEJlZm9yZUluc3RhbGwpIHsKLQkJCQlEaWN0aW9uYXJ5IG1hbmlmZXN0ID0gVXRpbHMuZ2V0T1NHaU1hbmlmZXN0KGZpbmFsTGlzdFtpXS5nZXRMb2NhdGlvbigpKTsKLQkJCQlpZiAobWFuaWZlc3QgPT0gbnVsbCkgewotCQkJCQlVdGlscy5sb2coMSwgbnVsbCwgbnVsbCwgIk5vIGJ1bmRsZSBmb3VuZCBhdDogIiArIGZpbmFsTGlzdFtpXS5nZXRMb2NhdGlvbigpLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmaW5hbExpc3RbaV0gPSBudWxsOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQkvL2lmIChtYW5pZmVzdCAhPSBudWxsKQotCQkJCXRyeSB7Ci0JCQkJCXN5bWJvbGljTmFtZSA9IChTdHJpbmcpIG1hbmlmZXN0LmdldChDb25zdGFudHMuQlVORExFX1NZTUJPTElDTkFNRSk7Ci0JCQkJfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiByZSkgewotCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oImNhbm5vdCBnZXQgTWFuaWZlc3QgOiIgKyBmaW5hbExpc3RbaV0pOyAvLyROT04tTkxTLTEkCi0JCQkJCXRocm93IHJlOwotCQkJCX0KLQkJCQlpZiAoc3ltYm9saWNOYW1lICE9IG51bGwgJiYgc3ltYm9saWNOYW1lLmluZGV4T2YoJzsnKSAhPSAtMSkKLQkJCQkJc3ltYm9saWNOYW1lID0gc3ltYm9saWNOYW1lLnN1YnN0cmluZygwLCBzeW1ib2xpY05hbWUuaW5kZXhPZignOycpKS50cmltKCk7Ci0KLQkJCQl2ZXJzaW9uID0gKFN0cmluZykgbWFuaWZlc3QuZ2V0KENvbnN0YW50cy5CVU5ETEVfVkVSU0lPTik7Ci0JCQl9Ci0KLQkJCUJ1bmRsZVtdIG1hdGNoZXMgPSBudWxsOwotCQkJaWYgKHN5bWJvbGljTmFtZSAhPSBudWxsICYmIHZlcnNpb24gIT0gbnVsbCkKLQkJCQltYXRjaGVzID0gYWRtaW5TZXJ2aWNlLmdldEJ1bmRsZXMoc3ltYm9saWNOYW1lLCBnZXRWZXJzaW9uUmFuZ2UodmVyc2lvbikpOwotCi0JCQlCdW5kbGUgY3VycmVudCA9IG1hdGNoZXMgPT0gbnVsbCA/IG51bGwgOiAobWF0Y2hlcy5sZW5ndGggPT0gMCA/IG51bGwgOiBtYXRjaGVzWzBdKTsKLQkJCWlmIChjdXJyZW50ID09IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlTdHJpbmcgbG9jYXRpb24gPSBmaW5hbExpc3RbaV0uZ2V0TG9jYXRpb24oKTsKLQkJCQkJaWYgKGxvY2F0aW9uID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKHJ1bm5pbmdPbkVxdWlub3ggJiYgdXNlUmVmZXJlbmNlICYmIGxvY2F0aW9uLnN0YXJ0c1dpdGgoImZpbGU6IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWxvY2F0aW9uID0gInJlZmVyZW5jZToiICsgbG9jYXRpb247IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkvL1RPRE8gTmVlZCB0byBlbGltaW5hdGUgU3lzdGVtIEJ1bmRsZS4KLQkJCQkJLy8gSWYgYSBzeXN0ZW0gYnVuZGxlIGRvZXNuJ3QgaGF2ZSBhIFN5bWJvbGljTmFtZSBoZWFkZXIsIGxpa2UgS25vcGZsZXJmaXNoIDQuMC4wLAotCQkJCQkvLyBpdCB3aWxsIGJlIGluc3RhbGxlZCB1bmZvcnR1bmF0ZWx5LiAKLQkJCQkJY3VycmVudCA9IG1hbmlwdWxhdGluZ0NvbnRleHQuaW5zdGFsbEJ1bmRsZShsb2NhdGlvbik7Ci0JCQkJCWlmIChBY3RpdmF0b3IuREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImluc3RhbGxlZCBidW5kbGU6IiArIGZpbmFsTGlzdFtpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaW5zdGFsbGVkLmFkZChjdXJyZW50KTsKLQkJCQl9IGNhdGNoIChCdW5kbGVFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoQWN0aXZhdG9yLkRFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oIkNhbid0IGluc3RhbGwgIiArIHN5bWJvbGljTmFtZSArICcvJyArIHZlcnNpb24gKyAiIGZyb20gbG9jYXRpb24gIiArIGZpbmFsTGlzdFtpXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQkJCWludCBzdGFydExldmVsID0gZmluYWxMaXN0W2ldLmdldFN0YXJ0TGV2ZWwoKTsKLQkJCWlmIChzdGFydExldmVsICE9IEJ1bmRsZUluZm8uTk9fTEVWRUwpCi0JCQkJaWYgKGN1cnJlbnQuZ2V0QnVuZGxlSWQoKSAhPSAwKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gY3VycmVudC5nZXRTeW1ib2xpY05hbWUoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChzdGFydExldmVsID4gMCkKLQkJCQkJCQlpZiAoIVNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5UQVJHRVRfQ09ORklHVVJBVE9SX05BTUUuZXF1YWxzKG5hbWUpKQotCQkJCQkJCQlzdGFydExldmVsU2VydmljZS5zZXRCdW5kbGVTdGFydExldmVsKGN1cnJlbnQsIHN0YXJ0TGV2ZWwpOwotCQkJCQl9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKLQkJCQkJCVV0aWxzLmxvZyg0LCBudWxsLCBudWxsLCAiRmFpbGVkIHRvIHNldCBzdGFydCBsZXZlbCBvZiBCdW5kbGU6IiArIGZpbmFsTGlzdFtpXSwgZXgpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQlpZiAoZmluYWxMaXN0W2ldLmlzTWFya2VkQXNTdGFydGVkKCkpIHsKLQkJCQl0b1N0YXJ0LmFkZChjdXJyZW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5zdGFsbGVkOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWZyZXNoUGFja2FnZXMoQnVuZGxlW10gYnVuZGxlcywgQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCWlmIChidW5kbGVzLmxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCQlTZXJ2aWNlUmVmZXJlbmNlIHBhY2thZ2VBZG1pblJlZiA9IGNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShQYWNrYWdlQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJUGFja2FnZUFkbWluIHBhY2thZ2VBZG1pbiA9IG51bGw7Ci0JCWlmIChwYWNrYWdlQWRtaW5SZWYgIT0gbnVsbCkgewotCQkJcGFja2FnZUFkbWluID0gKFBhY2thZ2VBZG1pbikgY29udGV4dC5nZXRTZXJ2aWNlKHBhY2thZ2VBZG1pblJlZik7Ci0JCQlpZiAocGFja2FnZUFkbWluID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCWZpbmFsIGJvb2xlYW5bXSBmbGFnID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2V9OwotCQlGcmFtZXdvcmtMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBGcmFtZXdvcmtMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGZyYW1ld29ya0V2ZW50KEZyYW1ld29ya0V2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBGcmFtZXdvcmtFdmVudC5QQUNLQUdFU19SRUZSRVNIRUQpIHsKLQkJCQkJc3luY2hyb25pemVkIChmbGFnKSB7Ci0JCQkJCQlmbGFnWzBdID0gdHJ1ZTsKLQkJCQkJCWZsYWcubm90aWZ5QWxsKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCWNvbnRleHQuYWRkRnJhbWV3b3JrTGlzdGVuZXIobGlzdGVuZXIpOwotCQlwYWNrYWdlQWRtaW4ucmVmcmVzaFBhY2thZ2VzKGJ1bmRsZXMpOwotCQlzeW5jaHJvbml6ZWQgKGZsYWcpIHsKLQkJCXdoaWxlICghZmxhZ1swXSkgewotCQkJCXRyeSB7Ci0JCQkJCWZsYWcud2FpdCgpOwotCQkJCX0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy9pZ25vcmUKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8JCWlmIChERUJVRykgewotCQkvLwkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkvLwkJCQlTeXN0ZW0ub3V0LnByaW50bG4oU2ltcGxlQ29uZmlndXJhdG9yVXRpbHMuZ2V0QnVuZGxlU3RhdGVTdHJpbmcoYnVuZGxlc1tpXSkpOwotCQkvLwkJCX0KLQkJLy8JCX0KLQkJY29udGV4dC5yZW1vdmVGcmFtZXdvcmtMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCWNvbnRleHQudW5nZXRTZXJ2aWNlKHBhY2thZ2VBZG1pblJlZik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0QnVuZGxlcyhCdW5kbGVbXSBidW5kbGVzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVuZGxlcy5sZW5ndGg7IGkrKykgewotCQkJQnVuZGxlIGJ1bmRsZSA9IGJ1bmRsZXNbaV07Ci0JCQlpZiAoYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLlNUQVJUSU5HICYmIChidW5kbGUgPT0gY2FsbGluZ0J1bmRsZSB8fCBidW5kbGUgPT0gbWFuaXB1bGF0aW5nQ29udGV4dC5nZXRCdW5kbGUoKSkpCi0JCQkJY29udGludWU7Ci0KLQkJCXRyeSB7Ci0JCQkJYnVuZGxlLnN0YXJ0KCk7Ci0JCQkJaWYgKEFjdGl2YXRvci5ERUJVRykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJzdGFydGVkIEJ1bmRsZToiICsgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpICsgJygnICsgYnVuZGxlLmdldExvY2F0aW9uKCkgKyAnOicgKyBidW5kbGUuZ2V0QnVuZGxlSWQoKSArICcpJyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQkvLwkJCQlGcmFtZXdvcmtMb2dFbnRyeSBlbnRyeSA9IG5ldyBGcmFtZXdvcmtMb2dFbnRyeShGcmFtZXdvcmtBZGFwdG9yLkZSQU1FV09SS19TWU1CT0xJQ05BTUUsIE5MUy5iaW5kKEVjbGlwc2VBZGFwdG9yTXNnLkVDTElQU0VfU1RBUlRVUF9GQUlMRURfU1RBUlQsIGJ1bmRsZS5nZXRMb2NhdGlvbigpKSwgMCwgZSwgbnVsbCk7Ci0JCQkJLy8JCQkJbG9nLmxvZyhlbnRyeSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVbmluc3RhbGwgYnVuZGxlcyB3aGljaCBhcmUgbm90IGxpc3RlZCBvbiBmaW5hbExpc3QuICAKLQkgKiAKLQkgKiBAcGFyYW0gZmluYWxMaXN0IGJ1bmRsZXMgbGlzdCBub3QgdG8gYmUgdW5pbnN0YWxsZWQuCi0JICogQHBhcmFtIHBhY2thZ2VBZG1pbiBwYWNrYWdlIGFkbWluIHNlcnZpY2UuCi0JICogQHJldHVybiBDb2xsZWN0aW9uIEhhc2hTZXQgb2YgYnVuZGxlcyBmaW5hbGx5IGluc3RhbGxlZC4KLQkgKi8KLQlwcml2YXRlIENvbGxlY3Rpb24gdW5pbnN0YWxsQnVuZGxlcyhCdW5kbGVJbmZvW10gZmluYWxMaXN0LCBQYWNrYWdlQWRtaW4gcGFja2FnZUFkbWluKSB7Ci0JCUJ1bmRsZVtdIGFsbEJ1bmRsZXMgPSBtYW5pcHVsYXRpbmdDb250ZXh0LmdldEJ1bmRsZXMoKTsKLQotCQkvL0J1aWxkIGEgc2V0IHdpdGggYWxsIHRoZSBidW5kbGVzIGZyb20gdGhlIHN5c3RlbQotCQlTZXQgcmVtb3ZlZEJ1bmRsZXMgPSBuZXcgSGFzaFNldChhbGxCdW5kbGVzLmxlbmd0aCk7Ci0JCS8vCQljb25maWd1cmF0b3Iuc2V0UHJlcmVxdWlzaXRlQnVuZGxlcyhhbGxCdW5kbGVzKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxCdW5kbGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoYWxsQnVuZGxlc1tpXS5nZXRCdW5kbGVJZCgpID09IDApCi0JCQkJY29udGludWU7Ci0JCQlyZW1vdmVkQnVuZGxlcy5hZGQoYWxsQnVuZGxlc1tpXSk7Ci0JCX0KLQotCQkvL1JlbW92ZSBhbGwgdGhlIGJ1bmRsZXMgYXBwZWFyaW5nIGluIHRoZSBmaW5hbCBsaXN0IGZyb20gdGhlIHNldCBvZiBpbnN0YWxsZWQgYnVuZGxlcwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbmFsTGlzdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZpbmFsTGlzdFtpXSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJQnVuZGxlW10gdG9BZGQgPSBwYWNrYWdlQWRtaW4uZ2V0QnVuZGxlcyhmaW5hbExpc3RbaV0uZ2V0U3ltYm9saWNOYW1lKCksIGdldFZlcnNpb25SYW5nZShmaW5hbExpc3RbaV0uZ2V0VmVyc2lvbigpKSk7Ci0JCQlmb3IgKGludCBqID0gMDsgdG9BZGQgIT0gbnVsbCAmJiBqIDwgdG9BZGQubGVuZ3RoOyBqKyspIHsKLQkJCQlyZW1vdmVkQnVuZGxlcy5yZW1vdmUodG9BZGRbal0pOwotCQkJfQotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gcmVtb3ZlZEJ1bmRsZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQl0cnkgewotCQkJCUJ1bmRsZSBidW5kbGUgPSAoKEJ1bmRsZSkgaXRlci5uZXh0KCkpOwotCQkJCWJ1bmRsZS51bmluc3RhbGwoKTsKLQkJCQlpZiAoQWN0aXZhdG9yLkRFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInVuaW5zdGFsbGVkIEJ1bmRsZToiICsgYnVuZGxlLmdldFN5bWJvbGljTmFtZSgpICsgJygnICsgYnVuZGxlLmdldExvY2F0aW9uKCkgKyAnOicgKyBidW5kbGUuZ2V0QnVuZGxlSWQoKSArICcpJyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBjYXRjaCBibG9jawotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVtb3ZlZEJ1bmRsZXM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmVyc2lvblJhbmdlKFN0cmluZyB2ZXJzaW9uKSB7Ci0JCXJldHVybiB2ZXJzaW9uID09IG51bGwgPyBudWxsIDogbmV3IFN0cmluZ0J1ZmZlcigpLmFwcGVuZCgnWycpLmFwcGVuZCh2ZXJzaW9uKS5hcHBlbmQoJywnKS5hcHBlbmQodmVyc2lvbikuYXBwZW5kKCddJykudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9TaW1wbGVDb25maWd1cmF0b3JGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9TaW1wbGVDb25maWd1cmF0b3JGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlOGRiZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvU2ltcGxlQ29uZmlndXJhdG9yRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yOwotCi1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVDb25maWd1cmF0b3JGYWN0b3J5IGltcGxlbWVudHMgU2VydmljZUZhY3RvcnkgewotCXByaXZhdGUgQnVuZGxlQ29udGV4dCBjb250ZXh0OwotCi0JcHVibGljIFNpbXBsZUNvbmZpZ3VyYXRvckZhY3RvcnkoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRTZXJ2aWNlKEJ1bmRsZSBidW5kbGUsIFNlcnZpY2VSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uKSB7Ci0JCXJldHVybiBuZXcgU2ltcGxlQ29uZmlndXJhdG9ySW1wbChjb250ZXh0LCBidW5kbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuZ2V0U2VydmljZShCdW5kbGUgYnVuZGxlLCBTZXJ2aWNlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbiwgT2JqZWN0IHNlcnZpY2UpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL1NpbXBsZUNvbmZpZ3VyYXRvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL1NpbXBsZUNvbmZpZ3VyYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhNDhhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9TaW1wbGVDb25maWd1cmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwKLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5wcm92aXNpb25hbC5jb25maWd1cmF0b3IuQ29uZmlndXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLnV0aWxzLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoKLSAqIFNpbXBsZUNvbmZpZ3VyYXRvciBwcm92aWRlcyB3YXlzIHRvIGluc3RhbGwgYnVuZGxlcyBsaXN0ZWQgaW4gYSBmaWxlCi0gKiBhY2Nlc3NpYmxlIGJ5IHRoZSBzcGVjaWZpZWQgVVJMIGFuZCBleHBlY3Qgc3RhdGVzIGZvciBpdCBpbiBhZHZhbmNlIHdpdGhvdXQKLSAqIGFjdHVhbCBhcHBsaWNhdGlvbi4KLSAqIAotICogSW4gZXZlcnkgbWV0aG9kcyBvZiBTaW1wbGVDb25maWd1cmF0aW9uIG9iamVjdCwKLSAqIAotICogMS4gQSB2YWx1ZSB3aWxsIGJlIGdvdHRlbiBieSBAe2xpbmsgQnVuZGxlQ29udGV4dCNnZXRQcm9wZXJ0eShrZXkpIHdpdGgKLSAqIHtAbGluayBTaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMjUFJPUF9LRVlfRVhDTFVTSVZFX0lOU1RBTExBVElPTn0gYXMgYSBrZXkuCi0gKiAyLiBJZiBpdCBlcXVhbHMgInRydWUiLCBpdCB3aWxsIGRvIGV4Y2x1c2l2ZSBpbnN0YWxsYXRpb24sIHdoaWNoIG1lYW5zIHRoYXQKLSAqIHRoZSBidW5kbGVzIHdpbGwgbm90IGJlIGxpc3RlZCBpbiB0aGUgc3BlY2lmaWVkIHVybCBidXQgaW5zdGFsbGVkIGF0IHRoZSB0aW1lCi0gKiBvZiB0aGUgbWV0aG9kIGNhbGwgZXhjZXB0IFN5c3RlbUJ1bmRsZSB3aWxsIGJlIHVuaW5zdGFsbGVkLiBPdGhlcndpc2UsIG5vCi0gKiB1bmluc3RhbGxhdGlvbiB3aWxsIG5vdCBiZSBkb25lLgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ29uZmlndXJhdG9ySW1wbCBpbXBsZW1lbnRzIENvbmZpZ3VyYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBVUkwgY29uZmlndXJhdGlvblVSTCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGNvbmZpZ3VyYXRpb25Mb2NrID0gbmV3IE9iamVjdCgpOwotCi0JcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGNvbnRleHQ7Ci0JcHJpdmF0ZSBDb25maWdBcHBsaWVyIGNvbmZpZ0FwcGxpZXI7Ci0JcHJpdmF0ZSBCdW5kbGUgYnVuZGxlOwotCi0JcHVibGljIFNpbXBsZUNvbmZpZ3VyYXRvckltcGwoQnVuZGxlQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgYnVuZGxlKSB7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JCXRoaXMuYnVuZGxlID0gYnVuZGxlOwotCX0KLQotCXByaXZhdGUgVVJMIGdldENvbmZpZ3VyYXRpb25VUkwoKSB7Ci0JCVN0cmluZyBzcGVjaWZpZWRVUkwgPSBjb250ZXh0LmdldFByb3BlcnR5KFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5QUk9QX0tFWV9DT05GSUdVUkwpOwotCQlpZiAoc3BlY2lmaWVkVVJMID09IG51bGwpCi0JCQlzcGVjaWZpZWRVUkwgPSAiZmlsZToiICsgU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLkNPTkZJR1VSQVRPUl9GT0xERVIgKyAiLyIgKyBTaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMuQ09ORklHX0xJU1Q7Ci0KLQkJdHJ5IHsKLQkJCS8vSWYgaXQgaXMgbm90IGEgZmlsZSBVUkwgdXNlIGl0IGFzIGlzCi0JCQlpZiAoIXNwZWNpZmllZFVSTC5zdGFydHNXaXRoKCJmaWxlOiIpKQotCQkJCXJldHVybiBuZXcgVVJMKHNwZWNpZmllZFVSTCk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXRyeSB7Ci0JCQkvLyBpZiBpdCBpcyBhbiBhYnNvbHV0ZSBmaWxlIFVSTCwgdXNlIGl0IGFzIGlzCi0JCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJCVVSTCB1cmwgPSBudWxsOwotCQkJU3RyaW5nIGZpbGUgPSBzcGVjaWZpZWRVUkw7Ci0JCQl3aGlsZSAoIWRvbmUpIHsKLQkJCQl0cnkgewotCQkJCQl1cmwgPSBuZXcgVVJMKGZpbGUpOwotCQkJCQlmaWxlID0gdXJsLmdldEZpbGUoKTsKLQkJCQl9IGNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodXJsICE9IG51bGwgJiYgbmV3IEZpbGUodXJsLmdldEZpbGUoKSkuaXNBYnNvbHV0ZSgpKQotCQkJCXJldHVybiB1cmw7Ci0KLQkJCS8vaWYgaXQgaXMgYW4gcmVsYXRpdmUgZmlsZSBVUkwsIHRoZW4gcmVzb2x2ZSBpdCBhZ2FpbnN0IHRoZSBjb25maWd1cmF0aW9uIGFyZWEKLQkJCVVSTFtdIGNvbmZpZ1VSTCA9IEVxdWlub3hVdGlscy5nZXRDb25maWdBcmVhVVJMKGNvbnRleHQpOwotCQkJaWYgKGNvbmZpZ1VSTCAhPSBudWxsKSB7Ci0JCQkJRmlsZSB1c2VyQ29uZmlnID0gbmV3IEZpbGUoY29uZmlnVVJMWzBdLmdldEZpbGUoKSwgdXJsLmdldEZpbGUoKSk7Ci0JCQkJaWYgKGNvbmZpZ1VSTC5sZW5ndGggPT0gMSkKLQkJCQkJcmV0dXJuIHVzZXJDb25maWcuZXhpc3RzKCkgPyB1c2VyQ29uZmlnLnRvVVJMKCkgOiBudWxsOwotCi0JCQkJRmlsZSBzaGFyZWRDb25maWcgPSBuZXcgRmlsZShjb25maWdVUkxbMV0uZ2V0RmlsZSgpLCB1cmwuZ2V0RmlsZSgpKTsKLQkJCQlpZiAoIXVzZXJDb25maWcuZXhpc3RzKCkpCi0JCQkJCXJldHVybiBzaGFyZWRDb25maWcuZXhpc3RzKCkgPyBzaGFyZWRDb25maWcudG9VUkwoKSA6IG51bGw7Ci0KLQkJCQlpZiAoIXNoYXJlZENvbmZpZy5leGlzdHMoKSkKLQkJCQkJcmV0dXJuIHVzZXJDb25maWcudG9VUkwoKTsKLQotCQkJCXJldHVybiAoc2hhcmVkQ29uZmlnLmxhc3RNb2RpZmllZCgpID4gdXNlckNvbmZpZy5sYXN0TW9kaWZpZWQoKSkgPyBzaGFyZWRDb25maWcudG9VUkwoKSA6IHVzZXJDb25maWcudG9VUkwoKTsKLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy9MYXN0IHJlc29ydAotCQl0cnkgewotCQkJcmV0dXJuIG5ldyBVUkwoc3BlY2lmaWVkVVJMKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCS8vSWdub3JlCi0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhcHBseUNvbmZpZ3VyYXRpb24oVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkIChjb25maWd1cmF0aW9uTG9jaykgewotCQkJaWYgKEFjdGl2YXRvci5ERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFwcGx5Q29uZmlndXJhdGlvbigpIFVSTD0iICsgdXJsKTsKLQkJCWlmICh1cmwgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQljb25maWd1cmF0aW9uVVJMID0gdXJsOwotCi0JCQlMaXN0IGJ1bmRsZUluZm9MaXN0ID0gU2ltcGxlQ29uZmlndXJhdG9yVXRpbHMucmVhZENvbmZpZ3VyYXRpb24odXJsKTsKLQkJCWlmIChBY3RpdmF0b3IuREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJhcHBseUNvbmZpZ3VyYXRpb24oKSBidW5kbGVJbmZvTGlzdC5zaXplKCk9IiArIGJ1bmRsZUluZm9MaXN0LnNpemUoKSk7Ci0JCQlpZiAoYnVuZGxlSW5mb0xpc3Quc2l6ZSgpID09IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKHRoaXMuY29uZmlnQXBwbGllciA9PSBudWxsKQotCQkJCWNvbmZpZ0FwcGxpZXIgPSBuZXcgQ29uZmlnQXBwbGllcihjb250ZXh0LCBidW5kbGUpOwotCQkJY29uZmlnQXBwbGllci5pbnN0YWxsKFV0aWxzLmdldEJ1bmRsZUluZm9zRnJvbUxpc3QoYnVuZGxlSW5mb0xpc3QpLCB1cmwsIGlzRXhjbHVzaXZlSW5zdGFsbGF0aW9uKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRXhjbHVzaXZlSW5zdGFsbGF0aW9uKCkgewotCQlTdHJpbmcgdmFsdWUgPSBjb250ZXh0LmdldFByb3BlcnR5KFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5QUk9QX0tFWV9FWENMVVNJVkVfSU5TVEFMTEFUSU9OKTsKLQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQl2YWx1ZSA9ICJ0cnVlIjsKLQkJcmV0dXJuIEJvb2xlYW4udmFsdWVPZih2YWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYXBwbHlDb25maWd1cmF0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJc3luY2hyb25pemVkIChjb25maWd1cmF0aW9uTG9jaykgewotCQkJY29uZmlndXJhdGlvblVSTCA9IGdldENvbmZpZ3VyYXRpb25VUkwoKTsKLQkJCWFwcGx5Q29uZmlndXJhdGlvbihjb25maWd1cmF0aW9uVVJMKTsKLQkJfQotCX0KLQotCXB1YmxpYyBVUkwgZ2V0VXJsSW5Vc2UoKSB7Ci0JCXN5bmNocm9uaXplZCAoY29uZmlndXJhdGlvbkxvY2spIHsKLQkJCXJldHVybiBjb25maWd1cmF0aW9uVVJMOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvY29uc29sZS9BcHBseUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL2NvbnNvbGUvQXBwbHlDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNWYwMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvY29uc29sZS9BcHBseUNvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci5jb25zb2xlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnByb3Zpc2lvbmFsLmNvbmZpZ3VyYXRvci5Db25maWd1cmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5mcmFtZXdvcmsuY29uc29sZS5Db21tYW5kSW50ZXJwcmV0ZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi0vKioKLSAqIEFuIE9TR2kgY29uc29sZSBjb21tYW5kIHRvIGFwcGx5IGEgY29uZmlndXJhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQXBwbHlDb21tYW5kIHsKLQotCXByaXZhdGUgVVJMIGNvbmZpZ1VSTDsKLQlwcml2YXRlIENvbW1hbmRJbnRlcnByZXRlciBpbnRlcnByZXRlcjsKLQlwcml2YXRlIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQotCXB1YmxpYyBBcHBseUNvbW1hbmQoQ29tbWFuZEludGVycHJldGVyIGludGVycHJldGVyLCBCdW5kbGVDb250ZXh0IGNvbnRleHQsIFVSTCBjb25maWdVUkwpIHsKLQkJdGhpcy5pbnRlcnByZXRlciA9IGludGVycHJldGVyOwotCQl0aGlzLmNvbnRleHQgPSBjb250ZXh0OwotCQl0aGlzLmNvbmZpZ1VSTCA9IGNvbmZpZ1VSTDsKLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBhcHBseSBjb25zb2xlIGNvbW1hbmQKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCVNlcnZpY2VUcmFja2VyIHRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoY29udGV4dCwgQ29uZmlndXJhdG9yLmNsYXNzLmdldE5hbWUoKSwgbnVsbCk7Ci0JCXRyYWNrZXIub3BlbigpOwotCQlDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0gKENvbmZpZ3VyYXRvcikgdHJhY2tlci5nZXRTZXJ2aWNlKCk7Ci0JCWlmIChjb25maWd1cmF0b3IgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoY29uZmlnVVJMICE9IG51bGwpCi0JCQkJCWNvbmZpZ3VyYXRvci5hcHBseUNvbmZpZ3VyYXRpb24oY29uZmlnVVJMKTsKLQkJCQllbHNlCi0JCQkJCWNvbmZpZ3VyYXRvci5hcHBseUNvbmZpZ3VyYXRpb24oKTsKLQkJCQkKLQkJCQlpZiAoY29uZmlndXJhdG9yLmdldFVybEluVXNlKCkgPT0gbnVsbCkKLQkJCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigiQ29uZmlnIFVSTCBub3Qgc2V0LiIpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWludGVycHJldGVyLnByaW50bG4oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbigiTm8gY29uZmlndXJhdG9yIHJlZ2lzdGVyZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRyYWNrZXIuY2xvc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9jb25zb2xlL0NvbmZpZ3VyYXRvckNvbW1hbmRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvY29uc29sZS9Db25maWd1cmF0b3JDb21tYW5kUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI5MTViMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci9jb25zb2xlL0NvbmZpZ3VyYXRvckNvbW1hbmRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLmNvbnNvbGU7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmNvbnNvbGUuQ29tbWFuZEludGVycHJldGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmNvbnNvbGUuQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OwotCi1wdWJsaWMgY2xhc3MgQ29uZmlndXJhdG9yQ29tbWFuZFByb3ZpZGVyIGltcGxlbWVudHMgQ29tbWFuZFByb3ZpZGVyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdfTElORSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIEJ1bmRsZUNvbnRleHQgY29udGV4dDsKLQotCXB1YmxpYyBDb25maWd1cmF0b3JDb21tYW5kUHJvdmlkZXIoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXRoaXMuY29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZ2l2ZW4gc3RyaW5nIGFzIGFuIFVSTCwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGUgc3RyaW5nIGNvdWxkIG5vdCBiZSBpbnRlcnByZXRlZCBhcyBhbiBVUkwuCi0JICovCi0JcHJpdmF0ZSBVUkwgdG9VUkwoQ29tbWFuZEludGVycHJldGVyIGludGVycHJldGVyLCBTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gbmV3IFVSTCh1cmxTdHJpbmcpOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJaW50ZXJwcmV0ZXIucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFwcGx5IHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBVUkwgKG9wdGlvbmFsKQotCSAqLwotCXB1YmxpYyB2b2lkIF9jb25mYXBwbHkoQ29tbWFuZEludGVycHJldGVyIGludGVycHJldGVyKSB7Ci0JCVN0cmluZyBwYXJhbWV0ZXIgPSBpbnRlcnByZXRlci5uZXh0QXJndW1lbnQoKTsKLQkJVVJMIGNvbmZpZ1VSTCA9IG51bGw7Ci0JCWlmIChwYXJhbWV0ZXIgIT0gbnVsbCkKLQkJCWNvbmZpZ1VSTCA9IHRvVVJMKGludGVycHJldGVyLCBwYXJhbWV0ZXIpOwotCi0JCW5ldyBBcHBseUNvbW1hbmQoaW50ZXJwcmV0ZXIsIGNvbnRleHQsIGNvbmZpZ1VSTCkucnVuKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIZWxwKCkgewotCQlTdHJpbmdCdWZmZXIgaGVscCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaGVscC5hcHBlbmQoTkVXX0xJTkUpOwotCQloZWxwLmFwcGVuZCgiLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJaGVscC5hcHBlbmQoIkNvbmZpZ3VyYXRvciBDb21tYW5kcyIpOyAvLyROT04tTkxTLTEkCi0JCWhlbHAuYXBwZW5kKCItLS0iKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwLmFwcGVuZChORVdfTElORSk7Ci0JCWhlbHAuYXBwZW5kKCJcdGNvbmZhcHBseSBbPGNvbmZpZyBVUkw+XSAtIEFwcGxpZXMgYSBjb25maWd1cmF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGhlbHAudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9CdW5kbGVJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9CdW5kbGVJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZWZiNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvQnVuZGxlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci51dGlsczsKLQotLyoqCi0gKiBUaGlzIG9iamVjdCByZXByZXNlbnRzIGluZm9ybWF0aW9uIG9mIGEgYnVuZGxlLgotICoKLSAqLwotcHVibGljIGNsYXNzIEJ1bmRsZUluZm8gewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PX0xFVkVMID0gLTE7Ci0KLQlwcml2YXRlIFN0cmluZyBzeW1ib2xpY05hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHZlcnNpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIG1hcmtlZEFzU3RhcnRlZCA9IGZhbHNlOwotCXByaXZhdGUgaW50IHN0YXJ0TGV2ZWwgPSBOT19MRVZFTDsKLQlwcml2YXRlIGJvb2xlYW4gcmVzb2x2ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBCdW5kbGVJbmZvKFN0cmluZyBzeW1ib2xpYywgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBsb2NhdGlvbiwgaW50IHN0YXJ0TGV2ZWwsIGJvb2xlYW4gc3RhcnRlZCkgewotCQl0aGlzLnN5bWJvbGljTmFtZSA9IHN5bWJvbGljOwotCQl0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb24udHJpbSgpOwotCQl0aGlzLm1hcmtlZEFzU3RhcnRlZCA9IHN0YXJ0ZWQ7Ci0JCXRoaXMuc3RhcnRMZXZlbCA9IHN0YXJ0TGV2ZWw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRvQ29tcGFyZSkgewotCQlpZiAodG9Db21wYXJlIGluc3RhbmNlb2YgQnVuZGxlSW5mbykgewotCQkJQnVuZGxlSW5mbyBpbmZvID0gKEJ1bmRsZUluZm8pIHRvQ29tcGFyZTsKLQkJCS8vaWYgKGluZm8uc3ltYm9saWNOYW1lLmVxdWFscyhzeW1ib2xpY05hbWUpICYmIGluZm8udmVyc2lvbi5lcXVhbHModmVyc2lvbikgJiYgKGluZm8udXJsID09IG51bGwgfHwgdXJsID09IG51bGwgPyB0cnVlIDogaW5mby51cmwuZXF1YWxzKHVybCkpKQotCQkJaWYgKGluZm8uc3ltYm9saWNOYW1lICE9IG51bGwgJiYgaW5mby52ZXJzaW9uICE9IG51bGwgJiYgc3ltYm9saWNOYW1lICE9IG51bGwgJiYgdmVyc2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKGluZm8uc3ltYm9saWNOYW1lLmVxdWFscyhzeW1ib2xpY05hbWUpICYmIGluZm8udmVyc2lvbi5lcXVhbHModmVyc2lvbikgJiYgKGluZm8ubG9jYXRpb24gPT0gbnVsbCB8fCBsb2NhdGlvbiA9PSBudWxsID8gdHJ1ZSA6IGluZm8ubG9jYXRpb24uZXF1YWxzKGxvY2F0aW9uKSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gKGluZm8ubG9jYXRpb24gPT0gbnVsbCB8fCBsb2NhdGlvbiA9PSBudWxsID8gZmFsc2UgOiBpbmZvLmxvY2F0aW9uLmVxdWFscyhsb2NhdGlvbikpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkgewotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydExldmVsKCkgewotCQlyZXR1cm4gc3RhcnRMZXZlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN5bWJvbGljTmFtZSgpIHsKLQkJcmV0dXJuIHN5bWJvbGljTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKSB7Ci0JCXJldHVybiB2ZXJzaW9uOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCByZXN1bHQgPSBzeW1ib2xpY05hbWUgPT0gbnVsbCA/IDAgOiBzeW1ib2xpY05hbWUuaGFzaENvZGUoKTsKLQkJcmVzdWx0ID0gcmVzdWx0ICsgKHZlcnNpb24gPT0gbnVsbCA/IDAgOiB2ZXJzaW9uLmhhc2hDb2RlKCkpOwotCQlyZXN1bHQgPSByZXN1bHQgKyAobG9jYXRpb24gPT0gbnVsbCA/IDAgOiBsb2NhdGlvbi5oYXNoQ29kZSgpKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc01hcmtlZEFzU3RhcnRlZCgpIHsKLQkJcmV0dXJuIG1hcmtlZEFzU3RhcnRlZDsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCJCdW5kbGVJbmZvKCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzeW1ib2xpY05hbWUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc3ltYm9saWNOYW1lKTsKLQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodmVyc2lvbiAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZCh2ZXJzaW9uKTsKLQkJYnVmZmVyLmFwcGVuZCgiLCAiKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJsb2NhdGlvbj0iKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKGxvY2F0aW9uKTsKLQkJYnVmZmVyLmFwcGVuZCgiLCBzdGFydExldmVsPSIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoc3RhcnRMZXZlbCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIiwgdG9CZVN0YXJ0ZWQ9Iik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChtYXJrZWRBc1N0YXJ0ZWQpOwotCQlidWZmZXIuYXBwZW5kKCIsIHJlc29sdmVkPSIpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQocmVzb2x2ZWQpOwotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9FcXVpbm94VXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL3V0aWxzL0VxdWlub3hVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDVkYzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL3V0aWxzL0VxdWlub3hVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQotICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwKLSAqIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLnV0aWxzOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLmNvbnNvbGUuQ29uZmlndXJhdG9yQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuZnJhbWV3b3JrLmNvbnNvbGUuQ29tbWFuZFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kuc2VydmljZS5kYXRhbG9jYXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci1pbXBvcnQgb3JnLm9zZ2kudXRpbC50cmFja2VyLlNlcnZpY2VUcmFja2VyOwotCi1wdWJsaWMgY2xhc3MgRXF1aW5veFV0aWxzIHsKLQotCXB1YmxpYyBzdGF0aWMgVVJMW10gZ2V0Q29uZmlnQXJlYVVSTChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLQkJRmlsdGVyIGZpbHRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmaWx0ZXIgPSBjb250ZXh0LmNyZWF0ZUZpbHRlcihMb2NhdGlvbi5DT05GSUdVUkFUSU9OX0ZJTFRFUik7Ci0JCX0gY2F0Y2ggKEludmFsaWRTeW50YXhFeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4KLQkJfQotCQlTZXJ2aWNlVHJhY2tlciBjb25maWdMb2NhdGlvblRyYWNrZXIgPSBuZXcgU2VydmljZVRyYWNrZXIoY29udGV4dCwgZmlsdGVyLCBudWxsKTsKLQkJY29uZmlnTG9jYXRpb25UcmFja2VyLm9wZW4oKTsKLQkJdHJ5IHsKLQkJCUxvY2F0aW9uIGNvbmZpZ0xvY2F0aW9uID0gKExvY2F0aW9uKSBjb25maWdMb2NhdGlvblRyYWNrZXIuZ2V0U2VydmljZSgpOwotCQkJaWYgKGNvbmZpZ0xvY2F0aW9uID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCVVSTCBiYXNlVVJMID0gY29uZmlnTG9jYXRpb24uZ2V0VVJMKCk7Ci0JCQlpZiAoY29uZmlnTG9jYXRpb24uZ2V0UGFyZW50TG9jYXRpb24oKSAhPSBudWxsICYmIGNvbmZpZ0xvY2F0aW9uLmdldFVSTCgpICE9IG51bGwpIHsKLQkJCQlpZiAoYmFzZVVSTCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbmV3IFVSTFtdIHtjb25maWdMb2NhdGlvbi5nZXRQYXJlbnRMb2NhdGlvbigpLmdldFVSTCgpfTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBuZXcgVVJMW10ge2Jhc2VVUkwsIGNvbmZpZ0xvY2F0aW9uLmdldFBhcmVudExvY2F0aW9uKCkuZ2V0VVJMKCl9OwotCQkJfQotCQkJaWYgKGJhc2VVUkwgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFVSTFtdIHtiYXNlVVJMfTsKLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0gZmluYWxseSB7Ci0JCQljb25maWdMb2NhdGlvblRyYWNrZXIuY2xvc2UoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU2VydmljZVJlZ2lzdHJhdGlvbiByZWdpc3RlckNvbnNvbGVDb21tYW5kcyhCdW5kbGVDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIGNvbnRleHQucmVnaXN0ZXJTZXJ2aWNlKENvbW1hbmRQcm92aWRlci5jbGFzcy5nZXROYW1lKCksIG5ldyBDb25maWd1cmF0b3JDb21tYW5kUHJvdmlkZXIoY29udGV4dCksIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL3V0aWxzL1NpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzNmY2NTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuZXF1aW5veC5pbnRlcm5hbC5zaW1wbGVjb25maWd1cmF0b3IudXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVDb25maWd1cmF0b3JDb25zdGFudHMgewotCS8qKgotCSAqIElmIEJ1bmRsZUNvbnRleHQjZ2V0UHJvcGVydHkoUFJPUF9LRVlfRVhDTFVTSVZFX0lOU1RBTExBVElPTikgZXF1YWxzICJ0cnVlIiBpZ25vcmluZyBjYXNlLCAKLQkgKiBDb25maWd1cmF0b3IuYXBwbHlDb25maWd1cmF0aW9uKHVybCkgd2lsbCB1bmluc3RhbGwgdGhlIGluc3RhbGxlZCBidW5kbGVzIHdoaWNoIGFyZSBub3QgCi0JICogbGlzdGVkIGluIHRoZSBzaW1wbGVjb25maWd1cmF0b3IgY29uZmlnIGZpbGUgYWZ0ZXIgaW5zdGFsbCBidW5kbGVzIGxpc3RlZC4KLQkgKiBPdGhlcndpc2UsIGl0IG5ldmVyIHVuaW5zdGFsbCBhbnkgYnVuZGxlcy4gCi0JICogCi0JICogRGVmYXVsdDogZmFsc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0tFWV9FWENMVVNJVkVfSU5TVEFMTEFUSU9OID0gIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmV4Y2x1c2l2ZUluc3RhbGxhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElmIEJ1bmRsZUNvbnRleHQjZ2V0UHJvcGVydHkoUFJPUF9LRVlfVVNFX1JFRkVSRU5DRSkgZG9lcyBub3QgZXF1YWwgImZhbHNlIiBpZ25vcmluZyBjYXNlLCAKLQkgKiB3aGVuIGEgU2ltcGxlQ29uZmlndXJhdG9yIGluc3RhbGxzIGEgYnVuZGxlLCAicmVmZXJlbmNlOiIgaXMgYWRkZWQgdG8gaXRzIGJ1bmRsZSBsb2NhdGlvbiBpbiBvcmRlciB0byBhdm9pZAotCSAqIGNhY2hpbmcgaXRzIGJ1bmRsZSBqYXIuICBPdGhlcndpc2UsIGl0IHdpbGwgYWRkIG5vdGhpbmcgdG8gYW55IGJ1bmRsZSBsb2NhdGlvbi4KLQkgKiAJIAotCSAqIERlZmF1bHQ6IHRydWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QX0tFWV9VU0VfUkVGRVJFTkNFID0gIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLnVzZVJlZmVyZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEJ1bmRsZUNvbnRleHQjZ2V0UHJvcGVydHkoUFJPUF9LRVlfQ09ORklHVVJMKSBpcyB1c2VkIGZvciBTaW1wbGVDb25maWd1cmF0b3IgdG8gZG8gbGlmZSBjeWNsZSBjb250cm9sIG9mIGJ1bmRsZXMuCi0JICogVGhlIGZpbGUgc3BlY2lmaWVkIGJ5IHRoZSByZXR1cm5lZCB1cmwgaXMgcmVhZCBieSBTaW1wbGVDb25maWd1cmF0b3IgYW5kIGRvIGxpZmUgY3ljbGUgY29udHJvbCBhY2NvcmRpbmcgdG8gaXQuCi0JICogSWYgaW1wcm9wZXIgdmFsdWUgb3IgbnVsbCBpcyByZXR1cm5lZCwgU2ltcGxlQ29uZmlndXJhdG9yIGRvZXNuJ3QgZG8gaXQuCi0JICogCi0JICogRGVmYXVsdDogbnVsbAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BfS0VZX0NPTkZJR1VSTCA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5jb25maWdVcmwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfTElTVCA9ICJidW5kbGVzLmluZm8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09ORklHVVJBVE9SX0ZPTERFUiA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBUkdFVF9DT05GSUdVUkFUT1JfTkFNRSA9ICJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNRVRFUl9CQVNFVVJMID0gIm9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLmJhc2VVcmwiOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL3V0aWxzL1NpbXBsZUNvbmZpZ3VyYXRvclV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9TaW1wbGVDb25maWd1cmF0b3JVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTNlMTJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL3V0aWxzL1NpbXBsZUNvbmZpZ3VyYXRvclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLnV0aWxzOwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVDb25maWd1cmF0b3JVdGlscyB7Ci0KLQlwdWJsaWMgc3RhdGljIExpc3QgcmVhZENvbmZpZ3VyYXRpb24oVVJMIHVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTGlzdCBidW5kbGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJQnVmZmVyZWRSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIodXJsLm9wZW5TdHJlYW0oKSkpOwotCi0JCQlTdHJpbmcgbGluZTsKLQkJCXRyeSB7Ci0JCQkJVVJMIGJhc2VVcmwgPSBuZXcgVVJMKHVybCwgIi4vIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3aGlsZSAoKGxpbmUgPSByLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKLQkJCQkJaWYgKGxpbmUuc3RhcnRzV2l0aCgiIyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQljb250aW51ZTsKLQkJCQkJbGluZSA9IGxpbmUudHJpbSgpOy8vIHN5bWJvbGljTmFtZSx2ZXJzaW9uLGxvY2F0aW9uLHN0YXJ0bGV2ZWwsZXhwZWN0ZWRTdGF0ZQotCQkJCQlpZiAobGluZS5sZW5ndGgoKSA9PSAwKQotCQkJCQkJY29udGludWU7Ci0KLQkJCQkJLy8gKGV4cGVjdGVkU3RhdGUgaXMgYW4gaW50ZWdlcikuCi0JCQkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoU2ltcGxlQ29uZmlndXJhdG9yQ29uc3RhbnRzLlBBUkFNRVRFUl9CQVNFVVJMICsgIj0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgYmFzZVVybFN0ID0gbGluZS5zdWJzdHJpbmcoKFNpbXBsZUNvbmZpZ3VyYXRvckNvbnN0YW50cy5QQVJBTUVURVJfQkFTRVVSTCArICI9IikubGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoIWJhc2VVcmxTdC5lbmRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJYmFzZVVybFN0ICs9ICIvIjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYmFzZVVybCA9IG5ldyBVUkwodXJsLCBiYXNlVXJsU3QpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nVG9rZW5pemVyIHRvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluZSwgIiwiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgc3ltYm9saWNOYW1lID0gdG9rLm5leHRUb2tlbigpOwotCQkJCQlpZiAoc3ltYm9saWNOYW1lLmVxdWFscygiLCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQlzeW1ib2xpY05hbWUgPSBudWxsOwotCQkJCQllbHNlCi0JCQkJCQl0b2submV4dFRva2VuKCk7IC8vICwKLQotCQkJCQlTdHJpbmcgdmVyc2lvbiA9IHRvay5uZXh0VG9rZW4oKTsKLQkJCQkJaWYgKHZlcnNpb24uZXF1YWxzKCIsIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXZlcnNpb24gPSBudWxsOwotCQkJCQllbHNlCi0JCQkJCQl0b2submV4dFRva2VuKCk7IC8vICwKLQotCQkJCQlTdHJpbmcgdXJsU3QgPSB0b2submV4dFRva2VuKCk7Ci0JCQkJCWlmICh1cmxTdC5lcXVhbHMoIiwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAoc3ltYm9saWNOYW1lICE9IG51bGwgJiYgdmVyc2lvbiAhPSBudWxsKQotCQkJCQkJCXVybFN0ID0gc3ltYm9saWNOYW1lICsgIl8iICsgdmVyc2lvbiArICIuamFyIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQllbHNlCi0JCQkJCQkJdXJsU3QgPSBudWxsOwotCQkJCQl9IGVsc2UKLQkJCQkJCXRvay5uZXh0VG9rZW4oKTsgLy8gLAotCQkJCQl0cnkgewotCQkJCQkJbmV3IFVSTCh1cmxTdCk7Ci0JCQkJCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl1cmxTdCA9IFV0aWxzLmdldFVybEluRnVsbCh1cmxTdCwgYmFzZVVybCkudG9FeHRlcm5hbEZvcm0oKTsKLQkJCQkJfQotCi0JCQkJCWludCBzbCA9IEludGVnZXIucGFyc2VJbnQodG9rLm5leHRUb2tlbigpLnRyaW0oKSk7Ci0JCQkJCXRvay5uZXh0VG9rZW4oKTsgLy8gLAotCQkJCQlib29sZWFuIG1hcmtlZEFzU3RhcnRlZCA9IEJvb2xlYW4udmFsdWVPZih0b2submV4dFRva2VuKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkvLyBVUkwgdXJsQnVuZGxlID0gbnVsbDsKLQkJCQkJLy8gdHJ5IHsKLQkJCQkJLy8gdXJsQnVuZGxlID0gbmV3IFVSTCh1cmxTdCk7Ci0JCQkJCS8vIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHVybEJ1bmRsZSA9IFV0aWxzLmdldEZ1bGxVcmwodXJsU3QsIGJhc2VVcmwpOwotCQkJCQkvLyB9Ci0KLQkJCQkJQnVuZGxlSW5mbyBiSW5mbyA9IG5ldyBCdW5kbGVJbmZvKHN5bWJvbGljTmFtZSwgdmVyc2lvbiwgdXJsU3QsIHNsLCBtYXJrZWRBc1N0YXJ0ZWQpOwotCQkJCQlidW5kbGVzLmFkZChiSW5mbyk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQl0cnkgewotCQkJCQlyLmNsb3NlKCk7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCQkJLy8gaWdub3JlCi0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCS8vIFRPRE8gbG9nIHNvbWV0aGluZwotCQkJLy8gYnVuZGxlSW5mb3MgPSBOVUxMX0JVTkRMRUlORk9TOwotCQl9Ci0JCXJldHVybiBidW5kbGVzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFuc2ZlclN0cmVhbXMoSW5wdXRTdHJlYW0gc291cmNlLCBPdXRwdXRTdHJlYW0gZGVzdGluYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXNvdXJjZSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvdXJjZSk7Ci0JCWRlc3RpbmF0aW9uID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGRlc3RpbmF0aW9uKTsKLQkJdHJ5IHsKLQkJCWJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs4MTkyXTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJaW50IGJ5dGVzUmVhZCA9IC0xOwotCQkJCWlmICgoYnl0ZXNSZWFkID0gc291cmNlLnJlYWQoYnVmZmVyKSkgPT0gLTEpCi0JCQkJCWJyZWFrOwotCQkJCWRlc3RpbmF0aW9uLndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNSZWFkKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJc291cmNlLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQl0cnkgewotCQkJCWRlc3RpbmF0aW9uLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9TdGF0ZVJlc29sdmVyVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL3V0aWxzL1N0YXRlUmVzb2x2ZXJVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjFiNWY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3Ivc3JjL29yZy9lY2xpcHNlL2VxdWlub3gvaW50ZXJuYWwvc2ltcGxlY29uZmlndXJhdG9yL3V0aWxzL1N0YXRlUmVzb2x2ZXJVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmVxdWlub3guaW50ZXJuYWwuc2ltcGxlY29uZmlndXJhdG9yLnV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlLnJlc29sdmVyLio7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLio7Ci0KLXB1YmxpYyBjbGFzcyBTdGF0ZVJlc29sdmVyVXRpbHMgewotCi0JcHVibGljIHN0YXRpYyBCdW5kbGVbXSBnZXRBZGRpdGlvbmFsUmVmcmVzaChDb2xsZWN0aW9uIGN1cnJlbnRSZXNvbHZlZCwgQnVuZGxlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVNlcnZpY2VSZWZlcmVuY2UgcmVmID0gY29udGV4dC5nZXRTZXJ2aWNlUmVmZXJlbmNlKFBsYXRmb3JtQWRtaW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQkJaWYgKHJlZiA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBCdW5kbGVbMF07Ci0JCVBsYXRmb3JtQWRtaW4gcGxhdGZvcm1BZG1pbiA9IChQbGF0Zm9ybUFkbWluKSBjb250ZXh0LmdldFNlcnZpY2UocmVmKTsKLQkJaWYgKHBsYXRmb3JtQWRtaW4gPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQnVuZGxlWzBdOwotCQl0cnkgewotCQkJU3RhdGUgc3RhdGUgPSBwbGF0Zm9ybUFkbWluLmdldFN0YXRlKGZhbHNlKTsKLQkJCUJ1bmRsZURlc2NyaXB0aW9uW10gYnVuZGxlcyA9IHN0YXRlLmdldEJ1bmRsZXMoKTsKLQkJCUhhc2hTZXQgcmVzdWx0cyA9IG5ldyBIYXNoU2V0KGJ1bmRsZXMubGVuZ3RoKTsKLQkJCWdldEFkZGl0aW9uUmVmcmVzaChidW5kbGVzLCBzdGF0ZSwgY3VycmVudFJlc29sdmVkLCByZXN1bHRzLCBjb250ZXh0KTsKLQkJCXJldHVybiAoQnVuZGxlW10pIHJlc3VsdHMudG9BcnJheShuZXcgQnVuZGxlW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JCX0gZmluYWxseSB7Ci0JCQljb250ZXh0LnVuZ2V0U2VydmljZShyZWYpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBnZXRBZGRpdGlvblJlZnJlc2goQnVuZGxlRGVzY3JpcHRpb25bXSBidW5kbGVEZXNjcmlwdGlvbnMsIFN0YXRlIHN0YXRlLCBDb2xsZWN0aW9uIGN1cnJlbnRSZXNvbHZlZCwgU2V0IHJlc3VsdHMsIEJ1bmRsZUNvbnRleHQgY29udGV4dCkgewotCQlidW5kbGVzOiBmb3IgKGludCBpID0gMDsgaSA8IGJ1bmRsZURlc2NyaXB0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJQnVuZGxlIGJ1bmRsZSA9IGNvbnRleHQuZ2V0QnVuZGxlKGJ1bmRsZURlc2NyaXB0aW9uc1tpXS5nZXRCdW5kbGVJZCgpKTsKLQkJCWlmIChidW5kbGUgPT0gbnVsbCkKLQkJCQljb250aW51ZSBidW5kbGVzOwotCQkJLy8gbG9vayBmb3IgYSBmcmFnbWVudCB3aGljaCBhZGRzIGEgY29uZmxpY3RlZCBjb25zdHJhaW50IHRvIGFuIGFscmVhZHkgcmVzb2x2ZWQgaG9zdAotCQkJaWYgKCFidW5kbGVEZXNjcmlwdGlvbnNbaV0uaXNSZXNvbHZlZCgpICYmIGJ1bmRsZURlc2NyaXB0aW9uc1tpXS5nZXRIb3N0KCkgIT0gbnVsbCkgewotCQkJCVJlc29sdmVyRXJyb3JbXSBlcnJvcnMgPSBzdGF0ZS5nZXRSZXNvbHZlckVycm9ycyhidW5kbGVEZXNjcmlwdGlvbnNbaV0pOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXJyb3JzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWlmICgoZXJyb3JzW2pdLmdldFR5cGUoKSAmIFJlc29sdmVyRXJyb3IuRlJBR01FTlRfQ09ORkxJQ1QpICE9IDApIHsKLQkJCQkJCUJ1bmRsZURlc2NyaXB0aW9uW10gcG9zc2libGVIb3N0cyA9IHN0YXRlLmdldEJ1bmRsZXMoYnVuZGxlRGVzY3JpcHRpb25zW2ldLmdldEhvc3QoKS5nZXROYW1lKCkpOwotCQkJCQkJZm9yIChpbnQgayA9IDA7IGsgPCBwb3NzaWJsZUhvc3RzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCQkJQnVuZGxlIGhvc3RCdW5kbGUgPSBjb250ZXh0LmdldEJ1bmRsZShwb3NzaWJsZUhvc3RzW2tdLmdldEJ1bmRsZUlkKCkpOwotCQkJCQkJCWlmIChob3N0QnVuZGxlICE9IG51bGwgJiYgY3VycmVudFJlc29sdmVkLmNvbnRhaW5zKGhvc3RCdW5kbGUpICYmIGJ1bmRsZURlc2NyaXB0aW9uc1tpXS5nZXRIb3N0KCkuaXNTYXRpc2ZpZWRCeShwb3NzaWJsZUhvc3RzW2tdKSkKLQkJCQkJCQkJcmVzdWx0cy5hZGQoaG9zdEJ1bmRsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY29udGludWUgYnVuZGxlczsKLQkJCX0KLQkJCWlmICghY3VycmVudFJlc29sdmVkLmNvbnRhaW5zKGJ1bmRsZSkgfHwgIWJ1bmRsZURlc2NyaXB0aW9uc1tpXS5pc1Jlc29sdmVkKCkpCi0JCQkJY29udGludWUgYnVuZGxlczsKLQkJCS8vIGxvb2sgZm9yIG9wdGlvbmFsIGltcG9ydHMgd2hpY2ggYXJlIHVucmVzb2x2ZWQgYnV0IGFyZSByZXNvbHZhYmxlCi0JCQlJbXBvcnRQYWNrYWdlU3BlY2lmaWNhdGlvbltdIGltcG9ydHMgPSBidW5kbGVEZXNjcmlwdGlvbnNbaV0uZ2V0SW1wb3J0UGFja2FnZXMoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgaW1wb3J0cy5sZW5ndGg7IGorKykKLQkJCQlpZiAoSW1wb3J0UGFja2FnZVNwZWNpZmljYXRpb24uUkVTT0xVVElPTl9PUFRJT05BTC5lcXVhbHMoaW1wb3J0c1tqXS5nZXREaXJlY3RpdmUoQ29uc3RhbnRzLlJFU09MVVRJT05fRElSRUNUSVZFKSkgJiYgIWltcG9ydHNbal0uaXNSZXNvbHZlZCgpICYmIHN0YXRlLmdldFN0YXRlSGVscGVyKCkuaXNSZXNvbHZhYmxlKGltcG9ydHNbal0pKSB7Ci0JCQkJCXJlc3VsdHMuYWRkKGJ1bmRsZSk7Ci0JCQkJCWNvbnRpbnVlIGJ1bmRsZXM7Ci0JCQkJfQotCQkJLy8gbG9vayBmb3Igb3B0aW9uYWwgcmVxdWlyZXMgd2hpY2ggYXJlIHVucmVzb2x2ZWQgYnV0IGFyZSByZXNvbHZhYmxlCi0JCQlCdW5kbGVTcGVjaWZpY2F0aW9uW10gcmVxdWlyZXMgPSBidW5kbGVEZXNjcmlwdGlvbnNbaV0uZ2V0UmVxdWlyZWRCdW5kbGVzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHJlcXVpcmVzLmxlbmd0aDsgaisrKQotCQkJCWlmIChyZXF1aXJlc1tqXS5pc09wdGlvbmFsKCkgJiYgIXJlcXVpcmVzW2pdLmlzUmVzb2x2ZWQoKSAmJiBzdGF0ZS5nZXRTdGF0ZUhlbHBlcigpLmlzUmVzb2x2YWJsZShyZXF1aXJlc1tqXSkpIHsKLQkJCQkJcmVzdWx0cy5hZGQoYnVuZGxlKTsKLQkJCQkJY29udGludWUgYnVuZGxlczsKLQkJCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9VdGlscy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci9zcmMvb3JnL2VjbGlwc2UvZXF1aW5veC9pbnRlcm5hbC9zaW1wbGVjb25maWd1cmF0b3IvdXRpbHMvVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwMGVkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yL3NyYy9vcmcvZWNsaXBzZS9lcXVpbm94L2ludGVybmFsL3NpbXBsZWNvbmZpZ3VyYXRvci91dGlscy9VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci51dGlsczsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEVudHJ5OwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLnNpbXBsZWNvbmZpZ3VyYXRvci5BY3RpdmF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyB3YXMgY29waWVkIGZyb20gCi0gKiBvcmcuZWNsaXBzZS5lcXVpbm94LmludGVybmFsLmZyYW1ld29ya2FkbWluLnV0aWxzIHBhY2thZ2Ugb2YKLSAqIG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4gcGx1Z2luIG9uIE1hcmNoIDMgMjAwNy4KLSAqIAotICogVGhlIHJlYXNvbiB3aHkgaXQgd2FzIGNvcGllZCBpcyB0byBtYWtlIHNpbXBsZWNvbmZpZ3VyYXRvciBkZXBlbmRlbnQgb24gCi0gKiBhbnkgYnVuZGxlcyhvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29yaykuCi0gKiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgVXRpbHMgewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQVRIX1NFUCA9ICIvIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBVUkwgY2hlY2tGdWxsVXJsKFVSTCB1cmwsIFN0cmluZyB1cmxOYW1lKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsvL3Rocm93cyBNYW5pcHVsYXRvckV4Y2VwdGlvbiB7Ci0JCWlmICh1cmwgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odXJsTmFtZSArICIgaXMgbnVsbCIpOwotCQlpZiAoIXVybC5nZXRQcm90b2NvbCgpLmVuZHNXaXRoKCJmaWxlIikpCi0JCQlyZXR1cm4gdXJsOwotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkJaWYgKCFmaWxlLmlzQWJzb2x1dGUoKSkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odXJsTmFtZSArICIoIiArIHVybCArICIpIGRvZXMgbm90IGhhdmUgYWJzb2x1dGUgcGF0aCIpOwotCQlpZiAoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5zdGFydHNXaXRoKFBBVEhfU0VQKSkKLQkJCXJldHVybiB1cmw7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZ2V0VXJsKCJmaWxlIiwgbnVsbCwgUEFUSF9TRVAgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odXJsTmFtZSArICIoIiArICJmaWxlOiIgKyBQQVRIX1NFUCArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiKSBpcyBub3QgZnVsbHkgcXVhbGxpZmllZCIpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURpcihGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlLmlzRmlsZSgpKSB7Ci0JCQlpZiAoIWZpbGUuZGVsZXRlKCkpCi0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJGYWlsIHRvIGRlbGV0ZSBGaWxlKCIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIikiKTsKLQkJCXJldHVybjsKLQkJfQotCQlGaWxlW10gY2hpbGRyZW4gPSBmaWxlLmxpc3RGaWxlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZWxldGVEaXIoY2hpbGRyZW5baV0pOwotCQl9Ci0JCWlmICghZmlsZS5kZWxldGUoKSkKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigiRmFpbCB0byBkZWxldGUgRGlyKCIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIikiKTsKLQkJcmV0dXJuOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQnVuZGxlSW5mb1tdIGdldEJ1bmRsZUluZm9zRnJvbUxpc3QoTGlzdCBsaXN0KSB7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEJ1bmRsZUluZm9bMF07Ci0JCUJ1bmRsZUluZm9bXSByZXQgPSBuZXcgQnVuZGxlSW5mb1tsaXN0LnNpemUoKV07Ci0JCWxpc3QudG9BcnJheShyZXQpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgRGljdGlvbmFyeSBnZXRPU0dpTWFuaWZlc3QoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCWlmIChsb2NhdGlvbi5zdGFydHNXaXRoKCJmaWxlOiIpICYmICFsb2NhdGlvbi5lbmRzV2l0aCgiLmphciIpKQotCQkJcmV0dXJuIGJhc2ljTG9hZE1hbmlmZXN0KG5ldyBGaWxlKGxvY2F0aW9uLnN1YnN0cmluZygiZmlsZToiLmxlbmd0aCgpKSkpOwotCi0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gbmV3IFVSTCgiamFyOiIgKyBsb2NhdGlvbiArICIhLyIpOwotCQkJSmFyVVJMQ29ubmVjdGlvbiBqYXJDb25uZWN0aW9uID0gKEphclVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJTWFuaWZlc3QgbWFuaWZlc3QgPSBqYXJDb25uZWN0aW9uLmdldE1hbmlmZXN0KCk7Ci0JCQlBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBtYW5pZmVzdC5nZXRNYWluQXR0cmlidXRlcygpOwotCQkJSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJZm9yIChqYXZhLnV0aWwuSXRlcmF0b3IgaXRlID0gYXR0cmlidXRlcy5rZXlTZXQoKS5pdGVyYXRvcigpOyBpdGUuaGFzTmV4dCgpOykgewotCi0JCQkJU3RyaW5nIGtleSA9IGl0ZS5uZXh0KCkudG9TdHJpbmcoKTsKLQkJCQkvLyBXaGlsZSB0YWJsZSBjb250YWlucyBub24gT1NHaU1hbmlmZXN0LCBpdCBkb2Vzbid0IG1hdHRlci4KLQkJCQl0YWJsZS5wdXQoa2V5LCBhdHRyaWJ1dGVzLmdldFZhbHVlKGtleSkpOwotCQkJfQotCQkJcmV0dXJuIHRhYmxlOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZTEpIHsKLQkJCWlmIChBY3RpdmF0b3IuREVCVUcpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oImxvY2F0aW9uPSIgKyBsb2NhdGlvbik7Ci0JCQkJZTEucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChBY3RpdmF0b3IuREVCVUcpIHsKLQkJCQlTeXN0ZW0uZXJyLnByaW50bG4oImxvY2F0aW9uPSIgKyBsb2NhdGlvbik7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvL1JldHVybiBhIGRpY3Rpb25hcnkgcmVwcmVzZW50aW5nIGEgbWFuaWZlc3QuIFRoZSBkYXRhIG1heSByZXN1bHQgZnJvbSBwbHVnaW4ueG1sIGNvbnZlcnNpb24gIAotCXByaXZhdGUgc3RhdGljIERpY3Rpb25hcnkgYmFzaWNMb2FkTWFuaWZlc3QoRmlsZSBidW5kbGVMb2NhdGlvbikgewotCQlJbnB1dFN0cmVhbSBtYW5pZmVzdFN0cmVhbSA9IG51bGw7Ci0JCVppcEZpbGUgamFyRmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgZmlsZUV4dGVudGlvbiA9IGJ1bmRsZUxvY2F0aW9uLmdldE5hbWUoKTsKLQkJCWZpbGVFeHRlbnRpb24gPSBmaWxlRXh0ZW50aW9uLnN1YnN0cmluZyhmaWxlRXh0ZW50aW9uLmxhc3RJbmRleE9mKCcuJykgKyAxKTsKLQkJCWlmICgiamFyIi5lcXVhbHNJZ25vcmVDYXNlKGZpbGVFeHRlbnRpb24pICYmIGJ1bmRsZUxvY2F0aW9uLmlzRmlsZSgpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlqYXJGaWxlID0gbmV3IFppcEZpbGUoYnVuZGxlTG9jYXRpb24sIFppcEZpbGUuT1BFTl9SRUFEKTsKLQkJCQlaaXBFbnRyeSBtYW5pZmVzdEVudHJ5ID0gamFyRmlsZS5nZXRFbnRyeShKYXJGaWxlLk1BTklGRVNUX05BTUUpOwotCQkJCWlmIChtYW5pZmVzdEVudHJ5ICE9IG51bGwpIHsKLQkJCQkJbWFuaWZlc3RTdHJlYW0gPSBqYXJGaWxlLmdldElucHV0U3RyZWFtKG1hbmlmZXN0RW50cnkpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJbWFuaWZlc3RTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGJ1bmRsZUxvY2F0aW9uLCBKYXJGaWxlLk1BTklGRVNUX05BTUUpKSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vaWdub3JlCi0JCX0KLQkJRGljdGlvbmFyeSBtYW5pZmVzdCA9IG51bGw7Ci0KLQkJLy9JdCBpcyBub3QgYSBtYW5pZmVzdCwgYnV0IGEgcGx1Z2luIG9yIGEgZnJhZ21lbnQKLQotCQlpZiAobWFuaWZlc3RTdHJlYW0gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlNYW5pZmVzdCBtID0gbmV3IE1hbmlmZXN0KG1hbmlmZXN0U3RyZWFtKTsKLQkJCQltYW5pZmVzdCA9IG1hbmlmZXN0VG9Qcm9wZXJ0aWVzKG0uZ2V0TWFpbkF0dHJpYnV0ZXMoKSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0gZmluYWxseSB7Ci0JCQkJdHJ5IHsKLQkJCQkJbWFuaWZlc3RTdHJlYW0uY2xvc2UoKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkvL0lnbm9yZQotCQkJCX0KLQkJCQl0cnkgewotCQkJCQlpZiAoamFyRmlsZSAhPSBudWxsKQotCQkJCQkJamFyRmlsZS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJCS8vSWdub3JlCi0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtYW5pZmVzdDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIG1hbmlmZXN0VG9Qcm9wZXJ0aWVzKEF0dHJpYnV0ZXMgZCkgewotCQlJdGVyYXRvciBpdGVyID0gZC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlQcm9wZXJ0aWVzIHJlc3VsdCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQXR0cmlidXRlcy5OYW1lIGtleSA9IChBdHRyaWJ1dGVzLk5hbWUpIGl0ZXIubmV4dCgpOwotCQkJcmVzdWx0LnB1dChrZXkudG9TdHJpbmcoKSwgZC5nZXQoa2V5KSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFVSTCBnZXRVcmwoU3RyaW5nIHByb3RvY29sLCBTdHJpbmcgaG9zdCwgU3RyaW5nIGZpbGUpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24gey8vIHRocm93cyBNYW5pcHVsYXRvckV4Y2VwdGlvbiB7Ci0JCWZpbGUgPSBVdGlscy5yZXBsYWNlQWxsKGZpbGUsIEZpbGUuc2VwYXJhdG9yLCAiLyIpOwotCQlyZXR1cm4gbmV3IFVSTChwcm90b2NvbCwgaG9zdCwgZmlsZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUkwgZ2V0VXJsSW5GdWxsKFN0cmluZyBwYXRoLCBVUkwgZnJvbSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7Ly90aHJvd3MgTWFuaXB1bGF0b3JFeGNlcHRpb24gewotCQlVdGlscy5jaGVja0Z1bGxVcmwoZnJvbSwgImZyb20iKTsKLQkJcGF0aCA9IFV0aWxzLnJlcGxhY2VBbGwocGF0aCwgRmlsZS5zZXBhcmF0b3IsICIvIik7Ci0JCVN0cmluZyBmcm9tU3QgPSBVdGlscy5yZW1vdmVMYXN0Q2goZnJvbS50b0V4dGVybmFsRm9ybSgpLCAnLycpOwotCQlpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKLQkJCVN0cmluZyBmaWxlU3QgPSBmcm9tLmdldEZpbGUoKTsKLQkJCXJldHVybiBuZXcgVVJMKGZyb21TdC5zdWJzdHJpbmcoMCwgZnJvbVN0Lmxhc3RJbmRleE9mKGZpbGVTdCkgLSAxKSArIHBhdGgpOwotCQl9Ci0JCXJldHVybiBuZXcgVVJMKGZyb21TdCArICIvIiArIHBhdGgpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbW92ZUxhc3RDaChTdHJpbmcgdGFyZ2V0LCBjaGFyIGNoKSB7Ci0JCXdoaWxlICh0YXJnZXQuY2hhckF0KHRhcmdldC5sZW5ndGgoKSAtIDEpID09IGNoKSB7Ci0JCQl0YXJnZXQgPSB0YXJnZXQuc3Vic3RyaW5nKDAsIHRhcmdldC5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZUFsbChTdHJpbmcgc3QsIFN0cmluZyBvbGRTdCwgU3RyaW5nIG5ld1N0KSB7Ci0JCWludCBpbmRleCA9IC0xOwotCQl3aGlsZSAoKGluZGV4ID0gc3QuaW5kZXhPZihvbGRTdCkpICE9IC0xKSB7Ci0JCQlzdCA9IHN0LnN1YnN0cmluZygwLCBpbmRleCkgKyBuZXdTdCArIHN0LnN1YnN0cmluZyhpbmRleCArIG9sZFN0Lmxlbmd0aCgpKTsKLQkJfQotCQlyZXR1cm4gc3Q7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIE9iamVjdCBvYmosIFN0cmluZyBtZXRob2QsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZSkgewotCQlTdHJpbmcgbXNnID0gIiI7Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJaWYgKG9iaiAhPSBudWxsKQotCQkJCW1zZyA9ICIoIiArIG9iai5nZXRDbGFzcygpLmdldE5hbWUoKSArICIpIjsKLQkJfSBlbHNlIGlmIChvYmogPT0gbnVsbCkKLQkJCW1zZyA9ICJbIiArIG1ldGhvZCArICJdIiArIG1lc3NhZ2U7Ci0JCWVsc2UKLQkJCW1zZyA9ICJbIiArIG1ldGhvZCArICJdKCIgKyBvYmouZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiKSI7Ci0JCW1zZyArPSBtZXNzYWdlOwotCi0vLwkJaWYgKExvZ1NlcnZpY2UgbG9nU2VydmljZSA9IEFjdGl2YXRvci5nZXRMb2dTZXJ2aWNlKCk7Ci0vLwkJaWYgKGxvZ1NlcnZpY2UgIT0gbnVsbCkgewotLy8JCQlsb2dTZXJ2aWNlLmxvZyhsZXZlbCwgbXNnLCBlKTsKLS8vCQl9IGVsc2UgewotCQlTdHJpbmcgbGV2ZWxTdCA9IG51bGw7Ci0JCWlmIChsZXZlbCA9PSAxKQotCQkJbGV2ZWxTdCA9ICJERUJVRyI7Ci0JCWVsc2UgaWYgKGxldmVsID09IDIpCi0JCQlsZXZlbFN0ID0gIklORk8iOwotCQllbHNlIGlmIChsZXZlbCA9PSAzKQotCQkJbGV2ZWxTdCA9ICJXQVJOSU5HIjsKLQkJZWxzZSBpZiAobGV2ZWwgPT0gNCkgewotCQkJbGV2ZWxTdCA9ICJFUlJPUiI7Ci0vLwkJCQl1c2VMb2cgPSB0cnVlOwotCQl9Ci0vLwkJCWlmICh1c2VMb2cpIHsKLQkJU3lzdGVtLmVyci5wcmludGxuKCJbIiArIGxldmVsU3QgKyAiXSIgKyBtc2cpOwotCQlpZiAoZSAhPSBudWxsKQotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLS8vCQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzODMxNTEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZzwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL0hPVyBUTyBSVU4udHh0IGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvSE9XIFRPIFJVTi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYjAyNmEuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvSE9XIFRPIFJVTi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1TZWUgaHR0cDovL3dpa2kuZWNsaXBzZS5vcmcvRXF1aW5veF9Qcm92aXNpb25pbmdfR2V0dGluZ19TdGFydGVkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvUHJvdmlzaW9uaW5nIGJhc2UudGFyZ2V0IGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvUHJvdmlzaW9uaW5nIGJhc2UudGFyZ2V0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmIwMWFhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL1Byb3Zpc2lvbmluZyBiYXNlLnRhcmdldAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P3BkZSB2ZXJzaW9uPSIzLjIiPz4KLQotPHRhcmdldCBuYW1lPSJQcm92aXNpb25pbmcgYmFzZSI+Ci0KLSAgIDxsb2NhdGlvbiBwYXRoPSJkOlx0YXJnZXRzXHByb3Zpc2lvbmluZy1iYXNlIi8+Ci0KLSAgIDxjb250ZW50PgotICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5jb3JlLmpvYnMiLz4KLSAgICAgICAgIDxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guYXBwIi8+Ci0gICAgICAgICA8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmNvbW1vbiIvPgotICAgICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5sYXVuY2hlciIvPgotICAgICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5yZWdpc3RyeSIvPgotICAgICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uub3NnaSIvPgotICAgICAgICAgPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uub3NnaS5zZXJ2aWNlcyIvPgotICAgICAgICAgPHBsdWdpbiBpZD0ib3JnLmp1bml0Ii8+Ci0gICAgICA8L3BsdWdpbnM+Ci0gICAgICA8ZmVhdHVyZXM+Ci0gICAgICA8L2ZlYXR1cmVzPgotICAgICAgPGV4dHJhTG9jYXRpb25zPgotICAgICAgICAgPGxvY2F0aW9uIHBhdGg9IkQ6XHRhcmdldHNcZXF1aW5veFxlY2xpcHNlIi8+Ci0gICAgICA8L2V4dHJhTG9jYXRpb25zPgotICAgPC9jb250ZW50PgotCi08L3RhcmdldD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFnZW50LmZlYXR1cmUvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hZ2VudC5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDFlYWVkLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFnZW50LmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFnZW50LmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hZ2VudC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hZ2VudC5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OGU3OGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYWdlbnQuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFnZW50LmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hZ2VudC5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjg0Y2MwLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFnZW50LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hZ2VudC5mZWF0dXJlIgotICAgICAgbGFiZWw9IkVxdWlub3ggUHJvdmlzaW9uaW5nIEFnZW50IEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KLSAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KLSAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgotICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3NvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lY2YiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4ucmNwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuc2F0NGouY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5zYXQ0ai5wYiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2VjdXJpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmZlYXR1cmUvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzNmNWUzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4OGU3OGUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODAwOTVhLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5mZWF0dXJlIgotICAgICAgbGFiZWw9IkVxdWlub3ggUHJvdmlzaW9uaW5nIERpcmVjdG9yIEFwcGxpY2F0aW9uIEZlYXR1cmUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiPgotCi0gICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2Rlc2NyaXB0aW9uIj4KLSAgICAgIFtFbnRlciBGZWF0dXJlIERlc2NyaXB0aW9uIGhlcmUuXQotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodCB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vY29weXJpZ2h0Ij4KLSAgICAgIFtFbnRlciBDb3B5cmlnaHQgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tL2xpY2Vuc2UiPgotICAgICAgW0VudGVyIExpY2Vuc2UgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvci5hcHAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lY2YuaWRlbnRpdHkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5zYXQ0ai5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLnNhdDRqLnBiIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2VuZXJhdG9yLmZlYXR1cmUvLnByb2plY3QgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2MjE0Ni4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2VuZXJhdG9yLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2VuZXJhdG9yLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJkMWVkMS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwKLWN1c3RvbUJ1aWxkQ2FsbGJhY2tzPWN1c3RvbUJ1aWxkQ2FsbGJhY2tzLnhtbAotY3VzdG9tQnVpbGRDYWxsYmFja3MuaW5oZXJpdGFsbD10cnVlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuZmVhdHVyZS9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuZmVhdHVyZS9jdXN0b21CdWlsZENhbGxiYWNrcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNGNjMTkuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2VuZXJhdG9yLmZlYXR1cmUvY3VzdG9tQnVpbGRDYWxsYmFja3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIEN1c3RvbSB0YXJnZXRzIGNhbGxlZCBmcm9tIGEgcHJvamVjdCdzIGdlbmVyYXRlZCBidWlsZC54bWwgICAgICAgICAgICAtLT4KLTwhLS0gU2V0IGN1c3RvbUJ1aWxkQ2FsbGJhY2tzPTxwYXRoL3RvL3RoaXMvZmlsZT4gaW4geW91ciBidWlsZC5wcm9wZXJ0aWVzLi0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08cHJvamVjdCBuYW1lPSJCdWlsZCBzcGVjaWZpYyB0YXJnZXRzIGFuZCBwcm9wZXJ0aWVzIiBkZWZhdWx0PSJub0RlZmF1bHQiPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPCEtLSBEZWZhdWx0IHRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPHRhcmdldCBuYW1lPSJub0RlZmF1bHQiPgotCQk8ZWNobyBtZXNzYWdlPSJUaGlzIGZpbGUgbXVzdCBiZSBjYWxsZWQgd2l0aCBleHBsaWNpdCB0YXJnZXRzIiAvPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYmVmb3JlIHRoZSB0YXJnZXQgZ2F0aGVyLmJpbi5wYXJ0cyAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gdGhlIGRpcmVjdG9yeSBwbHVnaW5zIHdpbGwgYmUgY29sbGVjdGVkIHRvIC0tPgotCTwhLS0gIGZlYXR1cmUuZGlyZWN0b3J5IC0gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSByZXN1bHRpbmcgZmVhdHVyZSAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icHJlLmdhdGhlci5iaW4ucGFydHMiPgotCTwvdGFyZ2V0PgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gU3RlcHMgdG8gZG8gYWZ0ZXIgdGhlIHRhcmdldCBnYXRoZXIuYmluLnBhcnRzICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gQXZhaWxhYmxlIHBhcmFtZXRlcnMgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS0gIGRlc3RpbmF0aW9uLnRlbXAuZm9sZGVyIC0gdGhlIGRpcmVjdG9yeSBwbHVnaW5zIHdpbGwgYmUgY29sbGVjdGVkIHRvIC0tPgotCTwhLS0gIGZlYXR1cmUuZGlyZWN0b3J5IC0gdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSByZXN1bHRpbmcgZmVhdHVyZSAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTx0YXJnZXQgbmFtZT0icG9zdC5nYXRoZXIuYmluLnBhcnRzIj4KLQkJPCEtLSBsb2FkIHRoZSBwcm9wZXJ0aWVzIGZpbGUgdG8gZ2V0IHRoZSBidW5kbGUgdmVyc2lvbnMgLS0+Ci0JCTxwcm9wZXJ0eSBmaWxlPSIke2J1aWxkRGlyZWN0b3J5fS9maW5hbFBsdWdpbnNWZXJzaW9ucy5wcm9wZXJ0aWVzIi8+Ci0JCTwhLS0gemlwIHVwIHRoZSBzaW1wbGUuY29uZmlndXJhdG9yIGludG8gdGhlIGdlbmVyYXRvciBidW5kbGUgLS0+Ci0JCTx6aXAgCi0JCQliYXNlZGlyPSIke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfS9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvcl8ke29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yfSIKLQkJCWRlc3RmaWxlPSIke2Rlc3RpbmF0aW9uLnRlbXAuZm9sZGVyfS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvcl8ke29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yfS9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5qYXIiPgotCQk8L3ppcD4KLQk8L3RhcmdldD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2VuZXJhdG9yLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlhNGM2ZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nZW5lcmF0b3IuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdlbmVyYXRvci5mZWF0dXJlIgotICAgICAgbGFiZWw9IkVxdWlub3ggUHJvdmlzaW9uaW5nIEdlbmVyYXRvciIKLSAgICAgIHZlcnNpb249IjEuMC4wLnF1YWxpZmllciI+Ci0KLSAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vZGVzY3JpcHRpb24iPgotICAgICAgW0VudGVyIEZlYXR1cmUgRGVzY3JpcHRpb24gaGVyZS5dCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0IHVybD0iaHR0cDovL3d3dy5leGFtcGxlLmNvbS9jb3B5cmlnaHQiPgotICAgICAgW0VudGVyIENvcHlyaWdodCBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbGljZW5zZSI+Ci0gICAgICBbRW50ZXIgTGljZW5zZSBEZXNjcmlwdGlvbiBoZXJlLl0KLSAgIDwvbGljZW5zZT4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmVuZ2luZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3NvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLmdlbmVyYXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50Lm5hdGl2ZXMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lY2YiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLm1hbmlwdWxhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLnNhdDRqLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuc2F0NGoucGIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpLy5wcm9qZWN0IGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjZjA2My4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9idWlsZC5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTUzYjRlLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcKLXNyYy5pbmNsdWRlcyA9IGxpY2Vuc2UuaHRtbCxlcGwtdjEwLmh0bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL2VwbC12MTAuaHRtbCBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OTAxY2MuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9RXF1aW5veCBQcm92aXNpb25pbmcgUGxhdGZvcm0KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFByb2plY3QgVXBkYXRlcwotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249RWNsaXBzZSBQcm92aXNpb25pbmcgUGxhdGZvcm0KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUzYzFlZS4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjAuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIgotICAgICAgaW1hZ2U9ImVjbGlwc2VfdXBkYXRlXzEyMC5qcGciPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy9lY2xpcHNlL3VwZGF0ZXMvMy40Ii8+Ci0gICA8L3VybD4KLSAgIAotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBwbHVnaW49Im9yZy5lY2xpcHNlLmVjZiIgdmVyc2lvbj0iMi4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlciIgdmVyc2lvbj0iMi4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZWNmLmlkZW50aXR5IiB2ZXJzaW9uPSIyLjAuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyIiB2ZXJzaW9uPSIyLjAuMCIgbWF0Y2g9ImNvbXBhdGlibGUiLz4KLSAgICAgIDxpbXBvcnQgcGx1Z2luPSJvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyLnNzbCIgdmVyc2lvbj0iMS4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICAgICA8aW1wb3J0IHBsdWdpbj0ib3JnLmVjbGlwc2UuZWNmLnNzbCIgdmVyc2lvbj0iMS4wLjAiIG1hdGNoPSJjb21wYXRpYmxlIi8+Ci0gICA8L3JlcXVpcmVzPgotICAgCi0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3NvciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgPCEtLSA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZi5pZGVudGl0eSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4gLS0+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b3VjaHBvaW50LmVjbGlwc2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3giCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDwhLS0gPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+IC0tPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zaW1wbGVjb25maWd1cmF0b3IubWFuaXB1bGF0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3IiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlY29uY2lsZXIuZHJvcGlucyIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEuZ2VuZXJhdG9yIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLnNhdDRqLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuc2F0NGoucGIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnNlY3VyaXR5IgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZXF1aW5veC5zZWN1cml0eS51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXh0ZW5zaW9ubG9jYXRpb24iCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSA8IS0tICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2Zlci5zc2wiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmVjZi5zc2wiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICBmcmFnbWVudD0idHJ1ZSIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4gLS0+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLmFwcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Mjc4NDE3Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwOCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL2J1aWxkdGltZS1mZWF0dXJlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVzZXIudWkvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E1NzBlNi4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1FY2xpcHNlIFAyIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFByb2plY3QgVXBkYXRlcwotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249Q29tbW9uIE9TLWluZGVwZW5kZW50IEFQSSBkb2N1bWVudGF0aW9uIGFuZCBzb3VyY2UgY29kZSB6aXBzIGZvciB0aGUgRWNsaXBzZSBQbGF0Zm9ybS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA4IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9idWlsZHRpbWUtZmVhdHVyZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51c2VyLnVpL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWY5NjYuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvYnVpbGR0aW1lLWZlYXR1cmVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXNlci51aS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvcHJvamVjdFNldC1leHRzc2gucHNmIGIvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWxlbmcvcHJvamVjdFNldC1leHRzc2gucHNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTNlM2M2Li4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL3Byb2plY3RTZXQtZXh0c3NoLnBzZgorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPHBzZiB2ZXJzaW9uPSIyLjAiPgotPHByb3ZpZGVyIGlkPSJvcmcuZWNsaXBzZS50ZWFtLmN2cy5jb3JlLmN2c25hdHVyZSI+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LG9yZy5lY2xpcHNlLmVjZi9wbHVnaW5zL29yZy5lY2xpcHNlLmVjZixvcmcuZWNsaXBzZS5lY2YiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksb3JnLmVjbGlwc2UuZWNmL3BsdWdpbnMvb3JnLmVjbGlwc2UuZWNmLmNvcmUuaWRlbnRpdHksb3JnLmVjbGlwc2UuZWNmLmNvcmUuaWRlbnRpdHkiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksb3JnLmVjbGlwc2UuZWNmL3BsdWdpbnMvb3JnLmVjbGlwc2UuZWNmLmZpbGV0cmFuc2ZlcixvcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LG9yZy5lY2xpcHNlLmVjZi9wbHVnaW5zL29yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXIsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSxvcmcuZWNsaXBzZS5lY2YvcGx1Z2lucy9vcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyLnNzbCxvcmcuZWNsaXBzZS5lY2YucHJvdmlkZXIuZmlsZXRyYW5zZmVyLnNzbCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSxvcmcuZWNsaXBzZS5lY2YvcGx1Z2lucy9vcmcuZWNsaXBzZS5lY2Yuc3NsLG9yZy5lY2xpcHNlLmVjZi5zc2wiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuamFycHJvY2Vzc29yIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmRpcmVjdG9yeXdhdGNoZXIsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQuZWNsaXBzZSIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuaW5zdGFsbGVyIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb25zb2xlIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cy5vcHRpbWl6ZXJzIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leGVtcGxhcnlzZXR1cCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZ2FyYmFnZWNvbGxlY3RvciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29yZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZyIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Isb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3Qub3B0aW1pemVycyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnByb2Nlc3NvcnMiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEucmVwb3NpdG9yeSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnkiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2VsZmhvc3Rpbmcsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zZWxmaG9zdGluZyIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuYWRtaW4iLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudWkuc2RrIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVjaGVja2VyLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlc2l0ZSIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG9vbHMiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvcixvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi50ZXN0LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbixvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLmVxdWlub3gsb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94Ii8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90b29scyxvcmcuZWNsaXBzZS5vcmJpdC9vcmcuYXBhY2hlLnhlcmNlcyxvcmcuYXBhY2hlLnhlcmNlcyx2Ml84XzAiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpleHRzc2g6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLG9yZy5lY2xpcHNlLm9yYml0L29yZy5hcGFjaGUueG1sLnJlc29sdmVyLG9yZy5hcGFjaGUueG1sLnJlc29sdmVyLHYxXzFfMCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZixpZS53b21iYXQuamJkaWZmIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9pZS53b21iYXQuamJkaWZmLnRlc3QsaWUud29tYmF0LmpiZGlmZi50ZXN0Ii8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6ZXh0c3NoOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNhciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsb3JnLmVjbGlwc2Uub3JiaXQvb3JnLnNhdDRqLmNvcmUsb3JnLnNhdDRqLmNvcmVfdjIuMC4wLHYyXzBfMCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOmV4dHNzaDpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsb3JnLmVjbGlwc2Uub3JiaXQvb3JnLnNhdDRqLnBiLG9yZy5zYXQ0ai5wYl92Mi4wLjAsdjJfMF8wIi8+Ci08L3Byb3ZpZGVyPgotPC9wc2Y+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnJlbGVuZy9wcm9qZWN0U2V0LnBzZiBiL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL3Byb2plY3RTZXQucHNmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzZkZTEyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nL3Byb2plY3RTZXQucHNmCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+Ci08cHNmIHZlcnNpb249IjIuMCI+Ci08cHJvdmlkZXIgaWQ9Im9yZy5lY2xpcHNlLnRlYW0uY3ZzLmNvcmUuY3ZzbmF0dXJlIj4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LG9yZy5lY2xpcHNlLmVjZi9wbHVnaW5zL29yZy5lY2xpcHNlLmVjZixvcmcuZWNsaXBzZS5lY2YiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LG9yZy5lY2xpcHNlLmVjZi9wbHVnaW5zL29yZy5lY2xpcHNlLmVjZi5jb3JlLmlkZW50aXR5LG9yZy5lY2xpcHNlLmVjZi5jb3JlLmlkZW50aXR5Ii8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSxvcmcuZWNsaXBzZS5lY2YvcGx1Z2lucy9vcmcuZWNsaXBzZS5lY2YuZmlsZXRyYW5zZmVyLG9yZy5lY2xpcHNlLmVjZi5maWxldHJhbnNmZXIiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC90ZWNobm9sb2d5LG9yZy5lY2xpcHNlLmVjZi9wbHVnaW5zL29yZy5lY2xpcHNlLmVjZi5wcm92aWRlci5maWxldHJhbnNmZXIsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2ZlciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3RlY2hub2xvZ3ksb3JnLmVjbGlwc2UuZWNmL3BsdWdpbnMvb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2Zlci5zc2wsb3JnLmVjbGlwc2UuZWNmLnByb3ZpZGVyLmZpbGV0cmFuc2Zlci5zc2wiLz48cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdGVjaG5vbG9neSxvcmcuZWNsaXBzZS5lY2YvcGx1Z2lucy9vcmcuZWNsaXBzZS5lY2Yuc3NsLG9yZy5lY2xpcHNlLmVjZi5zc2wiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3NvcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmphcnByb2Nlc3NvciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3Isb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3RvciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3IuYXBwIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5kaXJlY3Rvcnl3YXRjaGVyLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZGlyZWN0b3J5d2F0Y2hlciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gucDIudG91Y2hwb2ludC5lY2xpcHNlIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5lbmdpbmUiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmluc3RhbGxlciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuY29uc29sZSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvbnNvbGUiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvdWNocG9pbnQubmF0aXZlcyIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50ZXN0cyIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudGVzdHMub3B0aW1pemVycyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRlc3RzLm9wdGltaXplcnMiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLG9yZy5lY2xpcHNlLmVxdWlub3gucDIubWV0YWRhdGEiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4ZW1wbGFyeXNldHVwLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuZXhlbXBsYXJ5c2V0dXAiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmdhcmJhZ2Vjb2xsZWN0b3Isb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5nYXJiYWdlY29sbGVjdG9yIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5yZWNvbmNpbGVyLmRyb3BpbnMiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmNvcmUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5jb3JlIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL29yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nLG9yZy5lY2xpcHNlLmVxdWlub3gucDIucmVsZW5nIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3Isb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5nZW5lcmF0b3IiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0Lm9wdGltaXplcnMsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5vcHRpbWl6ZXJzIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5hcnRpZmFjdC5wcm9jZXNzb3JzLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucHJvY2Vzc29ycyIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuYXJ0aWZhY3QucmVwb3NpdG9yeSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmFydGlmYWN0LnJlcG9zaXRvcnkiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLm1ldGFkYXRhLnJlcG9zaXRvcnksb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5tZXRhZGF0YS5yZXBvc2l0b3J5Ii8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5zZWxmaG9zdGluZyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnNlbGZob3N0aW5nIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aSxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5hZG1pbixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGssb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51aS5zZGsiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcCxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVpLmFkbWluLnJjcCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIudXBkYXRlY2hlY2tlcixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZWNoZWNrZXIiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnAyLnVwZGF0ZXNpdGUsb3JnLmVjbGlwc2UuZXF1aW5veC5wMi51cGRhdGVzaXRlIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi5leHRlbnNpb25sb2NhdGlvbixvcmcuZWNsaXBzZS5lcXVpbm94LnAyLmV4dGVuc2lvbmxvY2F0aW9uIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5wMi50b29scyxvcmcuZWNsaXBzZS5lcXVpbm94LnAyLnRvb2xzIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZixpZS53b21iYXQuamJkaWZmIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvaWUud29tYmF0LmpiZGlmZi50ZXN0LGllLndvbWJhdC5qYmRpZmYudGVzdCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyLG9yZy5lY2xpcHNlLmVxdWlub3gucDIuc2FyIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvZWNsaXBzZSxvcmcuZWNsaXBzZS5lcXVpbm94L3AyL2J1bmRsZXMvb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbi5lcXVpbm94LG9yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4uZXF1aW5veCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4sb3JnLmVjbGlwc2UuZXF1aW5veC5mcmFtZXdvcmthZG1pbiIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guZnJhbWV3b3JrYWRtaW4udGVzdCxvcmcuZWNsaXBzZS5lcXVpbm94LmZyYW1ld29ya2FkbWluLnRlc3QiLz4KLTxwcm9qZWN0IHJlZmVyZW5jZT0iMS4wLDpwc2VydmVyOmRldi5lY2xpcHNlLm9yZzovY3Zzcm9vdC9lY2xpcHNlLG9yZy5lY2xpcHNlLmVxdWlub3gvcDIvYnVuZGxlcy9vcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvcixvcmcuZWNsaXBzZS5lcXVpbm94LnNpbXBsZWNvbmZpZ3VyYXRvci5tYW5pcHVsYXRvciIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L2VjbGlwc2Usb3JnLmVjbGlwc2UuZXF1aW5veC9wMi9idW5kbGVzL29yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yLG9yZy5lY2xpcHNlLmVxdWlub3guc2ltcGxlY29uZmlndXJhdG9yIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsb3JnLmVjbGlwc2Uub3JiaXQvb3JnLmFwYWNoZS54ZXJjZXMsb3JnLmFwYWNoZS54ZXJjZXMsdjJfOF8wIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsb3JnLmVjbGlwc2Uub3JiaXQvb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIsb3JnLmFwYWNoZS54bWwucmVzb2x2ZXIsdjFfMV8wIi8+Ci08cHJvamVjdCByZWZlcmVuY2U9IjEuMCw6cHNlcnZlcjpkZXYuZWNsaXBzZS5vcmc6L2N2c3Jvb3QvdG9vbHMsb3JnLmVjbGlwc2Uub3JiaXQvb3JnLnNhdDRqLmNvcmUsb3JnLnNhdDRqLmNvcmVfdjIuMC4wLHYyXzBfMCIvPgotPHByb2plY3QgcmVmZXJlbmNlPSIxLjAsOnBzZXJ2ZXI6ZGV2LmVjbGlwc2Uub3JnOi9jdnNyb290L3Rvb2xzLG9yZy5lY2xpcHNlLm9yYml0L29yZy5zYXQ0ai5wYixvcmcuc2F0NGoucGJfdjIuMC4wLHYyXzBfMCIvPgotPC9wcm92aWRlcj4KLTwvcHNmPgo=